Ver Fonte

first commit

lc há 1 mês atrás
commit
a03772c842
14 ficheiros alterados com 3654 adições e 0 exclusões
  1. 3 0
      .gitignore
  2. 26 0
      anomaly_detect.py
  3. 200 0
      anomaly_detect2.py
  4. 236 0
      complex_anomaly.py
  5. 101 0
      crypto_history.csv
  6. 1001 0
      doge_price_history.csv
  7. 530 0
      duplicati_logs.dat
  8. 0 0
      extract_duplogs.py
  9. 722 0
      solana_price_history.csv
  10. 231 0
      strange_crypto2.py
  11. 114 0
      strange_cryptos.py
  12. 112 0
      strange_doge.py
  13. 179 0
      strange_doge_rf.py
  14. 199 0
      strange_doge_rf2.py

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+db/
+venv/
+.vscode/

+ 26 - 0
anomaly_detect.py

@@ -0,0 +1,26 @@
+import numpy as np # type: ignore
+import pandas as pd
+from sklearn.ensemble import IsolationForest
+
+def generate_sample_data(n_normal=100, n_anomaly=10, random_state=42):
+    np.random.seed(random_state)
+    # Generate normal data (e.g., backup size, duration, file count)
+    normal_data = np.random.normal(loc=[1000, 60, 500], scale=[100, 10, 50], size=(n_normal, 3))
+    # Generate anomalous data (e.g., much larger/smaller values)
+    anomaly_data = np.random.normal(loc=[2000, 200, 50], scale=[50, 20, 10], size=(n_anomaly, 3))
+    # Combine and create DataFrame
+    data = np.vstack([normal_data, anomaly_data])
+    df = pd.DataFrame(data, columns=["backup_size_mb", "duration_sec", "file_count"])
+    df["label"] = [0]*n_normal + [1]*n_anomaly  # 0: normal, 1: anomaly
+    return df
+
+def try_isolation_forest(df):
+    clf = IsolationForest(random_state=42)
+    features = df[["backup_size_mb", "duration_sec", "file_count"]]
+    preds = clf.fit_predict(features)
+    df["predicted_anomaly"] = (preds == -1).astype(int)
+    print(df[["backup_size_mb", "duration_sec", "file_count", "label", "predicted_anomaly"]])
+
+if __name__ == "__main__":
+    df = generate_sample_data()
+    try_isolation_forest(df)

+ 200 - 0
anomaly_detect2.py

@@ -0,0 +1,200 @@
+import numpy as np
+import pandas as pd
+import random
+from datetime import datetime, timedelta
+from sklearn.ensemble import IsolationForest
+
+def random_time():
+    start = datetime(2020, 1, 1)
+    end = datetime.now()
+    delta = end - start
+    random_seconds = random.randint(0, int(delta.total_seconds()))
+    return (start + timedelta(seconds=random_seconds)).isoformat()
+
+def generate_good_log():
+    log = {
+        "DeletedFiles": random.randint(0, 5),
+        "DeletedFolders": random.randint(0, 2),
+        "ModifiedFiles": random.randint(0, 50),
+        "ExaminedFiles": random.randint(500, 1000),
+        "OpenedFiles": random.randint(0, 50),
+        "AddedFiles": random.randint(0, 10),
+        "SizeOfModifiedFiles": random.randint(1000000, 2000000000),
+        "SizeOfAddedFiles": random.randint(0, 10000000),
+        "SizeOfExaminedFiles": random.randint(1000000000, 8000000000),
+        "SizeOfOpenedFiles": random.randint(0, 2000000000),
+        "NotProcessedFiles": 0,
+        "AddedFolders": random.randint(0, 2),
+        "TooLargeFiles": 0,
+        "FilesWithError": 0,
+        "ModifiedFolders": random.randint(0, 2),
+        "ModifiedSymlinks": 0,
+        "AddedSymlinks": 0,
+        "DeletedSymlinks": 0,
+        "PartialBackup": False,
+        "Dryrun": False,
+        "MainOperation": "Backup",
+        "ParsedResult": "Success",
+        "Interrupted": False,
+        "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+        "EndTime": random_time(),
+        "BeginTime": random_time(),
+        "Duration": "00:00:{:02d}.{:07d}".format(random.randint(10, 59), random.randint(0, 9999999)),
+        "MessagesActualLength": random.randint(10, 30),
+        "WarningsActualLength": random.randint(0, 1),
+        "ErrorsActualLength": 0,
+        "Messages": [],
+        "Warnings": [],
+        "Errors": [],
+        "BackendStatistics": {
+            "RemoteCalls": random.randint(5, 15),
+            "BytesUploaded": random.randint(1000000, 100000000),
+            "BytesDownloaded": random.randint(1000000, 100000000),
+            "FilesUploaded": random.randint(1, 10),
+            "FilesDownloaded": random.randint(1, 10),
+            "FilesDeleted": random.randint(0, 5),
+            "FoldersCreated": random.randint(0, 2),
+            "RetryAttempts": 0,
+            "UnknownFileSize": 0,
+            "UnknownFileCount": 0,
+            "KnownFileCount": random.randint(100, 1000),
+            "KnownFileSize": random.randint(1000000000, 8000000000),
+            "LastBackupDate": random_time(),
+            "BackupListCount": random.randint(5, 20),
+            "TotalQuotaSpace": 1932937191424,
+            "FreeQuotaSpace": random.randint(400000000000, 800000000000),
+            "AssignedQuotaSpace": -1,
+            "ReportedQuotaError": False,
+            "ReportedQuotaWarning": False,
+            "MainOperation": "Backup",
+            "ParsedResult": "Success",
+            "Interrupted": False,
+            "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+            "EndTime": "0001-01-01T00:00:00",
+            "BeginTime": random_time(),
+            "Duration": "00:00:00",
+            "MessagesActualLength": 0,
+            "WarningsActualLength": 0,
+            "ErrorsActualLength": 0,
+            "Messages": None,
+            "Warnings": None,
+            "Errors": None
+        }
+    }
+    return log
+
+def generate_bad_log():
+    errors = ["Error: Disk full", "Error: Permission denied", "Error: Network timeout"]
+    warnings = ["Warning: Slow upload", "Warning: File skipped", "Warning: Retry exceeded"]
+    log = {
+        "DeletedFiles": random.randint(100, 10000),  # excessive deletions
+        "DeletedFolders": random.randint(10, 100),
+        "ModifiedFiles": random.randint(0, 10),
+        "ExaminedFiles": random.randint(500, 1000),
+        "OpenedFiles": random.randint(0, 10),
+        "AddedFiles": random.randint(0, 2),
+        "SizeOfModifiedFiles": random.randint(1000000, 200000000),
+        "SizeOfAddedFiles": random.randint(0, 1000000),
+        "SizeOfExaminedFiles": random.randint(1000000000, 8000000000),
+        "SizeOfOpenedFiles": random.randint(0, 200000000),
+        "NotProcessedFiles": random.randint(1, 10),
+        "AddedFolders": random.randint(0, 2),
+        "TooLargeFiles": random.randint(0, 2),
+        "FilesWithError": random.randint(1, 5),
+        "ModifiedFolders": random.randint(0, 2),
+        "ModifiedSymlinks": 0,
+        "AddedSymlinks": 0,
+        "DeletedSymlinks": 0,
+        "PartialBackup": True,
+        "Dryrun": False,
+        "MainOperation": "Backup",
+        "ParsedResult": "Error",
+        "Interrupted": True,
+        "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+        "EndTime": random_time(),
+        "BeginTime": random_time(),
+        "Duration": "00:00:{:02d}.{:07d}".format(random.randint(10, 59), random.randint(0, 9999999)),
+        "MessagesActualLength": random.randint(30, 100),
+        "WarningsActualLength": random.randint(5, 20),
+        "ErrorsActualLength": random.randint(1, 5),
+        "Messages": [random.choice(warnings) for _ in range(random.randint(5, 20))],
+        "Warnings": [random.choice(warnings) for _ in range(random.randint(5, 20))],
+        "Errors": [random.choice(errors) for _ in range(random.randint(1, 5))],
+        "BackendStatistics": {
+            "RemoteCalls": random.randint(5, 15),
+            "BytesUploaded": random.randint(100000, 1000000),
+            "BytesDownloaded": random.randint(100000, 1000000),
+            "FilesUploaded": random.randint(0, 2),
+            "FilesDownloaded": random.randint(0, 2),
+            "FilesDeleted": random.randint(100, 10000),
+            "FoldersCreated": random.randint(0, 2),
+            "RetryAttempts": random.randint(1, 10),
+            "UnknownFileSize": random.randint(0, 1),
+            "UnknownFileCount": random.randint(0, 1),
+            "KnownFileCount": random.randint(100, 1000),
+            "KnownFileSize": random.randint(1000000000, 8000000000),
+            "LastBackupDate": random_time(),
+            "BackupListCount": random.randint(5, 20),
+            "TotalQuotaSpace": 1932937191424,
+            "FreeQuotaSpace": random.randint(400000000000, 800000000000),
+            "AssignedQuotaSpace": -1,
+            "ReportedQuotaError": random.choice([True, False]),
+            "ReportedQuotaWarning": random.choice([True, False]),
+            "MainOperation": "Backup",
+            "ParsedResult": "Error",
+            "Interrupted": True,
+            "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+            "EndTime": "0001-01-01T00:00:00",
+            "BeginTime": random_time(),
+            "Duration": "00:00:00",
+            "MessagesActualLength": random.randint(5, 20),
+            "WarningsActualLength": random.randint(5, 20),
+            "ErrorsActualLength": random.randint(1, 5),
+            "Messages": None,
+            "Warnings": None,
+            "Errors": None
+        }
+    }
+    return log
+
+def flatten_features(log):
+    """Extracts relevant features from top-level and BackendStatistics."""
+    stats = log.get("BackendStatistics", {})
+    return {
+        "KnownFileCount": stats.get("KnownFileCount", 0),
+        "KnownFileSize": stats.get("KnownFileSize", 0),
+        "FilesUploaded": stats.get("FilesUploaded", 0),
+        "FilesDownloaded": stats.get("FilesDownloaded", 0),
+        "FilesDeleted": stats.get("FilesDeleted", 0),
+        "BytesUploaded": stats.get("BytesUploaded", 0),
+        "BytesDownloaded": stats.get("BytesDownloaded", 0),
+        "Duration_sec": random.uniform(30, 600),  # You can parse Duration if needed
+        "ErrorsActualLength": log.get("ErrorsActualLength", 0),
+        "WarningsActualLength": log.get("WarningsActualLength", 0),
+        "label": 1 if log.get("ParsedResult") == "Error" or log.get("Interrupted") else 0
+    }
+
+def generate_sample_data(n_good=100, n_bad=10, random_state=42):
+    np.random.seed(random_state)
+    random.seed(random_state)
+    good_logs = [generate_good_log() for _ in range(n_good)]
+    bad_logs = [generate_bad_log() for _ in range(n_bad)]
+    all_logs = good_logs + bad_logs
+    features = [flatten_features(log) for log in all_logs]
+    df = pd.DataFrame(features)
+    return df
+
+def try_isolation_forest(df):
+    features = [
+        "KnownFileCount", "KnownFileSize", "FilesUploaded", "FilesDownloaded",
+        "FilesDeleted", "BytesUploaded", "BytesDownloaded",
+        "Duration_sec", "ErrorsActualLength", "WarningsActualLength"
+    ]
+    clf = IsolationForest(random_state=42)
+    preds = clf.fit_predict(df[features])
+    df["predicted_anomaly"] = (preds == -1).astype(int)
+    print(df[features + ["label", "predicted_anomaly"]])
+
+if __name__ == "__main__":
+    df = generate_sample_data()
+    try_isolation_forest(df)

+ 236 - 0
complex_anomaly.py

@@ -0,0 +1,236 @@
+import requests
+from datetime import datetime, timedelta
+import time
+import numpy as np
+import pandas as pd
+import yfinance as yf
+from datetime import datetime, timedelta
+from sklearn.ensemble import IsolationForest
+from sklearn.covariance import EllipticEnvelope
+from sklearn.preprocessing import RobustScaler
+from statsmodels.tsa.api import VAR
+from pyod.models.lof import LOF
+import matplotlib.pyplot as plt
+import seaborn as sns
+import warnings
+warnings.filterwarnings('ignore')
+
+class CryptoAnomalyDetector:
+    def __init__(self, tickers=['bitcoin', 'ethereum', 'solana']):
+        # CoinGecko uses lowercase names or IDs instead of tickers
+        self.tickers = tickers
+        self.coin_ids = tickers  # For simplicity, using names as IDs
+        self.models = {}
+        self.scalers = {}
+        self.thresholds = {}
+        self.correlation_matrices = []
+        self.last_training_date = None
+        
+    def fetch_data(self, days=30):
+        """Fetch historical data using CoinGecko API"""
+        base_url = "https://api.coingecko.com/api/v3"
+        end_date = datetime.now()
+        start_date = end_date - timedelta(days=days)
+        
+        # Convert to UNIX timestamps
+        end_timestamp = int(end_date.timestamp())
+        start_timestamp = int(start_date.timestamp())
+        
+        data = {}
+        
+        for coin_id in self.coin_ids:
+            url = f"{base_url}/coins/{coin_id}/market_chart/range"
+            params = {
+                'vs_currency': 'usd',
+                # 'from': start_timestamp,
+                # 'to': end_timestamp
+                'days': 30
+            }
+            
+            # Add delay to avoid rate limiting
+            time.sleep(1)
+            
+            try:
+                response = requests.get(url, params=params)
+                response.raise_for_status()
+                coin_data = response.json()
+                
+                # Extract prices and create DataFrame
+                prices = pd.DataFrame(coin_data['prices'], columns=['timestamp', 'price'])
+                prices['date'] = pd.to_datetime(prices['timestamp'], unit='ms')
+                prices.set_index('date', inplace=True)
+                data[coin_id] = prices['price']
+                
+            except requests.exceptions.RequestException as e:
+                print(f"Error fetching data for {coin_id}: {e}")
+                data[coin_id] = pd.Series()  # Empty series if error occurs
+        
+        # Combine all series into a DataFrame
+        combined_data = pd.DataFrame(data)
+        
+        # Resample to daily data if needed (CoinGecko might return more granular data)
+        combined_data = combined_data.resample('D').last().ffill()
+        
+        return combined_data.dropna()
+    
+    # ... [rest of the class remains the same] ...
+    
+    def prepare_features(self, data):
+        """Create features for anomaly detection"""
+        # Calculate log returns
+        returns = np.log(data).diff().dropna()
+        
+        # Calculate rolling volatilities (3-day and 7-day)
+        features = pd.DataFrame()
+        for ticker in self.tickers:
+            features[f'{ticker}_return'] = returns[ticker]
+            features[f'{ticker}_vol_3d'] = returns[ticker].rolling(3).std()
+            features[f'{ticker}_vol_7d'] = returns[ticker].rolling(7).std()
+        
+        # Add correlation features
+        rolling_corr = returns.rolling(5).corr().dropna()
+        self.correlation_matrices = rolling_corr.groupby(level=0).apply(lambda x: x)
+        
+        # Add market-wide volatility (average of all volatilities)
+        features['market_vol'] = features.filter(regex='vol_3d').mean(axis=1)
+        
+        return features.dropna()
+    
+    def train_models(self, training_data):
+        """Train multiple anomaly detection models"""
+        # Robust scaling (better for crypto data)
+        scaler = RobustScaler()
+        scaled_data = scaler.fit_transform(training_data)
+        self.scalers['main'] = scaler
+        
+        # 1. Isolation Forest (for point anomalies)
+        iso_forest = IsolationForest(
+            n_estimators=100,
+            contamination=0.01,
+            random_state=42
+        )
+        iso_forest.fit(scaled_data)
+        self.models['isolation_forest'] = iso_forest
+        
+        # 2. Mahalanobis Distance (Elliptic Envelope)
+        elliptic = EllipticEnvelope(
+            contamination=0.01,
+            random_state=42
+        )
+        elliptic.fit(scaled_data)
+        self.models['elliptic_envelope'] = elliptic
+        
+        # 3. Local Outlier Factor (for density-based anomalies)
+        lof = LOF(
+            n_neighbors=20,
+            contamination=0.01
+        )
+        lof.fit(scaled_data)
+        self.models['lof'] = lof
+        
+        # 4. Vector Autoregression (for multivariate time series)
+        var = VAR(training_data)
+        var_model = var.fit(maxlags=3)
+        self.models['var'] = var_model
+        
+        # Store training date
+        self.last_training_date = datetime.now()
+        
+    def detect_anomalies(self, current_data):
+        """Detect anomalies in new data points"""
+        # Prepare features for current data
+        current_features = self.prepare_features(current_data)
+        scaled_data = self.scalers['main'].transform(current_features)
+        
+        # Get predictions from all models
+        results = pd.DataFrame(index=current_features.index)
+        
+        # Isolation Forest
+        results['iso_forest'] = self.models['isolation_forest'].predict(scaled_data)
+        
+        # Elliptic Envelope
+        results['elliptic_env'] = self.models['elliptic_envelope'].predict(scaled_data)
+        
+        # LOF
+        lof_scores = self.models['lof'].decision_function(scaled_data)
+        results['lof_score'] = lof_scores
+        results['lof_anomaly'] = (lof_scores < np.percentile(lof_scores, 1)).astype(int)
+        
+        # VAR model residuals
+        var_pred = self.models['var'].forecast(current_features.values, 1)
+        residuals = current_features.iloc[-1] - var_pred[0]
+        mahalanobis_dist = np.sqrt(np.dot(np.dot(residuals, np.linalg.inv(self.models['var'].sigma_u)), residuals))
+        results['var_mahalanobis'] = mahalanobis_dist
+        results['var_anomaly'] = (mahalanobis_dist > np.percentile(results['var_mahalanobis'], 99)).astype(int)
+        
+        # Combined anomaly score
+        results['combined_score'] = (
+            (results['iso_forest'] == -1).astype(int) +
+            (results['elliptic_env'] == -1).astype(int) +
+            results['lof_anomaly'] +
+            results['var_anomaly']
+        )
+        
+        results['final_anomaly'] = (results['combined_score'] >= 2).astype(int)
+        
+        return results
+    
+    def visualize_results(self, prices, anomalies):
+        """Visualize prices with anomalies marked"""
+        plt.figure(figsize=(15, 10))
+        
+        # Plot prices
+        for i, ticker in enumerate(self.tickers, 1):
+            plt.subplot(len(self.tickers), 1, i)
+            plt.plot(prices[ticker], label=ticker)
+            
+            # Mark anomalies
+            
+            anomaly_points = prices.loc[anomalies[anomalies['final_anomaly'] == 1].index]
+            for point in anomaly_points:
+                plt.axvline(x=point, color='r', alpha=0.3)
+            
+            plt.title(f'{ticker} Price with Anomalies Marked')
+            plt.legend()
+        
+        plt.tight_layout()
+        plt.show()
+        
+        # Plot correlation changes if available
+        if len(self.correlation_matrices) > 0:
+            last_corr = self.correlation_matrices.iloc[-1]
+            plt.figure(figsize=(10, 8))
+            sns.heatmap(last_corr, annot=True, cmap='coolwarm', center=0)
+            plt.title('Latest Rolling Correlation Matrix')
+            plt.show()
+    
+    def run_pipeline(self):
+        """Complete training and detection pipeline"""
+        print("Fetching training data...")
+        training_data = self.fetch_data(days=30)
+        training_features = self.prepare_features(training_data)
+        
+        print("Training models...")
+        self.train_models(training_features)
+        
+        print("Fetching latest data for detection...")
+        # Get data since last training point (plus some overlap)
+        current_data = self.fetch_data(days=3)
+        current_features = self.prepare_features(current_data)
+        
+        print("Detecting anomalies...")
+        anomalies = self.detect_anomalies(current_data)
+        
+        print("\nAnomaly Detection Results:")
+        print(anomalies[anomalies['final_anomaly'] == 1])
+        
+        self.visualize_results(current_data, anomalies)
+        
+        return anomalies
+
+if __name__ == "__main__":
+    # Initialize with major cryptocurrencies
+    detector = CryptoAnomalyDetector(tickers=['solana', 'dogecoin', 'ethereum', 'ripple', 'tron'])
+    
+    # Run complete pipeline
+    results = detector.run_pipeline()

+ 101 - 0
crypto_history.csv

