Oliver Le commited on
Commit
b5b9227
·
1 Parent(s): 2d68f51

update dataset processing + add default dataset + update plotting + add computing metrics

Browse files
.gitignore CHANGED
@@ -1 +1,5 @@
1
  models/granite_tsfm
 
 
 
 
 
1
  models/granite_tsfm
2
+ __pycache__/
3
+ .cache/
4
+ .DS_Store
5
+ *.pyc
app.py CHANGED
@@ -1,8 +1,8 @@
1
  import io
2
  import zipfile
3
  from pathlib import Path
4
- from typing import List, Tuple
5
-
6
  import gradio as gr
7
  import matplotlib
8
 
@@ -51,37 +51,183 @@ def ensure_checkpoints() -> None:
51
  zf.extractall(".")
52
 
53
 
54
- def load_timeseries(file_obj, feature_columns: List[str] | None = None) -> Tuple[pd.DataFrame, np.ndarray]:
55
- """Load the uploaded file into a numeric dataframe and numpy array."""
56
- path = Path(file_obj.name)
57
- if path.suffix.lower() == ".npy":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  data = np.load(path, allow_pickle=False)
59
  if data.ndim == 1:
60
  data = data.reshape(-1, 1)
61
  if not isinstance(data, np.ndarray):
62
- raise ValueError("Loaded data is not a numpy array.")
63
- df = pd.DataFrame(data)
64
- return df, data.astype(np.float32)
65
 
66
- if path.suffix.lower() not in {".csv", ".txt"}:
67
  raise ValueError("Unsupported file type. Please upload a .csv, .txt, or .npy file.")
68
 