@@ -0,0 +1,101 @@
+timestamp,solana_price,solana_zscore,dogecoin_price,dogecoin_zscore,ethereum_price,ethereum_zscore,ripple_price,ripple_zscore,tron_price,tron_zscore
+2025-07-14 07:57:16,161.21,0.21908207243226352,0.198196,0.10159514713314755,2973.99,0.7127376244348137,2.84,1.1533599229514373,0.303049,-0.7682792046936574
+2025-07-14 07:58:16,161.21,0.24418950539246545,0.198196,0.12619684937500822,2973.99,0.742533957946383,2.84,1.1533599229514373,0.303049,-0.7519692021728679
+2025-07-14 07:59:16,161.17,0.18526785056411987,0.198633,0.6368029667175993,2975.05,0.9133846236121144,2.84,1.153359922951394,0.302989,-1.1533861539991226
+2025-07-14 08:00:16,161.17,0.21189758248292706,0.198633,0.6720729049497202,2975.05,0.9466716241005834,2.84,1.1533599229514373,0.302989,-1.1313847326052524
+2025-07-14 08:01:17,161.17,0.24034097126058848,0.198627,0.7031358213060119,2974.44,0.8980574424411779,2.84,1.1533599229514373,0.302984,-1.1447536797193927
+2025-07-14 08:02:17,161.17,0.2705107593306227,0.198627,0.7441901303209899,2974.44,0.9346406491967124,2.84,1.1533599229514373,0.302984,-1.12292861046646
+2025-07-14 08:03:17,161.03,-0.03488795459319299,0.198575,0.7243131546264344,2973.09,0.7779241293934178,2.83,0.19513309067650544,0.302958,-1.2830429218474149
+2025-07-14 08:04:17,161.03,-0.008355691958567134,0.198575,0.7727142458409682,2973.09,0.8187567916865958,2.83,0.20629294562168055,0.302958,-1.2578809906584572
+2025-07-14 08:05:18,161.01,-0.03191871517360137,0.19858,0.8333153166976991,2972.77,0.8137482484888368,2.83,0.21763857204726025,0.302934,-1.4002902698973538
+2025-07-14 08:06:18,161.01,-0.0027585908705276114,0.19858,0.894032050132602,2972.77,0.861151743600939,2.83,0.22917966232011155,0.302934,-1.3722024673167892
+2025-07-14 08:07:18,161.0,0.000580110998294993,0.198573,0.9529749267809763,2972.72,0.9052111683293488,2.83,0.2409265502304303,0.302924,-1.4143854786011956
+2025-07-14 08:08:18,161.0,0.03466091802186828,0.198573,1.0324878625737508,2972.72,0.9631180004487954,2.83,0.25289026942956533,0.302924,-1.386107537426832
+2025-07-14 08:09:19,160.98,0.008504827883008964,0.198553,1.093449710093728,2972.42,0.9743335811157301,2.83,0.26508261848745135,0.302894,-1.5656441807309327
+2025-07-14 08:10:19,160.98,0.047769138250396255,0.198553,1.1959120756590478,2972.42,1.044936350454484,2.83,0.2775162334787753,0.302894,-1.5331821452536893
+2025-07-14 08:11:19,160.95,-0.019499906874548317,0.198476,1.1751718914589053,2972.05,1.0528383631098055,2.83,0.29020466915620274,0.302863,-1.7135888985321557
+2025-07-14 08:12:19,160.95,0.011650800916802834,0.198476,1.305601087618149,2972.05,1.1262340759386387,2.83,0.30316248994323575,0.302863,-1.6753455816206848
+2025-07-14 08:13:20,160.97,0.13044546621569575,0.198472,1.4655079959529,2972.58,1.32705351908888,2.83,0.3164053721898512,0.302858,-1.6727718398414553
+2025-07-14 08:14:20,160.97,0.15696884119046478,0.198472,1.6286874948730379,2972.58,1.4072222442574813,2.83,0.3065654755334963,0.302858,-1.6327693481883883
+2025-07-14 08:15:20,161.01,0.35325245156155227,0.198488,1.6287113892717628,2973.76,1.6418407698045714,2.83,0.2870159208962526,0.302852,-1.6832146874713378
+2025-07-14 08:16:20,161.01,0.3831321674739962,0.198488,1.5885290700027972,2973.76,1.606055361942739,2.83,0.2665521732234441,0.302852,-1.6795292559944224
+2025-07-14 08:17:20,161.07,0.6745672150862834,0.198537,1.6686561978889627,2974.54,1.7379261785086657,2.83,0.24494897427845325,0.302826,-1.8415735464254068
+2025-07-14 08:18:21,161.17,1.1400738130649126,0.198561,1.687087770725924,2974.71,1.7475736214050803,2.83,0.2218917119980706,0.302824,-1.8451833477101527
+2025-07-14 08:19:21,161.17,1.1693914988931946,0.198561,1.648102529330839,2974.71,1.7180849854790654,2.83,0.2017050606873816,0.302824,-1.8454896522916386
+2025-07-14 08:20:22,161.2,1.396094773583013,0.19857,1.6423695679869963,2975.26,1.8350247565683329,2.83,0.1749815896061411,0.302821,-1.885591769958507
+2025-07-14 08:21:22,161.2,1.4218302665555842,0.19857,1.612298876892105,2975.26,1.7938790374406242,2.83,0.15173416165784676,0.302821,-1.911752555612817
+2025-07-14 08:22:22,161.2,1.4102985624849982,0.198555,1.5376926395544288,2975.23,1.7419368654575365,2.83,0.13786541867622018,0.302812,-1.9188172865468311
+2025-07-14 08:23:22,161.2,1.4010169722887258,0.198555,1.501723880187506,2975.23,1.6992168147130708,2.83,0.12377054955124726,0.302812,-1.8660337015838016
+2025-07-14 08:24:22,161.38,2.449093883362316,0.198552,1.460523286552665,2975.49,1.716933376510232,2.83,0.10942952541185615,0.302793,-1.9352795292572156
+2025-07-14 08:25:23,161.46,2.8292862873236655,0.198628,1.601729520238532,2977.56,2.107204314379737,2.83,0.09482045277472574,0.302785,-1.9293386706468145
+2025-07-14 08:26:23,161.46,2.717012221905089,0.198628,1.5632087062323892,2977.56,2.0453558774444978,2.83,0.07991931415001712,0.302785,-1.8734067749057342
+2025-07-14 08:27:23,161.57,3.1839072280385152,0.199331,3.019873978892875,2981.59,2.760364900640107,2.84,1.64294946991042,0.302491,-3.478543499665821
+2025-07-14 08:34:25,161.57,3.027590075936716,0.199248,2.6988885132234106,2982.28,2.7611967294932698,2.84,1.6093939095484837,0.302328,-4.028533750374936
+2025-07-14 08:39:26,161.37,1.909077949638929,0.199294,2.6654931460857716,2981.46,2.4945201346321584,2.83,2.1503902132916546e-13,0.302265,-3.9666116835729732
+2025-07-14 08:42:27,161.63,3.1143654398008147,0.199363,2.674736417991922,2983.19,2.6892981403687797,2.84,1.582634290068853,0.302246,-3.724919913867744
+2025-07-14 08:47:27,162.3,5.41964917050501,0.199571,2.919935476987079,2985.39,2.9230509417399975,2.84,1.5527919341296303,0.302204,-3.6126139944785085
+2025-07-14 08:52:28,162.19,4.403501379150497,0.199495,2.6461735541912255,2985.52,2.7959162980330676,2.84,1.5244761822283317,0.302157,-3.5289589331477647
+2025-07-14 08:57:30,162.11,3.7618893087822567,0.199421,2.4088390251824103,2983.44,2.3527292116195446,2.84,1.4976212401724234,0.301594,-4.974482509016226
+2025-07-14 09:02:30,162.1,3.462707707111819,0.199328,2.1650525007494688,2980.6,1.8377283266261892,2.84,1.4721743433771362,0.301585,-4.4313217431542995
+2025-07-14 09:07:31,162.14,3.3542417793324746,0.199354,2.134779476232594,2978.45,1.4599967389368582,2.85,2.9676158496488503,0.301565,-4.05760567577094
+2025-07-14 09:12:32,161.85,2.3521531539611042,0.199205,1.8276679562178704,2974.28,0.7846869421959807,2.85,2.8439735104577784,0.301556,-3.7416921480949505
+2025-07-14 09:15:32,161.95,2.5396328017827696,0.199172,1.7250467678771166,2972.4,0.4761299098673542,2.85,2.7340178589240156,0.301547,-3.487774690258909
+2025-07-14 09:18:33,161.88,2.251621329604101,0.199207,1.735164925706831,2971.92,0.38971419979545924,2.86,3.909088338153249,0.301565,-3.221884960662896
+2025-07-14 09:23:34,162.04,2.5899413269274385,0.198977,1.3302474957000372,2971.39,0.29600362482736425,2.86,3.6392648692240472,0.301766,-2.6228231141261364
+2025-07-14 09:26:34,161.92,2.179999579284872,0.198967,1.286135738490774,2970.88,0.2037466050363215,2.87,4.448142761420051,0.301795,-2.450795660862659
+2025-07-14 09:29:34,161.9,2.057591035929377,0.198951,1.2341220723485289,2969.73,0.00965393499677235,2.87,4.055647934231444,0.301776,-2.392627456092971
+2025-07-14 09:32:35,161.87,1.9215321043525255,0.198842,1.0383424774562058,2968.84,-0.14174177225834533,2.87,3.747248658677537,0.301755,-2.3426489743540317
+2025-07-14 09:35:35,161.91,1.9646398179857945,0.198825,0.9912256456730875,2968.83,-0.1518627872568401,2.87,3.4964329119432582,0.301715,-2.332016332329613
+2025-07-14 09:38:36,162.08,2.3050694134062755,0.198872,1.0451469198352794,2968.66,-0.1899230111665463,2.86,2.4179258400807884,0.301707,-2.2612296898160205
+2025-07-14 09:39:36,162.08,2.222508027816361,0.198872,1.0244223219755566,2968.66,-0.20059992904368096,2.86,2.337593811504882,0.301707,-2.1814760641062625
+2025-07-14 09:40:36,162.29,2.6028281988480773,0.198905,1.0563283023062804,2968.82,-0.1861461387741168,2.86,2.263901701405875,0.301709,-2.105463219440372
+2025-07-14 09:41:36,162.29,2.4920003174237895,0.198905,1.0361095972273804,2968.82,-0.19815095924094311,2.86,2.1960006141675183,0.301709,-2.0385422151442896
+2025-07-14 09:42:37,162.34,2.493787377485185,0.19897,1.118242626384937,2969.28,-0.13181558603497348,2.86,2.1331931654273135,0.301733,-1.934876331429169
+2025-07-14 09:43:37,162.34,2.394017481440305,0.19897,1.0967747723822756,2969.28,-0.14118067810795984,2.86,2.0634449055035446,0.301733,-1.879519995097155
+2025-07-14 09:44:37,162.38,2.3800303597470163,0.199,1.1232098532849055,2970.72,0.09058963029234224,2.86,1.998623557359129,0.301741,-1.813889942180245
+2025-07-14 09:45:37,162.38,2.2906263053262577,0.199,1.1020954912876728,2970.72,0.07826784987767496,2.86,1.9381357630296339,0.301741,-1.76589215308038
+2025-07-14 09:46:38,162.38,2.208787565139284,0.199061,1.1784417018887552,2971.08,0.1269955199481938,2.86,1.88148351914474,0.301731,-1.7371300920512636
+2025-07-14 09:47:38,162.38,2.133791305254476,0.199061,1.1574241318599665,2971.08,0.1121575677765134,2.86,1.828245283985246,0.301731,-1.6932399361858774
+2025-07-14 09:48:38,162.36,2.0288990970363634,0.199098,1.196427153319396,2971.16,0.11093949500094384,2.86,1.7780614698804682,0.301459,-2.0920443392514825
+2025-07-14 09:49:38,162.36,1.9670387644844212,0.199098,1.1758462058229233,2971.16,0.09547119463970712,2.86,1.7306231660332576,0.301459,-2.0281740340993286
+2025-07-14 09:50:38,162.36,1.9091813774250554,0.199149,1.2388073639961228,2971.31,0.10642231708246568,2.86,1.685663274250597,0.301344,-2.1467264608590493
+2025-07-14 09:51:38,162.36,1.8546159693228288,0.199149,1.2177554667202974,2971.31,0.0912514526371163,2.86,1.6429494699102882,0.301344,-2.0795029487351755
+2025-07-14 09:52:39,162.35,1.7862455162636948,0.199111,1.134947693791951,2970.89,-0.0005538073940761142,2.86,1.6022785597303153,0.301319,-2.0541591075224104
+2025-07-14 09:53:39,162.35,1.7385168720478434,0.199111,1.1164700652887087,2970.89,-0.01608871747057465,2.86,1.5634719199411509,0.301319,-1.9931800000547526
+2025-07-14 09:54:39,162.4,1.7754693764817753,0.199148,1.1599120588630074,2971.09,0.007116434742205155,2.86,1.5263717783993507,0.301305,-1.9565707947509041
+2025-07-14 09:55:39,162.4,1.728189848156922,0.199148,1.1410532166414873,2971.09,-0.007344605933800902,2.86,1.490838161973588,0.301305,-1.9018695940100516
+2025-07-14 09:56:40,162.46,1.7798261233163184,0.1992,1.2119029809838688,2972.46,0.23931263728897836,2.86,1.4567463728156964,0.301293,-1.8676310745560105
+2025-07-14 09:57:40,162.46,1.7325950663746579,0.1992,1.1935505361701173,2972.46,0.22438786355235482,2.86,1.4239848884197461,0.301293,-1.8182790056579907
+2025-07-14 09:58:40,162.49,1.7357886710594346,0.199277,1.3082891417850628,2973.43,0.3990567124119278,2.86,1.3924536037608304,0.301255,-1.8253807795404224
+2025-07-14 09:59:40,162.49,1.6918837524422845,0.199277,1.2880582005522425,2973.43,0.3843621874146219,2.86,1.36206235146822,0.301255,-1.7789554334198783
+2025-07-14 10:00:40,162.64,1.8802481538582825,0.199287,1.2861125768330037,2973.83,0.44926863401660894,2.86,1.332729649439378,0.301242,-1.7527018771052534
+2025-07-14 10:01:41,162.65,1.8445275192114547,0.199293,1.2775270156515797,2973.91,0.45039561396487515,2.86,1.3043816356412403,0.301229,-1.7273749044998434
+2025-07-14 10:02:41,162.65,1.7958152034413657,0.199293,1.259130692125373,2973.91,0.4353480213567657,2.86,1.2769511578499666,0.301229,-1.6855943155972293
+2025-07-14 10:03:41,162.74,1.8831625197001745,0.199366,1.3746883579703768,2975.2,0.6847792141404992,2.86,1.2503769923310386,0.301163,-1.7346401037701595
+2025-07-14 10:04:41,162.74,1.8332470088757493,0.199366,1.3566810581363198,2975.2,0.6692259742647041,2.86,1.2246031703706082,0.301163,-1.692415661529386
+2025-07-14 10:05:42,162.74,1.786893135780796,0.199367,1.3451580267793233,2975.41,0.6979090003068743,2.86,1.1995783954574113,0.301144,-1.6773483749269962
+2025-07-14 10:06:42,162.74,1.743068741329023,0.199367,1.3335482395597016,2975.41,0.6826471883875325,2.86,1.1752555370065485,0.301144,-1.6378291438558747
+2025-07-14 10:07:42,162.86,1.8721818665421852,0.199311,1.2028794823057392,2974.8,0.5360389714132853,2.86,1.15159118899927,0.301134,-1.6117787992223604
+2025-07-14 10:08:42,162.86,1.8242013386208409,0.199311,1.1826809268314504,2974.8,0.5209913526686918,2.86,1.1285452839081105,0.301134,-1.5738116737594525
+2025-07-14 10:09:43,162.89,1.8208469036666053,0.199327,1.1948178866807653,2976.07,0.7844326573004777,2.86,1.1060807538992332,0.301121,-1.5543049104626707
+2025-07-14 10:10:43,162.89,1.7760075508890967,0.199327,1.1757077417566746,2976.07,0.7688046073255199,2.86,1.0841632326216566,0.301121,-1.5188053638356611
+2025-07-14 10:11:43,162.92,1.7749688123130076,0.199344,1.191248155813404,2976.72,0.8991666196769197,2.86,1.0627607919768949,0.301068,-1.5528801754341577
+2025-07-14 10:12:43,162.92,1.7325142546959433,0.199344,1.1723489719526172,2976.72,0.8828456711394672,2.86,1.041843709151924,0.301068,-1.5177217485936707
+2025-07-14 10:13:44,162.95,1.733177206898699,0.199383,1.233336253874041,2979.89,1.5845202181049844,2.86,1.0213842599392207,0.30064,-2.0207760184945887
+2025-07-14 10:14:44,162.95,1.6922971556349895,0.199383,1.2131626264284885,2979.89,1.5551197081685961,2.86,1.002597394525117,0.30064,-1.9626907673458134
+2025-07-14 10:15:44,162.97,1.6804550704829468,0.200237,2.8721424928133814,2980.7,1.7083595530057443,2.86,0.984191593911013,0.300602,-1.9541690593752945
+2025-07-14 10:16:44,162.97,1.642072952289116,0.200237,2.7571007806673493,2980.7,1.6755102332078788,2.86,0.9661472215382734,0.300602,-1.9003666775298353
+2025-07-14 10:17:44,163.0,1.6456649417502076,0.200292,2.752029173359894,2981.97,1.926472519328397,2.86,0.9484458006633404,0.300601,-1.8509822980432824
+2025-07-14 10:18:44,163.0,1.6094493150161542,0.200292,2.6532419762936272,2981.97,1.886611930385269,2.86,0.9297308730492524,0.300601,-1.8030580078548335
+2025-07-14 10:19:45,163.03,1.6148197432260878,0.200345,2.65533213800595,2982.32,1.9265017663986683,2.86,0.9113426025659851,0.300597,-1.7624479799439574
+2025-07-14 10:20:45,163.03,1.5802646434657426,0.200345,2.567911141073006,2982.32,1.8889872134794106,2.86,0.8932622976280087,0.300597,-1.7193305561418852
+2025-07-14 10:21:45,163.05,1.573792527738899,0.200356,2.5071961350780523,2983.13,2.032048418291949,2.86,0.8754722228049956,0.300587,-1.6899524655966387
+2025-07-14 10:22:45,163.05,1.5405689099732824,0.200356,2.430722909550718,2983.13,1.9890162042746458,2.86,0.8591276014635087,0.300587,-1.6505127190016307
+2025-07-14 10:23:46,163.1,1.5747547971571705,0.200372,2.3872772119695296,2984.03,2.144699992418137,2.86,0.843032754614001,0.300598,-1.6004109289260346
+2025-07-14 10:24:46,163.1,1.5418083425798725,0.200372,2.3186789534189134,2984.03,2.0834459249222332,2.86,0.8271748614626613,0.300598,-1.5652942441413713
+2025-07-14 10:25:46,163.34,1.8217283870726728,0.200469,2.4107295774627944,2986.78,2.5964310350654536,2.87,1.519868415357065,0.300633,-1.4918353100932626
+2025-07-14 10:26:46,163.34,1.777552008737207,0.200469,2.340458474246991,2986.78,2.498671658704367,2.87,1.4884006271545513,0.300633,-1.461063481741843
+2025-07-14 10:27:46,163.58,2.038679642910558,0.200615,2.4982811548856603,2990.15,3.0410065296835267,2.87,1.454240598103964,0.300687,-1.3700071579685846
+2025-07-14 10:30:47,163.65,2.068819584896023,0.200798,2.6924546472303232,2994.6,3.647095710834485,2.87,1.4214106244380338,0.300736,-1.28736777114061
+2025-07-14 10:33:48,164.29,2.765172027931804,0.200834,2.643032033441977,2995.48,3.5288670969811258,2.88,2.062835530007655,0.300779,-1.213778267641187
+2025-07-14 10:36:49,164.08,2.4037364631846976,0.200782,2.470988152360134,2994.31,3.117654869252504,2.88,1.9984304969583873,0.30079,-1.1788664936916986

+ 1001 - 0
doge_price_history.csv

@@ -0,0 +1,1001 @@
+timestamp,price
+2025-07-05 18:03:42.497000,0.163317960853559
+2025-07-05 19:03:47.849000,0.1626109295294939
+2025-07-05 20:04:02.815000,0.1634629032805977
+2025-07-05 21:03:27.543000,0.1642142840592086
+2025-07-05 22:03:44.881000,0.1643124548673826
+2025-07-05 23:03:04.335000,0.1644460159290074
+2025-07-06 00:03:57.910000,0.164252385465895
+2025-07-06 01:03:56.445000,0.1642711103862993
+2025-07-06 02:00:38.959000,0.164198852455846
+2025-07-06 03:03:48.763000,0.1636595162804791
+2025-07-06 04:03:40.098000,0.1636679461656484
+2025-07-06 05:03:46.304000,0.163662342285747
+2025-07-06 06:03:34.708000,0.1633407278497059
+2025-07-06 07:03:51.381000,0.163926204951154
+2025-07-06 08:04:05.949000,0.163893537249725
+2025-07-06 09:03:31.775000,0.1638569258856392
+2025-07-06 10:03:22.326000,0.1635979211099145
+2025-07-06 11:03:47.026000,0.1645012065197762
+2025-07-06 12:03:48.811000,0.1651282264972723
+2025-07-06 13:03:54.914000,0.1667692351977425
+2025-07-06 14:03:45.325000,0.1732377744961906
+2025-07-06 15:03:44.862000,0.1703488845101085
+2025-07-06 16:03:38.724000,0.1701072852049493
+2025-07-06 17:04:11.065000,0.1707315503714025
+2025-07-06 18:03:53.023000,0.1707065413886113
+2025-07-06 19:03:59.307000,0.1684701907432121
+2025-07-06 20:03:54.950000,0.1692446739251106
+2025-07-06 21:03:57.848000,0.1704985610787461
+2025-07-06 22:04:00.098000,0.1722266507561647
+2025-07-06 23:03:35.418000,0.1729404130474576
+2025-07-07 00:03:32.379000,0.1719240963565381
+2025-07-07 01:03:53.683000,0.1711193486067915
+2025-07-07 02:03:49.136000,0.1714768248287383
+2025-07-07 03:03:34.433000,0.1732657069150378
+2025-07-07 04:08:17.433000,0.175528707855902
+2025-07-07 05:03:40.268000,0.1742330424714391
+2025-07-07 06:03:29.309000,0.1733486825790331
+2025-07-07 07:03:44.286000,0.172488260943272
+2025-07-07 08:03:22.429000,0.1730347545992001
+2025-07-07 09:03:47.018000,0.1725528907008224
+2025-07-07 10:03:49.715000,0.171295695643944
+2025-07-07 11:03:44.394000,0.1712919699199126
+2025-07-07 12:03:23.865000,0.1709295840805442
+2025-07-07 13:03:51.698000,0.1695766361726287
+2025-07-07 14:03:16.494000,0.1700810558767152
+2025-07-07 15:03:30.930000,0.1685570212967524
+2025-07-07 16:00:00.995000,0.1687161772393514
+2025-07-07 17:04:07.418000,0.1671681569116783
+2025-07-07 18:04:09.963000,0.1670498693539729
+2025-07-07 19:03:50.381000,0.1675375109376843
+2025-07-07 20:03:58.508000,0.1679320215517468
+2025-07-07 21:03:46.233000,0.1671582706972077
+2025-07-07 22:03:45.588000,0.167229281115841
+2025-07-07 23:03:58.478000,0.1669390053847793
+2025-07-08 00:03:44.201000,0.1679043829754473
+2025-07-08 01:03:37.022000,0.1678230555207293
+2025-07-08 02:03:57.622000,0.166708947128805
+2025-07-08 03:02:44.227000,0.1665458592896756
+2025-07-08 04:03:33.612000,0.1679914081523043
+2025-07-08 05:03:46.380000,0.1677462144010037
+2025-07-08 06:03:40.901000,0.168198425410641
+2025-07-08 07:03:51.134000,0.1681510042489908
+2025-07-08 08:03:11.685000,0.1687535046894157
+2025-07-08 09:03:39.535000,0.1683184214572247
+2025-07-08 10:01:12.827000,0.1688173787875802
+2025-07-08 11:03:43.788000,0.1696012459418828
+2025-07-08 12:03:48.520000,0.1709333336616637
+2025-07-08 13:03:49.044000,0.1716109470463037
+2025-07-08 14:01:05.454000,0.1708921615266268
+2025-07-08 15:03:48.709000,0.1690716040134428
+2025-07-08 16:03:53.808000,0.1692215561258716
+2025-07-08 17:03:29.162000,0.1697991403940409
+2025-07-08 18:03:58.778000,0.1712979643726631
+2025-07-08 19:02:17.942000,0.1711814566349875
+2025-07-08 20:03:53.310000,0.1705783873740834
+2025-07-08 21:03:42.458000,0.1700488332624923
+2025-07-08 22:01:58.011000,0.1707886063444143
+2025-07-08 23:03:59.069000,0.1710555181957722
+2025-07-09 00:03:59.205000,0.1709589280843905
+2025-07-09 01:03:43.460000,0.1706077780622269
+2025-07-09 02:04:07.755000,0.1705129887861429
+2025-07-09 03:03:25.360000,0.1716993739471214
+2025-07-09 04:03:28.425000,0.1704244005577447
+2025-07-09 05:03:30.052000,0.1711241395568069
+2025-07-09 06:02:05.038000,0.1722583446624332
+2025-07-09 07:02:33.895000,0.1725475586092857
+2025-07-09 08:03:52.555000,0.171866188880054
+2025-07-09 09:03:55.095000,0.1715315942311716
+2025-07-09 10:03:51.427000,0.1716966033167977
+2025-07-09 11:02:58.320000,0.1724465419538513
+2025-07-09 12:08:16.760000,0.1733059935074177
+2025-07-09 13:00:09.167000,0.1741266355174343
+2025-07-09 14:03:27.782000,0.1729906787990288
+2025-07-09 15:03:54.346000,0.172132785736388
+2025-07-09 16:01:49.851000,0.1729528101648146
+2025-07-09 17:03:44.560000,0.173658048032789
+2025-07-09 18:03:44.675000,0.1726619922088519
+2025-07-09 19:04:01.134000,0.1729230815247548
+2025-07-09 20:03:54.230000,0.176658796022405
+2025-07-09 21:03:29.105000,0.1813561822212759
+2025-07-09 22:03:48.536000,0.1811357618993506
+2025-07-09 23:03:48.012000,0.1821373231610235
+2025-07-10 00:08:09.259000,0.1808955259270181
+2025-07-10 01:03:38.156000,0.1792666036380256
+2025-07-10 02:03:49.642000,0.1809825979046558
+2025-07-10 03:03:36.715000,0.1810012838312895
+2025-07-10 04:03:37.662000,0.1801936532437049
+2025-07-10 05:03:41.003000,0.1810016666110965
+2025-07-10 06:03:25.627000,0.180871549413097
+2025-07-10 07:03:55.046000,0.1812835516207994
+2025-07-10 08:00:19.689000,0.1819262008323706
+2025-07-10 09:03:32.939000,0.1825072033688977
+2025-07-10 10:00:56.415000,0.1815393147835048
+2025-07-10 11:03:21.601000,0.1811450167069012
+2025-07-10 12:03:48.391000,0.1807084203829187
+2025-07-10 13:04:15.444000,0.1800627544661817
+2025-07-10 14:04:02.371000,0.1798252213064418
+2025-07-10 15:03:21.584000,0.1799869450239001
+2025-07-10 16:04:09.824000,0.1804203666321925
+2025-07-10 17:03:25.615000,0.1835797955806046
+2025-07-10 18:03:35.204000,0.1864026112819553
+2025-07-10 19:03:49.473000,0.1849736437884267
+2025-07-10 20:03:00.803000,0.1856742048794597
+2025-07-10 21:03:57.995000,0.1871186436079793
+2025-07-10 22:04:02.437000,0.1920245044320419
+2025-07-10 23:03:27.300000,0.193346998679061
+2025-07-11 00:03:13.159000,0.1940863825019863
+2025-07-11 01:04:01.285000,0.192854615897937
+2025-07-11 02:03:53.764000,0.1957087930265685
+2025-07-11 03:04:11.797000,0.1987719353601924
+2025-07-11 04:01:55.207000,0.1980589512782168
+2025-07-11 05:03:43.867000,0.1977984587017398
+2025-07-11 06:03:35.090000,0.1991559471952751
+2025-07-11 07:03:48.940000,0.1969529744299745
+2025-07-11 08:03:40.718000,0.1972970170643619
+2025-07-11 09:03:19.051000,0.1976984360341557
+2025-07-11 10:03:44.388000,0.1990904659439279
+2025-07-11 11:03:45.599000,0.1994742656221684
+2025-07-11 12:04:14.547000,0.1990376599343584
+2025-07-11 13:03:50.550000,0.2002243418959529
+2025-07-11 14:03:21.908000,0.2013968680195037
+2025-07-11 14:59:02.000000,0.2052988485763664
+2025-07-11 23:00:09.274656,0.205204
+2025-07-11 23:01:09.641228,0.205278
+2025-07-11 23:02:09.742556,0.205278
+2025-07-11 23:03:09.824624,0.205294
+2025-07-11 23:04:09.889019,0.205286
+2025-07-11 23:05:10.156977,0.205277
+2025-07-11 23:06:10.248497,0.205277
+2025-07-11 23:07:10.349474,0.205269
+2025-07-11 23:08:10.442714,0.205186
+2025-07-11 23:09:10.792433,0.205126
+2025-07-11 23:10:10.930372,0.205126
+2025-07-11 23:11:10.995761,0.205099
+2025-07-11 23:12:11.343813,0.203326
+2025-07-11 23:13:11.471458,0.203326
+2025-07-11 23:14:11.605351,0.203296
+2025-07-11 23:15:11.675698,0.203329
+2025-07-11 23:16:11.773428,0.203295
+2025-07-11 23:17:11.876351,0.203264
+2025-07-11 23:22:37.073158,0.203287
+2025-07-11 23:23:47.916576,0.203299
+2025-07-11 23:24:48.023560,0.203387
+2025-07-11 23:25:48.129694,0.203401
+2025-07-11 23:26:48.413112,0.20337
+2025-07-11 23:27:48.521125,0.20337
+2025-07-11 23:28:48.638454,0.203505
+2025-07-11 23:29:48.759098,0.203655
+2025-07-11 23:30:49.536005,0.203892
+2025-07-11 23:31:49.605874,0.203892
+2025-07-11 23:32:49.695174,0.204007
+2025-07-11 23:33:49.769007,0.204252
+2025-07-11 23:34:49.859269,0.204227
+2025-07-11 23:35:49.942785,0.204241
+2025-07-11 23:36:50.254169,0.204309
+2025-07-11 23:37:50.326715,0.204309
+2025-07-11 23:38:50.394170,0.206904
+2025-07-11 23:39:50.461033,0.207571
+2025-07-11 23:40:50.723950,0.207554
+2025-07-11 23:41:50.789776,0.207554
+2025-07-11 23:42:50.861169,0.20756
+2025-07-11 23:43:50.941317,0.207568
+2025-07-11 23:44:51.257423,0.207574
+2025-07-11 23:45:51.343804,0.207574
+2025-07-11 23:46:51.462482,0.207546
+2025-07-11 23:47:51.549960,0.20751
+2025-07-11 23:48:51.897034,0.207134
+2025-07-11 23:49:52.015703,0.207134
+2025-07-11 23:50:52.147032,0.207042
+2025-07-11 23:51:52.269495,0.206926
+2025-07-11 23:52:52.334410,0.206894
+2025-07-11 23:53:52.442609,0.206846
+2025-07-11 23:54:52.809363,0.206884
+2025-07-11 23:55:52.915443,0.206884
+2025-07-11 23:56:53.022946,0.206666
+2025-07-11 23:57:53.118551,0.206522
+2025-07-11 23:58:53.448849,0.206364
+2025-07-11 23:59:53.524534,0.206364
+2025-07-12 00:00:53.590302,0.206177
+2025-07-12 00:01:53.670793,0.205933
+2025-07-12 00:02:53.974989,0.202238
+2025-07-12 00:03:54.041576,0.202238
+2025-07-12 00:04:54.130384,0.202378
+2025-07-12 00:05:54.204966,0.206097
+2025-07-12 00:06:54.555870,0.202836
+2025-07-12 00:07:54.629876,0.202836
+2025-07-12 00:08:54.718644,0.202761
+2025-07-12 00:09:54.785095,0.202704
+2025-07-12 00:10:55.129793,0.202604
+2025-07-12 00:11:55.221023,0.202604
+2025-07-12 00:12:55.298578,0.202697
+2025-07-12 00:13:55.396556,0.202596
+2025-07-12 00:14:55.767396,0.202622
+2025-07-12 00:15:55.828723,0.202622
+2025-07-12 00:16:55.896948,0.202617
+2025-07-12 00:17:55.979678,0.202749
+2025-07-12 00:18:56.295544,0.202744
+2025-07-12 00:19:56.357812,0.202744
+2025-07-12 00:20:56.440721,0.202712
+2025-07-12 00:21:56.737119,0.202585
+2025-07-12 00:22:56.950233,0.202585
+2025-07-12 00:23:57.055460,0.202561
+2025-07-12 00:24:57.134815,0.202605
+2025-07-12 00:25:57.437647,0.202599
+2025-07-12 00:26:57.538130,0.202599
+2025-07-12 00:27:57.631072,0.202682
+2025-07-12 00:28:57.760818,0.202889
+2025-07-12 00:29:57.867179,0.202889
+2025-07-12 00:30:57.975825,0.202892
+2025-07-12 00:31:58.085129,0.203032
+2025-07-12 00:32:58.392735,0.203213
+2025-07-12 00:33:58.495884,0.203213
+2025-07-12 00:34:58.579669,0.203247
+2025-07-12 00:35:58.633858,0.203308
+2025-07-12 00:36:58.895839,0.203303
+2025-07-12 00:37:58.972253,0.203303
+2025-07-12 00:38:59.051323,0.203221
+2025-07-12 00:39:59.114021,0.203231
+2025-07-12 00:40:59.187208,0.203281
+2025-07-12 00:41:59.506158,0.203336
+2025-07-12 00:42:59.609672,0.203336
+2025-07-12 00:43:59.702381,0.203367
+2025-07-12 00:44:59.827089,0.203417
+2025-07-12 00:46:00.189434,0.203406
+2025-07-12 00:47:00.331358,0.203406
+2025-07-12 00:48:00.434038,0.203406
+2025-07-12 00:49:00.521619,0.203266
+2025-07-12 00:50:00.887449,0.203216
+2025-07-12 00:51:00.985066,0.203216
+2025-07-12 00:52:01.040529,0.203212
+2025-07-12 00:53:01.124811,0.20335
+2025-07-12 00:54:01.483260,0.203417
+2025-07-12 00:55:01.581262,0.203417
+2025-07-12 00:56:01.688391,0.203453
+2025-07-12 00:57:01.826609,0.203649
+2025-07-12 00:58:02.180431,0.203735
+2025-07-12 00:59:02.282210,0.203735
+2025-07-12 01:00:02.398171,0.20374
+2025-07-12 01:01:02.455179,0.205106
+2025-07-12 01:02:02.782133,0.205198
+2025-07-12 01:03:02.873684,0.205198
+2025-07-12 01:04:02.958780,0.205211
+2025-07-12 01:05:03.080834,0.205239
+2025-07-12 01:06:03.177512,0.205259
+2025-07-12 01:07:03.571672,0.205385
+2025-07-12 01:08:03.669945,0.205385
+2025-07-12 01:09:03.804939,0.205432
+2025-07-12 01:10:03.955976,0.205411
+2025-07-12 01:11:04.061513,0.205459
+2025-07-12 01:12:04.391005,0.205473
+2025-07-12 01:13:04.523790,0.205473
+2025-07-12 01:14:04.632466,0.205556
+2025-07-12 01:15:04.739718,0.205646
+2025-07-12 01:16:05.080569,0.205652
+2025-07-12 01:17:05.201125,0.205652
+2025-07-12 01:18:05.300277,0.205646
+2025-07-12 01:19:05.418812,0.205557
+2025-07-12 01:20:05.788876,0.205553
+2025-07-12 01:21:05.902166,0.205553
+2025-07-12 01:22:06.041332,0.20556
+2025-07-12 01:23:06.370982,0.205776
+2025-07-12 01:24:06.689375,0.205828
+2025-07-12 01:25:06.825713,0.205828
+2025-07-12 01:26:06.929122,0.20584
+2025-07-12 01:27:07.149428,0.205854
+2025-07-12 01:28:07.265117,0.207995
+2025-07-12 01:29:07.382896,0.208088
+2025-07-12 01:30:07.695955,0.208143
+2025-07-12 01:31:07.827661,0.208143
+2025-07-12 01:32:07.953459,0.208361
+2025-07-12 01:33:08.065938,0.208475
+2025-07-12 01:34:08.437235,0.208505
+2025-07-12 01:35:08.556233,0.208505
+2025-07-12 01:36:08.911380,0.208495
+2025-07-12 01:37:09.375887,0.208457
+2025-07-12 01:38:09.513140,0.208343
+2025-07-12 01:39:09.715831,0.208296
+2025-07-12 01:40:10.041879,0.208238
+2025-07-12 01:41:10.374591,0.208172
+2025-07-12 01:42:10.500208,0.208172
+2025-07-12 01:43:10.591798,0.20829
+2025-07-12 01:44:10.678543,0.208218
+2025-07-12 01:45:11.151517,0.208413
+2025-07-12 01:46:11.267070,0.208413
+2025-07-12 01:47:11.391729,0.208446
+2025-07-12 01:48:11.497595,0.208506
+2025-07-12 01:49:11.830810,0.20859
+2025-07-12 01:50:11.934853,0.20859
+2025-07-12 01:51:12.029603,0.208765
+2025-07-12 01:52:12.116841,0.208814
+2025-07-12 01:53:12.240578,0.208884
+2025-07-12 01:54:12.539370,0.210509
+2025-07-12 01:55:12.601515,0.210509
+2025-07-12 01:56:12.687700,0.210561
+2025-07-12 01:57:12.789448,0.210519
+2025-07-12 01:58:12.952896,0.210507
+2025-07-12 01:59:13.258909,0.210527
+2025-07-12 02:00:13.372871,0.210527
+2025-07-12 02:01:13.508794,0.210505
+2025-07-12 02:02:13.578033,0.21052
+2025-07-12 02:03:13.872300,0.21062
+2025-07-12 02:04:13.991175,0.21062
+2025-07-12 02:05:19.112849,0.210648
+2025-07-12 02:06:19.245053,0.210748
+2025-07-12 02:07:19.361833,0.210843
+2025-07-12 02:08:19.743804,0.210867
+2025-07-12 02:09:20.269417,0.210938
+2025-07-12 02:10:20.411109,0.210938
+2025-07-12 02:11:20.534835,0.210981
+2025-07-12 02:12:20.681838,0.210946
+2025-07-12 02:13:20.798024,0.210946
+2025-07-12 02:14:21.124192,0.211014
+2025-07-12 02:15:21.266603,0.211014
+2025-07-12 02:16:21.715110,0.211071
+2025-07-12 02:17:22.184868,0.211087
+2025-07-12 02:18:22.517896,0.21121
+2025-07-12 02:19:22.674101,0.21121
+2025-07-12 02:20:22.799884,0.211237
+2025-07-12 02:21:23.109927,0.212166
+2025-07-12 02:22:23.227295,0.212166
+2025-07-12 02:23:23.705053,0.212027
+2025-07-12 02:24:24.301880,0.211966
+2025-07-12 02:25:24.718326,0.211966
+2025-07-12 02:26:25.201129,0.211957
+2025-07-12 02:27:25.373688,0.211981
+2025-07-12 02:28:25.717299,0.211961
+2025-07-12 02:29:25.795530,0.211961
+2025-07-12 02:30:25.879261,0.211939
+2025-07-12 02:31:26.193580,0.211872
+2025-07-12 02:32:26.252623,0.211872
+2025-07-12 02:33:26.303736,0.211825
+2025-07-12 02:34:26.555683,0.211874
+2025-07-12 02:35:26.613432,0.211874
+2025-07-12 02:36:26.682700,0.211998
+2025-07-12 02:37:26.736522,0.211963
+2025-07-12 02:38:26.815064,0.211984
+2025-07-12 02:39:27.115388,0.212165
+2025-07-12 02:40:29.458898,0.212178
+2025-07-12 02:41:29.610938,0.212178
+2025-07-12 02:42:29.734433,0.212131
+2025-07-12 02:43:29.891163,0.212095
+2025-07-12 02:44:30.175683,0.212096
+2025-07-12 02:45:30.232221,0.212096
+2025-07-12 02:46:30.335616,0.21209
+2025-07-12 02:47:30.482129,0.212089
+2025-07-12 02:48:30.853115,0.212089
+2025-07-12 02:49:31.009017,0.212089
+2025-07-12 02:50:31.137758,0.212493
+2025-07-12 02:51:31.278238,0.212437
+2025-07-12 02:52:31.376673,0.212367
+2025-07-12 02:53:31.719489,0.212326
+2025-07-12 02:54:31.849218,0.212326
+2025-07-12 02:55:32.005300,0.212319
+2025-07-12 02:56:32.401775,0.212321
+2025-07-12 02:57:32.498170,0.212321
+2025-07-12 02:58:32.601508,0.212288
+2025-07-12 02:59:32.730137,0.212308
+2025-07-12 03:00:33.072803,0.212316
+2025-07-12 03:01:33.170508,0.212316
+2025-07-12 03:02:33.260709,0.212318
+2025-07-12 03:03:33.594979,0.212295
+2025-07-12 03:04:33.687553,0.212295
+2025-07-12 03:05:33.766828,0.212388
+2025-07-12 03:06:33.850747,0.212419
+2025-07-12 03:07:34.117157,0.21221
+2025-07-12 03:08:34.301197,0.21221
+2025-07-12 03:09:34.427602,0.21201
+2025-07-12 03:10:34.819298,0.211952
+2025-07-12 03:11:34.915816,0.211952
+2025-07-12 03:12:35.024109,0.211865
+2025-07-12 03:13:35.137459,0.211837
+2025-07-12 03:14:35.499331,0.211784
+2025-07-12 03:15:35.820030,0.211784
+2025-07-12 03:16:36.426272,0.211824
+2025-07-12 03:17:37.077379,0.210598
+2025-07-12 03:18:37.182018,0.210598
+2025-07-12 03:19:37.285394,0.210637
+2025-07-12 03:20:37.572194,0.21074
+2025-07-12 03:21:37.687866,0.21074
+2025-07-12 03:22:37.787171,0.210754
+2025-07-12 03:23:38.238254,0.210824
+2025-07-12 03:24:38.304493,0.210824
+2025-07-12 03:25:38.380314,0.210846
+2025-07-12 03:26:38.664974,0.210845
+2025-07-12 03:27:38.756406,0.210845
+2025-07-12 03:28:38.841310,0.210853
+2025-07-12 03:29:39.155726,0.210807
+2025-07-12 03:30:39.244136,0.210807
+2025-07-12 03:31:39.315907,0.210731
+2025-07-12 03:32:39.395444,0.210718
+2025-07-12 03:33:39.739348,0.210597
+2025-07-12 03:34:39.858903,0.210597
+2025-07-12 03:35:39.971322,0.210599
+2025-07-12 03:36:40.269687,0.210591
+2025-07-12 03:37:40.402686,0.210591
+2025-07-12 03:38:40.476351,0.210592
+2025-07-12 03:39:40.612146,0.21061
+2025-07-12 03:40:41.082112,0.210633
+2025-07-12 03:41:41.490674,0.210633
+2025-07-12 03:42:42.022694,0.210635
+2025-07-12 03:43:42.631451,0.210457
+2025-07-12 03:44:42.717577,0.210457
+2025-07-12 03:45:42.822080,0.210404
+2025-07-12 03:46:43.148334,0.210406
+2025-07-12 03:47:43.239235,0.210406
+2025-07-12 03:48:43.332268,0.210454
+2025-07-12 03:49:43.405159,0.210482
+2025-07-12 03:50:43.691551,0.2105
+2025-07-12 03:51:43.750373,0.2105
+2025-07-12 03:52:43.830499,0.21053
+2025-07-12 03:53:44.122312,0.210636
+2025-07-12 03:54:44.223327,0.210636
+2025-07-12 03:55:44.292765,0.210705
+2025-07-12 03:56:44.619124,0.210663
+2025-07-12 03:57:44.685904,0.210663
+2025-07-12 03:58:44.777165,0.210658
+2025-07-12 03:59:44.879394,0.210681
+2025-07-12 04:00:44.973657,0.210723
+2025-07-12 04:01:45.640005,0.210722
+2025-07-12 04:02:45.711588,0.210722
+2025-07-12 04:03:45.777314,0.210689
+2025-07-12 04:04:45.861291,0.21066
+2025-07-12 04:05:45.954246,0.21066
+2025-07-12 04:06:46.026504,0.210654
+2025-07-12 04:07:46.120517,0.21061
+2025-07-12 04:08:46.188465,0.210587
+2025-07-12 04:09:46.289461,0.210583
+2025-07-12 04:10:46.366552,0.210583
+2025-07-12 04:11:46.422822,0.210883
+2025-07-12 04:12:46.491084,0.210873
+2025-07-12 04:13:46.569509,0.210873
+2025-07-12 04:14:46.657891,0.210872
+2025-07-12 04:15:46.973559,0.210899
+2025-07-12 04:16:47.033472,0.210899
+2025-07-12 04:17:47.093265,0.210894
+2025-07-12 04:18:47.383814,0.210883
+2025-07-12 04:19:47.505268,0.210883
+2025-07-12 04:20:47.564574,0.210883
+2025-07-12 04:21:47.659872,0.210913
+2025-07-12 04:22:47.728814,0.210913
+2025-07-12 04:23:47.965223,0.210882
+2025-07-12 04:24:48.085270,0.210808
+2025-07-12 04:25:48.417598,0.210785
+2025-07-12 04:26:48.474352,0.210785
+2025-07-12 04:27:48.536759,0.210729
+2025-07-12 04:28:48.845184,0.210584
+2025-07-12 04:29:48.942319,0.210584
+2025-07-12 04:30:49.051763,0.210554
+2025-07-12 04:31:49.676443,0.210508
+2025-07-12 04:32:49.743678,0.210508
+2025-07-12 04:33:49.842879,0.210475
+2025-07-12 04:34:49.940970,0.21031
+2025-07-12 04:35:50.277990,0.21026
+2025-07-12 04:36:50.337875,0.21026
+2025-07-12 04:37:50.435027,0.208785
+2025-07-12 04:38:51.208717,0.208802
+2025-07-12 04:39:51.305393,0.208802
+2025-07-12 04:40:51.405294,0.208739
+2025-07-12 04:41:51.513564,0.208719
+2025-07-12 04:42:51.607865,0.208689
+2025-07-12 04:43:52.400046,0.208698
+2025-07-12 04:44:52.509319,0.208698
+2025-07-12 04:45:52.636394,0.208688
+2025-07-12 04:46:52.734606,0.208678
+2025-07-12 04:47:53.019445,0.208604
+2025-07-12 04:48:53.120554,0.208604
+2025-07-12 04:49:53.245317,0.208558
+2025-07-12 04:50:53.347798,0.208534
+2025-07-12 04:51:53.681989,0.208509
+2025-07-12 04:52:53.799867,0.208509
+2025-07-12 04:53:53.897005,0.208534
+2025-07-12 04:54:53.982108,0.208526
+2025-07-12 04:55:54.080349,0.208453
+2025-07-12 04:56:54.180619,0.208453
+2025-07-12 04:57:54.483605,0.208301
+2025-07-12 04:58:54.695471,0.208301
+2025-07-12 04:59:54.854585,0.208283
+2025-07-12 05:00:54.974615,0.208171
+2025-07-12 05:01:55.353050,0.208103
+2025-07-12 05:02:55.435997,0.208103
+2025-07-12 05:03:55.540708,0.208076
+2025-07-12 05:04:55.608185,0.208067
+2025-07-12 05:05:55.725318,0.206488
+2025-07-12 05:06:55.813065,0.2065
+2025-07-12 05:07:55.868565,0.206506
+2025-07-12 05:08:56.197667,0.206527
+2025-07-12 05:09:56.523663,0.206541
+2025-07-12 05:10:56.635420,0.206541
+2025-07-12 05:11:56.741148,0.206489
+2025-07-12 05:12:56.833678,0.206397
+2025-07-12 05:13:57.204302,0.206299
+2025-07-12 05:14:57.258325,0.206299
+2025-07-12 05:15:57.325439,0.206227
+2025-07-12 05:16:57.424220,0.206159
+2025-07-12 05:17:57.507952,0.206159
+2025-07-12 05:18:57.602759,0.206111
+2025-07-12 05:19:57.711708,0.206073
+2025-07-12 05:20:58.123931,0.206063
+2025-07-12 05:21:58.262068,0.206063
+2025-07-12 05:22:58.449806,0.206043
+2025-07-12 05:23:58.558680,0.206075
+2025-07-12 05:24:58.652274,0.206075
+2025-07-12 05:25:58.755491,0.20607
+2025-07-12 05:26:59.045788,0.206117
+2025-07-12 05:27:59.329338,0.206122
+2025-07-12 05:28:59.460230,0.206122
+2025-07-12 05:29:59.544769,0.206139
+2025-07-12 05:30:59.659175,0.206176
+2025-07-12 05:31:59.761901,0.20555
+2025-07-12 05:33:00.089886,0.205528
+2025-07-12 05:34:00.205621,0.205528
+2025-07-12 05:35:00.314423,0.205487
+2025-07-12 05:36:00.425355,0.205454
+2025-07-12 05:37:00.757093,0.205433
+2025-07-12 05:38:00.853739,0.205433
+2025-07-12 05:39:00.966731,0.205426
+2025-07-12 05:40:01.065941,0.205276
+2025-07-12 05:41:01.173510,0.205192
+2025-07-12 05:42:01.271101,0.204963
+2025-07-12 05:43:01.583046,0.205062
+2025-07-12 05:44:01.726609,0.205062
+2025-07-12 05:45:01.860521,0.205045
+2025-07-12 05:46:01.984354,0.204882
+2025-07-12 05:47:02.292751,0.20482
+2025-07-12 05:48:02.409038,0.20482
+2025-07-12 05:49:02.542511,0.204845
+2025-07-12 05:50:02.669819,0.204871
+2025-07-12 05:51:02.806824,0.204894
+2025-07-12 05:52:03.108729,0.204895
+2025-07-12 05:53:03.215164,0.204895
+2025-07-12 05:54:03.316595,0.20485
+2025-07-12 05:55:03.410614,0.204838
+2025-07-12 05:56:03.725960,0.204806
+2025-07-12 05:57:03.868425,0.204806
+2025-07-12 05:58:04.040981,0.204717
+2025-07-12 05:59:04.262502,0.202671
+2025-07-12 06:00:04.418647,0.202701
+2025-07-12 06:01:04.760895,0.202704
+2025-07-12 06:02:04.883744,0.202704
+2025-07-12 06:03:04.985085,0.20271
+2025-07-12 06:04:05.103628,0.202707
+2025-07-12 06:05:05.449854,0.202727
+2025-07-12 06:06:05.586417,0.202727
+2025-07-12 06:07:05.704450,0.202725
+2025-07-12 06:08:05.798099,0.202712
+2025-07-12 06:09:06.094145,0.202681
+2025-07-12 06:10:06.191489,0.202681
+2025-07-12 06:11:06.304614,0.202612
+2025-07-12 06:12:06.409557,0.202583
+2025-07-12 06:13:06.700292,0.202532
+2025-07-12 06:14:06.807522,0.202532
+2025-07-12 06:15:06.891159,0.2025
+2025-07-12 06:16:07.040922,0.202415
+2025-07-12 06:17:07.334309,0.202354
+2025-07-12 06:18:07.439126,0.202354
+2025-07-12 06:19:07.559085,0.202282
+2025-07-12 06:20:07.688703,0.202038
+2025-07-12 06:21:07.800546,0.202127
+2025-07-12 06:22:08.122983,0.202078
+2025-07-12 06:23:08.387138,0.202078
+2025-07-12 06:24:08.542539,0.202036
+2025-07-12 06:25:08.665855,0.199019
+2025-07-12 06:26:09.100279,0.198825
+2025-07-12 06:27:09.247554,0.198825
+2025-07-12 06:28:09.443966,0.19866
+2025-07-12 06:29:09.608899,0.198245
+2025-07-12 06:30:10.008207,0.198232
+2025-07-12 06:31:10.474622,0.198207
+2025-07-12 06:32:10.626377,0.198207
+2025-07-12 06:33:10.750220,0.198334
+2025-07-12 06:34:10.877990,0.198307
+2025-07-12 06:35:11.255300,0.198406
+2025-07-12 06:36:11.426020,0.198406
+2025-07-12 06:37:11.643475,0.198471
+2025-07-12 06:38:11.782602,0.198541
+2025-07-12 06:39:12.091301,0.198597
+2025-07-12 06:40:12.207610,0.198597
+2025-07-12 06:41:12.338593,0.198635
+2025-07-12 06:42:13.537546,0.198651
+2025-07-12 06:43:13.910764,0.198613
+2025-07-12 06:44:14.255534,0.198582
+2025-07-12 06:45:14.393491,0.198582
+2025-07-12 06:46:14.603955,0.198584
+2025-07-12 06:47:14.779231,0.198582
+2025-07-12 06:48:14.931275,0.19861
+2025-07-12 06:49:15.216105,0.198595
+2025-07-12 06:50:15.348329,0.198595
+2025-07-12 06:51:15.494168,0.198781
+2025-07-12 06:52:15.610001,0.199243
+2025-07-12 06:53:15.736496,0.199264
+2025-07-12 06:54:16.134374,0.199344
+2025-07-12 06:55:16.423575,0.199344
+2025-07-12 06:56:17.250563,0.199388
+2025-07-12 06:57:17.868160,0.199392
+2025-07-12 06:58:18.149530,0.199423
+2025-07-12 06:59:18.659890,0.199495
+2025-07-12 07:00:18.789661,0.199495
+2025-07-12 07:01:18.892734,0.19952
+2025-07-12 07:02:19.031396,0.199565
+2025-07-12 07:03:19.397751,0.199571
+2025-07-12 07:04:19.514661,0.199571
+2025-07-12 07:05:19.670768,0.19959
+2025-07-12 07:06:19.847300,0.199621
+2025-07-12 07:07:20.226862,0.199697
+2025-07-12 07:08:20.348221,0.199697
+2025-07-12 07:09:20.456738,0.199754
+2025-07-12 07:10:20.607818,0.199786
+2025-07-12 07:11:20.983155,0.199989
+2025-07-12 07:12:21.343249,0.20003
+2025-07-12 07:13:21.528456,0.20003
+2025-07-12 07:14:21.669247,0.200083
+2025-07-12 07:15:22.018038,0.200124
+2025-07-12 07:16:22.895640,0.200208
+2025-07-12 07:17:23.628313,0.200199
+2025-07-12 07:18:23.724921,0.200199
+2025-07-12 07:19:23.905304,0.200185
+2025-07-12 07:20:24.077416,0.202117
+2025-07-12 07:21:24.199988,0.202119
+2025-07-12 07:22:24.633119,0.202119
+2025-07-12 07:23:25.461640,0.2021
+2025-07-12 07:24:26.321658,0.202106
+2025-07-12 07:25:26.893251,0.202106
+2025-07-12 07:26:27.667140,0.202104
+2025-07-12 07:27:28.278340,0.202097
+2025-07-12 07:28:28.847113,0.202086
+2025-07-12 07:29:29.620355,0.202061
+2025-07-12 07:30:30.417362,0.202033
+2025-07-12 07:31:31.010817,0.202033
+2025-07-12 07:32:31.803033,0.20198
+2025-07-12 07:33:32.833145,0.201915
+2025-07-12 07:34:33.769375,0.201855
+2025-07-12 07:35:34.720147,0.201805
+2025-07-12 07:36:36.074524,0.201795
+2025-07-12 07:37:37.565781,0.201792
+2025-07-12 07:38:38.319591,0.201813
+2025-07-12 07:39:38.472644,0.201813
+2025-07-12 07:40:38.627345,0.20179
+2025-07-12 07:41:38.708013,0.201806
+2025-07-12 07:42:39.068378,0.201798
+2025-07-12 07:43:39.191661,0.201798
+2025-07-12 07:44:39.309633,0.201805
+2025-07-12 07:45:39.656300,0.201006
+2025-07-12 07:46:39.773614,0.201006
+2025-07-12 07:47:39.848544,0.201026
+2025-07-12 07:48:40.133584,0.201029
+2025-07-12 07:49:40.234072,0.201029
+2025-07-12 07:50:40.330221,0.200963
+2025-07-12 07:51:40.442353,0.200995
+2025-07-12 07:52:40.772221,0.201015
+2025-07-12 07:53:40.902181,0.201015
+2025-07-12 07:54:41.026161,0.201018
+2025-07-12 07:55:41.131212,0.201022
+2025-07-12 07:56:41.507376,0.201049
+2025-07-12 07:57:41.695855,0.201049
+2025-07-12 07:58:41.804350,0.201039
+2025-07-12 07:59:42.148478,0.20106
+2025-07-12 08:00:42.257137,0.20106
+2025-07-12 08:01:42.357203,0.201055
+2025-07-12 08:02:42.476447,0.201059
+2025-07-12 08:03:42.825900,0.20113
+2025-07-12 08:04:42.953119,0.20113
+2025-07-12 08:05:43.043585,0.201203
+2025-07-12 08:06:43.158832,0.201214
+2025-07-12 08:07:43.514137,0.201224
+2025-07-12 08:08:43.613451,0.201224
+2025-07-12 08:09:43.698703,0.201246
+2025-07-12 08:10:43.860055,0.201249
+2025-07-12 08:11:44.185698,0.201207
+2025-07-12 08:12:44.286047,0.201207
+2025-07-12 08:13:44.384863,0.201166
+2025-07-12 08:14:44.791978,0.201171
+2025-07-12 08:15:45.005607,0.201171
+2025-07-12 08:16:45.081228,0.201154
+2025-07-12 08:17:45.388130,0.201119
+2025-07-12 08:18:45.501500,0.201119
+2025-07-12 08:19:46.266902,0.201066
+2025-07-12 08:20:46.393958,0.201066
+2025-07-12 08:21:46.523305,0.201039
+2025-07-12 08:22:46.629966,0.201007
+2025-07-12 08:23:47.102196,0.20099
+2025-07-12 08:24:47.182671,0.20099
+2025-07-12 08:25:47.249175,0.200962
+2025-07-12 08:26:47.571338,0.200841
+2025-07-12 08:27:47.652402,0.200841
+2025-07-12 08:28:47.753691,0.200784
+2025-07-12 08:29:47.901644,0.200771
+2025-07-12 08:30:48.535481,0.200841
+2025-07-12 08:31:48.974067,0.200841
+2025-07-12 08:32:49.513203,0.20085
+2025-07-12 08:33:50.009386,0.200837
+2025-07-12 08:34:50.931532,0.20075
+2025-07-12 08:35:52.046312,0.200737
+2025-07-12 08:36:53.178965,0.200567
+2025-07-12 08:37:54.581589,0.200522
+2025-07-12 08:38:54.969615,0.200522
+2025-07-12 08:39:55.210479,0.20037
+2025-07-12 08:40:55.583044,0.198213
+2025-07-12 08:41:56.035707,0.198189
+2025-07-12 08:42:56.439680,0.19816
+2025-07-12 08:43:56.624210,0.19816
+2025-07-12 08:44:56.815780,0.198161
+2025-07-12 08:45:56.986129,0.198127
+2025-07-12 08:46:57.160350,0.198107
+2025-07-12 08:47:57.488863,0.198145
+2025-07-12 08:48:57.612179,0.198145
+2025-07-12 08:49:57.802961,0.19819
+2025-07-12 08:50:57.983193,0.198203
+2025-07-12 08:51:58.383263,0.198194
+2025-07-12 08:52:58.563236,0.198194
+2025-07-12 08:53:58.743101,0.198221
+2025-07-12 08:54:58.914429,0.198267
+2025-07-12 08:55:59.007451,0.198267
+2025-07-12 08:56:59.121181,0.198311
+2025-07-12 08:57:59.284801,0.198321
+2025-07-12 08:58:59.673818,0.198347
+2025-07-12 08:59:59.844187,0.198347
+2025-07-12 09:01:00.006801,0.198374
+2025-07-12 09:02:00.141677,0.198497
+2025-07-12 09:03:00.579376,0.198557
+2025-07-12 09:04:00.730462,0.198557
+2025-07-12 09:05:01.127795,0.198586
+2025-07-12 09:06:01.525037,0.198682
+2025-07-12 09:07:01.693508,0.198735
+2025-07-12 09:08:01.887828,0.201086
+2025-07-12 09:09:02.667156,0.201106
+2025-07-12 09:10:03.664140,0.201142
+2025-07-12 09:11:04.851207,0.201309
+2025-07-12 09:12:06.084531,0.201395
+2025-07-12 09:13:06.880675,0.201395
+2025-07-12 09:14:17.281959,0.201448
+2025-07-12 09:15:17.405285,0.201448
+2025-07-12 09:16:17.492311,0.201494
+2025-07-12 09:17:17.629223,0.201499
+2025-07-12 09:18:18.091836,0.201509
+2025-07-12 09:19:18.321923,0.201509
+2025-07-12 09:20:18.833634,0.201606
+2025-07-12 09:21:19.357520,0.201661
+2025-07-12 09:22:19.889890,0.201792
+2025-07-12 09:23:20.189062,0.201792
+2025-07-12 09:24:20.748636,0.201725
+2025-07-12 09:25:20.894546,0.201725
+2025-07-12 09:26:21.023367,0.201692
+2025-07-12 09:27:21.245734,0.201714
+2025-07-12 09:28:21.637373,0.201714
+2025-07-12 09:29:22.008803,0.201726
+2025-07-12 09:30:22.759862,0.20175
+2025-07-12 09:31:23.711679,0.201764
+2025-07-12 09:32:24.763749,0.201778
+2025-07-12 09:33:25.397736,0.201795
+2025-07-12 09:34:25.668017,0.201795
+2025-07-12 09:35:25.959214,0.202594
+2025-07-12 09:36:26.338798,0.202571
+2025-07-12 09:37:26.694285,0.202559
+2025-07-12 09:38:26.871559,0.202559
+2025-07-12 09:39:27.097028,0.202557
+2025-07-12 09:40:27.678077,0.20255
+2025-07-12 09:41:28.088981,0.20253
+2025-07-12 09:42:28.251487,0.20253
+2025-07-12 09:43:28.717638,0.202521
+2025-07-12 09:44:29.283057,0.202551
+2025-07-12 09:45:29.986647,0.202568
+2025-07-12 09:46:30.795394,0.202577
+2025-07-12 09:47:31.914226,0.202583
+2025-07-12 09:48:32.972940,0.202578
+2025-07-12 09:49:33.946501,0.202557
+2025-07-12 09:50:35.014736,0.202552
+2025-07-12 09:51:36.184918,0.202556
+2025-07-12 09:52:37.132638,0.202556
+2025-07-12 09:57:36.727390,0.202617
+2025-07-12 09:58:44.988494,0.202622
+2025-07-12 09:59:45.611348,0.202616
+2025-07-12 10:00:46.167720,0.202608
+2025-07-12 10:01:46.534374,0.202595
+2025-07-12 10:02:46.645102,0.202595
+2025-07-12 10:03:46.741110,0.202596
+2025-07-12 10:04:46.838884,0.202605
+2025-07-12 10:05:46.983842,0.202599
+2025-07-12 10:06:47.065146,0.202584
+2025-07-12 10:07:47.384342,0.202589
+2025-07-12 10:08:47.570277,0.202589
+2025-07-12 10:09:47.966295,0.202669
+2025-07-12 10:10:48.645304,0.202727
+2025-07-12 10:11:49.376883,0.202805
+2025-07-12 10:12:49.659978,0.202805
+2025-07-12 10:13:49.881908,0.202845
+2025-07-12 10:14:50.552317,0.202903
+2025-07-12 10:15:52.196772,0.202947
+2025-07-12 10:16:52.828898,0.202995
+2025-07-12 10:17:53.559862,0.203041
+2025-07-12 10:18:54.554540,0.203041
+2025-07-12 10:19:55.555183,0.203046
+2025-07-12 10:20:56.670412,0.203049
+2025-07-12 10:21:57.739773,0.203051
+2025-07-12 10:22:59.087724,0.203059
+2025-07-12 10:24:00.001021,0.203059
+2025-07-12 10:25:00.949584,0.203114
+2025-07-12 10:26:01.598093,0.203122
+2025-07-12 10:27:01.750173,0.20313
+2025-07-12 10:28:02.119702,0.203138
+2025-07-12 10:29:02.200139,0.203138
+2025-07-12 10:30:02.321775,0.2046
+2025-07-12 10:31:02.992902,0.204617
+2025-07-12 10:32:03.610589,0.204626
+2025-07-12 10:33:03.739025,0.204626
+2025-07-12 10:34:03.917329,0.204675
+2025-07-12 10:35:04.314005,0.204765
+2025-07-12 10:36:04.774948,0.204811
+2025-07-12 10:37:05.396994,0.204858
+2025-07-12 10:38:05.663235,0.204858
+2025-07-12 10:39:06.143062,0.204901
+2025-07-12 10:40:06.680539,0.205065
+2025-07-12 10:41:07.343732,0.205108
+2025-07-12 10:42:09.182339,0.205109
+2025-07-12 10:43:09.784244,0.205124
+2025-07-12 10:44:10.521359,0.205129
+2025-07-12 10:45:11.330308,0.205084
+2025-07-12 10:46:11.756508,0.205084
+2025-07-12 10:47:11.864059,0.205013
+2025-07-12 10:48:12.009393,0.204987
+2025-07-12 10:49:12.311537,0.204969
+2025-07-12 10:50:12.441239,0.204969
+2025-07-12 10:51:12.685777,0.204849
+2025-07-12 10:52:12.922004,0.20481
+2025-07-12 10:53:13.246230,0.204778
+2025-07-12 10:54:13.375755,0.204778
+2025-07-12 10:55:13.513599,0.204248
+2025-07-12 10:56:13.647382,0.204209
+2025-07-12 10:57:13.995444,0.204153
+2025-07-12 10:58:14.362600,0.20411
+2025-07-12 10:59:14.493719,0.20411
+2025-07-12 11:00:14.855027,0.20406
+2025-07-12 11:01:15.164983,0.204066
+2025-07-12 11:02:15.882849,0.204058
+2025-07-12 11:03:16.757444,0.204035
+2025-07-12 11:04:17.658489,0.204048
+2025-07-12 11:05:18.613176,0.204095
+2025-07-12 11:06:19.752903,0.204155
+2025-07-12 11:07:20.727429,0.2042
+2025-07-12 11:08:23.269793,0.204215
+2025-07-12 11:09:24.485042,0.204233
+2025-07-12 11:10:25.790450,0.204237
+2025-07-12 11:11:25.933876,0.204237
+2025-07-12 11:12:26.008076,0.204247
+2025-07-12 11:13:26.109799,0.204256
+2025-07-12 11:14:26.412288,0.204265
+2025-07-12 11:15:26.550846,0.204265
+2025-07-12 11:16:26.647698,0.204262
+2025-07-12 11:17:26.750323,0.204266
+2025-07-12 11:18:27.128937,0.20427
+2025-07-12 11:19:27.211867,0.20427
+2025-07-12 11:20:27.270010,0.204275
+2025-07-12 11:21:27.560082,0.204269
+2025-07-12 11:22:27.637812,0.204269
+2025-07-12 11:23:27.894306,0.204731
+2025-07-12 11:24:28.006278,0.204754
+2025-07-12 11:25:28.086281,0.20477
+2025-07-12 11:26:28.384983,0.204782
+2025-07-12 11:27:28.477007,0.204782
+2025-07-12 11:29:11.815425,0.204829
+2025-07-12 11:30:12.111132,0.204848
+2025-07-12 11:31:12.186504,0.204848
+2025-07-12 11:32:12.244391,0.204842
+2025-07-12 11:33:12.527348,0.204842
+2025-07-12 11:34:12.634371,0.204842
+2025-07-12 11:35:12.745927,0.204805
+2025-07-12 11:36:12.821195,0.20477
+2025-07-12 11:37:13.102544,0.204772
+2025-07-12 11:38:13.178696,0.204772
+2025-07-12 11:39:13.276905,0.204729
+2025-07-12 11:40:13.588992,0.204712
+2025-07-12 11:41:13.708517,0.204712
+2025-07-12 11:42:13.810385,0.204647
+2025-07-12 11:43:13.923122,0.204646
+2025-07-12 11:44:14.288866,0.20465
+2025-07-12 11:45:14.361350,0.20465
+2025-07-12 11:46:14.429814,0.204629
+2025-07-12 11:47:14.687656,0.204609
+2025-07-12 11:48:14.795578,0.204609
+2025-07-12 11:49:14.919511,0.204591
+2025-07-12 11:50:15.268048,0.203951
+2025-07-12 11:51:15.345935,0.203951
+2025-07-12 11:52:15.428863,0.203836
+2025-07-12 11:53:15.707416,0.203823
+2025-07-12 11:54:15.821571,0.203823
+2025-07-12 11:55:15.943186,0.203798
+2025-07-12 11:56:16.033260,0.203773
+2025-07-12 11:57:16.313491,0.203724
+2025-07-12 11:58:16.430030,0.203724
+2025-07-12 11:59:16.518939,0.203722
+2025-07-12 12:00:16.805411,0.203762
+2025-07-12 12:01:16.913239,0.203762
+2025-07-12 12:02:17.014119,0.203788
+2025-07-12 12:03:17.318518,0.203843
+2025-07-12 12:04:17.415426,0.203843
+2025-07-12 12:05:17.519386,0.203885
+2025-07-12 12:06:17.575662,0.203919
+2025-07-12 12:07:17.871262,0.203943
+2025-07-12 12:08:17.989179,0.203943
+2025-07-12 12:09:18.083661,0.203946
+2025-07-12 12:10:18.394158,0.203942
+2025-07-12 12:11:18.489602,0.203942
+2025-07-12 12:12:18.571762,0.203895
+2025-07-12 12:13:18.662508,0.203891
+2025-07-12 12:14:18.994838,0.203893
+2025-07-12 12:15:19.326591,0.203893
+2025-07-12 12:16:19.419084,0.203893
+2025-07-12 12:17:19.504520,0.203895
+2025-07-12 12:18:19.802271,0.204136
+2025-07-12 12:19:19.898045,0.204136
+2025-07-12 12:20:20.045335,0.204123
+2025-07-12 12:21:20.377810,0.204037
+2025-07-12 12:22:20.470589,0.204037
+2025-07-12 12:23:20.530601,0.204036
+2025-07-12 12:24:20.839676,0.203992
+2025-07-12 12:25:20.947848,0.203992
+2025-07-12 12:26:21.009039,0.20397
+2025-07-12 12:27:21.308847,0.203952
+2025-07-12 12:28:21.543609,0.203952
+2025-07-12 12:29:21.637513,0.20396
+2025-07-12 12:30:21.964025,0.203964
+2025-07-12 12:31:22.258168,0.203961
+2025-07-12 12:32:22.334074,0.203961
+2025-07-12 12:33:22.417965,0.203941
+2025-07-12 12:34:22.744501,0.203935
+2025-07-12 12:35:22.810999,0.203935
+2025-07-12 12:36:22.882883,0.203958
+2025-07-12 12:37:23.027164,0.203947
+2025-07-12 12:38:23.353603,0.203933
+2025-07-12 12:39:23.455582,0.203933
+2025-07-12 12:40:23.518645,0.203899
+2025-07-12 12:41:23.807450,0.203892
+2025-07-12 12:42:23.896913,0.203892
+2025-07-12 12:43:23.990597,0.203837
+2025-07-12 12:44:24.298869,0.202668
+2025-07-12 12:45:24.387356,0.202668
+2025-07-12 12:46:24.446713,0.202637
+2025-07-12 12:47:24.528680,0.202657
+2025-07-12 12:48:24.861712,0.202599
+2025-07-12 12:49:24.941519,0.202599
+2025-07-12 12:50:25.044807,0.202523
+2025-07-12 12:51:25.362544,0.202444
+2025-07-12 12:52:25.476296,0.202444
+2025-07-12 12:53:25.572585,0.202414
+2025-07-12 12:54:25.904967,0.202294
+2025-07-12 12:55:25.995353,0.202294
+2025-07-12 12:56:26.099496,0.202298
+2025-07-12 12:57:26.448928,0.202301
+2025-07-12 12:58:26.556924,0.202301
+2025-07-12 12:59:26.633806,0.20225
+2025-07-12 13:00:26.727339,0.202251
+2025-07-12 13:01:27.013859,0.20225
+2025-07-12 13:02:27.278146,0.202265
+2025-07-12 13:03:27.342533,0.202265
+2025-07-12 13:04:27.428342,0.202309
+2025-07-12 13:05:27.540853,0.202304
+2025-07-12 13:06:27.860535,0.202273
+2025-07-12 13:07:27.922024,0.202273
+2025-07-12 13:08:27.996209,0.202176
+2025-07-12 13:09:28.316826,0.202117
+2025-07-12 13:10:28.633485,0.202117
+2025-07-12 13:11:28.690125,0.200724
+2025-07-12 13:12:28.997023,0.200702
+2025-07-12 13:13:29.265676,0.200697
+2025-07-12 13:14:29.372932,0.200697
+2025-07-12 13:15:29.511863,0.200675
+2025-07-12 13:16:29.605217,0.200671
+2025-07-12 13:17:29.942214,0.20068
+2025-07-12 13:18:30.012649,0.20068
+2025-07-12 13:19:30.113986,0.200705
+2025-07-12 13:20:30.477566,0.200778
+2025-07-12 13:21:30.556773,0.200778
+2025-07-12 13:22:30.659827,0.200813
+2025-07-12 13:23:30.750327,0.200841
+2025-07-12 13:24:31.095265,0.200865
+2025-07-12 13:25:31.196040,0.200865
+2025-07-12 13:26:31.440296,0.200887
+2025-07-12 13:27:31.583346,0.200893
+2025-07-12 13:28:32.082413,0.200914
+2025-07-12 13:29:32.169440,0.200914
+2025-07-12 13:30:32.358675,0.200928