69
- df = pd.read_csv(path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  numeric_df = df.select_dtypes(include=np.number)
71
  if numeric_df.empty:
72
- raise ValueError("No numeric columns detected. Ensure your file contains numeric values.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
  if feature_columns:
75
- missing = [col for col in feature_columns if col not in numeric_df.columns]
76
  if missing:
77
- raise ValueError(f"Selected columns not found in the file: {', '.join(missing)}")
78
- numeric_df = numeric_df[feature_columns]
 
 
 
 
 
 
 
 
 
79
 
80
- array = numeric_df.to_numpy(dtype=np.float32)
81
  if array.ndim == 1:
82
  array = array.reshape(-1, 1)
83
 
84
- return numeric_df, array
 
 
 
 
 
 
 
 
 
 
 
85
 
86
 
87
  def infer(
@@ -89,19 +235,32 @@ def infer(
89
  is_multivariate: bool,
90
  window_size: int,
91
  batch_size: int,
92
- mask_type: str,
93
  multi_size: str,
94
  feature_columns: List[str],
95
- ) -> Tuple[str, pd.DataFrame, plt.Figure]:
 
 
96
  """Run Time-RCD inference and produce outputs for the Gradio UI."""
97
  ensure_checkpoints()
98
- numeric_df, array = load_timeseries(file_obj, feature_columns or None)
 
 
 
 
 
 
 
 
 
 
 
 
99
 
100
  kwargs = {
101
  "Multi": is_multivariate,
102
  "win_size": window_size,
103
  "batch_size": batch_size,
104
- "random_mask": mask_type,
105
  "size": multi_size,
106
  "device": "cpu",
107
  }
@@ -111,41 +270,90 @@ def infer(
111
  logit_vector = np.asarray(logits).reshape(-1)
112
 
113
  valid_length = min(len(score_vector), len(numeric_df))
114
- score_series = pd.Series(score_vector[:valid_length], index=numeric_df.index[:valid_length], name="anomaly_score")
115
- logit_series = pd.Series(logit_vector[:valid_length], index=numeric_df.index[:valid_length], name="anomaly_logit")
116
 
117
  result_df = numeric_df.iloc[:valid_length, :].copy()
 
 
118
  result_df["anomaly_score"] = score_series
119
  result_df["anomaly_logit"] = logit_series
120
 
 
 
 
 
 
 
 
 
 
121
  top_indices = score_series.nlargest(5).index.tolist()
122
  highlight_message = (
123
  "Top anomaly indices (by score): " + ", ".join(str(idx) for idx in top_indices)
124
  if len(top_indices) > 0
125
  else "No anomalies detected."
126
  )
 
 
127
 
128
  figure = build_plot(result_df)
129
 
130
- return highlight_message, result_df, figure
131
 
132
 
133
  def build_plot(result_df: pd.DataFrame) -> plt.Figure:
134
  """Create a matplotlib plot of the first feature vs. anomaly score."""
135
  fig, ax_primary = plt.subplots(figsize=(10, 4))
136
  index = result_df.index
137
- feature_cols = [col for col in result_df.columns if col not in {"anomaly_score", "anomaly_logit"}]
 
 
138
 
139
  primary_col = feature_cols[0]
140
- ax_primary.plot(index, result_df[primary_col], label=f"{primary_col}", color="#1f77b4", linewidth=1.0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  ax_primary.set_xlabel("Index")
142
  ax_primary.set_ylabel("Value")
143
  ax_primary.grid(alpha=0.2)
144
 
145
  ax_secondary = ax_primary.twinx()
146
- ax_secondary.plot(index, result_df["anomaly_score"], label="Anomaly Score", color="#d62728", linewidth=1.0)
 
 
 
 
 
 
147
  ax_secondary.set_ylabel("Anomaly Score")
148
 
 
 
 
 
 
 
 
 
149
  fig.tight_layout()
150
  return fig
151
 
@@ -155,27 +363,60 @@ def build_interface() -> gr.Blocks:
155
  with gr.Blocks(title="Time-RCD Zero-Shot Anomaly Detection") as demo:
156
  gr.Markdown(
157
  "# Time-RCD Zero-Shot Anomaly Detection\n"
158
- "Upload a time series to run zero-shot anomaly detection with the pretrained Time-RCD checkpoints. "
159
- "You can choose univariate or multivariate mode, adjust the window size, and configure mask settings."
 
 
 
 
 
 
 
 
160
  )
161
 
162
  with gr.Row():
163
- file_input = gr.File(label="Upload time series file (.csv, .txt, .npy)", file_types=[".csv", ".txt", ".npy"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  column_selector = gr.Textbox(
165
  label="Columns to use (comma-separated, optional)",
166
  placeholder="e.g. value,feature_1,feature_2",
167
  )
168
 
 
 
 
 
 
169
  with gr.Row():
170
  multivariate = gr.Radio(
171
  choices=["Univariate", "Multivariate"],
172
- value="Univariate",
 
 
 
 
173
  label="Data type",
174
  )
175
  window_size_in = gr.Slider(
176
  minimum=128,
177
- maximum=8192,
178
- value=2048,
179
  step=128,
180
  label="Window size",
181
  )
@@ -188,11 +429,6 @@ def build_interface() -> gr.Blocks:
188
  )
189
 
190
  with gr.Row():
191
- mask_type_in = gr.Radio(
192
- choices=["random_mask", "full_mask"],
193
- value="random_mask",
194
- label="Mask type (multivariate only)",
195
- )
196
  multi_size_in = gr.Radio(
197
  choices=["full", "small"],
198
  value="full",
@@ -204,28 +440,74 @@ def build_interface() -> gr.Blocks:
204
  result_message = gr.Textbox(label="Summary", interactive=False)
205
  result_dataframe = gr.DataFrame(label="Anomaly Scores", interactive=False)
206
  plot_output = gr.Plot(label="Series vs. Anomaly Score")
207
-
208
- def _submit(file_obj, multivariate_choice, win, batch, mask, size, columns_text):
209
- if file_obj is None:
210
- raise gr.Error("Please upload a time series file.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
 
212
  feature_columns = [col.strip() for col in columns_text.split(",") if col.strip()] if columns_text else []
213
  is_multi = multivariate_choice == "Multivariate"
214
- summary, df, fig = infer(
215
- file_obj=file_obj,
 
 
 
216
  is_multivariate=is_multi,
217
  window_size=int(win),
218
  batch_size=int(batch),
219
- mask_type=mask,
220
  multi_size=size,
221
  feature_columns=feature_columns,
 
 
222
  )
223
- return summary, df, fig
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
 
225
  run_button.click(
226
  fn=_submit,
227
- inputs=[file_input, multivariate, window_size_in, batch_size_in, mask_type_in, multi_size_in, column_selector],
228
- outputs=[result_message, result_dataframe, plot_output],
 
 
 
 
 
 
 
 
 
 
229
  )
230
 
231
  return demo
 
1
  import io
2
  import zipfile
3
  from pathlib import Path
4
+ from typing import List, Tuple, Literal, Optional
5
+ from evaluation.metrics import get_metrics
6
  import gradio as gr
7
  import matplotlib
8
 
 
51
  zf.extractall(".")
52
 
53
 
54
+ BASE_DIR = Path(__file__).resolve().parent
55
+ SAMPLE_DATASET_DIR = BASE_DIR / "sample_datasets"
56
+
57
+ LabelSource = Literal["same_file", "separate_file", "none"]
58
+ LABEL_COLUMN_CANDIDATES = ("label", "labels")
59
+ LABEL_SOURCE_CHOICES = {
60
+ "Value + label in same file": "same_file",
61
+ "Labels in separate file": "separate_file",
62
+ "No labels provided": "none",
63
+ }
64
+ SAMPLE_FILES: dict[str, dict[str, object]] = {
65
+ "Sample: Univariate SED Medical": {
66
+ "path": SAMPLE_DATASET_DIR / "235_SED_id_2_Medical_tr_2499_1st_3840.csv",
67
+ "is_multivariate": False,
68
+ },
69
+ "Sample: Univariate UCR Sensor": {
70
+ "path": SAMPLE_DATASET_DIR / "364_UCR_id_62_Sensor_tr_2833_1st_5988.csv",
71
+ "is_multivariate": False,
72
+ },
73
+ "Sample: Univariate Yahoo WebService": {
74
+ "path": SAMPLE_DATASET_DIR / "686_YAHOO_id_136_WebService_tr_500_1st_755.csv",
75
+ "is_multivariate": False,
76
+ },
77
+ # "Sample: Multivariate MSL Sensor": {
78
+ # "path": SAMPLE_DATASET_DIR / "003_MSL_id_2_Sensor_tr_883_1st_1238.csv",
79
+ # "is_multivariate": True,
80
+ # },
81
+ }
82
+
83
+
84
+ def _resolve_path(file_obj) -> Path:
85
+ """Extract a pathlib.Path from the gradio file object."""
86
+ if file_obj is None:
87
+ raise ValueError("File object is None.")
88
+
89
+ if isinstance(file_obj, Path):
90
+ return file_obj
91
+
92
+ if isinstance(file_obj, str):
93
+ path = Path(file_obj)
94
+ if not path.is_absolute():
95
+ path = (BASE_DIR / path).resolve()
96
+ return path
97
+
98
+ # Gradio may pass dictionaries or objects with a 'name' attribute.
99
+ if isinstance(file_obj, dict) and "name" in file_obj:
100
+ return _resolve_path(file_obj["name"])
101
+
102
+ name = getattr(file_obj, "name", None)
103
+ if not name:
104
+ raise ValueError("Unable to resolve uploaded file path.")
105
+ return _resolve_path(name)
106
+
107
+
108
+ def _load_dataframe(path: Path) -> pd.DataFrame:
109
+ """Load a dataframe from supported file types."""
110
+ if not path.exists():
111
+ raise ValueError(f"File not found: {path}. If this is a bundled sample, ensure it exists under {SAMPLE_DATASET_DIR}.")
112
+
113
+ suffix = path.suffix.lower()
114
+ if suffix == ".npy":
115
  data = np.load(path, allow_pickle=False)
116
  if data.ndim == 1:
117
  data = data.reshape(-1, 1)
118
  if not isinstance(data, np.ndarray):
119
+ raise ValueError("Loaded .npy data is not a numpy array.")
120
+ return pd.DataFrame(data)
 
121
 
122
+ if suffix not in {".csv", ".txt"}:
123
  raise ValueError("Unsupported file type. Please upload a .csv, .txt, or .npy file.")
124
 
125
+ return pd.read_csv(path)
126
+
127
+
128
+ def _extract_label_column(df: pd.DataFrame) -> Tuple[pd.DataFrame, Optional[pd.Series]]:
129
+ """Split a label column from dataframe if one of the candidate names exists."""
130
+ lower_to_original = {col.lower(): col for col in df.columns}
131
+ label_col = None
132
+ for candidate in LABEL_COLUMN_CANDIDATES:
133
+ if candidate in lower_to_original:
134
+ label_col = lower_to_original[candidate]
135
+ break
136
+
137
+ if label_col is None:
138
+ return df, None
139
+
140
+ label_series = pd.to_numeric(df[label_col], errors="raise")
141
+ feature_df = df.drop(columns=[label_col])
142
+ return feature_df, label_series
143
+
144
+
145
+ def _load_label_series(file_obj) -> pd.Series:
146
+ """Load labels from a dedicated upload."""
147
+ path = _resolve_path(file_obj)
148
+ df = _load_dataframe(path)
149
  numeric_df = df.select_dtypes(include=np.number)
150
  if numeric_df.empty:
151
+ raise ValueError("Uploaded label file does not contain numeric columns.")
152
+
153
+ lower_to_original = {col.lower(): col for col in numeric_df.columns}
154
+ for candidate in LABEL_COLUMN_CANDIDATES:
155
+ if candidate in lower_to_original:
156
+ column = lower_to_original[candidate]
157
+ return pd.to_numeric(numeric_df[column], errors="raise").rename("label")
158
+
159
+ if numeric_df.shape[1] > 1:
160
+ raise ValueError(
161
+ "Label file must contain exactly one numeric column or include a column named 'label'."
162
+ )
163
+
164
+ series = pd.to_numeric(numeric_df.iloc[:, 0], errors="raise").rename("label")
165
+ return series
166
+
167
+
168
+ def load_timeseries(
169
+ value_file,
170
+ feature_columns: List[str] | None,
171
+ label_source: LabelSource,
172
+ label_file=None,
173
+ ) -> Tuple[pd.DataFrame, np.ndarray, Optional[pd.Series]]:
174
+ """Load the uploaded value file, optional label file, and return features/labels."""
175
+ value_path = _resolve_path(value_file)
176
+ raw_df = _load_dataframe(value_path)
177
+ feature_df = raw_df.select_dtypes(include=np.number)
178
+
179
+ if feature_df.empty:
180
+ raise ValueError("No numeric columns detected. Ensure your value file contains numeric values.")
181
+
182
+ label_series: Optional[pd.Series] = None
183
+ feature_df, embedded_label = _extract_label_column(feature_df)
184
+
185
+ if label_source == "same_file":
186
+ if embedded_label is None:
187
+ raise ValueError(
188
+ "Label column not found in the uploaded file. Expected a column named 'label'."
189
+ )
190
+ label_series = embedded_label
191
+ elif label_source == "separate_file":
192
+ if label_file is None:
193
+ raise ValueError("Please upload a label file or switch the label source option.")
194
+ label_series = _load_label_series(label_file)
195
+ elif label_source == "none":
196
+ label_series = None
197
+ else:
198
+ raise ValueError(f"Unsupported label source option: {label_source}")
199
 
200
  if feature_columns:
201
+ missing = [col for col in feature_columns if col not in feature_df.columns]
202
  if missing:
203
+ raise ValueError(f"Selected columns not found in the value file: {', '.join(missing)}")
204
+ feature_df = feature_df[feature_columns]
205
+
206
+ feature_df = feature_df.reset_index(drop=True)
207
+
208
+ if label_series is not None:
209
+ label_series = label_series.reset_index(drop=True)
210
+ if len(label_series) != len(feature_df):
211
+ min_length = min(len(label_series), len(feature_df))
212
+ label_series = label_series.iloc[:min_length].reset_index(drop=True)
213
+ feature_df = feature_df.iloc[:min_length, :].reset_index(drop=True)
214
 
215
+ array = feature_df.to_numpy(dtype=np.float32)
216
  if array.ndim == 1:
217
  array = array.reshape(-1, 1)
218
 
219
+ return feature_df, array, label_series
220
+
221
+
222
+ def _metrics_to_dataframe(metrics: dict[str, float]) -> pd.DataFrame:
223
+ if not metrics:
224
+ return pd.DataFrame({"Metric": [], "Value": []})
225
+ return pd.DataFrame(
226
+ {
227
+ "Metric": list(metrics.keys()),
228
+ "Value": [round(float(value), 4) for value in metrics.values()],
229
+ }
230
+ )
231
 
232
 
233
  def infer(
 
235
  is_multivariate: bool,
236
  window_size: int,
237
  batch_size: int,
 
238
  multi_size: str,
239
  feature_columns: List[str],
240
+ label_source: LabelSource,
241
+ label_file,
242
+ ) -> Tuple[str, pd.DataFrame, plt.Figure, pd.DataFrame]:
243
  """Run Time-RCD inference and produce outputs for the Gradio UI."""
244
  ensure_checkpoints()
245
+ numeric_df, array, labels = load_timeseries(
246
+ file_obj, feature_columns or None, label_source=label_source, label_file=label_file
247
+ )
248
+
249
+ num_features = array.shape[1] if array.ndim > 1 else 1
250
+ if is_multivariate and num_features == 1:
251
+ raise ValueError(
252
+ "Dataset check: only one feature column found, so please switch the Data type to 'Univariate' or upload a multivariate file with multiple feature columns."
253
+ )
254
+ if not is_multivariate and num_features > 1:
255
+ raise ValueError(
256
+ "Dataset check: multiple feature columns detected, so please switch the Data type to 'Multivariate' or provide a univariate file with a single feature column."
257
+ )
258
 
259
  kwargs = {
260
  "Multi": is_multivariate,
261
  "win_size": window_size,
262
  "batch_size": batch_size,
263
+ "random_mask": "random_mask",
264
  "size": multi_size,
265
  "device": "cpu",
266
  }
 
270
  logit_vector = np.asarray(logits).reshape(-1)
271
 
272
  valid_length = min(len(score_vector), len(numeric_df))
273
+ if labels is not None:
274
+ valid_length = min(valid_length, len(labels))
275
 
276
  result_df = numeric_df.iloc[:valid_length, :].copy()
277
+ score_series = pd.Series(score_vector[:valid_length], index=result_df.index, name="anomaly_score")
278
+ logit_series = pd.Series(logit_vector[:valid_length], index=result_df.index, name="anomaly_logit")
279
  result_df["anomaly_score"] = score_series
280
  result_df["anomaly_logit"] = logit_series
281
 
282
+ metrics_df: pd.DataFrame
283
+ if labels is not None:
284
+ label_series = labels.iloc[:valid_length]
285
+ result_df["label"] = label_series.to_numpy()
286
+ metrics = get_metrics(score_series.to_numpy(), label_series.to_numpy())
287
+ metrics_df = _metrics_to_dataframe(metrics)
288
+ else:
289
+ metrics_df = pd.DataFrame({"Metric": ["Info"], "Value": ["Labels not provided; metrics skipped."]})
290
+
291
  top_indices = score_series.nlargest(5).index.tolist()
292
  highlight_message = (
293
  "Top anomaly indices (by score): " + ", ".join(str(idx) for idx in top_indices)
294
  if len(top_indices) > 0
295
  else "No anomalies detected."
296
  )
297
+ if labels is None:
298
+ highlight_message += " Metrics skipped due to missing labels."
299
 
300
  figure = build_plot(result_df)
301
 
302
+ return highlight_message, result_df, figure, metrics_df
303
 
304
 
305
  def build_plot(result_df: pd.DataFrame) -> plt.Figure:
306
  """Create a matplotlib plot of the first feature vs. anomaly score."""
307
  fig, ax_primary = plt.subplots(figsize=(10, 4))
308
  index = result_df.index
309
+ feature_cols = [
310
+ col for col in result_df.columns if col not in {"anomaly_score", "anomaly_logit", "label"}
311
+ ]
312
 
313
  primary_col = feature_cols[0]
314
+ ax_primary.plot(
315
+ index,
316
+ result_df[primary_col],
317
+ label=f"{primary_col}",
318
+ color="#1f77b4",
319
+ linewidth=1.0,
320
+ )
321
+
322
+ if "label" in result_df.columns:
323
+ anomalies = result_df[result_df["label"] > 0]
324
+ if not anomalies.empty:
325
+ ax_primary.scatter(
326
+ anomalies.index,
327
+ anomalies[primary_col],
328
+ label="Label = 1",
329
+ color="#ff7f0e",
330
+ marker="o",
331
+ s=30,
332
+ alpha=0.85,
333
+ )
334
+
335
  ax_primary.set_xlabel("Index")
336
  ax_primary.set_ylabel("Value")
337
  ax_primary.grid(alpha=0.2)
338
 
339
  ax_secondary = ax_primary.twinx()
340
+ ax_secondary.plot(
341
+ index,
342
+ result_df["anomaly_score"],
343
+ label="Anomaly Score",
344
+ color="#d62728",
345
+ linewidth=1.0,
346
+ )
347
  ax_secondary.set_ylabel("Anomaly Score")
348
 
349
+ handles_primary, labels_primary = ax_primary.get_legend_handles_labels()
350
+ handles_secondary, labels_secondary = ax_secondary.get_legend_handles_labels()
351
+ ax_primary.legend(
352
+ handles_primary + handles_secondary,
353
+ labels_primary + labels_secondary,
354
+ loc="upper right",
355
+ )
356
+
357
  fig.tight_layout()
358
  return fig
359
 
 
363
  with gr.Blocks(title="Time-RCD Zero-Shot Anomaly Detection") as demo:
364
  gr.Markdown(
365
  "# Time-RCD Zero-Shot Anomaly Detection\n"
366
+ "Start with one of the bundled datasets or upload your own time series to run zero-shot anomaly detection."
367
+ )
368
+
369
+ bundled_choices = list(SAMPLE_FILES.keys())
370
+ default_choice = bundled_choices[0] if bundled_choices else "Upload my own"
371
+
372
+ data_selector = gr.Radio(
373
+ choices=bundled_choices + ["Upload my own"],
374
+ value=default_choice,
375
+ label="Choose dataset",
376
  )
377
 
378
  with gr.Row():
379
+ file_input = gr.File(
380
+ label="Upload time series file (.csv, .txt, .npy)",
381
+ file_types=[".csv", ".txt", ".npy"],
382
+ visible=default_choice == "Upload my own",
383
+ )
384
+ label_source = gr.Radio(
385
+ choices=list(LABEL_SOURCE_CHOICES.keys()),
386
+ value="Value + label in same file",
387
+ label="Label source",
388
+ )
389
+
390
+ with gr.Row():
391
+ label_file_input = gr.File(
392
+ label="Upload label file (.csv, .txt, .npy)",
393
+ file_types=[".csv", ".txt", ".npy"],
394
+ visible=False,
395
+ )
396
  column_selector = gr.Textbox(
397
  label="Columns to use (comma-separated, optional)",
398
  placeholder="e.g. value,feature_1,feature_2",
399
  )
400
 
401
+ gr.Markdown(
402
+ "Bundled datasets live in the Downloads folder and include labels unless noted. "
403
+ "Select \"Upload my own\" to provide a custom file."
404
+ )
405
+
406
  with gr.Row():
407
  multivariate = gr.Radio(
408
  choices=["Univariate", "Multivariate"],
409
+ value=(
410
+ "Multivariate"
411
+ if bundled_choices and SAMPLE_FILES[default_choice]["is_multivariate"]
412
+ else "Univariate"
413
+ ),
414
  label="Data type",
415
  )
416
  window_size_in = gr.Slider(
417
  minimum=128,
418
+ maximum=20000,
419
+ value=15000,
420
  step=128,
421
  label="Window size",
422
  )
 
429
  )
430
 
431
  with gr.Row():
 
 
 
 
 
432
  multi_size_in = gr.Radio(
433
  choices=["full", "small"],
434
  value="full",
 
440
  result_message = gr.Textbox(label="Summary", interactive=False)
441
  result_dataframe = gr.DataFrame(label="Anomaly Scores", interactive=False)
442
  plot_output = gr.Plot(label="Series vs. Anomaly Score")
443
+ metrics_output = gr.DataFrame(label="Metrics", interactive=False)
444
+ def _submit(
445
+ data_choice,
446
+ file_obj,
447
+ label_source_choice,
448
+ label_file_obj,
449
+ multivariate_choice,
450
+ win,
451
+ batch,
452
+ size,
453
+ columns_text,
454
+ ):
455
+ use_sample = data_choice != "Upload my own"
456
+ if use_sample:
457
+ sample_entry = SAMPLE_FILES[data_choice]
458
+ value_obj = sample_entry["path"]
459
+ else:
460
+ value_obj = file_obj
461
+
462
+ if value_obj is None:
463
+ raise gr.Error("Please upload a time series file or choose a sample.")
464
 
465
  feature_columns = [col.strip() for col in columns_text.split(",") if col.strip()] if columns_text else []
466
  is_multi = multivariate_choice == "Multivariate"
467
+ resolved_label_source = LABEL_SOURCE_CHOICES[label_source_choice]
468
+ if resolved_label_source == "separate_file" and label_file_obj is None:
469
+ raise gr.Error("Please upload a label file or change the label source option.")
470
+ summary, df, fig, metrics = infer(
471
+ file_obj=value_obj,
472
  is_multivariate=is_multi,
473
  window_size=int(win),
474
  batch_size=int(batch),
 
475
  multi_size=size,
476
  feature_columns=feature_columns,
477
+ label_source=resolved_label_source,
478
+ label_file=label_file_obj,
479
  )
480
+ return summary, df, fig, metrics
481
+
482
+ def _toggle_label_file(option):
483
+ return gr.update(visible=option == "Labels in separate file")
484
+
485
+ def _handle_dataset_choice(choice):
486
+ show_upload = choice == "Upload my own"
487
+ if choice == "Upload my own":
488
+ multi_update = gr.update()
489
+ else:
490
+ expected_multi = SAMPLE_FILES[choice]["is_multivariate"]
491
+ multi_update = gr.update(value="Multivariate" if expected_multi else "Univariate")
492
+ return gr.update(visible=show_upload), multi_update
493
+
494
+ label_source.change(fn=_toggle_label_file, inputs=label_source, outputs=label_file_input)
495
+ data_selector.change(fn=_handle_dataset_choice, inputs=data_selector, outputs=[file_input, multivariate])
496
 
497
  run_button.click(
498
  fn=_submit,
499
+ inputs=[
500
+ data_selector,
501
+ file_input,
502
+ label_source,
503
+ label_file_input,
504
+ multivariate,
505
+ window_size_in,
506
+ batch_size_in,
507
+ multi_size_in,
508
+ column_selector,
509
+ ],
510
+ outputs=[result_message, result_dataframe, plot_output, metrics_output],
511
  )
512
 
513
  return demo
model_wrapper.py CHANGED
@@ -450,15 +450,19 @@ def run_Time_RCD(data, **kwargs):
450
  else:
451
  checkpoint_path = 'checkpoints/full_mask_15_56.pth'
452
  config.ts_config.patch_size = 32
 
453
  else:
454
  checkpoint_path = 'checkpoints/full_mask_anomaly_head_pretrain_checkpoint_best.pth'
455
  config.ts_config.patch_size = 16
 
456
 
457
  config.cuda_devices = device # Use the device parameter properly
458
  print("Using CUDA device:", config.cuda_devices)
459
  config.win_size = win_size
460
  config.batch_size = batch_size
461
- config.ts_config.num_features = data.shape[1]
 
 
462
  print(f"Checkpoint path: {checkpoint_path}")
463
  cls = TimeRCDPretrainTester(checkpoint_path, config)
464
  score_list, logit_list = cls.zero_shot(data)
 
450
  else:
451
  checkpoint_path = 'checkpoints/full_mask_15_56.pth'
452
  config.ts_config.patch_size = 32
453
+ config.ts_config.num_features = data.shape[1]
454
  else:
455
  checkpoint_path = 'checkpoints/full_mask_anomaly_head_pretrain_checkpoint_best.pth'
456
  config.ts_config.patch_size = 16
457
+ config.ts_config.num_features = 1
458
 
459
  config.cuda_devices = device # Use the device parameter properly
460
  print("Using CUDA device:", config.cuda_devices)
461
  config.win_size = win_size
462
  config.batch_size = batch_size
463
+ # config.ts_config.num_features = data.shape[1]
464
+
465
+ print("Here is the data shape: ", data.shape)
466
  print(f"Checkpoint path: {checkpoint_path}")
467
  cls = TimeRCDPretrainTester(checkpoint_path, config)
468
  score_list, logit_list = cls.zero_shot(data)
sample_datasets/003_MSL_id_2_Sensor_tr_883_1st_1238.csv ADDED
The diff for this file is too large to render. See raw diff
 
sample_datasets/235_SED_id_2_Medical_tr_2499_1st_3840.csv ADDED
The diff for this file is too large to render. See raw diff
 
sample_datasets/364_UCR_id_62_Sensor_tr_2833_1st_5988.csv ADDED
The diff for this file is too large to render. See raw diff
 
sample_datasets/686_YAHOO_id_136_WebService_tr_500_1st_755.csv ADDED
@@ -0,0 +1,1681 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Data,Label
2
+ -12.3632407773689,0
3
+ 232.13634171358,0
4
+ 430.52571793368105,0
5
+ 496.173075378765,0
6
+ 522.727572341893,0
7
+ 393.257932390811,0
8
+ 213.565994220419,0
9
+ 38.2952438682293,0
10
+ -127.107541885994,0
11
+ -95.03925017548109,0
12
+ -106.601412209391,0
13
+ -7.52539458493978,0
14
+ 32.0612030482211,0
15
+ 197.41865281019287,0
16
+ 323.040653356358,0
17
+ 336.954405258532,0
18
+ 283.577174183736,0
19
+ 130.779855457075,0
20
+ 0.9227558452515192,0
21
+ -215.556328746695,0
22
+ -275.877826366485,0
23
+ -272.840852246077,0
24
+ -249.05187224346,0
25
+ -91.9718148835804,0
26
+ 239.831590502733,0
27
+ 382.195091834717,0
28
+ 561.899265329255,0
29
+ 630.0377180700029,0
30
+ 627.7814624379889,0
31
+ 504.893588857404,0
32
+ 365.770165469506,0
33
+ 152.214172210223,0
34
+ 85.9884860266163,0
35
+ 60.2455830227528,0
36
+ 24.8111402315968,0
37
+ 149.845019077926,0
38
+ 180.792529745664,0
39
+ 364.63274175438,0
40
+ 497.791309065616,0
41
+ 482.581536454726,0
42
+ 453.62644028571,0
43
+ 235.0701662100849,0
44
+ 61.36547444249271,0
45
+ -35.6404221818407,0
46
+ -140.412252601003,0
47
+ -157.180403355837,0
48
+ -84.67058760494001,0
49
+ -7.33952611979112,0
50
+ 273.183262836977,0
51
+ 497.963072677309,0
52
+ 684.926149428177,0
53
+ 707.098984074987,0
54
+ 702.987212270702,0
55
+ 680.753360602258,0
56
+ 436.16093475391295,0
57
+ 240.543048080317,0
58
+ 88.771528118984,0
59
+ -28.8520196168574,0
60
+ 64.6874582486544,0
61
+ 114.203938252107,0
62
+ 263.012912293684,0
63
+ 461.437871812817,0
64
+ 537.475008250849,0
65
+ 485.771049528955,0
66
+ 449.411584387616,0
67
+ 332.173875030068,0
68
+ 101.148815779592,0
69
+ 22.6422652576438,0
70
+ -70.22860373068521,0
71
+ -195.978464618681,0
72
+ -174.999993448803,0
73
+ 76.5178672246325,0
74
+ 302.317412967712,0
75
+ 489.422605122118,0
76
+ 656.255677740785,0
77
+ 729.6760495620849,0
78
+ 706.50381080151,0
79
+ 618.2135112534829,0
80
+ 391.99961641433,0
81
+ 209.722220302298,0
82
+ 53.8268583911137,0
83
+ 14.023950602775098,0
84
+ 86.20815906588459,0
85
+ 111.19936317051,0
86
+ 188.65908628291697,0
87
+ 394.237545406156,0
88
+ 486.413013424712,0
89
+ 518.8994084129811,0
90
+ 359.135915973952,0
91
+ 301.341059835943,0
92
+ 81.7506228458875,0
93
+ -100.368561507905,0
94
+ -294.426057653765,0
95
+ -156.189089943764,0
96
+ -72.0103003301233,0
97
+ 41.379324409603,0
98
+ 262.805832790962,0
99
+ 458.61690521588,0
100
+ 642.984608160047,0
101
+ 693.154416992712,0
102
+ 664.777499974599,0
103
+ 578.814669178947,0
104
+ 388.488822793017,0
105
+ 163.98176670203898,0
106
+ 33.823164110604,0
107
+ 4.842965156470889,0
108
+ -5.64653543941514,0
109
+ 23.9467640711378,0
110
+ 227.290988528578,0
111
+ 356.38771140502604,0
112
+ 466.849116978331,0
113
+ 380.44206229618,0
114
+ 335.46777409785705,0
115
+ 137.890365524982,0
116
+ 42.00174488615811,0
117
+ -109.680756508003,0
118
+ -263.445257507019,0
119
+ -173.87051348597,0
120
+ -130.765962050055,0
121
+ 10.037755743912,0
122
+ 291.765346128751,0
123
+ 432.0050672686151,0
124
+ 725.3180647380051,0
125
+ 689.165238620021,0
126
+ 712.419367140357,0
127
+ 680.623273551662,0
128
+ 389.1636576235,0
129
+ 188.555701339254,0
130
+ 79.2095126576895,0
131
+ 45.334835808513006,0
132
+ 154.772593524072,0
133
+ 141.067450916111,0
134
+ 305.04562182976,0
135
+ 376.834097799316,0
136
+ 506.027015720898,0
137
+ 555.094641605013,0
138
+ 463.559334293063,0
139
+ 304.784764618,0
140
+ 172.959551197435,0
141
+ -49.79765319364671,0
142
+ -42.6893707619453,0
143
+ -126.442998276384,0
144
+ 3.38206845010513,0
145
+ 171.698556847743,0
146
+ 330.864252337384,0
147
+ 613.410136288909,0
148
+ 737.474981383477,0
149
+ 833.780533135298,0
150
+ 907.961509433006,0
151
+ 658.206053259314,0
152
+ 558.560271470736,0
153
+ 376.175303325165,0
154
+ 229.774653160466,0
155
+ 177.639539006839,0
156
+ 252.19150080448296,0
157
+ 297.883874321189,0
158
+ 364.49474928272105,0
159
+ 560.070325015129,0
160
+ 603.788091990035,0
161
+ 619.671893321222,0
162
+ 658.198649777604,0
163
+ 449.10113200325895,0
164
+ 320.694992970366,0
165
+ 186.38155165517887,0
166
+ 108.216963960849,0
167
+ -10.0348351642116,0
168
+ 193.572997229745,0
169
+ 255.604811113075,0
170
+ 529.716077345118,0
171
+ 800.362703598921,0
172
+ 956.98884783606,0
173
+ 912.519033929862,0
174
+ 977.794498653076,0
175
+ 946.48250555368,0
176
+ 732.4481955118209,0
177
+ 447.377892376562,0
178
+ 435.69950497230496,0
179
+ 311.52594635605203,0
180
+ 318.324726522037,0
181
+ 482.681100942551,0
182
+ 570.855714535282,0
183
+ 675.461940038694,0
184
+ 824.436871280607,0
185
+ 835.190321535432,0
186
+ 719.265958242624,0
187
+ 599.401123911827,0
188
+ 465.75118949246496,0
189
+ 333.698097502947,0
190
+ 183.160607180414,0
191
+ 191.440624569721,0
192
+ 275.22271215935,0
193
+ 360.586053131463,0
194
+ 686.302488441446,0
195
+ 854.3862815003689,0
196
+ 1073.34835377284,0
197
+ 1071.75696687279,0
198
+ 1117.44384295249,0
199
+ 1072.2978002696,0
200
+ 864.175462372412,0
201
+ 691.269036529403,0
202
+ 493.315621809345,0
203
+ 511.827113419583,0
204
+ 538.702965186655,0
205
+ 620.763164274878,0
206
+ 803.298525957944,0
207
+ 881.0330391076379,0
208
+ 991.2211967278108,0
209
+ 1021.10574216196,0
210
+ 908.736445625107,0
211
+ 737.878022308062,0
212
+ 632.343338947952,0
213
+ 351.674635889589,0
214
+ 315.24061650748,0
215
+ 292.85208084858,0
216
+ 455.523264888422,0
217
+ 558.449095992596,0
218
+ 696.158380078962,0
219
+ 1003.72683909469,0
220
+ 1122.54484211107,0
221
+ 1266.63565811315,0
222
+ 1269.7971218922,0
223
+ 1079.47051777113,0
224
+ 976.132940684312,0
225
+ 804.642105240126,0
226
+ 548.377375119852,0
227
+ 580.500185119952,0
228
+ 530.642376837658,0
229
+ 669.024614545665,0
230
+ 759.8886026432621,0
231
+ 921.331475948741,0
232
+ 962.95836250895,0
233
+ 1029.89254789919,0
234
+ 959.337867342408,0
235
+ 699.007405449109,0
236
+ 735.167790385479,0
237
+ 475.176780895544,0
238
+ 299.279090406402,0
239
+ 354.23898714304704,0
240
+ 411.515642089868,0
241
+ 557.718772625873,0
242
+ 767.2154631260499,0
243
+ 919.781468924462,0
244
+ 1174.4537290243,0
245
+ 1206.38301766968,0
246
+ 1123.01272292485,0
247
+ 1065.2558649563,0
248
+ 934.791950969605,0
249
+ 826.631863290824,0
250
+ 601.720521916762,0
251
+ 565.460020203727,0
252
+ 506.5716457096521,0
253
+ 612.490890407173,0
254
+ 701.775502225292,0
255
+ 873.025368916297,0
256
+ 936.7458735358432,0
257
+ 946.7716725379672,0
258
+ 888.361411641707,0
259
+ 696.598992432374,0
260
+ 588.930530685997,0
261
+ 364.6841819284391,0
262
+ 308.797168704647,0
263
+ 287.633859715428,0
264
+ 398.754613388838,0
265
+ 507.959766931027,0
266
+ 793.1971909256799,0
267
+ 973.845087773513,0
268
+ 1115.34303060879,0
269
+ 1247.8953714962402,0
270
+ 1248.4533976159598,0
271
+ 1095.8814949843302,0
272
+ 885.6591402728841,0
273
+ 738.035656007224,0
274
+ 547.2302728421109,0
275
+ 490.671340893112,0
276
+ 468.525809247731,0
277
+ 534.130830469149,0
278
+ 727.6294862941361,0
279
+ 886.976625184867,0
280
+ 1019.09591409818,0
281
+ 1029.17924528058,0
282
+ 938.407010845094,0
283
+ 766.54647159659,0
284
+ 602.16389592847,0
285
+ 407.98414338695,0
286
+ 299.95504109181,0
287
+ 265.121652529649,0
288
+ 389.005463400122,0
289
+ 522.915777394844,0
290
+ 734.5494985506571,0
291
+ 1043.1227452686,0
292
+ 1039.38556098771,0
293
+ 1133.33482251116,0
294
+ 1173.51998356541,0
295
+ 1072.06333313612,0
296
+ 917.166570370295,0
297
+ 744.35077397158,0
298
+ 736.563822811395,0
299
+ 576.415334064176,0
300
+ 600.179072018099,0
301
+ 691.881433556006,0
302
+ 771.087821359525,0
303
+ 898.408984934503,0
304
+ 1001.92779584997,0
305
+ 1083.04255122087,0
306
+ 987.8473742488452,0
307
+ 755.096812943875,0
308
+ 644.012677626522,0
309
+ 483.746634530395,0
310
+ 377.305459802768,0
311
+ 344.813446459589,0
312
+ 467.481028163216,0
313
+ 655.422378720814,0
314
+ 843.4101677742681,0
315
+ 1096.21321957213,0
316
+ 1289.36897428547,0
317
+ 1410.45643358873,0
318
+ 1329.52775977257,0
319
+ 1227.56423919339,0
320
+ 1069.18892616449,0
321
+ 800.755293759977,0
322
+ 734.893544275338,0
323
+ 657.8856887415619,0
324
+ 719.4346369961951,0
325
+ 810.106682332916,0
326
+ 899.5867631817371,0
327
+ 1157.04895190508,0
328
+ 1137.97105806047,0
329
+ 1195.78280875293,0
330
+ 1089.57239317955,0
331
+ 822.0227915260319,0
332
+ 843.5900925256099,0
333
+ 603.195368427648,0
334
+ 590.4828611658529,0
335
+ 504.244294213333,0
336
+ 689.203087608678,0
337
+ 770.841851892914,0
338
+ 932.763093178187,0
339
+ 1285.55791242965,0
340
+ 1459.70924935522,0
341
+ 1492.74791566573,0
342
+ 1520.5592072365305,0
343
+ 1413.63694662493,0
344
+ 1341.20481047478,0
345
+ 973.116350720138,0
346
+ 916.063886667842,0
347
+ 804.3098238966071,0
348
+ 831.821505363429,0
349
+ 955.993862776457,0
350
+ 1148.84962336507,0
351
+ 1142.74711444195,0
352
+ 1361.76316989968,0
353
+ 1331.8030984952302,0
354
+ 1294.88423735235,0
355
+ 1158.01215443615,0
356
+ 961.520101156527,0
357
+ 808.5907055898571,0
358
+ 747.8174237465539,0
359
+ 725.767911806126,0
360
+ 739.8976793768679,0
361
+ 958.476708690012,0
362
+ 1213.04587590741,0
363
+ 1344.40308991724,0
364
+ 1663.25436727369,0
365
+ 1663.70416458094,0
366
+ 1671.32927601679,0
367
+ 1538.98851788746,0
368
+ 1440.14699062641,0
369
+ 1265.53348479814,0
370
+ 1023.87716661826,0
371
+ 984.419713108131,0
372
+ 1077.38420078108,0
373
+ 1087.16329329994,0
374
+ 1247.67324576211,0
375
+ 1410.49132730574,0
376
+ 1382.2326631575102,0
377
+ 1516.62005544642,0
378
+ 1383.04506888898,0
379
+ 1315.67914702137,0
380
+ 1071.3876833806098,0
381
+ 868.046866323248,0
382
+ 778.615940652715,0
383
+ 767.890333858069,0
384
+ 780.660676459821,0
385
+ 1097.75053309465,0
386
+ 1205.00762969423,0
387
+ 1519.17768702181,0
388
+ 1665.57135212939,0
389
+ 1734.5416338434195,0
390
+ 1639.98255683742,0
391
+ 1572.39056364703,0
392
+ 1456.05140292617,0
393
+ 1229.07089881313,0
394
+ 1088.95748379666,0
395
+ 1112.2563207054,0
396
+ 1037.50114573661,0
397
+ 1100.99959664311,0
398
+ 1286.60087999374,0
399
+ 1459.2423010518698,0
400
+ 1520.49339359586,0
401
+ 1450.22859719155,0
402
+ 1454.56332239185,0
403
+ 1240.59658274101,0
404
+ 1084.3740523231,0
405
+ 988.938340567211,0
406
+ 871.0754050555141,0
407
+ 859.985075805786,0
408
+ 876.9131226139141,0
409
+ 1106.69825498547,0
410
+ 1307.6233285029302,0
411
+ 1478.4913169111098,0
412
+ 1649.7732102143302,0
413
+ 1741.4278125591502,0
414
+ 1741.90550612271,0
415
+ 1593.45655677813,0
416
+ 1419.5902253914098,0
417
+ 1298.57000705593,0
418
+ 1119.52184010763,0
419
+ 1002.15275011595,0
420
+ 973.5738467969612,0
421
+ 1108.4835529193,0
422
+ 1225.5314372866,0
423
+ 1423.57080696801,0
424
+ 1553.7303208342098,0
425
+ 1466.25706276424,0
426
+ 1394.0185105254998,0
427
+ 1321.43865470929,0
428
+ 1083.26914705819,0
429
+ 936.948923921172,0
430
+ 785.623831302809,0
431
+ 755.894436611282,0
432
+ 848.918740953177,0
433
+ 1065.22096242629,0
434
+ 1254.42558182121,0
435
+ 1482.01559243755,0
436
+ 1634.85793234556,0
437
+ 1643.38454909949,0
438
+ 1690.6986044274202,0
439
+ 1562.47246362711,0
440
+ 1398.43832279427,0
441
+ 1176.47632758462,0
442
+ 1075.0295712534,0
443
+ 1008.52908478811,0
444
+ 1017.31274721465,0
445
+ 1152.32264526433,0
446
+ 1219.56421398243,0
447
+ 1383.9986994338,0
448
+ 1407.06622801466,0
449
+ 1415.6385485312198,0
450
+ 1453.12982870516,0
451
+ 1247.6255784103998,0
452
+ 1094.93875154745,0
453
+ 928.611512435143,0
454
+ 763.580007538024,0
455
+ 832.390394989904,0
456
+ 863.712073380573,0
457
+ 980.970712243032,0
458
+ 1256.99316078375,0
459
+ 1434.20117497302,0
460
+ 1557.2623026034305,0
461
+ 1670.1403654636902,0
462
+ 1670.6669156134,0
463
+ 1619.7641178476802,0
464
+ 1412.38404398802,0
465
+ 1258.03307558685,0
466
+ 1108.45761448913,0
467
+ 1076.91984647597,0
468
+ 1114.09081596444,0
469
+ 1111.7332050774,0
470
+ 1245.05622573784,0
471
+ 1454.30844164129,0
472
+ 1453.4304543260198,0
473
+ 1502.91012454669,0
474
+ 1496.43154957118,0
475
+ 1326.46372063423,0
476
+ 1118.71714780568,0
477
+ 1034.2642141042,0
478
+ 869.9439554915781,0
479
+ 883.0384657430161,0
480
+ 1005.43427430693,0
481
+ 1060.59742585944,0
482
+ 1343.98967033705,0
483
+ 1579.69092626337,0
484
+ 1797.9868038150198,0
485
+ 1780.34371959565,0
486
+ 1808.56427932768,0
487
+ 1694.85285178197,0
488
+ 1570.12478628447,0
489
+ 1405.32875930979,0
490
+ 1296.54581259813,0
491
+ 1204.50881043988,0
492
+ 1256.22254158635,0
493
+ 1342.19407026331,0
494
+ 1432.58489669359,0
495
+ 1530.2749034007502,0
496
+ 1680.5925229511902,0
497
+ 1659.0966919000198,0
498
+ 1650.88102248984,0
499
+ 1474.5179560537,0
500
+ 1313.20002197521,0
501
+ 1108.09286626494,0
502
+ 1009.2043225429302,0
503
+ 1103.09477835872,0
504
+ 1064.15057566225,0
505
+ 1304.76863847553,0
506
+ 1496.19219158661,0
507
+ 1743.48966700763,0
508
+ 1836.78685577698,0
509
+ 1987.95789047059,0
510
+ 1975.16058216784,0
511
+ 1944.78190961568,0
512
+ 1802.7309088698105,0
513
+ 1488.55626614835,0
514
+ 1454.64381793538,0
515
+ 1389.96033565853,0
516
+ 1395.26692094288,0
517
+ 1490.66251410738,0
518
+ 1601.40459401383,0
519
+ 1760.62607027675,0
520
+ 1811.30982134175,0
521
+ 1912.54612556219,0
522
+ 1796.5178462228,0
523
+ 1634.81208276324,0
524
+ 1458.35559308922,0
525
+ 1344.98930519182,0
526
+ 1278.6747410656,0
527
+ 1174.30000451146,0
528
+ 1309.38286843178,0
529
+ 1531.3270175461998,0
530
+ 1647.7778861440302,0
531
+ 1854.71030562432,0
532
+ 2057.69155125941,0
533
+ 2205.26287113512,0
534
+ 2233.21615042738,0
535
+ 2103.65790591758,0
536
+ 1827.38254902059,0
537
+ 1657.4586682619,0
538
+ 1506.6101362974898,0
539
+ 1565.4225591041502,0
540
+ 1413.97122400126,0
541
+ 1578.31063252558,0
542
+ 1809.67953566756,0
543
+ 1850.29010087823,0
544
+ 1945.3564363122305,0
545
+ 2023.97602282035,0
546
+ 1963.5101305204105,0
547
+ 1726.68017468772,0
548
+ 1648.41800372746,0
549
+ 1399.16620141539,0
550
+ 1371.61491627458,0
551
+ 1314.00103803829,0
552
+ 1341.79430089447,0
553
+ 1550.22752768776,0
554
+ 1769.54345896909,0
555
+ 1972.07784829953,0
556
+ 2236.9228825101,0
557
+ 2198.69003030413,0
558
+ 2218.62934401927,0
559
+ 2200.27237416703,0
560
+ 1993.76644967446,0
561
+ 1822.30473829663,0
562
+ 1610.60572439464,0
563
+ 1474.6240950923002,0
564
+ 1548.32524539547,0
565
+ 1740.97459522158,0
566
+ 1849.73497609844,0
567
+ 2080.60182977749,0
568
+ 2153.64331892634,0
569
+ 2201.78065309238,0
570
+ 2073.6829084061897,0
571
+ 1870.88504950282,0
572
+ 1544.7181818345098,0
573
+ 1431.15423251807,0
574
+ 1052.0966003779,0
575
+ 1139.1250081098,0
576
+ 1232.42041717998,0
577
+ 1500.75852253203,0
578
+ 1803.80462353164,0
579
+ 2061.2711189856,0
580
+ 2362.38407292625,0
581
+ 2553.80302999058,0
582
+ 2447.24372244343,0
583
+ 2322.8217422083803,0
584
+ 2101.15654788493,0
585
+ 1814.20746413476,0
586
+ 1418.3582905635,0
587
+ 1423.08357229651,0
588
+ 1590.96896310841,0
589
+ 1504.04209726833,0
590
+ 1672.95794344702,0
591
+ 1976.46973793839,0
592
+ 2152.41608425522,0
593
+ 2121.3839838002104,0
594
+ 1878.57956612992,0
595
+ 1791.81881183154,0
596
+ 1430.201288531,0
597
+ 1238.9949244408,0
598
+ 1051.66555818235,0
599
+ 997.493328687984,0
600
+ 1157.46644883238,0
601
+ 1466.77027401925,0
602
+ 1846.80563905943,0
603
+ 1971.6693334541696,0
604
+ 2398.2214061092104,0
605
+ 2490.90541598686,0
606
+ 2411.588073248,0
607
+ 2209.79286291778,0
608
+ 1890.2153983654896,0
609
+ 1700.46160110727,0
610
+ 1466.5317318276502,0
611
+ 1374.77835277759,0
612
+ 1437.1081595098,0
613
+ 1456.15722598586,0
614
+ 1641.40248349981,0
615
+ 1866.07769995879,0
616
+ 1954.19883475963,0
617
+ 2031.4874546587,0
618
+ 1895.20989909836,0
619
+ 1769.0425782871102,0
620
+ 1461.8811445709198,0
621
+ 1209.02621911007,0
622
+ 1013.64477677699,0
623
+ 1132.39703562188,0
624
+ 1154.10738298571,0
625
+ 1340.44647222831,0
626
+ 1653.56993330443,0
627
+ 2053.6917976121804,0
628
+ 2289.74310656483,0
629
+ 2382.81548576672,0
630
+ 2406.5753806255,0
631
+ 2318.20160938034,0
632
+ 1852.7119500332,0
633
+ 1679.68742769306,0
634
+ 1607.3246768707002,0
635
+ 1412.50115357016,0
636
+ 1493.0082530278305,0
637
+ 1562.86612971969,0
638
+ 1663.48660459759,0
639
+ 1836.1814220494896,0
640
+ 2035.91160881898,0
641
+ 2027.0751508348496,0
642
+ 1963.57097498882,0
643
+ 1795.88288144094,0
644
+ 1541.37895286678,0
645
+ 1248.85962696055,0
646
+ 1162.15221163491,0
647
+ 1133.42943211003,0
648
+ 1207.8959660589,0
649
+ 1515.63460397316,0
650
+ 1748.67853394577,0
651
+ 2099.57750160621,0
652
+ 2364.42767622882,0
653
+ 2550.57979949858,0
654
+ 2522.5561216205,0
655
+ 2243.4503765133,0
656
+ 2196.59689647906,0
657
+ 1847.36138675216,0
658
+ 1688.9279051787,0
659
+ 1681.4341270548498,0
660
+ 1515.77708051691,0
661
+ 1758.11172300646,0
662
+ 1831.1664871133896,0
663
+ 2158.1268370962,0
664
+ 2312.5768447966,0
665
+ 2396.72268532546,0
666
+ 2207.90546377642,0
667
+ 2092.36923842305,0
668
+ 1756.3516465772598,0
669
+ 1531.4141119980302,0
670
+ 1297.2146071377902,0
671
+ 1331.24970885871,0
672
+ 1397.51950176129,0
673
+ 1835.6267166600303,0
674
+ 1992.88449071686,0
675
+ 2418.7435322396,0
676
+ 2632.06253715397,0
677
+ 2621.38325627018,0
678
+ 2835.006582282,0
679
+ 2597.1216046404897,0
680
+ 2149.44272125569,0
681
+ 2108.04356378732,0
682
+ 1947.0094208604,0
683
+ 1877.20522299073,0
684
+ 1737.32402012691,0
685
+ 1995.03458393871,0
686
+ 2121.4550403888697,0
687
+ 2332.8111892198103,0
688
+ 2452.52411590408,0
689
+ 2461.73422277185,0
690
+ 2452.8321443671102,0
691
+ 2220.56440839477,0
692
+ 1953.5168009361605,0
693
+ 1650.0261786293695,0
694
+ 1604.50942777206,0
695
+ 1478.03072853096,0
696
+ 1656.82199453361,0
697
+ 1833.5079843208,0
698
+ 2199.87078423962,0
699
+ 2585.4967601973103,0
700
+ 2849.98124949779,0
701
+ 2932.49853033034,0
702
+ 2904.31030300682,0
703
+ 2766.68576174146,0
704
+ 2591.91039387583,0
705
+ 2371.86332187915,0
706
+ 2006.1857242969,0
707
+ 1945.97347301036,0
708
+ 2013.50902293728,0
709
+ 2156.21068690945,0
710
+ 2292.39481279294,0
711
+ 2487.82448360065,0
712
+ 2673.67841098239,0
713
+ 2653.8053740037303,0
714
+ 2537.66351460189,0
715
+ 2351.94367908064,0
716
+ 2182.47209508993,0
717
+ 1874.4054592533,0
718
+ 1734.05633709193,0
719
+ 1563.30466115039,0
720
+ 1775.4991542196,0
721
+ 1990.64514523034,0
722
+ 2389.84562381385,0
723
+ 2671.82837187356,0
724
+ 2967.8894158033504,0
725
+ 3063.2898062618,0
726
+ 2934.8592855985,0
727
+ 2845.2012151535805,0
728
+ 2669.9504554561604,0
729
+ 2308.04202976691,0
730
+ 2064.17882045532,0
731
+ 2034.04970840114,0
732
+ 1971.70155359349,0
733
+ 2165.53887226526,0
734
+ 2194.22157867288,0
735
+ 2610.3684747706698,0
736
+ 2673.39662831457,0
737
+ 2650.2887912273,0
738
+ 2591.0274117664103,0
739
+ 2382.7440182933,0
740
+ 2102.46520251038,0
741
+ 1830.36507119852,0
742
+ 1608.7926920615398,0
743
+ 1646.30452060484,0
744
+ 1621.7767032422305,0
745
+ 1970.45830290968,0
746
+ 2452.2861756186803,0
747
+ 2606.14387181227,0
748
+ 2878.4644451950603,0
749
+ 2921.89202544011,0
750
+ 3006.6134796931897,0
751
+ 2785.10637704992,0
752
+ 2536.44309394952,0
753
+ 2269.47359166181,0
754
+ 2070.00138373121,0
755
+ 1972.48844623286,0
756
+ 1869.83745819655,0
757
+ 3638.99031745037,1
758
+ 2404.47676720424,0
759
+ 2467.9032858569103,0
760
+ 2512.82462387129,0
761
+ 2466.46430191658,0
762
+ 2498.70780606091,0
763
+ 2296.70209509406,0
764
+ 2019.2561200856896,0
765
+ 1743.88081507338,0
766
+ 1633.82526408912,0
767
+ 1699.00027777884,0
768
+ 1681.63286480096,0
769
+ 2015.4206335223605,0
770
+ 2177.82884307124,0
771
+ 2431.9551297547,0
772
+ 2818.6287927858,0
773
+ 2906.54701496927,0
774
+ 2910.5732881030394,0
775
+ 2551.89550389962,0
776
+ 2407.88770837209,0
777
+ 2308.6853441096696,0
778
+ 1976.3500759832104,0
779
+ 1873.2118872812805,0
780
+ 1810.8188926486896,0
781
+ 1846.08237400392,0
782
+ 2166.2188036287,0
783
+ 2423.73189676499,0
784
+ 2603.20517076941,0
785
+ 2616.10527357589,0
786
+ 2421.38672428796,0
787
+ 2186.22764820702,0
788
+ 2022.77941520262,0
789
+ 1757.77204212056,0
790
+ 1577.8991032709,0
791
+ 1450.47027095752,0
792
+ 1620.31223189049,0
793
+ 1901.52999549827,0
794
+ 2114.76889805003,0
795
+ 2482.73426962424,0
796
+ 2763.29673079151,0
797
+ 2898.4306972144104,0
798
+ 2847.88392539935,0
799
+ 2691.98050564221,0
800
+ 2517.68922202504,0
801
+ 2099.35744080091,0
802
+ 2016.33207457808,0
803
+ 1849.4925685916696,0
804
+ 1881.1444923674696,0
805
+ 2122.5466564532503,0
806
+ 2169.13328596762,0
807
+ 2488.4997530114897,0
808
+ 2479.74207023054,0
809
+ 2609.60659426582,0
810
+ 2478.47629687716,0
811
+ 2288.89499358382,0
812
+ 2099.57357924814,0
813
+ 1912.59818267815,0
814
+ 1671.92969658456,0
815
+ 1523.62699920136,0
816
+ 1645.72414067904,0
817
+ 1968.3605059198603,0
818
+ 2341.12939098704,0
819
+ 2584.6176051791,0
820
+ 2896.8422815684003,0
821
+ 3035.79266331998,0
822
+ 3058.627986528269,0
823
+ 2755.89756256211,0
824
+ 2587.3153980229,0
825
+ 2332.60944359731,0
826
+ 2141.66147054052,0
827
+ 2030.0799569913104,0
828
+ 2046.21759285815,0
829
+ 2161.3515626672897,0
830
+ 2525.1017492229603,0
831
+ 2555.51148834004,0
832
+ 2792.71770319314,0
833
+ 2768.49397076282,0
834
+ 2671.98990843304,0
835
+ 2525.50627672564,0
836
+ 2250.14239571579,0
837
+ 2016.9812616550896,0
838
+ 1791.7523348184802,0
839
+ 1903.293412316389,0
840
+ 1962.53956893654,0
841
+ 2289.31680642923,0
842
+ 2477.16218922687,0
843
+ 2926.9126312874,0
844
+ 3076.88500570016,0
845
+ 3251.5325832480103,0
846
+ 3215.8145105946,0
847
+ 3143.94354712937,0
848
+ 2855.91326150839,0
849
+ 2459.73280068951,0
850
+ 2365.5925637107603,0
851
+ 2207.40935079876,0
852
+ 3870.11802383636,1
853
+ 2397.29378272823,0
854
+ 2595.85948467427,0
855
+ 2832.39450854688,0
856
+ 1421.32274340194,1
857
+ 3047.2758322045,0
858
+ 2891.3872966517897,0
859
+ 2702.69192570609,0
860
+ 2484.73239158288,0
861
+ 2200.04571236134,0
862
+ 2108.99971406412,0
863
+ 1910.55071314482,0
864
+ 2196.18157862779,0
865
+ 2420.98419436752,0
866
+ 2815.03173421599,0
867
+ 3016.82897769392,0
868
+ 3368.8913946085604,0
869
+ 3467.76167721092,0
870
+ 3394.51257383344,0
871
+ 3295.99899221078,0
872
+ 2998.353988898089,0
873
+ 2826.91553623634,0
874
+ 2556.06155476169,0
875
+ 2449.80707524126,0
876
+ 2505.44773973183,0
877
+ 2605.37538564022,0
878
+ 2860.9553885733503,0
879
+ 3136.04688349394,0
880
+ 3167.0271868025297,0
881
+ 3159.44305770671,0
882
+ 3005.29842040194,0
883
+ 2911.43625860021,0
884
+ 2495.63510161067,0
885
+ 2457.1819458235,0
886
+ 2043.7851938121896,0
887
+ 2091.29578530436,0
888
+ 2384.7998868300697,0
889
+ 2497.46587786139,0
890
+ 2793.5799662596,0
891
+ 3098.00263258864,0
892
+ 3486.76073363265,0
893
+ 3617.18590961236,0
894
+ 3476.2222639023103,0
895
+ 3382.7824732184804,0
896
+ 3190.79193555058,0
897
+ 2782.7420199988696,0
898
+ 2606.50661792312,0
899
+ 2537.0119732671697,0
900
+ 2563.03603791936,0
901
+ 2667.57509184827,0
902
+ 2690.7235158041103,0
903
+ 3126.95843338465,0
904
+ 3260.5243158585304,0
905
+ 3324.84521250254,0
906
+ 2986.91647946768,0
907
+ 2877.3833391605103,0
908
+ 2520.99231022596,0
909
+ 2339.16131410575,0
910
+ 2211.38376414714,0
911
+ 2208.86636339712,0
912
+ 2214.1935021531,0
913
+ 2425.01115758284,0
914
+ 2766.1025002528304,0
915
+ 3088.60319327948,0
916
+ 3286.66998581073,0
917
+ 3456.77601593422,0
918
+ 3461.38176765648,0
919
+ 3184.1650423792894,0
920
+ 3009.95594166096,0
921
+ 2761.3697078995697,0
922
+ 2550.3700691829104,0
923
+ 2458.279266211,0
924
+ 2488.51379337717,0
925
+ 2561.60428591456,0
926
+ 2737.37341400889,0
927
+ 3000.2190027700103,0
928
+ 3115.45007838117,0
929
+ 3119.5447588411303,0
930
+ 3017.5012849134005,0
931
+ 2884.9643260248804,0
932
+ 2520.3470796432503,0
933
+ 2240.5086280552696,0
934
+ 1998.1652058136604,0
935
+ 1990.2748995523496,0
936
+ 2163.4675956003302,0
937
+ 2438.56599138257,0
938
+ 2735.97971407153,0
939
+ 2988.08739364836,0
940
+ 3376.42674147232,0
941
+ 3403.5368750360103,0
942
+ 3394.6956041947,0
943
+ 3202.75784453906,0
944
+ 2977.28874468302,0
945
+ 2684.2934898033604,0
946
+ 2453.30850855437,0
947
+ 2477.17730619762,0
948
+ 2377.86112254383,0
949
+ 2545.54669417999,0
950
+ 2678.9798943488,0
951
+ 2878.34990566266,0
952
+ 3067.8706066038,0
953
+ 2990.81913442148,0
954
+ 3079.10320219466,0
955
+ 2663.91257457448,0
956
+ 2514.02315020854,0
957
+ 2226.45647984918,0
958
+ 2116.45500995257,0
959
+ 1858.37102638983,0
960
+ 2092.40204578757,0
961
+ 2336.1827138323897,0
962
+ 2702.18923100399,0
963
+ 2857.1085602464696,0
964
+ 3208.3871768931704,0
965
+ 3302.77813477796,0
966
+ 3307.8899815812,0
967
+ 3303.40955794764,0
968
+ 2999.23065472769,0
969
+ 2748.40385042081,0
970
+ 2531.8992483491297,0
971
+ 2351.53596382242,0
972
+ 2402.0919098529503,0
973
+ 2493.22862914635,0
974
+ 2708.89224370235,0
975
+ 2993.9057475334603,0
976
+ 3064.2540385185603,0
977
+ 3119.84347617581,0
978
+ 2934.51708478834,0
979
+ 2852.8260926495,0
980
+ 2458.9321023561497,0
981
+ 2259.39808469867,0
982
+ 2183.15136819044,0
983
+ 2232.77375180564,0
984
+ 2211.3907788106,0
985
+ 2468.0863493468105,0
986
+ 2896.3907127515504,0
987
+ 3236.88738208284,0
988
+ 3437.4623552180296,0
989
+ 3581.2938781222206,0
990
+ 3399.41925167569,0
991
+ 3259.7978709386102,0
992
+ 3165.3350097669,0
993
+ 2921.0672456266902,0
994
+ 2598.45199846915,0
995
+ 2629.89421311839,0
996
+ 2557.1985788608604,0
997
+ 2774.92786472286,0
998
+ 2956.06525175398,0
999
+ 3118.81130689073,0
1000
+ 3281.4586646084304,0
1001
+ 3210.2341386041303,0
1002
+ 3257.75771266859,0
1003
+ 2983.22034948073,0
1004
+ 2797.27520232884,0
1005
+ 2481.29034166242,0
1006
+ 2228.5462379292603,0
1007
+ 2249.87317253662,0
1008
+ 2458.89165212441,0
1009
+ 2728.95870579885,0
1010
+ 3006.47031278044,0
1011
+ 3254.1345589131897,0
1012
+ 3549.4469120584704,0
1013
+ 3733.3897263913705,0
1014
+ 3769.422671296261,0
1015
+ 3591.9721322605296,0
1016
+ 3209.36142285953,0
1017
+ 3178.61421685896,0
1018
+ 2834.2278123907104,0
1019
+ 2826.65352848009,0
1020
+ 2687.06772561932,0
1021
+ 2960.09927797411,0
1022
+ 3188.81970745646,0
1023
+ 3422.7151344900203,0
1024
+ 3400.91152500914,0
1025
+ 3605.93367882423,0
1026
+ 3377.7245175879902,0
1027
+ 3180.35217313211,0
1028
+ 2908.2428990994704,0
1029
+ 2749.56330012539,0
1030
+ 2511.540770084,0
1031
+ 2464.455286915,0
1032
+ 2683.78729746152,0
1033
+ 2878.5460092897,0
1034
+ 3182.4329890397,0
1035
+ 3604.3197426221705,0
1036
+ 3796.9343064717,0
1037
+ 3811.6535485256095,0
1038
+ 3857.750192222629,0
1039
+ 3788.92783351156,0
1040
+ 3582.79560707883,0
1041
+ 3291.69583094883,0
1042
+ 3033.58088106021,0
1043
+ 2888.6450313356395,0
1044
+ 2996.71761472578,0
1045
+ 3236.72445994989,0
1046
+ 3199.21144779633,0
1047
+ 3595.93066152064,0
1048
+ 3555.11765575139,0
1049
+ 3625.32877425702,0
1050
+ 3516.1440980007696,0
1051
+ 3327.10025405987,0
1052
+ 3122.89592887512,0
1053
+ 2707.59843406746,0
1054
+ 2680.60306897185,0
1055
+ 2717.30758226873,0
1056
+ 2790.24490683117,0
1057
+ 3197.47696425618,0
1058
+ 3356.39279193993,0
1059
+ 3627.09783833046,0
1060
+ 3948.90660218019,0
1061
+ 4076.90380721394,0
1062
+ 4057.37973199414,0
1063
+ 3848.18892784159,0
1064
+ 3656.9065293468702,0
1065
+ 3376.8435324879497,0
1066
+ 3178.58696595612,0
1067
+ 3025.45794266815,0
1068
+ 3066.0286430079304,0
1069
+ 3233.2460866378497,0
1070
+ 3348.1556123737,0
1071
+ 3418.54218534675,0
1072
+ 3644.5316370534497,0
1073
+ 3698.7222223455,0
1074
+ 3548.4784528236896,0
1075
+ 3403.48586970299,0
1076
+ 3135.42942692183,0
1077
+ 2743.70919593092,0
1078
+ 2709.9892515419897,0
1079
+ 2714.74497967793,0
1080
+ 2809.44372817273,0
1081
+ 3023.19750054992,0
1082
+ 3260.37202805716,0
1083
+ 3663.2024542017,0
1084
+ 3881.27993112005,0
1085
+ 4103.44504494631,0
1086
+ 4000.55778922954,0
1087
+ 3680.7504277320704,0
1088
+ 3580.147372070829,0
1089
+ 3255.8164949607103,0
1090
+ 3002.37474598466,0
1091
+ 2871.42409569676,0
1092
+ 2993.87939687318,0
1093
+ 3119.4649912559603,0
1094
+ 3356.3637172329304,0
1095
+ 3369.8526981045698,0
1096
+ 3636.62513853065,0
1097
+ 3635.63073024606,0
1098
+ 3389.9011833876098,0
1099
+ 3328.35138830282,0
1100
+ 2982.74853563041,0
1101
+ 2795.36292025746,0
1102
+ 2639.24375184702,0
1103
+ 2551.77775890816,0
1104
+ 2668.57597668124,0
1105
+ 2965.1203820075298,0
1106
+ 3274.9203991368395,0
1107
+ 3515.73371003799,0
1108
+ 3793.67717942366,0
1109
+ 3924.92162837088,0
1110
+ 3909.1124207150106,0
1111
+ 3679.28511814054,0
1112
+ 3535.49138051928,0
1113
+ 3200.77112293901,0
1114
+ 2988.9100463542304,0
1115
+ 2909.51922427628,0
1116
+ 2852.95949845003,0
1117
+ 3004.19990630394,0
1118
+ 3213.44839134078,0
1119
+ 3406.19611039562,0
1120
+ 3647.09525642188,0
1121
+ 3461.9382809248805,0
1122
+ 3490.84186517849,0
1123
+ 3248.9920641856897,0
1124
+ 2869.13296477359,0
1125
+ 2623.45547505302,0
1126
+ 2566.44075266733,0
1127
+ 2456.83208712566,0
1128
+ 2681.82362400195,0
1129
+ 2927.7567096973803,0
1130
+ 3302.55801010849,0
1131
+ 3517.7659048709,0
1132
+ 3764.40147258904,0
1133
+ 3902.8427669093103,0
1134
+ 3846.72844360698,0
1135
+ 3750.35700562885,0
1136
+ 3464.82677106788,0
1137
+ 3180.6589854579497,0
1138
+ 2946.39367273142,0
1139
+ 2913.27680114342,0
1140
+ 2871.30704645579,0
1141
+ 3051.73833331015,0
1142
+ 3242.36893965982,0
1143
+ 3460.9564561154903,0
1144
+ 3628.75773540464,0
1145
+ 3614.59174846137,0
1146
+ 3606.9795759107,0
1147
+ 3267.2870622213395,0
1148
+ 2964.4282337138898,0
1149
+ 2797.34182972479,0
1150
+ 2568.0224543299696,0
1151
+ 2559.81215418847,0
1152
+ 2726.89116577742,0
1153
+ 3096.39549917504,0
1154
+ 3401.13916142535,0
1155
+ 3659.3780627932106,0
1156
+ 3858.81812197906,0
1157
+ 4017.6367341397295,0
1158
+ 4046.9375611534497,0
1159
+ 3783.35373904989,0
1160
+ 3596.9272484267603,0
1161
+ 3340.15366891013,0
1162
+ 3078.8856896785805,0
1163
+ 2913.1843324188503,0
1164
+ 3031.86318373661,0
1165
+ 3371.9929504441698,0
1166
+ 3568.129720637829,0
1167
+ 3688.22308519693,0
1168
+ 3744.60633450769,0
1169
+ 3768.1352337436206,0
1170
+ 3669.56706472804,0
1171
+ 3374.5418913169,0
1172
+ 3275.91938201554,0
1173
+ 2971.5410948025,0
1174
+ 2850.52274312193,0
1175
+ 2866.9112638846195,0
1176
+ 3001.81359265831,0
1177
+ 3122.5823365804804,0
1178
+ 3592.51573464383,0
1179
+ 3821.68516783473,0
1180
+ 4076.3848201984297,0
1181
+ 4203.826390053529,0
1182
+ 4363.568339123271,0
1183
+ 4071.89490471123,0
1184
+ 3729.81574887196,0
1185
+ 3643.2907759367104,0
1186
+ 3524.1938784203003,0
1187
+ 3247.79193496552,0
1188
+ 3462.4188466872,0
1189
+ 3483.68835626183,0
1190
+ 3663.20185517188,0
1191
+ 3964.08161930937,0
1192
+ 3952.3822935554704,0
1193
+ 4031.63658359665,0
1194
+ 3932.199087119021,0
1195
+ 3736.65361932556,0
1196
+ 3401.2168351330297,0
1197
+ 3071.45138817424,0
1198
+ 3039.6910764604304,0
1199
+ 3077.7668235166902,0
1200
+ 3121.2772501783,0
1201
+ 3400.32988125846,0
1202
+ 3628.95512113999,0
1203
+ 4112.09645106685,0
1204
+ 4250.83652330927,0
1205
+ 4493.62358066056,0
1206
+ 4462.90010208275,0
1207
+ 4287.23790846661,0
1208
+ 4064.39193046915,0
1209
+ 3693.6281772460497,0
1210
+ 3564.8854043028496,0
1211
+ 3401.0773505598804,0
1212
+ 3496.6482664405103,0
1213
+ 3622.6199007475,0
1214
+ 3802.2911952231,0
1215
+ 3904.1261845579,0
1216
+ 4206.707287132,0
1217
+ 4111.8670556938505,0
1218
+ 4143.9801785030895,0
1219
+ 3882.2582880868,0
1220
+ 3573.45377961898,0
1221
+ 3352.39803961198,0
1222
+ 3128.34888327029,0
1223
+ 3142.91214607459,0
1224
+ 3325.70437869662,0
1225
+ 3547.8894403738104,0
1226
+ 3821.95478319414,0
1227
+ 4031.7462249202704,0
1228
+ 4417.2326622413,0
1229
+ 4522.951368750871,0
1230
+ 4427.826450472629,0
1231
+ 4290.66671990577,0
1232
+ 4025.75673702356,0
1233
+ 3900.1704029417497,0
1234
+ 3609.79229214432,0
1235
+ 3465.86614825237,0
1236
+ 3477.29309516777,0
1237
+ 3606.29948280492,0
1238
+ 3833.26193277438,0
1239
+ 4010.81722275524,0
1240
+ 4120.28685773625,0
1241
+ 4124.69482587067,0
1242
+ 4073.92824337358,0
1243
+ 3920.351654609529,0
1244
+ 3623.56039169044,0
1245
+ 3468.73077251214,0
1246
+ 3159.38885345373,0
1247
+ 3129.502354712,0
1248
+ 3214.9553394417403,0
1249
+ 3452.65810759202,0
1250
+ 3845.2316231683294,0
1251
+ 4233.00147268614,0
1252
+ 4386.57715350929,0
1253
+ 4465.59332259255,0
1254
+ 4581.7812262507705,0
1255
+ 4296.48922416267,0
1256
+ 4082.00319163889,0
1257
+ 3835.4255851359294,0
1258
+ 3583.7208310720703,0
1259
+ 3478.18669093981,0
1260
+ 3423.00418897228,0
1261
+ 3541.45074536581,0
1262
+ 3794.406386108471,0
1263
+ 3956.84674849124,0
1264
+ 4067.6301740110207,0
1265
+ 4072.20519388026,0
1266
+ 3951.3549620344,0
1267
+ 3860.75546617861,0
1268
+ 3540.56226066219,0
1269
+ 3272.42459182868,0
1270
+ 3092.3846940573803,0
1271
+ 3023.4990359879102,0
1272
+ 3263.5168882165003,0
1273
+ 3463.43849788534,0
1274
+ 3662.825795162561,0
1275
+ 4006.0763688013694,0
1276
+ 4264.16360718556,0
1277
+ 4421.62965164386,0
1278
+ 4394.556441588161,0
1279
+ 4111.365142475071,0
1280
+ 4018.51728087744,0
1281
+ 3743.49120576958,0
1282
+ 3621.9078215723903,0
1283
+ 3377.02930958935,0
1284
+ 3394.26171207194,0
1285
+ 3531.6994371703704,0
1286
+ 3674.01193036069,0
1287
+ 3868.30042805286,0
1288
+ 4067.94244912072,0
1289
+ 4059.25770012266,0
1290
+ 3964.472670085229,0
1291
+ 3670.60304408442,0
1292
+ 3481.7278219792,0
1293
+ 3262.54140057644,0
1294
+ 3146.5378048596303,0
1295
+ 3035.02343085476,0
1296
+ 3165.9996501612604,0
1297
+ 3372.89403347299,0
1298
+ 3693.4199563314296,0
1299
+ 4190.42664934345,0
1300
+ 4176.98829517656,0
1301
+ 4479.3556347217,0
1302
+ 4351.006117067121,0
1303
+ 4246.23303297848,0
1304
+ 4096.63065134175,0
1305
+ 3648.5211232065,0
1306
+ 3362.9542104092,0
1307
+ 3416.03762340242,0
1308
+ 3475.56838836871,0
1309
+ 3529.9782088790503,0
1310
+ 3674.44551809146,0
1311
+ 4010.0915394696494,0
1312
+ 4097.135139748471,0
1313
+ 4101.20654323306,0
1314
+ 4023.87405501255,0
1315
+ 3835.279203745272,0
1316
+ 3453.6344516974104,0
1317
+ 3205.68055886102,0
1318
+ 3166.2046336173303,0
1319
+ 3054.14420556927,0
1320
+ 3301.17034584174,0
1321
+ 3543.40461720526,0
1322
+ 3859.1984637710298,0
1323
+ 4158.451852728061,0
1324
+ 4524.96805862877,0
1325
+ 4531.86501685984,0
1326
+ 4537.37691112722,0
1327
+ 4407.87537718566,0
1328
+ 4136.826681971161,0
1329
+ 3854.5717022838,0
1330
+ 3675.8970926785496,0
1331
+ 3583.7645874334703,0
1332
+ 3614.12241470316,0
1333
+ 3690.9296251487103,0
1334
+ 3923.84150000183,0
1335
+ 4093.46786278462,0
1336
+ 4270.142798967429,0
1337
+ 4237.49292795229,0
1338
+ 4268.33622055348,0
1339
+ 3953.10460881,0
1340
+ 3784.0884122771295,0
1341
+ 3443.6520820097,0
1342
+ 3331.73462369073,0
1343
+ 3252.57353676524,0
1344
+ 3420.5044260790505,0
1345
+ 3669.21168248414,0
1346
+ 3929.19977740096,0
1347
+ 4358.5270498684495,0
1348
+ 4539.13732334922,0
1349
+ 4759.359608926189,0
1350
+ 4726.502295844361,0
1351
+ 4655.39867224098,0
1352
+ 4344.687732447511,0
1353
+ 4013.23918949599,0
1354
+ 3883.3715208504,0
1355
+ 3750.37779865086,0
1356
+ 3785.16028264688,0
1357
+ 3893.5839206354,0
1358
+ 4223.8523292881,0
1359
+ 4430.16572069024,0
1360
+ 4419.89593040677,0
1361
+ 4588.75747499082,0
1362
+ 4403.06931888045,0
1363
+ 4291.09745662305,0
1364
+ 3912.030514774,0
1365
+ 3713.89127002348,0
1366
+ 3544.2669170819704,0
1367
+ 3623.92590236306,0
1368
+ 3701.54395327542,0
1369
+ 3938.03377822148,0
1370
+ 4293.71998325938,0
1371
+ 4477.19353373539,0
1372
+ 4802.27424774998,0
1373
+ 4912.98662400575,0
1374
+ 5059.14537552968,0
1375
+ 4806.4894600761,0
1376
+ 4502.79958997646,0
1377
+ 4195.36215167098,0
1378
+ 3996.85664839067,0
1379
+ 4002.30605754088,0
1380
+ 3941.35527300524,0
1381
+ 4005.08611916788,0
1382
+ 4306.43471438018,0
1383
+ 4654.13054504082,0
1384
+ 4707.7051591963,0
1385
+ 4635.25845525207,0
1386
+ 4671.33892380009,0
1387
+ 4330.90009722371,0
1388
+ 4119.27447836257,0
1389
+ 3900.298066764529,0
1390
+ 3660.2473933607503,0
1391
+ 3594.42295270181,0
1392
+ 3750.2344170195097,0
1393
+ 4055.66423267286,0
1394
+ 4508.89914610522,0
1395
+ 4797.72894550036,0
1396
+ 4900.072217810971,0
1397
+ 5086.09891663095,0
1398
+ 5009.68088176119,0
1399
+ 4931.266946873599,0
1400
+ 4650.4960513508295,0
1401
+ 4313.78799639223,0
1402
+ 4178.97233678863,0
1403
+ 4166.994734920449,0
1404
+ 4153.52131233331,0
1405
+ 4192.68101511312,0
1406
+ 4206.61787184131,0
1407
+ 4263.42662881131,0
1408
+ 4262.55310851796,0
1409
+ 4279.315665957821,0
1410
+ 4240.77924893753,0
1411
+ 4209.991801620279,0
1412
+ 4167.55628153549,0
1413
+ 4114.07996893123,0
1414
+ 4095.65449533248,0
1415
+ 4079.38962444851,0
1416
+ 4100.77490606097,0
1417
+ 4146.620996307311,0
1418
+ 4192.96055388352,0
1419
+ 4246.784558748111,0
1420
+ 4284.331042843929,0
1421
+ 4303.9539626018295,0
1422
+ 4292.291679953351,0
1423
+ 4273.66116502714,0
1424
+ 4232.41666108536,0
1425
+ 4193.574563482371,0
1426
+ 4139.90067900659,0
1427
+ 4118.75735437305,0
1428
+ 4139.5510502240295,0
1429
+ 4139.00826912887,0
1430
+ 4150.60062262894,0
1431
+ 4201.41634575429,0
1432
+ 4217.60277075639,0
1433
+ 4214.40159566972,0
1434
+ 4206.38871162258,0
1435
+ 4187.202201070089,0
1436
+ 4121.98144661376,0
1437
+ 4068.05257905736,0
1438
+ 4037.1592863385104,0
1439
+ 4033.38937892086,0
1440
+ 4045.7027229861897,0
1441
+ 4083.8156694831,0
1442
+ 4133.540363751429,0
1443
+ 4210.251118558321,0
1444
+ 4254.02943013232,0
1445
+ 4261.84089482997,0
1446
+ 4233.5012074401,0
1447
+ 4217.538758262921,0
1448
+ 4183.68719323642,0
1449
+ 4138.60628938907,0
1450
+ 4086.46744625312,0
1451
+ 4048.31945967391,0
1452
+ 4066.7513657273694,0
1453
+ 4097.020712655311,0
1454
+ 4119.62126930919,0
1455
+ 4143.869567829821,0
1456
+ 4177.6260789595,0
1457
+ 4177.03085454883,0
1458
+ 4154.94977521325,0
1459
+ 4121.10800034426,0
1460
+ 4339.89979371925,1
1461
+ 4049.77844339537,0
1462
+ 4009.71049154331,0
1463
+ 3990.6701019543298,0
1464
+ 4025.2779997873,0
1465
+ 4038.77112892274,0
1466
+ 4088.73942634192,0
1467
+ 4165.172142385,0
1468
+ 4182.433261407079,0
1469
+ 4205.63110986845,0
1470
+ 4204.8102767215705,0
1471
+ 4168.2657475283895,0
1472
+ 4135.63533114975,0
1473
+ 4081.734842264671,0
1474
+ 4051.627471650229,0
1475
+ 4039.0572537062,0
1476
+ 4023.69606939606,0
1477
+ 4046.267552780712,0
1478
+ 4074.29053017971,0
1479
+ 4119.37470996249,0
1480
+ 4154.677714159,0
1481
+ 4145.14149594843,0
1482
+ 4130.25589822156,0
1483
+ 4076.63743094623,0
1484
+ 4051.6327220342896,0
1485
+ 3997.89186234794,0
1486
+ 3988.44516978076,0
1487
+ 3956.3965368473296,0
1488
+ 4014.16379009344,0
1489
+ 4039.07627056162,0
1490
+ 4089.3953641039097,0
1491
+ 4143.939271614289,0
1492
+ 4177.21930809269,0
1493
+ 4208.763844486271,0
1494
+ 4182.79807558726,0
1495
+ 4162.78627506892,0
1496
+ 4113.86863956122,0
1497
+ 4062.09724907781,0
1498
+ 4033.0985860955,0
1499
+ 4034.54860368883,0
1500
+ 4033.9037717155297,0
1501
+ 4047.62799506608,0
1502
+ 4058.18691865984,0
1503
+ 4112.47781149124,0
1504
+ 4166.30100804355,0
1505
+ 4134.6846407065605,0
1506
+ 4126.57327664435,0
1507
+ 4092.20285305445,0
1508
+ 4036.01778387154,0
1509
+ 4000.54708272706,0
1510
+ 3995.42627874978,0
1511
+ 3960.18944977748,0
1512
+ 3717.5477775969,1
1513
+ 4025.50021577584,0
1514
+ 4087.1347713139294,0
1515
+ 4140.874635214579,0
1516
+ 4183.08629439365,0
1517
+ 4215.08248067224,0
1518
+ 4185.45385015959,0
1519
+ 4172.4948793191,0
1520
+ 4137.9421659461495,0
1521
+ 4088.17251106937,0
1522
+ 4051.38958292761,0
1523
+ 4029.4903603493394,0
1524
+ 4015.87964359933,0
1525
+ 4043.79668470044,0
1526
+ 4082.5949618854297,0
1527
+ 4116.41608770068,0
1528
+ 4138.17886915955,0
1529
+ 4143.45142505095,0
1530
+ 4126.00134721418,0
1531
+ 4091.23857665743,0
1532
+ 4053.96449111109,0
1533
+ 4022.3012455964,0
1534
+ 3975.378144092672,0
1535
+ 3974.60307997971,0
1536
+ 3992.44164887085,0
1537
+ 4037.43632170158,0
1538
+ 4097.82024787131,0
1539
+ 4141.56354937472,0
1540
+ 4166.85717537158,0
1541
+ 4221.32301775061,0
1542
+ 4178.84250113265,0
1543
+ 4178.89308736198,0
1544
+ 4125.31210853758,0
1545
+ 4102.09821383872,0
1546
+ 4043.63233333588,0
1547
+ 4026.32762751445,0
1548
+ 4032.92881357554,0
1549
+ 4035.1110943213794,0
1550
+ 4092.79563287543,0
1551
+ 4134.483141982871,0
1552
+ 4141.1090479298,0
1553
+ 4146.04197982125,0
1554
+ 4108.159296233371,0
1555
+ 4089.9485065474896,0
1556
+ 4050.51831812777,0
1557
+ 4001.79241645312,0
1558
+ 3967.59465792351,0
1559
+ 3966.638717682221,0
1560
+ 3989.741394576789,0
1561
+ 4030.40642461,0
1562
+ 4064.2849467639294,0
1563
+ 4100.70922577233,0
1564
+ 4158.85258944431,0
1565
+ 4175.30319786753,0
1566
+ 4160.36156902668,0
1567
+ 4151.72939520729,0
1568
+ 4088.373526635829,0
1569
+ 4054.26658757242,0
1570
+ 4005.47221896164,0
1571
+ 3988.202374028661,0
1572
+ 4020.73470546889,0
1573
+ 4014.45922180315,0
1574
+ 4049.5230491837297,0
1575
+ 4068.661315396,0
1576
+ 4107.343394136429,0
1577
+ 4116.36917128904,0
1578
+ 4084.14639230894,0
1579
+ 4051.75002374246,0
1580
+ 3990.75817202096,0
1581
+ 3967.24269935988,0
1582
+ 3916.12553509696,0
1583
+ 3919.24958468169,0
1584
+ 3938.64959637574,0
1585
+ 4002.64166569932,0
1586
+ 4015.92260390327,0
1587
+ 4078.18473917878,0
1588
+ 4132.0502284873,0
1589
+ 4140.71804900221,0
1590
+ 4130.71387624081,0
1591
+ 4078.20087068222,0
1592
+ 4061.4439412174,0
1593
+ 3999.2451402958295,0
1594
+ 4001.84688882804,0
1595
+ 3938.2615068030896,0
1596
+ 3955.13128149425,0
1597
+ 3963.0506857119103,0
1598
+ 4000.11803081048,0
1599
+ 4035.33459203994,0
1600
+ 4050.47341431604,0
1601
+ 4053.67513280874,0
1602
+ 4039.91699383178,0
1603
+ 4005.79798565029,0
1604
+ 3952.82016132812,0
1605
+ 3910.83927308043,0
1606
+ 3873.3202897416704,0
1607
+ 3864.00416150508,0
1608
+ 3889.5669629855,0
1609
+ 3933.20514284896,0
1610
+ 3958.23762016046,0
1611
+ 4041.44925853739,0
1612
+ 4040.8436500933694,0
1613
+ 4099.13728525931,0
1614
+ 4084.9050724065705,0
1615
+ 4047.9850314991,0
1616
+ 4001.95761049616,0
1617
+ 3962.68762740545,0
1618
+ 3929.73920829663,0
1619
+ 3887.58018787793,0
1620
+ 3907.0586457847,0
1621
+ 3918.90205194039,0
1622
+ 3963.51213822079,0
1623
+ 3976.99235550065,0
1624
+ 4011.3401653645296,0
1625
+ 3972.77985848099,0
1626
+ 3978.8421340660298,0
1627
+ 3955.078417236261,0
1628
+ 3901.00340599418,0
1629
+ 3868.28408705148,0
1630
+ 3848.2331459388,0
1631
+ 3808.37258012565,0
1632
+ 3842.99715198544,0
1633
+ 3867.84118157642,0
1634
+ 3935.01978724277,0
1635
+ 4016.53222090262,0
1636
+ 4024.81647271886,0
1637
+ 4036.4575946082,0
1638
+ 4033.56177438005,0
1639
+ 4026.7611086594607,0
1640
+ 3964.2818155505297,0
1641
+ 3916.60726208604,0
1642
+ 3893.07182672823,0
1643
+ 3870.6813257447902,0
1644
+ 3864.65399065058,0
1645
+ 3897.88082641008,0
1646
+ 3926.62836022481,0
1647
+ 3958.48866224271,0
1648
+ 3975.5580050814,0
1649
+ 3993.833975889721,0
1650
+ 3958.51846171138,0
1651
+ 3908.58594179226,0
1652
+ 3874.13087797789,0
1653
+ 3825.26725921209,0
1654
+ 3839.7271959791706,0
1655
+ 3805.05098890962,0
1656
+ 3826.81270509022,0
1657
+ 3868.75445423235,0
1658
+ 3924.79577334415,0
1659
+ 3975.63891847029,0
1660
+ 4014.32237856074,0
1661
+ 4023.3269690522498,0
1662
+ 4035.2894817092297,0
1663
+ 4004.5274753714098,0
1664
+ 3964.6920072707694,0
1665
+ 3922.01557225076,0
1666
+ 3874.16647319485,0
1667
+ 3862.14314064895,0
1668
+ 3855.0530672998,0
1669
+ 3911.34282262651,0
1670
+ 3923.07607703433,0
1671
+ 3951.85674659224,0
1672
+ 3990.26663401,0
1673
+ 3980.90471724075,0
1674
+ 3972.33224586779,0
1675
+ 3920.64710449849,0
1676
+ 3873.12198092221,0
1677
+ 3849.2913803611896,0
1678
+ 3816.69470896775,0
1679
+ 3796.14229437698,0
1680
+ 3836.69536329258,0
1681
+ 3873.07314610688,0