+ 530 - 0
duplicati_logs.dat

@@ -0,0 +1,530 @@
+            {
+  "DeletedFiles": 0,
+  "DeletedFolders": 0,
+  "ModifiedFiles": 34,
+  "ExaminedFiles": 571,
+  "OpenedFiles": 34,
+  "AddedFiles": 0,
+  "SizeOfModifiedFiles": 2127635931,
+  "SizeOfAddedFiles": 0,
+  "SizeOfExaminedFiles": 2996561658,
+  "SizeOfOpenedFiles": 2127635931,
+  "NotProcessedFiles": 0,
+  "AddedFolders": 0,
+  "TooLargeFiles": 0,
+  "FilesWithError": 0,
+  "ModifiedFolders": 0,
+  "ModifiedSymlinks": 0,
+  "AddedSymlinks": 0,
+  "DeletedSymlinks": 0,
+  "PartialBackup": false,
+  "Dryrun": false,
+  "MainOperation": "Backup",
+  "CompactResults": null,
+  "VacuumResults": null,
+  "DeleteResults": null,
+  "RepairResults": null,
+  "TestResults": {
+    "MainOperation": "Test",
+    "VerificationsActualLength": 3,
+    "Verifications": [
+      {
+        "Key": "duplicati-20250606T180035Z.dlist.zip",
+        "Value": []
+      },
+      {
+        "Key": "duplicati-i95f388889f794cda876f68307463db1c.dindex.zip",
+        "Value": []
+      },
+      {
+        "Key": "duplicati-baccb72e1603345b9ab63e13498fb160a.dblock.zip",
+        "Value": []
+      }
+    ],
+    "ParsedResult": "Success",
+    "Interrupted": false,
+    "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+    "EndTime": "2025-06-06T18:01:18.0573596Z",
+    "BeginTime": "2025-06-06T18:01:17.4476562Z",
+    "Duration": "00:00:00.6097034",
+    "MessagesActualLength": 0,
+    "WarningsActualLength": 0,
+    "ErrorsActualLength": 0,
+    "Messages": null,
+    "Warnings": null,
+    "Errors": null,
+    "BackendStatistics": {
+      "RemoteCalls": 12,
+      "BytesUploaded": 109568770,
+      "BytesDownloaded": 51812289,
+      "FilesUploaded": 7,
+      "FilesDownloaded": 3,
+      "FilesDeleted": 0,
+      "FoldersCreated": 0,
+      "RetryAttempts": 0,
+      "UnknownFileSize": 0,
+      "UnknownFileCount": 0,
+      "KnownFileCount": 111,
+      "KnownFileSize": 2344188455,
+      "LastBackupDate": "2025-06-07T02:00:35+08:00",
+      "BackupListCount": 11,
+      "TotalQuotaSpace": 1932937191424,
+      "FreeQuotaSpace": 541474566144,
+      "AssignedQuotaSpace": -1,
+      "ReportedQuotaError": false,
+      "ReportedQuotaWarning": false,
+      "MainOperation": "Backup",
+      "ParsedResult": "Success",
+      "Interrupted": false,
+      "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+      "EndTime": "0001-01-01T00:00:00",
+      "BeginTime": "2025-06-06T18:00:35.070372Z",
+      "Duration": "00:00:00",
+      "MessagesActualLength": 0,
+      "WarningsActualLength": 0,
+      "ErrorsActualLength": 0,
+      "Messages": null,
+      "Warnings": null,
+      "Errors": null
+    }
+  },
+  "ParsedResult": "Success",
+  "Interrupted": false,
+  "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+  "EndTime": "2025-06-06T18:01:18.126632Z",
+  "BeginTime": "2025-06-06T18:00:35.070144Z",
+  "Duration": "00:00:43.0564880",
+  "MessagesActualLength": 26,
+  "WarningsActualLength": 0,
+  "ErrorsActualLength": 0,
+  "Messages": [
+    "2025-06-07 02:00:35 +08 - [Information-Duplicati.Library.Main.Controller-StartingOperation]: The operation Backup has started",
+    "2025-06-07 02:00:35 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()",
+    "2025-06-07 02:00:36 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (104 bytes)",
+    "2025-06-07 02:01:03 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-bdaf870a1768f469ca8eb61d423b9bcd5.dblock.zip (49.183 MB)",
+    "2025-06-07 02:01:04 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-bdaf870a1768f469ca8eb61d423b9bcd5.dblock.zip (49.183 MB)",
+    "2025-06-07 02:01:04 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-i4f7610cdf30c4447a094496d15febb8c.dindex.zip (21.729 KB)",
+    "2025-06-07 02:01:04 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-i4f7610cdf30c4447a094496d15febb8c.dindex.zip (21.729 KB)",
+    "2025-06-07 02:01:12 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-b2a416ec195264354951a196eade5f9d1.dblock.zip (49.049 MB)",
+    "2025-06-07 02:01:12 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-b2a416ec195264354951a196eade5f9d1.dblock.zip (49.049 MB)",
+    "2025-06-07 02:01:12 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-i14b4cbdea33a496a91de790e084f07b2.dindex.zip (64.781 KB)",
+    "2025-06-07 02:01:12 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-i14b4cbdea33a496a91de790e084f07b2.dindex.zip (64.781 KB)",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-b6760ebebea4d4715b4c16a22ef089c0d.dblock.zip (6.139 MB)",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-b6760ebebea4d4715b4c16a22ef089c0d.dblock.zip (6.139 MB)",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-ibd51d1087b8b4b49b06abac02b68575c.dindex.zip (7.596 KB)",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-ibd51d1087b8b4b49b06abac02b68575c.dindex.zip (7.596 KB)",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-20250606T180035Z.dlist.zip (31.218 KB)",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-20250606T180035Z.dlist.zip (31.218 KB)",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (111 bytes)",
+    "2025-06-07 02:01:17 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20250606T180035Z.dlist.zip (31.218 KB)"
+  ],
+  "Warnings": [],
+  "Errors": [],
+  "BackendStatistics": {
+    "RemoteCalls": 12,
+    "BytesUploaded": 109568770,
+    "BytesDownloaded": 51812289,
+    "FilesUploaded": 7,
+    "FilesDownloaded": 3,
+    "FilesDeleted": 0,
+    "FoldersCreated": 0,
+    "RetryAttempts": 0,
+    "UnknownFileSize": 0,
+    "UnknownFileCount": 0,
+    "KnownFileCount": 111,
+    "KnownFileSize": 2344188455,
+    "LastBackupDate": "2025-06-07T02:00:35+08:00",
+    "BackupListCount": 11,
+    "TotalQuotaSpace": 1932937191424,
+    "FreeQuotaSpace": 541474566144,
+    "AssignedQuotaSpace": -1,
+    "ReportedQuotaError": false,
+    "ReportedQuotaWarning": false,
+    "MainOperation": "Backup",
+    "ParsedResult": "Success",
+    "Interrupted": false,
+    "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+    "EndTime": "0001-01-01T00:00:00",
+    "BeginTime": "2025-06-06T18:00:35.070372Z",
+    "Duration": "00:00:00",
+    "MessagesActualLength": 0,
+    "WarningsActualLength": 0,
+    "ErrorsActualLength": 0,
+    "Messages": null,
+    "Warnings": null,
+    "Errors": null
+  }
+}
+
+            {
+  "DeletedFiles": 0,
+  "DeletedFolders": 0,
+  "ModifiedFiles": 19,
+  "ExaminedFiles": 571,
+  "OpenedFiles": 19,
+  "AddedFiles": 0,
+  "SizeOfModifiedFiles": 193046004,
+  "SizeOfAddedFiles": 0,
+  "SizeOfExaminedFiles": 2995513107,
+  "SizeOfOpenedFiles": 193046004,
+  "NotProcessedFiles": 0,
+  "AddedFolders": 0,
+  "TooLargeFiles": 0,
+  "FilesWithError": 0,
+  "ModifiedFolders": 0,
+  "ModifiedSymlinks": 0,
+  "AddedSymlinks": 0,
+  "DeletedSymlinks": 0,
+  "PartialBackup": false,
+  "Dryrun": false,
+  "MainOperation": "Backup",
+  "CompactResults": null,
+  "VacuumResults": null,
+  "DeleteResults": null,
+  "RepairResults": null,
+  "TestResults": {
+    "MainOperation": "Test",
+    "VerificationsActualLength": 3,
+    "Verifications": [
+      {
+        "Key": "duplicati-20250601T132303Z.dlist.zip",
+        "Value": []
+      },
+      {
+        "Key": "duplicati-i0dbb1324b6b1445a95ef6b23606a6d75.dindex.zip",
+        "Value": []
+      },
+      {
+        "Key": "duplicati-be79958a0daeb496a9e3e6fc2df5ed07d.dblock.zip",
+        "Value": []
+      }
+    ],
+    "ParsedResult": "Success",
+    "Interrupted": false,
+    "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+    "EndTime": "2025-06-01T13:23:06.9815733Z",
+    "BeginTime": "2025-06-01T13:23:06.5046701Z",
+    "Duration": "00:00:00.4769032",
+    "MessagesActualLength": 0,
+    "WarningsActualLength": 0,
+    "ErrorsActualLength": 0,
+    "Messages": null,
+    "Warnings": null,
+    "Errors": null,
+    "BackendStatistics": {
+      "RemoteCalls": 8,
+      "BytesUploaded": 1976262,
+      "BytesDownloaded": 51647357,
+      "FilesUploaded": 3,
+      "FilesDownloaded": 3,
+      "FilesDeleted": 0,
+      "FoldersCreated": 0,
+      "RetryAttempts": 0,
+      "UnknownFileSize": 0,
+      "UnknownFileCount": 0,
+      "KnownFileCount": 104,
+      "KnownFileSize": 2234619685,
+      "LastBackupDate": "2025-06-01T21:23:03+08:00",
+      "BackupListCount": 10,
+      "TotalQuotaSpace": 1932937191424,
+      "FreeQuotaSpace": 549558972416,
+      "AssignedQuotaSpace": -1,
+      "ReportedQuotaError": false,
+      "ReportedQuotaWarning": false,
+      "MainOperation": "Backup",
+      "ParsedResult": "Success",
+      "Interrupted": false,
+      "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+      "EndTime": "0001-01-01T00:00:00",
+      "BeginTime": "2025-06-01T13:23:03.6638236Z",
+      "Duration": "00:00:00",
+      "MessagesActualLength": 0,
+      "WarningsActualLength": 0,
+      "ErrorsActualLength": 0,
+      "Messages": null,
+      "Warnings": null,
+      "Errors": null
+    }
+  },
+  "ParsedResult": "Success",
+  "Interrupted": false,
+  "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+  "EndTime": "2025-06-01T13:23:07.0592437Z",
+  "BeginTime": "2025-06-01T13:23:03.6635855Z",
+  "Duration": "00:00:03.3956582",
+  "MessagesActualLength": 18,
+  "WarningsActualLength": 0,
+  "ErrorsActualLength": 0,
+  "Messages": [
+    "2025-06-01 21:23:03 +08 - [Information-Duplicati.Library.Main.Controller-StartingOperation]: The operation Backup has started",
+    "2025-06-01 21:23:03 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()",
+    "2025-06-01 21:23:03 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (101 bytes)",
+    "2025-06-01 21:23:05 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-b25b3c6258b8d461aabcccd9752ec8fbb.dblock.zip (1.845 MB)",
+    "2025-06-01 21:23:05 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-b25b3c6258b8d461aabcccd9752ec8fbb.dblock.zip (1.845 MB)",
+    "2025-06-01 21:23:05 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-ia7ad0ed4d81945fd8b7ce81e340ba64a.dindex.zip (9.375 KB)",
+    "2025-06-01 21:23:05 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-ia7ad0ed4d81945fd8b7ce81e340ba64a.dindex.zip (9.375 KB)",
+    "2025-06-01 21:23:05 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-20250601T132303Z.dlist.zip (31.347 KB)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-20250601T132303Z.dlist.zip (31.347 KB)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (104 bytes)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20250601T132303Z.dlist.zip (31.347 KB)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20250601T132303Z.dlist.zip (31.347 KB)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-i0dbb1324b6b1445a95ef6b23606a6d75.dindex.zip (57.191 KB)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-i0dbb1324b6b1445a95ef6b23606a6d75.dindex.zip (57.191 KB)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-be79958a0daeb496a9e3e6fc2df5ed07d.dblock.zip (49.168 MB)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-be79958a0daeb496a9e3e6fc2df5ed07d.dblock.zip (49.168 MB)",
+    "2025-06-01 21:23:06 +08 - [Information-Duplicati.Library.Main.Operation.TestHandler-Test results]: Successfully verified 3 remote files"
+  ],
+  "Warnings": [],
+  "Errors": [],
+  "BackendStatistics": {
+    "RemoteCalls": 8,
+    "BytesUploaded": 1976262,
+    "BytesDownloaded": 51647357,
+    "FilesUploaded": 3,
+    "FilesDownloaded": 3,
+    "FilesDeleted": 0,
+    "FoldersCreated": 0,
+    "RetryAttempts": 0,
+    "UnknownFileSize": 0,
+    "UnknownFileCount": 0,
+    "KnownFileCount": 104,
+    "KnownFileSize": 2234619685,
+    "LastBackupDate": "2025-06-01T21:23:03+08:00",
+    "BackupListCount": 10,
+    "TotalQuotaSpace": 1932937191424,
+    "FreeQuotaSpace": 549558972416,
+    "AssignedQuotaSpace": -1,
+    "ReportedQuotaError": false,
+    "ReportedQuotaWarning": false,
+    "MainOperation": "Backup",
+    "ParsedResult": "Success",
+    "Interrupted": false,
+    "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+    "EndTime": "0001-01-01T00:00:00",
+    "BeginTime": "2025-06-01T13:23:03.6638236Z",
+    "Duration": "00:00:00",
+    "MessagesActualLength": 0,
+    "WarningsActualLength": 0,
+    "ErrorsActualLength": 0,
+    "Messages": null,
+    "Warnings": null,
+    "Errors": null
+  }
+}
+                
+            {
+  "DeletedFiles": 2,
+  "DeletedFolders": 2,
+  "ModifiedFiles": 3,
+  "ExaminedFiles": 89012,
+  "OpenedFiles": 4,
+  "AddedFiles": 1,
+  "SizeOfModifiedFiles": 38505459,
+  "SizeOfAddedFiles": 1274,
+  "SizeOfExaminedFiles": 7567305219,
+  "SizeOfOpenedFiles": 38506733,
+  "NotProcessedFiles": 0,
+  "AddedFolders": 0,
+  "TooLargeFiles": 0,
+  "FilesWithError": 0,
+  "ModifiedFolders": 0,
+  "ModifiedSymlinks": 0,
+  "AddedSymlinks": 0,
+  "DeletedSymlinks": 0,
+  "PartialBackup": false,
+  "Dryrun": false,
+  "MainOperation": "Backup",
+  "CompactResults": {
+    "DeletedFileCount": 0,
+    "DownloadedFileCount": 0,
+    "UploadedFileCount": 0,
+    "DeletedFileSize": 0,
+    "DownloadedFileSize": 0,
+    "UploadedFileSize": 0,
+    "Dryrun": false,
+    "VacuumResults": null,
+    "MainOperation": "Compact",
+    "ParsedResult": "Success",
+    "Interrupted": false,
+    "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+    "EndTime": "2025-06-06T18:22:30.7812878Z",
+    "BeginTime": "2025-06-06T18:22:12.6301317Z",
+    "Duration": "00:00:18.1511561",
+    "MessagesActualLength": 0,
+    "WarningsActualLength": 0,
+    "ErrorsActualLength": 0,
+    "Messages": null,
+    "Warnings": null,
+    "Errors": null,
+    "BackendStatistics": {
+      "RemoteCalls": 8,
+      "BytesUploaded": 20594437,
+      "BytesDownloaded": 71631301,
+      "FilesUploaded": 3,
+      "FilesDownloaded": 3,
+      "FilesDeleted": 0,
+      "FoldersCreated": 0,
+      "RetryAttempts": 0,
+      "UnknownFileSize": 0,
+      "UnknownFileCount": 0,
+      "KnownFileCount": 226,
+      "KnownFileSize": 5475247460,
+      "LastBackupDate": "2025-06-07T02:01:27+08:00",
+      "BackupListCount": 8,
+      "TotalQuotaSpace": 1932937191424,
+      "FreeQuotaSpace": 541453942784,
+      "AssignedQuotaSpace": -1,
+      "ReportedQuotaError": false,
+      "ReportedQuotaWarning": false,
+      "MainOperation": "Backup",
+      "ParsedResult": "Success",
+      "Interrupted": false,
+      "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+      "EndTime": "0001-01-01T00:00:00",
+      "BeginTime": "2025-06-06T18:01:27.3427176Z",
+      "Duration": "00:00:00",
+      "MessagesActualLength": 0,
+      "WarningsActualLength": 0,
+      "ErrorsActualLength": 0,
+      "Messages": null,
+      "Warnings": null,
+      "Errors": null
+    }
+  },
+  "VacuumResults": null,
+  "DeleteResults": null,
+  "RepairResults": null,
+  "TestResults": {
+    "MainOperation": "Test",
+    "VerificationsActualLength": 3,
+    "Verifications": [
+      {
+        "Key": "duplicati-20250606T180127Z.dlist.zip",
+        "Value": []
+      },
+      {
+        "Key": "duplicati-iace1fd90f9254afeb2456210423381a9.dindex.zip",
+        "Value": []
+      },
+      {
+        "Key": "duplicati-b9fd4462dccd247d487a4c7ca9a9ff9e1.dblock.zip",
+        "Value": []
+      }
+    ],
+    "ParsedResult": "Success",
+    "Interrupted": false,
+    "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+    "EndTime": "2025-06-06T18:22:32.2138061Z",
+    "BeginTime": "2025-06-06T18:22:30.8777049Z",
+    "Duration": "00:00:01.3361012",
+    "MessagesActualLength": 0,
+    "WarningsActualLength": 0,
+    "ErrorsActualLength": 0,
+    "Messages": null,
+    "Warnings": null,
+    "Errors": null,
+    "BackendStatistics": {
+      "RemoteCalls": 8,
+      "BytesUploaded": 20594437,
+      "BytesDownloaded": 71631301,
+      "FilesUploaded": 3,
+      "FilesDownloaded": 3,
+      "FilesDeleted": 0,
+      "FoldersCreated": 0,
+      "RetryAttempts": 0,
+      "UnknownFileSize": 0,
+      "UnknownFileCount": 0,
+      "KnownFileCount": 226,
+      "KnownFileSize": 5475247460,
+      "LastBackupDate": "2025-06-07T02:01:27+08:00",
+      "BackupListCount": 8,
+      "TotalQuotaSpace": 1932937191424,
+      "FreeQuotaSpace": 541453942784,
+      "AssignedQuotaSpace": -1,
+      "ReportedQuotaError": false,
+      "ReportedQuotaWarning": false,
+      "MainOperation": "Backup",
+      "ParsedResult": "Success",
+      "Interrupted": false,
+      "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+      "EndTime": "0001-01-01T00:00:00",
+      "BeginTime": "2025-06-06T18:01:27.3427176Z",
+      "Duration": "00:00:00",
+      "MessagesActualLength": 0,
+      "WarningsActualLength": 0,
+      "ErrorsActualLength": 0,
+      "Messages": null,
+      "Warnings": null,
+      "Errors": null
+    }
+  },
+  "ParsedResult": "Success",
+  "Interrupted": false,
+  "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+  "EndTime": "2025-06-06T18:22:32.2833489Z",
+  "BeginTime": "2025-06-06T18:01:27.3424975Z",
+  "Duration": "00:21:04.9408514",
+  "MessagesActualLength": 19,
+  "WarningsActualLength": 0,
+  "ErrorsActualLength": 0,
+  "Messages": [
+    "2025-06-07 02:01:27 +08 - [Information-Duplicati.Library.Main.Controller-StartingOperation]: The operation Backup has started",
+    "2025-06-07 02:02:33 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()",
+    "2025-06-07 02:02:34 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (223 bytes)",
+    "2025-06-07 02:21:52 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-bd28a40a8f4ad44e09b12f16c78f16b1c.dblock.zip (1.039 MB)",
+    "2025-06-07 02:22:08 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-bd28a40a8f4ad44e09b12f16c78f16b1c.dblock.zip (1.039 MB)",
+    "2025-06-07 02:22:08 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-i1db5e187d0f6448283e575bed2b0ada0.dindex.zip (2.666 KB)",
+    "2025-06-07 02:22:08 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-i1db5e187d0f6448283e575bed2b0ada0.dindex.zip (2.666 KB)",
+    "2025-06-07 02:22:12 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Started: duplicati-20250606T180127Z.dlist.zip (18.599 MB)",
+    "2025-06-07 02:22:12 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Put - Completed: duplicati-20250606T180127Z.dlist.zip (18.599 MB)",
+    "2025-06-07 02:22:30 +08 - [Information-Duplicati.Library.Main.Database.LocalDeleteDatabase-CompactReason]: Compacting not required",
+    "2025-06-07 02:22:30 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Started:  ()",
+    "2025-06-07 02:22:30 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: List - Completed:  (226 bytes)",
+    "2025-06-07 02:22:30 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-20250606T180127Z.dlist.zip (18.599 MB)",
+    "2025-06-07 02:22:31 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-20250606T180127Z.dlist.zip (18.599 MB)",
+    "2025-06-07 02:22:31 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-iace1fd90f9254afeb2456210423381a9.dindex.zip (21.259 KB)",
+    "2025-06-07 02:22:31 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-iace1fd90f9254afeb2456210423381a9.dindex.zip (21.259 KB)",
+    "2025-06-07 02:22:31 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Started: duplicati-b9fd4462dccd247d487a4c7ca9a9ff9e1.dblock.zip (49.693 MB)",
+    "2025-06-07 02:22:32 +08 - [Information-Duplicati.Library.Main.BasicResults-BackendEvent]: Backend event: Get - Completed: duplicati-b9fd4462dccd247d487a4c7ca9a9ff9e1.dblock.zip (49.693 MB)",
+    "2025-06-07 02:22:32 +08 - [Information-Duplicati.Library.Main.Operation.TestHandler-Test results]: Successfully verified 3 remote files"
+  ],
+  "Warnings": [],
+  "Errors": [],
+  "BackendStatistics": {
+    "RemoteCalls": 8,
+    "BytesUploaded": 20594437,
+    "BytesDownloaded": 71631301,
+    "FilesUploaded": 3,
+    "FilesDownloaded": 3,
+    "FilesDeleted": 0,
+    "FoldersCreated": 0,
+    "RetryAttempts": 0,
+    "UnknownFileSize": 0,
+    "UnknownFileCount": 0,
+    "KnownFileCount": 226,
+    "KnownFileSize": 5475247460,
+    "LastBackupDate": "2025-06-07T02:01:27+08:00",
+    "BackupListCount": 8,
+    "TotalQuotaSpace": 1932937191424,
+    "FreeQuotaSpace": 541453942784,
+    "AssignedQuotaSpace": -1,
+    "ReportedQuotaError": false,
+    "ReportedQuotaWarning": false,
+    "MainOperation": "Backup",
+    "ParsedResult": "Success",
+    "Interrupted": false,
+    "Version": "2.1.0.4 (2.1.0.4_stable_2025-01-31)",
+    "EndTime": "0001-01-01T00:00:00",
+    "BeginTime": "2025-06-06T18:01:27.3427176Z",
+    "Duration": "00:00:00",
+    "MessagesActualLength": 0,
+    "WarningsActualLength": 0,
+    "ErrorsActualLength": 0,
+    "Messages": null,
+    "Warnings": null,
+    "Errors": null
+  }
+}
+        

+ 0 - 0
extract_duplogs.py


+ 722 - 0
solana_price_history.csv

@@ -0,0 +1,722 @@
+timestamp,price
+2025-06-12 06:03:31.683,159.4339582891906
+2025-06-12 07:03:56.307,159.35512070106296
+2025-06-12 08:03:40.115,158.8405302413346
+2025-06-12 09:03:55.393,159.43614855807454
+2025-06-12 10:04:03.807,159.65714979575358
+2025-06-12 11:03:23.280,158.92722165289916
+2025-06-12 12:03:44.291,157.76631869941315
+2025-06-12 13:00:49.998,158.71217630110033
+2025-06-12 14:04:16.607,158.70592884275712
+2025-06-12 15:03:44.115,160.1597762088316
+2025-06-12 16:04:14.287,156.95141940238707
+2025-06-12 17:03:37.621,158.23971080991763
+2025-06-12 18:03:34.685,160.0571829457579
+2025-06-12 19:03:39.891,157.74577979692478
+2025-06-12 20:08:07.535,154.95007933622563
+2025-06-12 21:01:26.448,152.88643390292663
+2025-06-12 22:03:39.814,152.94595443863273
+2025-06-12 23:03:37.360,152.49720470921662
+2025-06-13 00:03:28.883,152.59908391651598
+2025-06-13 01:03:44.494,145.17037818345085
+2025-06-13 02:03:51.140,143.44511031983149
+2025-06-13 03:03:52.552,142.6289676886977
+2025-06-13 04:03:52.570,144.65071651681623
+2025-06-13 05:03:44.199,144.35932305355016
+2025-06-13 06:03:44.506,143.9863028328253
+2025-06-13 07:03:17.797,144.49947058341488
+2025-06-13 08:03:07.050,145.15836998777021
+2025-06-13 09:03:12.425,144.89044106498926
+2025-06-13 10:03:51.643,144.80254893357974
+2025-06-13 11:03:44.159,144.84683792448672
+2025-06-13 12:01:08.784,145.3539577814692
+2025-06-13 13:03:54.153,145.2787357975951
+2025-06-13 14:01:42.826,145.6692006435052
+2025-06-13 15:03:38.345,146.22458469912817
+2025-06-13 16:03:49.288,147.21198684633745
+2025-06-13 17:03:48.550,147.32499109238574
+2025-06-13 18:03:32.577,146.35042057475965
+2025-06-13 19:03:47.880,145.18113664611542
+2025-06-13 20:01:05.562,145.09068297856587
+2025-06-13 21:03:37.732,147.23919559112144
+2025-06-13 22:03:24.529,147.20280696288933
+2025-06-13 23:03:34.346,147.81288090823634
+2025-06-14 00:03:33.743,148.60593709423736
+2025-06-14 01:03:42.047,148.15230330885197
+2025-06-14 02:03:46.320,146.95888837515045
+2025-06-14 03:03:39.701,146.62230652009998
+2025-06-14 04:03:12.339,146.80894864580833
+2025-06-14 05:03:30.521,146.8254053164512
+2025-06-14 06:03:36.086,146.95119190033247
+2025-06-14 07:03:39.290,146.29981660036108
+2025-06-14 08:03:32.351,146.25345080865495
+2025-06-14 09:03:27.806,145.79890629776156
+2025-06-14 10:03:34.797,145.1569927309189
+2025-06-14 11:03:37.072,145.71071538581435
+2025-06-14 12:00:33.006,145.7709776690506
+2025-06-14 13:01:14.160,145.231368274547
+2025-06-14 14:03:31.645,145.48017692380478
+2025-06-14 15:03:37.947,145.30076518155758
+2025-06-14 16:03:31.040,144.3461452954016
+2025-06-14 17:03:47.082,143.36030674067558
+2025-06-14 18:03:31.716,144.39458972109594
+2025-06-14 19:03:59.420,143.85462414815308
+2025-06-14 20:03:36.736,143.7235153099461
+2025-06-14 21:03:39.804,142.8500042985497
+2025-06-14 22:01:00.335,144.3838726231548
+2025-06-14 23:03:31.691,144.3041533130284
+2025-06-15 00:03:38.588,144.7210910133083
+2025-06-15 01:03:35.203,145.74613241125354
+2025-06-15 02:03:23.922,145.12783957281044
+2025-06-15 03:03:42.002,145.6101861305716
+2025-06-15 04:03:39.955,145.7874009320327
+2025-06-15 05:03:28.121,146.3013957765137
+2025-06-15 06:03:28.128,147.4163560361344
+2025-06-15 07:03:20.320,146.52475249149276
+2025-06-15 08:03:37.411,146.07868824757188
+2025-06-15 09:03:24.406,145.3786539623857
+2025-06-15 10:03:15.075,144.45481201560645
+2025-06-15 11:03:40.118,145.80483996502144
+2025-06-15 12:03:16.023,146.33370766281098
+2025-06-15 13:01:03.145,147.3462841369248
+2025-06-15 14:03:30.665,148.39852145982474
+2025-06-15 15:01:06.547,151.75912372971797
+2025-06-15 16:03:50.581,151.1631360453211
+2025-06-15 17:03:39.965,151.81920920178865
+2025-06-15 18:03:51.840,152.3477156881299
+2025-06-15 19:03:39.556,152.59889790698526
+2025-06-15 20:03:39.668,152.24622522398943
+2025-06-15 21:03:31.141,149.03011161052055
+2025-06-15 22:03:38.328,150.53223214329526
+2025-06-15 23:03:16.723,152.11673393622087
+2025-06-16 00:03:35.413,152.8068317762883
+2025-06-16 01:03:09.894,151.90764185434233
+2025-06-16 02:03:40.421,156.13666168398728
+2025-06-16 03:03:43.195,155.83884584001194
+2025-06-16 04:03:30.444,155.63406074895616
+2025-06-16 05:03:34.887,156.92431543793316
+2025-06-16 06:03:30.148,156.93504844529008
+2025-06-16 07:03:36.946,156.5695009503442
+2025-06-16 08:03:20.799,157.2073137592135
+2025-06-16 09:03:18.098,156.87603091684662
+2025-06-16 10:03:45.725,156.39960939570867
+2025-06-16 11:03:38.218,156.0639154549836
+2025-06-16 12:03:09.290,156.39543816671352
+2025-06-16 13:03:54.598,155.47388643363954
+2025-06-16 14:03:08.555,156.36596781582503
+2025-06-16 15:01:26.580,156.6925216836
+2025-06-16 16:03:22.176,156.79058850073312
+2025-06-16 17:03:55.508,157.50906382707558
+2025-06-16 18:03:47.919,157.43068747939665
+2025-06-16 19:03:45.094,157.76022366167484
+2025-06-16 20:03:24.517,157.55617727828994
+2025-06-16 21:03:41.224,157.43781801516425
+2025-06-16 22:03:35.765,156.8863062859663
+2025-06-16 23:03:26.324,153.06050580525653
+2025-06-17 00:03:41.689,150.91948379605867
+2025-06-17 01:03:20.112,151.07911001628455
+2025-06-17 02:03:07.453,151.7902415531673
+2025-06-17 03:03:27.187,152.162802270643
+2025-06-17 04:03:18.886,153.3203809245851
+2025-06-17 05:03:27.247,153.0730112978897
+2025-06-17 06:03:16.623,153.53313447823191
+2025-06-17 07:03:35.878,153.0427462208847
+2025-06-17 08:03:27.124,152.8927192138737
+2025-06-17 09:03:57.491,151.66148504716895
+2025-06-17 10:13:33.351,151.3181915368275
+2025-06-17 11:03:37.323,151.02953630906975
+2025-06-17 12:03:10.253,150.41042144174287
+2025-06-17 13:00:12.941,150.3975234442073
+2025-06-17 14:03:37.194,149.62600553568686
+2025-06-17 15:03:35.800,149.40607227480993
+2025-06-17 16:03:31.574,147.5231498237084
+2025-06-17 17:03:48.581,146.2488853463953
+2025-06-17 18:03:46.292,146.40729163045455
+2025-06-17 19:03:21.725,147.4606022481061
+2025-06-17 20:03:35.268,149.12669345131178
+2025-06-17 21:03:32.318,148.65330177754186
+2025-06-17 22:03:39.929,147.87920712675668
+2025-06-17 23:03:28.592,146.73556797888924
+2025-06-18 00:03:08.211,147.70907796773494
+2025-06-18 01:03:46.561,148.1125520554111
+2025-06-18 02:02:25.498,147.66183383816022
+2025-06-18 03:03:33.708,147.82914278453123
+2025-06-18 04:02:58.098,148.383963013395
+2025-06-18 05:03:27.160,148.8383444900218
+2025-06-18 06:03:18.896,148.43564608287966
+2025-06-18 07:03:22.802,147.22560226517498
+2025-06-18 08:02:48.527,147.83712659304103
+2025-06-18 09:03:22.370,147.61312073571062
+2025-06-18 10:03:26.505,147.37076237181483
+2025-06-18 11:03:26.103,145.93515640598966
+2025-06-18 12:03:25.762,146.4348817014341
+2025-06-18 13:03:41.652,145.3074156993883
+2025-06-18 14:03:26.867,145.159473426624
+2025-06-18 15:03:23.964,145.3845577397419
+2025-06-18 16:03:43.334,145.72098317261356
+2025-06-18 17:03:28.499,144.70889492886485
+2025-06-18 18:03:29.435,145.63873058582357
+2025-06-18 19:03:20.388,144.66080603858734
+2025-06-18 20:03:36.646,145.08548004030567
+2025-06-18 21:03:33.083,147.47948615894256
+2025-06-18 22:03:28.736,147.34588361282934
+2025-06-18 23:03:21.171,147.55567340057087
+2025-06-19 00:03:30.228,146.3566105516035
+2025-06-19 01:03:30.973,147.16783260875297
+2025-06-19 02:01:51.119,145.8085642375758
+2025-06-19 03:01:15.248,145.79828598883935
+2025-06-19 04:03:05.005,146.50877006495153
+2025-06-19 05:03:24.831,146.3823888837404
+2025-06-19 06:03:34.300,146.21237378420338
+2025-06-19 07:03:27.782,145.17320108141905
+2025-06-19 08:03:24.623,145.18492342622594
+2025-06-19 09:03:50.827,145.3649254935879
+2025-06-19 10:00:13.915,146.0564597020308
+2025-06-19 11:03:30.887,146.15205030566702
+2025-06-19 12:03:39.894,145.12382195269277
+2025-06-19 13:03:23.940,145.20325190364002
+2025-06-19 14:03:30.753,143.97102692270605
+2025-06-19 15:03:49.133,143.27447723395753
+2025-06-19 16:03:28.990,143.21867095688674
+2025-06-19 17:03:16.652,143.4973051592371
+2025-06-19 18:03:45.913,144.89993164783593
+2025-06-19 19:03:27.606,145.11935615554847
+2025-06-19 20:03:36.125,145.55576899616287
+2025-06-19 21:03:35.258,145.2997142688159
+2025-06-19 22:03:36.981,145.7765886127419
+2025-06-19 23:03:38.223,146.81908282697123
+2025-06-20 00:03:34.845,147.07450028681964
+2025-06-20 01:03:46.197,146.98383187228453
+2025-06-20 02:03:32.902,147.07167672474964
+2025-06-20 03:03:06.108,145.86326747351197
+2025-06-20 04:03:16.193,145.51862766261667
+2025-06-20 05:02:32.015,144.54671248234354
+2025-06-20 06:03:12.701,145.39925095354428
+2025-06-20 07:03:10.532,145.48569867379743
+2025-06-20 08:02:59.093,147.36501561383886
+2025-06-20 09:01:48.186,147.36499014925863
+2025-06-20 10:03:02.321,147.72986620473313
+2025-06-20 11:03:05.881,148.55151913812048
+2025-06-20 12:02:57.944,148.2083617047754
+2025-06-20 13:03:33.702,147.6464752642821
+2025-06-20 14:00:51.483,146.71851505404805
+2025-06-20 15:03:26.425,144.69658153712706
+2025-06-20 16:01:07.843,142.9674699242795
+2025-06-20 17:03:22.030,142.36052299901556
+2025-06-20 18:03:35.543,137.83596122869258
+2025-06-20 19:03:28.561,139.24996751248926
+2025-06-20 20:03:39.373,139.38583160857434
+2025-06-20 21:03:47.369,140.96417459475944
+2025-06-20 22:00:54.135,140.29384160061056
+2025-06-20 23:01:33.414,139.07804622060223
+2025-06-21 00:00:54.055,140.06443368517282
+2025-06-21 01:03:22.656,140.00589502582423
+2025-06-21 02:03:02.489,140.2166279240568
+2025-06-21 03:03:37.839,140.00853192541777
+2025-06-21 04:03:14.867,140.81135979658646
+2025-06-21 05:03:44.513,140.23674528031177
+2025-06-21 06:02:13.821,140.40098505293258
+2025-06-21 07:02:44.495,140.44267558963287
+2025-06-21 08:03:21.966,140.57111123015562
+2025-06-21 09:03:39.925,141.3209025631505
+2025-06-21 10:02:53.613,141.8704711379775
+2025-06-21 11:02:25.118,142.12533278291508
+2025-06-21 12:03:05.158,142.33585723174113
+2025-06-21 13:03:34.458,141.79771448104634
+2025-06-21 14:03:38.425,140.8696741670592
+2025-06-21 15:03:39.048,140.44472371832856
+2025-06-21 16:02:41.980,139.7281132691522
+2025-06-21 17:02:19.031,140.2311666107846
+2025-06-21 18:03:30.441,138.70212292703263
+2025-06-21 19:03:22.905,138.25995325067757
+2025-06-21 20:03:33.573,137.64691457338347
+2025-06-21 21:03:28.767,138.6662586812205
+2025-06-21 22:03:19.888,133.1451755076223
+2025-06-21 23:03:40.532,134.13853815729024
+2025-06-22 00:03:23.288,135.0642370364195
+2025-06-22 01:03:19.301,136.88048778730024
+2025-06-22 02:03:30.879,135.34079347794014
+2025-06-22 03:03:27.960,134.6700929957668
+2025-06-22 04:03:23.080,134.84148459323302
+2025-06-22 05:03:31.017,135.88190305444436
+2025-06-22 06:03:13.317,135.88713465153083
+2025-06-22 07:03:36.272,135.80102976151574
+2025-06-22 08:03:16.286,134.87994574554978
+2025-06-22 09:03:12.212,134.76645427759698
+2025-06-22 10:03:32.791,132.78373836676695
+2025-06-22 11:03:24.614,133.26713705377975
+2025-06-22 12:03:06.764,133.1122256004076
+2025-06-22 13:03:35.546,133.20978408613814
+2025-06-22 14:03:39.167,128.83344235578815
+2025-06-22 15:03:36.672,129.91853291311594
+2025-06-22 16:03:16.397,128.6024692686002
+2025-06-22 17:03:41.891,129.60709917998022
+2025-06-22 18:03:04.147,130.5147656822315
+2025-06-22 19:03:43.228,129.5829927773754
+2025-06-22 20:03:43.979,129.11220738430563
+2025-06-22 21:03:24.825,129.48975284957334
+2025-06-22 22:03:43.277,129.0771471680631
+2025-06-22 23:02:18.529,131.91767636305352
+2025-06-23 00:03:18.732,131.68185048043165
+2025-06-23 01:03:33.115,132.6829626797656
+2025-06-23 02:03:37.390,132.85330568268128
+2025-06-23 03:03:34.193,132.85053448457003
+2025-06-23 04:03:24.406,132.69466612332076
+2025-06-23 05:03:33.995,133.1446996124283
+2025-06-23 06:03:46.755,134.47109370118466
+2025-06-23 07:03:21.391,134.05116760799547
+2025-06-23 08:03:19.576,134.3760731095914
+2025-06-23 09:03:39.314,134.3519075544123
+2025-06-23 10:03:25.309,134.34921144929106
+2025-06-23 11:05:31.268,133.87289899159967
+2025-06-23 12:03:00.756,134.18097107370676
+2025-06-23 13:03:31.696,135.03717851290315
+2025-06-23 14:03:04.373,136.55714617959973
+2025-06-23 15:00:28.651,134.92600392583864
+2025-06-23 16:03:30.922,133.50440068703088
+2025-06-23 17:03:30.871,132.1497691297959
+2025-06-23 18:03:35.963,136.79184237495966
+2025-06-23 19:03:18.517,138.2932080064316
+2025-06-23 20:03:37.534,139.67528844665787
+2025-06-23 21:03:37.903,140.96575218108507
+2025-06-23 22:03:10.654,140.9781277143917
+2025-06-23 23:03:22.949,144.75330618967547
+2025-06-24 00:03:31.117,144.64991986155323
+2025-06-24 01:03:29.899,143.4240236027006
+2025-06-24 02:03:10.910,143.61378998349443
+2025-06-24 03:04:14.850,142.72318157455751
+2025-06-24 04:03:24.928,143.42332172621795
+2025-06-24 05:03:10.992,143.3463518279472
+2025-06-24 06:03:24.578,145.50408052269793
+2025-06-24 07:03:40.230,146.2581537411907
+2025-06-24 08:08:04.356,144.64247618925194
+2025-06-24 09:03:19.242,144.18919062011014
+2025-06-24 10:03:31.407,144.26106845150747
+2025-06-24 11:02:53.452,144.20199798518567
+2025-06-24 12:03:34.286,144.46016785282256
+2025-06-24 13:01:08.464,144.45326415182873
+2025-06-24 14:03:16.343,144.03387904089263
+2025-06-24 15:01:01.472,145.16180814587608
+2025-06-24 16:03:40.810,144.3380217969403
+2025-06-24 17:03:07.313,145.81621971390635
+2025-06-24 18:03:36.204,144.9016458673361
+2025-06-24 19:03:26.688,143.94577370641426
+2025-06-24 20:03:42.387,143.30482253588113
+2025-06-24 21:03:27.955,145.04333521171148
+2025-06-24 22:03:47.570,145.35656102917534
+2025-06-24 23:03:43.633,144.9956282307368
+2025-06-25 00:03:24.078,145.92410681470017
+2025-06-25 01:03:30.138,145.8597039715273
+2025-06-25 02:03:45.436,145.92925977084522
+2025-06-25 03:03:26.102,146.088618284409
+2025-06-25 04:02:53.514,145.75059017198714
+2025-06-25 05:02:13.783,145.3531353459336
+2025-06-25 06:03:29.353,145.67321298288402
+2025-06-25 07:02:58.948,146.38238534806317
+2025-06-25 08:02:06.641,147.06488973766827
+2025-06-25 09:03:12.904,145.53382354504618
+2025-06-25 10:03:28.147,145.48050166435934
+2025-06-25 11:01:19.376,145.78266847826964
+2025-06-25 12:03:18.488,146.3268573979758
+2025-06-25 13:03:26.321,146.32849841887963
+2025-06-25 14:03:56.157,147.3824828501501
+2025-06-25 15:01:58.215,145.983497659848
+2025-06-25 16:03:27.484,143.75258987098275
+2025-06-25 17:03:44.871,143.36647841515926
+2025-06-25 18:03:35.069,143.84053931856076
+2025-06-25 19:03:29.422,143.4049288649708
+2025-06-25 20:03:33.950,144.4285238526933
+2025-06-25 21:01:10.666,144.96871445155685
+2025-06-25 22:04:48.170,144.2986276636103
+2025-06-25 23:03:36.658,143.24825165643492
+2025-06-26 00:03:23.257,143.37011953879949
+2025-06-26 01:03:30.636,144.20540507378658
+2025-06-26 02:03:11.009,145.29965575144365
+2025-06-26 03:00:44.311,146.12065162088336
+2025-06-26 04:03:34.247,146.03352418959778
+2025-06-26 05:03:02.222,145.43466927727218
+2025-06-26 06:03:40.756,144.5386403029645
+2025-06-26 07:02:58.427,144.86097603055725
+2025-06-26 08:03:22.382,145.3582394646072
+2025-06-26 09:03:26.261,144.92691651964267
+2025-06-26 10:03:21.786,143.9489562619153
+2025-06-26 11:03:33.114,143.5755982872914
+2025-06-26 12:03:37.508,143.80518438816824
+2025-06-26 13:03:33.443,143.05245586667743
+2025-06-26 14:03:31.816,141.9045017698818
+2025-06-26 15:03:31.964,143.22469547564776
+2025-06-26 16:03:11.442,142.8914955508904
+2025-06-26 17:03:40.769,142.298884433853
+2025-06-26 18:03:05.459,142.06486445712113
+2025-06-26 19:03:30.077,141.53408622803255
+2025-06-26 20:03:45.900,142.42894101430667
+2025-06-26 21:01:28.885,143.05006682114535
+2025-06-26 22:03:45.986,140.35975946305132
+2025-06-26 23:03:35.949,139.28033987264857
+2025-06-27 00:03:54.273,139.01894781145768
+2025-06-27 01:03:49.191,138.0164265682052
+2025-06-27 02:03:43.056,139.50453763737673
+2025-06-27 03:03:46.607,140.9005775058239
+2025-06-27 04:03:08.244,141.47996621955383
+2025-06-27 05:03:52.642,141.41946804246734
+2025-06-27 06:03:39.952,140.85228836809424
+2025-06-27 07:03:45.734,141.21020941797767
+2025-06-27 08:03:52.991,140.4161205977822
+2025-06-27 09:03:48.626,142.26051874415944
+2025-06-27 10:04:00.987,142.11790226483865
+2025-06-27 11:03:15.636,142.03489137090554
+2025-06-27 12:03:46.494,142.1248678348846
+2025-06-27 13:03:30.428,141.61479963819878
+2025-06-27 14:03:20.182,142.50735462394883
+2025-06-27 15:03:45.556,141.8764199886739
+2025-06-27 16:00:23.206,143.42472957988363
+2025-06-27 17:03:32.130,143.81761911686732
+2025-06-27 18:03:28.774,141.4248048617952
+2025-06-27 19:03:50.596,140.6003961382805
+2025-06-27 20:03:47.457,141.82106292379055
+2025-06-27 21:03:54.772,142.73280922120523
+2025-06-27 22:03:33.852,142.8402491435937
+2025-06-27 23:03:47.805,142.78172880555906
+2025-06-28 00:03:51.270,142.11775267774112
+2025-06-28 01:03:38.048,142.1551260236968
+2025-06-28 02:03:41.483,142.19841742777302
+2025-06-28 03:03:30.081,143.10535933621478
+2025-06-28 04:05:13.328,143.45210405219368
+2025-06-28 05:01:23.704,143.30140214639212
+2025-06-28 06:03:42.205,143.93027717119188
+2025-06-28 07:03:39.723,144.70193131108263
+2025-06-28 08:03:40.316,145.91194969967782
+2025-06-28 09:03:17.224,146.36928128093967
+2025-06-28 10:03:41.060,147.36291323033626
+2025-06-28 11:03:44.598,147.03894130441853
+2025-06-28 12:03:52.420,147.3177592427391
+2025-06-28 13:02:02.607,146.57350474249344
+2025-06-28 14:03:17.786,146.1472640860695
+2025-06-28 15:00:37.994,146.88955337648392
+2025-06-28 16:03:37.385,147.98185271310297
+2025-06-28 17:03:26.668,149.2224295048342
+2025-06-28 18:01:40.606,152.15411500191513
+2025-06-28 19:03:36.543,151.06842141055924
+2025-06-28 20:01:01.212,151.06046325255318
+2025-06-28 21:03:32.757,150.3187443922117
+2025-06-28 22:03:38.234,150.89440835578466
+2025-06-28 23:03:49.582,151.02420327144134
+2025-06-29 00:03:09.871,150.79398515242073
+2025-06-29 01:03:20.899,150.6897246178393
+2025-06-29 02:03:31.785,150.33219495425024
+2025-06-29 03:03:22.574,149.88778508284472
+2025-06-29 04:03:47.727,149.6388391873123
+2025-06-29 05:03:36.377,149.82656073123727
+2025-06-29 06:03:02.183,149.7791973101968
+2025-06-29 07:02:57.984,149.79985200408203
+2025-06-29 08:00:44.792,150.05841766986558
+2025-06-29 09:03:45.239,150.75541887108915
+2025-06-29 10:03:15.277,151.35608687778424
+2025-06-29 11:01:30.650,151.48101375469545
+2025-06-29 12:03:45.908,151.64385262901973
+2025-06-29 13:00:39.093,151.69563147756332
+2025-06-29 14:03:46.278,151.6479840010821
+2025-06-29 15:00:28.350,151.4385233415892
+2025-06-29 16:03:27.109,150.96428993220883
+2025-06-29 17:00:11.752,150.1879046638605
+2025-06-29 18:00:49.183,151.17195356378784
+2025-06-29 19:03:54.294,151.96504054523248
+2025-06-29 20:00:33.306,151.22950596975053
+2025-06-29 21:02:24.311,151.05698333224382
+2025-06-29 22:03:47.311,151.79364620295362
+2025-06-29 23:02:37.681,153.29851504223384
+2025-06-30 00:00:47.762,153.31956096800286
+2025-06-30 01:03:36.465,152.68174317996855
+2025-06-30 02:03:48.273,152.15744221260107
+2025-06-30 03:03:30.620,152.25383211570565
+2025-06-30 04:03:46.329,151.84271540247678
+2025-06-30 05:03:37.368,151.40587454105872
+2025-06-30 06:03:40.656,151.26680059988288
+2025-06-30 07:03:26.444,150.53168681158292
+2025-06-30 08:00:52.221,150.6859603105713
+2025-06-30 09:03:46.349,149.8618247036634
+2025-06-30 10:03:48.164,150.01668954291654
+2025-06-30 11:02:11.950,150.34599124286518
+2025-06-30 12:01:04.014,150.57802952137723
+2025-06-30 13:03:40.450,150.00034630331365
+2025-06-30 14:03:15.418,150.92450862848102
+2025-06-30 15:02:16.183,151.463245350001
+2025-06-30 16:02:53.663,158.15625509136015
+2025-06-30 17:03:20.913,156.8599364873401
+2025-06-30 18:03:40.991,157.0244931831695
+2025-06-30 19:03:36.005,155.81811870266935
+2025-06-30 20:03:39.724,157.53177632784235
+2025-06-30 21:03:54.077,157.01112029122154
+2025-06-30 22:03:19.526,155.94447127542168
+2025-06-30 23:00:17.003,155.26453088012204
+2025-07-01 00:03:43.718,154.95869922526998
+2025-07-01 01:03:23.991,154.71867386875593
+2025-07-01 02:03:22.693,154.57595978081008
+2025-07-01 03:03:32.234,153.44028170395455
+2025-07-01 04:03:30.337,153.81641455261123
+2025-07-01 05:03:03.527,152.6466857882984
+2025-07-01 06:03:27.873,151.42567723124364
+2025-07-01 07:03:22.758,151.37443147960093
+2025-07-01 08:03:46.940,150.30098057250808
+2025-07-01 09:04:59.472,149.19953716590302
+2025-07-01 10:01:15.505,149.14753636034217
+2025-07-01 11:01:37.341,148.98853853952897
+2025-07-01 12:03:28.229,148.7757049535392
+2025-07-01 13:03:21.723,148.38067925476804
+2025-07-01 14:00:55.129,148.27537742674684
+2025-07-01 15:03:22.125,147.03029078484184
+2025-07-01 16:00:50.853,147.34903235254558
+2025-07-01 17:03:49.636,148.18185853856073
+2025-07-01 18:03:40.934,147.8533531918737
+2025-07-01 19:03:46.449,146.26402783353277
+2025-07-01 20:03:31.583,145.8340632319003
+2025-07-01 21:02:14.977,146.5500509245554
+2025-07-01 22:03:29.442,146.54218697278347
+2025-07-01 23:04:42.815,146.84081992219504
+2025-07-02 00:03:40.224,146.856904652021
+2025-07-02 01:03:30.518,146.77262964835924
+2025-07-02 02:03:46.823,147.80487423705011
+2025-07-02 03:03:27.918,148.31385478385772
+2025-07-02 04:03:34.382,148.92694580844156
+2025-07-02 05:03:39.649,149.09737863972856
+2025-07-02 06:03:36.690,149.00839031954754
+2025-07-02 07:03:44.389,149.63436209215197
+2025-07-02 08:03:45.154,149.21603947301017
+2025-07-02 09:02:52.679,149.2405769360453
+2025-07-02 10:04:01.734,148.74914024150561
+2025-07-02 11:00:53.145,149.3489320794324
+2025-07-02 12:08:10.329,148.53274360799048
+2025-07-02 13:03:52.219,147.6567148921028
+2025-07-02 14:04:01.960,149.17481542536305
+2025-07-02 15:03:56.169,150.09094362436076
+2025-07-02 16:04:03.751,151.16584682440822
+2025-07-02 17:03:58.303,153.31691986686002
+2025-07-02 18:04:16.197,151.464775792677
+2025-07-02 19:00:49.281,152.2080437120734
+2025-07-02 20:03:40.092,152.78509349869654
+2025-07-02 21:01:20.550,153.1764350894476
+2025-07-02 22:03:36.278,153.8086607514926
+2025-07-02 23:03:51.713,153.63573338077313
+2025-07-03 00:03:55.752,152.29223561513507
+2025-07-03 01:00:03.706,153.10728543713512
+2025-07-03 02:00:53.116,153.05740729450136
+2025-07-03 03:03:58.452,152.6343280130112
+2025-07-03 04:04:07.551,153.53792137628358
+2025-07-03 05:03:47.819,153.8414173062648
+2025-07-03 06:03:57.139,155.81350348833362
+2025-07-03 07:03:08.198,155.5640486064839
+2025-07-03 08:00:45.287,155.5525108985605
+2025-07-03 09:03:49.727,155.65192879694825
+2025-07-03 10:00:49.431,155.7724294724628
+2025-07-03 11:03:44.211,154.81575253862945
+2025-07-03 12:03:18.314,154.52342634772893
+2025-07-03 13:04:00.099,153.0894513987703
+2025-07-03 14:03:45.067,154.47178146416536
+2025-07-03 15:03:41.972,152.40010452404582
+2025-07-03 16:03:42.317,150.29559035199478
+2025-07-03 17:03:57.708,150.83387589618567
+2025-07-03 18:04:07.688,151.57358105764422
+2025-07-03 19:03:32.514,151.72518891570738
+2025-07-03 20:03:37.802,151.78523667359883
+2025-07-03 21:02:28.208,152.70728456404905
+2025-07-03 22:08:04.104,153.0026833272874
+2025-07-03 23:01:44.641,152.86683914476885
+2025-07-04 00:03:48.976,152.28063806980848
+2025-07-04 01:03:46.430,152.38647666321873
+2025-07-04 02:03:34.929,152.57699471923297
+2025-07-04 03:00:39.343,151.30877554605755
+2025-07-04 04:03:34.562,151.76535265445025
+2025-07-04 05:03:41.503,151.73038634704542
+2025-07-04 06:03:55.148,153.0411427435313
+2025-07-04 07:03:53.401,152.48876301808988
+2025-07-04 08:03:51.607,150.50771259742598
+2025-07-04 09:03:48.054,150.04908815185811
+2025-07-04 10:02:15.361,150.7884862410085
+2025-07-04 11:03:29.820,150.12208170076107
+2025-07-04 12:03:47.762,150.25631322119185
+2025-07-04 13:03:48.939,150.33784422862993
+2025-07-04 14:03:30.330,148.79177958050124
+2025-07-04 15:03:57.104,148.14539471277922
+2025-07-04 16:04:07.408,146.6540725615606
+2025-07-04 17:04:12.479,145.82578135973614
+2025-07-04 18:03:47.894,146.6041929877498
+2025-07-04 19:03:50.104,146.37925986162153
+2025-07-04 20:03:55.261,146.75625077611934
+2025-07-04 21:03:52.287,146.7849252915447
+2025-07-04 22:03:50.323,147.20383642612197
+2025-07-04 23:03:54.400,148.28976409346973
+2025-07-05 00:04:00.162,147.71291130784104
+2025-07-05 01:03:55.989,148.28782201557684
+2025-07-05 02:01:48.215,148.03734729699715
+2025-07-05 03:01:50.437,148.02025190130652
+2025-07-05 04:03:44.138,147.84861930876053
+2025-07-05 05:03:54.573,147.41969196566544
+2025-07-05 06:03:51.172,147.33489012720997
+2025-07-05 07:01:47.118,148.11738904923993
+2025-07-05 08:04:04.842,147.86955855640952
+2025-07-05 09:01:30.860,147.24831408196792
+2025-07-05 10:03:48.591,147.96706651442423
+2025-07-05 11:02:18.149,147.97272978616934
+2025-07-05 12:03:36.789,148.35002938782378
+2025-07-05 13:03:30.162,148.28177155203525
+2025-07-05 14:03:54.176,147.94834818145975
+2025-07-05 15:03:52.785,147.9632592852651
+2025-07-05 16:03:26.041,147.1796460392119
+2025-07-05 17:04:08.122,146.45888815818984
+2025-07-05 18:03:46.515,146.8944303317194
+2025-07-05 19:03:47.483,146.44666740591128
+2025-07-05 20:04:04.871,146.9237172238578
+2025-07-05 21:03:40.267,147.10801104756214
+2025-07-05 22:03:48.856,147.38940097692165
+2025-07-05 23:07:06.607,147.8982973826786
+2025-07-06 00:04:00.072,147.58844120727048
+2025-07-06 01:02:18.165,147.52232148398596
+2025-07-06 02:03:15.205,147.25475835213837
+2025-07-06 03:03:50.756,147.11050946996477
+2025-07-06 04:03:31.518,147.199860983379
+2025-07-06 05:01:03.481,147.3438211408421
+2025-07-06 06:03:33.344,147.15889095514936
+2025-07-06 07:03:44.519,148.10326692176983
+2025-07-06 08:03:46.263,148.00697171441055
+2025-07-06 09:03:33.489,147.5637221374215
+2025-07-06 10:03:27.754,147.0685104904256
+2025-07-06 11:00:33.258,147.30360010568407
+2025-07-06 12:03:50.952,147.86082599364653
+2025-07-06 13:03:41.190,148.7862683783282
+2025-07-06 14:04:00.442,151.52635811928707
+2025-07-06 15:00:49.989,151.51341296353507
+2025-07-06 16:03:41.092,151.27761090660644
+2025-07-06 17:04:11.196,152.66767116566461
+2025-07-06 18:03:41.665,152.48919107374556
+2025-07-06 19:04:00.708,151.34021290594987
+2025-07-06 20:03:55.946,151.04316873545187
+2025-07-06 21:04:02.766,151.54819478013002
+2025-07-06 22:03:39.264,152.37591621436457
+2025-07-06 23:00:32.499,152.51080425998006
+2025-07-07 00:03:32.771,151.91620078393134
+2025-07-07 01:03:54.109,151.1195642242552
+2025-07-07 02:03:45.573,151.2192870929613
+2025-07-07 03:03:34.247,152.24752690355044
+2025-07-07 04:02:24.020,151.99076439075145
+2025-07-07 05:03:38.272,151.83072447562444
+2025-07-07 06:02:38.189,151.94515398933106
+2025-07-07 07:01:42.475,151.0940885016224
+2025-07-07 08:03:33.631,152.14888530256937
+2025-07-07 09:03:38.563,152.63233085958174
+2025-07-07 10:03:31.367,152.18341810830526
+2025-07-07 11:03:49.614,152.3110424285415
+2025-07-07 12:03:24.920,152.94550886985823
+2025-07-07 13:03:41.482,151.78954871024277
+2025-07-07 14:04:00.461,152.52125073196672
+2025-07-07 15:03:44.125,151.82672599212677
+2025-07-07 16:03:20.187,151.22565416098757
+2025-07-07 17:03:45.740,150.45819264408433
+2025-07-07 18:03:47.557,149.99145507014347
+2025-07-07 19:03:50.592,150.04360570104234
+2025-07-07 20:04:03.858,149.01223833551632
+2025-07-07 21:03:36.064,148.66701510610713
+2025-07-07 22:03:20.814,148.62800960675568
+2025-07-07 23:03:35.883,148.30839191862356
+2025-07-08 00:03:53.711,148.85292668054618
+2025-07-08 01:03:34.332,149.173432903272
+2025-07-08 02:03:58.146,149.10699316074135
+2025-07-08 03:02:50.240,148.08680337956426
+2025-07-08 04:03:41.747,148.71386002530977
+2025-07-08 05:03:47.560,148.99895362661368
+2025-07-08 06:03:44.691,149.2471704408194
+2025-07-08 07:00:54.801,149.35191407540205
+2025-07-08 08:03:49.604,149.58450424808441
+2025-07-08 09:03:40.983,149.87507363436018
+2025-07-08 10:02:56.403,150.3459942756497
+2025-07-08 11:03:43.584,151.0384729016392
+2025-07-08 12:02:57.701,151.34305016903707
+2025-07-08 13:03:46.563,152.1413229794091
+2025-07-08 14:01:46.537,152.1168760667025
+2025-07-08 15:03:50.036,150.87753682252722
+2025-07-08 16:04:04.430,149.88683101541378
+2025-07-08 17:01:04.370,150.4574414109259
+2025-07-08 18:04:06.507,152.05916519183043
+2025-07-08 19:04:07.131,152.7323374083086
+2025-07-08 20:03:46.787,151.47801605729583
+2025-07-08 21:03:42.974,150.29019978604666
+2025-07-08 22:03:07.998,150.6798073983498
+2025-07-08 23:03:56.030,151.33708889629838
+2025-07-09 00:03:55.794,151.81785529214775
+2025-07-09 01:03:54.099,151.69374794859183
+2025-07-09 02:04:09.580,151.43176419716067
+2025-07-09 03:03:17.511,151.85132873046246
+2025-07-09 04:03:23.510,151.3201092952688
+2025-07-09 05:02:50.466,151.1052567097208
+2025-07-09 06:03:29.436,153.12826154383376
+2025-07-09 07:03:56.868,152.88453239703105
+2025-07-09 08:02:10.541,153.0265378834259
+2025-07-09 09:03:33.819,152.4987767716096
+2025-07-09 10:01:10.622,152.9000415685537
+2025-07-09 11:03:12.583,153.14812771982756
+2025-07-09 12:08:08.172,153.66432451658395
+2025-07-09 13:00:54.812,154.24678894447624
+2025-07-09 14:03:55.659,154.1383385131799
+2025-07-09 15:03:46.295,153.5191026161385
+2025-07-09 16:03:11.401,153.976981853302
+2025-07-09 17:02:40.206,154.73502525704563
+2025-07-09 18:03:59.193,153.56699926066673
+2025-07-09 19:03:44.800,154.46884987686946
+2025-07-09 20:03:40.681,156.87988604642317
+2025-07-09 21:03:38.857,156.17929063375283
+2025-07-09 22:03:18.452,156.93823242403252
+2025-07-09 23:03:50.634,157.59627614671945
+2025-07-10 00:08:09.504,157.24165616880677
+2025-07-10 01:03:37.092,156.15611303098342
+2025-07-10 02:03:56.717,157.6966879219362
+2025-07-10 03:03:22.838,158.35410239510438
+2025-07-10 04:00:08.612,157.37966553142886
+2025-07-10 05:03:39.087,157.6525428317123
+2025-07-10 06:03:55.094,157.28418759283835
+2025-07-10 07:03:58.078,157.47000018541172
+2025-07-10 08:03:50.195,157.8934171756698
+2025-07-10 09:03:36.312,158.87874777094106
+2025-07-10 10:03:54.327,158.1028974699864
+2025-07-10 11:03:29.321,157.80933261088043
+2025-07-10 12:03:51.877,157.68837079557085
+2025-07-10 13:04:17.967,157.4997632369007
+2025-07-10 14:04:09.381,157.05199972332167
+2025-07-10 15:03:24.527,156.81671060676538
+2025-07-10 16:03:33.579,156.44386136673768
+2025-07-10 17:03:40.626,158.434106964469
+2025-07-10 18:03:39.192,160.23056968561588
+2025-07-10 19:03:43.350,159.10836688526288
+2025-07-10 20:04:00.546,159.2777405479817
+2025-07-10 21:03:58.313,160.412345534666
+2025-07-10 22:03:21.856,163.68841904190376
+2025-07-10 23:03:48.332,164.44500241859558
+2025-07-11 00:03:28.365,163.76462800100427
+2025-07-11 01:02:28.061,162.74301501482128
+2025-07-11 02:03:23.078,164.1883710785063
+2025-07-11 03:02:35.674,164.9764030937674
+2025-07-11 04:03:11.463,165.0171092138151
+2025-07-11 05:03:36.536,164.92219414271955
+2025-07-11 06:03:41.753,165.56674649747063
+2025-07-11 07:03:59.336,163.78401432340155
+2025-07-11 08:03:33.576,163.8809740248198
+2025-07-11 09:03:15.219,163.6840621712143
+2025-07-11 10:03:56.227,164.90583429469055
+2025-07-11 11:03:47.147,164.77781351092284
+2025-07-11 12:04:19.437,163.92669065243027
+2025-07-11 13:03:37.069,164.39380573127968
+2025-07-11 14:03:28.878,166.00351500416076
+2025-07-11 15:04:03.781,166.74028811916241
+2025-07-11 16:03:37.138,162.32812328826265
+2025-07-11 17:03:40.228,162.7318575707862
+2025-07-11 18:01:53.372,164.02586751154263
+2025-07-11 19:03:58.173,164.17586879010224
+2025-07-11 20:03:49.573,164.31922937640167
+2025-07-11 21:03:52.704,163.27403648875003
+2025-07-11 22:03:34.798,162.27764773003062
+2025-07-11 23:03:27.765,161.67039192457602
+2025-07-12 00:03:50.709,162.75319398002793
+2025-07-12 01:03:55.284,162.8690619459321
+2025-07-12 02:03:57.429,163.68400050553686
+2025-07-12 03:03:49.223,163.25659586099238
+2025-07-12 04:03:55.359,163.37952303772576
+2025-07-12 05:03:51.288,162.78540816640103
+2025-07-12 05:25:19.000,162.58867319086198

+ 231 - 0
strange_crypto2.py

@@ -0,0 +1,231 @@
+import requests
+import pandas as pd
+import numpy as np
+import time
+import schedule
+import smtplib
+from email.mime.text import MIMEText
+from email.mime.multipart import MIMEMultipart
+from datetime import datetime
+import threading
+import os
+from flask import Flask, render_template_string, jsonify
+
+# Configuration
+CRYPTO_LIST = ['solana', 'dogecoin', 'ethereum', 'ripple', 'tron']  # CoinGecko IDs
+CRYPTO_LABELS = {
+    'solana': 'SOL',
+    'dogecoin': 'DOGE',
+    'ethereum': 'ETH',
+    'ripple': 'XRP',
+    'tron': 'TRX'
+}
+CURRENCY = 'usd'
+API_URL = 'https://api.coingecko.com/api/v3/simple/price'
+CHECK_INTERVAL_SECONDS = 60  # Check every 60 seconds
+Z_SCORE_THRESHOLD = 3.0
+HISTORY_WINDOW = 100
+
+EMAIL_FROM = 'vortify-lc@algometic.com'
+EMAIL_TO = 'larry1chan@qq.com'
+EMAIL_PASSWORD = 'g33kPoppy!'
+SMTP_SERVER = 'hwsmtp.exmail.qq.com'
+SMTP_PORT = 465
+
+DATA_FILE = "crypto_history.csv"
+
+# In-memory storage for historical prices and z-scores per crypto
+price_history = {crypto: [] for crypto in CRYPTO_LIST}
+zscore_history = {crypto: [] for crypto in CRYPTO_LIST}
+timestamp_history = []
+
+def fetch_prices():
+    """Fetch current prices for all cryptos from CoinGecko API."""
+    try:
+        ids = ','.join(CRYPTO_LIST)
+        params = {'ids': ids, 'vs_currencies': CURRENCY}
+        response = requests.get(API_URL, params=params)
+        response.raise_for_status()
+        data = response.json()
+        return {crypto: data.get(crypto, {}).get(CURRENCY) for crypto in CRYPTO_LIST}
+    except Exception as e:
+        print(f"Error fetching prices: {e}")
+        return {}
+
+def detect_anomaly(crypto, current_price):
+    """Detect if the current price is an anomaly based on Z-score."""
+    history = price_history[crypto]
+    if len(history) < 2:
+        return False, 0.0
+    df = pd.DataFrame(history, columns=['price'])
+    mean = df['price'].mean()
+    std_dev = df['price'].std()
+    if std_dev == 0:
+        return False, 0.0
+    z_score = (current_price - mean) / std_dev
+    is_anomaly = abs(z_score) > Z_SCORE_THRESHOLD
+    return is_anomaly, z_score
+
+def send_email_alert(crypto, current_price, z_score):
+    """Send email alert for anomaly."""
+    symbol = CRYPTO_LABELS.get(crypto, crypto.upper())
+    subject = f"Anomaly Detected in {symbol} Price!"
+    body = f"""
+    Alert Time: {datetime.now()}
+    Crypto: {symbol}
+    Current Price: ${current_price:.4f}
+    Z-Score: {z_score:.2f} (Threshold: {Z_SCORE_THRESHOLD})
+    This indicates a potential anomalous movement (spike or drop).
+    """
+    msg = MIMEMultipart()
+    msg['From'] = EMAIL_FROM
+    msg['To'] = EMAIL_TO
+    msg['Subject'] = subject
+    msg.attach(MIMEText(body, 'plain'))
+    try:
+        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
+        server.starttls()
+        server.login(EMAIL_FROM, EMAIL_PASSWORD)
+        server.sendmail(EMAIL_FROM, EMAIL_TO, msg.as_string())
+        server.quit()
+        print(f"Email alert sent for {symbol}.")
+    except Exception as e:
+        print(f"Error sending email for {symbol}: {e}")
+
+def save_history():
+    """Save the price and z-score history to a CSV file."""
+    if not timestamp_history:
+        return
+    rows = []
+    for idx, ts in enumerate(timestamp_history):
+        row = {'timestamp': ts}
+        for crypto in CRYPTO_LIST:
+            row[f'{crypto}_price'] = price_history[crypto][idx] if idx < len(price_history[crypto]) else ''
+            row[f'{crypto}_zscore'] = zscore_history[crypto][idx] if idx < len(zscore_history[crypto]) else ''
+        rows.append(row)
+    df = pd.DataFrame(rows)
+    df.to_csv(DATA_FILE, index=False)
+
+def monitor():
+    """Main monitoring function: Fetch prices, check for anomaly, alert if needed, and save history."""
+    current_prices = fetch_prices()
+    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+    timestamp_history.append(now)
+    for crypto, price in current_prices.items():
+        if price is None:
+            price_history[crypto].append(np.nan)
+            zscore_history[crypto].append(np.nan)
+            continue
+        # Append to history (maintain fixed window size)
+        price_history[crypto].append(price)
+        if len(price_history[crypto]) > HISTORY_WINDOW:
+            price_history[crypto].pop(0)
+        is_anomaly, z_score = detect_anomaly(crypto, price)
+        zscore_history[crypto].append(z_score)
+        if len(zscore_history[crypto]) > HISTORY_WINDOW:
+            zscore_history[crypto].pop(0)
+        symbol = CRYPTO_LABELS.get(crypto, crypto.upper())
+        print(f"{now} - {symbol} Price: ${price:.4f} | Z-Score: {z_score:.2f}")
+        if is_anomaly:
+            print(f"ANOMALY DETECTED for {symbol}! Z-Score: {z_score:.2f}")
+            send_email_alert(crypto, price, z_score)
+    # Keep timestamp_history in sync
+    if len(timestamp_history) > HISTORY_WINDOW:
+        timestamp_history.pop(0)
+    save_history()
+
+# --- Web server for visualization ---
+app = Flask(__name__)
+
+HTML_TEMPLATE = """
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Crypto Z-Score & Price Monitor</title>
+    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
+</head>
+<body>
+    <h2>Crypto Z-Score & Price Monitor</h2>
+    <div id="charts"></div>
+    <script>
+        async function fetchData() {
+            const resp = await fetch('/data');
+            return await resp.json();
+        }
+        function renderCharts(data) {
+            const container = document.getElementById('charts');
+            container.innerHTML = '';
+            for (const crypto of data.cryptos) {
+                const label = data.labels[crypto];
+                const canvasPrice = document.createElement('canvas');
+                const canvasZ = document.createElement('canvas');
+                container.appendChild(document.createElement('hr'));
+                container.appendChild(document.createTextNode(label + " Price"));
+                container.appendChild(canvasPrice);
+                container.appendChild(document.createTextNode(label + " Z-Score"));
+                container.appendChild(canvasZ);
+
+                new Chart(canvasPrice, {
+                    type: 'line',
+                    data: {
+                        labels: data.timestamps,
+                        datasets: [{
+                            label: label + ' Price',
+                            data: data.prices[crypto],
+                            borderColor: 'blue',
+                            fill: false
+                        }]
+                    }
+                });
+                new Chart(canvasZ, {
+                    type: 'line',
+                    data: {
+                        labels: data.timestamps,
+                        datasets: [{
+                            label: label + ' Z-Score',
+                            data: data.zscores[crypto],
+                            borderColor: 'red',
+                            fill: false
+                        }]
+                    }
+                });
+            }
+        }
+        fetchData().then(renderCharts);
+        setInterval(() => fetchData().then(renderCharts), 60000);
+    </script>
+</body>
+</html>
+"""
+
+@app.route('/')
+def index():
+    return render_template_string(HTML_TEMPLATE)
+
+@app.route('/data')
+def data():
+    # Prepare data for chart
+    return jsonify({
+        'cryptos': CRYPTO_LIST,
+        'labels': CRYPTO_LABELS,
+        'timestamps': timestamp_history,
+        'prices': price_history,
+        'zscores': zscore_history
+    })
+
+def start_flask():
+    app.run(host='0.0.0.0', port=5000, debug=False, use_reloader=False)
+
+# --- Main ---
+def main():
+    # Start web server in a separate thread
+    threading.Thread(target=start_flask, daemon=True).start()
+    # Schedule the monitor to run every CHECK_INTERVAL_SECONDS
+    schedule.every(CHECK_INTERVAL_SECONDS).seconds.do(monitor)
+    print("Starting multi-crypto price anomaly monitor and web server on http://localhost:5000 ...")
+    while True:
+        schedule.run_pending()
+        time.sleep(1)
+
+if __name__ == "__main__":
+    main()

+ 114 - 0
strange_cryptos.py

@@ -0,0 +1,114 @@
+### Python Code
+
+import requests
+import pandas as pd
+import numpy as np
+import time
+import schedule
+import smtplib
+from email.mime.text import MIMEText
+from email.mime.multipart import MIMEMultipart
+from datetime import datetime
+
+# Configuration
+CRYPTO_LIST = ['solana', 'dogecoin', 'ethereum', 'ripple', 'tron']  # CoinGecko IDs
+CRYPTO_LABELS = {
+    'solana': 'SOL',
+    'dogecoin': 'DOGE',
+    'ethereum': 'ETH',
+    'ripple': 'XRP',
+    'tron': 'TRX'
+}
+CURRENCY = 'usd'
+API_URL = 'https://api.coingecko.com/api/v3/simple/price'
+CHECK_INTERVAL_SECONDS = 60  # Check every 60 seconds
+Z_SCORE_THRESHOLD = 3.0
+HISTORY_WINDOW = 100
+
+EMAIL_FROM = 'vortify-lc@algometic.com'
+EMAIL_TO = 'larry1chan@qq.com'
+EMAIL_PASSWORD = 'g33kPoppy!'
+SMTP_SERVER = 'hwsmtp.exmail.qq.com'
+SMTP_PORT = 465
+
+# In-memory storage for historical prices per crypto
+price_history = {crypto: [] for crypto in CRYPTO_LIST}
+
+def fetch_prices():
+    """Fetch current prices for all cryptos from CoinGecko API."""
+    try:
+        ids = ','.join(CRYPTO_LIST)
+        params = {'ids': ids, 'vs_currencies': CURRENCY}
+        response = requests.get(API_URL, params=params)
+        response.raise_for_status()
+        data = response.json()
+        return {crypto: data.get(crypto, {}).get(CURRENCY) for crypto in CRYPTO_LIST}
+    except Exception as e:
+        print(f"Error fetching prices: {e}")
+        return {}
+
+def detect_anomaly(crypto, current_price):
+    """Detect if the current price is an anomaly based on Z-score."""
+    history = price_history[crypto]
+    if len(history) < 2:
+        return False, 0.0
+    df = pd.DataFrame(history, columns=['price'])
+    mean = df['price'].mean()
+    std_dev = df['price'].std()
+    if std_dev == 0:
+        return False, 0.0
+    z_score = (current_price - mean) / std_dev
+    is_anomaly = abs(z_score) > Z_SCORE_THRESHOLD
+    return is_anomaly, z_score
+
+def send_email_alert(crypto, current_price, z_score):
+    """Send email alert for anomaly."""
+    symbol = CRYPTO_LABELS.get(crypto, crypto.upper())
+    subject = f"Anomaly Detected in {symbol} Price!"
+    body = f"""
+    Alert Time: {datetime.now()}
+    Crypto: {symbol}
+    Current Price: ${current_price:.4f}
+    Z-Score: {z_score:.2f} (Threshold: {Z_SCORE_THRESHOLD})
+    This indicates a potential anomalous movement (spike or drop).
+    """
+    msg = MIMEMultipart()
+    msg['From'] = EMAIL_FROM
+    msg['To'] = EMAIL_TO
+    msg['Subject'] = subject
+    msg.attach(MIMEText(body, 'plain'))
+    try:
+        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
+        server.starttls()
+        server.login(EMAIL_FROM, EMAIL_PASSWORD)
+        server.sendmail(EMAIL_FROM, EMAIL_TO, msg.as_string())
+        server.quit()
+        print(f"Email alert sent for {symbol}.")
+    except Exception as e:
+        e.printstacktrace()
+        print(f"Error sending email for {symbol}: {e}")
+
+def monitor():
+    """Main monitoring function: Fetch prices, check for anomaly, alert if needed."""
+    current_prices = fetch_prices()
+    for crypto, price in current_prices.items():
+        if price is None:
+            continue
+        # Append to history (maintain fixed window size)
+        price_history[crypto].append(price)
+        if len(price_history[crypto]) > HISTORY_WINDOW:
+            price_history[crypto].pop(0)
+        is_anomaly, z_score = detect_anomaly(crypto, price)
+        symbol = CRYPTO_LABELS.get(crypto, crypto.upper())
+        print(f"{datetime.now()} - {symbol} Price: ${price:.4f} | Z-Score: {z_score:.2f}")
+        if is_anomaly:
+            print(f"ANOMALY DETECTED for {symbol}! Z-Score: {z_score:.2f}")
+            send_email_alert(crypto, price, z_score)
+
+# Schedule the monitor to run every CHECK_INTERVAL_SECONDS
+schedule.every(CHECK_INTERVAL_SECONDS).seconds.do(monitor)
+
+print("Starting multi-crypto price anomaly monitor...")
+while True:
+    schedule.run_pending()
+    time.sleep(1)

+ 112 - 0
strange_doge.py

@@ -0,0 +1,112 @@
+### Python Code
+
+import requests
+import pandas as pd
+import numpy as np
+import time
+import schedule
+import smtplib
+from email.mime.text import MIMEText
+from email.mime.multipart import MIMEMultipart
+from datetime import datetime
+
+# Configuration
+CRYPTO = 'dogecoin'  # CoinGecko ID for DOGE
+CURRENCY = 'usd'     # Base currency
+API_URL = f'https://api.coingecko.com/api/v3/simple/price?ids={CRYPTO}&vs_currencies={CURRENCY}'
+CHECK_INTERVAL_SECONDS = 60  # Check every 60 seconds
+Z_SCORE_THRESHOLD = 3.0  # Flag as anomaly if |Z-score| > 3
+HISTORY_WINDOW = 100  # Keep last 100 prices for mean/std calculation
+
+# Email configuration (replace with your details)
+EMAIL_FROM = 'vortify-lc@algometic.com'
+EMAIL_TO = 'larry1chan@qq.com'
+EMAIL_PASSWORD = 'g33kPoppy!'
+SMTP_SERVER = 'hwsmtp.exmail.qq.com'
+SMTP_PORT = 465
+
+# In-memory storage for historical prices
+price_history = []
+
+def fetch_price():
+    """Fetch current price from CoinGecko API."""
+    try:
+        response = requests.get(API_URL)
+        response.raise_for_status()
+        data = response.json()
+        price = data[CRYPTO][CURRENCY]
+        return price
+    except Exception as e:
+        print(f"Error fetching price: {e}")
+        return None
+
+def detect_anomaly(current_price):
+    """Detect if the current price is an anomaly based on Z-score."""
+    if len(price_history) < 2:  # Need at least 2 points for std dev
+        return False, 0.0
+    
+    # Calculate mean and std dev from history
+    df = pd.DataFrame(price_history, columns=['price'])
+    mean = df['price'].mean()
+    std_dev = df['price'].std()
+    
+    if std_dev == 0:  # Avoid division by zero
+        return False, 0.0
+    
+    z_score = (current_price - mean) / std_dev
+    is_anomaly = abs(z_score) > Z_SCORE_THRESHOLD
+    return is_anomaly, z_score
+
+def send_email_alert(current_price, z_score):
+    """Send email alert for anomaly."""
+    subject = f"Anomaly Detected in {CRYPTO.upper()} Price!"
+    body = f"""
+    Alert Time: {datetime.now()}
+    Current Price: ${current_price:.4f}
+    Z-Score: {z_score:.2f} (Threshold: {Z_SCORE_THRESHOLD})
+    This indicates a potential anomalous movement (spike or drop).
+    """
+    
+    msg = MIMEMultipart()
+    msg['From'] = EMAIL_FROM
+    msg['To'] = EMAIL_TO
+    msg['Subject'] = subject
+    msg.attach(MIMEText(body, 'plain'))
+    
+    try:
+        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
+        server.starttls()
+        server.login(EMAIL_FROM, EMAIL_PASSWORD)
+        server.sendmail(EMAIL_FROM, EMAIL_TO, msg.as_string())
+        server.quit()
+        print("Email alert sent successfully.")
+    except Exception as e:
+        print(f"Error sending email: {e}")
+
+def monitor():
+    """Main monitoring function: Fetch price, check for anomaly, alert if needed."""
+    current_price = fetch_price()
+    if current_price is None:
+        return
+    
+    # Append to history (maintain fixed window size)
+    price_history.append(current_price)
+    if len(price_history) > HISTORY_WINDOW:
+        price_history.pop(0)
+    
+    is_anomaly, z_score = detect_anomaly(current_price)
+    
+    print(f"{datetime.now()} - Current {CRYPTO.upper()} Price: ${current_price:.4f} | Z-Score: {z_score:.2f}")
+    
+    if is_anomaly:
+        print(f"ANOMALY DETECTED! Z-Score: {z_score:.2f}")
+        send_email_alert(current_price, z_score)
+
+# Schedule the monitor to run every CHECK_INTERVAL_SECONDS
+schedule.every(CHECK_INTERVAL_SECONDS).seconds.do(monitor)
+
+# Run the monitoring loop
+print(f"Starting {CRYPTO.upper()} price anomaly monitor...")
+while True:
+    schedule.run_pending()
+    time.sleep(1)  # Sleep to avoid high CPU usage

+ 179 - 0
strange_doge_rf.py

@@ -0,0 +1,179 @@
+import requests
+import pandas as pd
+import numpy as np
+from sklearn.ensemble import IsolationForest
+import time
+import schedule
+import smtplib
+from email.mime.text import MIMEText
+from email.mime.multipart import MIMEMultipart
+from datetime import datetime
+import os
+
+# Configuration
+CRYPTO = 'dogecoin'  # CoinGecko ID for DOGE
+CURRENCY = 'usd'     # Base currency
+CURRENT_PRICE_URL = f'https://api.coingecko.com/api/v3/simple/price?ids={CRYPTO}&vs_currencies={CURRENCY}'
+HISTORICAL_URL = f'https://api.coingecko.com/api/v3/coins/{CRYPTO}/market_chart?vs_currency={CURRENCY}&days=30 # &interval=hourly'
+CHECK_INTERVAL_SECONDS = 60  # Check every 60 seconds
+RETRAIN_INTERVAL_MINUTES = 60  # Retrain model every 60 minutes
+ANOMALY_THRESHOLD = -0.5  # Isolation Forest score < -0.5 indicates anomaly (range: -1 to 1)
+HISTORY_WINDOW = 1000  # Max historical points to keep (for memory efficiency)
+CSV_FILE = 'doge_price_history.csv'  # For persistence
+
+# Email configuration (replace with your details)
+EMAIL_FROM = 'vortify-lc@algometic.com'
+EMAIL_TO = 'larry1chan@qq.com'
+EMAIL_PASSWORD = 'g33kPoppy!'
+SMTP_SERVER = 'hwsmtp.exmail.qq.com'
+SMTP_PORT = 465
+
+# Global variables
+price_df = pd.DataFrame(columns=['timestamp', 'price'])  # Historical prices
+model = None  # Isolation Forest model
+
+def fetch_historical_data():
+    """Fetch historical hourly price data from CoinGecko."""
+    try:
+        response = requests.get(HISTORICAL_URL)
+        response.raise_for_status()
+        data = response.json()
+        prices = data['prices']  # List of [timestamp_ms, price]
+        df = pd.DataFrame(prices, columns=['timestamp', 'price'])
+        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
+        return df
+    except Exception as e:
+        print(f"Error fetching historical data: {e}")
+        return pd.DataFrame()
+
+def load_or_fetch_history():
+    """Load history from CSV if exists, else fetch from API."""
+    global price_df
+    if os.path.exists(CSV_FILE):
+        price_df = pd.read_csv(CSV_FILE, parse_dates=['timestamp'])
+        print(f"Loaded {len(price_df)} historical points from CSV.")
+    else:
+        price_df = fetch_historical_data()
+        if not price_df.empty:
+            price_df.to_csv(CSV_FILE, index=False)
+            print(f"Fetched and saved {len(price_df)} historical points.")
+    # Trim to window size
+    price_df = price_df.tail(HISTORY_WINDOW)
+
+def fetch_current_price():
+    """Fetch current price from CoinGecko API."""
+    try:
+        response = requests.get(CURRENT_PRICE_URL)
+        response.raise_for_status()
+        data = response.json()
+        price = data[CRYPTO][CURRENCY]
+        timestamp = datetime.now()
+        return timestamp, price
+    except Exception as e:
+        print(f"Error fetching current price: {e}")
+        return None, None
+
+def engineer_features(df):
+    """Engineer features for anomaly detection."""
+    df = df.copy()
+    df['pct_change'] = df['price'].pct_change()  # Percentage change
+    df['abs_diff'] = df['price'].diff()  # Absolute difference
+    df['rolling_mean_5'] = df['price'].rolling(window=5).mean()  # Rolling mean
+    df['rolling_std_5'] = df['price'].rolling(window=5).std()    # Rolling std
+    df['hour'] = df['timestamp'].dt.hour  # Time of day
+    # Fill NaNs with 0 or forward-fill for simplicity
+    df.fillna(0, inplace=True)
+    # Features to use (exclude timestamp and price for model input)
+    features = ['pct_change', 'abs_diff', 'rolling_mean_5', 'rolling_std_5', 'hour']
+    return df[features]
+
+def train_model():
+    """Train or retrain Isolation Forest on historical features."""
+    global model
+    if len(price_df) < 10:  # Need sufficient data
+        print("Insufficient data to train model.")
+        return
+    
+    features = engineer_features(price_df)
+    model = IsolationForest(contamination=0.01, random_state=42)  # Assume 1% anomalies
+    model.fit(features)
+    print("Model retrained successfully.")
+
+def detect_anomaly(timestamp, current_price):
+    """Detect if current price is an anomaly using the model."""
+    if model is None:
+        return False, 0.0
+    
+    # Create a temporary DF with new point appended
+    new_row = pd.DataFrame({'timestamp': [timestamp], 'price': [current_price]})
+    temp_df = pd.concat([price_df, new_row], ignore_index=True)
+    features = engineer_features(temp_df)
+    # Predict on the latest point
+    score = model.decision_function(features.tail(1))[0]  # Score: higher = more normal
+    is_anomaly = score < ANOMALY_THRESHOLD
+    return is_anomaly, score
+
+def send_email_alert(timestamp, current_price, score):
+    """Send email alert for anomaly."""
+    subject = f"Anomaly Detected in {CRYPTO.upper()} Price!"
+    body = f"""
+    Alert Time: {timestamp}
+    Current Price: ${current_price:.4f}
+    Anomaly Score: {score:.2f} (Threshold: {ANOMALY_THRESHOLD})
+    This indicates a sudden and sharp price fluctuation.
+    """
+    
+    msg = MIMEMultipart()
+    msg['From'] = EMAIL_FROM
+    msg['To'] = EMAIL_TO
+    msg['Subject'] = subject
+    msg.attach(MIMEText(body, 'plain'))
+    
+    try:
+        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
+        server.starttls()
+        server.login(EMAIL_FROM, EMAIL_PASSWORD)
+        server.sendmail(EMAIL_FROM, EMAIL_TO, msg.as_string())
+        server.quit()
+        print("Email alert sent successfully.")
+    except Exception as e:
+        print(f"Error sending email: {e}")
+
+def monitor():
+    """Main monitoring function: Fetch price, check for anomaly, alert if needed."""
+    global price_df
+    timestamp, current_price = fetch_current_price()
+    if current_price is None:
+        return
+    
+    # Append new price to history
+    new_row = pd.DataFrame({'timestamp': [timestamp], 'price': [current_price]})
+    price_df = pd.concat([price_df, new_row], ignore_index=True)
+    price_df = price_df.tail(HISTORY_WINDOW)  # Keep window size
+    price_df.to_csv(CSV_FILE, index=False)  # Save updates
+    
+    is_anomaly, score = detect_anomaly(timestamp, current_price)
+    
+    print(f"{timestamp} - Current {CRYPTO.upper()} Price: ${current_price:.4f} | Anomaly Score: {score:.2f}")
+    
+    if is_anomaly:
+        print(f"ANOMALY DETECTED! Score: {score:.2f}")
+        send_email_alert(timestamp, current_price, score)
+
+def retrain_scheduler():
+    """Scheduled task to retrain the model."""
+    train_model()
+
+# Initialize
+load_or_fetch_history()
+train_model()  # Initial training
+
+# Schedule tasks
+schedule.every(CHECK_INTERVAL_SECONDS).seconds.do(monitor)
+schedule.every(RETRAIN_INTERVAL_MINUTES).minutes.do(retrain_scheduler)
+
+# Run the monitoring loop
+print(f"Starting advanced {CRYPTO.upper()} price anomaly monitor with Isolation Forest...")
+while True:
+    schedule.run_pending()
+    time.sleep(1)  # Avoid high CPU usage

+ 199 - 0
strange_doge_rf2.py

@@ -0,0 +1,199 @@
+import requests
+import pandas as pd
+import numpy as np
+from sklearn.ensemble import IsolationForest
+from datetime import datetime
+import os
+
+# Configuration
+CRYPTO = 'solana'  # CoinGecko ID for DOGE
+CURRENCY = 'usd'     # Base currency
+HISTORICAL_URL = f'https://api.coingecko.com/api/v3/coins/{CRYPTO}/market_chart?vs_currency={CURRENCY}&days=30  #&interval=hourly'
+HISTORY_WINDOW = 1000  # Max historical points to keep (for memory efficiency)
+CSV_FILE = '%s_price_history.csv' % CRYPTO  # For loading historical data
+
+# Global variables
+price_df = pd.DataFrame(columns=['timestamp', 'price'])  # Historical prices
+model = None  # Isolation Forest model
+
+def fetch_historical_data():
+    """Fetch historical hourly price data from CoinGecko."""
+    try:
+        response = requests.get(HISTORICAL_URL)
+        response.raise_for_status()
+        data = response.json()
+        prices = data['prices']  # List of [timestamp_ms, price]
+        df = pd.DataFrame(prices, columns=['timestamp', 'price'])
+        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
+        return df
+    except Exception as e:
+        print(f"Error fetching historical data: {e}")
+        return pd.DataFrame()
+
+def load_or_fetch_history():
+    """Load history from CSV if exists, else fetch from API."""
+    global price_df
+    if os.path.exists(CSV_FILE):
+        price_df = pd.read_csv(CSV_FILE, parse_dates=['timestamp'])
+        print(f"Loaded {len(price_df)} historical points from CSV.")
+    else:
+        price_df = fetch_historical_data()
+        if not price_df.empty:
+            price_df.to_csv(CSV_FILE, index=False)
+            print(f"Fetched and saved {len(price_df)} historical points.")
+    # Trim to window size
+    price_df = price_df.tail(HISTORY_WINDOW)
+
+def engineer_features(df):
+    """Engineer features for anomaly detection."""
+    df = df.copy()
+    df['pct_change'] = df['price'].pct_change()  # Percentage change
+    df['abs_diff'] = df['price'].diff()  # Absolute difference
+    df['rolling_mean_5'] = df['price'].rolling(window=5).mean()  # Rolling mean
+    df['rolling_std_5'] = df['price'].rolling(window=5).std()    # Rolling std
+    df['hour'] = df['timestamp'].dt.hour  # Time of day
+    df.fillna(0, inplace=True)
+    features = ['pct_change', 'abs_diff', 'rolling_mean_5', 'rolling_std_5', 'hour']
+    return df[features]
+
+def train_model(train_df):
+    """Train Isolation Forest on given features."""
+    if len(train_df) < 10:
+        print("Insufficient data to train model.")
+        return None
+    
+    features = engineer_features(train_df)
+    model = IsolationForest(contamination=0.01, random_state=42)
+    model.fit(features)
+    return model
+
+def get_anomaly_score(model, test_df, index):
+    """Get anomaly score for a specific point in the test DF."""
+    # To simulate "appending" without modifying, create temp DF up to this index
+    temp_df = test_df.iloc[:index + 1]  # Includes all prior test points up to this one
+    features = engineer_features(temp_df)
+    score = model.decision_function(features.tail(1))[0]
+    return score
+
+# Sensitivity Analysis
+def run_sensitivity_analysis(thresholds=[-0.2, -0.1,-0.07, -0.05, -0.03, -0.01, 0.1], precision=0.0001, max_iterations=100):
+    """Compute upper/lower price bounds for anomalies across multiple thresholds."""
+    if model is None:
+        print("Model not trained yet. Cannot run sensitivity analysis.")
+        return
+    
+    if price_df.empty:
+        print("No historical data available.")
+        return
+    
+    current_price = price_df['price'].iloc[-1]
+    timestamp = datetime.now()
+    
+    def find_bounds(threshold):
+        def is_anomaly_func(price):
+            # Simulate detection with given threshold
+            new_row = pd.DataFrame({'timestamp': [timestamp], 'price': [price]})
+            temp_df = pd.concat([price_df, new_row], ignore_index=True)
+            features = engineer_features(temp_df)
+            score = model.decision_function(features.tail(1))[0]
+            return score < threshold
+        
+        # Lower bound
+        low = max(0, current_price * 0.5)
+        high = current_price
+        lower_bound = None
+        for _ in range(max_iterations):
+            mid = (low + high) / 2
+            if is_anomaly_func(mid):
+                lower_bound = mid
+                high = mid
+            else:
+                low = mid
+            if high - low < precision:
+                break
+        
+        # Upper bound
+        low = current_price
+        high = current_price * 2
+        upper_bound = None
+        for _ in range(max_iterations):
+            mid = (low + high) / 2
+            if is_anomaly_func(mid):
+                upper_bound = mid
+                low = mid
+            else:
+                high = mid
+            if high - low < precision:
+                break
+        
+        return lower_bound, upper_bound
+    
+    print("Sensitivity Analysis: Anomaly Price Bounds for Different Thresholds")
+    print(f"Based on last historical price: ${current_price:.4f}")
+    for thresh in thresholds:
+        lower, upper = find_bounds(thresh)
+        print(f"\nThreshold {thresh}:")
+        if lower is not None:
+            print(f" - Prices BELOW ~${lower:.4f} would trigger anomaly.")
+        else:
+            print(" - No lower bound found.")
+        if upper is not None:
+            print(f" - Prices ABOVE ~${upper:.4f} would trigger anomaly.")
+        else:
+            print(" - No upper bound found.")
+
+# Backtesting
+def run_backtest(thresholds=[-0.7, -0.5, -0.3], test_fraction=0.2):
+    """Backtest the model on a holdout set, reporting flagged anomalies per threshold."""
+    if len(price_df) < 20:
+        print("Insufficient data for backtesting.")
+        return
+    
+    # Split data: Train on first (1 - test_fraction), test on last test_fraction
+    split_idx = int(len(price_df) * (1 - test_fraction))
+    train_df = price_df.iloc[:split_idx]
+    test_df = price_df.iloc[split_idx:].reset_index(drop=True)
+    
+    backtest_model = train_model(train_df)
+    if backtest_model is None:
+        return
+    
+    print(f"Backtesting on {len(test_df)} holdout points (trained on {len(train_df)} points).")
+    
+    # Score each test point sequentially
+    scores = []
+    for i in range(len(test_df)):
+        score = get_anomaly_score(backtest_model, test_df, i)
+        scores.append(score)
+    
+    for thresh in thresholds:
+        flagged = [i for i, score in enumerate(scores) if score < thresh]
+        flagged_pct = (len(flagged) / len(test_df)) * 100 if len(test_df) > 0 else 0
+        print(f"\nThreshold {thresh}: {len(flagged)} points flagged as anomalies ({flagged_pct:.2f}%)")
+        if flagged:
+            print("Flagged points (timestamp, price):")
+            for idx in flagged[:10]:  # Limit to first 10 for brevity
+                ts = test_df['timestamp'].iloc[idx]
+                price = test_df['price'].iloc[idx]
+                print(f" - {ts}: ${price:.4f}")
+            if len(flagged) > 10:
+                print("   ... (more flagged points omitted)")
+
+# Main Execution
+load_or_fetch_history()
+model = train_model(price_df)  # Train on full data for sensitivity analysis
+
+# Interactive CLI for analysis
+print(f"{CRYPTO.upper()} price anomaly analyzer loaded with Isolation Forest.")
+print("Enter 'sensitivity' for sensitivity analysis, 'backtest' for backtesting, or 'quit' to exit.")
+while True:
+    user_input = input("> ").strip().lower()
+    if user_input == 'quit':
+        print("Exiting...")
+        break
+    elif user_input == 'sensitivity':
+        run_sensitivity_analysis()
+    elif user_input == 'backtest':
+        run_backtest()
+    else:
+        print("Unknown command. Use 'sensitivity', 'backtest', or 'quit'.")