================================================================================
--- ফাইল পাথ (File Path): .htaccess [Binary Content - Base64 Encoded] ---
================================================================================

UmV3cml0ZUVuZ2luZSBPbg0KDQojIOCmsOCmv+CmleCni+Cmr+CmvOCnh+CmuOCnjeCmnyDgpq/gpqbgpr8g4KaV4KeL4Kao4KeLIOCmq+CmvuCmh+CmsiDgpqzgpr4g4Kar4KeL4Kay4KeN4Kah4Ka+4KawIOCmqOCmviDgprngpq/gprwsIOCmpOCmrOCnh+CmhyDgpqrgprDgp4fgprAg4Kao4Ka/4Kav4Ka84Kau4KaX4KeB4Kay4KeLIOCmquCnjeCmsOCmr+Cni+CmnOCnjeCmryDgprngpqzgp4cNClJld3JpdGVDb25kICV7UkVRVUVTVF9GSUxFTkFNRX0gIS1mDQpSZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9ICEtZA0KDQojIHBheW1lbnRsaW5rL3BheS9VTklRVUVfSUQg4KaV4KeHIHBheS5waHAg4Kar4Ka+4KaH4Kay4KeHIOCmquCmvuCmoOCmvuCmqOCni+CmsCDgpqjgpr/gp5/gpq4NClJld3JpdGVSdWxlIF5wYXltZW50bGluay9wYXkvKFthLXpBLVowLTlfLV0rKSQgcGF5bWVudGxpbmsvcGF5LnBocD9saW5rX2lkPSQxIFtMLFFTQV0NCg0KIyAucGhwIOCmj+CmleCnjeCmuOCmn+Cnh+CmqOCmtuCmqCDgprLgp4HgppXgpr7gpqjgp4vgprAg4Kao4Ka/4Kef4KauDQpSZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9XC5waHAgLWYNClJld3JpdGVSdWxlIF4oLis/KS8/JCAkMS5waHAgW0xd

================================================================================
--- ফাইল পাথ (File Path): add_customer.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ফর্ম থেকে ডেটা গ্রহণ করা
    $username = trim($_POST['username']);
    $email = trim($_POST['email']);
    $password = $_POST['password'];
    $license_key = trim($_POST['license_key']) ?: null;

    // প্রয়োজনীয় ফিল্ডগুলো খালি আছে কিনা তা পরীক্ষা করা
    if (empty($username) || empty($email) || empty($password)) {
        header("Location: customers.php?error=required_fields_missing");
        exit();
    }

    try {
        // ইমেইলটি আগে থেকেই ব্যবহৃত হয়েছে কিনা তা পরীক্ষা করা
        $stmt_check = $pdo->prepare("SELECT id FROM users WHERE email = ?");
        $stmt_check->execute([$email]);
        if ($stmt_check->fetch()) {
            header("Location: customers.php?error=email_exists");
            exit();
        }

        // ডাটাবেস ট্রানজেকশন শুরু করা হচ্ছে
        $pdo->beginTransaction();

        // ১. পাসওয়ার্ডকে સુરक्षितভাবে হ্যাশ করা হচ্ছে
        $hashed_password = password_hash($password, PASSWORD_DEFAULT);

        // ২. `users` টেবিলে নতুন ব্যবহারকারী যুক্ত করা হচ্ছে
        $sql_user = "INSERT INTO users (username, email, password, license_key, license_status) VALUES (?, ?, ?, ?, 'active')";
        $stmt_user = $pdo->prepare($sql_user);
        $stmt_user->execute([$username, $email, $hashed_password, $license_key]);
        $user_id = $pdo->lastInsertId();

        // ৩. `settings` টেবিলে এই নতুন ব্যবহারকারীর জন্য একটি API Key তৈরি করা হচ্ছে
        $new_api_key = bin2hex(random_bytes(32));
        $sql_settings = "INSERT INTO settings (user_id, api_key) VALUES (?, ?)";
        $stmt_settings = $pdo->prepare($sql_settings);
        $stmt_settings->execute([$user_id, $new_api_key]);

        // ৪. সবকিছু ঠিক থাকলে ট্রানজেকশন কমিট করা হচ্ছে
        $pdo->commit();

        header("Location: customers.php?success=user_added");
        exit();

    } catch (PDOException $e) {
        // কোনো সমস্যা হলে ট্রানজেকশন রোলব্যাক করা হচ্ছে
        if ($pdo->inTransaction()) {
            $pdo->rollBack();
        }
        error_log("Error adding user: " . $e->getMessage());
        header("Location: customers.php?error=database_error");
        exit();
    }
} else {
    header("Location: customers.php");
    exit();
}

================================================================================
--- ফাইল পাথ (File Path): api_settings.php [Text Content] ---
================================================================================

<?php
// === ধাপ ১: ব্যবহারকারীর সেশন এবং অথেন্টিকেশন পরীক্ষা করা ===
require 'auth_check.php';
// === ধাপ ২: ডেটাবেস সংযোগ স্থাপন করা ===
require 'db_connect.php';

// সেশন থেকে বর্তমান ব্যবহারকারীর আইডি নেওয়া হচ্ছে
$user_id = $_SESSION['user_id'];
$success_message = '';

// === ধাপ ৩: POST রিকোয়েস্ট হ্যান্ডেল করা (ফর্ম সাবমিট হলে) ===
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
    // যদি 'generate_key' অ্যাকশন পাঠানো হয়, তবে নতুন API Key তৈরি করা হবে
    if (isset($_POST['action']) && $_POST['action'] === 'generate_key') {
        // একটি নতুন, ইউনিক এবং নিরাপদ API Key তৈরি করা হচ্ছে
        $new_api_key = bin2hex(random_bytes(32));
        
        // ON DUPLICATE KEY UPDATE ব্যবহার করে ডেটাবেসে নতুন কী'টি আপডেট বা ইনসার্ট করা হচ্ছে
        $sql = "INSERT INTO settings (user_id, api_key) VALUES (?, ?) ON DUPLICATE KEY UPDATE api_key = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$user_id, $new_api_key, $new_api_key]);

    } 
    // যদি 'base_url' পাঠানো হয়, তবে সেটি সেভ করা হবে
    elseif (isset($_POST['base_url'])) {
        // ব্যবহারকারীর দেওয়া নতুন Base URL গ্রহণ এবং পরিষ্কার করা
        $new_base_url = trim($_POST['base_url']);
        // URL-এর শেষে কোনো স্ল্যাশ (/) থাকলে তা স্বয়ংক্রিয়ভাবে বাদ দেওয়া হচ্ছে
        $new_base_url = rtrim($new_base_url, '/'); 

        $sql = "INSERT INTO settings (user_id, base_url) VALUES (?, ?) ON DUPLICATE KEY UPDATE base_url = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$user_id, $new_base_url, $new_base_url]);
    }
    
    // সফলভাবে সেভ হওয়ার পর পেজটি রিফ্রেশ করা হচ্ছে এবং একটি সফল বার্তা দেখানো হবে
    header("Location: api_settings.php?success=1");
    exit();
}

// === ধাপ ৪: পেজ লোড হওয়ার সময় ডেটা দেখানো ===

// যদি URL-এ 'success=1' থাকে, তাহলে একটি সফল বার্তা প্রস্তুত করা হচ্ছে
if (isset($_GET['success'])) {
    $success_message = "Settings have been updated successfully!";
}

// ডেটাবেস থেকে বর্তমান API Key এবং Base URL আনা হচ্ছে
$stmt = $pdo->prepare("SELECT api_key, base_url FROM settings WHERE user_id = ?");
$stmt->execute([$user_id]);
$setting = $stmt->fetch(PDO::FETCH_ASSOC);

$api_key = $setting['api_key'] ?? '';
$base_url = $setting['base_url'] ?? '';

// বেস ইউআরএল-এর উপর ভিত্তি করে সম্পূর্ণ এন্ডপয়েন্ট লিঙ্ক তৈরি করা
$endpoint_initiate = !empty($base_url) ? "{$base_url}/initiate_payment.php" : 'Please set and save a Base URL first.';
$endpoint_verify = !empty($base_url) ? "{$base_url}/verify_payment.php" : 'Please set and save a Base URL first.';

// হেডার এবং সাইডবার টেমপ্লেট যুক্ত করা
include 'templates/header.php';
include 'templates/sidebar.php';
?>

<!-- === ধাপ ৫: HTML এবং ফর্ম দেখানো === -->
<div class="page-container">
    <!-- কার্ড ১: API Access Credentials -->
    <div class="content-card api-card">
        <div class="card-header">
            <h3>API Access Credentials</h3>
            <p>Manage your API keys and endpoints for integration</p>
        </div>
        <div class="card-body">
            <div class="form-group">
                <label for="api_key">API Key</label>
                <div class="input-with-actions">
                    <input type="password" id="api_key" value="<?php echo htmlspecialchars($api_key); ?>" readonly>
                    <div class="actions">
                        <button type="button" class="icon-btn" id="toggle-key-visibility" title="Show/Hide Key"><i class="far fa-eye"></i></button>
                        <form action="api_settings.php" method="POST" style="display: inline;" onsubmit="return confirm('Are you sure you want to generate a new API key? This will invalidate the old one and break existing integrations.');">
                            <input type="hidden" name="action" value="generate_key">
                            <button type="submit" class="icon-btn" title="Generate New Key"><i class="fas fa-sync-alt"></i></button>
                        </form>
                        <button type="button" class="icon-btn copy-btn" data-copy-target="api_key" title="Copy Key"><i class="far fa-copy"></i></button>
                    </div>
                </div>
                <small>Your secret API key for authentication. Keep it secure.</small>
            </div>
        </div>
    </div>

    <!-- কার্ড ২: API Endpoints (এডিট করা যাবে) -->
    <div class="content-card api-card">
        <form action="api_settings.php" method="POST">
            <div class="card-header">
                <h3>API Endpoints</h3>
                <p>Your unique API endpoints for integration</p>
            </div>
            <div class="card-body">
                <div class="form-group">
                    <label for="base_url">Base URL</label>
                    <div class="input-with-actions">
                        <input type="text" id="base_url" name="base_url" value="<?php echo htmlspecialchars($base_url); ?>" placeholder="e.g., http://192.168.0.101/dashboard_project/api" required>
                        <button type="button" class="icon-btn copy-btn" data-copy-target="base_url" title="Copy URL"><i class="far fa-copy"></i></button>
                    </div>
                    <small>This is your root API endpoint. Enter the correct public URL of your API folder here.</small>
                </div>
                
                <div class="form-group">
                    <label>Payment Initiation Endpoint</label>
                    <div class="input-with-actions">
                        <input type="text" id="initiate_url" value="<?php echo htmlspecialchars($endpoint_initiate); ?>" readonly>
                        <button type="button" class="icon-btn copy-btn" data-copy-target="initiate_url" title="Copy URL"><i class="far fa-copy"></i></button>
                    </div>
                </div>

                <div class="form-group">
                    <label>Verify Payment Endpoint</label>
                    <div class="input-with-actions">
                        <input type="text" id="verify_url" value="<?php echo htmlspecialchars($endpoint_verify); ?>" readonly>
                        <button type="button" class="icon-btn copy-btn" data-copy-target="verify_url" title="Copy URL"><i class="far fa-copy"></i></button>
                    </div>
                </div>
            </div>
            <div class="settings-actions" style="padding: 20px; border-top: 1px solid #f1f1f1; margin: 0 -20px -20px;">
                <button type="submit" class="btn btn-primary">Save Settings</button>
            </div>
        </form>
    </div>

    <!-- কার্ড ৩: Documentation -->
    <div class="content-card api-card documentation-card">
        <div class="card-header">
            <h3><i class="far fa-file-alt"></i> Documentation</h3>
            <p>Access our comprehensive API documentation for integration details</p>
        </div>
        <div class="card-body">
            <a href="documentation.php" class="btn btn-primary"><i class="far fa-bookmark"></i> View Developer Docs</a>
        </div>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<!-- টোস্ট নোটিফিকেশন দেখানোর জন্য HTML -->
<div id="toast-notification"></div>

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
    // === ধাপ ৬: জাভাস্ক্রিপ্ট কার্যকারিতা যুক্ত করা ===
    
    // টোস্ট মেসেজ দেখানোর জন্য ফাংশন
    function showToast(message, isSuccess) {
        const toast = document.getElementById('toast-notification');
        if (!toast) return;
        toast.textContent = message;
        toast.className = 'show ' + (isSuccess ? 'success' : 'error');
        setTimeout(() => {
            toast.className = toast.className.replace('show', '');
        }, 3000);
    }

    <?php if ($success_message): ?>
        showToast('<?php echo $success_message; ?>', true);
    <?php endif; ?>

    // "Copy to Clipboard" বাটনের জন্য কার্যকারিতা
    document.querySelectorAll('.copy-btn').forEach(button => {
        button.addEventListener('click', function() {
            const targetId = this.dataset.copyTarget;
            const input = document.getElementById(targetId);
            
            const isPassword = input.type === 'password';
            if (isPassword) input.type = 'text';
            
            input.select();
            input.setSelectionRange(0, 99999); // For mobile devices
            
            try {
                document.execCommand('copy');
                const originalIcon = this.innerHTML;
                this.innerHTML = '<i class="fas fa-check"></i>';
                setTimeout(() => { this.innerHTML = originalIcon; }, 1500);
            } catch (err) {
                alert('Oops, unable to copy');
            }
            
            if (isPassword) input.type = 'password';
            window.getSelection().removeAllRanges();
        });
    });

    // API Key দেখানো/লুকানোর জন্য কার্যকারিতা
    const toggleBtn = document.getElementById('toggle-key-visibility');
    if (toggleBtn) {
        toggleBtn.addEventListener('click', function() {
            const apiKeyInput = document.getElementById('api_key');
            const icon = this.querySelector('i');
            if (apiKeyInput.type === 'password') {
                apiKeyInput.type = 'text';
                icon.classList.remove('fa-eye');
                icon.classList.add('fa-eye-slash');
            } else {
                apiKeyInput.type = 'password';
                icon.classList.remove('fa-eye-slash');
                icon.classList.add('fa-eye');
            }
        });
    }
});
</script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): app_redirect.php [Text Content] ---
================================================================================

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Processing Payment</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            background-color: #f4f7fa;
            color: #333;
        }
        .container {
            text-align: center;
            padding: 20px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>Processing your payment...</h2>
        <p>Please wait, you will be returned to the app shortly.</p>
    </div>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): auth_check.php [Text Content] ---
================================================================================

<?php
session_start();
// যদি user_id সেশনে সেট করা না থাকে, তার মানে ব্যবহারকারী লগইন করেনি
if (!isset($_SESSION['user_id'])) {
    // ব্যবহারকারীকে লগইন পেজে পাঠিয়ে দেওয়া হবে
    header("Location: login.php");
    exit();
}
?>

================================================================================
--- ফাইল পাথ (File Path): billing.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

// Fetch the user's current balance
$stmt = $pdo->prepare("SELECT balance, email FROM users WHERE id = ?");
$stmt->execute([$_SESSION['user_id']]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
$current_balance = $user['balance'] ?? 0.00;
$_SESSION['user_email'] = $user['email']; // Store email in session for initiate_funding.php

// === Credit Calculation Logic ===
$user_id = $_SESSION['user_id'];
define('BDT_TO_USD_RATE_JS', 0.00833333); // 1/120, JS ব্যবহারের জন্য

// ★★★ সমাধান: শুধুমাত্র ব্যালেন্স থেকে কেনা ক্রেডিটগুলো গণনা করা হচ্ছে ★★★
$stmt_purchased = $pdo->prepare("SELECT SUM(amount_bdt) as total_purchased FROM user_funds WHERE user_id = ? AND status = 'completed' AND transaction_unique_id LIKE 'manual_purchase_%'");
$stmt_purchased->execute([$user_id]);
$purchased_result = $stmt_purchased->fetch(PDO::FETCH_ASSOC);
$purchased_credits = $purchased_result['total_purchased'] ?? 0;

// 2. Define free credits for new accounts
$free_credits = 50;

// 3. Calculate total available credits
$total_credits = $free_credits + $purchased_credits;

// 4. Get total used credits (each record in credit_transactions is 1 credit)
$stmt_used = $pdo->prepare("SELECT COUNT(id) as total_used FROM credit_transactions WHERE user_id = ?");
$stmt_used->execute([$user_id]);
$used_result = $stmt_used->fetch(PDO::FETCH_ASSOC);
$used_credits = $used_result['total_used'] ?? 0;

// 5. Calculate remaining credits and usage percentage
$remaining_credits = $total_credits - $used_credits;
$usage_percentage = ($total_credits > 0) ? ($used_credits / $total_credits) * 100 : 0;
// === End of Credit Calculation ===


include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="billing-container">
        <aside class="billing-sidebar">
            <nav>
                <ul>
                    <li class="active"><a href="billing.php">Billing</a></li>
                    <li><a href="billing_history.php">Billing Histories</a></li>
                </ul>
            </nav>
        </aside>
        <main class="billing-main">
            <div class="billing-content-grid">
                <div class="account-balance">
                    <h3>Account Balance</h3>
                    <p class="balance"><?php echo number_format($current_balance, 2); ?> USD</p>
                    <p class="availability">Available for Purchasing Credits</p>
                    <button class="btn btn-primary" id="addFundsBtn">+ Add Funds</button>
                </div>
                <div class="plan-quota">
                    <h3>Plan quota</h3>
                    <div class="quota-item">
                        <div class="quota-info">
                            <span>Payments</span>
                            <span><?php echo number_format($used_credits); ?> / <?php echo number_format($total_credits); ?> (<?php echo number_format($usage_percentage, 0); ?>%)</span>
                        </div>
                        <div class="quota-bar">
                            <div class="quota-progress" style="width: <?php echo number_format($usage_percentage, 2); ?>%;"></div>
                        </div>
                        <div class="plan-allocation">
                            <p>Plan Allocation</p>
                            <ul>
                                <li>Used: <span><?php echo number_format($used_credits); ?> / <?php echo number_format($total_credits); ?></span></li>
                                <li>Remaining: <span><?php echo number_format($remaining_credits); ?></span></li>
                                <li>Reset date: <span>Jul 29, 2025</span></li>
                            </ul>
                        </div>
                    </div>
                    <button class="btn btn-secondary" id="purchaseCreditsBtn" style="margin-top: 15px;">+ Purchase Credits</button>
                </div>
            </div>
        </main>
    </div>
</div>

<!-- Add Funds Modal -->
<div id="addFundsModal" class="billing-modal-overlay">
    <div class="billing-modal-content">
        <div class="billing-modal-header">
            <h2>Add Funds</h2>
            <button class="close-modal-btn">&times;</button>
        </div>
        <div class="billing-modal-body">
            <form id="addFundsForm">
                <div class="form-group">
                    <label>Choose the amount<span class="required-star">*</span></label>
                    <div class="amount-grid">
                        <button type="button" class="amount-btn" data-amount="10">10 USD</button>
                        <button type="button" class="amount-btn active" data-amount="25">25 USD</button>
                        <button type="button" class="amount-btn" data-amount="50">50 USD</button>
                        <button type="button" class="amount-btn" data-amount="100">100 USD</button>
                        <button type="button" class="amount-btn" data-amount="250">250 USD</button>
                        <button type="button" class="amount-btn" data-amount="500">500 USD</button>
                        <button type="button" class="amount-btn" data-amount="1000">1000 USD</button>
                        <button type="button" class="amount-btn" data-amount="2000">2000 USD</button>
                        <button type="button" class="amount-btn" id="customAmountBtn">Custom</button>
                    </div>
                    <div class="form-group" id="customAmountInputContainer" style="display: none; margin-top: 15px;">
                        <input type="number" step="0.01" name="custom_amount" id="custom_amount_input" placeholder="Enter custom amount">
                    </div>
                </div>
            </form>
        </div>
        <div class="billing-modal-footer">
            <button type="button" class="btn btn-primary" id="submitFundsBtn">Submit</button>
            <button type="button" class="btn btn-secondary cancel-modal-btn">Cancel</button>
        </div>
    </div>
</div>

<!-- Purchase Credits Modal -->
<div id="purchaseCreditsModal" class="billing-modal-overlay">
    <div class="billing-modal-content" style="max-width: 550px;">
        <div class="billing-modal-header">
            <h2>Purchase Credits from Balance</h2>
            <button class="close-modal-btn">&times;</button>
        </div>
        <div class="billing-modal-body">
            <p style="margin-top:0;">Your current balance: <strong id="modal-current-balance">$<?php echo number_format($current_balance, 2); ?> USD</strong></p>
            <div class="form-group">
                <label for="credit-amount-input">Number of Credits (1 Credit = 1 BDT)</label>
                <input type="number" id="credit-amount-input" name="credit_amount" placeholder="e.g., 100" min="1">
            </div>
            <div class="amount-grid" style="grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));">
                <button type="button" class="amount-btn credit-preset" data-credits="100">100</button>
                <button type="button" class="amount-btn credit-preset" data-credits="200">200</button>
                <button type="button" class="amount-btn credit-preset" data-credits="500">500</button>
                <button type="button" class="amount-btn credit-preset" data-credits="1000">1000</button>
            </div>
            <div id="purchase-summary" style="margin-top: 20px; padding: 15px; background-color: #f8f9fa; border-radius: 8px; text-align: center;">
                Cost: <strong id="purchase-cost-display">$0.00 USD</strong>
                <p id="insufficient-balance-warning" style="color: #dc3545; display: none; margin-top: 5px;">Insufficient balance</p>
            </div>
        </div>
        <div class="billing-modal-footer">
            <button type="button" class="btn btn-primary" id="confirmPurchaseBtn">Confirm Purchase</button>
            <button type="button" class="btn btn-secondary cancel-modal-btn">Cancel</button>
        </div>
    </div>
</div>

<div id="toast-notification"></div>

</div> 
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>

<script>
document.addEventListener('DOMContentLoaded', function() {
    // --- Shared Toast Function ---
    function showToast(message, isSuccess) {
        const toast = document.getElementById('toast-notification');
        if (!toast) return;
        toast.textContent = message;
        toast.className = 'show ' + (isSuccess ? 'success' : 'error');
        setTimeout(() => { toast.className = toast.className.replace('show', ''); }, 3000);
    }

    // --- Add Funds Modal Logic ---
    const addFundsBtn = document.getElementById('addFundsBtn');
    const addFundsModal = document.getElementById('addFundsModal');
    if (addFundsModal && addFundsBtn) {
        const closeModalBtns = addFundsModal.querySelectorAll('.close-modal-btn, .cancel-modal-btn');
        const submitFundsBtn = document.getElementById('submitFundsBtn');
        const amountBtns = addFundsModal.querySelectorAll('.amount-btn');
        const customAmountInputContainer = document.getElementById('customAmountInputContainer');
        const customAmountInput = document.getElementById('custom_amount_input');
        
        const openModal = () => addFundsModal.classList.add('open');
        const closeModal = () => addFundsModal.classList.remove('open');

        addFundsBtn.addEventListener('click', openModal);
        closeModalBtns.forEach(btn => btn.addEventListener('click', closeModal));
        addFundsModal.addEventListener('click', (e) => { if (e.target === addFundsModal) closeModal(); });

        amountBtns.forEach(btn => {
            btn.addEventListener('click', function() {
                amountBtns.forEach(b => b.classList.remove('active'));
                this.classList.add('active');
                customAmountInput.value = '';
                if (this.id === 'customAmountBtn') {
                    customAmountInputContainer.style.display = 'block';
                } else {
                    customAmountInputContainer.style.display = 'none';
                }
            });
        });

        if(submitFundsBtn){
            submitFundsBtn.addEventListener('click', function() {
                let finalAmount = 0;
                const activeAmountBtn = addFundsModal.querySelector('.amount-btn.active');
                if (activeAmountBtn && activeAmountBtn.id !== 'customAmountBtn') {
                    finalAmount = parseFloat(activeAmountBtn.dataset.amount);
                } else {
                    finalAmount = parseFloat(customAmountInput.value);
                }

                if (!finalAmount || finalAmount <= 0) {
                    showToast('Please select or enter a valid amount.', false); return;
                }
                this.disabled = true; this.innerText = 'Processing...';
                fetch('initiate_funding.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ amount: finalAmount })})
                .then(response => response.json()).then(data => {
                    if (data.success && data.payment_url) { window.location.href = data.payment_url; } 
                    else { showToast(data.message || 'Could not initiate payment.', false); this.disabled = false; this.innerText = 'Submit'; }
                }).catch(() => { showToast('A network error occurred.', false); this.disabled = false; this.innerText = 'Submit'; });
            });
        }
    }
    
    // --- Purchase Credits Modal Logic ---
    const purchaseCreditsBtn = document.getElementById('purchaseCreditsBtn');
    const purchaseModal = document.getElementById('purchaseCreditsModal');
    if (purchaseCreditsBtn && purchaseModal) {
        const closePurchaseModalBtns = purchaseModal.querySelectorAll('.close-modal-btn, .cancel-modal-btn');
        const creditInput = document.getElementById('credit-amount-input');
        const costDisplay = document.getElementById('purchase-cost-display');
        const warningText = document.getElementById('insufficient-balance-warning');
        const confirmBtn = document.getElementById('confirmPurchaseBtn');
        const creditPresetBtns = purchaseModal.querySelectorAll('.credit-preset');

        const userBalance = parseFloat('<?php echo $current_balance; ?>');
        const bdtToUsdRate = parseFloat('<?php echo BDT_TO_USD_RATE_JS; ?>');

        const openPurchaseModal = () => purchaseModal.classList.add('open');
        const closePurchaseModal = () => {
             purchaseModal.classList.remove('open');
             creditInput.value = '';
             updateCost();
        };
        
        purchaseCreditsBtn.addEventListener('click', openPurchaseModal);
        closePurchaseModalBtns.forEach(btn => btn.addEventListener('click', closePurchaseModal));
        purchaseModal.addEventListener('click', (e) => { if (e.target === purchaseModal) closePurchaseModal(); });

        const updateCost = () => {
            const credits = parseInt(creditInput.value) || 0;
            if (credits <= 0) {
                costDisplay.textContent = '$0.00 USD';
                warningText.style.display = 'none';
                confirmBtn.disabled = true;
                return;
            }
            const cost = credits * bdtToUsdRate;
            costDisplay.textContent = `$${cost.toFixed(4)} USD`;

            if (cost > userBalance) {
                warningText.style.display = 'block';
                confirmBtn.disabled = true;
            } else {
                warningText.style.display = 'none';
                confirmBtn.disabled = false;
            }
        };

        creditInput.addEventListener('input', updateCost);
        
        creditPresetBtns.forEach(btn => {
            btn.addEventListener('click', function() {
                creditInput.value = this.dataset.credits;
                updateCost();
            });
        });

        confirmBtn.addEventListener('click', function() {
            const creditsToBuy = parseInt(creditInput.value);
            if (!creditsToBuy || creditsToBuy <= 0) {
                showToast('Please enter a valid number of credits.', false);
                return;
            }
            this.disabled = true;
            this.innerText = 'Processing...';

            fetch('api/purchase_credits.php', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ credits: creditsToBuy })
            })
            .then(res => res.json())
            .then(data => {
                if (data.success) {
                    showToast('Credits purchased successfully! Page will reload.', true);
                    setTimeout(() => window.location.reload(), 2000);
                } else {
                    showToast(data.message || 'Purchase failed.', false);
                    this.disabled = false;
                    this.innerText = 'Confirm Purchase';
                }
            })
            .catch(err => {
                 showToast('An error occurred. Please try again.', false);
                 this.disabled = false;
                 this.innerText = 'Confirm Purchase';
            });
        });
        
        updateCost(); // Initial call to set button state
    }

    // --- Handle Return from Checkout ---
    const urlParams = new URLSearchParams(window.location.search);
    const fundingStatus = urlParams.get('funding_status');
    const trxId = urlParams.get('trx_id');
    if (fundingStatus === 'success' && trxId) {
        fetch('verify_funding.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ trx_id: trxId })})
        .then(response => response.json()).then(data => {
            if (data.success) { showToast('Funds added successfully! Reloading...', true); setTimeout(() => window.location.href = 'billing.php', 2000); } 
            else { showToast(data.message || 'Funding verification failed.', false); }
        });
    } else if (fundingStatus === 'cancelled') {
        showToast('The funding process was cancelled.', false);
    }
});
</script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): billing_history.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';
include 'templates/header.php';
include 'templates/sidebar.php';

// Fetch credit transaction history for the logged-in user
$user_id = $_SESSION['user_id'];
$stmt = $pdo->prepare(
    "SELECT ct.transaction_date, ct.description, ct.credits_deducted, ct.cost_usd, t.user_submitted_trxid
     FROM credit_transactions ct
     LEFT JOIN transactions t ON ct.payment_transaction_id = t.id
     WHERE ct.user_id = ? 
     ORDER BY ct.transaction_date DESC"
);
$stmt->execute([$user_id]);
$credit_history = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<div class="page-container">
    <div class="billing-container">
        <aside class="billing-sidebar">
            <nav>
                <ul>
                    <li><a href="billing.php">Billing</a></li>
                    <li class="active"><a href="billing_history.php">Billing Histories</a></li>
                </ul>
            </nav>
        </aside>
        <main class="billing-main">
            <div class="content-card">
                <div class="card-header">
                    <h3>Credit History</h3>
                </div>
                <div class="card-body">
                    <table class="data-table">
                        <thead>
                            <tr>
                                <th>Date</th>
                                <th>Description</th>
                                <th>Gateway Trx ID</th>
                                <th>Credits Used</th>
                                <th>Cost (USD)</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php if (count($credit_history) > 0): ?>
                                <?php foreach ($credit_history as $entry): ?>
                                    <tr>
                                        <td><?php echo date("d M Y, H:i:s", strtotime($entry['transaction_date'])); ?></td>
                                        <td><?php echo htmlspecialchars($entry['description']); ?></td>
                                        <td><?php echo htmlspecialchars($entry['user_submitted_trxid'] ?? 'N/A'); ?></td>
                                        <td><?php echo number_format($entry['credits_deducted'], 2); ?></td>
                                        <td>$<?php echo number_format($entry['cost_usd'], 4); ?></td>
                                    </tr>
                                <?php endforeach; ?>
                            <?php else: ?>
                                <tr>
                                    <td colspan="5" style="text-align:center; padding: 20px;">No credit history found.</td>
                                </tr>
                            <?php endif; ?>
                        </tbody>
                    </table>
                </div>
            </div>
        </main>
    </div>
</div>

</div>
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>


================================================================================
--- ফাইল পাথ (File Path): brand_icon.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$user_id = $_SESSION['user_id'];
$success_message = '';
$upload_dir = "uploads/logos/{$user_id}/";

// ডেটাবেস থেকে বর্তমান লোগো গুলো আনা হচ্ছে
$stmt_fetch = $pdo->prepare("SELECT * FROM brand_logos WHERE user_id = ?");
$stmt_fetch->execute([$user_id]);
$current_logos = $stmt_fetch->fetch(PDO::FETCH_ASSOC);

// ছবি আপলোড এবং ডিলিট হ্যান্ডেল করার জন্য ফাংশন
function handle_upload($file_key, $upload_dir, $current_file_path) {
    if (!empty($_POST['remove_' . $file_key]) && $_POST['remove_' . $file_key] === '1') {
        if ($current_file_path && file_exists($current_file_path)) {
            unlink($current_file_path);
        }
        return null;
    }

    if (isset($_FILES[$file_key]) && $_FILES[$file_key]['error'] === UPLOAD_ERR_OK) {
        $file = $_FILES[$file_key];
        if (!is_dir($upload_dir)) {
            mkdir($upload_dir, 0777, true);
        }
        if ($current_file_path && file_exists($current_file_path)) {
            unlink($current_file_path);
        }
        $file_ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        $new_filename = uniqid($file_key . '_', true) . '.' . $file_ext;
        $destination = $upload_dir . $new_filename;
        if (move_uploaded_file($file['tmp_name'], $destination)) {
            return $destination;
        }
    }
    return $current_file_path;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $primary_logo_path = handle_upload('primary_logo', $upload_dir, $current_logos['primary_logo'] ?? null);
    $round_logo_path = handle_upload('round_logo', $upload_dir, $current_logos['round_logo'] ?? null);
    $favicon_path = handle_upload('favicon', $upload_dir, $current_logos['favicon'] ?? null);

    $sql = "INSERT INTO brand_logos (user_id, primary_logo, round_logo, favicon) VALUES (:user_id, :p_logo, :r_logo, :fav)
            ON DUPLICATE KEY UPDATE primary_logo = :p_logo, round_logo = :r_logo, favicon = :fav";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':user_id' => $user_id, ':p_logo' => $primary_logo_path, ':r_logo' => $round_logo_path, ':fav' => $favicon_path]);

    header("Location: brand_icon.php?success=1");
    exit();
}

if(isset($_GET['success'])) {
    $success_message = "Logos have been updated successfully!";
}

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <div><p class="breadcrumbs">Brand Settings > Brand Icon & Favicon</p><h1 class="page-title">Logo & Favicon</h1></div>
    </div>

    <div class="content-card">
        <form action="brand_icon.php" method="POST" enctype="multipart/form-data">
            <div class="settings-section" style="border-top: none; padding-top: 10px;">
                <h3>Logo & Favicon</h3><p>Configure the logos used throughout your application</p>
                <div class="logo-uploader-grid">
                    <?php
                    function render_uploader($name, $label, $tooltip, $current_path, $is_round = false, $size_text) {
                        $has_image = !empty($current_path);
                        $uploader_class = 'image-uploader' . ($is_round ? ' uploader-round' : '') . ($has_image ? ' has-preview' : '');
                        echo '<div class="form-group">';
                        echo '  <label class="label-with-tooltip">'.$label.($tooltip ? ' <i class="fas fa-question-circle"></i>' : '').'</label>';
                        echo '  <div class="'.$uploader_class.'" id="'.$name.'_uploader">';
                        echo '      <input type="file" name="'.$name.'" accept="image/*">';
                        echo '      <input type="hidden" name="remove_'.$name.'" value="">';
                        echo '      <div class="uploader-content">';
                        if ($has_image) {
                            echo '<div class="preview-container">';
                            echo '  <img src="'.htmlspecialchars($current_path).'?t='.time().'" alt="Preview" class="image-preview">';
                            echo '  <button type="button" class="remove-image-btn">&times;</button>';
                            echo '</div>';
                        } else {
                            echo '<div class="uploader-text">Drag & Drop your files or <span class="browse-link">Browse</span></div>';
                        }
                        echo '      </div>';
                        echo '  </div>';
                        echo '  <small>'.$size_text.'</small>';
                        echo '</div>';
                    }

                    render_uploader('primary_logo', 'Primary Logo', false, $current_logos['primary_logo'] ?? null, false, 'Main logo used in header and emails (48x48 recommended)');
                    render_uploader('round_logo', 'Round Logo', true, $current_logos['round_logo'] ?? null, true, 'Used for avatars and round logo displays (32x32 recommended)');
                    render_uploader('favicon', 'Favicon', true, $current_logos['favicon'] ?? null, true, 'Browser tab icon (32x32 recommended)');
                    ?>
                </div>
            </div>
            <div class="settings-actions"><button type="submit" class="btn btn-primary">Save changes</button></div>
        </form>
    </div>
</div>

</div> <!-- .main-content -->
<div id="toast-notification"></div>
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
    <?php if (!empty($success_message)): ?>
        showToast('<?php echo $success_message; ?>', true);
    <?php endif; ?>

    document.querySelectorAll('.image-uploader').forEach(uploader => {
        const fileInput = uploader.querySelector('input[type="file"]');
        const removeInput = uploader.querySelector('input[type="hidden"]');
        const content = uploader.querySelector('.uploader-content');
        const originalContentHTML = '<div class="uploader-text">Drag & Drop your files or <span class="browse-link">Browse</span></div>';

        const updatePreview = (file) => {
            if (!file) return;
            const reader = new FileReader();
            reader.onload = (e) => {
                content.innerHTML = `
                    <div class="preview-container">
                        <img src="${e.target.result}" alt="Preview" class="image-preview">
                        <button type="button" class="remove-image-btn">&times;</button>
                    </div>`;
                uploader.classList.add('has-preview');
                removeInput.value = "";
            };
            reader.readAsDataURL(file);
        };

        const removePreview = () => {
            fileInput.value = '';
            removeInput.value = "1";
            content.innerHTML = originalContentHTML;
            uploader.classList.remove('has-preview');
        };

        // ★★★ মূল সমাধান এখানে ★★★
        uploader.addEventListener('click', (e) => {
            // প্রথমে চেক করা হচ্ছে যে রিমুভ বাটনে ক্লিক করা হয়েছে কিনা
            if (e.target.classList.contains('remove-image-btn')) {
                e.stopPropagation(); // ইভেন্টটিকে অন্য কোথাও যেতে বাধা দেওয়া হচ্ছে
                removePreview();
                return; // ফাংশন থেকে বের হয়ে যাওয়া হচ্ছে
            }
            
            // যদি রিমুভ বাটন না হয়, তবে আপলোডারের যেকোনো জায়গায় ক্লিক করলে ফাইল ইনপুট ওপেন হবে
            fileInput.click();
        });

        fileInput.addEventListener('change', () => updatePreview(fileInput.files[0]));

        uploader.addEventListener('dragover', (e) => { e.preventDefault(); uploader.classList.add('drag-over'); });
        uploader.addEventListener('dragleave', () => uploader.classList.remove('drag-over'));
        uploader.addEventListener('drop', (e) => {
            e.preventDefault();
            uploader.classList.remove('drag-over');
            if (e.dataTransfer.files.length) {
                fileInput.files = e.dataTransfer.files;
                updatePreview(fileInput.files[0]);
            }
        });
    });
});

function showToast(message, isSuccess) {
    const toast = document.getElementById('toast-notification');
    if (!toast) return;
    toast.textContent = message;
    toast.className = 'show ' + (isSuccess ? 'success' : 'error');
    setTimeout(() => { toast.className = toast.className.replace('show', ''); }, 3000);
}
</script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): checkout.php [Text Content] ---
================================================================================

<?php
// checkout.php

// ডেটাবেস সংযোগ এবং সেশন শুরু করা
require 'db_connect.php';
session_start();

// --- Configuration ---
define('FEE_PER_TRANSACTION_BDT', 1.00);
define('USD_TO_BDT_RATE_FOR_FEE', 120);

// Helper function for fee deduction
function deduct_fee_and_log($pdo, $user_id, $transaction_db_id) {
    // Step 1: Calculate total available credits
    $free_credits = 50; // All new users get 50 free credits
    $stmt_purchased = $pdo->prepare("SELECT COALESCE(SUM(amount_bdt), 0) as total_purchased FROM user_funds WHERE user_id = ? AND status = 'completed' AND transaction_unique_id LIKE 'manual_purchase_%'");
    $stmt_purchased->execute([$user_id]);
    $purchased_credits = $stmt_purchased->fetchColumn();
    $total_available_credits = $free_credits + $purchased_credits;

    // Step 2: Calculate used credits
    $stmt_used = $pdo->prepare("SELECT COUNT(id) FROM credit_transactions WHERE user_id = ? FOR UPDATE");
    $stmt_used->execute([$user_id]);
    $used_credits = $stmt_used->fetchColumn();

    if ($used_credits >= $total_available_credits) {
        throw new Exception("Insufficient credits to cover transaction fee.");
    }

    // Step 3: Log credit usage
    $fee_bdt = FEE_PER_TRANSACTION_BDT;
    $fee_usd = $fee_bdt / USD_TO_BDT_RATE_FOR_FEE;
    $stmt_log = $pdo->prepare(
        "INSERT INTO credit_transactions (user_id, payment_transaction_id, cost_bdt, cost_usd, credits_deducted, description)
         VALUES (?, ?, ?, ?, 1, 'API Payment Verification Fee')"
    );
    $stmt_log->execute([$user_id, $transaction_db_id, $fee_bdt, $fee_usd]);
    return true;
}


$payment_successful = false;
$final_payment_data = null;
$toast_message = null;

// bKash Tokenized Callback হ্যান্ডেল করার জন্য
if (isset($_GET['bkash_callback']) && $_GET['bkash_callback'] == '1') {
    $paymentID = $_GET['paymentID'] ?? null;
    $status = $_GET['status'] ?? 'failed';
    $trx_id = $_GET['trx_id'] ?? null;

    if ($status !== 'success') {
        if ($trx_id) {
            header("Location: checkout.php?trx_id={$trx_id}&bkash_status=cancelled");
        } else {
            header("Location: payment_cancelled.php");
        }
        exit();
    }

    $redirect_url = 'payment_cancelled.php'; 
    if ($trx_id) {
        $stmt_urls = $pdo->prepare("SELECT success_url, cancel_url FROM transactions WHERE unique_id = ?");
        $stmt_urls->execute([$trx_id]);
        $urls = $stmt_urls->fetch(PDO::FETCH_ASSOC);
        if ($urls) {
            $redirect_url = $urls['cancel_url'] ?: 'payment_cancelled.php';
        }
    }

    if ($status === 'success' && $paymentID && $trx_id) {
        try {
            $stmt_trans = $pdo->prepare("SELECT * FROM transactions WHERE unique_id = ?");
            $stmt_trans->execute([$trx_id]);
            $transaction = $stmt_trans->fetch(PDO::FETCH_ASSOC);

            if ($transaction) {
                $stmt_gateway = $pdo->prepare("SELECT * FROM gateways WHERE user_id = ? AND gateway_key = 'bkash_merchant_tokenized'");
                $stmt_gateway->execute([$transaction['user_id']]);
                $creds = $stmt_gateway->fetch(PDO::FETCH_ASSOC);

                if ($creds) {
                    $env = $creds['test_mode'] ? 'sandbox' : 'pay';
                    $token_url = "https://tokenized.{$env}.bka.sh/v1.2.0-beta/tokenized/checkout/token/grant";
                    $token_req_body = json_encode(['app_key' => $creds['app_key'], 'app_secret' => $creds['app_secret']]);
                    $token_headers = ['Content-Type: application/json', 'username: ' . $creds['username'], 'password: ' . $creds['password']];
                    $ch = curl_init(); curl_setopt_array($ch, [CURLOPT_URL => $token_url, CURLOPT_HTTPHEADER => $token_headers, CURLOPT_POSTFIELDS => $token_req_body, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1]);
                    $token_res = curl_exec($ch); $token_data = json_decode($token_res, true); curl_close($ch);

                    if (isset($token_data['id_token'])) {
                        $execute_url = "https://tokenized.{$env}.bka.sh/v1.2.0-beta/tokenized/checkout/execute";
                        $execute_req_body = json_encode(['paymentID' => $paymentID]);
                        $execute_headers = ['Content-Type: application/json', 'Authorization: Bearer ' . $token_data['id_token'], 'X-App-Key: ' . $creds['app_key']];
                        $ch_exec = curl_init(); curl_setopt_array($ch_exec, [CURLOPT_URL => $execute_url, CURLOPT_HTTPHEADER => $execute_headers, CURLOPT_POSTFIELDS => $execute_req_body, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1]);
                        $execute_res = curl_exec($ch_exec); $execute_data = json_decode($execute_res, true); curl_close($ch_exec);

                        if (isset($execute_data['transactionStatus']) && $execute_data['transactionStatus'] === 'Completed') {
                            $pdo->beginTransaction();
                            try {
                                $pdo->prepare("UPDATE transactions SET status = 'completed', user_submitted_trxid = ? WHERE unique_id = ?")->execute([$execute_data['trxID'], $trx_id]);
                                
                                $meta_data = json_decode($transaction['meta_data'], true);
                                $source = $meta_data['source'] ?? 'api';
                                if ($source !== 'user_funding') {
                                    deduct_fee_and_log($pdo, $transaction['user_id'], $transaction['id']);
                                }
                                
                                $pdo->commit();

                                $wordpress_order_id = $meta_data['order_id'] ?? null;
                                $wordpress_webhook_url = $meta_data['webhook_url'] ?? null;
                                if (($source === 'api' || $source === 'whmcs') && $wordpress_order_id && $wordpress_webhook_url) {
                                    $webhook_payload = json_encode(['order_id' => $wordpress_order_id, 'transaction_id' => $execute_data['trxID'], 'status' => 'completed']);
                                    $ch_webhook = curl_init($wordpress_webhook_url);
                                    curl_setopt_array($ch_webhook, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $webhook_payload, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_TIMEOUT => 10]);
                                    curl_exec($ch_webhook);
                                    curl_close($ch_webhook);
                                }
                                
                                $payment_successful = true;
                                $final_payment_data = ['success' => true, 'source' => $source, 'redirect_url' => $transaction['success_url'], 'transaction_id' => $execute_data['trxID']];
                            } catch (Exception $e) {
                                $pdo->rollBack();
                                error_log("Fee deduction failed for bKash Tokenized trx_id {$trx_id}: " . $e->getMessage());
                            }
                        }
                    }
                }
            }
        } catch (Exception $e) {}
    }
    if (!$payment_successful) {
        header("Location: " . $redirect_url);
        exit();
    }
}

// Nagad Callback হ্যান্ডেল করার জন্য
if (isset($_GET['nagad_callback']) && $_GET['nagad_callback'] == '1') {
    $status = $_GET['status'] ?? 'failed';
    $payment_ref_id = $_GET['payment_ref_id'] ?? null;
    $order_id_from_nagad = $_GET['order_id'] ?? null;
    $trx_id = $order_id_from_nagad ? substr($order_id_from_nagad, 0, -4) : null;

    if ($status !== 'Success') {
        if($trx_id) { header("Location: checkout.php?trx_id={$trx_id}&nagad_status=cancelled"); }
        else { header("Location: payment_cancelled.php"); }
        exit();
    }

    $redirect_url = $trx_id ? "checkout.php?trx_id={$trx_id}&nagad_status=failed" : 'payment_cancelled.php';

    if ($status === 'Success' && $payment_ref_id && $trx_id) {
        try {
            $stmt_trans = $pdo->prepare("SELECT * FROM transactions WHERE unique_id = ?");
            $stmt_trans->execute([$trx_id]);
            $transaction = $stmt_trans->fetch(PDO::FETCH_ASSOC);

            if ($transaction) {
                $stmt_gateway = $pdo->prepare("SELECT * FROM gateways WHERE user_id = ? AND gateway_key = 'nagad_merchant'");
                $stmt_gateway->execute([$transaction['user_id']]);
                $creds = $stmt_gateway->fetch(PDO::FETCH_ASSOC);
                
                $nagad_url_prefix = ($creds && $creds['test_mode']) ? 'https://sandbox-ssl.mynagad.com' : 'https://ssl.mynagad.com';
                $verify_url = "{$nagad_url_prefix}/api/dfs/verify/payment/" . $payment_ref_id;

                $ch = curl_init(); curl_setopt_array($ch, [CURLOPT_URL => $verify_url, CURLOPT_RETURNTRANSFER => true]);
                $verify_res = curl_exec($ch); curl_close($ch);
                $verify_data = json_decode($verify_res, true);

                if (isset($verify_data['status']) && $verify_data['status'] === 'Success' && (float)$verify_data['amount'] == (float)$transaction['amount']) {
                    $pdo->beginTransaction();
                    try {
                        $pdo->prepare("UPDATE transactions SET status = 'completed', user_submitted_trxid = ? WHERE unique_id = ?")->execute([$verify_data['issuerPaymentRefNo'], $trx_id]);
                        
                        $meta_data = json_decode($transaction['meta_data'], true);
                        $source = $meta_data['source'] ?? 'api';
                        if ($source !== 'user_funding') {
                            deduct_fee_and_log($pdo, $transaction['user_id'], $transaction['id']);
                        }

                        $pdo->commit();
                        
                        $wordpress_order_id = $meta_data['order_id'] ?? null;
                        $wordpress_webhook_url = $meta_data['webhook_url'] ?? null;
                        if (($source === 'api' || $source === 'whmcs') && $wordpress_order_id && $wordpress_webhook_url) {
                            $webhook_payload = json_encode(['order_id' => $wordpress_order_id, 'transaction_id' => $verify_data['issuerPaymentRefNo'], 'status' => 'completed']);
                            $ch_webhook = curl_init($wordpress_webhook_url);
                            curl_setopt_array($ch_webhook, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $webhook_payload, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_TIMEOUT => 10]);
                            curl_exec($ch_webhook);
                            curl_close($ch_webhook);
                        }
                        
                        $payment_successful = true;
                        $final_payment_data = ['success' => true, 'source' => $source, 'redirect_url' => $transaction['success_url'], 'transaction_id' => $verify_data['issuerPaymentRefNo']];
                    } catch (Exception $e) {
                        $pdo->rollBack();
                        error_log("Fee deduction failed for Nagad trx_id {$trx_id}: " . $e->getMessage());
                    }
                }
            }
        } catch (Exception $e) {}
    }
    if (!$payment_successful) {
        header("Location: " . $redirect_url);
        exit();
    }
}

// === Main Logic for Page Load & Refresh ===
$unique_id = $_GET['trx_id'] ?? null;
if (!$unique_id) { die("Invalid payment link. Transaction ID is missing."); }

if (isset($_GET['bkash_status']) && $_GET['bkash_status'] === 'cancelled') {
    $toast_message = "Payment cancelled with bKash.";
} elseif (isset($_GET['nagad_status']) && $_GET['nagad_status'] === 'cancelled') {
    $toast_message = "Payment cancelled with Nagad.";
}

$stmt = $pdo->prepare("SELECT * FROM transactions WHERE unique_id = ?");
$stmt->execute([$unique_id]);
$transaction = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$transaction) {
    die("This payment link is invalid or does not exist.");
}

$is_cancelled_by_link = isset($_GET['status']) && $_GET['status'] === 'cancelled';
$meta_data = json_decode($transaction['meta_data'], true);
$source = $meta_data['source'] ?? 'api';
$is_payment_link = ($source === 'payment_link' || $source === 'default_payment_link');

// If transaction is completed, prepare the data for the success view
if ($transaction['status'] === 'completed') {
    $payment_successful = true;
    
    $stmt_gateway_info = $pdo->prepare("SELECT display_name FROM gateways WHERE user_id = ? LIMIT 1");
    $stmt_gateway_info->execute([$transaction['user_id']]);
    $gateway_info = $stmt_gateway_info->fetch(PDO::FETCH_ASSOC);

    $final_payment_data = [
        'success' => true,
        'source' => $source,
        'redirect_url' => $transaction['success_url'],
        'name' => $transaction['customer_name'],
        'email' => $transaction['customer_email'],
        'phone' => $transaction['phone'] ?? '01763705151',
        'amount' => $transaction['amount'],
        'transaction_id' => $transaction['user_submitted_trxid'],
        'payment_method' => $gateway_info['display_name'] ?? 'Bkash Personal'
    ];
}

$site_name = 'SecureSoftPayt';
$round_logo_path = 'images/logo-placeholder-round.png';

$user_id = $transaction['user_id'];
$amount = $transaction['amount'];
$cancel_url = $transaction['cancel_url'];

$stmt_brand = $pdo->prepare("SELECT bs.site_name, bl.round_logo FROM users u LEFT JOIN brand_settings bs ON u.id = bs.user_id LEFT JOIN brand_logos bl ON u.id = bl.user_id WHERE u.id = ?");
$stmt_brand->execute([$user_id]);
$brand_info = $stmt_brand->fetch(PDO::FETCH_ASSOC);

if ($brand_info) {
    $site_name = !empty($brand_info['site_name']) ? $brand_info['site_name'] : $site_name;
    $round_logo_path = !empty($brand_info['round_logo']) ? $brand_info['round_logo'] : $round_logo_path;
}

$stmt_gateways = $pdo->prepare("SELECT * FROM gateways WHERE user_id = ? AND status = 1");
$stmt_gateways->execute([$user_id]);
$gateways = $stmt_gateways->fetchAll(PDO::FETCH_ASSOC);

function get_gateway_logo($key) {
    $logos = ['bkash_personal' => 'images/bkash.png', 'nagad_personal' => 'images/nagad.png', 'rocket_personal' => 'images/rocket.png', 'upay_personal' => 'images/upay.png', 'bkash_merchant_tokenized' => 'images/bkash.png', 'nagad_merchant' => 'images/nagad.png', 'bkash_merchant_checkout' => 'images/bkash.png'];
    return $logos[$key] ?? 'images/default.png';
}

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Complete Your Payment</title>
    <script src="https://scripts.pay.bka.sh/versions/1.2.0-beta/checkout/bKash-checkout.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    
    <style>
        /* General Body & Container */
        .checkout-body { background-color: #f0f4f9; display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 20px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; }
        .checkout-container { background-color: #ffffff; width: 100%; max-width: 850px; padding: 40px; border-radius: 16px; box-shadow: 0 10px 30px rgba(0,0,0,0.08); }

        /* Payment Success View Styles */
        .payment-success-container { display: flex; gap: 40px; align-items: center; }
        .success-left-panel { flex: 1; text-align: left; position: relative; overflow: hidden; padding-bottom: 80px; }
        .success-left-panel h1 { font-size: 36px; color: #c9302c; margin-top: 0; margin-bottom: 10px; font-weight: 600; }
        .success-left-panel p { font-size: 16px; color: #555; margin-bottom: 25px; line-height: 1.5; }
        .main-success-img { max-width: 100%; height: auto; border-radius: 8px; position: relative; z-index: 2; }
        .decorative-wave { position: absolute; bottom: -80px; left: -50px; width: 110%; height: auto; z-index: 1; pointer-events: none; }
        .success-right-panel { flex: 1.1; background-color: #f8f9fa; border-radius: 12px; padding: 25px 30px; border: 1px solid #e9ecef; }
        .success-right-panel h2 { text-align: center; font-size: 22px; color: #333; margin-top: 0; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 1px solid #dee2e6; font-weight: 500;}
        .info-item { display: flex; justify-content: space-between; align-items: center; font-size: 15px; padding: 13px 0; border-bottom: 1px dashed #ced4da; }
        .info-item:last-child { border-bottom: none; }
        .info-item .label { color: #6c757d; }
        .info-item .value { color: #212529; font-weight: 500; }
        .info-item .status-completed { font-weight: bold; color: #28a745; }

        /* Payment Cancellation View */
        .payment-cancelled-view { text-align: center; padding: 40px 20px; }
        .cancel-illustration { max-width: 250px; margin-bottom: 30px; }
        .cancel-title { font-size: 48px; font-weight: 700; color: #343a40; margin: 0 0 10px 0; }
        .cancel-subtitle { font-size: 20px; color: #6c757d; margin: 0; }

        /* Other necessary styles */
        .bkash-loader{position:fixed;z-index:9999;width:100%;height:100%;background-color:#ffffffc2;left:0;top:0;background-image:url(https://res.cloudinary.com/d-coders/image/upload/v1592201998/wp-plugins/bkash.gif);background-position:center;background-repeat:no-repeat;display:none}
        .new-checkout-top-bar{position:relative;height:38px;border:1px solid #e0e0e0;border-radius:8px;background-color:#fff;margin-bottom:20px}.new-checkout-close-btn{position:absolute;top:50%;right:12px;transform:translateY(-50%);font-size:24px;color:#aaa;text-decoration:none;font-weight:400;line-height:1}.new-checkout-header{display:flex;align-items:center;gap:15px;margin-bottom:20px}.new-logo-wrapper img{width:70px;height:70px;border-radius:50%;object-fit:cover;border:1px solid #f0f0f0}.new-site-name{margin:0 0 10px;font-size:1.5rem;font-weight:600}.new-info-buttons{display:flex;flex-wrap:wrap;gap:10px}.new-info-btn{background-color:#fff;border:1px solid #dcdcdc;border-radius:20px;padding:6px 15px;font-size:14px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;color:#555}.new-info-btn .fas{color:#777}.new-payment-selection-bar{background-color:#c9302c;color:#fff;text-align:center;padding:12px;border-radius:8px;font-weight:500;margin-bottom:20px}.payment-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:15px;margin-bottom:25px}.payment-method{border:1px solid #dee2e6;border-radius:12px;padding:15px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;transition:all .2s ease-in-out}.payment-method:hover{border-color:#0d6efd;box-shadow:0 4px 12px rgba(0,0,0,.1)}.payment-method img{max-height:50px;margin-bottom:10px}.payment-method span::before{content:'';display:block;width:90%;height:1px;background-color:#ddd;margin:0 auto 10px}.payment-method span{font-size:14px;font-weight:500;color:#333}.new-pay-button-container{margin-top:25px}.new-btn-pay{width:100%;padding:15px;background:#4285f4;color:#fff;border:none;border-radius:8px;font-size:18px;font-weight:500;cursor:pointer;transition:background-color .2s}.new-btn-pay:hover{background:#3367d6}.instruction-top-bar{display:flex;justify-content:space-between;align-items:center;height:38px;border:1px solid #e0e0e0;border-radius:8px;background-color:#fff;margin-bottom:20px;padding:0 12px}.back-button{border:none;background:0 0;font-size:18px;color:#888;cursor:pointer;padding:0}.close-button-link{border:none;background:0 0;font-size:24px;color:#aaa;text-decoration:none;font-weight:400}.instruction-logo-container{text-align:center;margin:20px 0}.main-logo{max-height:60px;width:auto}.info-boxes{display:flex;gap:15px;margin-bottom:20px}.info-box{flex:1;border:1px solid #ddd;border-radius:12px;padding:15px;display:flex;justify-content:center;align-items:center}.logo-box{justify-content:flex-start;gap:8px}.logo-box img{height:30px;width:30px;border-radius:50%;object-fit:cover}.logo-box .site-name-small{font-weight:600;color:#333}.amount-box{font-size:1.2rem;font-weight:700;color:#333}.instruction-details{background-color:#f8f9fa;border:1px solid #eee;border-radius:12px;padding:20px}.instruction-details ul{list-style:none;padding:0;margin:0}.instruction-details ul li{position:relative;padding:12px 0 12px 25px;border-bottom:1px solid #e9ecef;display:flex;align-items:center;gap:10px;color:#555}.instruction-details ul li:before{content:'•';color:#0d6efd;font-size:20px;position:absolute;left:0;top:12px;line-height:1}.instruction-details ul li:last-child{border-bottom:none}.instruction-details ul li.instruction-item-stacked{flex-direction:column;align-items:flex-start;gap:5px}.instruction-details ul li.instruction-item-stacked .value-line{width:100%;display:flex;justify-content:space-between;align-items:center}.copy-btn{background-color:#0d6efd;color:#fff;border:none;border-radius:6px;padding:5px 10px;cursor:pointer;font-size:12px;margin-left:auto}.copy-btn .far{margin-right:5px}.trx-input-group{margin-top:20px}.trx-input-group label{display:block;font-weight:700;margin-bottom:8px;color:#333}.trx-input-group input{width:100%;padding:12px;border:1px solid #ced4da;border-radius:8px;box-sizing:border-box}.verify-button{width:100%;padding:15px;background-color:#0d6efd;color:#fff;border:none;border-radius:12px;font-size:18px;font-weight:700;cursor:pointer;margin-top:20px;transition:background-color .2s}.verify-button:hover{background-color:#0b5ed7}.toast-notification{position:fixed;top:20px;right:20px;color:#fff;padding:15px 20px;border-radius:8px;z-index:1002;opacity:0;transform:translateY(-30px);transition:all .3s ease-in-out;box-shadow:0 4px 10px rgba(0,0,0,.1)}.toast-notification.show{opacity:1;transform:translateY(0)}
        .success-message{text-align:center;padding:40px 20px}.success-message i{font-size:48px;color:#28a745;margin-bottom:15px}.success-message h4{font-size:22px;margin:0 0 10px}.success-message p{color:#6c757d;font-size:16px}
    </style>
</head>
<body class="checkout-body">
    <div class="bkash-loader"></div>
    <div id="toast" class="toast-notification"></div>
    
    <div class="checkout-container">
        
        <?php if ($payment_successful && $is_payment_link): ?>
            <!-- শুধুমাত্র পেমেন্ট লিংকের জন্য এই ডিজাইনটি দেখানো হবে -->
            <div class="payment-success-container">
                <div class="success-left-panel">
                    <h1>অভিনন্দন!</h1>
                    <p>আপনার পেমেন্টের জন্য ধন্যবাদ!</p>
                    <img src="images/ha.jpg" alt="Success Illustration" class="main-success-img">
                    <img src="images/Screenshot_2025-10-19_211100-removebg-preview.png" alt="Decorative Wave" class="decorative-wave">
                </div>
                <div class="success-right-panel">
                    <h2>পেমেন্টের তথ্য</h2>
                    <div class="info-item"><span class="label">পেমেন্ট পদ্ধতি:</span><span class="value"><?php echo htmlspecialchars($final_payment_data['payment_method']); ?></span></div>
                    <div class="info-item"><span class="label">ফোন নম্বর:</span><span class="value"><?php echo htmlspecialchars($final_payment_data['phone']); ?></span></div>
                    <div class="info-item"><span class="label">ট্রানজেকশন আইডি:</span><span class="value"><?php echo htmlspecialchars($final_payment_data['transaction_id']); ?></span></div>
                    <div class="info-item"><span class="label">পরিমাণ:</span><span class="value"><?php echo number_format($final_payment_data['amount'], 2); ?> BDT</span></div>
                    <div class="info-item"><span class="label">অবস্থা:</span><span class="value status-completed">COMPLETED</span></div>
                </div>
            </div>

        <?php elseif ($payment_successful && !$is_payment_link): ?>
            <!-- API এবং বিলিং এর জন্য এই ডিজাইনটি দেখানো হবে -->
            <div class="success-message">
                <i class="fas fa-check-circle"></i>
                <h4>Your transaction is complete!</h4>
                <p id="redirect-timer">Redirecting in 5 seconds...</p>
            </div>

        <?php elseif ($is_cancelled_by_link && $is_payment_link): ?>
             <!-- শুধুমাত্র পেমেন্ট লিংকের ক্যান্সেলেশনের জন্য এই নতুন ডিজাইন -->
            <div class="payment-cancelled-view">
                <img src="images/Screenshot_2025-10-19_214428-removebg-preview.png" alt="Cancellation Illustration" class="cancel-illustration">
                <h1 class="cancel-title">Oops!</h1>
                <p class="cancel-subtitle">Your payment is cancelled</p>
            </div>
        
        <?php elseif ($transaction['status'] === 'pending'): ?>
            <!-- পেমেন্ট বাকি থাকলে এই ফর্মটি দেখানো হবে -->
            <div id="selection-view">
                <div class="new-checkout-top-bar"><a href="<?php echo htmlspecialchars($cancel_url); ?>" class="new-checkout-close-btn">&times;</a></div>
                <div class="new-checkout-header">
                    <div class="new-logo-wrapper"><img src="<?php echo htmlspecialchars($round_logo_path); ?>" alt="Brand Logo"></div>
                    <div class="new-site-info"><h2 class="new-site-name"><?php echo htmlspecialchars($site_name); ?></h2></div>
                </div>
                <div class="new-payment-selection-bar">পেমেন্ট পদ্ধতি নির্বাচন করুন</div>
                <div class="payment-grid">
                    <?php foreach ($gateways as $gateway): ?>
                        <div class="payment-method" data-gateway-name="<?php echo htmlspecialchars($gateway['display_name']); ?>" data-account-number="<?php echo htmlspecialchars($gateway['account_number']); ?>" data-logo-src="<?php echo get_gateway_logo($gateway['gateway_key']); ?>" data-gateway-key="<?php echo htmlspecialchars($gateway['gateway_key']); ?>">
                            <img src="<?php echo get_gateway_logo($gateway['gateway_key']); ?>" alt="<?php echo htmlspecialchars($gateway['display_name']); ?>">
                            <span><?php echo htmlspecialchars($gateway['display_name']); ?></span>
                        </div>
                    <?php endforeach; ?>
                </div>
                <div class="new-pay-button-container"><button class="new-btn-pay">Pay <?php echo number_format($amount, 0); ?> BDT</button></div>
            </div>
            <div id="instruction-view" style="display: none;">
                <div class="instruction-top-bar"><button id="back-to-selection" class="back-button"><i class="fas fa-arrow-left"></i></button><a href="<?php echo htmlspecialchars($cancel_url); ?>" class="close-button-link">&times;</a></div>
                <div class="instruction-logo-container"><img id="instruction-logo-main" src="" alt="Gateway Logo" class="main-logo"></div>
                <div class="info-boxes">
                    <div class="info-box logo-box"><img src="<?php echo htmlspecialchars($round_logo_path); ?>" alt="Site Logo"><span class="site-name-small"><?php echo htmlspecialchars($site_name); ?></span></div>
                    <div id="instruction-amount" class="info-box amount-box"></div>
                </div>
                <div class="instruction-details">
                    <ul>
                        <li>Go to your <b id="gateway-name-text"></b> App and choose: <b>Send Money</b></li>
                        <li class="instruction-item-stacked"><span>Enter the Number:</span><div class="value-line"><b id="instruction-number"></b> <button class="copy-btn" data-copy-target="instruction-number"><i class="far fa-copy"></i> Copy</button></div></li>
                        <li>Enter the Amount: <b id="instruction-amount-text"></b> <button class="copy-btn" data-copy-target="instruction-amount-text"><i class="far fa-copy"></i> Copy</button></li>
                        <li class="instruction-item-stacked"><span>Put the <b>Transaction ID</b> in the box below and press <b>Verify</b>.</span></li>
                    </ul>
                    <div class="trx-input-group"><label for="transaction_id">Transaction ID</label><input type="text" id="transaction_id" name="transaction_id" placeholder="Enter Transaction ID"></div>
                </div>
                <button id="verifyButton" class="verify-button">VERIFY PAYMENT</button>
            </div>
        <?php endif; ?>

    </div>

    <script>
    document.addEventListener('DOMContentLoaded', function() {
        const isPaymentLink = <?php echo json_encode($is_payment_link); ?>;
        const isPaymentSuccessful = <?php echo json_encode($payment_successful); ?>;

        if (isPaymentSuccessful && !isPaymentLink) {
            // শুধুমাত্র API এবং বিলিং সফল হলে এই জাভাস্ক্রিপ্টটি কাজ করবে
            const finalData = <?php echo json_encode($final_payment_data); ?>;
            if (finalData && finalData.success) {
                let redirectUrl = finalData.redirect_url;
                if (finalData.transaction_id) {
                    const separator = redirectUrl.includes('?') ? '&' : '?';
                    redirectUrl += separator + 'transaction_id=' + encodeURIComponent(finalData.transaction_id);
                }
                
                let countdown = 5;
                const timerElement = document.getElementById('redirect-timer');
                const interval = setInterval(() => {
                    countdown--;
                    if (timerElement) timerElement.innerText = `Redirecting in ${countdown} seconds...`;
                    if (countdown <= 0) {
                        clearInterval(interval);
                        if (redirectUrl) window.location.href = redirectUrl;
                    }
                }, 1000);
            }
        }
        
        <?php if ($transaction['status'] === 'pending'): ?>
            // পেমেন্ট বাকি থাকলে এই জাভাস্ক্রিপ্টটি কাজ করবে
            const uniqueId = '<?php echo $transaction['unique_id'] ?? ''; ?>';
            const loader = document.querySelector('.bkash-loader');
            const selectionView = document.getElementById('selection-view');
            const instructionView = document.getElementById('instruction-view');
            const backButton = document.getElementById('back-to-selection');
            const verifyButton = document.getElementById('verifyButton');
            const transactionIdInput = document.getElementById('transaction_id');
            const amount = <?php echo json_encode(floatval($amount)); ?>;
            const initialToastMessage = <?php echo json_encode($toast_message); ?>;
            let selectedGatewayKey = null;

            function showToast(message, isSuccess) {
                const toast = document.getElementById('toast');
                if (toast) {
                    toast.innerText = message;
                    toast.style.backgroundColor = isSuccess ? '#28a745' : '#dc3545';
                    toast.classList.add('show');
                    setTimeout(() => toast.classList.remove('show'), 4000);
                }
            }
            if (initialToastMessage) { showToast(initialToastMessage, false); }
            
            document.querySelectorAll('.payment-method').forEach(method => {
                method.addEventListener('click', function() {
                    selectedGatewayKey = this.dataset.gatewayKey;
                    let action = null;
                    if (selectedGatewayKey === 'bkash_merchant_tokenized') action = 'initiate_tokenized_payment';
                    else if (selectedGatewayKey === 'nagad_merchant') action = 'initiate_nagad_payment';
                    else if (selectedGatewayKey === 'bkash_merchant_checkout') action = 'initiate_checkout_payment';

                    if (action) {
                        if (loader) loader.style.display = 'block';
                        fetch('api/verify_transaction.php', {
                            method: 'POST', headers: { 'Content-Type': 'application/json' },
                            body: JSON.stringify({ action: action, unique_payment_id: uniqueId, gateway_key: selectedGatewayKey })
                        }).then(res => res.json()).then(data => {
                            if (loader) loader.style.display = 'none';
                            if (data.success) {
                                if (data.redirect_url) { window.location.href = data.redirect_url; } 
                                else if (data.bkash_response && data.bkash_response.paymentID) {
                                    bKash.init({
                                        paymentMode: 'checkout',
                                        paymentRequest: { amount: amount.toString(), intent: 'sale', merchantInvoiceNumber: uniqueId },
                                        createRequest: (request) => bKash.create().onSuccess(data.bkash_response),
                                        executeRequestOnAuthorization: () => {
                                            if (loader) loader.style.display = 'block';
                                            fetch('api/verify_transaction.php', {
                                                method: 'POST', headers: {'Content-Type': 'application/json'},
                                                body: JSON.stringify({ action: 'execute_checkout_payment', paymentID: data.bkash_response.paymentID, unique_payment_id: uniqueId })
                                            }).then(res => res.json()).then(execData => {
                                                if (loader) loader.style.display = 'none';
                                                if (execData.success) { bKash.execute().onSuccess({}); window.location.reload(); } 
                                                else { showToast(execData.message || "Payment execution failed.", false); bKash.execute().onError(); }
                                            }).catch(() => {
                                                if (loader) loader.style.display = 'none';
                                                showToast("Network error during payment execution.", false); bKash.execute().onError();
                                            });
                                        },
                                        onClose: () => showToast("Payment was cancelled by user.", false)
                                    });
                                    document.getElementById('bKash_button').click();
                                }
                            } else { showToast(data.message || "Failed to initiate payment.", false); }
                        }).catch(() => { if (loader) loader.style.display = 'none'; showToast("A network error occurred.", false); });
                    } else {
                        document.getElementById('instruction-logo-main').src = this.dataset.logoSrc;
                        document.getElementById('instruction-amount').textContent = `${amount.toFixed(2)} BDT`;
                        document.getElementById('instruction-amount-text').textContent = `${amount.toFixed(2)}`;
                        document.getElementById('instruction-number').textContent = this.dataset.accountNumber;
                        document.getElementById('gateway-name-text').textContent = this.dataset.gatewayName.split(' ')[0];
                        if (selectionView) selectionView.style.display = 'none';
                        if (instructionView) instructionView.style.display = 'block';
                    }
                });
            });

            if (backButton) { backButton.addEventListener('click', () => { if (instructionView) instructionView.style.display = 'none'; if (selectionView) selectionView.style.display = 'block'; selectedGatewayKey = null; }); }
            if (verifyButton) {
                verifyButton.addEventListener('click', function() {
                    const trxId = transactionIdInput.value.trim();
                    if (trxId === '') { showToast("Please enter a Transaction ID.", false); return; }
                    this.disabled = true; this.innerText = 'VERIFYING...';
                    if (loader) loader.style.display = 'block';

                    fetch('api/verify_transaction.php', {
                        method: 'POST', headers: { 'Content-Type': 'application/json' },
                        body: JSON.stringify({ transaction_id: trxId, unique_payment_id: uniqueId, gateway_key: selectedGatewayKey })
                    }).then(res => res.json()).then(data => {
                        if (loader) loader.style.display = 'none';
                        if (data.success) { window.location.reload(); } 
                        else { showToast(data.message || "An error occurred during verification.", false); this.disabled = false; this.innerText = 'VERIFY PAYMENT'; }
                    }).catch(() => { if (loader) loader.style.display = 'none'; showToast("Request failed. Please check your network connection.", false); this.disabled = false; this.innerText = 'VERIFY PAYMENT'; });
                });
            }
            const payButton = document.querySelector('.new-btn-pay');
            if (payButton) { payButton.addEventListener('click', () => document.querySelector('.payment-method')?.click()); }
        <?php endif; ?>
    });
    </script>
    <button id="bKash_button" style="display:none;">Pay with bKash</button>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): create_gateway.php [Text Content] ---
================================================================================

<?php
/**
 * Create Gateway Script for Web Dashboard
 * Version 2.1 - Handles authentication via PHP Session.
 * THIS FILE IS MEANT TO BE CALLED FROM THE WEB DASHBOARD FORM.
 */

// ব্যবহারকারী লগইন করা আছে কিনা তা কঠোরভাবে পরীক্ষা করা
// auth_check.php ফাইলটি session_start() কল করে এবং $_SESSION['user_id'] আছে কিনা তা নিশ্চিত করে।
require 'auth_check.php';

// যদি কোনো কারণে auth_check.php চালানোর পরেও সেশন না পাওয়া যায়, তবে স্ক্রিপ্ট বন্ধ করে দেওয়া হবে।
// এটি একটি অতিরিক্ত নিরাপত্তা স্তর।
if (!isset($_SESSION['user_id'])) {
    die("Authentication Error: User ID not found in session. Please log in again.");
}

// ডাটাবেস সংযোগ স্থাপন করা
require 'db_connect.php';

// শুধুমাত্র POST মেথডের অনুরোধ গ্রহণ করা হবে
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
    // সেশন থেকে লগইন করা ব্যবহারকারীর আইডি (user_id) সংগ্রহ করা হচ্ছে।
    $user_id = $_SESSION['user_id']; 
    
    // ফর্ম থেকে পাঠানো গেটওয়ের কী (key) গ্রহণ করা হচ্ছে
    $gateway_key = $_POST['gateway_key'] ?? '';

    // গেটওয়ে কী-এর উপর ভিত্তি করে একটি ডিফল্ট নাম সেট করা
    $display_name = '';
    switch ($gateway_key) {
        case 'bkash_personal': $display_name = 'Bkash Personal'; break;
        case 'nagad_personal': $display_name = 'Nagad Personal'; break;
        case 'rocket_personal': $display_name = 'Rocket Personal'; break;
        case 'upay_personal': $display_name = 'Upay Personal'; break;
        case 'bkash_merchant_tokenized': $display_name = 'bKash Marchant (Tokenized)'; break;
        case 'nagad_merchant': $display_name = 'Nagad Marchant'; break;
        case 'bkash_merchant_checkout': $display_name = 'bKash Marchant (Checkout)'; break;
    }

    if (!empty($display_name)) {
        try {
            $sql = "INSERT INTO gateways (user_id, display_name, gateway_key) 
                    VALUES (:user_id, :display_name, :gateway_key)";
            
            $stmt = $pdo->prepare($sql);
            $stmt->execute([
                ':user_id' => $user_id,
                ':display_name' => $display_name,
                ':gateway_key' => $gateway_key
            ]);
        } catch (PDOException $e) {
            die("Database Error: Could not create the gateway. Details: " . $e->getMessage());
        }
    }
}

// সফলভাবে তৈরি হওয়ার পর বা কোনো ভুল অনুরোধ আসলে, ব্যবহারকারীকে পেমেন্ট গেটওয়ে পেজে ফিরিয়ে নেওয়া হবে
header("Location: payment.php");
exit();
?>

================================================================================
--- ফাইল পাথ (File Path): create_payment_link.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Payment Links > Create</p>
            <h1 class="page-title">Create Payment Link</h1>
        </div>
    </div>

    <div class="content-card">
        <form action="process_create_link.php" method="POST">
            <div class="form-section">
                <div class="form-row">
                    <div class="form-group half-width">
                        <label for="product_name">Product name<span class="required-star">*</span></label>
                        <input type="text" id="product_name" name="product_name" required>
                    </div>
                    <div class="form-group half-width">
                        <label for="quantity">Quantity<span class="required-star">*</span></label>
                        <input type="number" id="quantity" name="quantity" value="0" required>
                    </div>
                </div>

                <div class="form-group">
                    <label for="product_description">Product description</label>
                    <textarea id="product_description" name="product_description" rows="4"></textarea>
                </div>

                <div class="form-row">
                    <div class="form-group third-width">
                        <label for="currency">Currency</label>
                        <div class="select-wrapper">
                            <select id="currency" name="currency">
                                <option value="BDT" selected>BDT</option>
                                <option value="USD">USD</option>
                            </select>
                        </div>
                    </div>
                    <div class="form-group third-width">
                        <label for="amount">Amount<span class="required-star">*</span></label>
                        <div class="input-with-prefix">
                            <span>BDT</span>
                            <input type="number" step="0.01" id="amount" name="amount" placeholder="0.00" required>
                        </div>
                    </div>
                    <div class="form-group third-width">
                        <label for="expire_date">Expire Date</label>
                        <input type="date" id="expire_date" name="expire_date">
                    </div>
                </div>

                <div class="form-group">
                    <label>Status<span class="required-star">*</span></label>
                    <label class="toggle-switch">
                        <input type="checkbox" name="status" value="1" checked>
                        <span class="slider"></span>
                    </label>
                </div>
            </div>

            <div class="form-actions" style="border-top: 1px solid #f1f1f1; padding-top: 20px; margin-top: 20px;">
                <button type="submit" class="btn btn-primary">Save Changes</button>
                <a href="payment_links.php" class="btn btn-secondary">Cancel</a>
            </div>
        </form>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): credit_eligibility.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

// API কলের জন্য ডাইনামিক URL তৈরি করা
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$host = $_SERVER['HTTP_HOST'];
$base_path = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); 
$api_base_url = "{$protocol}://{$host}{$base_path}/api/";

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<!-- এই পেজের জন্য বিশেষ CSS -->
<style>
    .search-card { margin-bottom: 25px; }
    #search-results { margin-top: 25px; }
    .profile-header { display: flex; align-items: center; gap: 20px; margin-bottom: 30px; }
    .profile-avatar { width: 80px; height: 80px; border-radius: 50%; object-fit: cover; border: 3px solid #7367f0; }
    .profile-info h2 { margin: 0; font-size: 1.8rem; }
    .profile-info p { margin: 5px 0 0; color: #888; }
    .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; margin-bottom: 30px; }
    .stat-card { background-color: #fff; border-radius: 12px; padding: 20px; box-shadow: 0 4px 24px 0 rgba(34, 41, 47, 0.1); display: flex; align-items: center; gap: 15px; }
    .stat-card .icon { font-size: 2rem; width: 50px; height: 50px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: #fff; }
    .stat-card .details .value { font-size: 1.5rem; font-weight: 600; }
    .stat-card .details .label { color: #888; font-size: 0.9rem; }
    .icon.bg-blue { background-color: #0d6efd; } .icon.bg-green { background-color: #28c76f; }
    .icon.bg-orange { background-color: #ff9f43; } .icon.bg-purple { background-color: #6f42c1; }
</style>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Modules &gt; Credit Eligibility</p>
            <h1 class="page-title">Credit Eligibility Check</h1>
        </div>
    </div>

    <!-- সার্চ করার জন্য কার্ড -->
    <div class="content-card search-card">
        <h3>Find User</h3>
        <p>Enter the user's name or email to view their credit details.</p>
        <form id="search-form">
            <div class="form-group">
                <label for="search_term">Search by Name or Email</label>
                <div class="search-box">
                    <i class="fas fa-search"></i>
                    <input type="text" id="search_term" name="search_term" placeholder="e.g., John Doe or john@example.com" required>
                </div>
            </div>
            <button type="submit" class="btn btn-primary">Search</button>
        </form>
    </div>

    <!-- সার্চের ফলাফল এখানে দেখানো হবে -->
    <div id="search-results">
        <!-- AJAX দিয়ে ফলাফল এখানে যুক্ত করা হবে -->
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    const apiBaseUrl = <?php echo json_encode($api_base_url); ?>;
    const searchForm = document.getElementById('search-form');
    const searchResultsContainer = document.getElementById('search-results');

    searchForm.addEventListener('submit', function(e) {
        e.preventDefault();
        const searchTerm = document.getElementById('search_term').value;
        if (!searchTerm) return;

        searchResultsContainer.innerHTML = '<p>Searching...</p>';
        
        fetch(`${apiBaseUrl}get_customer_details.php?search=${encodeURIComponent(searchTerm)}`)
            .then(response => {
                if (!response.ok) {
                    throw new Error('Network response was not ok. Status: ' + response.status);
                }
                return response.json();
            })
            .then(data => {
                if (data.success) {
                    const user = data.user_info;
                    const details = data.details;
                    
                    let historyHtml = '';
                    if (data.credit_history && data.credit_history.length > 0) {
                        data.credit_history.forEach(entry => {
                            const trxId = entry.user_submitted_trxid ? entry.user_submitted_trxid : 'N/A';
                            const date = new Date(entry.transaction_date).toLocaleString('en-US', { day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' });
                            historyHtml += `<tr><td>${date}</td><td>${entry.description}</td><td>${trxId}</td><td>${parseFloat(entry.credits_deducted).toFixed(2)}</td><td>$${parseFloat(entry.cost_usd).toFixed(4)}</td></tr>`;
                        });
                    } else {
                        historyHtml = '<tr><td colspan="5" style="text-align:center; padding: 20px;">No credit usage history found.</td></tr>';
                    }

                    searchResultsContainer.innerHTML = `
                        <div class="stat-card">
                            <div class="icon"><i class="fas fa-coins"></i></div>
                            <div class="details">
                                <div class="value">${details.credits_used} / ${details.total_credits}</div>
                                <div class="label">Credits Used</div>
                            </div>
                        </div>
                        <div class="content-card" style="margin-top: 25px;">
                            <h3>Credit Usage History for ${user.username}</h3>
                            <table class="data-table">
                                <thead><tr><th>Date</th><th>Description</th><th>Gateway Trx ID</th><th>Credits Used</th><th>Cost (USD)</th></tr></thead>
                                <tbody>${historyHtml}</tbody>
                            </table>
                        </div>
                    `;
                } else {
                    searchResultsContainer.innerHTML = `<div class="content-card" style="background-color: #f8d7da; color: #842029; padding: 15px;"><p>${data.message}</p></div>`;
                }
            })
            .catch(error => {
                searchResultsContainer.innerHTML = `<div class="content-card" style="background-color: #f8d7da; color: #842029; padding: 15px;"><p>An error occurred while searching. Please check the browser console for details.</p></div>`;
                console.error('Search Fetch Error:', error);
            });
    });
});
</script>

<?php
// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
// ★★★      মূল সমাধান: ফুটার টেমপ্লেটটি এখানে যুক্ত করা হয়েছে      ★★★
// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
include 'templates/footer.php'; 
?>

================================================================================
--- ফাইল পাথ (File Path): customers.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

include 'templates/header.php';
include 'templates/sidebar.php';

$users = [];
try {
    // ডাটাবেস থেকে এখন account_status কলামটিও আনা হচ্ছে
    $sql = "SELECT id, username, email, license_key, account_status, suspended_until FROM users ORDER BY id DESC";
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    error_log("User data fetch error: " . $e->getMessage());
}
?>

<style>
/* ড্রপডাউন এবং অন্যান্য UI উপাদানের জন্য স্টাইল */
.action-dropdown { position: relative; display: inline-block; }
.dropdown-content { display: none; position: absolute; right: 0; background-color: #ffffff; min-width: 170px; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); z-index: 10; border-radius: 8px; border: 1px solid #e0e0e0; }
.dropdown-content a { color: black; padding: 12px 16px; text-decoration: none; display: flex; align-items: center; gap: 10px; font-size: 14px; }
.dropdown-content a:hover { background-color: #f1f1f1; }
.dropdown-content a .fas { color: #6c757d; }
.show { display: block; }
.hidden-form { display: none; }
</style>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Customers &gt; User List</p>
            <h1 class="page-title">Users</h1>
        </div>
        <div class="page-header-actions">
            <a href="#" id="newCustomerBtn" class="btn btn-primary">
                <i class="fas fa-plus"></i> New customer
            </a>
        </div>
    </div>

    <div class="content-card">
        <div class="card-toolbar">
            <div class="toolbar-left"></div>
            <div class="toolbar-right" style="display: flex; align-items: center; gap: 15px;">
                <div class="search-box">
                    <i class="fas fa-search"></i>
                    <input type="text" placeholder="Search Users">
                </div>
            </div>
        </div>

        <table class="data-table">
            <thead>
                <tr>
                    <th>Username</th> <th>Email</th> <th>License Key</th> <th>Account Status</th>
                    <th style="text-align: right;">Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($users as $user): ?>
                    <tr>
                        <td><?php echo htmlspecialchars($user['username']); ?></td>
                        <td><?php echo htmlspecialchars($user['email']); ?></td>
                        <td><?php echo htmlspecialchars($user['license_key'] ?: 'N/A'); ?></td>
                        <td>
                            <!-- এখন license_status এর পরিবর্তে account_status দেখানো হচ্ছে -->
                            <span class="status-badge <?php echo $user['account_status'] === 'active' ? 'status-connected' : 'status-disconnected'; ?>">
                                <?php echo htmlspecialchars(ucfirst($user['account_status'])); ?>
                            </span>
                            <?php if ($user['account_status'] === 'suspended' && $user['suspended_until']): ?>
                                <small style="display: block; color: #e74c3c;">Until: <?php echo date("d M, Y H:i", strtotime($user['suspended_until'])); ?></small>
                            <?php endif; ?>
                        </td>
                        <td style="text-align: right;">
                            <div class="action-dropdown">
                                <button onclick="toggleDropdown(<?php echo $user['id']; ?>)" class="btn btn-secondary">Actions</button>
                                <div id="dropdown-<?php echo $user['id']; ?>" class="dropdown-content">
                                    <a href="view_customer.php?id=<?php echo $user['id']; ?>"><i class="fas fa-eye"></i>View Account</a>
                                    <!-- অ্যাকশনগুলো এখন account_status এর উপর ভিত্তি করে দেখানো হবে -->
                                    <?php if ($user['account_status'] === 'active'): ?>
                                        <a href="#" onclick="document.getElementById('action_suspend_<?php echo $user['id']; ?>').submit(); return false;"><i class="fas fa-pause-circle"></i>Suspend Account</a>
                                        <a href="#" onclick="document.getElementById('action_terminate_<?php echo $user['id']; ?>').submit(); return false;"><i class="fas fa-ban"></i>Terminate Account</a>
                                        <a href="#" class="temporary-ban-btn" data-userid="<?php echo $user['id']; ?>"><i class="fas fa-clock"></i>Temporary Ban</a>
                                    <?php else: ?>
                                         <a href="#" onclick="document.getElementById('action_reactivate_<?php echo $user['id']; ?>').submit(); return false;"><i class="fas fa-check-circle"></i>Re-activate Account</a>
                                    <?php endif; ?>
                                    <a href="#" onclick="if(confirm('Are you sure you want to permanently delete this user? This cannot be undone.')) { document.getElementById('action_delete_<?php echo $user['id']; ?>').submit(); } return false;"><i class="fas fa-trash-alt"></i>Delete User</a>
                                </div>
                            </div>
                            <!-- অ্যাকশন সাবমিট করার জন্য লুকানো ফর্ম -->
                            <form id="action_suspend_<?php echo $user['id']; ?>" action="update_user_status.php" method="POST" class="hidden-form"><input type="hidden" name="user_id" value="<?php echo $user['id']; ?>"><input type="hidden" name="action" value="suspend"></form>
                            <form id="action_terminate_<?php echo $user['id']; ?>" action="update_user_status.php" method="POST" class="hidden-form"><input type="hidden" name="user_id" value="<?php echo $user['id']; ?>"><input type="hidden" name="action" value="terminate"></form>
                            <form id="action_reactivate_<?php echo $user['id']; ?>" action="update_user_status.php" method="POST" class="hidden-form"><input type="hidden" name="user_id" value="<?php echo $user['id']; ?>"><input type="hidden" name="action" value="reactivate"></form>
                            <form id="action_delete_<?php echo $user['id']; ?>" action="delete_customer.php" method="GET" class="hidden-form"><input type="hidden" name="id" value="<?php echo $user['id']; ?>"></form>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        
        <div class="card-footer">
            <div class="pagination-controls">
                <span>Per page</span>
                <select><option selected>10</option><option>20</option><option>50</option></select>
            </div>
        </div>
    </div>
</div>

<!-- নতুন ব্যবহারকারী যোগ করার জন্য মডাল (HTML) -->
<div id="customerModal" class="modal">
    <div class="modal-content" style="max-width: 550px;">
        <form id="customerForm" action="add_customer.php" method="POST">
            <div class="modal-header">
                <h2 id="modalTitle">Create New User</h2>
                <span class="close-button">&times;</span>
            </div>
            <div class="modal-body">
                <div class="form-group">
                    <label for="username">Username<span class="required-star">*</span></label>
                    <input type="text" id="username" name="username" required>
                </div>
                <div class="form-group">
                    <label for="email">Email<span class="required-star">*</span></label>
                    <input type="email" id="email" name="email" required>
                </div>
                <div class="form-group">
                    <label for="password">Password<span class="required-star">*</span></label>
                    <input type="password" id="password" name="password" required>
                </div>
                <div class="form-group">
                    <label for="license_key">License Key</label>
                    <input type="text" id="license_key" name="license_key">
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary cancel-btn">Cancel</button>
                <button type="submit" class="btn btn-primary">Create User</button>
            </div>
        </form>
    </div>
</div>

<!-- অস্থায়ী ব্যানের জন্য তারিখ সিলেক্ট করার মডাল -->
<div id="tempBanModal" class="modal">
    <div class="modal-content" style="max-width: 450px;">
        <form id="tempBanForm" action="update_user_status.php" method="POST">
            <div class="modal-header">
                <h2>Set Temporary Ban</h2>
                <span class="close-button">&times;</span>
            </div>
            <div class="modal-body">
                <input type="hidden" name="user_id" id="modal_user_id">
                <input type="hidden" name="action" value="temporary_ban">
                <div class="form-group">
                    <label for="until_date">Ban Until<span class="required-star">*</span></label>
                    <input type="datetime-local" id="until_date" name="until_date" required style="width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 6px;">
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary cancel-btn">Cancel</button>
                <button type="submit" class="btn btn-primary">Confirm Ban</button>
            </div>
        </form>
    </div>
</div>

</div> <!-- .main-content 닫ার ট্যাগ -->

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
<script>
// ড্রপডাউন টগল করার ফাংশন
function toggleDropdown(userId) {
    var allDropdowns = document.querySelectorAll('.dropdown-content.show');
    allDropdowns.forEach(function(d) {
        if (!d.id.includes(userId)) { d.classList.remove('show'); }
    });
    document.getElementById("dropdown-" + userId).classList.toggle("show");
}

window.onclick = function(event) {
    if (!event.target.matches('.btn-secondary')) {
        var dropdowns = document.getElementsByClassName("dropdown-content");
        for (var i = 0; i < dropdowns.length; i++) {
            if (dropdowns[i].classList.contains('show')) {
                dropdowns[i].classList.remove('show');
            }
        }
    }
}

// সব মডালের জন্য ஒருங்கிணைিত জাভাস্ক্রিপ্ট
document.addEventListener('DOMContentLoaded', function() {
    // --- Add User Modal Logic ---
    const addUserModal = document.getElementById('customerModal');
    const newUserBtn = document.getElementById('newCustomerBtn');
    if (addUserModal && newUserBtn) {
        const closeBtn = addUserModal.querySelector('.close-button');
        const cancelBtn = addUserModal.querySelector('.cancel-btn');
        const openModal = () => {
            addUserModal.querySelector('form').reset();
            addUserModal.style.display = 'block';
        };
        const closeModal = () => {
            addUserModal.style.display = 'none';
        };
        newUserBtn.addEventListener('click', function(e) {
            e.preventDefault();
            openModal();
        });
        closeBtn.addEventListener('click', closeModal);
        cancelBtn.addEventListener('click', closeModal);
    }

    // --- Temporary Ban Modal Logic ---
    const tempBanModal = document.getElementById('tempBanModal');
    if (tempBanModal) {
        const closeBtn = tempBanModal.querySelector('.close-button');
        const cancelBtn = tempBanModal.querySelector('.cancel-btn');
        const closeModal = () => tempBanModal.style.display = 'none';

        document.querySelectorAll('.temporary-ban-btn').forEach(button => {
            button.addEventListener('click', function(e) {
                e.preventDefault();
                document.getElementById('modal_user_id').value = this.dataset.userid;
                tempBanModal.style.display = 'block';
            });
        });
        closeBtn.addEventListener('click', closeModal);
        cancelBtn.addEventListener('click', closeModal);
    }

    // --- Close any modal on outside click ---
    window.addEventListener('click', function(event) {
        if (event.target.classList.contains('modal')) {
            event.target.style.display = 'none';
        }
    });
});
</script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): db_connect.php [Text Content] ---
================================================================================

<?php
$host = 'localhost'; $dbname = 'wpbitess_securesoftpay'; $username = 'wpbitess_securesoftpay'; $password = '1234zx@ASDF';
try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) { die("Could not connect: " . $e->getMessage()); }

// ★★★ মূল সমাধান এখানে ★★★
// এখন থেকে শুধুমাত্র API কলের জন্য কাস্টম ডেটাবেস সেশন হ্যান্ডলার লোড হবে।

// $_SERVER['SCRIPT_NAME'] ব্যবহার করে বর্তমান ফাইলের পাথ পরীক্ষা করা হচ্ছে।
// যদি পাথের মধ্যে '/api/' অংশটি থাকে, তবেই শুধুমাত্র নিচের কোডটি কাজ করবে।
if (strpos($_SERVER['SCRIPT_NAME'], '/api/') !== false) {
    // এটি একটি API অনুরোধ, তাই কাস্টম ডেটাবেস সেশন হ্যান্ডলার সক্রিয় করা হচ্ছে।
    require_once __DIR__ . '/SessionManager.php';
    $sessionManager = new SessionManager($pdo);
    session_set_save_handler($sessionManager, true);
}
// যদি '/api/' পাথের মধ্যে না থাকে (অর্থাৎ এটি একটি ড্যাশবোর্ডের পেজ),
// তবে উপরের কোনো কোডই কাজ করবে না এবং PHP তার নিজস্ব ডিফল্ট ফাইল-ভিত্তিক সেশন ব্যবহার করবে।
?>

================================================================================
--- ফাইল পাথ (File Path): delete_customer.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

// ★★★ সমাধান: এখন ইমেইলের পরিবর্তে யூசர் আইডি (user id) নেওয়া হচ্ছে ★★★
$user_id_to_delete = $_GET['id'] ?? null;

if ($user_id_to_delete) {
    try {
        // ★★★ সমাধান: transactions টেবিলের পরিবর্তে users টেবিল থেকে ডেটা ডিলিট করা হচ্ছে ★★★
        $sql = "DELETE FROM users WHERE id = :id";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([':id' => $user_id_to_delete]);

        // সম্পর্কিত ডেটা ডিলিট করা (ঐচ্ছিক কিন্তু জরুরি)
        // settings টেবিল থেকে ডিলিট করা হচ্ছে
        $stmt_settings = $pdo->prepare("DELETE FROM settings WHERE user_id = :user_id");
        $stmt_settings->execute([':user_id' => $user_id_to_delete]);
        
    } catch (PDOException $e) {
        error_log("Error deleting user: " . $e->getMessage());
        header("Location: customers.php?error=delete_failed");
        exit();
    }
}

header("Location: customers.php?success=deleted");
exit();

================================================================================
--- ফাইল পাথ (File Path): delete_payment_link.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

// URL থেকে লিঙ্কের আইডি নেওয়া হচ্ছে
$link_id = $_GET['id'] ?? null;
// সেশন থেকে বর্তমান ব্যবহারকারীর আইডি নেওয়া হচ্ছে
$user_id = $_SESSION['user_id'];

if ($link_id) {
    // শুধুমাত্র নিজের তৈরি লিঙ্ক ডিলিট করার জন্য user_id দিয়েও শর্ত দেওয়া হয়েছে
    $sql = "DELETE FROM payment_links WHERE id = :id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    
    try {
        $stmt->execute([':id' => $link_id, ':user_id' => $user_id]);
    } catch (PDOException $e) {
        die("Error deleting link: " . $e->getMessage());
    }
}

// সফলভাবে ডিলিট হওয়ার পর payment_links.php পেজে ফিরে যাওয়া
header("Location: payment_links.php");
exit();
?>

================================================================================
--- ফাইল পাথ (File Path): delete_sms_data.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$sms_id = $_GET['id'] ?? null;
$user_id = $_SESSION['user_id'];

if ($sms_id) {
    // ★★★ এখন status পরিবর্তন না করে is_trashed = 1 করা হচ্ছে ★★★
    $sql = "UPDATE sms_transactions SET is_trashed = 1 WHERE id = :id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    
    try {
        $stmt->execute([':id' => $sms_id, ':user_id' => $user_id]);
    } catch (PDOException $e) {
        die("Error moving record to trash: " . $e->getMessage());
    }
}

header("Location: sms_data.php");
exit();

================================================================================
--- ফাইল পাথ (File Path): deploy_update.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

// ধাপ ১: URL থেকে আপডেটের আইডি গ্রহণ এবং তথ্য যাচাই
$update_id = $_GET['id'] ?? null;
if (!$update_id) die("Update ID is missing.");

$stmt_update = $pdo->prepare("SELECT * FROM updates WHERE id = ?");
$stmt_update->execute([$update_id]);
$update = $stmt_update->fetch(PDO::FETCH_ASSOC);
if (!$update) die("Update not found.");

// ধাপ ২: ফর্ম সাবমিট হলে ডেটা প্রসেস করা
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $deployment_type = $_POST['deployment_type'] ?? 'user';
    $users_to_assign = [];
    $product_name = null; $start_date = null; $end_date = null;

    try {
        $pdo->beginTransaction();
        $stmt_delete = $pdo->prepare("DELETE FROM update_assignments WHERE update_id = ?");
        $stmt_delete->execute([$update_id]);

        if ($deployment_type === 'user') {
            $users_to_assign = $_POST['users'] ?? [];
        } elseif ($deployment_type === 'product') {
            $product_name = $_POST['product_name'] ?? '';
            $start_date = $_POST['start_date'] ?? '';
            $end_date = $_POST['end_date'] ?? '';
            if (empty($product_name) || empty($start_date) || empty($end_date)) {
                throw new Exception("Product name and date range are required.");
            }
            $stmt_find_users = $pdo->prepare("SELECT id FROM users WHERE product_name = ? AND DATE(license_created_at) BETWEEN ? AND ?");
            $stmt_find_users->execute([$product_name, $start_date, $end_date]);
            $users_to_assign = $stmt_find_users->fetchAll(PDO::FETCH_COLUMN);
        }
        
        if (!empty($users_to_assign)) {
            $sql_insert = "INSERT INTO update_assignments (update_id, user_id) VALUES (?, ?)";
            $stmt_insert = $pdo->prepare($sql_insert);
            foreach ($users_to_assign as $user_id) {
                $stmt_insert->execute([$update_id, $user_id]);
            }
        }

        $stmt_update_method = $pdo->prepare("UPDATE updates SET deployment_method = ?, deployment_product = ?, deployment_start_date = ?, deployment_end_date = ? WHERE id = ?");
        $stmt_update_method->execute([$deployment_type, $product_name, $start_date, $end_date, $update_id]);
        
        $pdo->commit();
        header("Location: deploy_update.php?id=$update_id&success=1");
        exit();
    } catch (Exception $e) {
        if ($pdo->inTransaction()) $pdo->rollBack();
        header("Location: deploy_update.php?id=$update_id&error=" . urlencode($e->getMessage()));
        exit();
    }
}

// ধাপ ৩: ফর্মের জন্য প্রয়োজনীয় ডেটা আনা
$all_users = $pdo->query("SELECT id, username, email FROM users ORDER BY username ASC")->fetchAll(PDO::FETCH_ASSOC);
$product_list = $pdo->query("SELECT DISTINCT product_name FROM users WHERE product_name IS NOT NULL AND product_name != '' ORDER BY product_name ASC")->fetchAll(PDO::FETCH_COLUMN);
$stmt_assigned = $pdo->prepare("SELECT user_id FROM update_assignments WHERE update_id = ?");
$stmt_assigned->execute([$update_id]);
$assigned_user_ids = $stmt_assigned->fetchAll(PDO::FETCH_COLUMN);

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<!-- এই পেজের জন্য নতুন এবং আধুনিক CSS -->
<style>
    .message { padding: 15px; margin-bottom: 20px; border-radius: 8px; border: 1px solid transparent; }
    .message.success { background-color: #d1e7dd; color: #0f5132; border-color: #badbcc; }
    .message.error { background-color: #f8d7da; color: #842029; border-color: #f5c2c7; }
    
    .deploy-grid { display: grid; grid-template-columns: 320px 1fr; gap: 25px; align-items: flex-start; }
    
    .deploy-sidebar { position: sticky; top: 20px; }
    .info-card { background-color: #fff; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
    .info-card .card-header { padding: 20px 25px; border-bottom: 1px solid #eee; }
    .info-card h3 { margin-top: 0; font-size: 1.3rem; }
    .info-card .card-body { padding: 25px; }
    .info-card .info-list { list-style: none; padding: 0; margin: 0; }
    .info-card .info-list li { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; font-size: 15px; border-bottom: 1px dashed #f0f0f0; }
    .info-card .info-list li:last-child { border-bottom: none; }
    .info-card .info-list .label { color: #6c757d; }
    .info-card .info-list .value { font-weight: 600; }
    .latest-badge { background-color: #28c76f; color: white; padding: 3px 8px; border-radius: 12px; font-size: 12px; }
    .info-card .card-footer { padding: 25px; border-top: 1px solid #eee; }
    
    .deploy-main .card-header { display: flex; align-items: center; border-bottom: 1px solid #eee; padding-bottom: 15px; margin-bottom: 25px; }
    .deploy-main .card-header h3 { margin: 0; flex-grow: 1; font-size: 1.5rem; }
    .deployment-toggle { display: flex; background-color: #f0f2f5; border-radius: 10px; padding: 4px; }
    .toggle-btn { flex: 1; padding: 8px 15px; font-weight: 600; font-size: 14px; border-radius: 8px; cursor: pointer; border: none; background: none; transition: all 0.2s ease-in-out; display: flex; align-items: center; justify-content: center; gap: 8px; }
    .toggle-btn .fas { font-size: 14px; }
    .toggle-btn.active { background-color: #ffffff; color: #0d6efd; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
    
    .user-table-toolbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; }
    #user-counter { font-weight: 500; color: #6c757d; background: #f0f2f5; padding: 5px 10px; border-radius: 6px; }
    .table-container { max-height: 480px; overflow-y: auto; border: 1px solid #eee; border-radius: 8px; }

    @media (max-width: 992px) {
        .deploy-grid { grid-template-columns: 1fr; }
        .deploy-sidebar { position: static; }
    }
</style>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Updates > Deploy</p>
            <h1 class="page-title">Deployment Configuration</h1>
        </div>
    </div>
    
    <?php if (isset($_GET['success'])): ?>
        <div class="message success">Deployment settings have been saved successfully!</div>
    <?php elseif (isset($_GET['error'])): ?>
        <div class="message error"><?php echo htmlspecialchars($_GET['error']); ?></div>
    <?php endif; ?>

    <form action="deploy_update.php?id=<?php echo $update['id']; ?>" method="POST">
        <div class="deploy-grid">
            <!-- বাম পাশের সাইডবার -->
            <aside class="deploy-sidebar">
                <div class="info-card">
                    <div class="card-header">
                        <h3><i class="fas fa-box-open" style="color: #0d6efd;"></i> Update Package</h3>
                    </div>
                    <div class="card-body">
                        <ul class="info-list">
                            <li><span class="label">Version:</span> <span class="value"><?php echo htmlspecialchars($update['version']); ?> <span class="latest-badge">Latest</span></span></li>
                            <li><span class="label">Type:</span> <span class="value"><?php echo htmlspecialchars(ucfirst($update['update_type'])); ?></span></li>
                            <li><span class="label">Uploaded:</span> <span class="value"><?php echo date("d M, Y", strtotime($update['created_at'])); ?></span></li>
                        </ul>
                    </div>
                    <div class="card-footer">
                        <button type="submit" class="btn btn-primary" style="width: 100%; padding: 12px; justify-content: center;"><i class="fas fa-save"></i> Save Deployment</button>
                        <a href="updates.php" class="btn btn-secondary" style="width: 100%; margin-top: 10px; justify-content: center;"><i class="fas fa-arrow-left"></i> Back to Updates</a>
                    </div>
                </div>
            </aside>

            <!-- ডান পাশের মূল কন্টেন্ট -->
            <main class="deploy-main">
                <div class="content-card">
                    <div class="card-header">
                        <h3>Deployment Method</h3>
                        <div class="deployment-toggle">
                            <button type="button" class="toggle-btn <?php echo ($update['deployment_method'] === 'user') ? 'active' : ''; ?>" data-target="user-deployment-view"><i class="fas fa-user-check"></i> By Users</button>
                            <button type="button" class="toggle-btn <?php echo ($update['deployment_method'] === 'product') ? 'active' : ''; ?>" data-target="product-deployment-view"><i class="fas fa-calendar-alt"></i> By Product & Date</button>
                        </div>
                    </div>
                    
                    <div class="card-body">
                        <input type="hidden" name="deployment_type" id="deployment_type_input" value="<?php echo htmlspecialchars($update['deployment_method']); ?>">

                        <!-- পদ্ধতি ১: ব্যবহারকারী-ভিত্তিক -->
                        <div id="user-deployment-view">
                            <div class="user-table-toolbar">
                                <div class="search-box">
                                    <i class="fas fa-search"></i>
                                    <input type="text" id="user-search" placeholder="Search users...">
                                </div>
                                <span id="user-counter">0/0 Selected</span>
                            </div>
                            <div class="table-container">
                                <table class="data-table">
                                    <thead>
                                        <tr>
                                            <th style="width: 50px;"><input type="checkbox" id="select-all"></th>
                                            <th>Username</th>
                                            <th>Email</th>
                                        </tr>
                                    </thead>
                                    <tbody id="user-table-body">
                                        <?php foreach ($all_users as $user): ?>
                                            <tr>
                                                <td><input class="user-checkbox" type="checkbox" name="users[]" value="<?php echo $user['id']; ?>" <?php echo in_array($user['id'], $assigned_user_ids) ? 'checked' : ''; ?>></td>
                                                <td><?php echo htmlspecialchars($user['username']); ?></td>
                                                <td><?php echo htmlspecialchars($user['email']); ?></td>
                                            </tr>
                                        <?php endforeach; ?>
                                    </tbody>
                                </table>
                            </div>
                        </div>

                        <!-- পদ্ধতি ২: প্রোডাক্ট এবং তারিখ-ভিত্তিক -->
                        <div id="product-deployment-view" style="display: none;">
                            <div class="form-group">
                                <label for="product_name">Product Name</label>
                                <div class="select-wrapper">
                                    <select name="product_name" id="product_name">
                                        <option value="">-- Select a Product --</option>
                                        <?php foreach ($product_list as $product): ?>
                                            <option value="<?php echo htmlspecialchars($product); ?>" <?php echo ($product === $update['deployment_product']) ? 'selected' : ''; ?>>
                                                <?php echo htmlspecialchars($product); ?>
                                            </option>
                                        <?php endforeach; ?>
                                    </select>
                                </div>
                            </div>
                            <div class="form-row">
                                <div class="form-group half-width">
                                    <label for="start_date">License Purchase Start Date</label>
                                    <input type="date" name="start_date" id="start_date" value="<?php echo htmlspecialchars($update['deployment_start_date'] ?? ''); ?>">
                                </div>
                                <div class="form-group half-width">
                                    <label for="end_date">License Purchase End Date</label>
                                    <input type="date" name="end_date" id="end_date" value="<?php echo htmlspecialchars($update['deployment_end_date'] ?? ''); ?>">
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </main>
        </div>
    </form>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    const toggleButtons = document.querySelectorAll('.toggle-btn');
    const userView = document.getElementById('user-deployment-view');
    const productView = document.getElementById('product-deployment-view');
    const deploymentTypeInput = document.getElementById('deployment_type_input');

    function toggleView(targetId) {
        if (targetId === 'user-deployment-view') {
            userView.style.display = 'block';
            productView.style.display = 'none';
            deploymentTypeInput.value = 'user';
        } else {
            userView.style.display = 'none';
            productView.style.display = 'block';
            deploymentTypeInput.value = 'product';
        }
        toggleButtons.forEach(btn => btn.classList.toggle('active', btn.dataset.target === targetId));
    }

    toggleButtons.forEach(button => button.addEventListener('click', () => toggleView(button.dataset.target)));

    const activeTarget = document.querySelector('.toggle-btn.active')?.dataset.target || 'user-deployment-view';
    toggleView(activeTarget);

    const userCounter = document.getElementById('user-counter');
    const totalUsers = <?php echo count($all_users); ?>;
    const userCheckboxes = document.querySelectorAll('.user-checkbox');
    const selectAllCheckbox = document.getElementById('select-all');

    function updateCounter() {
        const selectedCount = document.querySelectorAll('.user-checkbox:checked').length;
        userCounter.textContent = `${selectedCount} of ${totalUsers} selected`;
        selectAllCheckbox.checked = selectedCount > 0 && selectedCount === userCheckboxes.length;
    }

    userCheckboxes.forEach(checkbox => checkbox.addEventListener('change', updateCounter));
    selectAllCheckbox.addEventListener('change', (e) => {
        userCheckboxes.forEach(checkbox => checkbox.checked = e.target.checked);
        updateCounter();
    });

    const searchInput = document.getElementById('user-search');
    searchInput.addEventListener('keyup', function() {
        const searchTerm = this.value.toLowerCase();
        document.querySelectorAll('#user-table-body tr').forEach(row => {
            const cellsText = Array.from(row.cells).map(cell => cell.textContent.toLowerCase()).join(' ');
            row.style.display = cellsText.includes(searchTerm) ? '' : 'none';
        });
    });
    
    updateCounter();
});
</script>

<?php include 'templates/footer.php'; ?>

================================================================================
--- ফাইল পাথ (File Path): devices.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';
include 'templates/header.php';
include 'templates/sidebar.php';

$user_id = $_SESSION['user_id'];
$stmt = $pdo->prepare("SELECT * FROM devices WHERE user_id = ? ORDER BY id DESC");
$stmt->execute([$user_id]);
$devices = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Devices > List</p>
            <h1 class="page-title">Devices</h1>
        </div>
        <!-- সাইড প্যানেল খোলার জন্য এই বাটনে একটি আইডি যুক্ত করা হয়েছে -->
        <a href="#" id="connectAppBtn" class="btn btn-primary">
            <i class="fas fa-wifi"></i> Connect Android App
        </a>
    </div>

    <div class="content-card">
        <!-- ... আপনার টেবিলের বাকি অংশ এখানে থাকবে ... -->
        <table class="data-table">
            <thead>
                <tr>
                    <th><input type="checkbox"></th>
                    <th>Device ID <i class="fas fa-chevron-down"></i></th>
                    <th>Device name <i class="fas fa-chevron-down"></i></th>
                    <th>Device model <i class="fas fa-chevron-down"></i></th>
                    <th>Android Version <i class="fas fa-chevron-down"></i></th>
                    <th>App Version</th>
                    <th>Status <i class="fas fa-chevron-down"></i></th>
                    <th style="text-align: right;">Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php if (count($devices) > 0): ?>
                    <?php foreach ($devices as $device): ?>
                        <tr>
                            <td><input type="checkbox"></td>
                            <td><?php echo htmlspecialchars($device['device_id']); ?></td>
                            <td><?php echo htmlspecialchars($device['device_name']); ?></td>
                            <td><?php echo htmlspecialchars($device['device_model']); ?></td>
                            <td><?php echo htmlspecialchars($device['android_version']); ?></td>
                            <td><?php echo htmlspecialchars($device['app_version']); ?></td>
                            <td>
                                <span class="status-badge status-<?php echo strtolower(htmlspecialchars($device['status'])); ?>">
                                    <?php echo htmlspecialchars($device['status']); ?>
                                </span>
                            </td>
                            <td class="actions" style="text-align: right;">
                                <a href="#" class="action-delete"><i class="fas fa-trash-alt"></i> Delete</a>
                                <a href="#" class="action-verify"><i class="fas fa-shield-alt"></i> Balance Verification</a>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                <?php else: ?>
                    <tr>
                        <td colspan="8" style="text-align:center; padding: 20px;">No devices have been connected yet.</td>
                    </tr>
                <?php endif; ?>
            </tbody>
        </table>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<!-- === নতুন সাইড প্যানেলের HTML কোড === -->
<div id="connectAppPanel" class="side-panel-overlay">
    <div class="side-panel">
        <div class="side-panel-header">
            <h3>Connect Android App</h3>
            <button id="closePanelBtn" class="close-panel-btn">&times;</button>
        </div>
        <div class="side-panel-body">
            <!-- বাম কলাম: অ্যাপ ডাউনলোড -->
            <div class="panel-card">
                <div class="panel-card-header">
                    <h4>Download Android App</h4>
                    <span>&#9650;</span>
                </div>
                <div class="panel-card-body">
                    <h2>Get the Payment Automation App</h2>
                    <p class="subtitle">Only for Bangladeshi Users</p>
                    <p>Download our Android app to automate your personal payments effortlessly.</p>
                    <ul class="features-list">
                        <li><i class="fas fa-check-circle"></i> Automatically verify your transactions.</li>
                        <li><i class="fas fa-check-circle"></i> Grant necessary permissions for seamless operation.</li>
                        <li><i class="fas fa-check-circle"></i> Secure background verification of your payments.</li>
                        <li><i class="fas fa-check-circle"></i> View verified transactions in the <strong>SMS Data</strong> section.</li>
                    </ul>
                    <a href="#" class="btn btn-primary download-btn">
                        <i class="fas fa-download"></i> Download Android App
                    </a>
                </div>
            </div>
            <!-- ডান কলাম: QR কোড -->
            <div class="panel-card">
                 <div class="panel-card-header">
                    <h4>Connect Android App</h4>
                    <span>&#9650;</span>
                </div>
                <div class="panel-card-body qr-section">
                    <h4>Link Your Device</h4>
                    <p>Open the app and scan this QR code to connect.</p>
                    <div class="qr-code-container">
                        <!-- ডাইনামিক QR কোড এখানে লোড হবে -->
                        <img src="generate_qr.php" alt="Scan to connect">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
<!-- সাইড প্যানেল নিয়ন্ত্রণের জন্য JavaScript -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    const connectBtn = document.getElementById('connectAppBtn');
    const closeBtn = document.getElementById('closePanelBtn');
    const panelOverlay = document.getElementById('connectAppPanel');

    if (connectBtn) {
        connectBtn.addEventListener('click', function(e) {
            e.preventDefault();
            panelOverlay.classList.add('open');
        });
    }

    if (closeBtn) {
        closeBtn.addEventListener('click', function() {
            panelOverlay.classList.remove('open');
        });
    }

    // প্যানেলের বাইরে ক্লিক করলেও বন্ধ হয়ে যাবে
    if (panelOverlay) {
        panelOverlay.addEventListener('click', function(e) {
            if (e.target === panelOverlay) {
                panelOverlay.classList.remove('open');
            }
        });
    }
});
</script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): documentation.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

// ডাইনামিক URL এবং API Key আনা হচ্ছে
$user_id = $_SESSION['user_id'];
$stmt = $pdo->prepare("SELECT api_key, base_url FROM settings WHERE user_id = ?");
$stmt->execute([$user_id]);
$setting = $stmt->fetch(PDO::FETCH_ASSOC);

$api_key = $setting['api_key'] ?? 'YOUR_SECRET_API_KEY';
$base_url = $setting['base_url'] ?? 'https://your-domain.com/api'; // ফলব্যাক URL

$endpoint_initiate = "{$base_url}/initiate_payment.php";
$endpoint_verify = "{$base_url}/verify_payment.php";

include 'templates/header.php';
include 'templates/sidebar.php';
?>
<div class="page-container">
    <div class="page-header">
        <h1 class="page-title">Developer API Documentation (v2.1)</h1>
    </div>

    <!-- Introduction -->
    <div class="content-card">
        <h3>Introduction & Authentication</h3>
        <p>This documentation provides a comprehensive guide to integrating our payment gateway. All API requests must be authenticated by including your API key in the request header.</p>
        <pre><code>Authorization: Bearer <?php echo htmlspecialchars($api_key); ?></code></pre>
    </div>

    <!-- Payment Flow -->
    <div class="content-card">
        <h3>Payment Flow Overview</h3>
        <p>The integration process relies on the user's browser to confirm the payment. The flow follows these steps:</p>
        <ol>
            <li><strong>Step 1: Initiate Payment.</strong> Your server sends a secure request to our <code>/initiate_payment.php</code> endpoint, including your site's unique Base URL for verification.</li>
            <li><strong>Step 2: Redirect User.</strong> Our API validates your Base URL and responds with a unique <code>payment_url</code>. Your application must immediately redirect the user's browser to this URL.</li>
            <li><strong>Step 3: Customer Pays.</strong> The customer completes the payment on our secure checkout page.</li>
            <li><strong>Step 4: Return to Your Site.</strong> After a successful payment, our gateway redirects the user's browser back to the <code>success_url</code> you provided, appending the unique <strong><code>transaction_id</code></strong> as proof of payment.</li>
            <li><strong>Step 5: Verify on Your Server.</strong> Your script at the <code>success_url</code> reads this <code>transaction_id</code> and updates your database to mark the order as "Paid".</li>
        </ol>
    </div>

    <!-- 1. Initiate Payment -->
    <div class="content-card">
        <h3>1. Initiate a Payment</h3>
        <p>To start a payment, send a POST request to the Payment Initiation Endpoint. For security, you must include your site's Base URL to verify the request's origin.</p>
        <h4>Endpoint</h4>
        <pre><code>POST <?php echo htmlspecialchars($endpoint_initiate); ?></code></pre>

        <h4>Request Body (JSON)</h4>
        <pre><code>{
    "amount": 150.50,
    "client_base_url": "<?php echo htmlspecialchars($base_url); ?>",
    "customer_name": "John Doe",
    "customer_email": "john.doe@example.com",
    "success_url": "https://yourwebsite.com/order/success.php",
    "cancel_url": "https://yourwebsite.com/cart.php",
    "meta_data": "{\"order_id\": \"YOUR_UNIQUE_ORDER_ID_123\"}"
}</code></pre>
        <h4>Parameters</h4>
        <ul>
            <li><code>amount</code> (float, required): The total amount to be paid.</li>
            <li><code>client_base_url</code> (string, required): Your site's API Base URL. <strong>This must exactly match the "Base URL" found on your API Settings page.</strong></li>
            <li><code>customer_name</code> (string, optional): The customer's full name.</li>
            <li><code>customer_email</code> (string, optional): The customer's email address.</li>
            <li><code>success_url</code> (string, required): The URL on your site where the customer will be redirected after a successful payment.</li>
            <li><code>cancel_url</code> (string, required): The URL where the customer is sent if they cancel.</li>
            <li><code>meta_data</code> (JSON string, optional): A JSON string for any extra data, like your internal <code>order_id</code>.</li>
        </ul>
        <h4>Success Response (JSON)</h4>
        <pre><code>{
    "status": "success",
    "payment_url": "<?php echo str_replace('/api', '', htmlspecialchars($base_url)); ?>/checkout.php?trx_id=a1b2c3..."
}
// Your server must now redirect the user's browser to the value of "payment_url".</code></pre>
        <h4>Error Response (Example)</h4>
        <p>If the <code>client_base_url</code> does not match the one stored in your settings, the request will be rejected:</p>
        <pre><code>{
    "status": "error",
    "message": "Domain mismatch. দুঃখিত, সংযোগ স্থাপন করা যায়নি।"
}</code></pre>
    </div>

    <!-- 2. Handle the Return -->
    <div class="content-card">
        <h3>2. Handle the Customer's Return</h3>
        <p>After a successful payment, the user will be redirected to your <code>success_url</code> with the payment's unique transaction ID appended as a query parameter.</p>

        <h4>Example Return URL:</h4>
        <pre><code>https://yourwebsite.com/order/success.php?transaction_id=CJH1D2Y4W1</code></pre>
        
        <h4>What Your `success.php` Script Must Do:</h4>
        <ol>
            <li>Read the <code>transaction_id</code> from the URL's query parameters.</li>
            <li>Update your order's status to "Paid" or "Completed" in your database, storing the received <code>transaction_id</code> as proof of payment.</li>
            <li>Display a "Thank You" or order confirmation message to the customer.</li>
        </ol>
        
        <h4>Code Example (Plain PHP):</h4>
        <pre><code>&lt;?php
$transactionId = $_GET['transaction_id'] ?? null;

if ($transactionId) {
    //
    // 1. Find the order in your database that was pending.
    // 2. Update its status to 'completed'.
    // 3. Store the $transactionId as the payment reference.
    // 4. Show a success message to the customer.
    //
    echo "Thank you! Your payment with Transaction ID: " . htmlspecialchars($transactionId) . " was successful.";
} else {
    echo "Payment verification failed.";
}
?&gt;</code></pre>
    </div>

</div>

</div> <!-- .main-content -->
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): edit_customer.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $user_id = $_SESSION['user_id'];
    $original_email = trim($_POST['original_email']);

    // Form data
    $name = trim($_POST['name']);
    $email = trim($_POST['email']);
    $phone = trim($_POST['phone']);
    $address = trim($_POST['address']) ?: null;
    $city = trim($_POST['city']) ?: null;
    $state = trim($_POST['state']) ?: null;
    $postcode = trim($_POST['postcode']) ?: null;
    $country = trim($_POST['country']) ?: null;

    if (empty($name) || empty($email) || empty($phone) || empty($original_email)) {
        header("Location: customers.php?error=required_fields_missing");
        exit();
    }
    
    try {
        // Update all records matching the original email with new dedicated column data
        $sql = "UPDATE transactions 
                SET customer_name = :name, customer_email = :email, phone = :phone, address = :address, 
                    city = :city, state = :state, postcode = :postcode, country = :country
                WHERE user_id = :user_id AND customer_email = :original_email";
        
        $stmt_update = $pdo->prepare($sql);
        $stmt_update->execute([
            ':name' => $name,
            ':email' => $email,
            ':phone' => $phone,
            ':address' => $address,
            ':city' => $city,
            ':state' => $state,
            ':postcode' => $postcode,
            ':country' => $country,
            ':user_id' => $user_id,
            ':original_email' => $original_email
        ]);

        header("Location: customers.php?success=updated");
        exit();

    } catch (PDOException $e) {
        error_log("Error updating customer: " . $e->getMessage());
        header("Location: customers.php?error=database_error");
        exit();
    }
} else {
    header("Location: customers.php");
    exit();
}


================================================================================
--- ফাইল পাথ (File Path): edit_gateway.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$gateway_id = $_GET['id'] ?? null;
$user_id = $_SESSION['user_id'];

if (!$gateway_id) {
    header("Location: payment.php");
    exit();
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $stmt_check = $pdo->prepare("SELECT gateway_key FROM gateways WHERE id = ? AND user_id = ?");
    $stmt_check->execute([$gateway_id, $user_id]);
    $gateway_check = $stmt_check->fetch(PDO::FETCH_ASSOC);

    if ($gateway_check) {
        $key = $gateway_check['gateway_key'];
        // test_mode এর ভ্যালু POST রিকোয়েস্ট থেকে নেওয়া হচ্ছে (চেকবক্স সিলেক্ট করা থাকলে 1, না থাকলে 0)
        $test_mode = isset($_POST['test_mode']) ? 1 : 0;
        
        if ($key === 'bkash_merchant_tokenized' || $key === 'bkash_merchant_checkout') {
            // bKash গেটওয়ের জন্য test_mode সহ সকল ডেটা আপডেট করা হচ্ছে
            $sql = "UPDATE gateways SET display_name = :d_name, min_amount = :min_a, max_amount = :max_a, fixed_charge = :f_charge, percentage_charge = :p_charge, app_key = :app_k, app_secret = :app_s, username = :uname, password = :pass, test_mode = :test_mode WHERE id = :id AND user_id = :uid";
            $params = [
                'd_name' => $_POST['display_name'], 'min_a' => $_POST['min_amount'] ?: null, 'max_a' => $_POST['max_amount'] ?: null, 'f_charge' => $_POST['fixed_charge'] ?: null, 'p_charge' => $_POST['percentage_charge'] ?: null,
                'app_k' => trim($_POST['app_key']), 'app_s' => trim($_POST['app_secret']), 'uname' => trim($_POST['username']), 'pass' => trim($_POST['password']), 'test_mode' => $test_mode, 'id' => $gateway_id, 'uid' => $user_id
            ];
        } elseif ($key === 'nagad_merchant') {
            // Nagad গেটওয়ের জন্য test_mode সহ সকল ডেটা আপডেট করা হচ্ছে
            $sql = "UPDATE gateways SET display_name = :d_name, min_amount = :min_a, max_amount = :max_a, fixed_charge = :f_charge, percentage_charge = :p_charge, merchant_id = :m_id, merchant_private_key = :m_pk, nagad_public_key = :n_pk, test_mode = :test_mode WHERE id = :id AND user_id = :uid";
            $params = [
                'd_name' => $_POST['display_name'], 'min_a' => $_POST['min_amount'] ?: null, 'max_a' => $_POST['max_amount'] ?: null, 'f_charge' => $_POST['fixed_charge'] ?: null, 'p_charge' => $_POST['percentage_charge'] ?: null,
                'm_id' => trim($_POST['merchant_id']), 'm_pk' => trim($_POST['merchant_private_key']), 'n_pk' => trim($_POST['nagad_public_key']), 'test_mode' => $test_mode, 'id' => $gateway_id, 'uid' => $user_id
            ];
        } else {
            // অন্যান্য (Send Money) গেটওয়ের জন্য ডেটা আপডেট করা হচ্ছে
            $sql = "UPDATE gateways SET display_name = :d_name, min_amount = :min_a, max_amount = :max_a, fixed_charge = :f_charge, percentage_charge = :p_charge, account_number = :acc_num WHERE id = :id AND user_id = :uid";
            $params = [
                'd_name' => $_POST['display_name'], 'min_a' => $_POST['min_amount'], 'max_a' => $_POST['max_amount'], 'f_charge' => $_POST['fixed_charge'], 'p_charge' => $_POST['percentage_charge'],
                'acc_num' => $_POST['account_number'], 'id' => $gateway_id, 'uid' => $user_id
            ];
        }
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
    }
    header("Location: payment.php");
    exit();
}

$stmt = $pdo->prepare("SELECT * FROM gateways WHERE id = ? AND user_id = ?");
$stmt->execute([$gateway_id, $user_id]);
$gateway = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$gateway) {
    header("Location: payment.php");
    exit();
}

$is_tokenized = ($gateway['gateway_key'] === 'bkash_merchant_tokenized');
$is_checkout_popup = ($gateway['gateway_key'] === 'bkash_merchant_checkout');
$is_nagad = ($gateway['gateway_key'] === 'nagad_merchant');

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Gateways > Edit</p>
            <h1 class="page-title">Edit Gateway: <?php echo htmlspecialchars($gateway['display_name']); ?></h1>
        </div>
    </div>

    <div class="content-card">
        <form action="edit_gateway.php?id=<?php echo $gateway['id']; ?>" method="POST">
            <?php if ($is_tokenized || $is_checkout_popup): ?>
                <!-- bKash মার্চেন্ট গেটওয়ের জন্য UI -->
                <div class="settings-section" style="border-top: none; padding-top: 5px;">
                    <h3>General & Charges</h3>
                    <p>Configure the general settings and transaction charges.</p>
                    <div class="form-grid">
                        <div class="form-group"><label for="display_name">Display Name</label><input type="text" id="display_name" name="display_name" value="<?php echo htmlspecialchars($gateway['display_name']); ?>"></div>
                        <div class="form-group"></div>
                        <div class="form-group"><label for="min_amount">Minimum Amount</label><input type="number" step="0.01" id="min_amount" name="min_amount" value="<?php echo htmlspecialchars($gateway['min_amount']); ?>"></div>
                        <div class="form-group"><label for="max_amount">Maximum Amount</label><input type="number" step="0.01" id="max_amount" name="max_amount" value="<?php echo htmlspecialchars($gateway['max_amount']); ?>"></div>
                        <div class="form-group"><label for="fixed_charge">Fixed Charge</label><input type="number" step="0.01" id="fixed_charge" name="fixed_charge" value="<?php echo htmlspecialchars($gateway['fixed_charge']); ?>"></div>
                        <div class="form-group"><label for="percentage_charge">Percentage Charge (%)</label><input type="number" step="0.01" id="percentage_charge" name="percentage_charge" value="<?php echo htmlspecialchars($gateway['percentage_charge']); ?>"></div>
                    </div>
                </div>
                <div class="settings-section">
                    <h3>Environment</h3>
                    <p>Enable test mode to use the bKash sandbox environment for this gateway.</p>
                    <div class="form-group">
                        <label>Test Mode</label>
                        <label class="toggle-switch">
                            <input type="checkbox" name="test_mode" value="1" <?php echo ($gateway['test_mode'] ?? 0) ? 'checked' : ''; ?>>
                            <span class="slider"></span>
                        </label>
                        <small>When enabled, all transactions for this gateway will be processed through the sandbox.</small>
                    </div>
                </div>
                <div class="settings-section">
                     <h3>API Credentials</h3>
                     <p>Enter your bKash merchant API credentials below. Provide sandbox keys if Test Mode is enabled.</p>
                     <div class="form-group"><label for="app_key">App Key</label><input type="text" id="app_key" name="app_key" value="<?php echo htmlspecialchars($gateway['app_key'] ?? ''); ?>"></div>
                     <div class="form-group"><label for="app_secret">App Secret</label><input type="text" id="app_secret" name="app_secret" value="<?php echo htmlspecialchars($gateway['app_secret'] ?? ''); ?>"></div>
                     <div class="form-group"><label for="username">Username</label><input type="text" id="username" name="username" value="<?php echo htmlspecialchars($gateway['username'] ?? ''); ?>"></div>
                     <div class="form-group"><label for="password">Password</label><input type="password" id="password" name="password" value="<?php echo htmlspecialchars($gateway['password'] ?? ''); ?>"></div>
                </div>

            <?php elseif ($is_nagad): ?>
                <!-- Nagad মার্চেন্ট গেটওয়ের জন্য UI -->
                <div class="settings-section" style="border-top: none; padding-top: 5px;">
                    <h3>General & Charges</h3>
                    <p>Configure the general settings and transaction charges for Nagad.</p>
                    <div class="form-grid">
                        <div class="form-group"><label for="display_name">Display Name</label><input type="text" id="display_name" name="display_name" value="<?php echo htmlspecialchars($gateway['display_name']); ?>"></div>
                        <div class="form-group"></div>
                        <div class="form-group"><label for="min_amount">Minimum Amount</label><input type="number" step="0.01" id="min_amount" name="min_amount" value="<?php echo htmlspecialchars($gateway['min_amount']); ?>"></div>
                        <div class="form-group"><label for="max_amount">Maximum Amount</label><input type="number" step="0.01" id="max_amount" name="max_amount" value="<?php echo htmlspecialchars($gateway['max_amount']); ?>"></div>
                        <div class="form-group"><label for="fixed_charge">Fixed Charge</label><input type="number" step="0.01" id="fixed_charge" name="fixed_charge" value="<?php echo htmlspecialchars($gateway['fixed_charge']); ?>"></div>
                        <div class="form-group"><label for="percentage_charge">Percentage Charge (%)</label><input type="number" step="0.01" id="percentage_charge" name="percentage_charge" value="<?php echo htmlspecialchars($gateway['percentage_charge']); ?>"></div>
                    </div>
                </div>
                <div class="settings-section">
                    <h3>Environment</h3>
                    <p>Enable test mode to use the Nagad sandbox environment for this gateway.</p>
                    <div class="form-group">
                        <label>Test Mode</label>
                        <label class="toggle-switch">
                            <input type="checkbox" name="test_mode" value="1" <?php echo ($gateway['test_mode'] ?? 0) ? 'checked' : ''; ?>>
                            <span class="slider"></span>
                        </label>
                        <small>When enabled, all transactions for this gateway will be processed through the sandbox.</small>
                    </div>
                </div>
                <div class="settings-section">
                     <h3>API Credentials</h3>
                     <p>Enter your Nagad merchant API credentials below. Provide sandbox keys if Test Mode is enabled.</p>
                     <div class="form-group"><label for="merchant_id">Merchant ID</label><input type="text" id="merchant_id" name="merchant_id" value="<?php echo htmlspecialchars($gateway['merchant_id'] ?? ''); ?>"></div>
                     <div class="form-group"><label for="merchant_private_key">Merchant Private Key</label><textarea id="merchant_private_key" name="merchant_private_key" rows="6"><?php echo htmlspecialchars($gateway['merchant_private_key'] ?? ''); ?></textarea></div>
                     <div class="form-group"><label for="nagad_public_key">Nagad Gateway Public Key</label><textarea id="nagad_public_key" name="nagad_public_key" rows="6"><?php echo htmlspecialchars($gateway['nagad_public_key'] ?? ''); ?></textarea></div>
                </div>

            <?php else: ?>
                <!-- অন্যান্য Send Money গেটওয়ের জন্য UI -->
                <div class="settings-section">
                    <h3>General Settings</h3>
                    <div class="form-grid">
                        <div class="form-group"><label for="display_name">Display Name</label><input type="text" id="display_name" name="display_name" value="<?php echo htmlspecialchars($gateway['display_name']); ?>"></div>
                        <div class="form-group"><label for="account_number">Account Number</label><input type="text" id="account_number" name="account_number" value="<?php echo htmlspecialchars($gateway['account_number']); ?>"></div>
                    </div>
                </div>
            <?php endif; ?>

            <div class="form-actions"><button type="submit" class="btn btn-primary">Save Changes</button><a href="payment.php" class="btn btn-secondary">Cancel</a></div>
        </form>
    </div>
</div>
</div>
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): edit_payment_link.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$link_id = $_GET['id'] ?? null;
$user_id = $_SESSION['user_id'];

if (!$link_id) {
    header("Location: payment_links.php");
    exit();
}

// POST রিকোয়েস্ট হ্যান্ডেল করে ডেটা আপডেট করা
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ফর্ম থেকে আপডেট করা ডেটা গ্রহণ
    $product_name = trim($_POST['product_name']);
    $quantity = (int)$_POST['quantity'];
    $product_description = trim($_POST['product_description']) ?: null;
    $currency = $_POST['currency'];
    $amount = (float)$_POST['amount'];
    $expire_date = !empty($_POST['expire_date']) ? $_POST['expire_date'] : null;
    $status = isset($_POST['status']) ? 1 : 0;

    // UPDATE কোয়েরি
    $sql = "UPDATE payment_links SET 
                product_name = :product_name, product_description = :product_description,
                amount = :amount, currency = :currency, quantity = :quantity,
                expire_date = :expire_date, status = :status
            WHERE id = :id AND user_id = :user_id";
            
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':product_name' => $product_name,
        ':product_description' => $product_description,
        ':amount' => $amount,
        ':currency' => $currency,
        ':quantity' => $quantity,
        ':expire_date' => $expire_date,
        ':status' => $status,
        ':id' => $link_id,
        ':user_id' => $user_id
    ]);

    header("Location: payment_links.php");
    exit();
}

// ডেটাবেস থেকে বর্তমান তথ্য আনা হচ্ছে
$stmt = $pdo->prepare("SELECT * FROM payment_links WHERE id = ? AND user_id = ?");
$stmt->execute([$link_id, $user_id]);
$link = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$link) {
    // যদি লিঙ্কটি খুঁজে না পাওয়া যায় বা এটি এই ব্যবহারকারীর না হয়
    header("Location: payment_links.php");
    exit();
}

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Payment Links > Edit</p>
            <h1 class="page-title">Edit Payment Link</h1>
        </div>
    </div>

    <div class="content-card">
        <form action="edit_payment_link.php?id=<?php echo $link['id']; ?>" method="POST">
            <div class="form-section">
                <div class="form-row">
                    <div class="form-group half-width">
                        <label for="product_name">Product name<span class="required-star">*</span></label>
                        <input type="text" id="product_name" name="product_name" value="<?php echo htmlspecialchars($link['product_name']); ?>" required>
                    </div>
                    <div class="form-group half-width">
                        <label for="quantity">Quantity<span class="required-star">*</span></label>
                        <input type="number" id="quantity" name="quantity" value="<?php echo htmlspecialchars($link['quantity']); ?>" required>
                    </div>
                </div>

                <div class="form-group">
                    <label for="product_description">Product description</label>
                    <textarea id="product_description" name="product_description" rows="4"><?php echo htmlspecialchars($link['product_description']); ?></textarea>
                </div>

                <div class="form-row">
                    <div class="form-group third-width">
                        <label for="currency">Currency</label>
                        <div class="select-wrapper">
                            <select id="currency" name="currency">
                                <option value="BDT" <?php echo ($link['currency'] === 'BDT') ? 'selected' : ''; ?>>BDT</option>
                                <option value="USD" <?php echo ($link['currency'] === 'USD') ? 'selected' : ''; ?>>USD</option>
                            </select>
                        </div>
                    </div>
                    <div class="form-group third-width">
                        <label for="amount">Amount<span class="required-star">*</span></label>
                        <div class="input-with-prefix">
                            <span>BDT</span>
                            <input type="number" step="0.01" id="amount" name="amount" value="<?php echo htmlspecialchars($link['amount']); ?>" required>
                        </div>
                    </div>
                    <div class="form-group third-width">
                        <label for="expire_date">Expire Date</label>
                        <input type="date" id="expire_date" name="expire_date" value="<?php echo htmlspecialchars($link['expire_date']); ?>">
                    </div>
                </div>

                <div class="form-group">
                    <label>Status<span class="required-star">*</span></label>
                    <label class="toggle-switch">
                        <input type="checkbox" name="status" value="1" <?php echo $link['status'] ? 'checked' : ''; ?>>
                        <span class="slider"></span>
                    </label>
                </div>
            </div>

            <div class="form-actions" style="border-top: 1px solid #f1f1f1; padding-top: 20px; margin-top: 20px;">
                <button type="submit" class="btn btn-primary">Save Changes</button>
                <a href="payment_links.php" class="btn btn-secondary">Cancel</a>
            </div>
        </form>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): edit_sms_data.php [Text Content] ---
================================================================================

<?php
// ব্যবহারকারী লগইন করা আছে কিনা তা পরীক্ষা করা
require 'auth_check.php';
// ডেটাবেস সংযোগ ফাইল যুক্ত করা
require 'db_connect.php';

$sms_id = $_GET['id'] ?? null;
$user_id = $_SESSION['user_id'];

if (!$sms_id) {
    header("Location: sms_data.php");
    exit();
}

// ডেটা আপডেট করার জন্য POST রিকোয়েস্ট হ্যান্ডেল করা
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $payment_method = $_POST['payment_method'];
    $type = $_POST['type'];
    $amount = $_POST['amount'];
    $sender_number = $_POST['sender_number'];
    $transaction_id = $_POST['transaction_id'];
    $reference = $_POST['reference'];
    $note = $_POST['note'];
    $status = $_POST['status'];

    $sql = "UPDATE sms_transactions SET 
                payment_method = :payment_method, type = :type, amount = :amount, sender_number = :sender_number, 
                transaction_id = :transaction_id, reference = :reference, note = :note, status = :status
            WHERE id = :id AND user_id = :user_id";
            
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        'payment_method' => $payment_method,
        'type' => $type,
        'amount' => $amount,
        'sender_number' => $sender_number,
        'transaction_id' => $transaction_id,
        'reference' => $reference,
        'note' => $note,
        'status' => $status,
        'id' => $sms_id,
        'user_id' => $user_id
    ]);

    header("Location: sms_data.php");
    exit();
}

// ডেটাবেস থেকে বর্তমান তথ্য আনা হচ্ছে
$stmt = $pdo->prepare("SELECT * FROM sms_transactions WHERE id = ? AND user_id = ?");
$stmt->execute([$sms_id, $user_id]);
$sms = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$sms) {
    header("Location: sms_data.php");
    exit();
}

// হেডার ও সাইডবার যুক্ত করা
include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">SMS Datas > Edit</p>
            <h1 class="page-title">Edit SMS Data</h1>
        </div>
        <!-- Delete বাটন -->
        <a href="delete_sms_data.php?id=<?php echo $sms['id']; ?>" class="btn" style="background-color: #dc3545; color: white;" onclick="return confirm('Are you sure you want to delete this?');">
            <i class="fas fa-trash-alt"></i> Delete
        </a>
    </div>

    <div class="content-card">
        <form action="edit_sms_data.php?id=<?php echo $sms['id']; ?>" method="POST">
            <div class="form-grid">
                <!-- কলাম ১ -->
                <div class="form-group">
                    <label for="payment_method">Payment Method<span class="required-star">*</span></label>
                    <div class="select-wrapper">
                        <select id="payment_method" name="payment_method" required>
                            <option value="bKash" <?php echo ($sms['payment_method'] === 'bKash') ? 'selected' : ''; ?>>bKash</option>
                            <!-- প্রয়োজনে অন্যান্য অপশন যোগ করা যাবে -->
                        </select>
                    </div>
                </div>
                <div class="form-group">
                    <label for="amount">Amount<span class="required-star">*</span></label>
                    <div class="input-with-prefix">
                        <span>BDT</span>
                        <input type="number" step="0.01" id="amount" name="amount" value="<?php echo htmlspecialchars($sms['amount']); ?>" required>
                    </div>
                </div>
                <div class="form-group">
                    <label for="transaction_id">Transaction ID<span class="required-star">*</span></label>
                    <input type="text" id="transaction_id" name="transaction_id" value="<?php echo htmlspecialchars($sms['transaction_id']); ?>" required>
                </div>
                 <div class="form-group">
                    <label for="note">Note</label>
                    <input type="text" id="note" name="note" value="<?php echo htmlspecialchars($sms['note']); ?>">
                </div>

                <!-- কলাম ২ -->
                <div class="form-group">
                    <label for="type">Type<span class="required-star">*</span></label>
                    <div class="select-wrapper">
                        <select id="type" name="type" required>
                            <option value="Personal" <?php echo ($sms['type'] === 'Personal') ? 'selected' : ''; ?>>Personal</option>
                            <option value="Agent" <?php echo ($sms['type'] === 'Agent') ? 'selected' : ''; ?>>Agent</option>
                        </select>
                    </div>
                </div>
                <div class="form-group">
                    <label for="sender_number">Phone Number<span class="required-star">*</span></label>
                    <input type="text" id="sender_number" name="sender_number" value="<?php echo htmlspecialchars($sms['sender_number']); ?>" required>
                </div>
                <div class="form-group">
                    <label for="reference">Reference</label>
                    <input type="text" id="reference" name="reference" value="<?php echo htmlspecialchars($sms['reference']); ?>">
                </div>
                <div class="form-group">
                    <label for="status">Status<span class="required-star">*</span></label>
                    <div class="select-wrapper">
                        <select id="status" name="status" required>
                            <option value="Received" <?php echo ($sms['status'] === 'Received') ? 'selected' : ''; ?>>Received</option>
                            <option value="Verified" <?php echo ($sms['status'] === 'Verified') ? 'selected' : ''; ?>>Verified</option>
                            <option value="Trashed" <?php echo ($sms['status'] === 'Trashed') ? 'selected' : ''; ?>>Trashed</option>
                        </select>
                    </div>
                </div>
            </div>
            <div class="form-actions" style="border-top: 1px solid #f1f1f1; padding-top: 20px; margin-top: 20px;">
                <button type="submit" class="btn btn-primary">Save changes</button>
                <a href="sms_data.php" class="btn btn-secondary">Back</a>
            </div>
        </form>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): edit_template.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$file_name = $_GET['file'] ?? 'payment.php';
// ★★★ সমাধান: 'pay.php' এবং 'default.php' তালিকায় যুক্ত করা হয়েছে ★★★
$allowed_files = [
    'payment.php', 'payments.php', 'payment_links.php', 
    'create_payment_link.php', 'edit_payment_link.php',
    'pay.php', 'default.php'
];

if (!in_array($file_name, $allowed_files)) {
    die("Error: Editing this file is not permitted.");
}

$message = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['content'])) {
    $content = $_POST['content'];
    
    $sql = "INSERT INTO file_templates (file_name, content) VALUES (:file_name, :content)
            ON DUPLICATE KEY UPDATE content = :content";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':file_name' => $file_name, ':content' => $content]);
    $message = "Template '" . htmlspecialchars($file_name) . "' updated successfully!";
}

$stmt = $pdo->prepare("SELECT content FROM file_templates WHERE file_name = ?");
$stmt->execute([$file_name]);
$template = $stmt->fetch(PDO::FETCH_ASSOC);
$current_content = $template['content'] ?? '<!-- Enter the code for ' . htmlspecialchars($file_name) . ' here -->';

include 'templates/header.php';
include 'templates/sidebar.php';
?>
<div class="page-container">
    <div class="page-header">
        <h1 class="page-title">Edit File Template</h1>
    </div>
    
    <div style="margin-bottom: 20px; display: flex; flex-wrap: wrap; gap: 10px;">
        <a href="?file=payment.php" class="btn <?php echo $file_name === 'payment.php' ? 'btn-primary' : 'btn-secondary'; ?>">payment.php</a>
        <a href="?file=payments.php" class="btn <?php echo $file_name === 'payments.php' ? 'btn-primary' : 'btn-secondary'; ?>">payments.php</a>
        <a href="?file=payment_links.php" class="btn <?php echo $file_name === 'payment_links.php' ? 'btn-primary' : 'btn-secondary'; ?>">payment_links.php</a>
        <a href="?file=create_payment_link.php" class="btn <?php echo $file_name === 'create_payment_link.php' ? 'btn-primary' : 'btn-secondary'; ?>">create_payment_link.php</a>
        <a href="?file=edit_payment_link.php" class="btn <?php echo $file_name === 'edit_payment_link.php' ? 'btn-primary' : 'btn-secondary'; ?>">edit_payment_link.php</a>
        <!-- ★★★ সমাধান: নতুন দুটি বাটন যুক্ত করা হয়েছে ★★★ -->
        <a href="?file=pay.php" class="btn <?php echo $file_name === 'pay.php' ? 'btn-primary' : 'btn-secondary'; ?>">pay.php (Link)</a>
        <a href="?file=default.php" class="btn <?php echo $file_name === 'default.php' ? 'btn-primary' : 'btn-secondary'; ?>">default.php (Link)</a>
    </div>

    <?php if ($message): ?>
        <div style="padding: 10px; background-color: #d4edda; color: #155724; border-radius: 8px; margin-bottom: 20px;">
            <?php echo $message; ?>
        </div>
    <?php endif; ?>

    <div class="content-card">
        <form action="?file=<?php echo htmlspecialchars($file_name); ?>" method="POST">
            <div class="form-group">
                <label for="content">File Content for <strong><?php echo htmlspecialchars($file_name); ?></strong></label>
                <textarea name="content" id="content" rows="30" style="width: 100%; font-family: monospace; font-size: 14px;"><?php echo htmlspecialchars($current_content); ?></textarea>
            </div>
            <div class="form-actions">
                <button type="submit" class="btn btn-primary">Save Template</button>
            </div>
        </form>
    </div>
</div>
</div>
<script src="js/main.js?v=<?php echo @filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): force_delete_sms_data.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$sms_id = $_GET['id'] ?? null;
$user_id = $_SESSION['user_id'];

if ($sms_id) {
    // ডেটাবেস থেকে রেকর্ডটি স্থায়ীভাবে মুছে ফেলা হচ্ছে
    $sql = "DELETE FROM sms_transactions WHERE id = :id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    
    try {
        $stmt->execute([':id' => $sms_id, ':user_id' => $user_id]);
    } catch (PDOException $e) {
        die("Error permanently deleting record: " . $e->getMessage());
    }
}

// সফলভাবে ডিলিট করার পর ট্র্যাশ পেজেই ফিরে যাওয়া
header("Location: sms_data.php?filter=trashed");
exit();

================================================================================
--- ফাইল পাথ (File Path): general_settings.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$user_id = $_SESSION['user_id'];
$success_message = '';
// URL থেকে বর্তমান ট্যাব নির্ধারণ করা হচ্ছে, ডিফল্ট হিসেবে 'general' থাকবে
$active_tab = $_GET['tab'] ?? 'general';

// ফর্ম সাবমিট হলে ডেটা সেভ করার জন্য
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
    // কোন فرم টি সাবমিট হয়েছে তা বাটনের 'name' দিয়ে পরীক্ষা করা হচ্ছে
    if (isset($_POST['save_general_settings'])) {
        // === জেনারেল সেটিংস সেভ করা ===
        $site_name = trim($_POST['site_name']);
        $timezone = $_POST['timezone'];
        $default_currency = $_POST['default_currency'];
        $currency_symbol = ($default_currency === 'BDT') ? '৳' : '$';
        $default_language = $_POST['default_language'];
        $week_starts_on = $_POST['week_starts_on'];

        $sql_general = "INSERT INTO brand_settings (user_id, site_name, timezone, default_currency, currency_symbol, default_language, week_starts_on) 
                        VALUES (:user_id, :site_name, :timezone, :default_currency, :currency_symbol, :default_language, :week_starts_on)
                        ON DUPLICATE KEY UPDATE 
                        site_name = :site_name, timezone = :timezone, default_currency = :default_currency, 
                        currency_symbol = :currency_symbol, default_language = :default_language, week_starts_on = :week_starts_on";
        
        $stmt = $pdo->prepare($sql_general);
        $stmt->execute([
            ':user_id' => $user_id, ':site_name' => $site_name, ':timezone' => $timezone, 
            ':default_currency' => $default_currency, ':currency_symbol' => $currency_symbol, 
            ':default_language' => $default_language, ':week_starts_on' => $week_starts_on
        ]);
        $success_message = "General settings saved successfully!";
        
    } elseif (isset($_POST['save_color_scheme'])) {
        // === কালার স্কিম সেভ করা ===
        $colors = [
            'user_id' => $user_id,
            'global_text_color' => $_POST['global_text_color'], 'primary_button_color' => $_POST['primary_button_color'],
            'button_text_color' => $_POST['button_text_color'], 'button_hover_color' => $_POST['button_hover_color'],
            'button_hover_text_color' => $_POST['button_hover_text_color'], 'navigation_background' => $_POST['navigation_background'],
            'navigation_text_color' => $_POST['navigation_text_color'], 'active_tab_color' => $_POST['active_tab_color'],
            'active_tab_text_color' => $_POST['active_tab_text_color']
        ];
        
        $sql_colors = "INSERT INTO brand_colors (user_id, global_text_color, primary_button_color, button_text_color, button_hover_color, button_hover_text_color, navigation_background, navigation_text_color, active_tab_color, active_tab_text_color)
                       VALUES (:user_id, :global_text_color, :primary_button_color, :button_text_color, :button_hover_color, :button_hover_text_color, :navigation_background, :navigation_text_color, :active_tab_color, :active_tab_text_color)
                       ON DUPLICATE KEY UPDATE 
                       global_text_color = :global_text_color, primary_button_color = :primary_button_color, button_text_color = :button_text_color, 
                       button_hover_color = :button_hover_color, button_hover_text_color = :button_hover_text_color, navigation_background = :navigation_background, 
                       navigation_text_color = :navigation_text_color, active_tab_color = :active_tab_color, active_tab_text_color = :active_tab_text_color";
        $stmt = $pdo->prepare($sql_colors);
        $stmt->execute($colors);
        $success_message = "Color scheme saved successfully!";

    } elseif (isset($_POST['save_business_details'])) {
        // === বিজনেস ডিটেইলস সেভ করা ===
        $details = [
            'user_id' => $user_id,
            'street_address' => trim($_POST['street_address']),
            'city' => trim($_POST['city']),
            'postal_code' => trim($_POST['postal_code']),
            'country' => $_POST['country']
        ];
        
        $sql_details = "INSERT INTO business_details (user_id, street_address, city, postal_code, country)
                        VALUES (:user_id, :street_address, :city, :postal_code, :country)
                        ON DUPLICATE KEY UPDATE 
                        street_address = :street_address, city = :city, postal_code = :postal_code, country = :country";
        $stmt = $pdo->prepare($sql_details);
        $stmt->execute($details);
        $success_message = "Business details saved successfully!";

    } elseif (isset($_POST['save_support_details'])) {
        // === সাপোর্ট কন্টাক্ট ইনফরমেশন সেভ করা ===
        $support_info = [
            'user_id' => $user_id,
            'support_phone' => trim($_POST['support_phone']),
            'support_email' => trim($_POST['support_email']),
            'support_website' => trim($_POST['support_website'])
        ];
        
        $sql_support = "INSERT INTO support_details (user_id, support_phone, support_email, support_website)
                        VALUES (:user_id, :support_phone, :support_email, :support_website)
                        ON DUPLICATE KEY UPDATE 
                        support_phone = :support_phone, support_email = :support_email, support_website = :support_website";
        $stmt = $pdo->prepare($sql_support);
        $stmt->execute($support_info);
        $success_message = "Support contact information saved successfully!";
    }
}

// === ডেটাবেস থেকে সকল ডেটা আনা ===
$stmt_general = $pdo->prepare("SELECT * FROM brand_settings WHERE user_id = ?"); $stmt_general->execute([$user_id]); $settings = $stmt_general->fetch(PDO::FETCH_ASSOC);
$stmt_colors = $pdo->prepare("SELECT * FROM brand_colors WHERE user_id = ?"); $stmt_colors->execute([$user_id]); $color_settings = $stmt_colors->fetch(PDO::FETCH_ASSOC);
$stmt_details = $pdo->prepare("SELECT * FROM business_details WHERE user_id = ?"); $stmt_details->execute([$user_id]); $business_details = $stmt_details->fetch(PDO::FETCH_ASSOC);
$stmt_support = $pdo->prepare("SELECT * FROM support_details WHERE user_id = ?"); $stmt_support->execute([$user_id]); $support_details = $stmt_support->fetch(PDO::FETCH_ASSOC);

// ডিফল্ট ভ্যালু সেট করা
$defaults = [
    'general' => ['site_name' => 'SecureSoftPayt', 'timezone' => 'Asia/Dhaka', 'default_currency' => 'BDT', 'currency_symbol' => '৳', 'default_language' => 'en', 'week_starts_on' => 'Saturday'],
    'colors' => ['global_text_color' => '#ad0e0e', 'primary_button_color' => '#1d2ecf', 'button_text_color' => '#360c0c', 'button_hover_color' => '#d42929', 'button_hover_text_color' => '#c40b0b', 'navigation_background' => '#c93b3b', 'navigation_text_color' => '#bd1a1a', 'active_tab_color' => '#b52a2a', 'active_tab_text_color' => '#e34848'],
    'business' => ['street_address' => '', 'city' => '', 'postal_code' => '', 'country' => ''],
    'support' => ['support_phone' => '', 'support_email' => '', 'support_website' => '']
];

$current = [
    'general' => $settings ?: $defaults['general'],
    'colors' => $color_settings ?: $defaults['colors'],
    'business' => $business_details ?: $defaults['business'],
    'support' => $support_details ?: $defaults['support']
];

// Helper Functions
function get_timezones() {
    $timezones = [];
    $identifiers = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
    foreach ($identifiers as $identifier) {
        $dateTime = new DateTime('now', new DateTimeZone($identifier));
        $offset = $dateTime->getOffset() / 3600;
        $offset_prefix = $offset < 0 ? '-' : '+';
        $offset_formatted = sprintf('%02d:%02d', abs($offset), abs(($offset*60)%60));
        $timezones[$identifier] = "(UTC{$offset_prefix}{$offset_formatted}) " . str_replace('_', ' ', $identifier);
    }
    return $timezones;
}
$timezone_list = get_timezones();

function get_countries() {
    return ['' => 'Select an option', 'BD' => 'Bangladesh', 'US' => 'United States', 'CA' => 'Canada', 'GB' => 'United Kingdom'];
}
$country_list = get_countries();

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Brand Settings > Settings</p>
            <h1 class="page-title">General & Brand Settings</h1>
        </div>
    </div>

    <div class="content-card">
        <div class="settings-tabs">
            <a href="?tab=general" class="tab-item <?php echo ($active_tab === 'general') ? 'active' : ''; ?>"><i class="fas fa-sliders-h"></i> General <span class="tab-badge">Core</span></a>
            <a href="?tab=branding" class="tab-item <?php echo ($active_tab === 'branding') ? 'active' : ''; ?>"><i class="fas fa-paint-brush"></i> Branding <span class="tab-badge visual">Visual</span></a>
            <a href="?tab=business" class="tab-item <?php echo ($active_tab === 'business') ? 'active' : ''; ?>"><i class="fas fa-building"></i> Business Details</a>
            <a href="?tab=contact" class="tab-item <?php echo ($active_tab === 'contact') ? 'active' : ''; ?>"><i class="fas fa-link"></i> Contact & Social</a>
        </div>
        
        <div class="tab-content">
            <?php if ($active_tab === 'general'): ?>
            <!-- === জেনারেল সেটিংস ট্যাব === -->
            <form action="?tab=general" method="POST">
                <div class="settings-section">
                    <h3>Basic Information</h3><p>Configure the core settings for your application</p>
                    <div class="form-grid">
                        <div class="form-group"><label for="site_name">Site Name<span class="required-star">*</span></label><input type="text" id="site_name" name="site_name" value="<?php echo htmlspecialchars($current['general']['site_name']); ?>" required><small>This will appear in the browser title and various places throughout the application</small></div>
                        <div class="form-group"><label for="timezone">Default Timezone<span class="required-star">*</span></label><div class="select-wrapper"><select id="timezone" name="timezone" required><?php foreach ($timezone_list as $key => $value): ?><option value="<?php echo $key; ?>" <?php echo ($key === $current['general']['timezone']) ? 'selected' : ''; ?>><?php echo $value; ?></option><?php endforeach; ?></select></div><small>All dates and times will be displayed according to this timezone</small></div>
                    </div>
                </div>
                <div class="settings-section">
                    <h3>Currency & Financial</h3><p>Configure currency settings</p>
                    <div class="form-grid">
                        <div class="form-group"><label for="default_currency">Default Currency<span class="required-star">*</span></label><div class="select-wrapper"><select id="default_currency" name="default_currency" required><option value="BDT" <?php echo ($current['general']['default_currency'] === 'BDT') ? 'selected' : ''; ?>>BDT</option><option value="USD" <?php echo ($current['general']['default_currency'] === 'USD') ? 'selected' : ''; ?>>USD</option></select></div><small>Currency used for all financial transactions</small></div>
                        <div class="form-group"><label for="currency_symbol">Currency Symbol</label><input type="text" id="currency_symbol" name="currency_symbol" value="<?php echo htmlspecialchars($current['general']['currency_symbol']); ?>" readonly><small>Automatically set based on selected currency</small></div>
                    </div>
                </div>
                <div class="settings-section">
                    <h3>Localization</h3><p>Configure language and date format preferences</p>
                    <div class="form-grid">
                        <div class="form-group"><label for="default_language">Default Language<span class="required-star">*</span></label><div class="select-wrapper"><select id="default_language" name="default_language" required><option value="" disabled>Select an option</option><option value="en" <?php echo ($current['general']['default_language'] === 'en') ? 'selected' : ''; ?>>English</option><option value="bn" <?php echo ($current['general']['default_language'] === 'bn') ? 'selected' : ''; ?>>Bengali</option></select></div><small>Checkout interface language</small></div>
                        <div class="form-group"><label for="week_starts_on">Week Starts On<span class="required-star">*</span></label><div class="select-wrapper"><select id="week_starts_on" name="week_starts_on" required><?php $days = ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']; foreach ($days as $day) { echo "<option value='{$day}' " . (($current['general']['week_starts_on'] === $day) ? 'selected' : '') . ">{$day}</option>"; } ?></select></div><small>Determines first day of week in reports</small></div>
                    </div>
                </div>
                <div class="settings-actions"><button type="submit" name="save_general_settings" class="btn btn-primary">Save Changes</button></div>
            </form>
            
            <?php elseif ($active_tab === 'branding'): ?>
            <!-- === ব্র্যান্ডিং (কালার স্কিম) ট্যাব === -->
            <form action="?tab=branding" method="POST">
                <div class="settings-section">
                    <h3>Color Scheme</h3><p>Customize your brand colors</p>
                    <div class="form-grid-3-col">
                        <?php
                        function render_color_input($name, $label, $value, $description) {
                            echo '<div class="form-group"><label for="'.$name.'">'.$label.'</label><div class="form-group-color"><input type="text" id="'.$name.'" name="'.$name.'" value="'.htmlspecialchars($value).'"><input type="color" data-target="'.$name.'" value="'.htmlspecialchars($value).'"></div><small>'.$description.'</small></div>';
                        }
                        render_color_input('global_text_color', 'Global Text Color', $current['colors']['global_text_color'], 'Default text color throughout the app');
                        render_color_input('primary_button_color', 'Primary Button Color', $current['colors']['primary_button_color'], 'Background color for primary buttons');
                        render_color_input('button_text_color', 'Button Text Color', $current['colors']['button_text_color'], 'Text color for primary buttons');
                        render_color_input('button_hover_color', 'Button Hover Color', $current['colors']['button_hover_color'], 'Background color when hovering');
                        render_color_input('button_hover_text_color', 'Button Hover Text Color', $current['colors']['button_hover_text_color'], 'Text color when hovering');
                        render_color_input('navigation_background', 'Navigation Background', $current['colors']['navigation_background'], 'Background for navigation elements');
                        render_color_input('navigation_text_color', 'Navigation Text Color', $current['colors']['navigation_text_color'], 'Text color for navigation elements');
                        render_color_input('active_tab_color', 'Active Tab Color', $current['colors']['active_tab_color'], 'Background for selected tabs');
                        render_color_input('active_tab_text_color', 'Active Tab Text Color', $current['colors']['active_tab_text_color'], 'Text color for selected tabs');
                        ?>
                    </div>
                </div>
                <div class="settings-actions"><button type="submit" name="save_color_scheme" class="btn btn-primary">Save Changes</button></div>
            </form>
            
            <?php elseif ($active_tab === 'business'): ?>
            <!-- === বিজনেস ডিটেইলস ট্যাব === -->
            <form action="?tab=business" method="POST">
                <div class="settings-section">
                    <h3>Company Information</h3><p>Enter your business details for invoices and documentation</p>
                    <div class="form-grid">
                        <div class="form-group"><label for="street_address">Street Address</label><input type="text" id="street_address" name="street_address" value="<?php echo htmlspecialchars($current['business']['street_address']); ?>"><small>Street address including building/suite number</small></div>
                        <div class="form-group"><label for="city">City/Town</label><input type="text" id="city" name="city" value="<?php echo htmlspecialchars($current['business']['city']); ?>"><small>City or town name</small></div>
                        <div class="form-group"><label for="postal_code">Postal/ZIP Code</label><input type="text" id="postal_code" name="postal_code" value="<?php echo htmlspecialchars($current['business']['postal_code']); ?>"><small>Postal or ZIP code</small></div>
                        <div class="form-group"><label for="country">Country</label><div class="select-wrapper"><select id="country" name="country"><?php foreach($country_list as $code => $name): ?><option value="<?php echo $code; ?>" <?php echo ($current['business']['country'] === $code) ? 'selected' : ''; ?>><?php echo $name; ?></option><?php endforeach; ?></select></div><small>Country where your business is registered</small></div>
                    </div>
                </div>
                <div class="settings-actions"><button type="submit" name="save_business_details" class="btn btn-primary">Save Changes</button></div>
            </form>

            <?php elseif ($active_tab === 'contact'): ?>
            <!-- === কন্টাক্ট ও সোশ্যাল ট্যাব === -->
            <form action="?tab=contact" method="POST">
                <div class="settings-section">
                    <h3>Support Contact Information</h3><p>Configure support channels for your customers</p>
                    <div class="form-grid-3-col">
                        <div class="form-group"><label for="support_phone">Support Phone Number</label><input type="text" id="support_phone" name="support_phone" value="<?php echo htmlspecialchars($current['support']['support_phone']); ?>"><small>Customer service phone number (with country code)</small></div>
                        <div class="form-group"><label for="support_email">Support Email Address</label><input type="email" id="support_email" name="support_email" value="<?php echo htmlspecialchars($current['support']['support_email']); ?>"><small>Primary contact email for support inquiries</small></div>
                        <div class="form-group"><label for="support_website">Support Website</label><div class="input-with-prefix"><span>https://</span><input type="text" id="support_website" name="support_website" placeholder="help.yourcompany.com" value="<?php echo htmlspecialchars($current['support']['support_website']); ?>"></div><small>Link to your support portal or help center</small></div>
                    </div>
                </div>
                <div class="settings-actions"><button type="submit" name="save_support_details" class="btn btn-primary">Save Changes</button></div>
            </form>
            <?php endif; ?>
        </div>
    </div>
</div>

</div> <!-- .main-content -->
<div id="toast-notification"></div>
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
    <?php if (!empty($success_message)): ?>
        showToast('<?php echo $success_message; ?>', true);
    <?php endif; ?>
    
    // Currency & Symbol logic
    const currencySelect = document.getElementById('default_currency');
    if(currencySelect) { currencySelect.addEventListener('change', function() { document.getElementById('currency_symbol').value = (this.value === 'BDT') ? '৳' : '$'; }); }

    // Color picker logic
    document.querySelectorAll('.form-group-color input[type="color"]').forEach(picker => { picker.addEventListener('input', function() { document.getElementById(this.dataset.target).value = this.value; }); });
    document.querySelectorAll('.form-group-color input[type="text"]').forEach(input => { input.addEventListener('input', function() { this.nextElementSibling.value = this.value; }); });
});
function showToast(message, isSuccess) {
    const toast = document.getElementById('toast-notification');
    if (!toast) return;
    toast.textContent = message;
    toast.className = 'show ' + (isSuccess ? 'success' : 'error');
    setTimeout(() => { toast.className = toast.className.replace('show', ''); }, 3000);
}
</script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): generate_qr.php [Text Content] ---
================================================================================

<?php
// === ধাপ ১: এরর হ্যান্ডলিং এবং সেশন শুরু করা ===
ob_start();
ini_set('display_errors', 0);
error_reporting(0);

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// === ধাপ ২: প্রয়োজনীয় ফাইল এবং ক্লাস যুক্ত করা ===
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/db_connect.php';
require __DIR__ . '/auth_check.php';

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;

// === ধাপ ৩: মূল কোড 실행 (Execution) ===
try {
    if (!isset($_SESSION['user_id'])) {
        throw new Exception("User is not logged in.");
    }
    $user_id = $_SESSION['user_id'];

    // ★★★ পরিবর্তন: একটি অনন্য, একবার-ব্যবহারযোগ্য টোকেন তৈরি করা হচ্ছে ★★★
    $token = bin2hex(random_bytes(32));

    // ★★★ পরিবর্তন: টোকেনটি ডাটাবেসের `users` টেবিলে সেভ করা হচ্ছে ★★★
    $stmt = $pdo->prepare("UPDATE users SET app_auth_token = ? WHERE id = ?");
    $stmt->execute([$token, $user_id]);

    // === ডেটাবেস থেকে Base URL এবং ইমেইল আনা ===
    $stmt_user = $pdo->prepare("
        SELECT u.email, s.base_url 
        FROM users u 
        LEFT JOIN settings s ON u.id = s.user_id 
        WHERE u.id = ?
    ");
    $stmt_user->execute([$user_id]);
    $user_data = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$user_data || empty($user_data['base_url']) || empty($user_data['email'])) {
        throw new Exception("User email or API Base URL not found in settings. Please visit the API Settings page first.");
    }
    $user_email = $user_data['email'];
    $base_url = $user_data['base_url'];
    
    // ★★★ পরিবর্তন: QR কোডের ডেটাতে এখন টোকেন অন্তর্ভুক্ত করা হয়েছে ★★★
    $qr_data = json_encode([
        'baseUrl' => $base_url,
        'email'   => $user_email,
        'token'   => $token
    ]);
    
    // লাইব্রেরির সর্বশেষ সংস্করণ অনুযায়ী কোড
    $qrCode = new QrCode($qr_data, new Encoding('UTF-8'), ErrorCorrectionLevel::High);
    $writer = new PngWriter();
    $result = $writer->write($qrCode);
    
    // === ধাপ ৪: সফলভাবে QR কোড তৈরি হলে ছবিটি পাঠানো ===
    ob_end_clean();
    header('Content-Type: ' . $result->getMimeType());
    echo $result->getString();
    exit();

} catch (Throwable $e) {
    ob_end_clean();
    error_log("CRITICAL QR Code Generation Error: " . $e->getMessage());

    // ব্যবহারকারীকে একটি সাধারণ এরর ইমেজ দেখানো হবে
    header('Content-Type: image/png');
    $im = imagecreate(280, 80);
    imagecolorallocate($im, 244, 247, 250);
    $fg = imagecolorallocate($im, 220, 53, 69);
    imagestring($im, 3, 10, 25, 'ERROR: Could not generate QR Code.', $fg);
    imagestring($im, 3, 10, 45, 'Visit API Settings page first.', $fg);
    imagepng($im);
    imagedestroy($im);
    exit();
}
?>

================================================================================
--- ফাইল পাথ (File Path): get_default_link.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require 'auth_check.php';
require 'db_connect.php';

$user_id = $_SESSION['user_id'];
$response = ['success' => false, 'message' => ''];

try {
    // ব্যবহারকারীর জন্য ডিফল্ট লিঙ্ক আছে কিনা তা খোঁজা হচ্ছে
    $stmt = $pdo->prepare("SELECT unique_link_id FROM payment_links WHERE user_id = ? AND is_default = 1 LIMIT 1");
    $stmt->execute([$user_id]);
    $link = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($link && !empty($link['unique_link_id'])) {
        $unique_id = $link['unique_link_id'];
    } else {
        // যদি না থাকে, তবে একটি নতুন ডিফল্ট লিঙ্ক তৈরি করা হচ্ছে
        $unique_id = 'default-' . bin2hex(random_bytes(12));
        
        $insert_stmt = $pdo->prepare(
            "INSERT INTO payment_links (user_id, product_name, unique_link_id, is_default, status) 
             VALUES (?, 'Default Payment Link', ?, 1, 1)"
        );
        $insert_stmt->execute([$user_id, $unique_id]);
    }
    
    $response['success'] = true;
    $response['unique_id'] = $unique_id;

} catch (PDOException $e) {
    $response['message'] = 'Database error: ' . $e->getMessage();
}

echo json_encode($response);
?>

================================================================================
--- ফাইল পাথ (File Path): get_payment_link.php [Text Content] ---
================================================================================

<?php
// dashboard_project/get_payment_link.php
header('Content-Type: application/json');
require 'auth_check.php';
require 'db_connect.php';

$response = ['success' => false, 'url' => ''];
$link_id = $_POST['id'] ?? null;
$user_id = $_SESSION['user_id'];

if ($link_id) {
    $stmt = $pdo->prepare("SELECT unique_link_id FROM payment_links WHERE id = ? AND user_id = ?");
    $stmt->execute([$link_id, $user_id]);
    $link = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($link) {
        $unique_id = $link['unique_link_id'];
        
        // যদি স্বতন্ত্র আইডি আগে তৈরি না হয়ে থাকে, তবে নতুন করে তৈরি করে সেভ করা
        if (empty($unique_id)) {
            $unique_id = bin2hex(random_bytes(20)); // একটি দীর্ঘ, অনুমান করা কঠিন আইডি
            $update_stmt = $pdo->prepare("UPDATE payment_links SET unique_link_id = ? WHERE id = ?");
            $update_stmt->execute([$unique_id, $link_id]);
        }
        
        // সম্পূর্ণ URL তৈরি করা
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
        $host = $_SERVER['HTTP_HOST'];
        $directory = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
        
        $response['url'] = "{$protocol}://{$host}{$directory}/paymentlink/pay/{$unique_id}";
        $response['success'] = true;
    }
}

echo json_encode($response);
?>

================================================================================
--- ফাইল পাথ (File Path): index.php [Text Content] ---
================================================================================

<?php
// ব্যবহারকারী লগইন করা আছে কিনা তা পরীক্ষা করা
require 'auth_check.php';
// ডেটাবেস সংযোগ ফাইল যুক্ত করা
require 'db_connect.php';

// === ড্যাশবোর্ডের জন্য সিস্টেম-ব্যাপী ডেটা গণনা ===

// ★★★ সমাধান: এখন থেকে কোনো কোয়েরিতে user_id দিয়ে ফিল্টার করা হবে না ★★★

// ১. সমস্ত ব্যবহারকারীর ব্যবহৃত মোট ক্রেডিট গণনা
$stmt_credits = $pdo->prepare("SELECT COUNT(id) FROM credit_transactions");
$stmt_credits->execute();
$total_credits_used = $stmt_credits->fetchColumn();

// ২. সমস্ত ব্যবহারকারীর পেন্ডিং পেমেন্টের সংখ্যা গণনা
$stmt_pending = $pdo->prepare("SELECT COUNT(id) FROM transactions WHERE status = 'pending'");
$stmt_pending->execute();
$pending_payments = $stmt_pending->fetchColumn();

// ৩. নতুন যুক্ত: সমস্ত ব্যবহারকারীর মোট সফল পেমেন্টের সংখ্যা গণনা
$stmt_successful = $pdo->prepare("SELECT COUNT(id) FROM transactions WHERE status = 'completed'");
$stmt_successful->execute();
$successful_payments = $stmt_successful->fetchColumn();

// ৪. মোট ব্যবহারকারীর সংখ্যা গণনা (এটি আগে থেকেই সঠিক ছিল)
$stmt_total_users = $pdo->prepare("SELECT COUNT(id) FROM users");
$stmt_total_users->execute();
$total_users = $stmt_total_users->fetchColumn();

// ৫. স্ট্যাটাস অনুযায়ী ব্যবহারকারীর সংখ্যা গণনা (এটিও আগে সঠিক ছিল)
$stmt_active_users = $pdo->prepare("SELECT COUNT(id) FROM users WHERE license_status = 'active'");
$stmt_active_users->execute();
$active_users = $stmt_active_users->fetchColumn();

$stmt_suspended_users = $pdo->prepare("SELECT COUNT(id) FROM users WHERE license_status = 'suspended'");
$stmt_suspended_users->execute();
$suspended_users = $stmt_suspended_users->fetchColumn();

$stmt_terminated_users = $pdo->prepare("SELECT COUNT(id) FROM users WHERE license_status = 'terminated'");
$stmt_terminated_users->execute();
$terminated_users = $stmt_terminated_users->fetchColumn();


// হেডার ও সাইডবার টেমপ্লেট যুক্ত করা
include 'templates/header.php';
include 'templates/sidebar.php';
?>

<!-- ড্যাশবোর্ডের মূল কন্টেন্ট -->
<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Home</p>
            <h1 class="page-title">Admin Dashboard</h1>
        </div>
    </div>

    <!-- পরিসংখ্যান কার্ডের গ্রিড -->
    <div class="dashboard-grid">
        <!-- কার্ড ১: মোট ক্রেডিট ব্যবহৃত -->
        <div class="stat-card blue">
            <div class="card-icon"><i class="fas fa-wallet"></i></div>
            <div class="card-content">
                <h4>Total Credits Used</h4>
                <p class="stat-value"><?php echo number_format($total_credits_used); ?></p>
                <p class="stat-description">Across all users & sites</p>
            </div>
        </div>

        <!-- কার্ড ২: পেন্ডিং পেমেন্ট -->
        <div class="stat-card orange">
            <div class="card-icon"><i class="fas fa-hourglass-half"></i></div>
            <div class="card-content">
                <h4>Pending Payments</h4>
                <p class="stat-value"><?php echo number_format($pending_payments); ?></p>
                <p class="stat-description">System-wide awaiting completion</p>
            </div>
        </div>
        
        <!-- ★★★ নতুন কার্ড: মোট সফল পেমেন্ট ★★★ -->
        <div class="stat-card teal">
            <div class="card-icon"><i class="fas fa-check-circle"></i></div>
            <div class="card-content">
                <h4>Total Successful Payments</h4>
                <p class="stat-value"><?php echo number_format($successful_payments); ?></p>
                <p class="stat-description">Across all users & sites</p>
            </div>
        </div>

        <!-- কার্ড ৩: মোট ব্যবহারকারী -->
        <div class="stat-card purple">
            <div class="card-icon"><i class="fas fa-users"></i></div>
            <div class="card-content">
                <h4>Total Users</h4>
                <p class="stat-value"><?php echo number_format($total_users); ?></p>
                <p class="stat-description">All registered accounts</p>
            </div>
        </div>
    </div>

    <!-- ব্যবহারকারীদের স্ট্যাটাস নিয়ে দ্বিতীয় সারি -->
    <h2 class="section-title">User Statistics</h2>
    <div class="dashboard-grid user-stats">
        <!-- কার্ড ৪: সক্রিয় ব্যবহারকারী -->
        <div class="stat-card green small">
             <div class="card-content">
                <h4><i class="fas fa-user-check"></i> Active Users</h4>
                <p class="stat-value"><?php echo number_format($active_users); ?></p>
            </div>
        </div>

        <!-- কার্ড ৫: স্থগিত ব্যবহারকারী -->
        <div class="stat-card yellow small">
             <div class="card-content">
                <h4><i class="fas fa-user-clock"></i> Suspended Users</h4>
                <p class="stat-value"><?php echo number_format($suspended_users); ?></p>
            </div>
        </div>

        <!-- কার্ড ৬: বাতিল ব্যবহারকারী -->
        <div class="stat-card red small">
             <div class="card-content">
                <h4><i class="fas fa-user-slash"></i> Terminated Users</h4>
                <p class="stat-value"><?php echo number_format($terminated_users); ?></p>
            </div>
        </div>
    </div>
</div>

</div> <!-- .main-content কে বন্ধ করার ট্যাগ -->
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): initiate_funding.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require 'auth_check.php';
require 'db_connect.php';

// --- Configuration ---
define('USD_TO_BDT_RATE', 120);

// --- Input Processing ---
$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);
$amount_usd = (float)($data['amount'] ?? 0);

if ($amount_usd <= 0) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Invalid amount provided.']);
    exit();
}

// --- Data Preparation ---
$user_id = $_SESSION['user_id'];
$amount_bdt = $amount_usd * USD_TO_BDT_RATE;
$transaction_unique_id = sha1(uniqid(rand(), true) . microtime());

// --- Base URL for Callbacks ---
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$host = $_SERVER['HTTP_HOST'];
$directory = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$base_project_url = "{$protocol}://{$host}{$directory}";

// Success URL points back to billing page with success flags
$success_url = "{$base_project_url}/billing.php?funding_status=success&trx_id=" . $transaction_unique_id;
$cancel_url = "{$base_project_url}/billing.php?funding_status=cancelled";

try {
    $pdo->beginTransaction();

    // Step 1: Log the funding attempt in the new `user_funds` table
    $stmt_funds = $pdo->prepare(
        "INSERT INTO user_funds (user_id, transaction_unique_id, amount_usd, amount_bdt, status) 
         VALUES (?, ?, ?, ?, 'pending')"
    );
    $stmt_funds->execute([$user_id, $transaction_unique_id, $amount_usd, $amount_bdt]);

    // Step 2: Create a payment session in the main `transactions` table
    $stmt_trans = $pdo->prepare(
        "INSERT INTO transactions (user_id, unique_id, amount, customer_name, customer_email, success_url, cancel_url, meta_data) 
         VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
    );
    $stmt_trans->execute([
        $user_id,
        $transaction_unique_id,
        $amount_bdt, // Use BDT amount for the payment gateway
        $_SESSION['username'] ?? 'User',
        $_SESSION['user_email'] ?? 'email@example.com', // Assuming you store email in session
        $success_url,
        $cancel_url,
        json_encode(['source' => 'user_funding', 'amount_usd' => $amount_usd])
    ]);

    $pdo->commit();

    // Step 3: Respond with the checkout URL
    $payment_url = "{$base_project_url}/checkout.php?trx_id={$transaction_unique_id}";
    echo json_encode(['success' => true, 'payment_url' => $payment_url]);

} catch (PDOException $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Failed to initiate funding session.', 'error' => $e->getMessage()]);
}


================================================================================
--- ফাইল পাথ (File Path): licenses.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$user_id = $_SESSION['user_id'];

// ডেটাবেস থেকে সকল লাইসেন্স এবং সংশ্লিষ্ট প্রোডাক্টের নাম আনা হচ্ছে
$stmt = $pdo->prepare(
    "SELECT l.*, p.item_name 
     FROM licenses l 
     JOIN products p ON l.product_id = p.id 
     WHERE l.user_id = ? ORDER BY l.id DESC"
);
$stmt->execute([$user_id]);
$licenses = $stmt->fetchAll(PDO::FETCH_ASSOC);

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <h1>Manage Licenses</h1>
        <!-- ★★★ পরিবর্তন: নতুন লাইসেন্স তৈরির জন্য এখন license_manage.php পেজে পাঠানো হচ্ছে ★★★ -->
        <a href="license_manage.php" class="btn btn-primary">Create New License</a>
    </div>

    <div class="content-card">
        <table class="data-table">
            <thead>
                <tr>
                    <th>License Key</th>
                    <th>Product</th>
                    <th>Status</th>
                    <th>Activations</th>
                    <th>Expires</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php if (count($licenses) > 0): ?>
                    <?php foreach ($licenses as $license): ?>
                    <tr>
                        <td><code><?php echo htmlspecialchars($license['license_key']); ?></code></td>
                        <td><?php echo htmlspecialchars($license['item_name']); ?></td>
                        <td><span class="status-badge status-<?php echo strtolower(htmlspecialchars($license['status'])); ?>"><?php echo ucfirst(htmlspecialchars($license['status'])); ?></span></td>
                        <td><?php echo count(json_decode($license['activations'] ?? '[]', true)); ?> / <?php echo $license['activation_limit'] == 0 ? 'Unlimited' : $license['activation_limit']; ?></td>
                        <td><?php echo $license['expires_at'] ? date('Y-m-d', strtotime($license['expires_at'])) : 'Lifetime'; ?></td>
                        <td>
                            <!-- ★★★ মূল পরিবর্তন: Manage বাটনে এখন লাইসেন্সের ID সহ লিঙ্ক যুক্ত করা হয়েছে ★★★ -->
                            <a href="license_manage.php?id=<?php echo $license['id']; ?>" class="btn btn-secondary">Manage</a>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                <?php else: ?>
                    <tr><td colspan="6" style="text-align:center; padding: 20px;">No licenses found.</td></tr>
                <?php endif; ?>
            </tbody>
        </table>
    </div>
</div>

<?php include 'templates/footer.php'; ?>

================================================================================
--- ফাইল পাথ (File Path): license_manage.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$user_id = $_SESSION['user_id'];
$pageTitle = 'Create New License';
$license = null;
$licenseId = $_GET['id'] ?? null;

// যদি URL-এ id থাকে, তার মানে এটি এডিট মোড
if ($licenseId) {
    $pageTitle = 'Manage License';
    $stmt = $pdo->prepare("SELECT * FROM licenses WHERE id = ? AND user_id = ?");
    $stmt->execute([$licenseId, $user_id]);
    $license = $stmt->fetch();
    if (!$license) {
        die("License not found or you don't have permission to edit it.");
    }
}

// যখন فرم সাবমিট করা হবে
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $productId = $_POST['product_id'];
    $status = $_POST['status'];
    $expiresAt = !empty($_POST['expires_at']) ? date('Y-m-d H:i:s', strtotime($_POST['expires_at'])) : null;

    // প্রোডাক্ট থেকে activation_limit আনা হচ্ছে
    $stmt_prod = $pdo->prepare("SELECT activation_limit FROM products WHERE id = ? AND user_id = ?");
    $stmt_prod->execute([$productId, $user_id]);
    $product_defaults = $stmt_prod->fetch();
    $activationLimit = $product_defaults ? $product_defaults['activation_limit'] : 1;

    if ($licenseId) {
        // --- লাইসেন্স আপডেট করার কোড ---
        $stmt_update = $pdo->prepare(
            "UPDATE licenses SET product_id = ?, status = ?, activation_limit = ?, expires_at = ? WHERE id = ? AND user_id = ?"
        );
        $stmt_update->execute([$productId, $status, $activationLimit, $expiresAt, $licenseId, $user_id]);

        // users টেবিলের সাথে স্ট্যাটাস সিঙ্ক্রোনাইজ করা
        if ($license['license_key']) {
            $stmt_sync_user = $pdo->prepare("UPDATE users SET license_status = ? WHERE license_key = ?");
            $stmt_sync_user->execute([$status, $license['license_key']]);
        }

    } else {
        // --- নতুন লাইসেন্স তৈরি করার কোড ---
        function generate_license_key($pdo) {
            for ($i = 0; $i < 10; $i++) {
                $key = 'SSP-' . implode('-', str_split(strtoupper(bin2hex(random_bytes(10))), 5));
                $stmt_check = $pdo->prepare("SELECT id FROM licenses WHERE license_key = ?");
                $stmt_check->execute([$key]);
                if (!$stmt_check->fetch()) return $key;
            }
            return false;
        }
        $licenseKey = generate_license_key($pdo);
        
        $stmt_insert = $pdo->prepare(
            "INSERT INTO licenses (user_id, product_id, license_key, status, activation_limit, expires_at) VALUES (?, ?, ?, ?, ?, ?)"
        );
        $stmt_insert->execute([$user_id, $productId, $licenseKey, $status, $activationLimit, $expiresAt]);
        $licenseId = $pdo->lastInsertId();
    }
    
    header('Location: license_manage.php?id=' . $licenseId . '&success=1');
    exit;
}

// فرم এর জন্য প্রয়োজনীয় ডেটা আনা
$products_stmt = $pdo->prepare("SELECT * FROM products WHERE user_id = ? AND status = 1 ORDER BY item_name ASC");
$products_stmt->execute([$user_id]);
$products = $products_stmt->fetchAll(PDO::FETCH_ASSOC);
$statuses = ['active', 'suspended', 'expired', 'terminated'];

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <h1><?php echo $pageTitle; ?></h1>
        <a href="licenses.php" class="btn btn-secondary">Back to List</a>
    </div>

    <?php if (isset($_GET['success'])): ?>
        <div id="toast-notification" class="show success">License saved successfully!</div>
    <?php endif; ?>

    <div class="content-card">
        <form method="post">
            <?php if ($license): ?>
            <div class="form-group">
                <label>License Key</label>
                <input type="text" class="form-control" value="<?php echo htmlspecialchars($license['license_key']); ?>" readonly style="background-color: #f1f1f1; cursor: not-allowed;">
            </div>
            <?php endif; ?>

            <div class="form-group">
                <label>Product <span class="required-star">*</span></label>
                <div class="select-wrapper">
                    <select name="product_id" required>
                        <option value="">-- Select a Product --</option>
                        <?php foreach ($products as $p): ?>
                        <option value="<?php echo $p['id']; ?>" <?php echo ($license && $license['product_id'] == $p['id']) ? 'selected' : ''; ?>>
                            <?php echo htmlspecialchars($p['item_name']); ?> (Limit: <?php echo $p['activation_limit']; ?>, Credits: <?php echo $p['initial_credits']; ?>)
                        </option>
                        <?php endforeach; ?>
                    </select>
                </div>
                 <small>Activation limit will be set automatically based on the selected product.</small>
            </div>

            <div class="form-row" style="display: flex; gap: 20px;">
                <div class="form-group" style="width: 50%;">
                    <label>Status</label>
                    <div class="select-wrapper">
                        <select name="status" required>
                            <?php foreach ($statuses as $s): ?>
                            <option value="<?php echo $s; ?>" <?php echo ($license && $license['status'] == $s) ? 'selected' : ''; ?>>
                                <?php echo ucfirst($s); ?>
                            </option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                </div>
                <div class="form-group" style="width: 50%;">
                    <label>Expires At (Blank=lifetime)</label>
                    <input type="date" name="expires_at" value="<?php echo $license['expires_at'] ? date('Y-m-d', strtotime($license['expires_at'])) : ''; ?>">
                </div>
            </div>

            <div class="form-actions" style="margin-top: 20px;">
                <button type="submit" class="btn btn-primary">Save Changes</button>
            </div>
        </form>
    </div>
</div>
<?php include 'templates/footer.php'; ?>

================================================================================
--- ফাইল পাথ (File Path): login.php [Text Content] ---
================================================================================

<?php
require 'db_connect.php';
session_start();

// যদি ব্যবহারকারী ইতিমধ্যে লগইন করা থাকে, তাকে ড্যাশবোর্ডে পাঠিয়ে দেওয়া হবে
if (isset($_SESSION['user_id'])) {
    header("Location: index.php");
    exit();
}

$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = trim($_POST['email']);
    $password = $_POST['password'];

    $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
    $stmt->execute([$email]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    // ব্যবহারকারীকে খুঁজে পাওয়া গেলে এবং পাসওয়ার্ড সঠিক হলে লগইন হবে
    if ($user && password_verify($password, $user['password'])) {
        $_SESSION['user_id'] = $user['id'];
        $_SESSION['username'] = $user['username'];
        header("Location: index.php");
        exit();
    } else {
        $error = "Invalid email or password.";
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <link rel="stylesheet" href="css/style.css?v=<?php echo filemtime('css/style.css'); ?>">
</head>
<body class="auth-body">
    <div class="auth-container">
        <h2 class="auth-title">Dashboard Login</h2>
        <?php if (!empty($error)): ?>
            <div class="auth-errors"><p><?php echo $error; ?></p></div>
        <?php endif; ?>
        <?php if (isset($_GET['registration']) && $_GET['registration'] === 'success'): ?>
            <div class="auth-success"><p>Registration successful! Please login.</p></div>
        <?php endif; ?>
        <form action="login.php" method="POST">
            <div class="form-group">
                <label for="email">Email</label>
                <input type="email" id="email" name="email" required>
            </div>
            <div class="form-group">
                <label for="password">Password</label>
                <input type="password" id="password" name="password" required>
            </div>
            <button type="submit" class="btn btn-primary auth-btn">Login</button>
        </form>
        <p class="auth-switch">Don't have an account? <a href="register.php">Register here</a></p>
    </div>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): logout.php [Text Content] ---
================================================================================

<?php
session_start();
// সেশনের সব ডেটা মুছে ফেলা
session_unset();
// সেশনটি ধ্বংস করা
session_destroy();
// লগইন পেজে রিডাইরেক্ট করা
header("Location: login.php");
exit();
?>

================================================================================
--- ফাইল পাথ (File Path): payment.php [Text Content] ---
================================================================================

<?php
// ব্যবহারকারী লগইন করা আছে কিনা তা পরীক্ষা করা
require 'auth_check.php';
// ডেটাবেস সংযোগ ফাইল যুক্ত করা
require 'db_connect.php'; 

// হেডার ও সাইডবার টেমপ্লেট যুক্ত করা
include 'templates/header.php';
include 'templates/sidebar.php';

// সেশন থেকে বর্তমান ব্যবহারকারীর আইডি নেওয়া হচ্ছে
$user_id = $_SESSION['user_id'];

// SELECT কোয়েরিতে WHERE user_id = ? শর্ত যুক্ত করে শুধুমাত্র বর্তমান ব্যবহারকারীর গেটওয়েগুলো আনা হচ্ছে
$stmt = $pdo->prepare("SELECT * FROM gateways WHERE user_id = ? ORDER BY id DESC");
$stmt->execute([$user_id]);
$gateways = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<!-- পেমেন্ট গেটওয়ে পেজের মূল কন্টেন্ট -->
<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Gateways > List</p>
            <h1 class="page-title">Gateways</h1>
        </div>
        <button class="btn btn-primary" id="openModalBtn">
            <i class="fas fa-plus"></i> New gateway
        </button>
    </div>

    <div class="content-card">
        <div class="card-toolbar">
            <div class="toolbar-left">
                <i class="fas fa-exchange-alt icon-btn"></i>
            </div>
            <div class="toolbar-right">
                <div class="search-box">
                    <i class="fas fa-search"></i>
                    <input type="text" placeholder="Search">
                </div>
            </div>
        </div>

        <table class="data-table">
            <thead>
                <tr>
                    <th><input type="checkbox"></th>
                    <th>Display name <i class="fas fa-chevron-down"></i></th>
                    <th>Currency</th>
                    <th>Status</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <?php if (count($gateways) > 0): ?>
                    <?php foreach ($gateways as $gateway): ?>
                        <tr>
                            <td><input type="checkbox"></td>
                            <td><?php echo htmlspecialchars($gateway['display_name']); ?></td>
                            <td>BDT</td>
                            <td>
                                <label class="toggle-switch">
                                    <input type="checkbox" <?php echo $gateway['status'] ? 'checked' : ''; ?>>
                                    <span class="slider"></span>
                                </label>
                            </td>
                            <td class="actions">
                                <a href="edit_gateway.php?id=<?php echo $gateway['id']; ?>" class="action-edit">
                                    <i class="fas fa-pencil-alt"></i> Edit
                                </a>
                                <a href="#" class="action-delete">
                                    <i class="fas fa-trash-alt"></i> Delete
                                </a>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                <?php else: ?>
                    <tr>
                        <td colspan="5" style="text-align:center; padding: 20px;">No gateways have been added yet.</td>
                    </tr>
                <?php endif; ?>
            </tbody>
        </table>
        
        <div class="card-footer">
            <div class="pagination-controls">
                <span>Per page</span>
                <select>
                    <option value="10" selected>10</option>
                    <option value="20">20</option>
                    <option value="50">50</option>
                </select>
            </div>
        </div>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<!-- Create Gateway Modal (পপআপ) -->
<div id="gatewayModal" class="modal">
    <div class="modal-content">
        <form action="create_gateway.php" method="POST">
            <div class="modal-header">
                <h2>Create gateway</h2>
                <span class="close-button">&times;</span>
            </div>
            <div class="modal-body">
                <div class="form-group">
                    <label for="gateway-select">Gateway<span class="required-star">*</span></label>
                    <div class="select-wrapper">
                        <select id="gateway-select" name="gateway_key" required>
                            <option value="">Select an option</option>
                            <option value="bkash_personal">Bkash Personal</option>
                            <option value="nagad_personal">Nagad Personal</option>
                            <option value="rocket_personal">Rocket Personal</option>
                            <option value="upay_personal">Upay Personal</option>
                            <option value="bkash_merchant_tokenized">bKash Marchant (Tokenized)</option>
                            <option value="nagad_merchant">Nagad Marchant</option>
                            <!-- ★★★ নতুন পপআপ অপশন যুক্ত করা হয়েছে ★★★ -->
                            <option value="bkash_merchant_checkout">bKash Marchant (Checkout)</option>
                        </select>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary cancel-btn">Cancel</button>
                <button type="submit" class="btn btn-primary">Create</button>
            </div>
        </form>
    </div>
</div>

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): payments.php [Text Content] ---
================================================================================

<?php
// ব্যবহারকারী লগইন করা আছে কিনা তা পরীক্ষা করা
require 'auth_check.php';
// ডেটাবেস সংযোগ ফাইল যুক্ত করা
require 'db_connect.php'; 

// হেডার ও সাইডবার টেমপ্লেট যুক্ত করা
include 'templates/header.php';
include 'templates/sidebar.php';

$user_id = $_SESSION['user_id'];

// 'transactions' টেবিল থেকে ডেটা আনা হচ্ছে
$stmt = $pdo->prepare("
    SELECT id, customer_name, customer_email, amount, 'BDT' as currency, user_submitted_trxid as transaction_id, status, created_at 
    FROM transactions 
    WHERE user_id = ? 
    ORDER BY created_at DESC
");
$stmt->execute([$user_id]);
$payments = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<!-- পেমেন্টস পেজের মূল কন্টেন্ট -->
<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Gateway > Payments</p>
            <h1 class="page-title">All Payments</h1>
        </div>
    </div>

    <div class="content-card">
        <div class="card-toolbar">
            <div class="toolbar-left"></div>
            <div class="toolbar-right">
                <div class="search-box">
                    <i class="fas fa-search"></i>
                    <input type="text" placeholder="Search by name or email">
                </div>
            </div>
        </div>

        <table class="data-table">
            <thead>
                <tr>
                    <th>Customer Name</th>
                    <th>Customer Email</th>
                    <th>Amount</th>
                    <th>Transaction ID</th>
                    <th>Status</th>
                    <th>Date</th>
                </tr>
            </thead>
            <tbody>
                <?php if (count($payments) > 0): ?>
                    <?php foreach ($payments as $payment): ?>
                        <tr>
                            <td><?php echo htmlspecialchars($payment['customer_name'] ?: 'N/A'); ?></td>
                            <td><?php echo htmlspecialchars($payment['customer_email'] ?: 'N/A'); ?></td>
                            <td><?php echo number_format($payment['amount'], 2); ?> <?php echo htmlspecialchars($payment['currency']); ?></td>
                            <td><?php echo htmlspecialchars($payment['transaction_id'] ?: 'N/A'); ?></td>
                            <td>
                                <!-- স্ট্যাটাস অনুযায়ী ডিজাইন পরিবর্তন হবে -->
                                <span class="status-badge status-<?php echo strtolower(htmlspecialchars($payment['status'])); ?>">
                                    <?php echo htmlspecialchars(ucfirst($payment['status'])); ?>
                                </span>
                            </td>
                            <!-- তারিখ সুন্দরভাবে ফরম্যাট করে দেখানো হচ্ছে -->
                            <td><?php echo date("d M, Y, g:i A", strtotime($payment['created_at'])); ?></td>
                        </tr>
                    <?php endforeach; ?>
                <?php else: ?>
                    <tr>
                        <td colspan="6" style="text-align:center; padding: 20px;">No payments have been recorded yet.</td>
                    </tr>
                <?php endif; ?>
            </tbody>
        </table>
        
        <div class="card-footer">
            <div class="pagination-controls">
                <span>Per page</span>
                <select>
                    <option value="10" selected>10</option>
                    <option value="20">20</option>
                    <option value="50">50</option>
                </select>
            </div>
        </div>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<style>
/* স্ট্যাটাস ব্যাজের জন্য CSS */
.status-badge.status-completed { background-color: #dcfce7; color: #22c55e; }
.status-badge.status-pending { background-color: #fef9c3; color: #f59e0b; }
.status-badge.status-failed, .status-badge.status-cancelled { background-color: #fee2e2; color: #ef4444; }
</style>
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): payment_cancelled.php [Text Content] ---
================================================================================

<!DOCTYPE html>
<html lang="bn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>পেমেন্ট বাতিল হয়েছে</title>
    <!-- CSS ফাইল লিংক করা -->
    <link rel="stylesheet" href="css/style.css?v=<?php echo filemtime('css/style.css'); ?>">
    <!-- ৩ সেকেন্ড পর স্বয়ংক্রিয়ভাবে ড্যাশবোর্ডে রিডাইরেক্ট করার জন্য মেটা ট্যাগ -->
    <meta http-equiv="refresh" content="3;url=index.php" />
</head>
<body class="cancellation-body">
    <div class="cancellation-box">
        <h2>পেমেন্ট বাতিল করা হয়েছে</h2>
        <p>আপনার পেমেন্ট সেশনটি সফলভাবে বাতিল করা হয়েছে।</p>
        <p>আপনাকে শীঘ্রই ড্যাশবোর্ডে ফিরিয়ে নেওয়া হবে।</p>
        <a href="index.php" class="btn btn-primary">এখনই ড্যাশবোর্ডে যান</a>
    </div>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): payment_links.php [Text Content] ---
================================================================================

<?php
// ব্যবহারকারী লগইন করা আছে কিনা তা পরীক্ষা করা
require 'auth_check.php';
// ডেটাবেস সংযোগ ফাইল যুক্ত করা
require 'db_connect.php'; 

// হেডার ও সাইডবার টেমপ্লেট যুক্ত করা
include 'templates/header.php';
include 'templates/sidebar.php';

$user_id = $_SESSION['user_id'];

// শুধুমাত্র ব্যবহারকারীর তৈরি করা (ডিফল্ট নয়) লিঙ্কগুলো আনা হচ্ছে
$stmt = $pdo->prepare("SELECT * FROM payment_links WHERE user_id = ? AND is_default = 0 ORDER BY id DESC");
$stmt->execute([$user_id]);
$payment_links = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<!-- পেমেন্ট লিঙ্ক পেজের মূল কন্টেন্ট -->
<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Payment Links > List</p>
            <h1 class="page-title">Payment Links</h1>
        </div>
        <!-- ডান পাশের বাটন গ্রুপ -->
        <div class="page-header-actions">
            <a href="#" class="btn btn-secondary" id="copyDefaultLinkBtn">
                <i class="far fa-copy"></i> Copy Default Link
            </a>
            <!-- .htaccess এর জন্য .php ছাড়া লিঙ্ক ব্যবহার করা হচ্ছে -->
            <a href="create_payment_link" class="btn btn-primary">
                <i class="fas fa-plus"></i> New payment link
            </a>
        </div>
    </div>

    <div class="content-card">
        <div class="card-toolbar">
            <div class="toolbar-left"></div>
            <div class="toolbar-right" style="display: flex; align-items: center; gap: 15px;">
                <div class="search-box">
                    <i class="fas fa-search"></i>
                    <input type="text" placeholder="Search">
                </div>
                <i class="fas fa-bars icon-btn"></i>
            </div>
        </div>

        <table class="data-table">
            <thead>
                <tr>
                    <th><input type="checkbox"></th>
                    <th>Product name <i class="fas fa-chevron-down"></i></th>
                    <th>Product description <i class="fas fa-chevron-down"></i></th>
                    <th>Amount <i class="fas fa-chevron-down"></i></th>
                    <th>Quantity <i class="fas fa-chevron-down"></i></th>
                    <th>Status</th>
                    <th></th> <!-- Actions কলামের জন্য ফাঁকা হেডার -->
                </tr>
            </thead>
            <tbody>
                <?php if (count($payment_links) > 0): ?>
                    <?php foreach ($payment_links as $link): ?>
                        <tr>
                            <td><input type="checkbox"></td>
                            <td><?php echo htmlspecialchars($link['product_name']); ?></td>
                            <td><?php echo htmlspecialchars($link['product_description']); ?></td>
                            <td><?php echo htmlspecialchars($link['currency']); ?> <?php echo number_format($link['amount'], 2); ?></td>
                            <td><?php echo htmlspecialchars($link['quantity']); ?></td>
                            <td>
                                <label class="toggle-switch">
                                    <input type="checkbox" <?php echo $link['status'] ? 'checked' : ''; ?>>
                                    <span class="slider"></span>
                                </label>
                            </td>
                            <td class="actions" style="text-align: right;">
                                <a href="edit_payment_link?id=<?php echo $link['id']; ?>" class="action-edit"><i class="fas fa-pencil-alt"></i> Edit</a>
                                <a href="#" class="action-copy" data-id="<?php echo $link['id']; ?>"><i class="far fa-copy"></i> Copy</a>
                                <a href="delete_payment_link?id=<?php echo $link['id']; ?>" class="action-delete" onclick="return confirm('Are you sure?');"><i class="fas fa-trash-alt"></i> Delete</a>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                <?php else: ?>
                    <tr>
                        <td colspan="7" style="text-align:center; padding: 20px;">No payment links have been created yet.</td>
                    </tr>
                <?php endif; ?>
            </tbody>
        </table>
        
        <div class="card-footer">
            <div class="pagination-controls">
                <span>Per page</span>
                <select><option selected>10</option><option>20</option><option>50</option></select>
            </div>
        </div>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<!-- টোস্ট নোটিফিকেশনের জন্য HTML এলিমেন্ট -->
<div id="toast-notification"></div>

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
    const copyDefaultLinkBtn = document.getElementById('copyDefaultLinkBtn');
    
    if(copyDefaultLinkBtn) {
        copyDefaultLinkBtn.addEventListener('click', function(e) {
            e.preventDefault();
            
            // AJAX দিয়ে সার্ভার থেকে ডিফল্ট লিঙ্কের আইডি আনা হচ্ছে
            fetch('get_default_link.php')
            .then(response => response.json())
            .then(data => {
                if (data.success && data.unique_id) {
                    const baseUrl = window.location.origin + window.location.pathname.replace('payment_links.php', '').replace('payment_links', '');
                    const defaultLink = baseUrl + 'paymentlink/pay/' + data.unique_id;

                    navigator.clipboard.writeText(defaultLink).then(() => {
                        showToast('Default link copied to clipboard!', true);
                    });
                } else {
                    showToast(data.message || 'Could not generate default link.', false);
                }
            })
            .catch(() => showToast('An error occurred.', false));
        });
    }

    document.querySelectorAll('.action-copy').forEach(button => {
        button.addEventListener('click', function(e) {
            e.preventDefault();
            const linkId = this.dataset.id;
            fetch('get_payment_link.php', {
                method: 'POST',
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
                body: 'id=' + linkId
            })
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    const cleanUrl = data.url.replace('pay.php?link_id=', 'pay/');
                    navigator.clipboard.writeText(cleanUrl).then(() => {
                        showToast('Payment link copied!', true);
                    });
                } else {
                    showToast('Could not retrieve the link.', false);
                }
            });
        });
    });

    function showToast(message, isSuccess) {
        const toast = document.getElementById('toast-notification');
        if (!toast) return;
        toast.textContent = message;
        toast.className = 'show ' + (isSuccess ? 'success' : 'error');
        setTimeout(() => {
            toast.className = toast.className.replace('show', '');
        }, 3000);
    }
});
</script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): process_create_link.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ফর্ম থেকে ডেটা গ্রহণ
    $user_id = $_SESSION['user_id'];
    $product_name = trim($_POST['product_name']);
    $quantity = (int)$_POST['quantity'];
    $product_description = trim($_POST['product_description']) ?: null;
    $currency = $_POST['currency'];
    $amount = (float)$_POST['amount'];
    $expire_date = !empty($_POST['expire_date']) ? $_POST['expire_date'] : null;
    $status = isset($_POST['status']) ? 1 : 0;

    // ডেটাবেসে ডেটা ইনসার্ট করা
    try {
        $sql = "INSERT INTO payment_links (user_id, product_name, product_description, amount, currency, quantity, expire_date, status) 
                VALUES (:user_id, :product_name, :product_description, :amount, :currency, :quantity, :expire_date, :status)";
        
        $stmt = $pdo->prepare($sql);
        
        $stmt->execute([
            ':user_id' => $user_id,
            ':product_name' => $product_name,
            ':product_description' => $product_description,
            ':amount' => $amount,
            ':currency' => $currency,
            ':quantity' => $quantity,
            ':expire_date' => $expire_date,
            ':status' => $status
        ]);

    } catch (PDOException $e) {
        // কোনো সমস্যা হলে এরর দেখানো হবে
        die("Error creating payment link: " . $e->getMessage());
    }

    // সফলভাবে যুক্ত হওয়ার পর payment_links.php পেজে ফিরে যাওয়া
    header("Location: payment_links.php");
    exit();
}
?>

================================================================================
--- ফাইল পাথ (File Path): products.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$user_id = $_SESSION['user_id'];

// প্রোডাক্ট ডিলিট করার জন্য POST রিকোয়েস্ট হ্যান্ডেল করা
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_product'])) {
    $stmt = $pdo->prepare("DELETE FROM products WHERE id = ? AND user_id = ?");
    $stmt->execute([$_POST['product_id'], $user_id]);
    header('Location: products.php?deleted=1');
    exit;
}

$stmt_products = $pdo->prepare("SELECT * FROM products WHERE user_id = ? ORDER BY item_name ASC");
$stmt_products->execute([$user_id]);
$products = $stmt_products->fetchAll(PDO::FETCH_ASSOC);

include 'templates/header.php';
include 'templates/sidebar.php';
?>
<div class="page-container">
    <div class="page-header">
        <h1>Manage Products</h1>
        <a href="product_manage.php" class="btn btn-primary"><i class="fas fa-plus"></i> Create New Product</a>
    </div>

    <div class="content-card">
        <table class="data-table">
            <thead>
                <tr>
                    <th>Item Name</th>
                    <th>Initial Credits</th>
                    <th>Activation Limit</th>
                    <th>Status</th>
                    <th style="text-align: right;">Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php if (count($products) > 0): ?>
                    <?php foreach ($products as $product): ?>
                    <tr>
                        <td><?php echo htmlspecialchars($product['item_name']); ?></td>
                        <td><?php echo number_format($product['initial_credits']); ?></td>
                        <td><?php echo ($product['activation_limit'] == 0) ? 'Unlimited' : number_format($product['activation_limit']); ?></td>
                        <td>
                            <span class="status-badge <?php echo $product['status'] ? 'status-connected' : 'status-disconnected'; ?>">
                                <?php echo $product['status'] ? 'Active' : 'Inactive'; ?>
                            </span>
                        </td>
                        <td class="actions" style="text-align: right;">
                            <a href="product_manage.php?id=<?php echo $product['id']; ?>" class="action-edit"><i class="fas fa-pencil-alt"></i> Edit</a>
                            <form method="post" onsubmit="return confirm('Are you sure you want to delete this product?');" style="display:inline-block; margin-left: 15px;">
                                <input type="hidden" name="product_id" value="<?php echo $product['id']; ?>">
                                <button type="submit" name="delete_product" class="action-delete" style="border:none; background:none; cursor:pointer;"><i class="fas fa-trash-alt"></i> Delete</button>
                            </form>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                <?php else: ?>
                    <tr><td colspan="5" style="text-align: center; padding: 20px;">No products found. Start by creating a new product.</td></tr>
                <?php endif; ?>
            </tbody>
        </table>
    </div>
</div>
<?php include 'templates/footer.php'; ?>

================================================================================
--- ফাইল পাথ (File Path): product_manage.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$user_id = $_SESSION['user_id'];
$pageTitle = 'Create New Product';
$product = null;
$product_id = $_GET['id'] ?? null;

if ($product_id) {
    $pageTitle = 'Edit Product';
    $stmt = $pdo->prepare("SELECT * FROM products WHERE id = ? AND user_id = ?");
    $stmt->execute([$product_id, $user_id]);
    $product = $stmt->fetch();
    if (!$product) die("Product not found.");
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $item_name = trim($_POST['item_name']);
    $initial_credits = (int)$_POST['initial_credits'];
    $activation_limit = (int)$_POST['activation_limit'];
    $status = isset($_POST['status']) ? 1 : 0;

    if ($product_id) {
        // Update existing product
        $sql = "UPDATE products SET item_name = ?, initial_credits = ?, activation_limit = ?, status = ? WHERE id = ? AND user_id = ?";
        $params = [$item_name, $initial_credits, $activation_limit, $status, $product_id, $user_id];
    } else {
        // Insert new product
        $sql = "INSERT INTO products (user_id, item_name, initial_credits, activation_limit, status) VALUES (?, ?, ?, ?, ?)";
        $params = [$user_id, $item_name, $initial_credits, $activation_limit, $status];
    }
    
    $stmt_save = $pdo->prepare($sql);
    $stmt_save->execute($params);

    header('Location: products.php');
    exit;
}

include 'templates/header.php';
include 'templates/sidebar.php';
?>
<div class="page-container">
    <div class="page-header">
        <h1><?php echo $pageTitle; ?></h1>
        <a href="products.php" class="btn btn-secondary">Back to Products</a>
    </div>

    <div class="content-card">
        <form method="POST">
            <div class="form-group">
                <label for="item_name">Product Item Name <span class="required-star">*</span></label>
                <input type="text" id="item_name" name="item_name" value="<?php echo htmlspecialchars($product['item_name'] ?? ''); ?>" required>
                <small>This name must exactly match the 'Item Name' in your WHMCS module configuration.</small>
            </div>

            <div class="form-row" style="display: flex; gap: 20px;">
                <div class="form-group" style="width: 50%;">
                    <label for="initial_credits">Initial Credits</label>
                    <input type="number" id="initial_credits" name="initial_credits" value="<?php echo htmlspecialchars($product['initial_credits'] ?? 50); ?>" min="0" required>
                    <small>Credits awarded when a license for this product is created.</small>
                </div>
                <div class="form-group" style="width: 50%;">
                    <label for="activation_limit">Activation Limit</label>
                    <input type="number" id="activation_limit" name="activation_limit" value="<?php echo htmlspecialchars($product['activation_limit'] ?? 1); ?>" min="0" required>
                    <small>Number of times a license can be activated (0 for unlimited).</small>
                </div>
            </div>

            <div class="form-group">
                <label>Status</label>
                <label class="toggle-switch">
                    <input type="checkbox" name="status" value="1" <?php echo ($product['status'] ?? 1) ? 'checked' : ''; ?>>
                    <span class="slider"></span>
                </label>
                <small>Inactive products cannot be used to generate new licenses.</small>
            </div>
            
            <div class="form-actions" style="margin-top: 20px;">
                <button type="submit" class="btn btn-primary">Save Product</button>
            </div>
        </form>
    </div>
</div>
<?php include 'templates/footer.php'; ?>

================================================================================
--- ফাইল পাথ (File Path): register.php [Text Content] ---
================================================================================

<?php
require 'db_connect.php';
session_start();

if (isset($_SESSION['user_id'])) {
    header("Location: index.php");
    exit();
}

$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = trim($_POST['username']);
    $email = trim($_POST['email']);
    $password = $_POST['password'];
    $password_confirm = $_POST['password_confirm'];

    if ($password !== $password_confirm) {
        $errors[] = "Passwords do not match!";
    }

    $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?");
    $stmt->execute([$email]);
    if ($stmt->fetch()) {
        $errors[] = "Email address is already in use.";
    }

    if (empty($errors)) {
        $hashed_password = password_hash($password, PASSWORD_DEFAULT);
        
        // Users টেবিলে নতুন ব্যবহারকারী যুক্ত করা হচ্ছে
        $sql = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)";
        $stmt = $pdo->prepare($sql);
        
        if ($stmt->execute([$username, $email, $hashed_password])) {
            
            // ★★★ পরিবর্তন এখানে শুরু ★★★

            // এইমাত্র যে ব্যবহারকারী তৈরি হলো, তার আইডি (user_id) বের করা হচ্ছে
            $user_id = $pdo->lastInsertId();

            // একটি নতুন, ইউনিক API Key তৈরি করা হচ্ছে
            $new_api_key = bin2hex(random_bytes(32));

            // settings টেবিলে এই user_id এবং new_api_key টি সেভ করা হচ্ছে
            $sql_settings = "INSERT INTO settings (user_id, api_key) VALUES (?, ?)";
            $stmt_settings = $pdo->prepare($sql_settings);
            $stmt_settings->execute([$user_id, $new_api_key]);

            // ★★★ পরিবর্তন এখানে শেষ ★★★


            // সফলভাবে রেজিস্ট্রেশন হওয়ার পর লগইন পেজে পাঠানো হচ্ছে
            header("Location: login.php?registration=success");
            exit();

        } else {
            $errors[] = "Registration failed. Please try again.";
        }
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Create an Account</title>
    <link rel="stylesheet" href="css/style.css?v=<?php echo filemtime('css/style.css'); ?>">
</head>
<body class="auth-body">
    <div class="auth-container">
        <h2 class="auth-title">Create an Account</h2>
        <?php if (!empty($errors)): ?>
            <div class="auth-errors">
                <?php foreach ($errors as $error): ?>
                    <p><?php echo $error; ?></p>
                <?php endforeach; ?>
            </div>
        <?php endif; ?>
        <form action="register.php" method="POST">
            <div class="form-group">
                <label for="username">Username</label>
                <input type="text" id="username" name="username" required>
            </div>
            <div class="form-group">
                <label for="email">Email</label>
                <input type="email" id="email" name="email" required>
            </div>
            <div class="form-group">
                <label for="password">Password</label>
                <input type="password" id="password" name="password" required>
            </div>
            <div class="form-group">
                <label for="password_confirm">Confirm Password</label>
                <input type="password" id="password_confirm" name="password_confirm" required>
            </div>
            <button type="submit" class="btn btn-primary auth-btn">Register</button>
        </form>
        <p class="auth-switch">Already have an account? <a href="login.php">Login here</a></p>
    </div>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): reports.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$user_id = $_SESSION['user_id'];

// --- ধাপ ১: ব্যবহারকারীর টাইমজোন খুঁজে বের করা ---
$stmt_settings = $pdo->prepare("SELECT timezone FROM brand_settings WHERE user_id = ?");
$stmt_settings->execute([$user_id]);
$settings = $stmt_settings->fetch(PDO::FETCH_ASSOC);
// ব্যবহারকারীর সেট করা টাইমজোন নেওয়া হচ্ছে, সেট করা না থাকলে ডিফল্ট হিসেবে 'Asia/Dhaka' ব্যবহার করা হবে
$user_timezone = $settings['timezone'] ?? 'Asia/Dhaka';

// --- ধাপ ২: ব্যবহারকারীর টাইমজোন অনুযায়ী তারিখ গণনা করা ---
// PHP স্ক্রিপ্টের জন্য ব্যবহারকারীর টাইমজোন সেট করা হচ্ছে
date_default_timezone_set($user_timezone);

define('BDT_TO_USD_RATE', 0.0085);

// ফাংশন দুটি এখন UTC সময় অনুযায়ী ডেটা খুঁজবে
function get_completed_payment_data($pdo, $user_id, $start_date_utc, $end_date_utc) {
    $sql = "SELECT COALESCE(SUM(amount), 0) as total_amount, COUNT(id) as payment_count 
            FROM transactions 
            WHERE user_id = ? AND status = 'completed' AND created_at BETWEEN ? AND ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$user_id, $start_date_utc, $end_date_utc]);
    return $stmt->fetch(PDO::FETCH_ASSOC);
}

function get_total_initiated_payments($pdo, $user_id, $start_date_utc, $end_date_utc) {
    $sql = "SELECT COUNT(id) as total_count FROM transactions WHERE user_id = ? AND created_at BETWEEN ? AND ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$user_id, $start_date_utc, $end_date_utc]);
    return $stmt->fetchColumn() ?? 0;
}

// --- ধাপ ৩: লোকাল সময়কে UTC-তে রূপান্তর করে ডেটা আনা ---
$user_tz_obj = new DateTimeZone($user_timezone);
$utc_tz_obj = new DateTimeZone('UTC');

function get_utc_range($start_str, $end_str, $user_tz_obj, $utc_tz_obj) {
    $start = new DateTime($start_str, $user_tz_obj);
    $end = new DateTime($end_str, $user_tz_obj);
    return [
        $start->setTimezone($utc_tz_obj)->format('Y-m-d H:i:s'),
        $end->setTimezone($utc_tz_obj)->format('Y-m-d H:i:s')
    ];
}

// প্রতিটি সময়কালের জন্য UTC রেঞ্জ তৈরি করা হচ্ছে
list($today_start, $today_end) = get_utc_range('today 00:00:00', 'today 23:59:59', $user_tz_obj, $utc_tz_obj);
list($yesterday_start, $yesterday_end) = get_utc_range('yesterday 00:00:00', 'yesterday 23:59:59', $user_tz_obj, $utc_tz_obj);
list($this_week_start, $this_week_end) = get_utc_range('monday this week 00:00:00', 'sunday this week 23:59:59', $user_tz_obj, $utc_tz_obj);
list($last_week_start, $last_week_end) = get_utc_range('monday last week 00:00:00', 'sunday last week 23:59:59', $user_tz_obj, $utc_tz_obj);
list($this_month_start, $this_month_end) = get_utc_range('first day of this month 00:00:00', 'last day of this month 23:59:59', $user_tz_obj, $utc_tz_obj);
list($last_month_start, $last_month_end) = get_utc_range('first day of last month 00:00:00', 'last day of last month 23:59:59', $user_tz_obj, $utc_tz_obj);
list($this_year_start, $this_year_end) = get_utc_range('first day of January this year 00:00:00', 'last day of December this year 23:59:59', $user_tz_obj, $utc_tz_obj);
list($last_year_start, $last_year_end) = get_utc_range('first day of January last year 00:00:00', 'last day of December last year 23:59:59', $user_tz_obj, $utc_tz_obj);

// UTC সময় ব্যবহার করে ডেটা আনা
$today_completed = get_completed_payment_data($pdo, $user_id, $today_start, $today_end);
$today_initiated = get_total_initiated_payments($pdo, $user_id, $today_start, $today_end);
$yesterday_completed = get_completed_payment_data($pdo, $user_id, $yesterday_start, $yesterday_end);
$yesterday_initiated = get_total_initiated_payments($pdo, $user_id, $yesterday_start, $yesterday_end);
$this_week_completed = get_completed_payment_data($pdo, $user_id, $this_week_start, $this_week_end);
$this_week_initiated = get_total_initiated_payments($pdo, $user_id, $this_week_start, $this_week_end);
$last_week_completed = get_completed_payment_data($pdo, $user_id, $last_week_start, $last_week_end);
$last_week_initiated = get_total_initiated_payments($pdo, $user_id, $last_week_start, $last_week_end);
$this_month_completed = get_completed_payment_data($pdo, $user_id, $this_month_start, $this_month_end);
$this_month_initiated = get_total_initiated_payments($pdo, $user_id, $this_month_start, $this_month_end);
$last_month_completed = get_completed_payment_data($pdo, $user_id, $last_month_start, $last_month_end);
$last_month_initiated = get_total_initiated_payments($pdo, $user_id, $last_month_start, $last_month_end);
$this_year_completed = get_completed_payment_data($pdo, $user_id, $this_year_start, $this_year_end);
$this_year_initiated = get_total_initiated_payments($pdo, $user_id, $this_year_start, $this_year_end);
$last_year_completed = get_completed_payment_data($pdo, $user_id, $last_year_start, $last_year_end);
$last_year_initiated = get_total_initiated_payments($pdo, $user_id, $last_year_start, $last_year_end);


function render_report_card($title, $completed_data, $initiated_count) {
    $amount_in_usd = $completed_data['total_amount'] * BDT_TO_USD_RATE;
    $completed_count = $completed_data['payment_count'];
    $success_rate = ($initiated_count > 0) ? ($completed_count / $initiated_count) * 100 : 0;
    $success_rate_text = number_format($success_rate, 1) . '% success';

    echo '<div class="report-card">
          <div class="card-header"><span class="card-title">' . htmlspecialchars($title) . '</span><i class="far fa-calendar-alt"></i></div>
          <div class="card-body">
              <h2 class="amount">$'. number_format($amount_in_usd, 2) .'</h2>
              <p class="stats">' . $completed_count . ' payments completed &bull; <span class="success-rate">' . $success_rate_text . '</span></p>
          </div>
        </div>';
}

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<div class="page-container">
    <div class="page-header">
        <h1 class="page-title">Reports</h1>
        <div class="report-filters">
            <button class="btn btn-secondary"><i class="far fa-calendar-alt"></i> Daily</button>
            <button class="btn btn-secondary"><i class="far fa-calendar-alt"></i> Weekly</button>
            <button class="btn btn-secondary"><i class="far fa-calendar-alt"></i> Monthly</button>
            <button class="btn btn-secondary"><i class="fas fa-chart-line"></i> Yearly</button>
            <button class="btn btn-primary"><i class="fas fa-sliders-h"></i> Custom Range</button>
        </div>
    </div>
    <div class="financial-report-bar">
        <span>Financial Report: <?php echo date('M j, Y', strtotime('first day of this month')) . ' - ' . date('M j, Y', strtotime('last day of this month')); ?></span>
        <button class="btn btn-secondary">Monthly View</button>
    </div>
    <div class="report-grid">
        <?php render_report_card('Today', $today_completed, $today_initiated); ?>
        <?php render_report_card('Yesterday', $yesterday_completed, $yesterday_initiated); ?>
        <?php render_report_card('This Week', $this_week_completed, $this_week_initiated); ?>
        <?php render_report_card('Last Week', $last_week_completed, $last_week_initiated); ?>
        <?php render_report_card('This Month', $this_month_completed, $this_month_initiated); ?>
        <?php render_report_card('Last Month', $last_month_completed, $last_month_initiated); ?>
        <?php render_report_card('This Year', $this_year_completed, $this_year_initiated); ?>
        <?php render_report_card('Last Year', $last_year_completed, $last_year_initiated); ?>
    </div>
</div>

</div>
<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): restore_sms_data.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

$sms_id = $_GET['id'] ?? null;
$user_id = $_SESSION['user_id'];

if ($sms_id) {
    // ★★★ is_trashed = 0 করে ডেটা পুনরুদ্ধার করা হচ্ছে ★★★
    $sql = "UPDATE sms_transactions SET is_trashed = 0 WHERE id = :id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    
    try {
        $stmt->execute([':id' => $sms_id, ':user_id' => $user_id]);
    } catch (PDOException $e) {
        die("Error restoring record: " . $e->getMessage());
    }
}

header("Location: sms_data.php?filter=trashed");
exit();

================================================================================
--- ফাইল পাথ (File Path): SessionManager.php [Text Content] ---
================================================================================

<?php
class SessionManager implements SessionHandlerInterface {
    private $pdo;

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }

    public function open($savePath, $sessionName): bool {
        return true;
    }

    public function close(): bool {
        return true;
    }

    public function read($id): string {
        $stmt = $this->pdo->prepare("SELECT payload FROM sessions WHERE id = ?");
        $stmt->execute([$id]);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        return $result ? $result['payload'] : '';
    }

    public function write($id, $payload): bool {
        // ★★★ চূড়ান্ত এবং নির্ভরযোগ্য সমাধান এখানে ★★★
        // এই ফাংশনটি যখন কল হয়, তখন $_SESSION ভ্যারিয়েবলটি নির্ভরযোগ্য থাকে না।
        // তাই, আমরা সরাসরি $payload স্ট্রিং থেকে user_id খুঁজে বের করছি।
        
        $user_id = null;
        // preg_match ব্যবহার করে সেশন ডেটা থেকে 'user_id|i:123;' এই প্যাটার্নটি খোঁজা হচ্ছে।
        // এটি PHP-এর সেশন ফরম্যাটের উপর ভিত্তি করে তৈরি এবং সবচেয়ে নির্ভরযোগ্য উপায়।
        if (preg_match('/user_id\|i:(\d+);/', $payload, $matches)) {
            // যদি প্যাটার্নটি পাওয়া যায়, তবে user_id ভ্যারিয়েবলে সংখ্যাটি রাখা হচ্ছে।
            $user_id = (int)$matches[1];
        }

        // এখন REPLACE কোয়েরিটি সঠিক user_id সহ চালানো হচ্ছে।
        $sql = "REPLACE INTO sessions (id, user_id, ip_address, user_agent, payload, last_activity) VALUES (?, ?, ?, ?, ?, ?)";
        $stmt = $this->pdo->prepare($sql);
        
        $ip_address = $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN';
        $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? 'UNKNOWN';
        
        return $stmt->execute([$id, $user_id, $ip_address, $user_agent, $payload, time()]);
    }

    public function destroy($id): bool {
        $stmt = $this->pdo->prepare("DELETE FROM sessions WHERE id = ?");
        return $stmt->execute([$id]);
    }

    public function gc($maxlifetime): int {
        $old = time() - $maxlifetime;
        $stmt = $this->pdo->prepare("DELETE FROM sessions WHERE last_activity < ? AND user_id IS NOT NULL");
        $stmt->execute([$old]);
        return $stmt->rowCount();
    }
}

================================================================================
--- ফাইল পাথ (File Path): sms_data.php [Text Content] ---
================================================================================

<?php
// ব্যবহারকারী লগইন করা আছে কিনা তা পরীক্ষা করা
require 'auth_check.php';
// ডেটাবেস সংযোগ ফাইল যুক্ত করা
require 'db_connect.php'; 

// হেডার ও সাইডবার টেমপ্লেট যুক্ত করা
include 'templates/header.php';
include 'templates/sidebar.php';

$user_id = $_SESSION['user_id'];

// === ফিল্টার এবং সার্চ লজিক শুরু ===
$filter = $_GET['filter'] ?? 'all'; // URL থেকে ফিল্টার প্যারামিটার নেওয়া
$search = trim($_GET['search'] ?? ''); // URL থেকে সার্চ টার্ম নেওয়া

// is_trashed কলাম ব্যবহার করে ফিল্টার লজিক আপডেট করা হয়েছে
$sql = "SELECT id, sender_number, amount, transaction_id, status, received_at FROM sms_transactions";
$conditions = ["user_id = ?"];
$params = [$user_id];

// ট্র্যাশ ফিল্টার
if ($filter === 'trashed') {
    $conditions[] = "is_trashed = 1";
} else {
    // অন্যান্য সব ট্যাবের জন্য শুধুমাত্র is_trashed = 0 দেখানো হবে
    $conditions[] = "is_trashed = 0";
    // স্ট্যাটাস অনুযায়ী ফিল্টার
    if ($filter === 'received' || $filter === 'verified') {
        $conditions[] = "status = ?";
        $params[] = ucfirst($filter);
    }
}

// সার্চ টার্ম অনুযায়ী ফিল্টার প্রয়োগ করা
if (!empty($search)) {
    $conditions[] = "(sender_number LIKE ? OR transaction_id LIKE ?)";
    $params[] = "%{$search}%";
    $params[] = "%{$search}%";
}

// চূড়ান্ত কোয়েরি তৈরি করা
$sql .= " WHERE " . implode(' AND ', $conditions);
$sql .= " ORDER BY received_at DESC";

// কোয়েরি 실행 করা
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$sms_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
// === ফিল্টার এবং সার্চ লজিক শেষ ===
?>

<!-- SMS Data পেজের মূল কন্টেন্ট -->
<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">MFS > SMS Data</p>
            <h1 class="page-title">SMS Data</h1>
        </div>
        <div class="page-header-actions">
             <a href="#" id="connectAppBtn" class="btn btn-primary"><i class="fas fa-wifi"></i> Connect Android App</a>
             <a href="edit_sms_data.php" class="btn btn-primary"><i class="fas fa-plus"></i> New SMS Data</a>
        </div>
    </div>

    <div class="filter-tabs-container">
        <div class="filter-tabs">
            <a href="?filter=all&search=<?php echo urlencode($search); ?>" class="filter-tab <?php echo ($filter === 'all') ? 'active' : ''; ?>"><i class="fas fa-inbox"></i> All</a>
            <a href="?filter=received&search=<?php echo urlencode($search); ?>" class="filter-tab <?php echo ($filter === 'received') ? 'active' : ''; ?>"><i class="fas fa-clock"></i> Received</a>
            <a href="?filter=verified&search=<?php echo urlencode($search); ?>" class="filter-tab <?php echo ($filter === 'verified') ? 'active' : ''; ?>"><i class="fas fa-check-circle"></i> Verified</a>
            <a href="?filter=trashed&search=<?php echo urlencode($search); ?>" class="filter-tab <?php echo ($filter === 'trashed') ? 'active' : ''; ?>"><i class="fas fa-trash-alt"></i> Trashed</a>
        </div>
    </div>

    <div class="content-card">
        <div class="card-toolbar">
            <div class="toolbar-left"></div>
            <div class="toolbar-right">
                <form action="sms_data.php" method="GET" class="search-box">
                    <input type="hidden" name="filter" value="<?php echo htmlspecialchars($filter); ?>">
                    <i class="fas fa-search"></i>
                    <input type="text" name="search" placeholder="Search..." value="<?php echo htmlspecialchars($search); ?>">
                </form>
            </div>
        </div>

        <table class="data-table">
            <thead>
                <tr>
                    <th>Sender Number</th>
                    <th>Amount</th>
                    <th>Transaction ID</th>
                    <th>Received At</th>
                    <th>Status</th>
                    <th style="text-align: right;">Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php if (count($sms_data) > 0): ?>
                    <?php foreach ($sms_data as $sms): ?>
                        <tr>
                            <td><?php echo htmlspecialchars($sms['sender_number']); ?></td>
                            <td><?php echo htmlspecialchars($sms['amount'] ? number_format($sms['amount'], 2) . ' BDT' : 'N/A'); ?></td>
                            <td><?php echo htmlspecialchars($sms['transaction_id'] ?: 'N/A'); ?></td>
                            <td><?php echo date("d M, Y, g:i A", strtotime($sms['received_at'])); ?></td>
                            <td>
                                <span class="status-badge status-<?php echo ($sms['status'] === 'Verified') ? 'connected' : 'disconnected'; ?>">
                                    <?php echo htmlspecialchars($sms['status']); ?>
                                </span>
                            </td>
                            <td class="actions" style="text-align: right;">
                                <?php if ($filter === 'trashed'): ?>
                                    <a href="edit_sms_data.php?id=<?php echo $sms['id']; ?>" class="action-edit"><i class="fas fa-pencil-alt"></i> Edit</a>
                                    <a href="restore_sms_data.php?id=<?php echo $sms['id']; ?>" class="action-edit" style="color: #28a745;" onclick="return confirm('Are you sure you want to restore this?');"><i class="fas fa-undo"></i> Restore</a>
                                    <a href="force_delete_sms_data.php?id=<?php echo $sms['id']; ?>" class="action-delete" onclick="return confirm('This action is permanent and cannot be undone. Are you sure?');"><i class="fas fa-trash-alt"></i> Force Delete</a>
                                <?php else: ?>
                                    <a href="edit_sms_data.php?id=<?php echo $sms['id']; ?>" class="action-edit"><i class="fas fa-pencil-alt"></i> Edit</a>
                                    <a href="delete_sms_data.php?id=<?php echo $sms['id']; ?>" class="action-delete" onclick="return confirm('Are you sure you want to move this to trash?');"><i class="fas fa-trash-alt"></i> Delete</a>
                                <?php endif; ?>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                <?php else: ?>
                    <tr>
                        <td colspan="6" style="text-align:center; padding: 20px;">No matching SMS data found.</td>
                    </tr>
                <?php endif; ?>
            </tbody>
        </table>
        
        <div class="card-footer">
            <div class="pagination-controls">
                <span>Per page</span>
                <select>
                    <option value="10" selected>10</option>
                    <option value="20">20</option>
                    <option value="50">50</option>
                </select>
            </div>
        </div>
    </div>
</div>

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<!-- Connect App সাইড প্যানেলের HTML কোড -->
<div id="connectAppPanel" class="side-panel-overlay">
    <div class="side-panel">
        <div class="side-panel-header">
            <h3>Connect Android App</h3>
            <button id="closePanelBtn" class="close-panel-btn">&times;</button>
        </div>
        <div class="side-panel-body">
            <!-- বাম কলাম: অ্যাপ ডাউনলোড -->
            <div class="panel-card">
                <div class="panel-card-header">
                    <h4>Download Android App</h4>
                    <span>&#9650;</span>
                </div>
                <div class="panel-card-body">
                    <h2>Get the Payment Automation App</h2>
                    <p class="subtitle">Only for Bangladeshi Users</p>
                    <p>Download our Android app to automate your personal payments effortlessly.</p>
                    <ul class="features-list">
                        <li><i class="fas fa-check-circle"></i> Automatically verify your transactions.</li>
                        <li><i class="fas fa-check-circle"></i> Grant necessary permissions for seamless operation.</li>
                    </ul>
                    <a href="#" class="btn btn-primary download-btn"><i class="fas fa-download"></i> Download Android App</a>
                </div>
            </div>
            <!-- ডান কলাম: QR কোড -->
            <div class="panel-card">
                 <div class="panel-card-header"><h4>Connect Android App</h4><span>&#9650;</span></div>
                <div class="panel-card-body qr-section">
                    <h4>Link Your Device</h4>
                    <p>Open the app and scan this QR code to connect.</p>
                    <div class="qr-code-container">
                        <img src="generate_qr.php" alt="Scan to connect">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<script src="js/main.js?v=<?php echo filemtime('js/main.js'); ?>"></script>
<!-- সাইড প্যানেল নিয়ন্ত্রণের জন্য JavaScript -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    const connectBtn = document.getElementById('connectAppBtn');
    const closeBtn = document.getElementById('closePanelBtn');
    const panelOverlay = document.getElementById('connectAppPanel');

    if (connectBtn) {
        connectBtn.addEventListener('click', function(e) {
            e.preventDefault();
            panelOverlay.classList.add('open');
        });
    }

    if (closeBtn) {
        closeBtn.addEventListener('click', function() {
            panelOverlay.classList.remove('open');
        });
    }

    if (panelOverlay) {
        panelOverlay.addEventListener('click', function(e) {
            if (e.target === panelOverlay) {
                panelOverlay.classList.remove('open');
            }
        });
    }
});
</script>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): updates.php [Text Content] ---
================================================================================

<?php
// ব্যবহারকারী লগইন করা আছে কিনা তা পরীক্ষা করা
require 'auth_check.php';
// ডাটাবেস সংযোগ ফাইল যুক্ত করা
require 'db_connect.php';

// --- AJAX অনুরোধ হ্যান্ডেল করার জন্য PHP কোড ---
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json');
    $response = ['success' => false, 'message' => 'An unknown error occurred.'];
    
    $version = trim($_POST['version']);
    $update_type = $_POST['update_type'] ?? 'automatic';
    $sql_migration = trim($_POST['sql_migration']);
    $zip_file = $_FILES['zip_file'];

    if (!empty($version) && isset($zip_file) && $zip_file['error'] === UPLOAD_ERR_OK) {
        $upload_dir = 'updates/';
        if (!is_dir($upload_dir)) {
            if (!mkdir($upload_dir, 0777, true)) {
                $response['message'] = 'Failed to create updates directory. Please check permissions.';
                echo json_encode($response);
                exit();
            }
        }

        $file_name = "update-v{$version}.zip";
        $destination = $upload_dir . $file_name;

        if (move_uploaded_file($zip_file['tmp_name'], $destination)) {
            try {
                $files_manifest = [];
                $dirs_manifest = [];
                $zip = new ZipArchive;
                if ($zip->open($destination) === TRUE) {
                    for ($i = 0; $i < $zip->numFiles; $i++) {
                        $path = $zip->getNameIndex($i);
                        if (substr($path, -1) === '/') {
                            $dirs_manifest[] = $path;
                        } else {
                            $files_manifest[$path] = md5($zip->getFromIndex($i));
                        }
                    }
                    $zip->close();
                    
                    $manifest_content = ['files' => $files_manifest, 'dirs' => $dirs_manifest];
                    $manifest_path = $upload_dir . "update-v{$version}_manifest.json";
                    file_put_contents($manifest_path, json_encode($manifest_content, JSON_PRETTY_PRINT));
                } else {
                    throw new Exception("Could not open the uploaded ZIP file to generate manifest.");
                }

                $stmt = $pdo->prepare("INSERT INTO updates (version, zip_path, sql_migration, update_type) VALUES (?, ?, ?, ?)");
                $stmt->execute([$version, $destination, $sql_migration ?: null, $update_type]);
                
                $response = ['success' => true, 'message' => "Version {$version} has been uploaded successfully!"];

            } catch (Exception $e) {
                $response['message'] = "Error during processing: " . $e->getMessage();
                if (file_exists($destination)) @unlink($destination);
                if (isset($manifest_path) && file_exists($manifest_path)) @unlink($manifest_path);
            }
        } else {
            $response['message'] = 'Failed to move the uploaded file to the destination.';
        }
    } else {
        $response['message'] = 'Version number and a valid ZIP file are required.';
    }
    
    echo json_encode($response);
    exit();
}

$updates = $pdo->query("SELECT * FROM updates ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC);

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<!-- এই পেজের জন্য নতুন এবং আধুনিক CSS -->
<style>
    .message-area { margin-bottom: 20px; padding: 15px; border-radius: 8px; display: none; }
    .message-area.success { background-color: #d1e7dd; color: #0f5132; border: 1px solid #badbcc; }
    .message-area.error { background-color: #f8d7da; color: #842029; border: 1px solid #f5c2c7; }
    .updates-grid { display: grid; grid-template-columns: 420px 1fr; gap: 25px; align-items: flex-start; }
    .upload-card, .history-card { background-color: #ffffff; border-radius: 12px; box-shadow: 0 4px 24px 0 rgba(34, 41, 47, 0.1); }
    .card-header { padding: 20px 25px; border-bottom: 1px solid #f0f0f0; }
    .card-header h3 { margin: 0; font-size: 1.3rem; display: flex; align-items: center; gap: 10px; }
    .card-body { padding: 25px; }
    .drag-drop-area { border: 2px dashed #d1d1d1; border-radius: 10px; padding: 40px 20px; text-align: center; cursor: pointer; transition: all 0.2s ease-in-out; background-color: #f9f9f9; margin-bottom: 15px; }
    .drag-drop-area.drag-over { border-color: #0d6efd; background-color: #f0f5ff; transform: scale(1.02); }
    .drag-drop-area .icon { font-size: 2.5rem; color: #0d6efd; }
    .drag-drop-area p { margin: 10px 0 0; font-weight: 500; color: #555; }
    #file-info { margin-top: 15px; font-weight: 500; color: #28a745; text-align: center; }
    #zip_file { display: none; }
    .progress-bar-container { display: none; width: 100%; background-color: #e9ecef; border-radius: 8px; margin-top: 20px; overflow: hidden; height: 12px; }
    .progress-bar { width: 0%; height: 100%; background-color: #0d6efd; border-radius: 8px; transition: width 0.3s ease; }
    .update-type-options { display: flex; gap: 25px; align-items: center; margin-top: 10px; }
    .history-list { list-style: none; padding: 0; margin: 0; }
    .history-item { display: flex; align-items: center; padding: 18px 0; border-bottom: 1px solid #f0f0f0; gap: 20px; }
    .history-item:last-child { border-bottom: none; }
    .history-item .version-icon { font-size: 1.5rem; color: #0d6efd; }
    .history-item .version-info { flex-grow: 1; }
    .history-item .version-number { font-size: 1.2rem; font-weight: 600; display: flex; align-items: center; gap: 10px; }
    .latest-badge { background-color: #28c76f; color: white; padding: 3px 10px; border-radius: 12px; font-size: 12px; }
    .history-item .details { display: flex; flex-wrap: wrap; gap: 20px; margin-top: 6px; font-size: 14px; color: #6c757d; }
    .history-item .details span { display: flex; align-items: center; gap: 6px; }
    @media (max-width: 992px) { .updates-grid { grid-template-columns: 1fr; } }
</style>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Updates > Manage</p>
            <h1 class="page-title">Application Updates</h1>
        </div>
    </div>
    <div id="message-area" class="message-area"></div>

    <div class="updates-grid">
        <!-- বাম কলাম: নতুন আপডেট আপলোড -->
        <aside class="upload-card">
            <div class="card-header"><h3><i class="fas fa-upload"></i> Upload New Version</h3></div>
            <div class="card-body">
                <form id="uploadForm" action="updates.php" method="POST" enctype="multipart/form-data">
                    <div class="form-group">
                        <label for="zip_file">Update Package (.zip)</label>
                        <div id="drag-drop-area" class="drag-drop-area">
                            <i class="fas fa-cloud-upload-alt icon"></i>
                            <p>Drag & drop your .zip file here, or click to browse.</p>
                        </div>
                        <input type="file" id="zip_file" name="zip_file" accept=".zip" required>
                        <div id="file-info"></div>
                    </div>
                    <div class="form-grid" style="grid-template-columns: 1fr 1fr; gap: 15px;">
                        <div class="form-group">
                            <label for="version">Version Number</label>
                            <input type="text" id="version" name="version" required placeholder="e.g., 1.0.1">
                        </div>
                        <div class="form-group">
                            <label>Update Type</label>
                            <div class="update-type-options">
                                <label><input type="radio" name="update_type" value="automatic" checked> Auto</label>
                                <label><input type="radio" name="update_type" value="manual"> Manual</label>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="sql_migration">Database Migration SQL (Optional)</label>
                        <textarea id="sql_migration" name="sql_migration" rows="4" style="width: 100%; font-family: monospace;"></textarea>
                    </div>
                    <button type="submit" class="btn btn-primary" id="uploadBtn" style="width: 100%; justify-content: center; padding: 12px;"><i class="fas fa-cloud-upload-alt"></i> Upload & Process</button>
                    <div class="progress-bar-container" id="progress-container"><div class="progress-bar" id="progress-bar"></div></div>
                </form>
            </div>
        </aside>

        <!-- ডান কলাম: আপডেটের ইতিহাস -->
        <main class="history-card">
            <div class="card-header"><h3><i class="fas fa-history"></i> Update History</h3></div>
            <div class="card-body">
                <?php if (empty($updates)): ?>
                    <p style="text-align:center; padding: 40px 0; color: #888;">No updates have been uploaded yet.</p>
                <?php else: ?>
                    <ul class="history-list">
                        <?php foreach($updates as $index => $update): ?>
                        <?php
                            $stmt_count = $pdo->prepare("SELECT COUNT(DISTINCT user_id) as count FROM update_assignments WHERE update_id = ?");
                            $stmt_count->execute([$update['id']]);
                            $deployment_count = $stmt_count->fetchColumn();
                        ?>
                        <li class="history-item">
                            <i class="fas fa-box-open version-icon"></i>
                            <div class="version-info">
                                <div class="version-number">
                                    <?php echo htmlspecialchars($update['version']); ?>
                                    <?php if ($index === 0): ?><span class="latest-badge">Latest</span><?php endif; ?>
                                </div>
                                <div class="details">
                                    <span><i class="fas fa-calendar-alt"></i> <?php echo date("d M, Y", strtotime($update['created_at'])); ?></span>
                                    <span><i class="fas fa-cogs"></i> <?php echo htmlspecialchars(ucfirst($update['update_type'])); ?></span>
                                    <span>
                                        <?php if ($update['deployment_method'] === 'product'): ?>
                                            <i class="fas fa-tag"></i> Product & Date
                                        <?php else: ?>
                                            <i class="fas fa-users"></i> <?php echo $deployment_count; ?> Users
                                        <?php endif; ?>
                                    </span>
                                </div>
                            </div>
                            <a href="deploy_update.php?id=<?php echo $update['id']; ?>" class="btn btn-primary"><i class="fas fa-rocket"></i> Deploy</a>
                        </li>
                        <?php endforeach; ?>
                    </ul>
                <?php endif; ?>
            </div>
        </main>
    </div>
</div>

<!-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ -->
<!-- ★★★      জাভাস্ক্রিপ্ট কোডটি সম্পূর্ণ নতুন এবং নির্ভরযোগ্যভাবে আপডেট করা হয়েছে      ★★★ -->
<!-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    const dragDropArea = document.getElementById('drag-drop-area');
    const fileInput = document.getElementById('zip_file');
    const fileInfo = document.getElementById('file-info');
    const uploadForm = document.getElementById('uploadForm');

    dragDropArea.addEventListener('click', () => fileInput.click());
    dragDropArea.addEventListener('dragover', (e) => { e.preventDefault(); dragDropArea.classList.add('drag-over'); });
    dragDropArea.addEventListener('dragleave', () => dragDropArea.classList.remove('drag-over'));
    dragDropArea.addEventListener('drop', (e) => {
        e.preventDefault();
        dragDropArea.classList.remove('drag-over');
        if (e.dataTransfer.files.length > 0 && e.dataTransfer.files[0].type === 'application/zip') {
            fileInput.files = e.dataTransfer.files;
            handleFileSelect();
        } else {
            alert('Please drop a .zip file.');
        }
    });
    fileInput.addEventListener('change', handleFileSelect);

    function handleFileSelect() {
        fileInfo.textContent = fileInput.files.length > 0 ? `Selected File: ${fileInput.files[0].name}` : '';
    }

    function showMessage(message, isSuccess) {
        const messageArea = document.getElementById('message-area');
        if (!messageArea) {
            alert(message); // ফলব্যাক হিসেবে অ্যালার্ট
            return;
        }
        messageArea.textContent = message;
        messageArea.className = 'message-area ' + (isSuccess ? 'success' : 'error');
        messageArea.style.display = 'block';
        window.scrollTo(0, 0);
    }

    uploadForm.addEventListener('submit', function(event) {
        event.preventDefault();
        const formData = new FormData(uploadForm);
        const uploadBtn = document.getElementById('uploadBtn');
        const progressBar = document.getElementById('progress-bar');
        const progressContainer = document.getElementById('progress-container');

        progressContainer.style.display = 'block';
        progressBar.style.width = '0%';
        uploadBtn.disabled = true;
        uploadBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Uploading...';

        const xhr = new XMLHttpRequest();

        xhr.upload.addEventListener('progress', e => {
            if (e.lengthComputable) {
                const percent = Math.round((e.loaded / e.total) * 100);
                progressBar.style.width = percent + '%';
            }
        });

        // 'load' ইভেন্টটি অনুরোধ সম্পন্ন হলে (সফল বা ব্যর্থ) ট্রিগার হয়
        xhr.addEventListener('load', () => {
            uploadBtn.disabled = false;
            uploadBtn.innerHTML = '<i class="fas fa-cloud-upload-alt"></i> Upload & Process';
            progressContainer.style.display = 'none';

            if (xhr.status === 200) {
                try {
                    const res = JSON.parse(xhr.responseText);
                    showMessage(res.message, res.success);
                    
                    if (res.success) {
                        setTimeout(() => window.location.reload(), 2000);
                    }
                } catch (e) {
                    showMessage('Error: Invalid response from server. It might be a PHP error.', false);
                    console.error("Response that failed to parse:", xhr.responseText);
                }
            } else {
                showMessage(`Error: Server responded with status ${xhr.status}.`, false);
                console.error("Server Error Response:", xhr.responseText);
            }
        });

        // নেটওয়ার্ক এররের জন্য
        xhr.addEventListener('error', () => {
            uploadBtn.disabled = false;
            uploadBtn.innerHTML = '<i class="fas fa-cloud-upload-alt"></i> Upload & Process';
            progressContainer.style.display = 'none';
            showMessage('A network error occurred. Please check your connection.', false);
        });
        
        xhr.open('POST', 'updates.php', true);
        xhr.send(formData);
    });
});
</script>

<?php include 'templates/footer.php'; ?>

================================================================================
--- ফাইল পাথ (File Path): update_user_status.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $user_id = $_POST['user_id'] ?? null;
    $action = $_POST['action'] ?? null;
    $until_date = $_POST['until_date'] ?? null;

    if (!$user_id || !$action) {
        header("Location: customers.php?error=invalid_request");
        exit();
    }

    $sql = "";
    $params = [];

    // ★★★ মূল পরিবর্তন: এখন সব কোয়েরি license_status এর পরিবর্তে account_status কলামকে টার্গেট করবে ★★★
    switch ($action) {
        case 'suspend':
            $sql = "UPDATE users SET account_status = 'suspended', suspended_until = NULL WHERE id = ?";
            $params = [$user_id];
            break;
        case 'terminate':
            $sql = "UPDATE users SET account_status = 'terminated', suspended_until = NULL WHERE id = ?";
            $params = [$user_id];
            break;
        case 'reactivate':
            $sql = "UPDATE users SET account_status = 'active', suspended_until = NULL WHERE id = ?";
            $params = [$user_id];
            break;
        case 'temporary_ban':
            if (empty($until_date)) {
                header("Location: customers.php?error=date_required");
                exit();
            }
            $sql = "UPDATE users SET account_status = 'suspended', suspended_until = ? WHERE id = ?";
            $params = [$until_date, $user_id];
            break;
        default:
            header("Location: customers.php?error=unknown_action");
            exit();
    }

    try {
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        header("Location: customers.php?success=status_updated");
        exit();
    } catch (PDOException $e) {
        error_log("Error updating user status: " . $e->getMessage());
        header("Location: customers.php?error=database_error");
        exit();
    }
}

header("Location: customers.php");
exit();

================================================================================
--- ফাইল পাথ (File Path): verify_funding.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require 'auth_check.php';
require 'db_connect.php';

$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);
$trx_id = $data['trx_id'] ?? null;

if (!$trx_id) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Transaction ID is missing.']);
    exit();
}

$user_id = $_SESSION['user_id'];

try {
    $pdo->beginTransaction();

    // Step 1: Find the funding record to ensure it's pending and belongs to the user
    $stmt_fund = $pdo->prepare(
        "SELECT * FROM user_funds WHERE transaction_unique_id = ? AND user_id = ? AND status = 'pending'"
    );
    $stmt_fund->execute([$trx_id, $user_id]);
    $fund_details = $stmt_fund->fetch(PDO::FETCH_ASSOC);

    if (!$fund_details) {
        throw new Exception('Funding record not found or already processed.');
    }

    // Step 2: Verify the payment status in the main transactions table
    $stmt_trans = $pdo->prepare(
        "SELECT status FROM transactions WHERE unique_id = ? AND user_id = ?"
    );
    $stmt_trans->execute([$trx_id, $user_id]);
    $transaction = $stmt_trans->fetch(PDO::FETCH_ASSOC);

    if ($transaction && $transaction['status'] === 'completed') {
        // Step 3: Update the funding record status to 'completed'
        $stmt_update_fund = $pdo->prepare(
            "UPDATE user_funds SET status = 'completed' WHERE id = ?"
        );
        $stmt_update_fund->execute([$fund_details['id']]);

        // Step 4: Add the funds to the user's balance
        $stmt_update_balance = $pdo->prepare(
            "UPDATE users SET balance = balance + ? WHERE id = ?"
        );
        $stmt_update_balance->execute([$fund_details['amount_usd'], $user_id]);
        
        $pdo->commit();
        echo json_encode(['success' => true, 'message' => 'Funds added successfully!']);
    } else {
        throw new Exception('Payment verification failed or payment is not completed.');
    }

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}


================================================================================
--- ফাইল পাথ (File Path): view_customer.php [Text Content] ---
================================================================================

<?php
require 'auth_check.php';
require 'db_connect.php';

// URL থেকে গ্রাহকের আইডি গ্রহণ করা
$customer_id = $_GET['id'] ?? null;
if (!$customer_id) {
    die("Customer ID is missing.");
}

// ডেটাবেস থেকে গ্রাহকের প্রাথমিক তথ্য (নাম, ইমেইল) আনা
$stmt_user = $pdo->prepare("SELECT id, username, email FROM users WHERE id = ?");
$stmt_user->execute([$customer_id]);
$customer = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$customer) {
    die("Customer not found.");
}

include 'templates/header.php';
include 'templates/sidebar.php';
?>

<!-- এই পেজের জন্য বিশেষ CSS -->
<style>
    .profile-header {
        display: flex;
        align-items: center;
        gap: 20px;
        margin-bottom: 30px;
    }
    .profile-avatar {
        width: 80px;
        height: 80px;
        border-radius: 50%;
        object-fit: cover;
        border: 3px solid #7367f0;
    }
    .profile-info h2 {
        margin: 0;
        font-size: 1.8rem;
    }
    .profile-info p {
        margin: 5px 0 0;
        color: #888;
    }
    .stats-grid {
        display: grid;
        grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
        gap: 20px;
        margin-bottom: 30px; /* টেবিল থেকে স্পেস তৈরির জন্য */
    }
    .stat-card {
        background-color: #fff;
        border-radius: 12px;
        padding: 20px;
        box-shadow: 0 4px 24px 0 rgba(34, 41, 47, 0.1);
        display: flex;
        align-items: center;
        gap: 15px;
    }
    .stat-card .icon {
        font-size: 2rem;
        width: 50px;
        height: 50px;
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        color: #fff;
    }
    .stat-card .details .value {
        font-size: 1.5rem;
        font-weight: 600;
    }
    .stat-card .details .label {
        color: #888;
        font-size: 0.9rem;
    }
    /* আইকনের জন্য বিভিন্ন রঙ */
    .icon.bg-blue { background-color: #0d6efd; }
    .icon.bg-green { background-color: #28c76f; }
    .icon.bg-orange { background-color: #ff9f43; }
    .icon.bg-purple { background-color: #6f42c1; }
</style>

<div class="page-container">
    <div class="page-header">
        <div>
            <p class="breadcrumbs">Customers &gt; View</p>
            <h1 class="page-title">Customer Details</h1>
        </div>
        <a href="customers.php" class="btn btn-secondary">
            <i class="fas fa-arrow-left"></i> Back to Customers
        </a>
    </div>

    <div class="content-card">
        <div class="profile-header">
            <img src="https://i.pravatar.cc/150?u=<?php echo $customer['id']; ?>" alt="Avatar" class="profile-avatar">
            <div class="profile-info">
                <h2><?php echo htmlspecialchars($customer['username']); ?></h2>
                <p><?php echo htmlspecialchars($customer['email']); ?></p>
            </div>
        </div>

        <!-- পরিসংখ্যান কার্ডগুলো এখানে দেখানো হবে -->
        <div id="stats-container" class="stats-grid">
            <p>Loading statistics...</p>
        </div>
    </div>
    
    <!-- ক্রেডিট খরচের ইতিহাস দেখানোর জন্য নতুন টেবিল -->
    <div class="content-card" style="margin-top: 25px;">
        <div class="card-header" style="padding: 0 0 15px 0; margin-bottom: 15px; border-bottom: 1px solid #f1f1f1;">
             <h3>Credit Usage History</h3>
        </div>
        <table class="data-table">
            <thead>
                <tr>
                    <th>Date</th>
                    <th>Description</th>
                    <th>Gateway Trx ID</th>
                    <th>Credits Used</th>
                    <th>Cost (USD)</th>
                </tr>
            </thead>
            <tbody id="history-table-body">
                <tr>
                    <td colspan="5" style="text-align:center; padding: 20px;">Loading history...</td>
                </tr>
            </tbody>
        </table>
    </div>

</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    const customerId = <?php echo json_encode($customer_id); ?>;
    const statsContainer = document.getElementById('stats-container');
    const historyTableBody = document.getElementById('history-table-body');

    // AJAX ব্যবহার করে সার্ভার থেকে পরিসংখ্যান এবং ক্রেডিট হিস্টোরি আনা হচ্ছে
    fetch(`api/get_customer_details.php?id=${customerId}`)
        .then(response => {
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }
            return response.json();
        })
        .then(data => {
            if (data.success) {
                // --- পরিসংখ্যান কার্ডগুলো রেন্ডার করা ---
                statsContainer.innerHTML = `
                    <div class="stat-card">
                        <div class="icon bg-blue"><i class="fas fa-dollar-sign"></i></div>
                        <div class="details">
                            <div class="value">$${parseFloat(data.details.account_fund_usd).toFixed(2)}</div>
                            <div class="label">Account Fund</div>
                        </div>
                    </div>
                    <div class="stat-card">
                        <div class="icon bg-green"><i class="fas fa-check-circle"></i></div>
                        <div class="details">
                            <div class="value">${data.details.successful_payments}</div>
                            <div class="label">Successful Payments</div>
                        </div>
                    </div>
                    <div class="stat-card">
                        <div class="icon bg-orange"><i class="fas fa-coins"></i></div>
                        <div class="details">
                            <div class="value">${data.details.credits_used} / ${data.details.total_credits}</div>
                            <div class="label">Credits Used</div>
                        </div>
                    </div>
                    <div class="stat-card">
                        <div class="icon bg-purple"><i class="fas fa-chart-pie"></i></div>
                        <div class="details">
                            <div class="value">${data.details.remaining_credits}</div>
                            <div class="label">Remaining Credits</div>
                        </div>
                    </div>
                `;

                // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
                // ★★★      মূল সমাধান: API থেকে gelen ক্রেডিট হিস্টোরি টেবিল আকারে দেখানো      ★★★
                // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
                let historyHtml = '';
                if (data.credit_history && data.credit_history.length > 0) {
                    data.credit_history.forEach(entry => {
                        const trxId = entry.user_submitted_trxid ? entry.user_submitted_trxid : 'N/A';
                        // তারিখ ফরম্যাট করা
                        const date = new Date(entry.transaction_date).toLocaleString('en-US', { 
                            day: '2-digit', month: 'short', year: 'numeric', 
                            hour: '2-digit', minute: '2-digit', hour12: true 
                        });
                        historyHtml += `
                            <tr>
                                <td>${date}</td>
                                <td>${entry.description}</td>
                                <td>${trxId}</td>
                                <td>${parseFloat(entry.credits_deducted).toFixed(2)}</td>
                                <td>$${parseFloat(entry.cost_usd).toFixed(4)}</td>
                            </tr>
                        `;
                    });
                } else {
                    historyHtml = '<tr><td colspan="5" style="text-align:center; padding: 20px;">No credit usage history found for this user.</td></tr>';
                }
                historyTableBody.innerHTML = historyHtml;

            } else {
                statsContainer.innerHTML = `<p style="color: red;">Error: ${data.message}</p>`;
                historyTableBody.innerHTML = '<tr><td colspan="5" style="text-align:center; color: red;">Could not load history.</td></tr>';
            }
        })
        .catch(error => {
            statsContainer.innerHTML = `<p style="color: red;">Failed to load statistics.</p>`;
            historyTableBody.innerHTML = '<tr><td colspan="5" style="text-align:center; color: red;">Failed to load history. Check network connection.</td></tr>';
            console.error('Error fetching customer details:', error);
        });
});
</script>

================================================================================
--- ফাইল পাথ (File Path): api/add_customer.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim($_POST['name']);
    $email = trim($_POST['email']);
    $phone = trim($_POST['phone']);
    $address = trim($_POST['address']) ?: null;
    $city = trim($_POST['city']) ?: null;
    $state = trim($_POST['state']) ?: null;
    $postcode = trim($_POST['postcode']) ?: null;
    $country = trim($_POST['country']) ?: null;

    if (empty($name) || empty($email) || empty($phone)) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'Required fields are missing.']);
        exit();
    }

    try {
        // একই ইমেইলের গ্রাহক আছে কিনা তা পরীক্ষা করা
        $stmt_check = $pdo->prepare("SELECT id FROM transactions WHERE user_id = ? AND customer_email = ?");
        $stmt_check->execute([$user_id, $email]);
        if ($stmt_check->fetch()) {
            http_response_code(400);
            echo json_encode(['success' => false, 'message' => 'A customer with this email already exists.']);
            exit();
        }

        $sql = "INSERT INTO transactions (user_id, unique_id, amount, customer_name, customer_email, phone, address, city, state, postcode, country, status, meta_data) 
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        
        $stmt_insert = $pdo->prepare($sql);
        $stmt_insert->execute([
            $user_id, 'manual_api_' . sha1(uniqid(rand(), true)), 0, $name, $email, $phone,
            $address, $city, $state, $postcode, $country, 'completed',
            json_encode(['source' => 'manual_api_entry'])
        ]);

        echo json_encode(['success' => true, 'message' => 'Customer added successfully.']);

    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
    }
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/app_login.php [Text Content] ---
================================================================================

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
header('Content-Type: application/json');
require '../db_connect.php'; // ডেটাবেস সংযোগ

// ★★★ পরিবর্তন এখানে: $_POST থেকে সরাসরি ডেটা নেওয়া হচ্ছে ★★★
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';

if (empty($email) || empty($password)) {
    http_response_code(400); // Bad Request
    echo json_encode(['success' => false, 'message' => 'Email and password are required.']);
    exit();
}

try {
    // ব্যবহারকারীকে ইমেইল দিয়ে খোঁজা হচ্ছে
    $stmt = $pdo->prepare("SELECT id, username, password FROM users WHERE email = ?");
    $stmt->execute([$email]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    // পাসওয়ার্ড যাচাই করা হচ্ছে
    if ($user && password_verify($password, $user['password'])) {
        // পাসওয়ার্ড সঠিক হলে, settings টেবিল থেকে api_key আনা হচ্ছে
        $stmt_key = $pdo->prepare("SELECT api_key FROM settings WHERE user_id = ?");
        $stmt_key->execute([$user['id']]);
        $setting = $stmt_key->fetch(PDO::FETCH_ASSOC);

        if ($setting && !empty($setting['api_key'])) {
            // সফলভাবে লগইন হলে প্রয়োজনীয় তথ্য পাঠানো হচ্ছে
            echo json_encode([
                'success' => true,
                'message' => 'Login successful',
                'user_id' => $user['id'],
                'name' => $user['username'],
                'api_key' => $setting['api_key']
            ]);
        } else {
            http_response_code(403); // Forbidden
            echo json_encode(['success' => false, 'message' => 'API key not found for this user.']);
        }
    } else {
        // ইমেইল বা পাসওয়ার্ড ভুল হলে
        http_response_code(401); // Unauthorized
        echo json_encode(['success' => false, 'message' => 'Invalid email or password.']);
    }

} catch (PDOException $e) {
    http_response_code(500); // Internal Server Error
    echo json_encode(['success' => false, 'message' => 'Database error.']);
}

================================================================================
--- ফাইল পাথ (File Path): api/check_license.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Verifying a License Key from the Self-Hosted Installer
 * সংস্করণ: 2.0 - Now validates based on license key only, ignoring item_name.
 */

header('Content-Type: application/json');
require '../db_connect.php';

define('MASTER_API_KEY', 'Secur1tyKey-For-WHMCS-M0dule-@2025!'); 

try {
    $provided_key = $_POST['master_api_key'] ?? '';
    if (empty($provided_key) || $provided_key !== MASTER_API_KEY) {
        throw new Exception('Invalid or missing Master API Key.', 403);
    }

    $license_key = $_POST['license_key'] ?? '';
    if (empty($license_key)) {
        throw new Exception('License Key is required.', 400);
    }

    // ★★★ মূল সমাধান: এখন শুধুমাত্র লাইসেন্স কী দিয়ে তথ্য খোঁজা হচ্ছে ★★★
    $stmt = $pdo->prepare(
        "SELECT l.status, l.created_at, p.item_name 
         FROM licenses l
         JOIN products p ON l.product_id = p.id
         WHERE l.license_key = ?"
    );
    $stmt->execute([$license_key]);
    $license = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$license) {
        throw new Exception('The provided license key does not exist.', 404);
    }
    
    if ($license['status'] !== 'active') {
        throw new Exception("This license is currently {$license['status']} and cannot be used for a new installation.", 403);
    }

    echo json_encode([
        'success'      => true,
        'message'      => 'License is valid and active.',
        'status'       => $license['status'],
        'created_at'   => $license['created_at'],
        'product_name' => $license['item_name'] // প্রোডাক্টের নামটি রেসপন্সে পাঠানো হচ্ছে
    ]);

} catch (Exception $e) {
    $code = is_int($e->getCode()) && $e->getCode() > 0 ? $e->getCode() : 500;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/check_license_and_status.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for checking a user's status, authenticated by the installation's license key.
 * সংস্করণ: 1.0
 */

header('Content-Type: application/json');
require '../db_connect.php';

// ক্লায়েন্ট সাইটের ইনস্টলেশন থেকে পাঠানো লাইসেন্স কী এবং ইউজার আইডি
$license_key = $_POST['license_key'] ?? '';
$user_id_to_check = $_POST['user_id'] ?? null;

if (empty($license_key) || empty($user_id_to_check)) {
    http_response_code(400);
    die(json_encode(['success' => false, 'message' => 'License Key and User ID are required.']));
}

try {
    // ধাপ ১: লাইসেন্স কী দিয়ে ইনস্টলেশনটি বৈধ কিনা তা যাচাই করা
    // কেন্দ্রীয় ডাটাবেসে এই লাইসেন্স কী দিয়ে কোনো অ্যাডমিন ইউজার আছে কিনা তা দেখা হচ্ছে
    $stmt_auth = $pdo->prepare("SELECT id FROM users WHERE license_key = ? LIMIT 1");
    $stmt_auth->execute([$license_key]);
    if (!$stmt_auth->fetch()) {
        http_response_code(403);
        die(json_encode(['success' => false, 'message' => 'Invalid License Key. The client installation is not authorized.']));
    }

    // ★★★ মূল সমাধান: এখন license_status এর পরিবর্তে account_status চেক করা হচ্ছে ★★★
    $stmt_user = $pdo->prepare("SELECT account_status, suspended_until FROM users WHERE id = ?");
    $stmt_user->execute([$user_id_to_check]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if ($user) {
        $current_status = $user['account_status'];

        // যদি অস্থায়ী ব্যান থাকে এবং তার মেয়াদ শেষ হয়ে যায়, তবে অ্যাকাউন্ট স্বয়ংক্রিয়ভাবে active করা
        if ($current_status === 'suspended' && $user['suspended_until']) {
            if (new DateTime() > new DateTime($user['suspended_until'])) {
                $stmt_reactivate = $pdo->prepare("UPDATE users SET account_status = 'active', suspended_until = NULL WHERE id = ?");
                $stmt_reactivate->execute([$user_id_to_check]);
                $current_status = 'active';
            }
        }
        
        echo json_encode(['success' => true, 'status' => $current_status]);
    } else {
        // যদি ব্যবহারকারীকে কেন্দ্রীয় ডাটাবেসে খুঁজেই না পাওয়া যায়
        echo json_encode(['success' => true, 'status' => 'terminated']);
    }

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Central server error while checking status.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/check_update.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Checking Updates (DEBUGGING VERSION)
 * সংস্করণ: 3.1
 * এই ফাইলটি তার প্রতিটি ধাপ 'update_check_log.txt' ফাইলে লগ করবে।
 */

header('Content-Type: application/json');
require '../db_connect.php';

// লগ করার জন্য একটি Helper Function
function log_to_file($message) {
    // লগ ফাইলটি API ফোল্ডারের ভেতরেই তৈরি হবে
    $logFile = __DIR__ . '/update_check_log.txt';
    $timestamp = date('Y-m-d H:i:s');
    // FILE_APPEND নিশ্চিত করে যে পুরোনো লগ মুছে যাবে না, নতুন তথ্য নিচে যুক্ত হবে
    file_put_contents($logFile, "[$timestamp] " . $message . "\n", FILE_APPEND);
}

// --- ডিবাগিং শুরু ---
log_to_file("================= NEW UPDATE CHECK REQUEST ===================");

try {
    // ক্লায়েন্ট সাইট থেকে পাঠানো তথ্য গ্রহণ এবং লগ করা
    $license_key = $_POST['license_key'] ?? '';
    $current_version = $_POST['current_version'] ?? '0.0.0';

    log_to_file("Request received. License Key: '$license_key', Current Version: '$current_version'");

    if (empty($license_key)) {
        throw new Exception('License key is required.', 401);
    }
    
    // লাইসেন্স কী ব্যবহার করে users টেবিল থেকে ব্যবহারকারীর তথ্য আনা হচ্ছে
    $stmt_user = $pdo->prepare("SELECT id, product_name, license_created_at FROM users WHERE license_key = ? AND license_status = 'active'");
    $stmt_user->execute([$license_key]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$user) {
        log_to_file("FAILURE: User not found or inactive for license key: '$license_key'");
        throw new Exception('Invalid or inactive license key.', 403);
    }
    
    $user_id = $user['id'];
    log_to_file("User found. ID: $user_id, Product: '{$user['product_name']}', License Created: '{$user['license_created_at']}'");

    // ডাটাবেস থেকে সর্বশেষ আপডেটটি খুঁজে বের করা
    $stmt_latest = $pdo->query("SELECT * FROM updates ORDER BY id DESC LIMIT 1");
    $latest_update = $stmt_latest->fetch(PDO::FETCH_ASSOC);

    if (!$latest_update) {
        log_to_file("INFO: No updates found in the 'updates' table.");
        echo json_encode(['update_available' => false]);
        exit();
    }
    
    log_to_file("Latest update found. Version: '{$latest_update['version']}', Method: '{$latest_update['deployment_method']}'");

    // ক্লায়েন্টের বর্তমান ভার্সনের সাথে সর্বশেষ ভার্সন তুলনা করা
    if (version_compare($latest_update['version'], $current_version, '>')) {
        log_to_file("Newer version '{$latest_update['version']}' is available. Checking eligibility...");
        
        $is_eligible = false; // ব্যবহারকারী এই আপডেটের জন্য যোগ্য কিনা তার ফ্ল্যাগ
        $deployment_method = $latest_update['deployment_method'];
        $update_id = $latest_update['id'];

        if ($deployment_method === 'user') {
            // পদ্ধতি ১: যদি ব্যবহারকারী-ভিত্তিক ডেপ্লয়মেন্ট হয়
            log_to_file("Deployment method is 'user'. Checking assignment table for user_id: $user_id");
            $stmt_check = $pdo->prepare("SELECT 1 FROM update_assignments WHERE update_id = ? AND user_id = ?");
            $stmt_check->execute([$update_id, $user_id]);
            if ($stmt_check->fetch()) {
                $is_eligible = true;
                log_to_file("SUCCESS: User is eligible via direct assignment.");
            } else {
                log_to_file("FAILURE: User is NOT listed in direct assignment for this update.");
            }

        } elseif ($deployment_method === 'product') {
            // পদ্ধতি ২: যদি প্রোডাক্ট এবং তারিখ-ভিত্তিক ডেপ্লয়মেন্ট হয়
            log_to_file("Deployment method is 'product'. Checking product and date criteria...");
            
            $product_to_match = $latest_update['deployment_product'];
            $start_date = $latest_update['deployment_start_date'];
            $end_date = $latest_update['deployment_end_date'];
            
            log_to_file("Criteria -> Required Product: '$product_to_match', Start Date: '$start_date', End Date: '$end_date'");

            // প্রতিটি শর্ত আলাদাভাবে যাচাই এবং লগ করা হচ্ছে
            $product_matches = ($user['product_name'] === $product_to_match);
            log_to_file("1. Product Name Match? (User's: '{$user['product_name']}' vs Required: '{$product_to_match}') ==> Result: " . ($product_matches ? 'YES' : 'NO'));
            
            $date_is_valid = !empty($user['license_created_at']) && $user['license_created_at'] !== '0000-00-00 00:00:00';
            log_to_file("2. Is License Creation Date Valid? (User's Date: '{$user['license_created_at']}') ==> Result: " . ($date_is_valid ? 'YES' : 'NO'));

            if ($date_is_valid) {
                $user_license_date = (new DateTime($user['license_created_at']))->format('Y-m-d');
                $is_after_start = ($user_license_date >= $start_date);
                $is_before_end = ($user_license_date <= $end_date);
                log_to_file("3. Is Date within range? (User Date: '{$user_license_date}' must be between '{$start_date}' and '{$end_date}') ==> AfterStart: " . ($is_after_start ? 'YES' : 'NO') . ", BeforeEnd: " . ($is_before_end ? 'YES' : 'NO'));

                // যদি সব শর্ত পূরণ হয়
                if ($product_matches && $is_after_start && $is_before_end) {
                    $is_eligible = true;
                    log_to_file("SUCCESS: User is eligible via product and date criteria.");
                }
            }
        }
        
        if (!$is_eligible) {
            log_to_file("FINAL VERDICT: User is NOT eligible for this update.");
        }

        // যদি ব্যবহারকারী যোগ্য হন, তবে আপডেটের তথ্য পাঠানো
        if ($is_eligible) {
            log_to_file("Sending 'update_available: true' response to client.");
            
            $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
            $host = $_SERVER['HTTP_HOST'];
            $base_project_path = '/dashboard_project';
            $base_url = rtrim("{$protocol}://{$host}", '/') . '/' . ltrim($base_project_path, '/');
            $manifest_filename = 'update-v' . $latest_update['version'] . '_manifest.json';

            echo json_encode([
                'update_available' => true,
                'version' => $latest_update['version'],
                'update_type' => $latest_update['update_type'], 
                'download_url' => $base_url . '/' . $latest_update['zip_path'],
                'manifest_url' => $base_url . '/updates/' . $manifest_filename,
                'sql_migration' => $latest_update['sql_migration'],
                'update_id' => $latest_update['id'] 
            ]);
            exit();
        }
    } else {
        log_to_file("INFO: No newer version available. Client is up-to-date.");
    }
    
    // যদি কোনো শর্তই না মেলে বা নতুন ভার্সন না থাকে
    log_to_file("Sending 'update_available: false' response to client.");
    echo json_encode(['update_available' => false]);

} catch (Exception $e) {
    log_to_file("!!! SCRIPT ERROR: " . $e->getMessage());
    http_response_code($e->getCode() ?: 500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/create_gateway.php [Text Content] ---
================================================================================

<?php
/**
 * API ENDPOINT for Creating a Gateway
 * Version 3.0 - ADVANCED DIAGNOSTIC & DEBUGGING MODE
 * This version will log every detail of the incoming request to a file named 'api_debug.log'.
 */

// ★★★ ডিবাগিং এর জন্য লগ ফাইল তৈরি ★★★
$log_file = __DIR__ . '/api_debug.log';

// ফাংশন: লগ ফাইলে তথ্য লেখার জন্য
function write_to_log($message) {
    global $log_file;
    // লগ মেসেজের সাথে তারিখ ও সময় যুক্ত করা হচ্ছে
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents($log_file, "[{$timestamp}] " . $message . "\n\n", FILE_APPEND);
}

// --- ডায়াগনস্টিকস শুরু ---
$headers = getallheaders();
$raw_post_data = file_get_contents('php://input');

$log_message = "--- NEW REQUEST RECEIVED ---\n";
$log_message .= "[METHOD] " . $_SERVER['REQUEST_METHOD'] . "\n";
$log_message .= "[HEADERS] " . print_r($headers, true) . "\n";
$log_message .= "[POST DATA] " . print_r($_POST, true) . "\n";
$log_message .= "[RAW BODY] " . $raw_post_data . "\n";

write_to_log($log_message);
// --- ডায়াগনস্টিকস শেষ ---


header('Content-Type: application/json');
require '../db_connect.php';

try {
    // ধাপ ১: হেডার থেকে API Key গ্রহণ করা এবং লগ করা
    $api_key = $headers['X-API-KEY'] ?? $headers['x-api-key'] ?? null; // Case-insensitive check

    if (empty($api_key)) {
        $error_msg = 'Authentication failed: X-API-KEY header is completely missing from the request.';
        write_to_log("[API KEY CHECK] FAILED: " . $error_msg);
        http_response_code(401);
        echo json_encode(['success' => false, 'message' => $error_msg]);
        exit();
    }
    
    write_to_log("[API KEY CHECK] SUCCESS: API Key found in header. Value: " . $api_key);

    // ধাপ ২: API Key ব্যবহার করে ডাটাবেস থেকে user_id খুঁজে বের করা এবং লগ করা
    $stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
    $stmt_user->execute([$api_key]);
    $setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$setting) {
        $error_msg = 'Authentication failed: The provided API Key is invalid and was not found in the database.';
        write_to_log("[DATABASE LOOKUP] FAILED: " . $error_msg);
        http_response_code(403);
        echo json_encode(['success' => false, 'message' => $error_msg]);
        exit();
    }
    
    $user_id = $setting['user_id'];
    write_to_log("[DATABASE LOOKUP] SUCCESS: User ID found for the API Key. User ID: " . $user_id);

    // ধাপ ৩: অ্যাপ থেকে পাঠানো ডেটা গ্রহণ করা
    $gateway_key = $_POST['gateway_key'] ?? '';

    if (empty($gateway_key)) {
        $error_msg = 'Required field missing: gateway_key.';
        write_to_log("[INPUT VALIDATION] FAILED: " . $error_msg);
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => $error_msg]);
        exit();
    }

    // গেটওয়ে কী-এর উপর ভিত্তি করে একটি ডিফল্ট নাম সেট করা
    $display_name = '';
    switch ($gateway_key) {
        case 'bkash_personal': $display_name = 'Bkash Personal'; break;
        case 'nagad_personal': $display_name = 'Nagad Personal'; break;
        case 'rocket_personal': $display_name = 'Rocket Personal'; break;
        case 'upay_personal': $display_name = 'Upay Personal'; break;
        case 'bkash_merchant_tokenized': $display_name = 'bKash Marchant (Tokenized)'; break;
        case 'nagad_merchant': $display_name = 'Nagad Marchant'; break;
        case 'bkash_merchant_checkout': $display_name = 'bKash Marchant (Checkout)'; break;
        default:
            $error_msg = 'Invalid gateway_key provided.';
            write_to_log("[INPUT VALIDATION] FAILED: " . $error_msg);
            http_response_code(400);
            echo json_encode(['success' => false, 'message' => $error_msg]);
            exit();
    }

    // ধাপ ৪: ডাটাবেসে নতুন গেটওয়ে ইনসার্ট করা
    write_to_log("[DATABASE INSERT] Attempting to insert gateway with User ID: " . $user_id);
    
    $sql = "INSERT INTO gateways (user_id, display_name, gateway_key) VALUES (:user_id, :display_name, :gateway_key)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':user_id' => $user_id, ':display_name' => $display_name, ':gateway_key' => $gateway_key]);
        
    if ($stmt->rowCount() > 0) {
        write_to_log("[DATABASE INSERT] SUCCESS: Gateway created successfully.");
        echo json_encode(['success' => true, 'message' => 'Gateway created successfully.']);
    } else {
        $error_msg = 'Failed to create the gateway in the database, although the request was valid.';
        write_to_log("[DATABASE INSERT] FAILED: " . $error_msg);
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => $error_msg]);
    }

} catch (PDOException $e) {
    $error_msg = 'Database Error: ' . $e->getMessage();
    write_to_log("[CRITICAL ERROR] " . $error_msg);
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => $error_msg]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/create_instance_admin.php [Text Content] ---
================================================================================

<?php
// create_instance_admin.php

header('Content-Type: application/json');
require '../db_connect.php';

try {
    // সেলফ-হোস্টেড সাইট থেকে পাঠানো ডেটা গ্রহণ করা
    $license_key = $_POST['license_key'] ?? '';
    // ★★★ সমাধান: license_status গ্রহণ করা হচ্ছে ★★★
    $license_status = $_POST['license_status'] ?? 'active'; 

    if (empty($license_key)) {
        http_response_code(400); // Bad Request
        throw new Exception('License key is required.');
    }

    // এই লাইসেন্স কী দিয়ে আগে থেকেই কোনো ইউজার আছে কিনা তা পরীক্ষা করা
    $stmt_check = $pdo->prepare("SELECT id FROM users WHERE license_key = ?");
    $stmt_check->execute([$license_key]);
    if ($stmt_check->fetch()) {
        http_response_code(409); // Conflict
        throw new Exception('This license key is already associated with another user.');
    }
    
    // ডাটাবেস ট্রানজেকশন শুরু করা
    $pdo->beginTransaction();

    // একটি ইউনিক ইউজারনেম এবং নিরাপদ পাসওয়ার্ড তৈরি করা
    $username = 'admin_' . substr(bin2hex(random_bytes(4)), 0, 6);
    $password = bin2hex(random_bytes(6)); // 12-character password
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);
    
    // একটি ডাইনামিক ইমেইল তৈরি করা (ঐচ্ছিক)
    $email = 'user_' . time() . '@' . parse_url($_SERVER['HTTP_REFERER'] ?? 'selfhost.com', PHP_URL_HOST);

    // ★★★ সমাধান: users টেবিলে license_status সহ ডেটা ইনসার্ট করা হচ্ছে ★★★
    $sql_user = "INSERT INTO users (username, email, password, license_key, license_status) VALUES (?, ?, ?, ?, ?)";
    $stmt_user = $pdo->prepare($sql_user);
    $stmt_user->execute([$username, $email, $hashed_password, $license_key, $license_status]);
    
    $user_id = $pdo->lastInsertId();

    // এই নতুন ইউজারের জন্য একটি স্বতন্ত্র API Key তৈরি করা
    $new_api_key = bin2hex(random_bytes(32));

    // `settings` টেবিলে user_id এবং new_api_key সেভ করা
    $sql_settings = "INSERT INTO settings (user_id, api_key) VALUES (?, ?)";
    $stmt_settings = $pdo->prepare($sql_settings);
    $stmt_settings->execute([$user_id, $new_api_key]);

    // ট্রানজেকশন সফলভাবে সম্পন্ন করা
    $pdo->commit();

    // সফলভাবে তৈরি হওয়ার পর ইউজারনেম ও পাসওয়ার্ড ফেরত পাঠানো
    echo json_encode([
        'success' => true, 
        'message' => 'Admin user created successfully.',
        'credentials' => [
            'username' => $username,
            'password' => $password
        ]
    ]);

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    $statusCode = http_response_code();
    if ($statusCode < 400) { $statusCode = 500; }
    
    http_response_code($statusCode);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/create_payment_link.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// Handle POST request
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $product_name = trim($_POST['product_name']);
    $quantity = (int)$_POST['quantity'];
    $amount = (float)$_POST['amount'];
    
    if (empty($product_name) || empty($quantity) || empty($amount)) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'Required fields are missing.']);
        exit();
    }
    
    // ★★★ পরিবর্তন এখানে ★★★
    // expire_date ভ্যালুটি খালি থাকলে null হিসেবে সেট করা হচ্ছে
    $expire_date = !empty(trim($_POST['expire_date'])) ? trim($_POST['expire_date']) : null;

    try {
        // ★★★ পরিবর্তন এখানে: SQL কোয়েরিতে expire_date যুক্ত করা হয়েছে ★★★
        $sql = "INSERT INTO payment_links (user_id, product_name, product_description, amount, currency, quantity, expire_date, status) 
                VALUES (:user_id, :p_name, :p_desc, :amount, :currency, :qty, :expire_date, :status)";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            ':user_id' => $user_id,
            ':p_name' => $product_name,
            ':p_desc' => trim($_POST['product_description']) ?: null,
            ':amount' => $amount,
            ':currency' => $_POST['currency'],
            ':qty' => $quantity,
            ':expire_date' => $expire_date, // ★★★ পরিবর্তন এখানে ★★★
            ':status' => $_POST['status'] === '1' ? 1 : 0
        ]);
        
        echo json_encode(['success' => true, 'message' => 'Payment link created successfully.']);

    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
    }
} else {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Method Not Allowed.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/create_user_from_install.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Creating an Admin User from the Self-Hosted Installer
 * সংস্করণ: 2.0 - Accepts license creation date and product name.
 */

header('Content-Type: application/json');
require '../db_connect.php';

// নিরাপত্তা ব্যবস্থা: এই কী'টি অবশ্যই ক্লায়েন্ট ইনস্টলারের সাথে মিলতে হবে
define('MASTER_API_KEY', 'Secur1tyKey-For-WHMCS-M0dule-@2025!'); 

$provided_key = $_POST['master_api_key'] ?? '';
if (empty($provided_key) || $provided_key !== MASTER_API_KEY) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid or missing Master API Key.']);
    exit();
}

// ক্লায়েন্ট ইনস্টলার থেকে পাঠানো ডেটা গ্রহণ
$username = $_POST['username'] ?? '';
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';
$license_key = $_POST['license_key'] ?? '';
$license_created_at = $_POST['license_created_at'] ?? null;
$product_name = $_POST['product_name'] ?? null;

// ডেটা ভ্যালিডেশন
if (empty($username) || empty($email) || empty($password) || empty($license_key)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Username, email, password, and license key are required.']);
    exit();
}

try {
    // ইউজার আগে থেকেই আছে কিনা তা পরীক্ষা করা
    $stmt_check = $pdo->prepare("SELECT id FROM users WHERE email = ? OR license_key = ?");
    $stmt_check->execute([$email, $license_key]);
    if ($stmt_check->fetch()) {
        http_response_code(409); // Conflict
        echo json_encode(['success' => false, 'message' => 'A user with this email or license key already exists.']);
        exit();
    }

    // ডাটাবেস ট্রানজেকশন শুরু করা
    $pdo->beginTransaction();

    // পাসওয়ার্ড হ্যাশ করা
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    // `users` টেবিলে নতুন ইউজার এবং তার সব তথ্য যুক্ত করা
    $sql_user = "INSERT INTO users (username, email, password, license_key, license_status, license_created_at, product_name) VALUES (?, ?, ?, ?, 'active', ?, ?)";
    $stmt_user = $pdo->prepare($sql_user);
    $stmt_user->execute([$username, $email, $hashed_password, $license_key, $license_created_at, $product_name]);
    $user_id = $pdo->lastInsertId();

    // `settings` টেবিলে নতুন API Key যুক্ত করা
    $new_api_key = bin2hex(random_bytes(32));
    $sql_settings = "INSERT INTO settings (user_id, api_key) VALUES (?, ?)";
    $stmt_settings = $pdo->prepare($sql_settings);
    $stmt_settings->execute([$user_id, $new_api_key]);

    // ট্রানজেকশন সফলভাবে সম্পন্ন করা
    $pdo->commit();

    // সফল হলে ক্লায়েন্ট সাইটকে user_id ফেরত পাঠানো
    echo json_encode([
        'success' => true, 
        'message' => 'Admin user created successfully on the central server.',
        'user_id' => $user_id
    ]);

} catch (PDOException $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/create_user_from_whmcs.php [Text Content] ---
================================================================================

<?php
// JSON রেসপন্স পাঠানোর জন্য হেডার সেট করা
header('Content-Type: application/json');

// ডেটাবেস কানেকশন ফাইল যুক্ত করা
require '../db_connect.php';

// --- নিরাপত্তা ব্যবস্থা: মাস্টার এপিআই কী ---
// এই কী'টি অবশ্যই অত্যন্ত সুরক্ষিত এবং গোপন রাখবেন।
define('MASTER_API_KEY', 'Secur1tyKey-For-WHMCS-M0dule-@2025!'); // ★★★ এখানে আপনার নিজের মতো একটি শক্তিশালী কী দিন

// WHMCS মডিউল থেকে পাঠানো এপিআই কী চেক করা হচ্ছে
$provided_key = $_SERVER['HTTP_X_API_KEY'] ?? '';

if (empty($provided_key) || $provided_key !== MASTER_API_KEY) {
    http_response_code(403); // Forbidden
    echo json_encode(['success' => false, 'message' => 'Invalid or missing Master API Key.']);
    exit();
}

// --- WHMCS থেকে পাঠানো ডেটা গ্রহণ করা ---
$username = $_POST['username'] ?? '';
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';

// --- ডেটা ভ্যালিডেশন ---
if (empty($username) || empty($email) || empty($password)) {
    http_response_code(400); // Bad Request
    echo json_encode(['success' => false, 'message' => 'Username, email, and password are required.']);
    exit();
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Invalid email format.']);
    exit();
}

try {
    // --- ইউজার আগে থেকেই আছে কিনা তা পরীক্ষা করা ---
    $stmt_check = $pdo->prepare("SELECT id FROM users WHERE email = ?");
    $stmt_check->execute([$email]);
    if ($stmt_check->fetch()) {
        http_response_code(409); // Conflict
        echo json_encode(['success' => false, 'message' => 'A user with this email already exists.']);
        exit();
    }

    // --- নতুন ইউজার তৈরি করা ---
    $pdo->beginTransaction();

    // ১. পাসওয়ার্ড হ্যাশ করা
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    // ২. `users` টেবিলে নতুন ইউজার যুক্ত করা
    $sql_user = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)";
    $stmt_user = $pdo->prepare($sql_user);
    $stmt_user->execute([$username, $email, $hashed_password]);

    // ৩. নতুন তৈরি হওয়া ইউজারের আইডি (user_id) নেওয়া
    $user_id = $pdo->lastInsertId();

    // ৪. এই নতুন ইউজারের জন্য একটি স্বতন্ত্র API Key তৈরি করা
    $new_api_key = bin2hex(random_bytes(32));

    // ৫. `settings` টেবিলে এই user_id এবং new_api_key সেভ করা
    $sql_settings = "INSERT INTO settings (user_id, api_key) VALUES (?, ?)";
    $stmt_settings = $pdo->prepare($sql_settings);
    $stmt_settings->execute([$user_id, $new_api_key]);

    $pdo->commit();

    // সফলভাবে তৈরি হওয়ার পর বার্তা পাঠানো
    echo json_encode([
        'success' => true, 
        'message' => 'User created successfully in the dashboard project.',
        'user_id' => $user_id,
        'username' => $username
    ]);

} catch (PDOException $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    http_response_code(500); // Internal Server Error
    echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/delete_customer.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];
$email = $_POST['email'] ?? null;

if ($email) {
    try {
        $sql = "DELETE FROM transactions WHERE user_id = :user_id AND customer_email = :email";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([':user_id' => $user_id, ':email' => $email]);
        
        if ($stmt->rowCount() > 0) {
            echo json_encode(['success' => true, 'message' => 'Customer deleted successfully.']);
        } else {
            echo json_encode(['success' => false, 'message' => 'Customer not found.']);
        }
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Database error.']);
    }
} else {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Email not provided.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/delete_payment_link.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

$link_id = $_POST['id'] ?? null;

if ($link_id) {
    try {
        $stmt = $pdo->prepare("DELETE FROM payment_links WHERE id = :id AND user_id = :user_id");
        $stmt->execute([':id' => $link_id, ':user_id' => $user_id]);
        if($stmt->rowCount() > 0){
            echo json_encode(['success' => true, 'message' => 'Payment link deleted successfully.']);
        } else {
            echo json_encode(['success' => false, 'message' => 'Link not found or permission denied.']);
        }
    } catch (PDOException $e) {
        echo json_encode(['success' => false, 'message' => 'Database error.']);
    }
} else {
    echo json_encode(['success' => false, 'message' => 'Link ID not provided.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/delete_sms_data.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];
$sms_id = $_POST['id'] ?? null;

if (!$sms_id) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'SMS Record ID is required.']);
    exit();
}

try {
    // is_trashed ফ্ল্যাগটি 1-এ সেট করা হচ্ছে
    $sql = "UPDATE sms_transactions SET is_trashed = 1 WHERE id = :id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':id' => $sms_id, ':user_id' => $user_id]);

    if ($stmt->rowCount() > 0) {
        echo json_encode(['success' => true, 'message' => 'Record moved to trash.']);
    } else {
        echo json_encode(['success' => false, 'message' => 'Record not found or permission denied.']);
    }
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/disable_2fa.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Disabling 2FA
 * সংস্করণ: 1.1 - Added CORS headers.
 */

// ★★★ সমাধান: CORS পলিসি এবং প্রি-ফ্লাইট অনুরোধ হ্যান্ডেল করার জন্য হেডার ★★★
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-API-KEY, Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit(0);
}

header('Content-Type: application/json');
require '../db_connect.php';

try {
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    $password = $_POST['password'] ?? '';

    if (empty($api_key) || empty($password)) throw new Exception("API Key and password are required.", 400);

    $stmt_user = $pdo->prepare("SELECT u.id, u.password FROM users u JOIN settings s ON u.id = s.user_id WHERE s.api_key = ?");
    $stmt_user->execute([$api_key]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);
    if (!$user) throw new Exception("Invalid API Key.", 403);

    if (!password_verify($password, $user['password'])) {
        throw new Exception("Incorrect password.", 401);
    }
    
    $stmt = $pdo->prepare("UPDATE users SET two_factor_secret = NULL, two_factor_enabled = 0 WHERE id = ?");
    $stmt->execute([$user['id']]);

    echo json_encode(['success' => true, 'message' => '2FA has been disabled successfully.']);
} catch (Exception $e) {
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/edit_customer.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $original_email = trim($_POST['original_email']);
    $name = trim($_POST['name']);
    $email = trim($_POST['email']);
    $phone = trim($_POST['phone']);
    $address = trim($_POST['address']) ?: null;
    $city = trim($_POST['city']) ?: null;
    $state = trim($_POST['state']) ?: null;
    $postcode = trim($_POST['postcode']) ?: null;
    $country = trim($_POST['country']) ?: null;

    if (empty($name) || empty($email) || empty($phone) || empty($original_email)) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'Required fields are missing for update.']);
        exit();
    }
    
    try {
        $sql = "UPDATE transactions 
                SET customer_name = :name, customer_email = :email, phone = :phone, address = :address, 
                    city = :city, state = :state, postcode = :postcode, country = :country
                WHERE user_id = :user_id AND customer_email = :original_email";
        
        $stmt_update = $pdo->prepare($sql);
        $stmt_update->execute([
            ':name' => $name, ':email' => $email, ':phone' => $phone, ':address' => $address,
            ':city' => $city, ':state' => $state, ':postcode' => $postcode, ':country' => $country,
            ':user_id' => $user_id, ':original_email' => $original_email
        ]);

        if ($stmt_update->rowCount() > 0) {
            echo json_encode(['success' => true, 'message' => 'Customer updated successfully.']);
        } else {
            echo json_encode(['success' => false, 'message' => 'Customer not found or no changes made.']);
        }

    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
    }
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/edit_gateway.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// হেডার থেকে API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// অ্যাপ থেকে পাঠানো ডেটা
$gateway_id = $_POST['gateway_id'] ?? null;
$display_name = $_POST['display_name'] ?? '';
$account_number = $_POST['account_number'] ?? '';

if (empty($gateway_id) || empty($display_name)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Gateway ID and display name are required.']);
    exit();
}

try {
    // শুধুমাত্র নিজের গেটওয়ে আপডেট করার জন্য user_id দিয়েও শর্ত দেওয়া হয়েছে
    $sql = "UPDATE gateways SET display_name = :display_name, account_number = :account_number 
            WHERE id = :gateway_id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    
    if ($stmt->execute([
        'display_name' => $display_name, 
        'account_number' => $account_number, 
        'gateway_id' => $gateway_id, 
        'user_id' => $user_id
    ])) {
        echo json_encode(['success' => true, 'message' => 'Gateway updated successfully.']);
    } else {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Failed to update gateway.']);
    }
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.', 'error' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/edit_merchant_gateway.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// অ্যাপ থেকে পাঠানো ডেটা
$gateway_id = $_POST['gateway_id'] ?? null;
$display_name = $_POST['display_name'] ?? '';
$min_amount = $_POST['min_amount'] ?: null;
$max_amount = $_POST['max_amount'] ?: null;
$fixed_charge = $_POST['fixed_charge'] ?: null;
$percentage_charge = $_POST['percentage_charge'] ?: null;

// ★★★ সমাধান: টেস্ট মোডের মান (value) সঠিকভাবে চেক করা হচ্ছে ★★★
// এখন এটি '1' পেলেই শুধু 1 সেভ করবে, অন্যথায় 0 সেভ করবে।
$test_mode = (isset($_POST['test_mode']) && $_POST['test_mode'] === '1') ? 1 : 0;

$app_key = $_POST['app_key'] ?? '';
$app_secret = $_POST['app_secret'] ?? '';
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';

if (empty($gateway_id) || empty($display_name)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Gateway ID and Display Name are required.']);
    exit();
}

try {
    $sql = "UPDATE gateways SET 
                display_name = :d_name, min_amount = :min_a, max_amount = :max_a, 
                fixed_charge = :f_charge, percentage_charge = :p_charge, 
                app_key = :app_k, app_secret = :app_s, username = :uname, 
                password = :pass, test_mode = :test_mode 
            WHERE id = :id AND user_id = :uid";

    $params = [
        'd_name' => $display_name, 'min_a' => $min_amount, 'max_a' => $max_amount, 
        'f_charge' => $fixed_charge, 'p_charge' => $percentage_charge,
        'app_k' => $app_key, 'app_s' => $app_secret, 'uname' => $username, 
        'pass' => $password, 'test_mode' => $test_mode, 'id' => $gateway_id, 'uid' => $user_id
    ];
    
    $stmt = $pdo->prepare($sql);
    if ($stmt->execute($params)) {
        echo json_encode(['success' => true, 'message' => 'Merchant gateway updated successfully.']);
    } else {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Failed to update merchant gateway.']);
    }
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.', 'error' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/edit_nagad_gateway.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// অ্যাপ থেকে পাঠানো ডেটা
$gateway_id = $_POST['gateway_id'] ?? null;
$display_name = $_POST['display_name'] ?? '';
$min_amount = $_POST['min_amount'] ?: null;
$max_amount = $_POST['max_amount'] ?: null;
$fixed_charge = $_POST['fixed_charge'] ?: null;
$percentage_charge = $_POST['percentage_charge'] ?: null;
$test_mode = (isset($_POST['test_mode']) && $_POST['test_mode'] === '1') ? 1 : 0;
$merchant_id = $_POST['merchant_id'] ?? '';
$merchant_private_key = $_POST['merchant_private_key'] ?? '';
$nagad_public_key = $_POST['nagad_public_key'] ?? '';

if (empty($gateway_id) || empty($display_name)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Gateway ID and Display Name are required.']);
    exit();
}

try {
    // Nagad গেটওয়ের জন্য SQL UPDATE কোয়েরি
    $sql = "UPDATE gateways SET 
                display_name = :d_name, min_amount = :min_a, max_amount = :max_a, 
                fixed_charge = :f_charge, percentage_charge = :p_charge, 
                merchant_id = :m_id, merchant_private_key = :m_pk, nagad_public_key = :n_pk, 
                test_mode = :test_mode 
            WHERE id = :id AND user_id = :uid";

    $params = [
        'd_name' => $display_name, 'min_a' => $min_amount, 'max_a' => $max_amount,
        'f_charge' => $fixed_charge, 'p_charge' => $percentage_charge,
        'm_id' => $merchant_id, 'm_pk' => $merchant_private_key, 'n_pk' => $nagad_public_key,
        'test_mode' => $test_mode, 'id' => $gateway_id, 'uid' => $user_id
    ];
    
    $stmt = $pdo->prepare($sql);
    if ($stmt->execute($params)) {
        echo json_encode(['success' => true, 'message' => 'Nagad gateway updated successfully.']);
    } else {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Failed to update Nagad gateway.']);
    }
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.', 'error' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/edit_payment_link.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// Handle POST request
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $link_id = $_POST['link_id'] ?? null;
    $product_name = trim($_POST['product_name']);
    $quantity = (int)$_POST['quantity'];
    $amount = (float)$_POST['amount'];
    
    if (empty($link_id) || empty($product_name) || empty($quantity) || empty($amount)) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'Required fields are missing.']);
        exit();
    }
    
    $expire_date = !empty(trim($_POST['expire_date'])) ? trim($_POST['expire_date']) : null;

    try {
        $sql = "UPDATE payment_links SET 
                    product_name = :p_name, 
                    product_description = :p_desc, 
                    amount = :amount, 
                    currency = :currency, 
                    quantity = :qty, 
                    expire_date = :expire_date, 
                    status = :status
                WHERE id = :link_id AND user_id = :user_id";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            ':p_name' => $product_name,
            ':p_desc' => trim($_POST['product_description']) ?: null,
            ':amount' => $amount,
            ':currency' => $_POST['currency'],
            ':qty' => $quantity,
            ':expire_date' => $expire_date,
            ':status' => $_POST['status'] === '1' ? 1 : 0,
            ':link_id' => $link_id,
            ':user_id' => $user_id
        ]);
        
        if ($stmt->rowCount() > 0) {
            echo json_encode(['success' => true, 'message' => 'Payment link updated successfully.']);
        } else {
            echo json_encode(['success' => false, 'message' => 'Link not found or no changes were made.']);
        }

    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
    }
} else {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Method Not Allowed.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/edit_sms_data.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];
$sms_id = $_POST['id'] ?? null;

if (!$sms_id) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Record ID is missing.']);
    exit();
}

try {
    // অ্যাপ থেকে পাঠানো ডেটা দিয়ে UPDATE কোয়েরি
    $sql = "UPDATE sms_transactions SET 
                payment_method = :payment_method, 
                type = :type, 
                amount = :amount, 
                sender_number = :sender_number, 
                transaction_id = :transaction_id, 
                reference = :reference, 
                note = :note, 
                status = :status
            WHERE id = :id AND user_id = :user_id";

    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':payment_method' => $_POST['payment_method'],
        ':type' => $_POST['type'],
        ':amount' => $_POST['amount'] ?: null,
        ':sender_number' => $_POST['sender_number'],
        ':transaction_id' => $_POST['transaction_id'] ?: null,
        ':reference' => $_POST['reference'] ?: null,
        ':note' => $_POST['note'] ?: null,
        ':status' => $_POST['status'],
        ':id' => $sms_id,
        ':user_id' => $user_id
    ]);

    if ($stmt->rowCount() > 0) {
        echo json_encode(['success' => true, 'message' => 'Record updated successfully.']);
    } else {
        echo json_encode(['success' => false, 'message' => 'No changes were made or record not found.']);
    }
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error during update.', 'error_details' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/force_delete_sms_data.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];
$sms_id = $_POST['id'] ?? null;

if (!$sms_id) {
    http_response_code(400);
    die(json_encode(['success' => false, 'message' => 'SMS Record ID is required.']));
}

try {
    // ডাটাবেস থেকে স্থায়ীভাবে ডিলিট করা হচ্ছে
    $sql = "DELETE FROM sms_transactions WHERE id = :id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':id' => $sms_id, ':user_id' => $user_id]);

    if ($stmt->rowCount() > 0) {
        echo json_encode(['success' => true, 'message' => 'Record permanently deleted.']);
    } else {
        echo json_encode(['success' => false, 'message' => 'Record not found or permission denied.']);
    }
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/generate_2fa.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Generating 2FA QR Code
 * সংস্করণ: 2.2 - Final fix. Returns QR code as a Base64 data URI.
 */

// CORS হেডার (অপরিবর্তিত)
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-API-KEY, Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { exit(0); }

header('Content-Type: application/json');
require '../vendor/autoload.php';
require '../db_connect.php';

use PragmaRX\Google2FA\Google2FA;
// ★★★ সমাধান: QR কোড তৈরির জন্য Endroid লাইব্রেরির ক্লাসগুলো যুক্ত করা হয়েছে ★★★
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;

try {
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    $client_session_id = $_POST['session_id'] ?? null;

    if (empty($api_key) || empty($client_session_id)) {
        throw new Exception("API Key and Session ID are required.", 400);
    }

    $stmt_user = $pdo->prepare("SELECT u.id, u.email FROM users u JOIN settings s ON u.id = s.user_id WHERE s.api_key = ?");
    $stmt_user->execute([$api_key]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);
    if (!$user) throw new Exception("Invalid API Key.", 403);

    session_id($client_session_id);
    session_start();

    $google2fa = new Google2FA();
    $secret = $google2fa->generateSecretKey();

    $_SESSION['2fa_temp_secret'] = $secret;
    $_SESSION['2fa_temp_user_id'] = $user['id'];

    session_write_close();

    // QR কোডের জন্য URL তৈরি
    $qr_code_content = $google2fa->getQRCodeUrl('SecureSoftPay', $user['email'], $secret);

    // ★★★ মূল সমাধান: URL থেকে QR কোড ইমেজ তৈরি করে Base64-এ রূপান্তর করা ★★★
    $qrCode = new QrCode($qr_code_content, new Encoding('UTF-8'), ErrorCorrectionLevel::High);
    $writer = new PngWriter();
    $result = $writer->write($qrCode);
    
    // Base64 ডেটা URI তৈরি
    $dataUri = $result->getDataUri();

    // রেসপন্সে এখন ছবির URL-এর পরিবর্তে সরাসরি ডেটা URI পাঠানো হচ্ছে
    echo json_encode(['success' => true, 'secret' => $secret, 'qr_code_url' => $dataUri]);

} catch (Exception $e) {
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => 'Generate 2FA Error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/generate_api_key.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// হেডার থেকে API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

// API Key ব্যবহার করে user_id খুঁজে বের করা
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting_user = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting_user) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting_user['user_id'];

// নতুন একটি API Key তৈরি করা
$new_api_key = bin2hex(random_bytes(32));

// ডেটাবেসে নতুন কী'টি আপডেট করা
try {
    $sql = "UPDATE settings SET api_key = ? WHERE user_id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$new_api_key, $user_id]);

    echo json_encode(['success' => true, 'message' => 'New API Key generated successfully.']);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_api_settings.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// হেডার থেকে API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    // বিস্তারিত এরর মেসেজ পাঠানো হচ্ছে
    echo json_encode(['success' => false, 'message' => 'API Key is missing from request header.']);
    exit();
}

// API Key ব্যবহার করে user_id খুঁজে বের করা
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting_user = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting_user) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key provided. Authentication failed.']);
    exit();
}
$user_id = $setting_user['user_id'];

// settings টেবিল থেকে API Key এবং base_url আনা হচ্ছে
$stmt_settings = $pdo->prepare("SELECT api_key, base_url FROM settings WHERE user_id = ?");
$stmt_settings->execute([$user_id]);
$settings = $stmt_settings->fetch(PDO::FETCH_ASSOC);

if ($settings) {
    // --- ★★★ মূল সমাধান এখানে ★★★ ---
    // base_url যদি ডেটাবেসে NULL বা খালি থাকে, তাহলে একটি ডিফল্ট বা এরর বার্তা পাঠানো হচ্ছে
    $base_url = $settings['base_url'];
    if (empty($base_url)) {
        // যদি বেস ইউআরএল সেট করা না থাকে, তাহলে একটি সুনির্দিষ্ট বার্তা পাঠানো হচ্ছে
        $base_url = "BASE_URL_NOT_SET"; 
    }

    echo json_encode([
        'success' => true,
        'api_key' => $settings['api_key'],
        'base_url' => $base_url
    ]);
} else {
    http_response_code(404);
    echo json_encode(['success' => false, 'message' => 'API settings record not found for this user in the database.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_billing_history.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];

try {
    // ★★★ মূল পরিবর্তন এখানে ★★★
    // এখন 'user_submitted_trxid' এর পরিবর্তে 't.unique_id' আনা হচ্ছে, যা লোকাল ডাটাবেসের সাথে লিঙ্ক করতে কাজে লাগবে।
    $sql = "SELECT 
                ct.id,
                ct.transaction_date,
                ct.description,
                ct.credits_deducted,
                ct.cost_usd,
                t.unique_id as transaction_unique_id
            FROM credit_transactions ct
            LEFT JOIN transactions t ON ct.payment_transaction_id = t.id
            WHERE ct.user_id = :user_id
            ORDER BY ct.transaction_date DESC";
            
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':user_id' => $user_id]);
    $history = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // তারিখকে পাঠযোগ্য ফরম্যাটে রূপান্তর
    foreach ($history as &$item) {
        $item['transaction_date'] = date("d M, Y, g:i A", strtotime($item['transaction_date']));
    }

    echo json_encode($history);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_billing_info.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];

try {
    // Fetch current balance from users table
    $stmt_balance = $pdo->prepare("SELECT balance FROM users WHERE id = ?");
    $stmt_balance->execute([$user_id]);
    $user = $stmt_balance->fetch(PDO::FETCH_ASSOC);
    $current_balance = $user['balance'] ?? 0.00;

    // Calculate purchased credits
    $stmt_purchased = $pdo->prepare("SELECT COALESCE(SUM(amount_bdt), 0) as total_purchased FROM user_funds WHERE user_id = ? AND status = 'completed' AND transaction_unique_id LIKE 'manual_purchase_%'");
    $stmt_purchased->execute([$user_id]);
    $purchased_credits = $stmt_purchased->fetchColumn() ?? 0;

    $free_credits = 50;
    $total_credits = $free_credits + $purchased_credits;

    // Calculate used credits
    $stmt_used = $pdo->prepare("SELECT COUNT(id) as total_used FROM credit_transactions WHERE user_id = ?");
    $stmt_used->execute([$user_id]);
    $used_credits = $stmt_used->fetchColumn() ?? 0;
    
    $remaining_credits = $total_credits - $used_credits;
    $usage_percentage = ($total_credits > 0) ? ($used_credits / $total_credits) * 100 : 0;

    echo json_encode([
        'success' => true,
        'balance_usd' => (float)$current_balance,
        'used_credits' => (int)$used_credits,
        'total_credits' => (int)$total_credits,
        'remaining_credits' => (int)$remaining_credits,
        'usage_percentage' => (float)$usage_percentage
    ]);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_customers.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../auth_check.php'; // নিশ্চিত করে যে শুধুমাত্র লগইন করা অ্যাডমিনরাই ডেটা দেখতে পারবে
require '../db_connect.php';

try {
    // URL থেকে গ্রাহকের আইডি গ্রহণ করা
    $customer_id = $_GET['id'] ?? null;
    if (!$customer_id) {
        throw new Exception("Customer ID is required.", 400);
    }

    // --- পরিসংখ্যান গণনা ---
    
    // ১. অ্যাকাউন্টে কত ফান্ড আছে (users টেবিল থেকে)
    $stmt_fund = $pdo->prepare("SELECT balance FROM users WHERE id = ?");
    $stmt_fund->execute([$customer_id]);
    $account_fund_usd = $stmt_fund->fetchColumn() ?? 0.00;

    // ২. মোট সফল পেমেন্টের সংখ্যা (transactions টেবিল থেকে)
    $stmt_payments = $pdo->prepare("SELECT COUNT(id) FROM transactions WHERE user_id = ? AND status = 'completed'");
    $stmt_payments->execute([$customer_id]);
    $successful_payments = $stmt_payments->fetchColumn() ?? 0;

    // ৩. মোট কত ক্রেডিট আছে (ফ্রি + কেনা)
    $free_credits = 50;
    $stmt_purchased = $pdo->prepare("SELECT COALESCE(SUM(amount_bdt), 0) as total_purchased FROM user_funds WHERE user_id = ? AND status = 'completed' AND transaction_unique_id LIKE 'manual_purchase_%'");
    $stmt_purchased->execute([$customer_id]);
    $purchased_credits = $stmt_purchased->fetchColumn() ?? 0;
    $total_credits = $free_credits + $purchased_credits;

    // ৪. কত ক্রেডিট খরচ হয়েছে (credit_transactions টেবিল থেকে)
    $stmt_used = $pdo->prepare("SELECT COUNT(id) as total_used FROM credit_transactions WHERE user_id = ?");
    $stmt_used->execute([$customer_id]);
    $used_credits = $stmt_used->fetchColumn() ?? 0;
    
    // ৫. কত ক্রেডিট অবশিষ্ট আছে
    $remaining_credits = $total_credits - $used_credits;

    // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    // ★★★      মূল সমাধান: গ্রাহকের ক্রেডিট খরচের সম্পূর্ণ ইতিহাস এখানে যুক্ত করা হয়েছে      ★★★
    // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    
    // ৬. ক্রেডিট খরচের ইতিহাস আনা (credit_transactions এবং transactions টেবিল JOIN করে)
    $stmt_history = $pdo->prepare(
        "SELECT ct.transaction_date, ct.description, ct.credits_deducted, ct.cost_usd, t.user_submitted_trxid
         FROM credit_transactions ct
         LEFT JOIN transactions t ON ct.payment_transaction_id = t.id
         WHERE ct.user_id = ? 
         ORDER BY ct.transaction_date DESC"
    );
    $stmt_history->execute([$customer_id]);
    $credit_history = $stmt_history->fetchAll(PDO::FETCH_ASSOC);


    // সফলভাবে ডেটা পাওয়া গেলে JSON ফরম্যাটে পাঠানো হচ্ছে
    echo json_encode([
        'success' => true,
        'details' => [
            'account_fund_usd' => $account_fund_usd,
            'successful_payments' => (int)$successful_payments,
            'credits_used' => (int)$used_credits,
            'total_credits' => (int)$total_credits,
            'remaining_credits' => (int)$remaining_credits,
        ],
        'credit_history' => $credit_history // নতুন ডেটা এখানে যুক্ত করা হলো
    ]);

} catch (Exception $e) {
    $code = is_int($e->getCode()) && $e->getCode() >= 400 ? $e->getCode() : 500;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_customer_details.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../auth_check.php';
require '../db_connect.php';

try {
    $customer_id = $_GET['id'] ?? null;
    $search_term = $_GET['search'] ?? null;
    $user = null;

    if ($customer_id) {
        $stmt_user = $pdo->prepare("SELECT id, username, email FROM users WHERE id = ?");
        $stmt_user->execute([$customer_id]);
        $user = $stmt_user->fetch(PDO::FETCH_ASSOC);
    } elseif ($search_term) {
        $stmt_user = $pdo->prepare("SELECT id, username, email FROM users WHERE username LIKE ? OR email LIKE ? LIMIT 1");
        $stmt_user->execute(["%{$search_term}%", "%{$search_term}%"]);
        $user = $stmt_user->fetch(PDO::FETCH_ASSOC);
    } else {
        throw new Exception("Customer ID or Search Term is required.", 400);
    }

    if (!$user) {
        throw new Exception("User not found.", 404);
    }
    
    $user_id = $user['id'];

    // --- পরিসংখ্যান গণনা ---
    $stmt_fund = $pdo->prepare("SELECT balance FROM users WHERE id = ?");
    $stmt_fund->execute([$user_id]);
    $account_fund_usd = $stmt_fund->fetchColumn() ?? 0.00;
    
    $stmt_payments = $pdo->prepare("SELECT COUNT(id) FROM transactions WHERE user_id = ? AND status = 'completed'");
    $stmt_payments->execute([$user_id]);
    $successful_payments = $stmt_payments->fetchColumn() ?? 0;
    
    $free_credits = 50;
    $stmt_purchased = $pdo->prepare("SELECT COALESCE(SUM(amount_bdt), 0) FROM user_funds WHERE user_id = ? AND status = 'completed' AND transaction_unique_id LIKE 'manual_purchase_%'");
    $stmt_purchased->execute([$user_id]);
    $purchased_credits = $stmt_purchased->fetchColumn() ?? 0;
    $total_credits = $free_credits + $purchased_credits;

    $stmt_used = $pdo->prepare("SELECT COUNT(id) FROM credit_transactions WHERE user_id = ?");
    $stmt_used->execute([$user_id]);
    $used_credits = $stmt_used->fetchColumn() ?? 0;
    
    $remaining_credits = $total_credits - $used_credits;

    // --- ক্রেডিট খরচের ইতিহাস আনা ---
    $stmt_history = $pdo->prepare(
        "SELECT ct.transaction_date, ct.description, ct.credits_deducted, ct.cost_usd, t.user_submitted_trxid
         FROM credit_transactions ct LEFT JOIN transactions t ON ct.payment_transaction_id = t.id
         WHERE ct.user_id = ? ORDER BY ct.transaction_date DESC"
    );
    $stmt_history->execute([$user_id]);
    $credit_history = $stmt_history->fetchAll(PDO::FETCH_ASSOC);

    echo json_encode([
        'success' => true,
        'user_info' => $user,
        'details' => [
            'account_fund_usd' => $account_fund_usd,
            'successful_payments' => (int)$successful_payments,
            'credits_used' => (int)$used_credits,
            'total_credits' => (int)$total_credits,
            'remaining_credits' => (int)$remaining_credits,
        ],
        'credit_history' => $credit_history
    ]);

} catch (Exception $e) {
    $code = is_int($e->getCode()) && $e->getCode() >= 400 ? $e->getCode() : 404;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_dashboard_stats.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

try {
    // Total Payments (Completed)
    $stmt_total = $pdo->prepare("SELECT COUNT(id) FROM transactions WHERE user_id = ? AND status = 'completed'");
    $stmt_total->execute([$user_id]);
    $total_payments = $stmt_total->fetchColumn();

    // Pending Payments
    $stmt_pending = $pdo->prepare("SELECT COUNT(id) FROM transactions WHERE user_id = ? AND status = 'pending'");
    $stmt_pending->execute([$user_id]);
    $pending_payments = $stmt_pending->fetchColumn();

    // Total Customers (unique emails)
    $stmt_customers = $pdo->prepare("SELECT COUNT(DISTINCT customer_email) FROM transactions WHERE user_id = ? AND customer_email IS NOT NULL AND customer_email != ''");
    $stmt_customers->execute([$user_id]);
    $total_customers = $stmt_customers->fetchColumn();

    // Unpaid Invoices (using pending payments count as a placeholder)
    $unpaid_invoices = $pending_payments; 

    // Send response
    echo json_encode([
        'success' => true,
        'total_payment' => $total_payments,
        'pending_payment' => $pending_payments,
        'unpaid_invoice' => $unpaid_invoices,
        'total_customer' => $total_customers
    ]);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_default_link_url.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

$response = ['success' => false, 'message' => 'Could not retrieve default link.'];

try {
    $stmt = $pdo->prepare("SELECT unique_link_id FROM payment_links WHERE user_id = ? AND is_default = 1 LIMIT 1");
    $stmt->execute([$user_id]);
    $link = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($link && !empty($link['unique_link_id'])) {
        $unique_id = $link['unique_link_id'];
    } else {
        $unique_id = 'default-' . bin2hex(random_bytes(12));
        $pdo->prepare("INSERT INTO payment_links (user_id, product_name, unique_link_id, is_default, status) VALUES (?, 'Default Payment Link', ?, 1, 1)")->execute([$user_id, $unique_id]);
    }
    
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
    $host = $_SERVER['HTTP_HOST'];
    $directory = rtrim(dirname(dirname($_SERVER['PHP_SELF'])), '/\\');
    
    $response['success'] = true;
    $response['url'] = "{$protocol}://{$host}{$directory}/paymentlink/pay/{$unique_id}";
    $response['message'] = 'Default link retrieved.';

} catch (PDOException $e) {
    $response['message'] = 'Database error.';
}

echo json_encode($response);
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_devices.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// হেডার থেকে API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';

if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

// API Key ব্যবহার করে user_id খুঁজে বের করা
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}

$user_id = $setting['user_id'];

// devices টেবিল থেকে ডেটা আনা হচ্ছে
try {
    $stmt = $pdo->prepare("SELECT * FROM devices WHERE user_id = ? ORDER BY id DESC");
    $stmt->execute([$user_id]);
    $devices = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    echo json_encode($devices);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.', 'error_details' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_file_content.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

try {
    // ক্লায়েন্ট থেকে পাঠানো লাইসেন্স কী গ্রহণ করা
    $license_key = $_POST['license_key'] ?? '';
    $file_name = $_POST['file_name'] ?? '';

    if (empty($license_key) || empty($file_name)) {
        http_response_code(400);
        throw new Exception('License key and file name are required.');
    }

    // লাইসেন্স কী দিয়ে ব্যবহারকারীকে যাচাই করা (নিরাপত্তার জন্য)
    $stmt_user = $pdo->prepare("SELECT id FROM users WHERE license_key = ?");
    $stmt_user->execute([$license_key]);
    if (!$stmt_user->fetch()) {
        http_response_code(403);
        throw new Exception('Invalid or unauthorized license key.');
    }

    // `file_templates` টেবিল থেকে ফাইলের কন্টেন্ট আনা
    $stmt_template = $pdo->prepare("SELECT content FROM file_templates WHERE file_name = ?");
    $stmt_template->execute([$file_name]);
    $template = $stmt_template->fetch(PDO::FETCH_ASSOC);

    if ($template) {
        echo json_encode([
            'success' => true,
            'content' => $template['content']
        ]);
    } else {
        http_response_code(404);
        throw new Exception("The requested file template '{$file_name}' was not found on the central server.");
    }

} catch (Exception $e) {
    $statusCode = http_response_code();
    if ($statusCode < 400) { $statusCode = 500; }
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_gateways.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';

if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// ★★★ সমাধান: এখন সব কলাম সিলেক্ট করা হচ্ছে (*) যাতে মার্চেন্টের সব তথ্য অ্যাপে যায় ★★★
$stmt_gateways = $pdo->prepare("SELECT * FROM gateways WHERE user_id = ? ORDER BY id DESC");
$stmt_gateways->execute([$user_id]);
$gateways = $stmt_gateways->fetchAll(PDO::FETCH_ASSOC);

echo json_encode($gateways);
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_general_settings.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting_user = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting_user) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting_user['user_id'];

// General settings আনা হচ্ছে
$stmt_general = $pdo->prepare("SELECT * FROM brand_settings WHERE user_id = ?");
$stmt_general->execute([$user_id]);
$settings = $stmt_general->fetch(PDO::FETCH_ASSOC);

// Branding (Color) settings আনা হচ্ছে
$stmt_colors = $pdo->prepare("SELECT * FROM brand_colors WHERE user_id = ?");
$stmt_colors->execute([$user_id]);
$colors = $stmt_colors->fetch(PDO::FETCH_ASSOC);

// Business Details টেবিল থেকে ডেটা আনা
$stmt_business = $pdo->prepare("SELECT * FROM business_details WHERE user_id = ?");
$stmt_business->execute([$user_id]);
$business = $stmt_business->fetch(PDO::FETCH_ASSOC);

// Support Details টেবিল থেকে ডেটা আনা
$stmt_support = $pdo->prepare("SELECT * FROM support_details WHERE user_id = ?");
$stmt_support->execute([$user_id]);
$support = $stmt_support->fetch(PDO::FETCH_ASSOC);

// Brand Logos টেবিল থেকে ডেটা আনা
$stmt_logos = $pdo->prepare("SELECT primary_logo, round_logo, favicon FROM brand_logos WHERE user_id = ?");
$stmt_logos->execute([$user_id]);
$logos = $stmt_logos->fetch(PDO::FETCH_ASSOC);

$response = [
    'success' => true,
    
    // General Settings
    'site_name' => $settings['site_name'] ?? '',
    'timezone' => $settings['timezone'] ?? 'Asia/Dhaka',
    'default_currency' => $settings['default_currency'] ?? 'BDT',
    'currency_symbol' => $settings['currency_symbol'] ?? '৳',
    'default_language' => $settings['default_language'] ?? 'en',
    'week_starts_on' => $settings['week_starts_on'] ?? 'Saturday',
    
    // Branding Settings (ডিফল্ট ভ্যালুসহ)
    'global_text_color' => $colors['global_text_color'] ?? '#000000',
    'primary_button_color' => $colors['primary_button_color'] ?? '#0D6EFD',
    'button_text_color' => $colors['button_text_color'] ?? '#FFFFFF',
    'button_hover_color' => $colors['button_hover_color'] ?? '#0B5ED7',
    'button_hover_text_color' => $colors['button_hover_text_color'] ?? '#FFFFFF',
    'navigation_background' => $colors['navigation_background'] ?? '#FFFFFF',
    'navigation_text_color' => $colors['navigation_text_color'] ?? '#000000',
    'active_tab_color' => $colors['active_tab_color'] ?? '#E9EFFF',
    'active_tab_text_color' => $colors['active_tab_text_color'] ?? '#0D6EFD',
    
    // Business Details
    'street_address' => $business['street_address'] ?? '',
    'city' => $business['city'] ?? '',
    'postal_code' => $business['postal_code'] ?? '',
    'country' => $business['country'] ?? '',
    
    // Support Details
    'support_phone' => $support['support_phone'] ?? '',
    'support_email' => $support['support_email'] ?? '',
    'support_website' => $support['support_website'] ?? '',

    // Logo paths
    'primary_logo' => $logos['primary_logo'] ?? null,
    'round_logo' => $logos['round_logo'] ?? null,
    'favicon' => $logos['favicon'] ?? null
];

echo json_encode($response);


================================================================================
--- ফাইল পাথ (File Path): api/get_payments.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

try {
    // transactions টেবিল থেকে ডেটা আনা হচ্ছে
    $sql = "SELECT 
                id, 
                customer_name, 
                customer_email, 
                amount, 
                'BDT' as currency, -- কারেন্সি হার্ডকোড করা হয়েছে, প্রয়োজনে পরিবর্তনযোগ্য
                user_submitted_trxid as transaction_id, 
                status, 
                created_at 
            FROM transactions 
            WHERE user_id = :user_id 
            ORDER BY created_at DESC";
            
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':user_id' => $user_id]);
    $payments = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // তারিখকে আরও সুন্দর ফরম্যাটে পাঠানোর জন্য
    foreach ($payments as &$payment) {
        $payment['created_at'] = date("d M, Y, g:i A", strtotime($payment['created_at']));
    }

    echo json_encode($payments);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_payment_links.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];

// ★★★ পরিবর্তন এখানে: SQL কোয়েরিতে 'expire_date' যুক্ত করা হয়েছে ★★★
$stmt = $pdo->prepare("SELECT id, product_name, product_description, amount, currency, quantity, status, expire_date FROM payment_links WHERE user_id = ? AND is_default = 0 ORDER BY id DESC");
$stmt->execute([$user_id]);
$links = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo json_encode($links);
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_payment_link_url.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

$response = ['success' => false, 'url' => '', 'message' => 'Link not found.'];
$link_id = $_POST['id'] ?? null;

if ($link_id) {
    $stmt = $pdo->prepare("SELECT unique_link_id FROM payment_links WHERE id = ? AND user_id = ?");
    $stmt->execute([$link_id, $user_id]);
    $link = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($link) {
        $unique_id = $link['unique_link_id'];
        if (empty($unique_id)) {
            $unique_id = bin2hex(random_bytes(20));
            $pdo->prepare("UPDATE payment_links SET unique_link_id = ? WHERE id = ?")->execute([$unique_id, $link_id]);
        }
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
        $host = $_SERVER['HTTP_HOST'];
        $directory = rtrim(dirname(dirname($_SERVER['PHP_SELF'])), '/\\');
        
        $response['url'] = "{$protocol}://{$host}{$directory}/paymentlink/pay/{$unique_id}";
        $response['success'] = true;
        $response['message'] = "Link retrieved.";
    }
}

echo json_encode($response);
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_profile.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Fetching User Profile Information
 * সংস্করণ: 2.0 - Includes 2FA status.
 */

// রেসপন্স হিসেবে JSON ডেটা পাঠানো হবে
header('Content-Type: application/json');
// CORS পলিসির জন্য হেডার, যাতে ক্লায়েন্ট সাইট থেকে অনুরোধ ব্লক না হয়
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-API-KEY, Content-Type");
header("Access-Control-Allow-Methods: GET, OPTIONS");

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    exit(0);
}

// ডাটাবেস সংযোগ এবং সেশন ম্যানেজার ফাইল যুক্ত করা
require '../db_connect.php';

try {
    // ক্লায়েন্ট থেকে পাঠানো API Key গ্রহণ করা
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    if (empty($api_key)) {
        throw new Exception("API Key is missing.", 401);
    }

    // API Key ব্যবহার করে settings টেবিল থেকে user_id খুঁজে বের করা
    // এবং users টেবিলের সাথে JOIN করে ব্যবহারকারীর তথ্য আনা
    $stmt_user = $pdo->prepare(
        "SELECT u.username, u.email, u.two_factor_enabled 
         FROM users u 
         JOIN settings s ON u.id = s.user_id 
         WHERE s.api_key = ?"
    );
    $stmt_user->execute([$api_key]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$user) {
        throw new Exception("Invalid API Key.", 403);
    }

    // সফল হলে ব্যবহারকারীর নাম, ইমেইল এবং 2FA স্ট্যাটাস ফেরত পাঠানো
    echo json_encode([
        'success' => true,
        'name' => $user['username'],
        'email' => $user['email'],
        'two_factor_enabled' => (bool)$user['two_factor_enabled'] // 0/1 কে true/false-এ রূপান্তর
    ]);

} catch (Exception $e) {
    // যেকোনো ধরনের এরর হলে একটি বিস্তারিত JSON বার্তা পাঠানো
    $code = $e->getCode() > 0 ? $e->getCode() : 500;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_qr_data.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

try {
    // API Key হেডার থেকে অথেন্টিকেশন
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    if (empty($api_key)) {
        http_response_code(401);
        throw new Exception("API Key is missing.");
    }

    $stmt_user_lookup = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
    $stmt_user_lookup->execute([$api_key]);
    $setting = $stmt_user_lookup->fetch(PDO::FETCH_ASSOC);

    if (!$setting) {
        http_response_code(403);
        throw new Exception("Invalid API Key.");
    }
    $user_id = $setting['user_id'];

    // নতুন, একবার-ব্যবহারযোগ্য টোকেন তৈরি এবং ডাটাবেসে সেভ
    $token = bin2hex(random_bytes(32));
    $stmt_token_update = $pdo->prepare("UPDATE users SET app_auth_token = ? WHERE id = ?");
    $stmt_token_update->execute([$token, $user_id]);

    // ★★★ মূল পরিবর্তন: এখন শুধু users টেবিল থেকে ইমেইল আনা হচ্ছে ★★★
    $stmt_user_data = $pdo->prepare("SELECT email FROM users WHERE id = ?");
    $stmt_user_data->execute([$user_id]);
    $user_data = $stmt_user_data->fetch(PDO::FETCH_ASSOC);

    if (!$user_data || empty($user_data['email'])) {
        throw new Exception("User email not found on the central server.");
    }

    // ★★★ মূল পরিবর্তন: রেসপন্স থেকে baseUrl বাদ দেওয়া হয়েছে ★★★
    echo json_encode([
        'success' => true,
        'email'   => $user_data['email'],
        'token'   => $token
    ]);

} catch (Exception $e) {
    // এরর কোড সেট করা হচ্ছে
    $code = is_int($e->getCode()) && $e->getCode() >= 400 ? $e->getCode() : 500;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_reports.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// --- ধাপ ১: API Key দিয়ে ব্যবহারকারী এবং তার টাইমজোন খুঁজে বের করা ---
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { 
    http_response_code(401); 
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']); 
    exit(); 
}

// SQL কোয়েরি পরিবর্তন করে settings টেবিলের সাথে brand_settings টেবিল JOIN করা হয়েছে
$sql_user = "SELECT s.user_id, bs.timezone 
             FROM settings s
             LEFT JOIN brand_settings bs ON s.user_id = bs.user_id
             WHERE s.api_key = ?";
$stmt_user = $pdo->prepare($sql_user);
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) { 
    http_response_code(403); 
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']); 
    exit(); 
}
$user_id = $setting['user_id'];
// ব্যবহারকারীর সেট করা টাইমজোন নেওয়া হচ্ছে, সেট করা না থাকলে ডিফল্ট হিসেবে 'Asia/Dhaka' ব্যবহার করা হবে
$user_timezone = $setting['timezone'] ?? 'Asia/Dhaka';

// --- Configuration & Functions ---
define('BDT_TO_USD_RATE', 0.0085);

/**
 * নির্দিষ্ট সময়কালের জন্য পেমেন্টের ডেটা তৈরি করে।
 * @param PDO $pdo PDO ডাটাবেস অবজেক্ট
 * @param int $user_id ব্যবহারকারীর আইডি
 * @param string $start_date_utc UTC ফরম্যাটে শুরুর তারিখ
 * @param string $end_date_utc UTC ফরম্যাটে শেষের তারিখ
 * @return array রিপোর্ট ডেটা
 */
function get_report_data($pdo, $user_id, $start_date_utc, $end_date_utc) {
    // ★★★ মূল পরিবর্তন: এখন এখানে আর CONVERT_TZ নেই ★★★
    // সরাসরি UTC সময় অনুযায়ী ডেটা খোঁজা হচ্ছে
    $sql_completed = "SELECT 
                        COALESCE(SUM(amount), 0) as total_amount, 
                        COUNT(id) as payment_count 
                      FROM transactions 
                      WHERE user_id = ? AND status = 'completed' AND created_at BETWEEN ? AND ?";
    
    $stmt_completed = $pdo->prepare($sql_completed);
    $stmt_completed->execute([$user_id, $start_date_utc, $end_date_utc]);
    $completed_data = $stmt_completed->fetch(PDO::FETCH_ASSOC);

    $sql_initiated = "SELECT COUNT(id) as total_count 
                      FROM transactions 
                      WHERE user_id = ? AND created_at BETWEEN ? AND ?";
    
    $stmt_initiated = $pdo->prepare($sql_initiated);
    $stmt_initiated->execute([$user_id, $start_date_utc, $end_date_utc]);
    $initiated_count = $stmt_initiated->fetchColumn() ?? 0;

    $success_rate = 0;
    if ($initiated_count > 0) {
        $success_rate = ($completed_data['payment_count'] / $initiated_count) * 100;
    }

    return [
        'total_amount_bdt' => (float)$completed_data['total_amount'],
        'total_amount_usd' => (float)$completed_data['total_amount'] * BDT_TO_USD_RATE,
        'payment_count' => (int)$completed_data['payment_count'],
        'success_rate' => number_format($success_rate, 1) . '% success'
    ];
}

// --- ধাপ ৩: রিপোর্ট তৈরি এবং পাঠানো ---
$reports = [];
$icon_colors = ["#3498db", "#e74c3c", "#2ecc71", "#f1c40f", "#9b59b6", "#1abc9c", "#e67e22", "#34495e"];
$color_index = 0;

// ★★★ মূল পরিবর্তন: এখন PHP-তেই সময় রূপান্তর করা হচ্ছে ★★★
$user_tz_obj = new DateTimeZone($user_timezone);
$utc_tz_obj = new DateTimeZone('UTC');

$periods = [
    'Today' => [new DateTime('today 00:00:00', $user_tz_obj), new DateTime('today 23:59:59', $user_tz_obj)],
    'Yesterday' => [new DateTime('yesterday 00:00:00', $user_tz_obj), new DateTime('yesterday 23:59:59', $user_tz_obj)],
    'This Week' => [new DateTime('monday this week 00:00:00', $user_tz_obj), new DateTime('sunday this week 23:59:59', $user_tz_obj)],
    'Last Week' => [new DateTime('monday last week 00:00:00', $user_tz_obj), new DateTime('sunday last week 23:59:59', $user_tz_obj)],
    'This Month' => [new DateTime('first day of this month 00:00:00', $user_tz_obj), new DateTime('last day of this month 23:59:59', $user_tz_obj)],
    'Last Month' => [new DateTime('first day of last month 00:00:00', $user_tz_obj), new DateTime('last day of last month 23:59:59', $user_tz_obj)],
    'This Year' => [new DateTime('first day of January this year 00:00:00', $user_tz_obj), new DateTime('last day of December this year 23:59:59', $user_tz_obj)],
    'Last Year' => [new DateTime('first day of January last year 00:00:00', $user_tz_obj), new DateTime('last day of December last year 23:59:59', $user_tz_obj)]
];

foreach ($periods as $title => $datetimes) {
    // লোকাল সময়কে UTC-তে রূপান্তর করা হচ্ছে
    $start_utc = $datetimes[0]->setTimezone($utc_tz_obj)->format('Y-m-d H:i:s');
    $end_utc = $datetimes[1]->setTimezone($utc_tz_obj)->format('Y-m-d H:i:s');
    
    // get_report_data ফাংশনে এখন UTC সময় পাঠানো হচ্ছে
    $data = get_report_data($pdo, $user_id, $start_utc, $end_utc);
    $data['title'] = $title;
    $data['icon_color'] = $icon_colors[$color_index % count($icon_colors)];
    $reports[] = $data;
    $color_index++;
}

// চূড়ান্ত ফলাফল JSON ফরম্যাটে পাঠানো
echo json_encode($reports);
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_sessions.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Fetching User's Browser Sessions
 * সংস্করণ: 2.2 - Final & Robust Version with CORS fix
 */

// ★★★ সমাধান: CORS পলিসি এবং প্রি-ফ্লাইট অনুরোধ হ্যান্ডেল করার জন্য হেডার যুক্ত করা হয়েছে ★★★
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-API-KEY, Content-Type");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
// ব্রাউজার থেকে OPTIONS মেথডের অনুরোধ এলে, স্ক্রিপ্টটি এখানেই শেষ হবে
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    exit(0);
}

header('Content-Type: application/json');
require '../db_connect.php';

// Helper ফাংশনগুলো ফাইলের ভেতরেই রাখা হয়েছে
function parse_user_agent($ua_string) {
    $os = 'Unknown OS';
    if (preg_match('/windows/i', $ua_string)) $os = 'Windows'; elseif (preg_match('/macintosh|mac os x/i', $ua_string)) $os = 'macOS';
    elseif (preg_match('/linux/i', $ua_string)) $os = 'Linux'; elseif (preg_match('/android/i', $ua_string)) $os = 'Android';
    elseif (preg_match('/iphone|ipad|ipod/i', $ua_string)) $os = 'iOS';
    $browser = 'Unknown Browser';
    if (preg_match('/edge/i', $ua_string)) $browser = 'Edge'; elseif (preg_match('/firefox/i', $ua_string)) $browser = 'Firefox';
    elseif (preg_match('/chrome/i', $ua_string) && !preg_match('/edg/i', $ua_string)) $browser = 'Chrome';
    elseif (preg_match('/safari/i', $ua_string) && !preg_match('/chrome/i', $ua_string)) $browser = 'Safari';
    return ['os' => $os, 'browser' => $browser];
}
function time_ago($time) {
    if (!$time) return 'never'; $diff = time() - $time; if ($diff < 1) return 'just now';
    $time_rules = [31536000 => 'year', 2592000 => 'month', 86400 => 'day', 3600 => 'hour', 60 => 'minute', 1 => 'second'];
    foreach ($time_rules as $secs => $str) { $d = $diff / $secs; if ($d >= 1) { $r = round($d); return $r . ' ' . $str . ($r > 1 ? 's' : '') . ' ago'; } }
}

try {
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    $client_session_id = $_POST['session_id'] ?? null;

    if (empty($api_key) || empty($client_session_id)) {
        throw new Exception("API Key and Session ID are required.", 401);
    }

    $stmt = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
    $stmt->execute([$api_key]);
    $setting = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$setting) throw new Exception("Invalid API Key provided.", 403);
    
    $user_id = $setting['user_id'];

    $stmt_sessions = $pdo->prepare("SELECT * FROM sessions WHERE user_id = ? AND user_agent IS NOT NULL AND user_agent != 'UNKNOWN' ORDER BY last_activity DESC");
    $stmt_sessions->execute([$user_id]);
    $sessions = $stmt_sessions->fetchAll(PDO::FETCH_ASSOC);

    $formatted_sessions = [];
    foreach ($sessions as $session) {
        $ua_info = parse_user_agent($session['user_agent']);
        $formatted_sessions[] = [
            'os' => $ua_info['os'], 'browser' => $ua_info['browser'], 'ip_address' => $session['ip_address'],
            'last_active' => time_ago($session['last_activity']),
            'is_current_device' => ($session['id'] === $client_session_id)
        ];
    }

    echo json_encode(['success' => true, 'sessions' => $formatted_sessions]);

} catch (Exception $e) {
    // যেকোনো ধরনের এরর হলে একটি বিস্তারিত JSON বার্তা পাঠানো হবে
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => 'Failed to load sessions. Server Error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_sms_data.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// ফিল্টার এবং সার্চ প্যারামিটার গ্রহণ
$filter = $_GET['filter'] ?? 'all';
$search = trim($_GET['search'] ?? '');

try {
    $sql = "SELECT id, sender_number, amount, transaction_id, status, received_at FROM sms_transactions";
    $conditions = ["user_id = ?"];
    $params = [$user_id];

    // is_trashed কলামের উপর ভিত্তি করে ফিল্টার
    if ($filter === 'trashed') {
        $conditions[] = "is_trashed = 1";
    } else {
        $conditions[] = "is_trashed = 0";
        if ($filter === 'received' || $filter === 'verified') {
            $conditions[] = "status = ?";
            $params[] = ucfirst($filter);
        }
    }

    // সার্চ টার্ম প্রয়োগ
    if (!empty($search)) {
        $conditions[] = "(sender_number LIKE ? OR transaction_id LIKE ?)";
        $params[] = "%{$search}%";
        $params[] = "%{$search}%";
    }

    $sql .= " WHERE " . implode(' AND ', $conditions);
    $sql .= " ORDER BY received_at DESC";

    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $sms_data = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // তারিখকে পাঠযোগ্য ফরম্যাটে রূপান্তর
    foreach ($sms_data as &$sms) {
        $sms['received_at'] = date("d M, Y, g:i A", strtotime($sms['received_at']));
    }

    echo json_encode($sms_data);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.', 'error_details' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/get_user_status.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for checking a user's current status (active, suspended, etc.)
 * সংস্করণ: 1.0
 */

header('Content-Type: application/json');
require '../db_connect.php';

// ক্লায়েন্ট সাইট থেকে পাঠানো API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    die(json_encode(['success' => false, 'message' => 'Authentication key is missing.']));
}

// এই API Key টি product_project এর settings টেবিল থেকে আসে, তাই এটি দিয়ে user_id বের করা যাবে না
// কিন্তু এটি নিশ্চিত করে যে অনুরোধটি একটি বৈধ ক্লায়েন্ট সাইট থেকে আসছে।
$stmt_auth = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_auth->execute([$api_key]);
if (!$stmt_auth->fetch()) {
    http_response_code(403);
    die(json_encode(['success' => false, 'message' => 'Invalid authentication key.']));
}

// ক্লায়েন্ট থেকে পাঠানো user_id গ্রহণ করা
$user_id_to_check = $_POST['user_id'] ?? null;
if (empty($user_id_to_check)) {
    http_response_code(400);
    die(json_encode(['success' => false, 'message' => 'User ID to check is required.']));
}

try {
    // কেন্দ্রীয় users টেবিল থেকে ব্যবহারকারীর স্ট্যাটাস এবং ব্যানের মেয়াদ আনা হচ্ছে
    $stmt = $pdo->prepare("SELECT license_status, suspended_until FROM users WHERE id = ?");
    $stmt->execute([$user_id_to_check]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user) {
        $current_status = $user['license_status'];

        // যদি অস্থায়ী ব্যান থাকে, তার মেয়াদ শেষ হয়েছে কিনা তা পরীক্ষা করা
        if ($user['license_status'] === 'suspended' && $user['suspended_until']) {
            if (new DateTime() > new DateTime($user['suspended_until'])) {
                // মেয়াদ শেষ হলে অ্যাকাউন্ট স্বয়ংক্রিয়ভাবে active করে দেওয়া হচ্ছে
                $stmt_reactivate = $pdo->prepare("UPDATE users SET license_status = 'active', suspended_until = NULL WHERE id = ?");
                $stmt_reactivate->execute([$user_id_to_check]);
                $current_status = 'active'; // বর্তমান অনুরোধের জন্য স্ট্যাটাস আপডেট
            }
        }
        
        echo json_encode(['success' => true, 'status' => $current_status]);
    } else {
        // যদি ব্যবহারকারীকে খুঁজেই না পাওয়া যায়, তবে তাকে 'terminated' হিসেবে ধরা হবে
        echo json_encode(['success' => true, 'status' => 'terminated']);
    }

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Server error while checking status.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/initiate_funding.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }

$stmt_user = $pdo->prepare("SELECT user_id, username, email FROM settings s JOIN users u ON s.user_id = u.id WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$user = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$user) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $user['user_id'];

define('USD_TO_BDT_RATE', 120);

$amount_usd = (float)($_POST['amount'] ?? 0);

if ($amount_usd <= 0) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Invalid amount provided.']);
    exit();
}

$amount_bdt = $amount_usd * USD_TO_BDT_RATE;
$transaction_unique_id = sha1(uniqid(rand(), true) . microtime());

// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
// ★★★      মূল সমাধান: অনুরোধ অনুযায়ী Redirect URL পরিবর্তন করার লজিক      ★★★
// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

$base_project_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]" . rtrim(dirname(dirname($_SERVER['PHP_SELF'])), '/\\');

// product_project থেকে URL পাঠানো হয়েছে কিনা তা পরীক্ষা করা হচ্ছে
$success_url_from_post = $_POST['success_url'] ?? null;
$cancel_url_from_post = $_POST['cancel_url'] ?? null;

if ($success_url_from_post && $cancel_url_from_post) {
    // যদি product_project থেকে URL পাঠানো হয়, তবে সেগুলো ব্যবহার করা হবে
    // success_url-এর সাথে ট্রানজেকশন আইডি যুক্ত করা হচ্ছে
    $success_url = $success_url_from_post . "&trx_id=" . $transaction_unique_id;
    $cancel_url = $cancel_url_from_post;
} else {
    // যদি কোনো URL না পাঠানো হয় (যেমন অ্যাপ থেকে), তবে আগের মতোই app_redirect.php ব্যবহার করা হবে
    $success_url = "{$base_project_url}/app_redirect.php?funding_status=success&trx_id=" . $transaction_unique_id;
    $cancel_url = "{$base_project_url}/app_redirect.php?funding_status=cancelled";
}

try {
    $pdo->beginTransaction();

    $stmt_funds = $pdo->prepare(
        "INSERT INTO user_funds (user_id, transaction_unique_id, amount_usd, amount_bdt, status) 
         VALUES (?, ?, ?, ?, 'pending')"
    );
    $stmt_funds->execute([$user_id, $transaction_unique_id, $amount_usd, $amount_bdt]);

    $stmt_trans = $pdo->prepare(
        "INSERT INTO transactions (user_id, unique_id, amount, customer_name, customer_email, success_url, cancel_url, meta_data) 
         VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
    );
    // ডাটাবেসে এখন সঠিক success_url এবং cancel_url সেভ করা হচ্ছে
    $stmt_trans->execute([
        $user_id, $transaction_unique_id, $amount_bdt,
        $user['username'] ?? 'User', $user['email'] ?? 'funding@user.com',
        $success_url, $cancel_url,
        json_encode(['source' => 'user_funding', 'amount_usd' => $amount_usd])
    ]);

    $pdo->commit();

    $payment_url = "{$base_project_url}/checkout.php?trx_id={$transaction_unique_id}";
    echo json_encode(['success' => true, 'payment_url' => $payment_url]);

} catch (PDOException $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Failed to initiate funding session.', 'error' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/initiate_payment.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

$headers = getallheaders();
$auth_header = $headers['Authorization'] ?? '';
if (!preg_match('/Bearer\s(\S+)/', $auth_header, $matches)) {
    http_response_code(401);
    echo json_encode(['status' => 'error', 'message' => 'API key is missing or invalid.']);
    exit();
}
$api_key = $matches[1];

$stmt_user = $pdo->prepare("SELECT user_id, base_url FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['status' => 'error', 'message' => 'Invalid API key.']);
    exit();
}
$user_id = $setting['user_id'];
$stored_base_url = $setting['base_url'] ?? '';

$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);

$client_base_url = $data['client_base_url'] ?? '';

// ★★★ নতুন পরিবর্তন: এখন এরর লগ একটি নির্দিষ্ট ফাইলে সেভ হবে ★★★
if (empty($client_base_url) || rtrim($stored_base_url, '/') !== rtrim($client_base_url, '/')) {
    
    // ১. লগ ফাইলের পাথ নির্ধারণ করা হয়েছে (dashboard_project/error_log)
    $log_file_path = __DIR__ . '/../error_log';

    // ২. লগ মেসেজ ফরম্যাট করা হয়েছে (তারিখ, সময়সহ)
    $timestamp = date('d-M-Y H:i:s e');
    $log_entry = sprintf(
        "[%s] API Domain Mismatch: Expected URL='%s', Received URL='%s'\n",
        $timestamp,
        $stored_base_url,
        $client_base_url ?: '[URL Not Provided]'
    );

    // ৩. error_log ফাইলে মেসেজটি যুক্ত করা হচ্ছে
    file_put_contents($log_file_path, $log_entry, FILE_APPEND | LOCK_EX);

    // ৪. ক্লায়েন্টকে আগের মতোই এরর রেসপন্স পাঠানো হচ্ছে
    http_response_code(403);
    echo json_encode([
        'status' => 'error', 
        'message' => 'Domain mismatch. দুঃখিত, সংযোগ স্থাপন করা যায়নি।'
    ]);
    exit();
}
// ★★★ পরিবর্তন শেষ ★★★

$amount = $data['amount'] ?? 0;
if ($amount <= 0) {
    http_response_code(400);
    echo json_encode(['status' => 'error', 'message' => 'Amount must be greater than zero.']);
    exit();
}

try {
    $unique_id = sha1(uniqid(rand(), true) . microtime()); 

    $sql = "INSERT INTO transactions (user_id, unique_id, amount, customer_name, customer_email, success_url, cancel_url, meta_data) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        $user_id,
        $unique_id,
        $amount,
        $data['customer_name'] ?? null,
        $data['customer_email'] ?? null,
        $data['success_url'] ?? null,
        $data['cancel_url'] ?? null,
        $data['meta_data'] ?? null
    ]);
    
    if (empty($stored_base_url)) {
        throw new Exception("Base URL is not configured in API settings.");
    }
    $project_root_url = str_replace('/api', '', $stored_base_url);
    $payment_url = "{$project_root_url}/checkout.php?trx_id={$unique_id}";

    http_response_code(201);
    echo json_encode(['status' => 'success', 'payment_url' => $payment_url]);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['status' => 'error', 'message' => 'Failed to create transaction.', 'error_details' => $e->getMessage()]);
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/license_server_api.php [Text Content] ---
================================================================================

<?php
/**
 * Unified License API Server for Dashboard Project
 * Version 2.2 - Handles create, manage, details, activation, and update activation requests.
 * Includes the necessary functions file to prevent fatal errors.
 */

header('Content-Type: application/json');
require '../db_connect.php';
// লাইসেন্স তৈরির ফাংশন ফাইলটি এখানে যুক্ত করা হয়েছে, যা আগের এররটি সমাধান করে
require_once __DIR__ . '/../admin/includes/functions.php';

try {
    // API Secret Key (endpoint_key) দিয়ে অথেন্টিকেশন
    $api_key = $_POST['endpoint_key'] ?? '';
    if (empty($api_key)) {
        throw new Exception('API key is missing.', 401);
    }

    $stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
    $stmt_user->execute([$api_key]);
    $setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
    if (!$setting) {
        throw new Exception('Invalid API Key.', 403);
    }
    $user_id = $setting['user_id'];

    $action = $_POST['action'] ?? null;
    $response = ['success' => false, 'message' => 'Unknown or unsupported action.'];

    // Action: Create License (WHMCS থেকে কল হবে)
    if ($action === 'create_license') {
        $item_name = trim($_POST['item_name'] ?? '');
        $expires_at = !empty($_POST['expires_at']) ? date('Y-m-d H:i:s', strtotime($_POST['expires_at'])) : null;

        if (empty($item_name)) throw new Exception("Item name is required.", 400);

        $stmt_prod = $pdo->prepare("SELECT id, activation_limit, initial_credits FROM products WHERE user_id = ? AND item_name = ? AND status = 1");
        $stmt_prod->execute([$user_id, $item_name]);
        $product = $stmt_prod->fetch();
        if (!$product) throw new Exception("Product '{$item_name}' not found or is inactive for this user.", 404);
        
        $licenseKey = generate_license_key($pdo); // functions.php থেকে এই ফাংশনটি কল হচ্ছে
        if ($licenseKey) {
            $pdo->beginTransaction();
            $stmt_insert = $pdo->prepare("INSERT INTO licenses (user_id, product_id, license_key, status, activation_limit, expires_at) VALUES (?, ?, ?, 'active', ?, ?)");
            $stmt_insert->execute([$user_id, $product['id'], $licenseKey, $product['activation_limit'], $expires_at]);
            
            if ($product['initial_credits'] > 0) {
                $stmt_add_fund = $pdo->prepare("INSERT INTO user_funds (user_id, transaction_unique_id, amount_usd, amount_bdt, status, description) VALUES (?, ?, 0.00, ?, 'completed', ?)");
                $unique_id = 'initial_credits_' . time() . '_' . bin2hex(random_bytes(4));
                $description = "Initial credits from product: " . $item_name;
                $stmt_add_fund->execute([$user_id, $unique_id, $product['initial_credits'], $description]);
            }
            $pdo->commit();
            $response = ['success' => true, 'license_key' => $licenseKey];
        } else {
            throw new Exception("Failed to generate a unique license key.", 500);
        }
    }
    // Action: Manage License (Suspend, Terminate, etc.)
    elseif ($action === 'manage_license') {
        $license_key = $_POST['license_key'] ?? '';
        $status_action = $_POST['status_action'] ?? '';
        if (empty($license_key) || !in_array($status_action, ['suspended', 'active', 'terminated'])) throw new Exception("License key and a valid status action are required.", 400);

        $pdo->beginTransaction();
        $stmt_license = $pdo->prepare("UPDATE licenses SET status = ? WHERE license_key = ? AND user_id = ?");
        $stmt_license->execute([$status_action, $license_key, $user_id]);
        $stmt_user_sync = $pdo->prepare("UPDATE users SET license_status = ? WHERE license_key = ? AND id = ?");
        $stmt_user_sync->execute([$status_action, $license_key, $user_id]);
        $pdo->commit();
        
        $response = ['success' => true, 'message' => "License status updated to {$status_action}."];
    }
    // Action: Get License Details (for WHMCS Client Area)
    elseif ($action === 'get_license_details') {
        $license_key = $_POST['license_key'] ?? '';
        if (empty($license_key)) throw new Exception("License key is required.", 400);

        $stmt = $pdo->prepare("SELECT l.*, p.item_name, p.initial_credits FROM licenses l JOIN products p ON l.product_id = p.id WHERE l.license_key = ? AND user_id = ?");
        $stmt->execute([$license_key, $user_id]);
        $license_data = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($license_data) {
            $activations = json_decode($license_data['activations'] ?? '[]', true);
            $response = [
                'success' => true,
                'data' => [
                    'license_key' => $license_data['license_key'], 'item_name' => $license_data['item_name'],
                    'status' => $license_data['status'], 'expires_at' => $license_data['expires_at'],
                    'created_at' => $license_data['created_at'], 'activation_limit' => (int)$license_data['activation_limit'],
                    'activation_count' => count($activations), 'activations' => $activations,
                    'initial_credits' => (int)$license_data['initial_credits']
                ]
            ];
        } else {
            throw new Exception("License not found.", 404);
        }
    }
    // Action: Activate Domain (product_project থেকে কল হবে)
    elseif ($action === 'activate_domain') {
        $license_key = $_POST['license_key'] ?? '';
        $domain = $_POST['domain'] ?? '';
        if (empty($license_key) || empty($domain)) throw new Exception("License key and domain are required for activation.", 400);

        // শুধুমাত্র লাইসেন্স কী দিয়ে লাইসেন্সটি খোঁজা হচ্ছে
        $stmt = $pdo->prepare("SELECT id, activations, activation_limit FROM licenses WHERE license_key = ?");
        $stmt->execute([$license_key]);
        $license = $stmt->fetch(PDO::FETCH_ASSOC);
        if (!$license) throw new Exception("License not found.", 404);

        $activations = json_decode($license['activations'] ?? '[]', true);
        if (!isset($activations[$domain])) {
            if ($license['activation_limit'] != 0 && count($activations) >= $license['activation_limit']) throw new Exception("Activation limit has been reached.", 403);
            $activations[$domain] = ['status' => 'activated', 'activated_at' => date('Y-m-d H:i:s')];
            $stmt_update = $pdo->prepare("UPDATE licenses SET activations = ? WHERE id = ?");
            $stmt_update->execute([json_encode($activations), $license['id']]);
        }
        $response = ['success' => true, 'message' => 'Domain activated successfully.'];
    }
     // Action: Update Activations (WHMCS থেকে কল হবে)
    elseif ($action === 'update_activations') {
        $license_key = $_POST['license_key'] ?? '';
        $activations_json = $_POST['activations'] ?? '[]';
        if (empty($license_key)) throw new Exception("License key is required.", 400);

        $stmt_update = $pdo->prepare("UPDATE licenses SET activations = ? WHERE license_key = ? AND user_id = ?");
        $stmt_update->execute([$activations_json, $license_key, $user_id]);
        
        $response = ['success' => true, 'message' => 'Activations updated successfully.'];
    }
    
    echo json_encode($response);

} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) $pdo->rollBack();
    $code = is_int($e->getCode()) && $e->getCode() > 0 ? $e->getCode() : 500;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/logout_other_sessions.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Logging Out Other Browser Sessions
 * সংস্করণ: 2.1 - CORS হেডার যুক্ত করা হয়েছে।
 */

// ★★★ সমাধান: CORS পলিসি এবং প্রি-ফ্লাইট অনুরোধ হ্যান্ডেল করার জন্য হেডার যুক্ত করা হয়েছে ★★★
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-API-KEY, Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");

// ব্রাউজার থেকে pre-flight OPTIONS মেথডের অনুরোধ এলে, স্ক্রিপ্টটি এখানেই শেষ হবে
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit(0);
}

header('Content-Type: application/json');
require '../db_connect.php';

try {
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    $client_session_id = $_POST['session_id'] ?? null; // ক্লায়েন্ট থেকে পাঠানো সেশন আইডি
    $password_to_check = $_POST['password'] ?? '';

    if (empty($api_key) || empty($client_session_id) || empty($password_to_check)) {
        throw new Exception("API Key, Session ID, and Password are required.", 400);
    }

    $stmt_user = $pdo->prepare("SELECT u.id, u.password FROM users u JOIN settings s ON u.id = s.user_id WHERE s.api_key = ?");
    $stmt_user->execute([$api_key]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);
    if (!$user) throw new Exception("Invalid API Key.", 403);

    if (!password_verify($password_to_check, $user['password'])) {
        throw new Exception("The provided password does not match your account's password.", 401);
    }

    // বর্তমান সেশন (ক্লায়েন্ট থেকে পাঠানো) ছাড়া বাকি সব সেশন ডিলিট করা
    $stmt_delete = $pdo->prepare("DELETE FROM sessions WHERE user_id = ? AND id != ?");
    $stmt_delete->execute([$user['id'], $client_session_id]);
    
    echo json_encode(['success' => true, 'message' => 'All other browser sessions have been logged out.']);

} catch (Exception $e) {
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/log_transaction_fee.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Logging Transaction Fees
 * Version 3.0 - Authenticates via License Key from self-hosted instances.
 */

header('Content-Type: application/json');
require '../db_connect.php';

// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
// ★★★      মূল সমাধান: এখন এই ফাইলটি লাইসেন্স কী দিয়ে ব্যবহারকারীকে শনাক্ত করবে      ★★★
// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

try {
    // ধাপ ১: product_project থেকে পাঠানো লাইসেন্স কী এবং ট্রানজেকশন আইডি গ্রহণ করা
    $license_key = $_POST['license_key'] ?? '';
    $transaction_db_id_from_product = $_POST['transaction_db_id'] ?? null;

    if (empty($license_key)) {
        throw new Exception("Authentication failed: License Key is missing.", 401);
    }
    if (empty($transaction_db_id_from_product)) {
        throw new Exception("Bad Request: Transaction DB ID is missing.", 400);
    }

    // ধাপ ২: লাইসেন্স কী ব্যবহার করে مرکزی ডাটাবেস থেকে user_id খুঁজে বের করা
    $stmt_user = $pdo->prepare("SELECT id FROM users WHERE license_key = ?");
    $stmt_user->execute([$license_key]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$user) {
        throw new Exception("Authentication failed: Invalid License Key.", 403);
    }
    $user_id = $user['id'];
    
    // ধাপ ৩: ডাটাবেস ট্রানজেকশন শুরু করা
    $pdo->beginTransaction();
    
    // ধাপ ৪: মূল ফি কাটার ফাংশনটি কল করা
    deduct_fee_and_log($pdo, $user_id, $transaction_db_id_from_product);
    
    // যদি কোনো Exception না হয়, তাহলে পরিবর্তনগুলো স্থায়ীভাবে সেভ করা
    $pdo->commit();
    
    // ধাপ ৫: সফল বার্তা পাঠানো
    echo json_encode(['success' => true, 'message' => 'Fee logged successfully.']);

} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    $code = is_int($e->getCode()) && $e->getCode() >= 400 ? $e->getCode() : 500;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => 'Central Server Error: ' . $e->getMessage()]);
}

/**
 * ব্যবহারকারীর ক্রেডিট ব্যালেন্স থেকে ফি কাটার সম্পূর্ণ প্রক্রিয়া পরিচালনা করে।
 * @param PDO $pdo ডাটাবেস অবজেক্ট
 * @param int $user_id যে ব্যবহারকারীর ফি কাটা হবে
 * @param int $transaction_db_id_from_product ক্লায়েন্ট সাইটের ট্রানজেকশন আইডি (লগিং এর জন্য)
 * @return void
 * @throws Exception যদি ব্যবহারকারীর অ্যাকাউন্টে পর্যাপ্ত ক্রেডিট না থাকে
 */
function deduct_fee_and_log($pdo, $user_id, $transaction_db_id_from_product) {
    // ক) মোট কত ক্রেডিট আছে তা গণনা করা
    $free_credits = 50;
    $stmt_purchased = $pdo->prepare("SELECT COALESCE(SUM(amount_bdt), 0) as total_purchased FROM user_funds WHERE user_id = ? AND status = 'completed' AND transaction_unique_id LIKE 'manual_purchase_%'");
    $stmt_purchased->execute([$user_id]);
    $purchased_credits = $stmt_purchased->fetchColumn();
    $total_available_credits = $free_credits + $purchased_credits;

    // খ) কত ক্রেডিট ব্যবহার হয়েছে তা গণনা করা (ডাটাবেস লক করে)
    $stmt_used = $pdo->prepare("SELECT COUNT(id) FROM credit_transactions WHERE user_id = ? FOR UPDATE");
    $stmt_used->execute([$user_id]);
    $used_credits = $stmt_used->fetchColumn();

    // গ) ক্রেডিট যথেষ্ট না থাকলে Exception throw করা
    if ($used_credits >= $total_available_credits) {
        throw new Exception("Insufficient credits to cover transaction fee. Please purchase more credits in the billing section.", 402);
    }

    // ঘ) ফি-এর পরিমাণ নির্ধারণ এবং credit_transactions টেবিলে লগ করা
    $fee_bdt = '1.00';
    $fee_usd = bcdiv($fee_bdt, '120', 4);
    
    // এখানে payment_transaction_id হিসেবে product_project-এর ট্রানজেকশন আইডি সেভ করা হচ্ছে
    $stmt_log = $pdo->prepare(
        "INSERT INTO credit_transactions (user_id, payment_transaction_id, cost_bdt, cost_usd, credits_deducted, description)
         VALUES (?, ?, ?, ?, 1, 'API Payment Verification Fee')"
    );
    // লক্ষ্য করুন: দ্বিতীয় প্যারামিটারে এখন product_project-এর আইডি ব্যবহৃত হচ্ছে
    $stmt_log->execute([$user_id, $transaction_db_id_from_product, $fee_bdt, $fee_usd]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/purchase_credits.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Purchasing Credits from Account Balance
 *
 * This script is designed to be robust and handle requests from two different sources:
 * 1. The native Android application, which authenticates using an API Key in the HTTP headers.
 * 2. The web-based dashboard, which authenticates using a standard PHP session.
 *
 * It processes the credit purchase, deducts the cost from the user's balance,
 * logs the transaction, and returns a context-aware success or error message in JSON format.
 *
 * @version 3.0 (Production Ready - Complete & Unabridged)
 */

// Step 1: Set the content type to JSON for all responses to ensure consistency.
header('Content-Type: application/json');

// Step 2: Include the database connection file. This is essential for all database operations.
require '../db_connect.php';

// Step 3: Start a PHP session if one is not already active.
// This is crucial for authenticating requests coming from the web dashboard.
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// Initialize variables that will be determined by the authentication process.
$user_id = null;
$request_source = 'unknown'; // This will help in sending the correct success message.

// --- Step 4: Dual Authentication Logic ---
// This is the core logic to identify the user from either the app or the web.

// First, check for an API key in the request headers. This is the method used by the Android app.
if (isset($_SERVER['HTTP_X_API_KEY']) && !empty($_SERVER['HTTP_X_API_KEY'])) {
    
    $api_key = $_SERVER['HTTP_X_API_KEY'];
    
    // Find the user associated with the provided API key from the 'settings' table.
    $stmt_user_lookup = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
    $stmt_user_lookup->execute([$api_key]);
    $setting = $stmt_user_lookup->fetch(PDO::FETCH_ASSOC);
    
    if ($setting) {
        $user_id = $setting['user_id'];
        $request_source = 'app'; // Mark the request source as 'app'.
    } else {
        // If the API key is provided but is not valid, deny access.
        http_response_code(403); // 403 Forbidden
        die(json_encode(['success' => false, 'message' => 'Invalid API Key provided. Authentication failed.']));
    }
} 
// If no API key is found, check if a user is logged into the web dashboard via a PHP session.
else if (isset($_SESSION['user_id'])) {
    
    $user_id = $_SESSION['user_id'];
    $request_source = 'web'; // Mark the request source as 'web'.
}

// If after both checks, no user could be identified, deny access.
if ($user_id === null) {
    http_response_code(401); // 401 Unauthorized
    die(json_encode(['success' => false, 'message' => 'Authentication failed. An API Key or an active user session is required.']));
}

// --- Step 5: Data Input Handling ---
// This section retrieves the number of credits to purchase from either a web form or a JSON request.

// Define the conversion rate.
define('USD_TO_BDT_RATE', 120);

$credits_to_purchase = 0;

// Check for data from a standard web form (x-www-form-urlencoded).
if (!empty($_POST['credits'])) {
    $credits_to_purchase = (int)$_POST['credits'];
} 
// If not found, check for data from a JSON request body (raw).
else {
    $json_data = file_get_contents('php://input');
    $data = json_decode($json_data, true);
    if (isset($data['credits'])) {
        $credits_to_purchase = (int)$data['credits'];
    }
}

// Validate that the number of credits is a positive number.
if ($credits_to_purchase <= 0) {
    http_response_code(400); // 400 Bad Request
    echo json_encode(['success' => false, 'message' => 'Please provide a valid, positive number of credits to purchase.']);
    exit();
}

// Calculate the cost in both BDT and USD.
$cost_bdt = $credits_to_purchase; // Business logic: 1 Credit = 1 BDT
$cost_usd = $cost_bdt / USD_TO_BDT_RATE;

// --- Step 6: Database Transaction Logic ---
// This is a critical section. Using a transaction ensures data integrity.

try {
    // Start a database transaction. All subsequent queries must succeed, or all will be rolled back.
    $pdo->beginTransaction();

    // Get the user's current balance. 'FOR UPDATE' locks the row to prevent other simultaneous transactions from reading stale data.
    $stmt_user = $pdo->prepare("SELECT balance FROM users WHERE id = ? FOR UPDATE");
    $stmt_user->execute([$user_id]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$user) {
        throw new Exception("User account not found in the database.");
    }
    if ($user['balance'] < $cost_usd) {
        throw new Exception("Insufficient balance to complete the purchase. Please add funds to your account first.");
    }

    // Deduct the cost from the user's main balance.
    $stmt_deduct = $pdo->prepare("UPDATE users SET balance = balance - ? WHERE id = ?");
    $stmt_deduct->execute([$cost_usd, $user_id]);

    // Create a unique transaction ID for logging this specific purchase.
    $transaction_unique_id = 'manual_purchase_' . time() . '_' . bin2hex(random_bytes(4));
    
    // Log the transaction in the `user_funds` table. This is how the system knows how many credits were purchased.
    $stmt_add_fund = $pdo->prepare(
        "INSERT INTO user_funds (user_id, transaction_unique_id, amount_usd, amount_bdt, status) 
         VALUES (?, ?, ?, ?, 'completed')"
    );
    $stmt_add_fund->execute([$user_id, $transaction_unique_id, $cost_usd, $cost_bdt]);
    
    // If all database operations were successful, commit the changes permanently.
    $pdo->commit();

    // --- Step 7: Send Context-Aware Success Response ---
    
    $success_message = '';
    if ($request_source === 'app') {
        // A simple, clear message for the Android app.
        $success_message = 'Credits purchased successfully!';
    } else {
        // A message indicating a page reload for the web dashboard.
        $success_message = 'Credits purchased successfully. The page will now reload.';
    }

    echo json_encode(['success' => true, 'message' => $success_message]);

} catch (Exception $e) {
    // If any error occurred during the 'try' block, roll back all database changes.
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    // Send a user-friendly error message in a JSON response.
    http_response_code(400); // 400 Bad Request is appropriate for business logic failures (e.g., insufficient funds).
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/qr_login.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Validating QR Code Login Token (Central Server)
 * Version 3.1 - Now returns account_status and username along with user_id.
 */

header('Content-Type: application/json');
require '../db_connect.php';

$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);

$email = $data['email'] ?? '';
$token = $data['token'] ?? '';

if (empty($email) || empty($token)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Email and token are required.']);
    exit();
}

try {
    // ★★★ মূল পরিবর্তন: এখন id, username এবং account_status সিলেক্ট করা হচ্ছে ★★★
    $stmt = $pdo->prepare("SELECT id, username, account_status FROM users WHERE email = ? AND app_auth_token = ?");
    $stmt->execute([$email, $token]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user) {
        // টোকেন সঠিক হলে, এটিকে একবার ব্যবহারের পর নষ্ট করে দেওয়া হচ্ছে
        $stmt_invalidate = $pdo->prepare("UPDATE users SET app_auth_token = NULL WHERE id = ?");
        $stmt_invalidate->execute([$user['id']]);

        // ★★★ মূল পরিবর্তন: রেসপন্সে এখন account_status এবং username যুক্ত করা হয়েছে ★★★
        echo json_encode([
            'success' => true,
            'message' => 'Token validation successful.',
            'user_id' => $user['id'],
            'name'    => $user['username'],
            'account_status' => $user['account_status']
        ]);

    } else {
        // টোকেন ভুল বা ব্যবহারকারী খুঁজে না পাওয়া গেলে
        http_response_code(401);
        echo json_encode(['success' => false, 'message' => 'Invalid or expired QR token on central server.']);
    }

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Central server database error.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/receive_transaction.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// হেডার থেকে API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';

if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

// API Key ব্যবহার করে user_id খুঁজে বের করা
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// অ্যাপ থেকে পাঠানো JSON ডেটা পড়া
$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);

// ডেটা ভ্যালিডেশন
$sender_number = $data['sender_number'] ?? null;
$amount = $data['amount'] ?? null;
$transaction_id = $data['transaction_id'] ?? null;
$full_message = $data['full_message'] ?? null;

if (empty($sender_number) || empty($full_message)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Sender number and full message are required.']);
    exit();
}

// ডেটাবেসে তথ্য সংরক্ষণ করা
try {
    $sql = "INSERT INTO sms_transactions (user_id, sender_number, amount, transaction_id, full_message) 
            VALUES (:user_id, :sender_number, :amount, :transaction_id, :full_message)";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':user_id' => $user_id,
        ':sender_number' => $sender_number,
        ':amount' => $amount,
        ':transaction_id' => $transaction_id,
        ':full_message' => $full_message
    ]);

    echo json_encode(['success' => true, 'message' => 'Transaction data received and stored successfully.']);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error during transaction storage.']);
}

================================================================================
--- ফাইল পাথ (File Path): api/register_device.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// হেডার থেকে API Key নেওয়া হচ্ছে (X-API-KEY)
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';

if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

// API Key দিয়ে user_id খুঁজে বের করা হচ্ছে
$stmt = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt->execute([$api_key]);
$setting = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}

$user_id = $setting['user_id'];

// অ্যাপ থেকে পাঠানো JSON ডেটা পড়া হচ্ছে
$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);

// প্রয়োজনীয় তথ্য ভ্যারিয়েবলে রাখা হচ্ছে
$device_uid = $data['device_uid'] ?? null; // Secure Android ID
$device_name = $data['device_name'] ?? 'Unknown';
$device_model = $data['device_model'] ?? 'Unknown';
$android_version = $data['android_version'] ?? 'Unknown';
$app_version = $data['app_version'] ?? 'Unknown';

if (!$device_uid) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Device UID is required.']);
    exit();
}

// ডেটাবেসে ডিভাইস রেজিস্টার বা আপডেট করা হচ্ছে
// ON DUPLICATE KEY UPDATE ব্যবহার করায় একই ডিভাইস বারবার রেজিস্টার হবে না, শুধু আপডেট হবে
$sql = "INSERT INTO devices (user_id, device_id, device_name, device_model, android_version, app_version, status) 
        VALUES (:user_id, :device_id, :device_name, :device_model, :android_version, :app_version, 'CONNECTED')
        ON DUPLICATE KEY UPDATE 
        user_id = :user_id, device_name = :device_name, device_model = :device_model, 
        android_version = :android_version, app_version = :app_version, status = 'CONNECTED'";

try {
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        'user_id' => $user_id,
        'device_id' => $device_uid,
        'device_name' => $device_name,
        'device_model' => $device_model,
        'android_version' => $android_version,
        'app_version' => $app_version
    ]);

    echo json_encode(['success' => true, 'message' => 'Device registered successfully.']);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error on device registration.', 'error' => $e->getMessage()]);
}

================================================================================
--- ফাইল পাথ (File Path): api/report_update_status.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

try {
    $license_key = $_POST['license_key'] ?? '';
    $update_id = $_POST['update_id'] ?? null;
    $status = $_POST['status'] ?? ''; // 'installed' or 'failed'

    if (empty($license_key) || empty($update_id) || !in_array($status, ['installed', 'failed'])) {
        throw new Exception('Required parameters are missing or invalid.', 400);
    }
    
    $stmt_user = $pdo->prepare("SELECT id FROM users WHERE license_key = ?");
    $stmt_user->execute([$license_key]);
    $user = $stmt_user->fetch();
    
    if (!$user) {
        throw new Exception('Invalid license key.', 403);
    }
    $user_id = $user['id'];

    $sql = "UPDATE update_assignments SET status = ?, installed_at = NOW() WHERE update_id = ? AND user_id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$status, $update_id, $user_id]);

    echo json_encode(['success' => true, 'message' => 'Status reported successfully.']);

} catch (Exception $e) {
    http_response_code($e->getCode() ?: 500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/restore_sms_data.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];
$sms_id = $_POST['id'] ?? null;

if (!$sms_id) {
    http_response_code(400);
    die(json_encode(['success' => false, 'message' => 'SMS Record ID is required.']));
}

try {
    // is_trashed ফ্ল্যাগটি 0-এ সেট করে পুনরুদ্ধার করা হচ্ছে
    $sql = "UPDATE sms_transactions SET is_trashed = 0 WHERE id = :id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':id' => $sms_id, ':user_id' => $user_id]);

    if ($stmt->rowCount() > 0) {
        echo json_encode(['success' => true, 'message' => 'Record restored successfully.']);
    } else {
        echo json_encode(['success' => false, 'message' => 'Record not found or permission denied.']);
    }
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.']);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/save_general_settings.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting_user = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting_user) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting_user['user_id'];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = $_POST['action'] ?? null;

    try {
        if ($action === 'save_general') {
            $site_name = trim($_POST['site_name']);
            $timezone = $_POST['timezone'];
            $default_currency = $_POST['default_currency'];
            $currency_symbol = ($default_currency === 'BDT') ? '৳' : '$';
            $default_language = $_POST['default_language'];
            $week_starts_on = $_POST['week_starts_on'];

            $sql = "INSERT INTO brand_settings (user_id, site_name, timezone, default_currency, currency_symbol, default_language, week_starts_on) 
                    VALUES (:uid, :s_name, :tz, :def_curr, :curr_sym, :def_lang, :w_start)
                    ON DUPLICATE KEY UPDATE 
                    site_name = :s_name, timezone = :tz, default_currency = :def_curr, 
                    currency_symbol = :curr_sym, default_language = :def_lang, week_starts_on = :w_start";
            
            $stmt = $pdo->prepare($sql);
            $stmt->execute([
                ':uid' => $user_id, ':s_name' => $site_name, ':tz' => $timezone, 
                ':def_curr' => $default_currency, ':curr_sym' => $currency_symbol, 
                ':def_lang' => $default_language, ':w_start' => $week_starts_on
            ]);
            echo json_encode(['success' => true, 'message' => 'General settings saved successfully!']);

        } elseif ($action === 'save_branding') {
            $colors = [
                'user_id' => $user_id, 'global_text_color' => $_POST['global_text_color'],
                'primary_button_color' => $_POST['primary_button_color'], 'button_text_color' => $_POST['button_text_color'],
                'button_hover_color' => $_POST['button_hover_color'], 'button_hover_text_color' => $_POST['button_hover_text_color'],
                'navigation_background' => $_POST['navigation_background'], 'navigation_text_color' => $_POST['navigation_text_color'],
                'active_tab_color' => $_POST['active_tab_color'], 'active_tab_text_color' => $_POST['active_tab_text_color']
            ];
            $sql_colors = "INSERT INTO brand_colors (user_id, global_text_color, primary_button_color, button_text_color, button_hover_color, button_hover_text_color, navigation_background, navigation_text_color, active_tab_color, active_tab_text_color)
                           VALUES (:user_id, :global_text_color, :primary_button_color, :button_text_color, :button_hover_color, :button_hover_text_color, :navigation_background, :navigation_text_color, :active_tab_color, :active_tab_text_color)
                           ON DUPLICATE KEY UPDATE 
                           global_text_color = :global_text_color, primary_button_color = :primary_button_color, button_text_color = :button_text_color, 
                           button_hover_color = :button_hover_color, button_hover_text_color = :button_hover_text_color, navigation_background = :navigation_background, 
                           navigation_text_color = :navigation_text_color, active_tab_color = :active_tab_color, active_tab_text_color = :active_tab_text_color";
            $stmt = $pdo->prepare($sql_colors);
            $stmt->execute($colors);
            echo json_encode(['success' => true, 'message' => 'Branding settings saved successfully!']);

        } elseif ($action === 'save_business') {
            $details = [
                'user_id' => $user_id, 'street_address' => trim($_POST['street_address']),
                'city' => trim($_POST['city']), 'postal_code' => trim($_POST['postal_code']),
                'country' => $_POST['country']
            ];
            $sql_details = "INSERT INTO business_details (user_id, street_address, city, postal_code, country)
                            VALUES (:user_id, :street_address, :city, :postal_code, :country)
                            ON DUPLICATE KEY UPDATE 
                            street_address = :street_address, city = :city, postal_code = :postal_code, country = :country";
            $stmt = $pdo->prepare($sql_details);
            $stmt->execute($details);
            echo json_encode(['success' => true, 'message' => 'Business details saved successfully!']);

        } elseif ($action === 'save_contact') {
            $support_info = [
                'user_id' => $user_id, 'support_phone' => trim($_POST['support_phone']),
                'support_email' => trim($_POST['support_email']), 'support_website' => trim($_POST['support_website'])
            ];
            $sql_support = "INSERT INTO support_details (user_id, support_phone, support_email, support_website)
                            VALUES (:user_id, :support_phone, :support_email, :support_website)
                            ON DUPLICATE KEY UPDATE 
                            support_phone = :support_phone, support_email = :support_email, support_website = :support_website";
            $stmt = $pdo->prepare($sql_support);
            $stmt->execute($support_info);
            echo json_encode(['success' => true, 'message' => 'Contact info saved successfully!']);
        } else {
            http_response_code(400);
            echo json_encode(['success' => false, 'message' => 'No valid action specified.']);
        }
    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
    }
} else {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Invalid request method.']);
}

================================================================================
--- ফাইল পাথ (File Path): api/sync_transaction.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Syncing Transactions and Handling Fee Deduction
 * Version 2.3 - Final fix for HY093 Invalid parameter number error during UPDATE.
 */

header('Content-Type: application/json');
require '../db_connect.php'; // dashboard_project's database connection

/**
 * ডিবাগিং-এর জন্য লগ মেসেজ লেখার ফাংশন।
 */
function log_message($message) {
    $log_file = __DIR__ . '/sync_log.txt';
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents($log_file, "[$timestamp] " . $message . "\n", FILE_APPEND);
}

/**
 * ব্যবহারকারীর ক্রেডিট ব্যালেন্স থেকে ফি কাটার ফাংশন।
 */
function deduct_fee_and_log($pdo, $user_id, $product_project_transaction_id) {
    $free_credits = 50;
    $stmt_purchased = $pdo->prepare("SELECT COALESCE(SUM(amount_bdt), 0) FROM user_funds WHERE user_id = ? AND status = 'completed' AND transaction_unique_id LIKE 'manual_purchase_%'");
    $stmt_purchased->execute([$user_id]);
    $purchased_credits = $stmt_purchased->fetchColumn();
    $total_available_credits = $free_credits + $purchased_credits;

    $stmt_used = $pdo->prepare("SELECT COUNT(id) FROM credit_transactions WHERE user_id = ? FOR UPDATE");
    $stmt_used->execute([$user_id]);
    $used_credits = $stmt_used->fetchColumn();

    if ($used_credits >= $total_available_credits) {
        log_message("Credit Deduction SKIPPED for user_id {$user_id}: Insufficient credits.");
        return; 
    }

    $fee_bdt = '1.00';
    $fee_usd = bcdiv($fee_bdt, '120', 4);
    
    $stmt_log = $pdo->prepare(
        "INSERT INTO credit_transactions (user_id, payment_transaction_id, cost_bdt, cost_usd, credits_deducted, description)
         VALUES (?, ?, ?, ?, 1, 'API Payment Verification Fee')"
    );
    $stmt_log->execute([$user_id, $product_project_transaction_id, $fee_bdt, $fee_usd]);
    log_message("Credit deducted successfully for user_id {$user_id}, transaction_id {$product_project_transaction_id}.");
}

// --- মূল API কোড শুরু ---
log_message("--- New Sync Request Received ---");
log_message("POST Data: " . print_r($_POST, true));

try {
    $license_key = $_POST['license_key'] ?? '';
    $transaction_data = $_POST['transaction'] ?? null;

    if (empty($license_key) || empty($transaction_data)) {
        throw new Exception("Authentication failed: License Key or transaction data is missing.", 401);
    }

    $transaction = json_decode($transaction_data, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new Exception("Bad Request: Invalid transaction data format. Error: " . json_last_error_msg(), 400);
    }
    log_message("Transaction data parsed successfully for unique_id: " . ($transaction['unique_id'] ?? 'N/A'));

    $stmt_user = $pdo->prepare("SELECT id FROM users WHERE license_key = ?");
    $stmt_user->execute([$license_key]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$user) {
        throw new Exception("Authentication failed: Invalid License Key.", 403);
    }
    $user_id_central = $user['id'];
    log_message("License key authenticated for user_id: " . $user_id_central);

    if ($user_id_central != $transaction['user_id']) {
        throw new Exception("Forbidden: Data mismatch - User ID does not match the license key owner.", 403);
    }

    $pdo->beginTransaction();
    
    // আগের ট্রানজেকশনটি আছে কিনা তা খুঁজে বের করা
    $stmt_find = $pdo->prepare("SELECT id, status FROM transactions WHERE user_id = ? AND unique_id = ?");
    $stmt_find->execute([$user_id_central, $transaction['unique_id']]);
    $existing_transaction = $stmt_find->fetch(PDO::FETCH_ASSOC);
    
    // INSERT এবং UPDATE উভয়ের জন্য ব্যবহৃত হবে এমন প্যারামিটারগুলো প্রস্তুত করা
    $params = [
        ':amount' => $transaction['amount'], ':customer_name' => $transaction['customer_name'] ?? null,
        ':customer_email' => $transaction['customer_email'] ?? null, ':phone' => $transaction['phone'] ?? null,
        ':address' => $transaction['address'] ?? null, ':city' => $transaction['city'] ?? null,
        ':state' => $transaction['state'] ?? null, ':postcode' => $transaction['postcode'] ?? null,
        ':country' => $transaction['country'] ?? null, ':status' => $transaction['status'],
        ':meta_data' => $transaction['meta_data'] ?? null, ':user_submitted_trxid' => $transaction['user_submitted_trxid'] ?? null
    ];

    if ($existing_transaction) {
        // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
        // ★★★      মূল সমাধান: UPDATE কোয়ারি এবং তার প্যারামিটারগুলো সংশোধন করা হয়েছে      ★★★
        // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
        $sql = "UPDATE transactions SET 
                    amount = :amount, customer_name = :customer_name, customer_email = :customer_email, 
                    phone = :phone, address = :address, city = :city, state = :state, 
                    postcode = :postcode, country = :country, status = :status, 
                    meta_data = :meta_data, user_submitted_trxid = :user_submitted_trxid 
                WHERE id = :id";
        
        // UPDATE-এর জন্য শুধুমাত্র id প্যারামিটারটি অতিরিক্ত যোগ করা হচ্ছে
        $params[':id'] = $existing_transaction['id'];
        log_message("Existing transaction found. Updating record ID: " . $existing_transaction['id']);

    } else {
        // যদি না থাকে, তবে INSERT করা হবে
        $sql = "INSERT INTO transactions (
                    user_id, unique_id, amount, customer_name, customer_email, 
                    phone, address, city, state, postcode, country, 
                    status, meta_data, user_submitted_trxid, created_at
                ) VALUES (
                    :user_id, :unique_id, :amount, :customer_name, :customer_email, 
                    :phone, :address, :city, :state, :postcode, :country, 
                    :status, :meta_data, :user_submitted_trxid, :created_at
                )";

        // INSERT-এর জন্য অতিরিক্ত প্যারামিটারগুলো যোগ করা হচ্ছে
        $params[':user_id'] = $transaction['user_id'];
        $params[':unique_id'] = $transaction['unique_id'];
        $params[':created_at'] = $transaction['created_at'];
        log_message("New transaction. Inserting new record.");
    }
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    
    // যদি ট্রানজেকশনটি 'completed' হয় এবং আগে 'pending' ছিল, তবেই ফি কাটা হবে
    $was_pending = $existing_transaction && $existing_transaction['status'] === 'pending';
    if ($transaction['status'] === 'completed' && (!$existing_transaction || $was_pending)) {
        log_message("Transaction is 'completed'. Checking if fee deduction is needed.");
        // product_project-এর ডাটাবেস থেকে পাওয়া 'id' ব্যবহার করা হচ্ছে
        $transaction_id_for_fee = $existing_transaction ? $existing_transaction['id'] : $pdo->lastInsertId();
        deduct_fee_and_log($pdo, $user_id_central, $transaction_id_for_fee);
    }

    $pdo->commit();
    log_message("Database operations committed successfully.");
    
    echo json_encode(['success' => true, 'message' => 'Transaction synced successfully.']);

} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    log_message("!!! SYNC FAILED !!! Error: " . $e->getMessage());
    $code = is_int($e->getCode()) && $e->getCode() >= 400 ? $e->getCode() : 500;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => 'Sync Error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/update_device_status.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// হেডার থেকে API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';

if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

// API Key ব্যবহার করে user_id খুঁজে বের করা
$stmt = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt->execute([$api_key]);
$setting = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// অ্যাপ থেকে পাঠানো JSON ডেটা পড়া
$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);

$device_uid = $data['device_uid'] ?? null;
$status = $data['status'] ?? null;

if (empty($device_uid) || empty($status)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Device UID and status are required.']);
    exit();
}

// ডেটাবেসে ডিভাইসের স্ট্যাটাস আপডেট করা
// এখানে user_id দিয়েও পরীক্ষা করা হচ্ছে যাতে এক ব্যবহারকারী অন্য ব্যবহারকারীর ডিভাইস আপডেট করতে না পারে
try {
    $sql = "UPDATE devices SET status = :status WHERE device_id = :device_id AND user_id = :user_id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        'status' => $status,
        'device_id' => $device_uid,
        'user_id' => $user_id
    ]);

    if ($stmt->rowCount() > 0) {
        echo json_encode(['success' => true, 'message' => 'Device status updated successfully.']);
    } else {
        http_response_code(404);
        echo json_encode(['success' => false, 'message' => 'Device not found for this user.']);
    }
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error during status update.']);
}

================================================================================
--- ফাইল পাথ (File Path): api/update_password.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

try {
    // ক্লায়েন্ট থেকে পাঠানো API Key দিয়ে ব্যবহারকারীকে শনাক্ত করা
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    if (empty($api_key)) {
        throw new Exception("API Key is missing.", 401);
    }

    $stmt_user = $pdo->prepare("SELECT u.id, u.password FROM users u JOIN settings s ON u.id = s.user_id WHERE s.api_key = ?");
    $stmt_user->execute([$api_key]);
    $user = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$user) {
        throw new Exception("Invalid API Key.", 403);
    }
    $user_id = $user['id'];

    // فرم থেকে পাসওয়ার্ডগুলো গ্রহণ করা
    $current_password = $_POST['current_password'] ?? '';
    $new_password = $_POST['new_password'] ?? '';
    $confirm_password = $_POST['confirm_password'] ?? '';

    // ভ্যালিডেশন
    if (empty($current_password) || empty($new_password) || empty($confirm_password)) {
        throw new Exception("All password fields are required.", 400);
    }
    if ($new_password !== $confirm_password) {
        throw new Exception("New password and confirm password do not match.", 400);
    }
    if (strlen($new_password) < 6) {
        throw new Exception("New password must be at least 6 characters long.", 400);
    }

    // বর্তমান পাসওয়ার্ড সঠিক কিনা তা যাচাই করা
    if (!password_verify($current_password, $user['password'])) {
        throw new Exception("The current password you entered is incorrect.", 401);
    }

    // নতুন পাসওয়ার্ড হ্যাশ করে ডাটাবেসে আপডেট করা
    $new_hashed_password = password_hash($new_password, PASSWORD_DEFAULT);
    $stmt_update = $pdo->prepare("UPDATE users SET password = ? WHERE id = ?");
    $stmt_update->execute([$new_hashed_password, $user_id]);

    echo json_encode(['success' => true, 'message' => 'Password updated successfully.']);

} catch (Exception $e) {
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/update_profile.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

try {
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    if (empty($api_key)) {
        throw new Exception("API Key is missing.", 401);
    }

    $stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
    $stmt_user->execute([$api_key]);
    $setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if (!$setting) {
        throw new Exception("Invalid API Key.", 403);
    }
    $user_id = $setting['user_id'];

    // فرم থেকে নতুন নাম ও ইমেইল গ্রহণ
    $name = $_POST['name'] ?? '';
    $email = $_POST['email'] ?? '';

    if (empty($name) || empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new Exception("Valid name and email are required.", 400);
    }

    // নতুন ইমেইলটি অন্য কোনো ব্যবহারকারী ব্যবহার করছে কিনা তা যাচাই করা
    $stmt_check_email = $pdo->prepare("SELECT id FROM users WHERE email = ? AND id != ?");
    $stmt_check_email->execute([$email, $user_id]);
    if ($stmt_check_email->fetch()) {
        throw new Exception("This email address is already in use by another account.", 409);
    }

    // ব্যবহারকারীর তথ্য আপডেট করা
    $stmt_update = $pdo->prepare("UPDATE users SET username = ?, email = ? WHERE id = ?");
    $stmt_update->execute([$name, $email, $user_id]);

    echo json_encode(['success' => true, 'message' => 'Profile updated successfully.']);

} catch (Exception $e) {
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/update_session_userid.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

try {
    $session_id = $_POST['session_id'] ?? null;
    $user_id = $_POST['user_id'] ?? null;

    if (empty($session_id) || empty($user_id)) {
        throw new Exception("Session ID and User ID are required.", 400);
    }
    
    // নির্দিষ্ট সেশন আইডির জন্য user_id আপডেট করা হচ্ছে
    $stmt = $pdo->prepare("UPDATE sessions SET user_id = ? WHERE id = ?");
    $stmt->execute([$user_id, $session_id]);

    if ($stmt->rowCount() > 0) {
        echo json_encode(['success' => true, 'message' => 'Session user ID updated.']);
    } else {
        throw new Exception("Session not found or user ID was already set.", 404);
    }

} catch (Exception $e) {
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/upload_brand_images.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// API Key Authentication
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting_user = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting_user) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting_user['user_id'];

$upload_dir = "../uploads/logos/{$user_id}/";
if (!is_dir($upload_dir)) {
    mkdir($upload_dir, 0777, true);
}

// Fetch current logos to delete old files if new ones are uploaded
$stmt_fetch = $pdo->prepare("SELECT primary_logo, round_logo, favicon FROM brand_logos WHERE user_id = ?");
$stmt_fetch->execute([$user_id]);
$current_logos = $stmt_fetch->fetch(PDO::FETCH_ASSOC) ?: [];

function handle_upload($file_key, $upload_dir, $current_path) {
    global $_POST;
    // Check if removal is requested
    if (!empty($_POST['remove_' . $file_key]) && $_POST['remove_' . $file_key] === '1') {
        if ($current_path && file_exists("../" . $current_path)) {
            unlink("../" . $current_path);
        }
        return null; // Return null to clear the database field
    }

    // Handle file upload
    if (isset($_FILES[$file_key]) && $_FILES[$file_key]['error'] === UPLOAD_ERR_OK) {
        // Delete old file first
        if ($current_path && file_exists("../" . $current_path)) {
            unlink("../" . $current_path);
        }
        $file = $_FILES[$file_key];
        $file_ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        $new_filename = $file_key . '_' . time() . '.' . $file_ext;
        $destination = $upload_dir . $new_filename;
        if (move_uploaded_file($file['tmp_name'], $destination)) {
            // Return path relative to the project root, not the api folder
            return str_replace('../', '', $destination);
        }
    }
    return $current_path; // Return old path if no new file/action
}

$primary_logo_path = handle_upload('primary_logo', $upload_dir, $current_logos['primary_logo'] ?? null);
$round_logo_path = handle_upload('round_logo', $upload_dir, $current_logos['round_logo'] ?? null);
$favicon_path = handle_upload('favicon', $upload_dir, $current_logos['favicon'] ?? null);

try {
    $sql = "INSERT INTO brand_logos (user_id, primary_logo, round_logo, favicon) 
            VALUES (:user_id, :p_logo, :r_logo, :fav)
            ON DUPLICATE KEY UPDATE 
            primary_logo = :p_logo, round_logo = :r_logo, favicon = :fav";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':user_id' => $user_id, 
        ':p_logo' => $primary_logo_path, 
        ':r_logo' => $round_logo_path, 
        ':fav' => $favicon_path
    ]);

    echo json_encode(['success' => true, 'message' => 'Logos updated successfully!']);
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error: ' . $e->getMessage()]);
}

================================================================================
--- ফাইল পাথ (File Path): api/validate_login.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Validating User Login
 * সংস্করণ: 3.2 - Now checks and returns 'account_status' instead of 'license_status' for login validation.
 */

header('Content-Type: application/json');
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    exit(0);
}

require '../db_connect.php';

try {
    // ক্লায়েন্ট থেকে পাঠানো তথ্য গ্রহণ করা
    $username = $_POST['username'] ?? ''; // এটি ক্লায়েন্ট থেকে আসা email
    $password = $_POST['password'] ?? '';
    $license_key = $_POST['license_key'] ?? ''; 
    $client_session_id = $_POST['session_id'] ?? null;
    $user_agent = $_POST['user_agent'] ?? 'UNKNOWN';

    if (empty($username) || empty($password) || empty($license_key) || empty($client_session_id)) {
        throw new Exception('Username, password, license key, and session ID are required.', 400);
    }

    // ★★★ মূল পরিবর্তন: এখন license_status এর পরিবর্তে account_status সিলেক্ট করা হচ্ছে ★★★
    $stmt = $pdo->prepare(
        "SELECT id, password, username, email, account_status, suspended_until, two_factor_enabled 
         FROM users 
         WHERE email = ? AND license_key = ?"
    );
    $stmt->execute([$username, $license_key]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user && password_verify($password, $user['password'])) {
        
        // পাসওয়ার্ড সঠিক হলেই সেশন টেবিলে এই লগইনের তথ্য সংরক্ষণ বা আপডেট করা হচ্ছে
        $sql = "REPLACE INTO sessions (id, user_id, ip_address, user_agent, last_activity) VALUES (?, ?, ?, ?, ?)";
        $stmt_session = $pdo->prepare($sql);
        $stmt_session->execute([
            $client_session_id,
            $user['id'],
            $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN',
            $user_agent,
            time()
        ]);

        // 2FA সক্রিয় আছে কিনা তা যাচাই করা
        if ($user['two_factor_enabled']) {
            echo json_encode([
                'success' => true, 
                '2fa_required' => true,
                'user_id' => $user['id']
            ]);
            exit();
        }
        
        // ক্লায়েন্টের জন্য প্রয়োজনীয় বাকি তথ্য পাঠানো
        $stmt_key = $pdo->prepare("SELECT api_key FROM settings WHERE user_id = ?");
        $stmt_key->execute([$user['id']]);
        $setting = $stmt_key->fetch(PDO::FETCH_ASSOC);
        
        // ★★★ মূল পরিবর্তন: রেসপন্সে এখন account_status পাঠানো হচ্ছে ★★★
        $response_data = [
            'success' => true,
            '2fa_required' => false,
            'message' => 'Authentication successful.',
            'user_id' => $user['id'],
            'name'    => $user['username'],
            'email'   => $user['email'],
            'api_key' => $setting['api_key'] ?? null,
            'account_status' => $user['account_status'], // লাইসেন্স স্ট্যাটাসের পরিবর্তে একাউন্ট স্ট্যাটাস
            'suspended_until' => $user['suspended_until']
        ];
        echo json_encode($response_data);

    } else {
        throw new Exception('Invalid credentials or license mismatch.', 401);
    }

} catch (Exception $e) {
    $code = $e->getCode() > 0 ? $e->getCode() : 500;
    http_response_code($code);
    echo json_encode(['success' => false, 'message' => 'Central Server Auth Error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/verify_2fa_login.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../vendor/autoload.php';
require '../db_connect.php';

use PragmaRX\Google2FA\Google2FA;

try {
    $user_id = $_POST['user_id'] ?? null;
    $code = $_POST['code'] ?? '';

    if (empty($user_id) || empty($code)) throw new Exception("User ID and 2FA code are required.", 400);

    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->execute([$user_id]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$user || !$user['two_factor_enabled'] || !$user['two_factor_secret']) {
        throw new Exception("2FA is not enabled for this user or user not found.", 404);
    }

    $google2fa = new Google2FA();
    $valid = $google2fa->verifyKey($user['two_factor_secret'], $code);

    if ($valid) {
        // কোড সঠিক হলে, ক্লায়েন্ট সাইটের জন্য লগইন সেশনের তথ্য পাঠানো
        $stmt_key = $pdo->prepare("SELECT api_key FROM settings WHERE user_id = ?");
        $stmt_key->execute([$user['id']]);
        $setting = $stmt_key->fetch(PDO::FETCH_ASSOC);

        echo json_encode([
            'success' => true,
            'message' => '2FA verification successful.',
            'user_id' => $user['id'],
            'name'    => $user['username'],
            'email'   => $user['email'],
            'api_key' => $setting['api_key'] ?? null
        ]);
    } else {
        throw new Exception("Invalid 2FA code.", 401);
    }
} catch (Exception $e) {
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/verify_and_enable_2fa.php [Text Content] ---
================================================================================

<?php
/**
 * API Endpoint for Verifying and Enabling 2FA
 * সংস্করণ: 2.1 - Final fix. Uses native session handling.
 */

// CORS হেডার (অপরিবর্তিত)
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-API-KEY, Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { exit(0); }

header('Content-Type: application/json');
require '../vendor/autoload.php';
require '../db_connect.php';

use PragmaRX\Google2FA\Google2FA;

try {
    $api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
    $code = $_POST['code'] ?? '';
    $client_session_id = $_POST['session_id'] ?? null;

    if (empty($api_key) || empty($code) || empty($client_session_id)) {
        throw new Exception("API Key, verification code, and Session ID are required.", 400);
    }
    
    // ★★★ মূল সমাধান: ক্লায়েন্টের সেশন আইডি ব্যবহার করে সেশন চালু করা ★★★
    session_id($client_session_id);
    session_start();
    
    $secret = $_SESSION['2fa_temp_secret'] ?? null;
    $user_id = $_SESSION['2fa_temp_user_id'] ?? null;

    if (!$secret || !$user_id) {
        session_write_close();
        throw new Exception("Session has expired or is invalid. Please start the setup process again.", 408);
    }
    
    // কোডটি সঠিক কিনা তা যাচাই করা
    $google2fa = new Google2FA();
    if ($google2fa->verifyKey($secret, $code)) {
        // সফল হলে, ডাটাবেসে সিক্রেট কী সেভ করা এবং 2FA চালু করা
        $stmt_update_user = $pdo->prepare("UPDATE users SET two_factor_secret = ?, two_factor_enabled = 1 WHERE id = ?");
        $stmt_update_user->execute([$secret, $user_id]);
        
        // সেশনের অস্থায়ী ডেটা মুছে ফেলা
        unset($_SESSION['2fa_temp_secret'], $_SESSION['2fa_temp_user_id']);
        
        // সেশনের পরিবর্তনগুলো ডাটাবেসে সংরক্ষণ করা
        session_write_close();
        
        echo json_encode(['success' => true, 'message' => '2FA has been enabled successfully!']);
    } else {
        session_write_close();
        throw new Exception("Invalid verification code. Please try again.", 400);
    }
} catch (Exception $e) {
    if (session_status() === PHP_SESSION_ACTIVE) {
        session_write_close();
    }
    http_response_code($e->getCode() > 0 ? $e->getCode() : 500);
    echo json_encode(['success' => false, 'message' => 'Verify 2FA Error: ' . $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/verify_funding.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) { http_response_code(401); die(json_encode(['success' => false, 'message' => 'API Key is missing.'])); }

$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);
if (!$setting) { http_response_code(403); die(json_encode(['success' => false, 'message' => 'Invalid API Key.'])); }

$user_id = $setting['user_id'];

// ★★★ সমাধান: $_POST থেকে ডেটা গ্রহণ করা হচ্ছে ★★★
$trx_id = $_POST['trx_id'] ?? null;

if (!$trx_id) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Transaction ID is missing.']);
    exit();
}

try {
    $pdo->beginTransaction();

    $stmt_fund = $pdo->prepare("SELECT * FROM user_funds WHERE transaction_unique_id = ? AND user_id = ? AND status = 'pending' FOR UPDATE");
    $stmt_fund->execute([$trx_id, $user_id]);
    $fund_details = $stmt_fund->fetch(PDO::FETCH_ASSOC);

    if (!$fund_details) {
        throw new Exception('Funding record not found or already processed.');
    }

    $stmt_trans = $pdo->prepare("SELECT status FROM transactions WHERE unique_id = ? AND user_id = ?");
    $stmt_trans->execute([$trx_id, $user_id]);
    $transaction = $stmt_trans->fetch(PDO::FETCH_ASSOC);

    if ($transaction && $transaction['status'] === 'completed') {
        $stmt_update_fund = $pdo->prepare("UPDATE user_funds SET status = 'completed' WHERE id = ?");
        $stmt_update_fund->execute([$fund_details['id']]);

        $stmt_update_balance = $pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?");
        $stmt_update_balance->execute([$fund_details['amount_usd'], $user_id]);
        
        $pdo->commit();
        echo json_encode(['success' => true, 'message' => 'Funds added successfully!']);
    } else {
        throw new Exception('Payment verification failed or payment is not completed.');
    }

} catch (Exception $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

================================================================================
--- ফাইল পাথ (File Path): api/verify_payment.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

// হেডার থেকে API Key দিয়ে অথেন্টিকেশন
$api_key = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (empty($api_key)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'API Key is missing.']);
    exit();
}

// API Key ব্যবহার করে user_id খুঁজে বের করা
$stmt_user = $pdo->prepare("SELECT user_id FROM settings WHERE api_key = ?");
$stmt_user->execute([$api_key]);
$setting = $stmt_user->fetch(PDO::FETCH_ASSOC);

if (!$setting) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Invalid API Key.']);
    exit();
}
$user_id = $setting['user_id'];

// ওয়ার্ডপ্রেস থেকে পাঠানো JSON ডেটা পড়া
$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);

$unique_payment_id = $data['unique_payment_id'] ?? null;
$order_id_wp = $data['order_id'] ?? null; // WooCommerce অর্ডার আইডি

if (empty($unique_payment_id) || empty($order_id_wp)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Payment ID and Order ID are required.']);
    exit();
}

try {
    // transactions টেবিল থেকে পেমেন্টের স্ট্যাটাস চেক করা হচ্ছে
    $stmt = $pdo->prepare("
        SELECT status, user_submitted_trxid 
        FROM transactions 
        WHERE unique_id = ? AND user_id = ?
    ");
    $stmt->execute([$unique_payment_id, $user_id]);
    $transaction = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($transaction && $transaction['status'] === 'completed') {
        // যদি স্ট্যাটাস 'completed' হয়, তাহলে সফল বার্তা পাঠানো হচ্ছে
        echo json_encode([
            'success' => true,
            'message' => 'Payment has been successfully verified.',
            'transaction_id' => $transaction['user_submitted_trxid']
        ]);
    } else {
        // যদি পেমেন্ট খুঁজে না পাওয়া যায় বা স্ট্যাটাস 'completed' না হয়
        http_response_code(404);
        echo json_encode(['success' => false, 'message' => 'Payment not found or not completed.']);
    }

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Database error.']);
}

================================================================================
--- ফাইল পাথ (File Path): api/verify_transaction.php [Text Content] ---
================================================================================

<?php
header('Content-Type: application/json');
require '../db_connect.php';

session_start();

// --- Configuration ---
define('FEE_PER_TRANSACTION_BDT', 1.00);
define('USD_TO_BDT_RATE_FOR_FEE', 120);

function deduct_fee_and_log($pdo, $user_id, $transaction_db_id) {
    $free_credits = 50;
    $stmt_purchased = $pdo->prepare("SELECT COALESCE(SUM(amount_bdt), 0) as total_purchased FROM user_funds WHERE user_id = ? AND status = 'completed' AND transaction_unique_id LIKE 'manual_purchase_%'");
    $stmt_purchased->execute([$user_id]);
    $purchased_credits = $stmt_purchased->fetchColumn();
    $total_available_credits = $free_credits + $purchased_credits;

    $stmt_used = $pdo->prepare("SELECT COUNT(id) FROM credit_transactions WHERE user_id = ? FOR UPDATE");
    $stmt_used->execute([$user_id]);
    $used_credits = $stmt_used->fetchColumn();

    if ($used_credits >= $total_available_credits) {
        throw new Exception("Insufficient credits to cover transaction fee. Please purchase more credits in the billing section.");
    }

    $fee_bdt = FEE_PER_TRANSACTION_BDT;
    $fee_usd = $fee_bdt / USD_TO_BDT_RATE_FOR_FEE;
    $stmt_log = $pdo->prepare(
        "INSERT INTO credit_transactions (user_id, payment_transaction_id, cost_bdt, cost_usd, credits_deducted, description)
         VALUES (?, ?, ?, ?, 1, 'API Payment Verification Fee')"
    );
    $stmt_log->execute([$user_id, $transaction_db_id, $fee_bdt, $fee_usd]);
}

// --- Helper Functions ---
function get_client_ip() { $ipaddress = ''; $keys = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR']; foreach ($keys as $key) { if (isset($_SERVER[$key])) { $ipaddress = $_SERVER[$key]; break; } } return $ipaddress ?: 'UNKNOWN'; }
function generateRandomString($length = 40) { $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $rand = ''; for ($i = 0; $i < $length; $i++) { $rand .= $chars[rand(0, strlen($chars) - 1)]; } return $rand; }

function encryptDataWithPublicKey($data, $publicKey) {
    openssl_public_encrypt($data, $crypttext, $publicKey);
    return base64_encode($crypttext);
}
function generateSignature($data, $privateKey) {
    openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
    return base64_encode($signature);
}

$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);
$action = $data['action'] ?? null;

// অ্যাকশন অনুযায়ী রুট নির্ধারণ
if ($action === 'initiate_tokenized_payment') {
    try {
        $unique_payment_id = trim($data['unique_payment_id'] ?? '');
        $stmt_session = $pdo->prepare("SELECT user_id, amount FROM transactions WHERE unique_id = ?");
        $stmt_session->execute([$unique_payment_id]);
        $session = $stmt_session->fetch(PDO::FETCH_ASSOC);
        if (!$session) throw new Exception('Payment session not found.');
        
        $stmt_gateway = $pdo->prepare("SELECT * FROM gateways WHERE user_id = ? AND gateway_key = 'bkash_merchant_tokenized'");
        $stmt_gateway->execute([$session['user_id']]);
        $creds = $stmt_gateway->fetch(PDO::FETCH_ASSOC);
        if (!$creds || empty($creds['app_key'])) throw new Exception('bKash Marchant credentials are not configured.');

        $env = $creds['test_mode'] ? 'sandbox' : 'pay';

        $token_url = "https://tokenized.{$env}.bka.sh/v1.2.0-beta/tokenized/checkout/token/grant";
        $token_req_body = json_encode(['app_key' => $creds['app_key'], 'app_secret' => $creds['app_secret']]);
        
        // ★★★ সমাধান: bKash টোকেন অনুরোধে 'x-app-key' হেডার যুক্ত করা হয়েছে ★★★
        $token_headers = [
            'Content-Type: application/json',
            'username: ' . $creds['username'],
            'password: ' . $creds['password'],
            'x-app-key: ' . $creds['app_key'] 
        ];
        
        $ch_token = curl_init();
        curl_setopt_array($ch_token, [CURLOPT_URL => $token_url, CURLOPT_HTTPHEADER => $token_headers, CURLOPT_POSTFIELDS => $token_req_body, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1]);
        $token_res = curl_exec($ch_token);
        $token_data = json_decode($token_res, true);
        curl_close($ch_token);
        
        if (!isset($token_data['id_token'])) {
            throw new Exception($token_data['errorMessage'] ?? 'Failed to get bKash token. Check credentials and environment.');
        }

        $create_url = "https://tokenized.{$env}.bka.sh/v1.2.0-beta/tokenized/checkout/create";
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
        $host = $_SERVER['HTTP_HOST'];
        $directory = rtrim(dirname(dirname($_SERVER['PHP_SELF'])), '/\\');
        $callback_url = "{$protocol}://{$host}{$directory}/checkout.php?trx_id={$unique_payment_id}&bkash_callback=1";
        $create_req_body = json_encode(['mode' => '0011', 'amount' => number_format($session['amount'], 2, '.', ''), 'currency' => 'BDT', 'intent' => 'sale', 'merchantInvoiceNumber' => $unique_payment_id, 'payerReference' => 'user_' . $session['user_id'], 'callbackURL' => $callback_url]);
        $create_headers = ['Content-Type: application/json', 'Authorization: Bearer ' . $token_data['id_token'], 'X-App-Key: ' . $creds['app_key']];
        $ch_create = curl_init();
        curl_setopt_array($ch_create, [CURLOPT_URL => $create_url, CURLOPT_HTTPHEADER => $create_headers, CURLOPT_POSTFIELDS => $create_req_body, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1]);
        $create_res = curl_exec($ch_create);
        $create_data = json_decode($create_res, true);
        curl_close($ch_create);

        if (isset($create_data['bkashURL'])) {
            echo json_encode(['success' => true, 'redirect_url' => $create_data['bkashURL']]);
        } else {
            throw new Exception($create_data['errorMessage'] ?? 'Failed to create bKash payment.');
        }
    } catch (Exception $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => $e->getMessage()]);
    }
    exit();

} elseif ($action === 'initiate_nagad_payment') {
    try {
        $unique_payment_id=trim($data['unique_payment_id']??'');$stmt_session=$pdo->prepare("SELECT user_id, amount FROM transactions WHERE unique_id = ?");$stmt_session->execute([$unique_payment_id]);$session=$stmt_session->fetch(PDO::FETCH_ASSOC);if(!$session)throw new Exception('Payment session not found.');$stmt_gateway=$pdo->prepare("SELECT * FROM gateways WHERE user_id = ? AND gateway_key = 'nagad_merchant'");$stmt_gateway->execute([$session['user_id']]);$creds=$stmt_gateway->fetch(PDO::FETCH_ASSOC);if(!$creds || empty($creds['merchant_id']) || empty($creds['merchant_private_key']) || empty($creds['nagad_public_key'])) throw new Exception('Nagad credentials are not configured. Please check your settings.');
        $nagad_url_prefix = $creds['test_mode'] ? 'https://sandbox-ssl.mynagad.com' : 'https://ssl.mynagad.com';
        $datetime=(new DateTime('now',new DateTimeZone('Asia/Dhaka')))->format('YmdHis');$order_id_nagad=$unique_payment_id.rand(1001,9999);$challenge=generateRandomString();$nagad_headers=['Content-Type: application/json','X-KM-Api-Version: v-0.2.0','X-KM-IP-V4: '.get_client_ip(),'X-KM-Client-Type: PC_WEB'];$sensitive_data=json_encode(['merchantId'=>$creds['merchant_id'],'datetime'=>$datetime,'orderId'=>$order_id_nagad,'challenge'=>$challenge]);$init_data=['dateTime'=>$datetime,'sensitiveData'=>encryptDataWithPublicKey($sensitive_data,$creds['nagad_public_key']),'signature'=>generateSignature($sensitive_data,$creds['merchant_private_key'])];
        $init_url="{$nagad_url_prefix}/api/dfs/check-out/initialize/".$creds['merchant_id']."/".$order_id_nagad;
        $ch_init=curl_init();curl_setopt_array($ch_init,[CURLOPT_URL=>$init_url,CURLOPT_POSTFIELDS=>json_encode($init_data),CURLOPT_HTTPHEADER=>$nagad_headers,CURLOPT_RETURNTRANSFER=>true,CURLOPT_POST=>1]);$init_res=curl_exec($ch_init);curl_close($ch_init);$init_res_data=json_decode($init_res,true);if(!isset($init_res_data['sensitiveData']))throw new Exception($init_res_data['message']??'Nagad initialization failed. Please check your credentials and try again.');
        
        openssl_private_decrypt(base64_decode($init_res_data['sensitiveData']), $decrypted_data, $creds['merchant_private_key']);
        
        $decrypted_data=json_decode($decrypted_data,true);if(!isset($decrypted_data['paymentReferenceId']))throw new Exception('Failed to get payment reference ID from Nagad.');$protocol=(!empty($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=='off')?"https":"http";$host=$_SERVER['HTTP_HOST'];$directory=rtrim(dirname(dirname($_SERVER['PHP_SELF'])),'/\\');$callback_url="{$protocol}://{$host}{$directory}/checkout.php?nagad_callback=1";$order_sensitive_data=json_encode(['merchantId'=>$creds['merchant_id'],'orderId'=>$order_id_nagad,'currencyCode'=>'050','amount'=>number_format($session['amount'],2,'.',''),'challenge'=>$decrypted_data['challenge']]);$order_post_data=['sensitiveData'=>encryptDataWithPublicKey($order_sensitive_data,$creds['nagad_public_key']),'signature'=>generateSignature($order_sensitive_data,$creds['merchant_private_key']),'merchantCallbackURL'=>$callback_url,'additionalMerchantInfo'=>['order_no'=>$unique_payment_id]];
        $complete_url="{$nagad_url_prefix}/api/dfs/check-out/complete/".$decrypted_data['paymentReferenceId'];
        $ch_complete=curl_init();curl_setopt_array($ch_complete,[CURLOPT_URL=>$complete_url,CURLOPT_POSTFIELDS=>json_encode($order_post_data),CURLOPT_HTTPHEADER=>$nagad_headers,CURLOPT_RETURNTRANSFER=>true,CURLOPT_POST=>1]);$complete_res=curl_exec($ch_complete);curl_close($ch_complete);$complete_res_data=json_decode($complete_res,true);if(isset($complete_res_data['status'])&&$complete_res_data['status']=='Success'){echo json_encode(['success'=>true,'redirect_url'=>$complete_res_data['callBackUrl']]);}else{throw new Exception($complete_res_data['message']??'Failed to complete Nagad checkout.');}
    } catch(Exception $e){http_response_code(500);echo json_encode(['success'=>false,'message'=>$e->getMessage()]);}
    exit();

} 
elseif ($action === 'initiate_checkout_payment') {
    try {
        $unique_payment_id = trim($data['unique_payment_id'] ?? '');
        $stmt_session = $pdo->prepare("SELECT user_id, amount FROM transactions WHERE unique_id = ?");
        $stmt_session->execute([$unique_payment_id]);
        $session = $stmt_session->fetch(PDO::FETCH_ASSOC);
        if (!$session) throw new Exception('Payment session not found.');

        $stmt_gateway = $pdo->prepare("SELECT * FROM gateways WHERE user_id = ? AND gateway_key = 'bkash_merchant_checkout'");
        $stmt_gateway->execute([$session['user_id']]);
        $creds = $stmt_gateway->fetch(PDO::FETCH_ASSOC);
        if (!$creds || empty($creds['app_key'])) throw new Exception('bKash Checkout credentials are not configured.');

        $env = $creds['test_mode'] ? 'sandbox' : 'pay';
        
        $token_url = "https://checkout.{$env}.bka.sh/v1.2.0-beta/checkout/token/grant";
        $token_req_body = json_encode(['app_key' => $creds['app_key'], 'app_secret' => $creds['app_secret']]);
        
        // ★★★ সমাধান: bKash টোকেন অনুরোধে 'x-app-key' হেডার যুক্ত করা হয়েছে ★★★
        $token_headers = [
            'Content-Type: application/json',
            'username: ' . $creds['username'],
            'password: ' . $creds['password'],
            'x-app-key: ' . $creds['app_key']
        ];
        
        $ch_token = curl_init(); curl_setopt_array($ch_token, [CURLOPT_URL => $token_url, CURLOPT_HTTPHEADER => $token_headers, CURLOPT_POSTFIELDS => $token_req_body, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1]);
        $token_res = curl_exec($ch_token); $token_data = json_decode($token_res, true); curl_close($ch_token);
        
        if (!isset($token_data['id_token'])) {
            throw new Exception($token_data['errorMessage'] ?? 'Failed to get bKash token. Check your credentials.');
        }
        
        $create_url = "https://checkout.{$env}.bka.sh/v1.2.0-beta/checkout/payment/create";
        $create_req_body = json_encode(['mode' => '0011', 'amount' => number_format($session['amount'], 2, '.', ''), 'currency' => 'BDT', 'intent' => 'sale', 'merchantInvoiceNumber' => $unique_payment_id]);
        $create_headers = ['Content-Type: application/json', 'Authorization: Bearer ' . $token_data['id_token'], 'X-App-Key: ' . $creds['app_key']];
        $ch_create = curl_init(); curl_setopt_array($ch_create, [CURLOPT_URL => $create_url, CURLOPT_HTTPHEADER => $create_headers, CURLOPT_POSTFIELDS => $create_req_body, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1]);
        $create_res = curl_exec($ch_create); $create_data = json_decode($create_res, true); curl_close($ch_create);

        if (isset($create_data['paymentID'])) {
            echo json_encode(['success' => true, 'bkash_response' => $create_data]);
        } else { throw new Exception($create_data['errorMessage'] ?? 'Failed to create bKash payment.'); }
    } catch (Exception $e) { http_response_code(500); echo json_encode(['success' => false, 'message' => $e->getMessage()]); }
    exit();
}
elseif ($action === 'execute_checkout_payment') {
    try {
        $paymentID = trim($data['paymentID'] ?? '');
        $unique_payment_id = trim($data['unique_payment_id'] ?? '');
        $stmt_trans = $pdo->prepare("SELECT * FROM transactions WHERE unique_id = ?");
        $stmt_trans->execute([$unique_payment_id]);
        $transaction = $stmt_trans->fetch(PDO::FETCH_ASSOC);
        if (!$transaction) throw new Exception('Transaction session not found.');
        
        $stmt_gateway = $pdo->prepare("SELECT * FROM gateways WHERE user_id = ? AND gateway_key = 'bkash_merchant_checkout'");
        $stmt_gateway->execute([$transaction['user_id']]);
        $creds = $stmt_gateway->fetch(PDO::FETCH_ASSOC);
        if (!$creds) throw new Exception('Gateway credentials not found.');

        $env = $creds['test_mode'] ? 'sandbox' : 'pay';
        
        $token_url = "https://checkout.{$env}.bka.sh/v1.2.0-beta/checkout/token/grant";
        $token_req_body = json_encode(['app_key' => $creds['app_key'], 'app_secret' => $creds['app_secret']]);
        $token_headers = [
            'Content-Type: application/json',
            'username: ' . $creds['username'],
            'password: ' . $creds['password'],
            'x-app-key: ' . $creds['app_key']
        ];
        $ch_token = curl_init(); curl_setopt_array($ch_token, [CURLOPT_URL => $token_url, CURLOPT_HTTPHEADER => $token_headers, CURLOPT_POSTFIELDS => $token_req_body, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1]);
        $token_res = curl_exec($ch_token); $token_data = json_decode($token_res, true); curl_close($ch_token);
        if (!isset($token_data['id_token'])) throw new Exception('Failed to get bKash token for execution.');
        
        $execute_url = "https://checkout.{$env}.bka.sh/v1.2.0-beta/checkout/payment/execute/" . $paymentID;
        $execute_headers = ['Content-Type: application/json', 'Authorization: Bearer ' . $token_data['id_token'], 'X-App-Key: ' . $creds['app_key']];
        $ch_exec = curl_init(); curl_setopt_array($ch_exec, [CURLOPT_URL => $execute_url, CURLOPT_HTTPHEADER => $execute_headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => 1]);
        $execute_res = curl_exec($ch_exec); $execute_data = json_decode($execute_res, true); curl_close($ch_exec);
        
        if (isset($execute_data['transactionStatus']) && $execute_data['transactionStatus'] === 'Completed') {
            $pdo->beginTransaction();
            $meta_data = json_decode($transaction['meta_data'], true);
            $source = $meta_data['source'] ?? 'api';
            if ($source !== 'user_funding') {
                deduct_fee_and_log($pdo, $transaction['user_id'], $transaction['id']);
            }
            $pdo->prepare("UPDATE transactions SET status = 'completed', user_submitted_trxid = ? WHERE unique_id = ?")->execute([$execute_data['trxID'], $unique_payment_id]);
            $pdo->commit();

            echo json_encode([
                'success' => true, 
                'message' => 'Payment completed successfully!', 
                'redirect_url' => $transaction['success_url'], 
                'transaction_id' => $execute_data['trxID'],
                'source' => $source
            ]);
        } else { 
            throw new Exception($execute_data['errorMessage'] ?? 'Payment execution failed.'); 
        }
    } catch(Exception $e) { 
        if ($pdo->inTransaction()) $pdo->rollBack();
        http_response_code(500); 
        echo json_encode(['success' => false, 'message' => $e->getMessage()]); 
    }
    exit();
}
else {
    // SMS ভেরিফিকেশন লজিক (ডিফল্ট)
    $user_submitted_trxid = trim($data['transaction_id'] ?? '');
    $unique_payment_id = trim($data['unique_payment_id'] ?? '');
    $gateway_key = trim($data['gateway_key'] ?? '');
    if (empty($user_submitted_trxid) || empty($unique_payment_id) || empty($gateway_key)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Required fields are missing.']); exit(); }
    
    try {
        $stmt_session = $pdo->prepare("SELECT * FROM transactions WHERE unique_id = ? AND status = 'pending'");
        $stmt_session->execute([$unique_payment_id]);
        $session = $stmt_session->fetch(PDO::FETCH_ASSOC);
        if (!$session) { http_response_code(404); echo json_encode(['success' => false, 'message' => 'Payment session is invalid or has already been completed.']); exit(); }

        $user_id = $session['user_id']; $required_amount = $session['amount'];
        
        $sender_identifier = '';
        switch ($gateway_key) {
            case 'bkash_personal': $sender_identifier = 'bKash'; break;
            case 'nagad_personal': $sender_identifier = 'Nagad'; break;
            case 'rocket_personal': $sender_identifier = 'Rocket'; break;
            case 'upay_personal': $sender_identifier = 'Upay'; break;
            default: echo json_encode(['success' => false, 'message' => 'Invalid payment gateway specified.']); exit();
        }

        $stmt_sms = $pdo->prepare("SELECT id, amount FROM sms_transactions WHERE user_id = ? AND transaction_id = ? AND status = 'Received' AND sender_number = ? AND is_trashed = 0 LIMIT 1");
        $stmt_sms->execute([$user_id, $user_submitted_trxid, $sender_identifier]);
        $sms = $stmt_sms->fetch(PDO::FETCH_ASSOC);
        if (!$sms || (float)$sms['amount'] != (float)$required_amount) { echo json_encode(['success' => false, 'message' => 'Transaction ID is invalid, already used, or amount mismatch.']); exit(); }

        $pdo->beginTransaction();
        $meta_data = json_decode($session['meta_data'], true);
        $source = $meta_data['source'] ?? 'api';
        if ($source !== 'user_funding') {
            deduct_fee_and_log($pdo, $user_id, $session['id']);
        }
        $pdo->prepare("UPDATE sms_transactions SET status = 'Verified' WHERE id = ?")->execute([$sms['id']]);
        $pdo->prepare("UPDATE transactions SET status = 'completed', user_submitted_trxid = ? WHERE unique_id = ?")->execute([$user_submitted_trxid, $unique_payment_id]);
        $pdo->commit();
        
        echo json_encode([
            'success' => true, 
            'message' => 'Payment verified successfully!', 
            'redirect_url' => $session['success_url'],
            'transaction_id' => $user_submitted_trxid,
            'source' => $source
        ]);

    } catch (Exception $e) {
        if ($pdo->inTransaction()) $pdo->rollBack();
        http_response_code(500);
        if (strpos($e->getMessage(), 'Insufficient credits') !== false) {
            echo json_encode(['success' => false, 'message' => $e->getMessage()]);
        } else {
            echo json_encode(['success' => false, 'message' => 'An error occurred during verification.']);
        }
    }
    exit();
}
?>

================================================================================
--- ফাইল পাথ (File Path): css/style.css [Text Content] ---
================================================================================

/* === বেসিক এবং ড্যাশবোর্ড লেআউট === */
body {
    font-family: Arial, sans-serif;
    margin: 0;
    background-color: #f4f7fa;
}

.container {
    padding: 20px;
}

/* ★★★ নতুন লোডার স্টাইল ★★★ */
.bkash-loader {
    position: fixed;
    z-index: 9999;
    width: 100%;
    height: 100%;
    background-color: #ffffffc2;
    left: 0;
    top: 0;
    background-image: url('https://res.cloudinary.com/d-coders/image/upload/v1592201998/wp-plugins/bkash.gif');
    background-position: center;
    background-repeat: no-repeat;
    display: none;
}


/* === হেডার === */
.header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 10px 20px;
    background-color: #ffffff;
    border-bottom: 1px solid #e0e0e0;
}

.header-left, .header-right {
    display: flex;
    align-items: center;
}

.header-title h1 {
    margin: 0;
    font-size: 22px;
}

.header-icon {
    font-size: 22px;
    color: #555;
    text-decoration: none;
    cursor: pointer;
    margin: 0;
}

/* === সাইডবার === */
.sidebar {
    position: fixed;
    top: 61px;
    left: -250px;
    width: 250px;
    height: 100%;
    background-color: #2c3e50;
    transition: left 0.3s ease;
    padding-top: 20px;
    z-index: 999;
}

.sidebar.open {
    left: 0;
}

.sidebar-menu {
    list-style-type: none;
    padding: 0;
    margin: 0;
}

.sidebar-menu li a {
    display: block;
    padding: 15px 20px;
    color: #ecf0f1;
    text-decoration: none;
    font-size: 18px;
}

.sidebar-menu li a:hover {
    background-color: #34495e;
}

/* === সাইডবার মেনু হেডার (নতুন যুক্ত) === */
.sidebar-menu .sidebar-header {
    padding: 20px 20px 8px;
    font-size: 13px;
    font-weight: 600;
    color: #a0aec0;
    text-transform: uppercase;
    letter-spacing: 1px;
}

.main-content {
    padding: 80px 20px 20px 20px;
    transition: margin-left 0.3s ease;
}

.main-content.shifted {
    margin-left: 250px;
}

/* === সাধারণ পেজ কম্পোনেন্ট === */
.page-container {
    padding: 20px;
}

.page-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 20px;
}

.breadcrumbs {
    color: #6c757d;
    margin: 0;
    font-size: 14px;
}

.page-title {
    margin: 0;
    font-size: 2.2rem;
    font-weight: bold;
}

.btn {
    padding: 10px 20px;
    border: none;
    border-radius: 8px;
    font-size: 16px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    font-weight: 500;
    text-decoration: none; /* লিঙ্ক-ভিত্তিক বাটনের আন্ডারলাইন সরাতে */
}

.btn-primary {
    background-color: #0d6efd;
    color: white;
}

.btn-secondary {
    background-color: white;
    color: #212529;
    border: 1px solid #ced4da;
}

.btn .fas {
    margin-right: 8px;
}

.content-card {
    background-color: #ffffff;
    border-radius: 12px;
    padding: 20px;
    box-shadow: 0 4px 8px rgba(0,0,0,0.05);
}

.card-toolbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 20px;
}

.icon-btn {
    color: #6c757d;
    font-size: 18px;
}

.search-box {
    position: relative;
}

.search-box .fa-search {
    position: absolute;
    left: 15px;
    top: 50%;
    transform: translateY(-50%);
    color: #adb5bd;
}

.search-box input {
    padding: 10px 15px 10px 40px;
    border: 1px solid #dee2e6;
    border-radius: 8px;
    font-size: 16px;
    width: 250px;
}

/* === ডেটা টেবিল === */
.data-table {
    width: 100%;
    border-collapse: collapse;
}

.data-table th, .data-table td {
    padding: 15px;
    text-align: left;
    border-bottom: 1px solid #f1f1f1;
    vertical-align: middle;
}

.data-table th {
    color: #6c757d;
    font-weight: 600;
}

.data-table th .fas {
    font-size: 12px;
    margin-left: 5px;
}

.data-table td {
    color: #212529;
    font-weight: 500;
}

.toggle-switch {
    position: relative;
    display: inline-block;
    width: 50px;
    height: 28px;
}

.toggle-switch input {
    opacity: 0;
    width: 0;
    height: 0;
}

.slider {
    position: absolute;
    cursor: pointer;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: #0d6efd;
    transition: .4s;
    border-radius: 34px;
}

.slider:before {
    position: absolute;
    content: "";
    height: 20px;
    width: 20px;
    left: 4px;
    bottom: 4px;
    background-color: white;
    transition: .4s;
    border-radius: 50%;
}

input:not(:checked) + .slider {
    background-color: #ccc;
}

input:checked + .slider:before {
    transform: translateX(22px);
}

.actions a {
    text-decoration: none;
    font-weight: 600;
    margin-left: 20px;
}
.actions .fa-pencil-alt, .actions .fa-trash-alt {
    margin-right: 5px;
}

.action-edit { color: #0d6efd; }
.action-delete { color: #dc3545; }

.card-footer {
    padding-top: 20px;
    display: flex;
    justify-content: flex-end;
}

.pagination-controls span {
    margin-right: 10px;
    color: #6c757d;
}

.pagination-controls select {
    padding: 5px 10px;
    border-radius: 6px;
    border: 1px solid #dee2e6;
}

/* === Modal (পপআপ) === */
.modal {
    display: none;
    position: fixed;
    z-index: 1000;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    overflow: auto;
    background-color: rgba(0, 0, 0, 0.6);
}

.modal-content {
    background-color: #ffffff;
    margin: 10% auto;
    padding: 30px;
    border: none;
    width: 80%;
    max-width: 550px;
    border-radius: 12px;
    box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}

.modal-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 15px;
    border-bottom: 1px solid #e5e5e5;
}

.modal-header h2 {
    margin: 0;
    font-size: 1.5rem;
}

.close-button {
    color: #aaa;
    font-size: 28px;
    font-weight: bold;
    cursor: pointer;
}

.close-button:hover, .close-button:focus {
    color: #000;
}

.modal-body {
    padding: 20px 0;
}

.form-group {
    margin-bottom: 15px;
}

.form-group label {
    display: block;
    margin-bottom: 8px;
    font-weight: 600;
}

.required-star {
    color: #dc3545;
    margin-left: 2px;
}

.select-wrapper {
    position: relative;
}

.select-wrapper select {
    width: 100%;
    padding: 12px;
    border-radius: 8px;
    border: 1px solid #ced4da;
    font-size: 16px;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background-color: white;
}

.select-wrapper::after {
    content: '\f078';
    font-family: 'Font Awesome 6 Free';
    font-weight: 900;
    position: absolute;
    top: 50%;
    right: 15px;
    transform: translateY(-50%);
    pointer-events: none;
    color: #888;
}

.modal-footer {
    display: flex;
    justify-content: flex-end;
    padding-top: 15px;
    gap: 10px;
}

/* === ফর্ম গ্রিড এবং ইনপুট === */
.form-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 20px;
    padding: 20px 0;
}

.form-group input[type="text"],
.form-group input[type="number"],
.form-group input[type="email"],
.form-group input[type="password"] {
    width: 100%;
    padding: 12px;
    border: 1px solid #ced4da;
    border-radius: 8px;
    font-size: 16px;
    box-sizing: border-box;
}

.form-actions {
    margin-top: 20px;
    display: flex;
    gap: 10px;
}

/* === ড্যাশবোর্ডের টেস্ট পেমেন্ট ফর্ম (`index.php`) === */
.test-payment-form {
    margin-top: 20px;
}

.test-payment-form label {
    font-weight: bold;
    color: #333;
}

/* === চেকআউট পেজ (`checkout.php`) === */
.checkout-body {
    background-color: #f0f4f9;
    background-image: url('../images/body-blue.webp');
    background-size: 150px; /* ★★★ নতুন সাইজ সেট করা হয়েছে ★★★ */
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
}

.checkout-container {
    background-color: rgba(255, 255, 255, 0.95);
    width: 100%;
    max-width: 600px;
    padding: 30px;
    border-radius: 16px;
    box-shadow: 0 8px 25px rgba(0,0,0,0.1);
}

.checkout-top-header {
    display: flex;
    align-items: center;
    gap: 15px;
    padding-bottom: 20px;
    margin-bottom: 20px;
    border-bottom: 1px solid #f0f0f0;
}

.fake-url-bar {
    flex-grow: 1;
    background-color: #f8f9fa;
    border: 1px solid #dee2e6;
    border-radius: 8px;
    height: 40px;
    display: flex;
    align-items: center;
    padding: 0 15px;
    color: #888;
}

.checkout-close-btn, .close-button-link {
    background: none;
    border: 1px solid #ddd;
    border-radius: 50%;
    width: 30px;
    height: 30px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 20px;
    cursor: pointer;
    color: #888;
    text-decoration: none;
}

.checkout-header {
    display: flex;
    align-items: center;
    gap: 20px;
    margin-bottom: 20px;
}

.logo-circle {
    width: 60px;
    height: 60px;
    border-radius: 50%;
    background-color: #fce4ec;
    display: flex;
    justify-content: center;
    align-items: center;
}

.logo-circle img {
    max-width: 40px;
}

.separator-bar {
    background-color: #0d6efd;
    color: white;
    text-align: center;
    padding: 12px;
    border-radius: 8px;
    font-weight: bold;
    margin-bottom: 25px;
}

.payment-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 15px;
    margin-bottom: 25px;
}

.payment-method {
    border: 1px solid #dee2e6;
    border-radius: 12px;
    padding: 15px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    cursor: pointer;
    transition: all 0.2s ease-in-out;
}

.payment-method:hover {
    border-color: #0d6efd;
    box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}

.payment-method img {
    max-height: 30px;
    margin-bottom: 10px;
}

.payment-method span {
    font-size: 14px;
    font-weight: 500;
    color: #333;
}

/* === চেকআউট নির্দেশনাবলী ভিউ === */
.instruction-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 20px;
    margin-bottom: 20px;
}

.back-button {
    background: none;
    border: 1px solid #ddd;
    border-radius: 50%;
    width: 30px;
    height: 30px;
    font-size: 16px;
    cursor: pointer;
    color: #888;
}

.info-boxes {
    display: flex;
    gap: 15px;
    margin-bottom: 20px;
}

.info-box {
    flex: 1;
    border: 1px solid #ddd;
    border-radius: 12px;
    padding: 15px;
    display: flex;
    justify-content: center;
    align-items: center;
}
.logo-box img {
    max-height: 30px;
}
.amount-box {
    font-size: 1.2rem;
    font-weight: bold;
    color: #333;
}

.instruction-details {
    background-color: #f8f9fa;
    border: 1px solid #eee;
    border-radius: 12px;
    padding: 20px;
}

.instruction-details ul {
    list-style: none;
    padding: 0;
    margin: 0;
}

.instruction-details ul li {
    padding: 12px 0;
    border-bottom: 1px solid #e9ecef;
    display: flex;
    align-items: center;
    gap: 10px;
    color: #555;
}
.instruction-details ul li:before {
    content: '•';
    color: #0d6efd;
    font-size: 20px;
    padding-right: 10px;
}
.instruction-details ul li:last-child {
    border-bottom: none;
}

.copy-btn {
    background-color: #0d6efd;
    color: white;
    border: none;
    border-radius: 6px;
    padding: 5px 10px;
    cursor: pointer;
    font-size: 12px;
    margin-left: auto;
}
.copy-btn .far {
    margin-right: 5px;
}

.trx-input-group {
    margin-top: 20px;
}
.trx-input-group label {
    display: block;
    font-weight: bold;
    margin-bottom: 8px;
    color: #333;
}
.trx-input-group input {
    width: 100%;
    padding: 12px;
    border: 1px solid #ced4da;
    border-radius: 8px;
    box-sizing: border-box;
}

.verify-button {
    width: 100%;
    padding: 15px;
    background-color: #0d6efd;
    color: white;
    border: none;
    border-radius: 12px;
    font-size: 18px;
    font-weight: bold;
    cursor: pointer;
    margin-top: 20px;
    transition: background-color 0.2s;
}
.verify-button:hover {
    background-color: #0b5ed7;
}

/* === পেমেন্ট বাতিল পেজ (`payment_cancelled.php`) === */
.cancellation-body {
    background-color: #f0f2f5;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}

.cancellation-box {
    background-color: #ffffff;
    padding: 40px;
    border-radius: 12px;
    box-shadow: 0 5px 15px rgba(0,0,0,0.1);
    text-align: center;
    max-width: 450px;
}

.cancellation-box h2 {
    font-size: 24px;
    color: #dc3545;
    margin-bottom: 15px;
}

.cancellation-box p {
    color: #555;
    margin-bottom: 25px;
}

/* === লগইন ও রেজিস্ট্রেশন পেজ === */
.auth-body {
    background-color: #f0f2f5;
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
}

.auth-container {
    background-color: #ffffff;
    padding: 30px 40px;
    border-radius: 12px;
    box-shadow: 0 5px 15px rgba(0,0,0,0.08);
    width: 100%;
    max-width: 420px;
}

.auth-title {
    text-align: left;
    font-size: 24px;
    font-weight: 600;
    margin-bottom: 25px;
}

.auth-btn {
    width: 100%;
    padding: 12px;
    margin-top: 15px;
    font-weight: bold;
}

.auth-switch {
    text-align: center;
    margin-top: 20px;
    font-size: 14px;
    color: #555;
}
.auth-switch a {
    color: #0d6efd;
    text-decoration: none;
    font-weight: 600;
}

.auth-errors, .auth-success {
    padding: 15px;
    margin-bottom: 20px;
    border-radius: 8px;
    font-size: 14px;
}
.auth-errors {
    background-color: #f8d7da;
    color: #721c24;
    border: 1px solid #f5c6cb;
}
.auth-success {
    background-color: #d4edda;
    color: #155724;
    border: 1px solid #c3e6cb;
}

/* === API Settings Page === */
.api-card {
    margin-bottom: 25px;
}

.api-card .card-header h3 {
    margin: 0;
    font-size: 1.2rem;
}
.api-card .card-header p {
    margin: 5px 0 0;
    color: #6c757d;
}

.input-with-actions {
    display: flex;
    align-items: center;
    border: 1px solid #ced4da;
    border-radius: 8px;
    padding-right: 5px;
}
.input-with-actions input {
    flex-grow: 1;
    border: none;
    padding: 12px;
    font-size: 16px;
    background-color: transparent;
}
.input-with-actions input:focus {
    outline: none;
}
.input-with-actions .actions {
    display: flex;
    gap: 5px;
}
.input-with-actions .icon-btn {
    background: none;
    border: none;
    cursor: pointer;
    font-size: 16px;
    color: #555;
    padding: 8px;
}

.api-card small {
    display: block;
    margin-top: 8px;
    color: #6c757d;
}

.documentation-card .btn-link {
    display: inline-block;
    padding: 10px 15px;
    background-color: #f8f9fa;
    border: 1px solid #dee2e6;
    border-radius: 8px;
    text-decoration: none;
    color: #0d6efd;
    font-weight: 600;
}
.documentation-card .btn-link .far {
    margin-right: 8px;
}

/* === ডকুমেন্টেশন পেজ === */
pre {
    background-color: #2d2d2d;
    color: #f8f8f2;
    padding: 15px;
    border-radius: 8px;
    overflow-x: auto;
}
hr {
    border: 0;
    border-top: 1px solid #eee;
    margin: 25px 0;
}

/* === Devices Page (devices.php) === (নতুন যুক্ত) */
.btn .fa-wifi {
    margin-right: 8px;
}

.status-badge {
    padding: 4px 12px;
    border-radius: 16px;
    font-size: 12px;
    font-weight: bold;
    text-transform: uppercase;
}

.status-disconnected {
    background-color: #fee2e2; /* হালকা লাল */
    color: #ef4444; /* গাঢ় লাল */
}

.status-connected {
    background-color: #dcfce7; /* হালকা সবুজ */
    color: #22c55e; /* গাঢ় সবুজ */
}

.actions .action-verify {
    color: #3b82f6; /* নীল রঙ */
}

.actions .action-verify .fas {
    margin-right: 5px;
}
/* === সাইড প্যানেল (Connect Android App) === */
.side-panel-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 1001;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.3s ease;
}

.side-panel-overlay.open {
    opacity: 1;
    visibility: visible;
}

.side-panel {
    position: fixed;
    top: 0;
    right: -800px; /* শুরুতে পর্দার বাইরে থাকবে */
    width: 100%;
    max-width: 800px;
    height: 100%;
    background-color: #f4f7fa;
    box-shadow: -2px 0 15px rgba(0,0,0,0.1);
    transition: right 0.4s ease-in-out;
    display: flex;
    flex-direction: column;
}

.side-panel-overlay.open .side-panel {
    right: 0; /* 'open' ক্লাস যুক্ত হলে ভেতরে চলে আসবে */
}

.side-panel-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 15px 25px;
    background-color: #ffffff;
    border-bottom: 1px solid #e0e0e0;
}

.side-panel-header h3 {
    margin: 0;
    font-size: 1.2rem;
}

.close-panel-btn {
    background: none;
    border: none;
    font-size: 28px;
    cursor: pointer;
    color: #888;
}

.side-panel-body {
    padding: 25px;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 25px;
    overflow-y: auto;
}

.panel-card {
    background-color: #ffffff;
    border: 1px solid #e0e0e0;
    border-radius: 12px;
    padding: 20px;
}

.panel-card-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 15px;
    margin-bottom: 15px;
    border-bottom: 1px solid #f1f1f1;
}

.panel-card-header h4 {
    margin: 0;
    font-size: 1rem;
}

.panel-card-body h2 {
    font-size: 1.4rem;
    margin-top: 0;
}

.panel-card-body .subtitle {
    color: #0d6efd;
    font-weight: bold;
    margin-top: -10px;
}

.features-list {
    list-style: none;
    padding: 0;
    margin: 20px 0;
}

.features-list li {
    margin-bottom: 12px;
    color: #555;
}

.features-list .fa-check-circle {
    color: #22c55e;
    margin-right: 10px;
}

.download-btn {
    width: 100%;
    justify-content: center;
    padding: 12px;
}

.download-btn .fa-download {
    margin-right: 8px;
}

.qr-section {
    text-align: center;
}

.qr-code-container {
    margin-top: 20px;
    padding: 10px;
    border: 1px solid #eee;
    border-radius: 8px;
    display: inline-block;
}

.qr-code-container img {
    max-width: 100%;
    height: auto;
    display: block;
}
/* === Payment Links Page Specific Styles === */

/* পেজের হেডারে ডান পাশে বাটনগুলোকে গ্রুপ করার জন্য */
.page-header-actions {
    display: flex;
    gap: 10px; /* বাটনগুলোর মধ্যে স্পেস */
}

/* Edit, Copy, Delete বাটনগুলোর আইকনের জন্য */
.actions .fa-pencil-alt, 
.actions .fa-trash-alt, 
.actions .far.fa-copy {
    margin-right: 5px;
}

/* নতুন 'Copy' অ্যাকশন লিঙ্কের জন্য সবুজ রঙ */
.action-copy { 
    color: #198754; 
}
/* === Create Payment Link Form Styles === */
.form-section {
    padding: 10px 0;
}

.form-row {
    display: flex;
    gap: 20px;
    margin-bottom: 15px;
}

.form-group.half-width {
    width: 50%;
}
.form-group.third-width {
    width: 33.33%;
}

.form-group textarea {
    width: 100%;
    padding: 12px;
    border: 1px solid #ced4da;
    border-radius: 8px;
    font-size: 16px;
    box-sizing: border-box;
    font-family: inherit;
    resize: vertical;
}

.input-with-prefix {
    display: flex;
    align-items: center;
    border: 1px solid #ced4da;
    border-radius: 8px;
}
.input-with-prefix span {
    padding: 0 15px;
    background-color: #f8f9fa;
    border-right: 1px solid #ced4da;
    color: #6c757d;
}
.input-with-prefix input {
    border: none;
    flex-grow: 1;
}

.form-group input[type="date"] {
    width: 100%;
    padding: 11px;
    border: 1px solid #ced4da;
    border-radius: 8px;
    font-size: 16px;
    box-sizing: border-box;
    font-family: inherit;
    color: #555;
}
/* === Toast Notification === */
#toast-notification {
    position: fixed;
    top: 20px;
    right: 20px;
    padding: 12px 20px;
    border-radius: 8px;
    color: white;
    font-size: 16px;
    z-index: 1010;
    visibility: hidden;
    opacity: 0;
    transition: opacity 0.3s, transform 0.3s;
    transform: translateY(-20px);
}
#toast-notification.show {
    visibility: visible;
    opacity: 1;
    transform: translateY(0);
}
#toast-notification.success {
    background-color: #28a745;
}
#toast-notification.error {
    background-color: #dc3545;
}
/* === Payment Link Form Page (pay.php) === */
.link-form-container {
    background-color: #ffffff;
    padding: 30px 40px;
    border-radius: 16px;
    box-shadow: 0 8px 25px rgba(0,0,0,0.1);
    width: 100%;
    max-width: 550px;
    text-align: center;
}

.link-form-header .product-image-wrapper {
    width: 100px;
    height: 100px;
    border-radius: 12px;
    overflow: hidden;
    margin: 0 auto 15px;
    background-color: #f0f2f5;
}
.link-form-header .product-image-wrapper img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.link-form-header h2 {
    font-size: 22px;
    margin: 0 0 5px 0;
}
.link-form-header p {
    color: #6c757d;
    margin: 0 0 25px 0;
}

.link-form-body {
    text-align: left;
}
/* === Default Payment Link Page (default.php) === */
.default-link-body {
    background-color: #f0f4f9;
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    font-family: 'Poppins', sans-serif;
}

.default-link-container {
    display: flex;
    width: 100%;
    max-width: 900px;
    background-color: #ffffff;
    border-radius: 20px;
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
    overflow: hidden;
}

.left-panel {
    flex: 1;
    padding: 40px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}

.company-logo {
    max-width: 120px;
    margin-bottom: 40px;
}

.illustration-img {
    max-width: 100%;
    height: auto;
}

.right-panel {
    flex: 1;
    background-color: #f8faff;
    padding: 40px;
    display: flex;
    align-items: center;
}

.right-panel form {
    width: 100%;
}

.form-input-group {
    position: relative;
    margin-bottom: 20px;
}

.form-input-group i {
    position: absolute;
    left: 15px;
    top: 50%;
    transform: translateY(-50%);
    color: #a0aec0;
}

.form-input-group input {
    width: 100%;
    padding: 12px 15px 12px 45px;
    border: 1px solid #e2e8f0;
    border-radius: 8px;
    font-size: 16px;
    box-sizing: border-box;
    transition: border-color 0.2s;
}

.form-input-group input:focus {
    outline: none;
    border-color: #0d6efd;
    box-shadow: 0 0 0 2px rgba(13, 110, 253, 0.2);
}

.submit-btn {
    width: 100%;
    padding: 15px;
    font-size: 18px;
    font-weight: bold;
}
/* === Filter Tabs (for SMS Data page) === */
/* ★★★ নতুন wrapper ক্লাস, ট্যাবগুলোকে মাঝখানে আনার জন্য ★★★ */
.filter-tabs-container {
    text-align: center;
    margin-bottom: 20px;
}

.filter-tabs {
    /* ★★★ 'flex' থেকে 'inline-flex' করা হয়েছে যাতে কন্টেন্টের সমান चौड़ाई হয় ★★★ */
    display: inline-flex; 
    flex-wrap: wrap;
    gap: 10px;
    padding: 8px;
    background-color: #ffffff;
    border-radius: 12px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.04);
    border: 1px solid #e0e0e0;
}

.filter-tab {
    padding: 8px 16px;
    text-decoration: none;
    color: #555;
    border-radius: 8px;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 14px;
    font-weight: 500;
    transition: background-color 0.2s, color 0.2s;
}

.filter-tab .fas {
    font-size: 14px;
    color: #888;
    transition: color 0.2s;
}

.filter-tab:hover {
    background-color: #f4f7fa;
}

.filter-tab.active {
    background-color: #e9efff;
    color: #0d6efd;
}

.filter-tab.active .fas {
    color: #0d6efd;
}
/* === Reports Page (reports.php) === */
.page-header .report-filters {
    display: flex;
    gap: 10px;
}

.report-filters .btn .far,
.report-filters .btn .fas {
    margin-right: 8px;
}

.financial-report-bar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    background-color: #ffffff;
    padding: 15px 20px;
    border-radius: 12px;
    margin: 20px 0;
    box-shadow: 0 4px 8px rgba(0,0,0,0.05);
    border: 1px solid #e0e0e0;
}

.financial-report-bar span {
    font-weight: 600;
    color: #0d6efd;
}

.report-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 20px;
}

.report-card {
    background-color: #ffffff;
    border-radius: 12px;
    padding: 20px;
    box-shadow: 0 4px 8px rgba(0,0,0,0.05);
    border: 1px solid #e0e0e0;
}

.report-card .card-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: #6c757d;
    margin-bottom: 15px;
}

.report-card .card-title {
    font-weight: 500;
}

.report-card .card-body .amount {
    font-size: 2.5rem;
    font-weight: bold;
    margin: 0 0 10px 0;
    color: #212529;
}

.report-card .card-body .stats {
    margin: 0;
    color: #6c757d;
}

.report-card .card-body .stats .success-rate {
    color: #28a745;
    font-weight: 500;
}
/* === General Settings Page Tabs === */
.settings-tabs {
    display: flex;
    align-items: center;
    gap: 30px; /* ট্যাবগুলোর মধ্যে স্পেস */
    border-bottom: 1px solid #eef2f7;
    margin-bottom: 15px;
    padding-left: 5px;
}

.tab-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 15px 5px;
    text-decoration: none;
    color: #6c757d; /* সাধারণ ট্যাবের রঙ */
    font-weight: 500;
    font-size: 15px;
    border-bottom: 2px solid transparent;
    transition: color 0.2s, border-color 0.2s;
}

.tab-item .fas {
    font-size: 16px;
}

.tab-item:hover {
    color: #0d6efd;
}

.tab-item.active {
    color: #0d6efd; /* সক্রিয় ট্যাবের রঙ */
    font-weight: 600;
    border-bottom-color: #0d6efd;
}

.tab-badge {
    background-color: #e9efff; /* হালকা নীল ব্যাকগ্রাউন্ড */
    color: #0d6efd;
    padding: 4px 10px;
    border-radius: 16px;
    font-size: 12px;
    font-weight: 500;
    margin-left: 6px;
}

.tab-badge.visual {
    background-color: #f0f0f0;
    color: #555;
}
/* === General Settings Form === */
.settings-section {
    padding: 25px 5px;
    border-top: 1px solid #eef2f7;
}
.settings-section h3 {
    margin: 0 0 5px 0;
    font-size: 1.2rem;
}
.settings-section p {
    margin: 0 0 25px 0;
    color: #6c757d;
}
.form-group small {
    display: block;
    margin-top: 8px;
    color: #6c757d;
    font-size: 13px;
}
.settings-actions {
    padding: 20px 0;
    text-align: right;
    margin-top: 10px;
}
.content-card .settings-tabs {
    border-bottom: 1px solid #eef2f7;
    margin-bottom: 0;
}
.content-card .tab-content {
    padding-top: 0;
}
/* === Settings Page - Color Scheme === */
.form-grid-3-col {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 25px;
}

.form-group-color {
    display: flex;
    align-items: center;
    border: 1px solid #ced4da;
    border-radius: 8px;
    padding-left: 12px;
    background-color: #fff;
}

.form-group-color:focus-within {
    border-color: #0d6efd;
    box-shadow: 0 0 0 2px rgba(13, 110, 253, 0.2);
}

.form-group-color input[type="text"] {
    border: none;
    flex-grow: 1;
    padding: 12px 0;
    font-size: 16px;
    box-shadow: none;
    outline: none;
    width: 100%;
}

.form-group-color input[type="color"] {
    width: 38px;
    height: 30px;
    border: none;
    background: none;
    padding: 0 4px;
    cursor: pointer;
    border-radius: 0 7px 7px 0;
}
/* === Brand Icon & Favicon Page (Updated) === */
.logo-uploader-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 30px;
    align-items: flex-start;
}

.label-with-tooltip {
    display: flex;
    align-items: center;
    gap: 8px;
}
.label-with-tooltip .fa-question-circle {
    color: #adb5bd;
    cursor: help;
}

.image-uploader {
    border: 2px dashed #dee2e6;
    border-radius: 12px;
    padding: 10px;
    text-align: center;
    cursor: pointer;
    transition: all 0.2s;
    background-color: #f8f9fa;
    position: relative;
    display: flex; /* ★★★ লেখা মাঝখানে আনার জন্য যুক্ত করা হয়েছে ★★★ */
    align-items: center; /* ★★★ লেখা মাঝখানে আনার জন্য যুক্ত করা হয়েছে ★★★ */
    justify-content: center; /* ★★★ লেখা মাঝখানে আনার জন্য যুক্ত করা হয়েছে ★★★ */
    min-height: 140px; /* ★★★ একটি নির্দিষ্ট উচ্চতা দেওয়া হয়েছে ★★★ */
}

.image-uploader:hover, .image-uploader.drag-over {
    border-color: #0d6efd;
}

/* ★★★ নতুন ক্লাস: যখন ছবি প্রিভিউ দেখানো হবে ★★★ */
.image-uploader.has-preview {
    border: 2px dashed #0d6efd; /* একটি সুন্দর নীল বর্ডার দেওয়া হয়েছে */
    padding: 0;
    background-color: transparent;
}
.image-uploader.has-preview:hover {
    background-color: #f8f9fa;
}

.image-uploader input[type="file"] {
    display: none;
}

.image-uploader .uploader-content {
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}
.image-uploader .uploader-text {
    color: #6c757d;
}
.image-uploader .browse-link {
    color: #0d6efd;
    font-weight: 500;
    text-decoration: underline;
}

.image-uploader.uploader-round {
    width: 140px;
    height: 140px;
    border-radius: 50%;
}

/* ★★★ নতুন ক্লাস: প্রিভিউ কন্টেইনার এবং ডিলিট বাটন ★★★ */
.preview-container {
    position: relative;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
}
.remove-image-btn {
    position: absolute;
    top: 5px;
    right: 5px;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    border: none;
    background-color: rgba(0, 0, 0, 0.5);
    color: white;
    font-size: 16px;
    font-weight: bold;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    opacity: 0;
    transition: opacity 0.2s;
}
.preview-container:hover .remove-image-btn {
    opacity: 1;
}

.image-uploader .image-preview {
    max-width: calc(100% - 20px);
    max-height: calc(100% - 20px);
    object-fit: contain;
    border-radius: 8px; /* ★★★ প্রিভিউ ছবির জন্য বর্ডার-রেডিয়াস ★★★ */
}

.uploader-round .image-preview {
    width: calc(100% - 20px);
    height: calc(100% - 20px);
    border-radius: 50%;
    object-fit: cover;
}
/* === চেকআউট পেজ (`checkout.php`) === */
.checkout-body {
    background-color: #f0f2f5;
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    padding: 20px 0;
}

.checkout-container {
    background-color: #ffffff;
    width: 100%;
    max-width: 600px;
    padding: 30px;
    border-radius: 16px;
    box-shadow: 0 8px 25px rgba(0,0,0,0.1);
}

/* === চেকআউট পেজ (`checkout.php`) === */
.checkout-body {
    background-color: #f0f2f5;
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    padding: 20px 0;
}

.checkout-container {
    background-color: #ffffff;
    width: 100%;
    max-width: 600px;
    padding: 30px;
    border-radius: 16px;
    box-shadow: 0 8px 25px rgba(0,0,0,0.1);
}

/* === নতুন চেকআউট পেজ ডিজাইন === */

/* পুরোনো হেডার আড়াল করা */
.checkout-top-header, .checkout-header, .separator-bar {
    display: none;
}

/* নতুন টপ বার */
.new-checkout-top-bar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 20px;
}
.decorative-search-bar {
    flex-grow: 1;
    height: 35px;
    border: 1px solid #e9ecef;
    border-radius: 8px;
    background-color: #fff;
}
.new-checkout-close-btn {
    font-size: 28px;
    color: #888;
    text-decoration: none;
    margin-left: 15px;
    font-weight: 300;
}

/* নতুন হেডার (লোগো ও সাইটের তথ্য) */
.new-checkout-header {
    display: flex;
    align-items: center;
    gap: 15px;
    margin-bottom: 20px;
}
.new-logo-wrapper img {
    width: 70px;
    height: 70px;
    border-radius: 50%;
    object-fit: cover;
    border: 1px solid #f0f0f0;
}
.new-site-name {
    margin: 0 0 10px 0;
    font-size: 1.5rem;
    font-weight: 600;
}
.new-info-buttons {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
}
.new-info-btn {
    background-color: white;
    border: 1px solid #dcdcdc;
    border-radius: 20px;
    padding: 6px 15px;
    font-size: 14px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: #555;
}
.new-info-btn .fas {
    color: #777;
}

/* লাল রঙের 'পেমেন্ট পদ্ধতি' বার */
.new-payment-selection-bar {
    background-color: #c9302c;
    color: white;
    text-align: center;
    padding: 12px;
    border-radius: 8px;
    font-weight: 500;
    margin-bottom: 20px;
}

/* পেমেন্ট গ্রিড এবং কার্ড স্টাইল (আপডেট করা) */
.payment-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 15px;
    margin-bottom: 25px;
}

.payment-method {
    border: 1px solid #dee2e6;
    border-radius: 12px;
    padding: 15px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    cursor: pointer;
    transition: all 0.2s ease-in-out;
}

.payment-method:hover {
    border-color: #0d6efd;
    box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}

.payment-method img {
    /* ★★★ লোগোর সাইজ এখানে বড় করা হয়েছে ★★★ */
    max-height: 50px;
    margin-bottom: 10px;
}

/* লোগো এবং টেক্সটের মাঝে ডিভাইডার */
.payment-method span::before {
    content: '';
    display: block;
    width: 90%;
    height: 1px;
    background-color: #dddddd;
    margin: 0 auto 10px;
}

.payment-method span {
    font-size: 14px;
    font-weight: 500;
    color: #333;
}

/* নিচের 'Pay' বাটন */
.new-pay-button-container {
    margin-top: 25px;
}
.new-btn-pay {
    width: 100%;
    padding: 15px;
    background: #4285f4;
    color: white;
    border: none;
    border-radius: 8px;
    font-size: 18px;
    font-weight: 500;
    cursor: pointer;
    transition: background-color 0.2s;
}
.new-btn-pay:hover {
    background: #3367d6;
}


/* === চেকআউট নির্দেশনাবলী ভিউ (অপরিবর্তিত) === */
.instruction-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 20px;
    margin-bottom: 20px;
}

.back-button {
    background: none;
    border: 1px solid #ddd;
    border-radius: 50%;
    width: 30px;
    height: 30px;
    font-size: 16px;
    cursor: pointer;
    color: #888;
}
.close-button-link {
    background: none;
    border: 1px solid #ddd;
    border-radius: 50%;
    width: 30px;
    height: 30px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 20px;
    cursor: pointer;
    color: #888;
    text-decoration: none;
}

.info-boxes {
    display: flex;
    gap: 15px;
    margin-bottom: 20px;
}

.info-box {
    flex: 1;
    border: 1px solid #ddd;
    border-radius: 12px;
    padding: 15px;
    display: flex;
    justify-content: center;
    align-items: center;
}
.logo-box img {
    max-height: 30px;
}
.amount-box {
    font-size: 1.2rem;
    font-weight: bold;
    color: #333;
}

.instruction-details {
    background-color: #f8f9fa;
    border: 1px solid #eee;
    border-radius: 12px;
    padding: 20px;
}

.instruction-details ul {
    list-style: none;
    padding: 0;
    margin: 0;
}

.instruction-details ul li {
    padding: 12px 0;
    border-bottom: 1px solid #e9ecef;
    display: flex;
    align-items: center;
    gap: 10px;
    color: #555;
}
.instruction-details ul li:before {
    content: '•';
    color: #0d6efd;
    font-size: 20px;
    padding-right: 10px;
}
.instruction-details ul li:last-child {
    border-bottom: none;
}

.copy-btn {
    background-color: #0d6efd;
    color: white;
    border: none;
    border-radius: 6px;
    padding: 5px 10px;
    cursor: pointer;
    font-size: 12px;
    margin-left: auto;
}
.copy-btn .far {
    margin-right: 5px;
}

.trx-input-group {
    margin-top: 20px;
}
.trx-input-group label {
    display: block;
    font-weight: bold;
    margin-bottom: 8px;
    color: #333;
}
.trx-input-group input {
    width: 100%;
    padding: 12px;
    border: 1px solid #ced4da;
    border-radius: 8px;
    box-sizing: border-box;
}

.verify-button {
    width: 100%;
    padding: 15px;
    background-color: #0d6efd;
    color: white;
    border: none;
    border-radius: 12px;
    font-size: 18px;
    font-weight: bold;
    cursor: pointer;
    margin-top: 20px;
    transition: background-color 0.2s;
}
.verify-button:hover {
    background-color: #0b5ed7;
}
/* === Help Section (Checkout Page) === */
.help-grid {
    display: grid;
    grid-template-columns: 1fr; /* মোবাইল ডিভাইসের জন্য ১ কলাম */
    gap: 15px;
    margin-top: 20px;
}

/* বড় স্ক্রিনের জন্য ২ কলাম লেআউট */
@media (min-width: 576px) {
    .help-grid {
        grid-template-columns: repeat(2, 1fr);
    }
    /* ৩টি বাটন থাকলে শেষ বাটনটি পুরো জায়গা নেবে */
    .help-button:last-child:nth-child(odd) {
        grid-column: span 2;
    }
}

.help-button {
    display: flex;
    align-items: center;
    gap: 15px;
    padding: 20px;
    border: 1px solid #e9ecef;
    border-radius: 12px;
    background-color: #f8f9fa;
    text-decoration: none;
    color: #333;
    transition: background-color 0.2s, box-shadow 0.2s;
    font-size: 14px;
    line-height: 1.4;
}

.help-button:hover {
    background-color: #ffffff;
    box-shadow: 0 4px 12px rgba(0,0,0,0.08);
}

.help-button .help-icon {
    font-size: 24px;
    width: 40px;
    height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    color: #fff;
}

.help-icon.call { background-color: #3498db; }
.help-icon.whatsapp { background-color: #25d366; }
.help-icon.email { background-color: #f39c12; }

/* === Billing Page Styles === */
.billing-container {
    display: flex;
    gap: 20px;
}

.billing-sidebar {
    flex: 0 0 200px;
}

.billing-sidebar nav ul {
    list-style-type: none;
    padding: 0;
    margin: 0;
}

.billing-sidebar nav ul li a {
    display: block;
    padding: 10px 15px;
    text-decoration: none;
    color: #333;
    border-radius: 8px;
}

.billing-sidebar nav ul li.active a {
    background-color: #e9efff;
    color: #0d6efd;
    font-weight: 500;
}

.billing-main {
    flex: 1;
}

.billing-content-grid {
    display: grid;
    /* ★★★ This creates the 2-column layout ★★★ */
    grid-template-columns: 1fr 1fr;
    gap: 20px;
    margin-bottom: 20px;
}

.account-balance,
.plan-quota {
    background-color: #ffffff;
    border-radius: 12px;
    padding: 20px;
    box-shadow: 0 4px 8px rgba(0,0,0,0.05);
}

.account-balance h3,
.plan-quota h3 {
    margin-top: 0;
    font-size: 1.2rem;
}

.account-balance .balance {
    font-size: 2rem;
    font-weight: bold;
    color: #0d6efd;
    margin: 10px 0;
}

.account-balance .availability {
    color: #6c757d;
    margin-bottom: 20px;
}

.plan-actions {
    display: flex;
    gap: 10px;
}

.btn-upgrade {
    background-color: #ffc107;
    color: #212529;
}

.btn-renew {
    background-color: #0d6efd;
    color: white;
}

.quota-item {
    margin-top: 15px;
}

.quota-info {
    display: flex;
    justify-content: space-between;
    margin-bottom: 5px;
}

.quota-bar {
    background-color: #e9ecef;
    border-radius: 8px;
    height: 10px;
    overflow: hidden;
}

.quota-progress {
    background-color: #0d6efd;
    height: 100%;
}

.plan-allocation {
    margin-top: 15px;
    background-color: #f8f9fa;
    padding: 15px;
    border-radius: 8px;
}

.plan-allocation p {
    margin-top: 0;
    font-weight: 500;
}

.plan-allocation ul {
    list-style-type: none;
    padding: 0;
    margin: 0;
    color: #6c757d;
}
/* Existing CSS content... */

/* === Billing Page Modal Styles === */
.billing-modal-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.6);
    z-index: 1001;
    display: none; /* Hidden by default */
    align-items: center;
    justify-content: center;
}

.billing-modal-overlay.open {
    display: flex; /* Show when open class is added */
}

.billing-modal-content {
    background-color: #ffffff;
    padding: 30px;
    border-radius: 12px;
    box-shadow: 0 5px 15px rgba(0,0,0,0.3);
    width: 100%;
    max-width: 700px;
}

.billing-modal-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 15px;
    margin-bottom: 20px;
}

.billing-modal-header h2 {
    margin: 0;
    font-size: 1.5rem;
}

.close-modal-btn {
    background: none;
    border: none;
    font-size: 28px;
    font-weight: bold;
    cursor: pointer;
    color: #aaa;
}

.amount-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
    gap: 15px;
    margin-top: 10px;
}

.amount-btn {
    padding: 15px;
    border: 1px solid #ced4da;
    border-radius: 8px;
    background-color: #ffffff;
    cursor: pointer;
    font-size: 16px;
    font-weight: 500;
    text-align: center;
    transition: all 0.2s;
}

.amount-btn:hover {
    border-color: #adb5bd;
}

.amount-btn.active {
    border-color: #0d6efd;
    background-color: #e9efff;
    color: #0d6efd;
}

.billing-modal-footer {
    display: flex;
    justify-content: flex-start;
    gap: 10px;
    margin-top: 25px;
}

#customAmountInputContainer input {
    width: 100%;
    padding: 12px;
    border: 1px solid #ced4da;
    border-radius: 8px;
    font-size: 16px;
    box-sizing: border-box;
}
/* === Dashboard Page (index.php) Styles === */
.dashboard-grid {
    display: grid;
    /* responsive grid layout */
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 20px;
    margin-bottom: 30px;
}

.section-title {
    margin-top: 40px;
    margin-bottom: 20px;
    font-size: 1.5rem;
    color: #333;
    border-bottom: 1px solid #eee;
    padding-bottom: 10px;
}

.stat-card {
    background-color: #ffffff;
    border-radius: 12px;
    padding: 25px;
    box-shadow: 0 4px 12px rgba(0,0,0,0.08);
    position: relative;
    overflow: hidden;
    border-left: 5px solid transparent;
    transition: transform 0.2s;
}

.stat-card:hover {
    transform: translateY(-5px);
}

/* Color accents */
.stat-card.blue { border-color: #3498db; }
.stat-card.orange { border-color: #f39c12; }
.stat-card.purple { border-color: #8e44ad; }
.stat-card.green { border-color: #2ecc71; }
.stat-card.yellow { border-color: #f1c40f; }
.stat-card.red { border-color: #e74c3c; }

.stat-card .card-icon {
    position: absolute;
    top: 50%;
    right: 20px;
    transform: translateY(-50%);
    font-size: 4rem;
    color: rgba(0, 0, 0, 0.07);
}

.stat-card .card-content h4 {
    margin: 0 0 10px 0;
    font-size: 1rem;
    color: #6c757d;
    font-weight: 600;
    text-transform: uppercase;
}

.stat-card .stat-value {
    margin: 0;
    font-size: 2.8rem;
    font-weight: 700;
    color: #343a40;
}

.stat-card .stat-description {
    margin: 5px 0 0 0;
    color: #adb5bd;
    font-size: 14px;
}

/* Smaller cards for user stats */
.user-stats.dashboard-grid {
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
}

.stat-card.small {
    padding: 20px;
    text-align: center;
}

.stat-card.small .card-content h4 {
    font-size: 1.1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    color: #333;
}
.stat-card.small .stat-value {
    font-size: 2.5rem;
    margin-top: 10px;
}

/* Icon colors for small cards */
.stat-card.green h4 .fas { color: #2ecc71; }
.stat-card.yellow h4 .fas { color: #f1c40f; }
.stat-card.red h4 .fas { color: #e74c3c; }
/* === Dashboard Page (index.php) Styles === */
.dashboard-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 20px;
    margin-bottom: 30px;
}
.section-title {
    margin-top: 40px;
    margin-bottom: 20px;
    font-size: 1.5rem;
    color: #333;
    border-bottom: 1px solid #eee;
    padding-bottom: 10px;
}
.stat-card {
    background-color: #ffffff;
    border-radius: 12px;
    padding: 25px;
    box-shadow: 0 4px 12px rgba(0,0,0,0.08);
    position: relative;
    overflow: hidden;
    border-left: 5px solid transparent;
    transition: transform 0.2s;
}
.stat-card:hover {
    transform: translateY(-5px);
}
.stat-card.blue { border-color: #3498db; }
.stat-card.orange { border-color: #f39c12; }
.stat-card.purple { border-color: #8e44ad; }
.stat-card.green { border-color: #2ecc71; }
.stat-card.yellow { border-color: #f1c40f; }
.stat-card.red { border-color: #e74c3c; }
/* ★★★ নতুন কার্ডের জন্য নতুন রঙ ★★★ */
.stat-card.teal { border-color: #1abc9c; }

.stat-card .card-icon {
    position: absolute;
    top: 50%;
    right: 20px;
    transform: translateY(-50%);
    font-size: 4rem;
    color: rgba(0, 0, 0, 0.07);
}
.stat-card .card-content h4 {
    margin: 0 0 10px 0;
    font-size: 1rem;
    color: #6c757d;
    font-weight: 600;
    text-transform: uppercase;
}
.stat-card .stat-value {
    margin: 0;
    font-size: 2.8rem;
    font-weight: 700;
    color: #343a40;
}
.stat-card .stat-description {
    margin: 5px 0 0 0;
    color: #adb5bd;
    font-size: 14px;
}
.user-stats.dashboard-grid {
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
}
.stat-card.small {
    padding: 20px;
    text-align: center;
}
.stat-card.small .card-content h4 {
    font-size: 1.1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    color: #333;
}
.stat-card.small .stat-value {
    font-size: 2.5rem;
    margin-top: 10px;
}
.stat-card.green h4 .fas { color: #2ecc71; }
.stat-card.yellow h4 .fas { color: #f1c40f; }
.stat-card.red h4 .fas { color: #e74c3c; }

================================================================================
--- ফাইল পাথ (File Path): images/bkash.png [Binary Content - Base64 Encoded] ---
================================================================================

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

================================================================================
--- ফাইল পাথ (File Path): images/body-blue.webp [Binary Content - Base64 Encoded] ---
================================================================================

UklGRtQEAABXRUJQVlA4TMgEAAAvj8FjAAVFA4Bqa9f7P14MQ4yIiBgSsRgW316rZvat/3ZOEf135LaNJGVOc3Nplk5c8QfO8avRaXkRWzSJMwnO2STKiUVTMWJoE02L4ldsGHwygXeHpUKw1OFMGJK3gS8r5EeuWk4KaKnosum7bvrOZhcthXAYqjpaIL8GxVvYZiz66o7BwCiFkAxsgV03/LowWxj5Am15/DrU00fDYaTpjyo+n9GrATIcB7BecDyzXnCHJoaPLPqzQl8cvwrlcaKgO47Eh1gG5XEaxodgr/wzyA/BHbLyL8s/2EVUfjEL8ENwVGIID8EZ6sL4NSaoN1KxzkgcLQHJlRSWNjtQZ7pRzS7WPjtmS0gXKZ0wzQXX6PKNFPFccMErVSFIbYqhxhvVCsRtUfzIB5a7vkSTr18DSoPjcfRuIhipDAQXwsn31lFsA/WRJoIzUrlzkUJIE8E+8oBzImhjwUBpIJiDp0Xxa9MO3zREOJvgWU0Fm4aIRibB1EyC/wnmx+SmBbENnsY4Lz944nJQCA4DwRnnhfm4nzrAtFzgwdPYzwvjQHBUCCZeDb+OxDKfnTIkuTWdiimp3lrZ7pHnM8JRbq1sgVgVguO1lRXCohDM6Put6VQI7rdWVhLkOQZhwr4UflVrpAldZivtUFaBDUOZxItgrfvQIP4owyiGUY+hake9y4xISsHF8UL4HcAGG9XqPQBbvAeD/SRQTB4KSAODh5Isxi7DsQ5+lG3e3GHy5sI7eozB5DEeRo+R1sFvHR78Ovit445qHfyyDYNYit/1Dre87g73l5Ufr5/fu/6/8Ae+WQc/EMtJjc9f957PX2d8/hbTd30d/F7Yn8b37E/Ty/rTTOvg16Fa/nrS6+a3Ypjf0DS/8Uvnt3XwO9mxUm8w+RvN6G/Aj9aISg4d42MqMPobzeRvBJ3gC7qF8DsbUpW53AxXqQmS0f9TCC5IcntYdJWNZ/D/xOj/JUjXDxWyQnAlbOdS+J1SvMkfj6Dwx7MYjHU38seTxh9PI3/cWfzxrPDHweaP+yLnMvit4z7vX2B+PvCoFyI07K/VSE6/+Caa/bXUBuqTZn9N9GtojmI17K8hjXoiDn5R/I5WPNbrlbKLtU03MdOtW+2IZbZtKW243xm4yUTwbL+zTwWH4X5nkykGxH7rSNN0a7TV6NJFZkX/g2Ed/JSX2OLpsOw/O8v+80m+6wTf959FN815Oi37z86y/3yQl8HV+Lr4nf1HD+m9h4jSPy4f4LqgAQNdcg6L43dWKCgGHzX7l+VnYnxZfsZnMgjGAvVcHr+TTBcN/TPv1LtBEzs6l8HvZXc7mCxVX3lHVU13VGi8U18Hv9+cO/X/cOTet/+593nuffufez++Mb/tf+5dmXvf/ufe65flt/3PvT819779z72/f+59+597H+fet/+591Huffufe3efwW/7n3v/dz33vv3PvY9y79v/3DuOa/ufe3cfwG/7n3v349r+5963/7n3NeTet/+593vuffufe/+Y3Pv2P/cOGgzb/9z79j/3XpaRey/btNz79j/3Dg8M2//cO8wEb/9z72+fe9/+595Bh2H7n3vf/ufev3ruffufex/k3rf/ufcPzL1v/3Pvv2659+1/7n1Fufftf+59+597PwE=

================================================================================
--- ফাইল পাথ (File Path): images/ha.jpg [Binary Content - Base64 Encoded] ---
================================================================================

iVBORw0KGgoAAAANSUhEUgAAATsAAAD1CAYAAAAvSVK3AAAQAElEQVR4Aey9B4BdR3U+/s3MLa9uVZdsuVe66dXGgDGdgBwgQCD0BAgQTDf/hZhueoBAQgvdBtM7BBPyozsYYwxusq0ubd/Xbp35f+e+XVm2JVtlJa2kd33PnblzZ86cOTPnmzMzT2uN3tXTQE8DPQ0cARrogd0R0Mm9JvY00NMA0AO73ijoaaCngSNCAz2w28tu7hXraaCngUNLAz2wO7T6qydtTwM9DeylBnpgt5eK6xXraaCngUNLAz2wO7T669CXtteCngYOkgZ6YHeQFN+rtqeBngYOrAZ6YHdg9d2rraeBngYOkgZ6YHeQFN+rtqeBPdNAL/e+aqAHdvuqwV75ngZ6GjgkNNADu0Oim3pC9jTQ08C+aqAHdvuqwV75ngZ6GljIGtguWw/stquiF+lpoKeBw1kDPbA7nHu317aeBnoa2K6BHthtV0Uv0tNATwOHswZ6YLdnvdvL3dNATwOHqAZ6YHeIdlxP7J4GehrYMw30wG7P9NXL3dNATwOHqAZ6YHeIdtyhJnZP3p4GDrYGemB3sHugV39PAz0NHBAN9MDugKi5V0lPAz0NHGwN9MDuYPdAr/6eBu5IA71v86aBHtjNmyp7jHoa6GlgIWugB3YLuXd6svU00NPAvGmgB3bzpsoeo54GehpYOBq4vSQ9sLu9TnopPQ30NHAYaqAHdodhp/aa1NNATwO310AP7G6vk15KTwM9DRyGGuiB3W51ai9TTwM9DRzqGuiB3aHegwdBfuecmqODUH2vyp4G9koDPbDbK7UdmYU2ffvjlfGvfuy80c+95zfJ194/Nv3Nj/zu2u9+4aFHpjZ6rT7UNNADu0Otxw6QvH+++OJg6jsfPWP8a+/92+lvfPAZG7/4rucG0zPfHXLJVwZUeh+kjSGTTZxRTzb+aOOl7zl/21feet7UF9920fQX33/h1ov//ZG///3HfQAHSNpeNT0N3LkGemB35zo64nJs+eF/VY92a9/V39z2g6F85stqcsMXann7U6M3XXNmMjUB3ygYGyNEgqrrhHZs3bsrjbGv9Lv2v/Tp5I1LXPtL1b9ueTF6V08DC0gDCwbsZA/otnoRo2t/87/WxN/57Hu2XfLhc93PRrzb5um9z68Grvve5/tsPPXz0NevyNN0kUsT1Eoh+vrrOOH41bjiD5cDTDOegU1S6Mhh6cAyTE40AafgWtNwWWv42Fr13Vd94nVP2Vm/onf1NHAQNLAgwG7yu19Y3fn6Zz4cf/3jv2te/L7/nPzyO+8+/qULH1gb2/C/3ujai4P26KsHoplvZvHy1/cAb/+NEplcqqrzyTBLz4iaLRjjQbE6l2doTmwjmGU48cTjMb6NcX4JlYeqCWCjDJ1GDOQOylMkCy/qlLZd9aevjn/mHV+Z+tYnn/L7j/eWtVTlbt+9jPOvgYMGdqPf/GR98rufuMe2z73v0aVk5kudaPM/deKt9za6+Tydjv88Hd9wadXr3MOvZ/QkxuCXYj9tjL755m3lf55/NfQ4igbyaPLx/S55om1Mo14uA8oQwHLocoBatQTlUgwuW4KJiQmmWyDLkbc7CMMQw/2DaLcT0A0kKKZA1MY9CYxh2lyjpke/sHQgegN6V08DB1EDBwXsrvv6h44frulfmKmxnw6Y/JKpjTc8oOynqNU00miaS6ZqP7Jo6dbN65GnbUDnsJ0WSjbzhhUu3PK9/3z8QdTZYVn1+Pc+3zek7Yu91pQ/VAqQEcSSVgQ4x8kmJnbNwNQqyDodLF++HO3xKUyPjWN8bAuIchhavBRTo+NIWk1Y5WBCHwN9dUyNbUPFy8NBlZ2/9esfP/6wVF6vUYeEBg442Mkp3RJfv3d6w9q71yv+kM6ataqfY2rrBth2C4HnIYsT1BctRTt1SBwP9UwFulSDSnOU0rTUF7dfw2VR5ZDQ8CEiZNQcW15K2g+2jUnoNIbnB9i8eQvSOOVko2F4KJE1Z5DnOdZv2oirrrqaOOhQqfq4+uo/FKA4PT4Bay37qoxWEsNVStg8MwaLjMvdrIrWxMghoo6emIeqBu5A7gMGdm5kRG/6+kfPOHrdzDNVe+qsemCA5iS45YNqNUTAPSDXSRDqgBvcCkaXaXA1tGZSgqADWjQ649MQE/id1hknD7Qeh941bxqoB3qJ7TRMqeQR3BwcJ5Zly1Zg/fqNmN42Vixd165di9GJcRx3/Am475kPx8DwEtSG+rFy1TLYqWm0m22U+gbRonfnV4ltBE0e3cIPFNLGDIZLwf17Bxbz1mU9RnuoAb2H+fcqu/vZz7xNpw+d36/i71ay6FMuavXNTIwCxDtrcqTaob9UgWqnQKLgZwFCr4ZqMIAta7dgYuMERjdsw9Yb1mLjhpuw8aZry9n4lvfMfPFd56/78od6S6O96pVbF8qzZFjLPh0PIyBemVLYymUptMfXDLVaH44lyC1fuQJhpQZYKa9gcwtlDLQhcU7KpmdQLZWRZRkM0+r1KrciEvieAfKMDynXo54GDrwG9IGocqxx3YOGvfwCHc0sRcylqsoQBB5anQhcqXLmL8ELS0iSBKBHIT9h2LJuI2QPaNmy5RgYGsTiZUsxvHgIRx29HCuWD2Ggv3R0PdTvXlxRP7/uS++954Fox+Fch3PsFO7TQSnQ1cbGTetRrddw3IknYfHSFSiFVfh+CGUIfqn0UwYEJTgLbNnCiataQ6lUgedxv4/bEGVjsPHGG7FieBgp+5mnGIiTbJNS3NA7nBXZa9uC1cABATs3PfOgMI+rJZehGvooVcqo0DuIkoyegUZGg6El0Xi4hFJ8yTpoT41yebQEpUUVuH4fqPvQNYaB5slsgHYeIUqbcFFj5UCgX3vd9z4UYr6vI4if8Srb2jEBjGAWT00ipodX7atSAwYgyBEMBazo6HmcqAKZj5Bw2Xr9dRuw+qiTkDY7WLx8BVCrw6QWeaOJyXXreNg0iHJY5hzXsR3tfZwMe3dPAwdFA/pA1Do8UF2FlEtUegSWlPJED1rRaOgZJAJuDtzLgRf4sFkEbhhxCQSE/VUE1YARBWtoiCzD9REQeIWxBQxNnmJRX+XBnank2APRlsO1jpnUTpT7BmOZdFpJhKNXr6Qz5iOllwbnsbs8iE+W8tvmzRuxbt3N3M9bj1XLjwKUj7GZGQwsWQQ02og7GbZt3Ir73PM+wFQTyD3EfvlnNzUHvoze1dPAQdKAPhD1TjYa9WbUAcIAmoCm0K3WZ5jzUCJwPpRV8B0QdVqAb+CVfaxfex0Ia0hbLWStCO3pBqA8Gg8Qwocm/vnOoTM9NbB4cLiO3rXXGphMZ8ZVue8PUZKiOtiPoFZGxonEl3089gsPWTkB+Twpj7B1y0akWYxly5ahWu3DdWtvRNsl6CDF2nXrsXHrKKq1AUCX2FH9TA1/uqmV/uO9X/SidK8F7BXsaWAfNaD3sfxuFa8O9HvlOrGI+zhpmoG4RszyuZytQH7K4DKillK0jRLywqo0BhcNAwTDKy//I/7w68tx3VXXYu1frwO49M1bMb1A5qVh2ixHyfhps9UgExbp3Xulgbs+43VT0+3O13LPg/I9JJ0ZaG475LLfRu/O0z4MDx7K1TJ7JUO7NU3v7iZceeUfMDDUj8gmuG7DzezDCmJrcBP38a667ibccMOGm9aPd/7h1BeOXIve1dPAQdTAAQG7sWmakaXXltFFMB609uB4GJHTO7CeQjNPBNcAxmOt4LRBpT6IRcNLsbhvCVYNr8Ti2mIsG+CeUGUAxiszr48MGiYIkGXZqGf8yYOox0O+asWDg9jaX5aqtYnMplBGwYQeTK0C7jfAcpKSfThwL2/5siU47bRTeDp7NO52z7sirAU45qSjceLpJyOs92P5MSehtnw1qitXt13fkqvsScNb0bt6GjjIGtAHov6gWp5WnuFBRA4JNUFNOU3QCuEZA8+nGNpDg/s9UWRpaCG3+CymJptIE4tKuQ/WKdT7uTSKYorskBMsiZvc64uRKftnTJW28EPv3gcNJCb4w3SS/zpX7BOtIP9qBQn1zX1Wpx0E/OByyI++PfZnqV6l/nMMDNZ5oJEgJUj6oeEpexP14UECZbVSW7XcO+G3E+k+iNUr2tPAvGiAKDMvfO6QCVem12tjoXRK0IppIBagQcl6VvMEsDMxjYlNY8jaDjY3uPKKa3DdtTciBzBEL6J/+RLoehmpgCKNybkU2sbwVAJ4MSId/fXY5z6XJxss0Lv3WgNHnfeqTtMFH9BBFTIZae6HQnF3QMikPDiivtlv46MTjGtwz4EntC2AQOibgH62QqVkUatYBCbjNkWAza3Jm9TICDt8r8U6kgr22rofNcARux+5z7LOnPt97mymlIIBSRvEMT0GvtcIYgM8dRUaHB7AUatW4ZSTTsDxx67GIu7b+aUAip5gZujNFdIqwGgo5QiaTDM+EhVcj941LxpoZs2fR5m52iYK4D4dlAECn31gAE9jdHQMS1euYjwEHAhoZW5LaB4X+ah4AQICo847nIgsi3PXz8en0Lt6GlgAGtAHQga/MvDnttXXWnhQOavk3l1YLSFNW3BeAhXkUGEOGIlbBFUPYVkjVCnKvoOvc/hKFeBmoWBphEKJorfnBmCxdP2BaMeRUMfp540kM7F+ia4s4mxSAiz3RmOLJM15ApthvNFAbclSZDzI4LIXifO4paCKk/EgAzy+130f1RLL2fjr933m63+H3tXTwALQgD4QMiw759kt61Xe41SJUOXDxhniTgd+XwWCfYr7P0I5T/+yuAUkJNsBZJlKckih6d3JvpHksYo2qCg6SSFILbT8gTX0rvnRwM0rol9OxvFVmV8BSlU4etJhGMKnh7d0yRBK5QDSB476N9w4DYzPZasGsoQdk0IxrZXYePN09LL5kajHpaeBO9bA7nzlCN2dbPue56/1ic9bv/4n7nVDV+sw3HvLuJT1XBnIaVQ25J5PGYpeW05IhFZQFQ+5ySE/KParGn6JtkTgA5dKjqFCDt918kC3m+hd86aBs84aySL47+ooYCZpI1fi2ckEFGGwvwaVp/B4Omu4GWtyC7iEdfM72A0uprdu0HDlX9zreSOb+KF39zSwIDRwwMBODEgFfa/pWDPVmWnBcBmUZRk9BI2EBpPJP5KFhiHYKaUgv59zXDoZxo3WqJVKKAUB9/ws98NzwOXcRE/hYDXXVzTLBaHPw0aIdY3or3nfsjQpDcMMLEeMEqIURb8gS6FtDo9glxP0XJyAa1mAe3oyT7Xh26arfOCwUUavIYeFBvSBbMWG1s3/bfoXfaQ0MJzlDvBDD7QYKO7LOY8egqE0BDYNT2AP3LID5A9lkDR8CNR5PCE0JJ9LXgWLTJkg8sN+9K551cC6UbduNB9ev80uxaZkGO3wKCT+Yji/D+ww9htAxIMJQqiwDJgQ8MtoqCom81L7xqnoZubo3T0NLBgN6AMpiWx+b5jO3z+R5d/PnAEdAx5SxBQhAzEOuU2RZ1wGyZ/SUEQ+YgPZsgAAEABJREFU49OV4OecyEj44+YR0N3kY7oHZT1kMHBWH8dc83b3GAFXbyunn//Ztds++bN1+OhPN2z9yeYB/CE+HjeV7o4bvJOxuXwa1gcn4kZzAm4OT2P6XbE2uAvWlU7D1upp1RtmavQDe5rsaWDhaOCAgp00+9S/f+l41l9//nRsr/KDanGK53EZawhwPIOAHEJkKkeqczp1OQ8DNXJ+4AEuLAFQDjmQB+CGHqnEk1oPgafPcM4p9K7508DA9Mzvpoc3fmfTML64fvnSN/w0xfO/No2nfmYjnv/tCP/4A4vzfx7iLb+p4sLf1fG23w3iDT9ReNsvvPQNX1+vfju9qHc4MX+90eM0Dxo44GAnMi875yXb/IFFT+vE+Vo/CLjNo+AIePLNGANtDJTRJE925CB7QcozXEKRPI1MOSQ2Q8wyHfEQTfkel73lLUbK92h+NDAyMmK3puWJzXoxNvjHYL1/Im7wT8XVOBWXR8fjfydX4b+3LsaPN1bxlSsjfPsGH5dtG8L31wb+n9tL8dv16XPmR5Iel54G5kcDen7Y7DmXocf/09WRKr0HYQgYhdxZZCTLrTu6cAQ/cDPcIU8tKUOWJ8htjAxtOBNDhykst4oa8OCqwyf9aWiosudS9ErckQZMybW0r6F9HwhqpAHYYBiJGsZMPoDppMrTWh+pX0PT+ZjhIca0rmHK1dFSg9V7POfTA3fEv/etp4EDqYGDBnZKKdcJy9+NrHdVajwaUgAo0yWtoBiXfw/rhTXkfj9ifxCtYBmmwqMxWlqNjf4xWGdW41q7HO/92q9v2Dge3g29a141kLajUe10MelwcxVyOp5x8km5Y2B1wH4pI2MY1OqIFRBBgR47ga6MLQ16696qF8+rQD1mPQ3sgwYOGtiJzCuuGN045YKvp14VuVdBTCOK0wQWDsoXAKxgKvcx5vqw0a7ANekx+FXjBFx680r8G/eJLvwp8JpLN+Fbm4fOvry19AnCs0fzpwHngi01TjYl40O5HMpGMK4Nz7UIaw1Ad5AhR6vTgec79lqCJG4BfhWJtwjjaf+b50+aHqeeBvZNA3rfiu9baTUyYq+aLH39mmgVNoSnYrT/DGyu3xPXqRPx26ml+OmmGn62ZQDfvM7Hp3/XxId+uhkf+vFGfOqXDVx6tcaPb6oRAI/H2vQo3NjpPwsgWu6bSL3SO2hA+aX1uVOxzXN6dQlcEiFPWkg6DaSdJvJ2C1mUMIyRxhkQtYFpgl0nhbMBUlUu3+XpX1y6A8tedKca6CUeCA0cVLCTBn7z2mDr+38bbHzdd5vpyy6dwUu+EeGl3wNe+z81vOX/luBN/6+C9/2hH5+/cTF+PLESV0RH4YZ8GbaYZZjwlqCjV8GvnYBGXLnbGS+8pE949mh+NDAVp+td6LURaOjAg1fy4ZcrMJUqUK6T+oESt+UqwwRBwFMVBH3DgPKAqIOZqUkmZn+L3tXTwALQgD7YMlyXroz+b2Jw5f9uXez/anIlftdcid/MkBrL8YfOSlynTsBN5lhs1sdijMA2oYcwYwYReX1w4QCsKtPTABodBBNtfc7Bbs/hVH+t6k9alyS5y2H5HxeygPKgVQgYEvfroHx4lTq0X4bxA9g4haInWB0c4KcAka49Dr2rp4EFoIGDDnZjrZsjugNj41k/msEKtHU/2s7AVOtIuTNkleXiVANKiB6DUgANr/hZnaX5WS6dVILYKmRB7QX82LvnSQN2Om4FRC5nuUTVHhxCwJbZKwF4PA5u4pEYTRLYMEDsGfBcCT67KYobiAmMncoxS0959mfp7qF39TQw3xrYI35EkD3KP++ZL//Ei9rtNG77lQHEMwkyeg1BrR8d+YvEhuL5PrgrDuVYNcENTiKAYoJRgCEYer7hiWFOwAvPvu+T/61nWJifK1lWS40TpZOfY1+AeoaEQkwrbguwDyCTkdbgnAMQFh3TLMGulVVP6aiB+zOxd/c0cFA1sOOoPWiCGNUca0cTCBcPEsscEm56a1ki5QpIUiC30DQe31Pw6DVI3FmLPEuQc8nkaGHGK9PZ8NS0Xzn3oDXkMKt41Z9+mzvniGZsmGJfgFH2A4qQ75x4lHx2/F6QDCcNV+SVONBoNILcmd4/56OKevfB1UB3RB5cGRDFo+vrdQ9xNAPXiQhsAYwOAfEmxIjgoGhgznK5lJMIci6O4OIYjmAn4ufExFbbIg0GnijvPdp3DVx2JqzLbaakH2bZcYoBlENxCagVcb7zhlNw7CmZoxhlFg1rHfyAJ0h86909DRxMDSwIsAv8ZGMSTQNRC5WBAdqSRtpJEdBb84MAmk5EnkbIOk3Y9gwgv+WiVwGloYwqvLuAG+SZC2H6Vp5xl+d+6qi9UGqvyG01MPL/OedsC4JcyoAdA8BB9lEZYdQxsIQ3kmVfkCSrg2YuAT5mYd/NtKLH3vfZve0FKqt3H0QN6INY9/aq07ixqRR6CCpVRFGEPE1Rrla5nI0IegmseHBpRsvJQcsCuJbVvgePQOj7PgKGCff4gmo/1o21V8W2dF/0rnnQgHLOZZN8UPez7BT7ARZKEcWKJMbl3YFYKCBH0pi9FDwTAF7p+DQbrM0m9oKeBg6KBvRBqfU2lXo62Ba34wLcNDe5QVcuyVLaSAj5Q5HcyIMyBl5Yhl+qMAyJdx6KvOSVTE2h1NeHTjuCrgz5aTDU+6dj1Mt83M7lTWB2mBDQBPjk8AEEuIJm9/AMvylZ7iqplfmLkN3HfmzHFk1buot86VFPAwdLAxyVB6vqW+q1iR7zTAjjh4XHoOi15S5HlsVQ9PBMuQI/DKGVh5zrJMcDiZzGlcMhpRfoEegSLnPB906cI7Klh5yx5p39t9TQi+2tBrSzBDuWpr75BAhuSnWRTLbr6PtBUe/A7FASwMMOFycp+Xe0qV/7xx1Se9GeBg64BmZH6AGv91YV+l7/FlgPjns+aZ5B/qYdHJdLNCznLHJLGLOGJuUDymfIvIrLJRqYMX6xZ2cdTyh8NieziHP/Xq1g6dHoXfusAWvzaaUMeNIAFCBnkNmcUYG4nGnsHMxdai7CUNCRxFlJ6QCprj6Gib27p4GDpgGiw0Gre3vFWUdthvPgHI0DswakHVQpBAr70Vw00eAIboCBpfFZMP8s4DnCH+gFIvDg1+uYbET9unzUA9C75kEDbpxI1+XjGFDnnI0YueWW5FveGJMEIUahNfdhMzQTjVOefWnvN5Cikx4dFA0sCLAbGChNVYIQzlqElQqQxoUyXLuNrmGJmBqWyOcKwOM7vQwn7wrQhkDIAw5ETaQzE6iU65hJS88smPQe+6YBlbdAzXeJrIplKvXPqHLgNCNxVeRgElTxXWJdCrj9wA5CK8rR6Njzuqm9Z6GB3uOAakBG6gGtcGeVJa20HbUbke8bxI0ZKB5EEMfg1bjtpuZK2LnIDiEBUAxOM1NCgOTJrA5LaLcT5Lr2gLs8/5u9v7ixg7b2JqrgZhzVK8DWHSx8KSYc4Ubls6Mc351MPvxU5LNgKoormZxEqVJDWO0DgvrfF4m9R08DB0ED3fF7ECrescqrLzkvGR4sTSkbw6cnIAZDxEPWFM9OctJ6IIYlJHFJI9G4wD0+xngbiHuhuBQOwioakfPGpu0afujd+6ABp8BZRPROJnwBtxsgUMb9VGy/NHhmVPSQnMoKdTvDwu8fQjTdQEKvPYN/FEZGFsSY2y56L3LEaGDhDLx8Zn2lZJBGHdjUAvL/IvW5Zze7LKI50X/IaGb8BtJsOgiOTv7ShtIoeT7yZgtJkiHnd688/A9HrnGN6BPOfVm46gGvLK9aQ3rAmrK87+nIVi7jjLNjKQ6ZAvCYJoBHPTv2DDsGjrMUby5lURB4pUkCBAFPzXM4eNV7Xnti7wff1Evv3hcN7F1Zjty9KzjfpaJocn3a4RKWjEtBBfKHAbgWBS2EhmNpS0I5oEgCdpCL4hMUvWoVoGsRNTso1QdQLpfR6cTIdXDPE65ZcarkPBLo2LP/eelpT3rbuUsf/tY3LX7UwLcn9el/jRbddWps7Nh2vvicTTPuhN8MPGTkU8c8+m3POeHx7zx9d3RiwXlDQE1IQG2WBNS65dkH7J1uvPvU4ggW+fmepvCDEhQPKpzS/Z12chZTe3dPAwdcAzJSD3ilO6vQ9731VvswPGyI2i3kcVSAXDevRs4lq1OK2DcnMs0QpNBHRm/QaI0wKCOmlydAJz9AbtGpaJv+w/4PAxz1yNesOPqcN7+24y3+6taofOlkXvvX0bZ6zHhTHTPWQBChjs3TbmCsE959xg49d1vc/+mNk97Xljz8LRcd/eCXHNfV8c6fGkGirWFfaEKaBTuAGRnyCXp1isAmVHyYBTir+HH2mxeESDtteGGARmKRVYZ7P/imenr3gdeAPvBV7rxGpcsbYxfCGg/wHAzoESADlIWj8eTKQ6oCOPhgBhpezjAFHENPwXKvznJfyGM+owO+a7QyD7Z69FknvOxDXA8z+2F4L37U2/5hCit+O5oOvnMiqT54sqNKCbUD6gSK+kFEHZFUxqmBevJCdPIQseo/eTJZ/C+T5thvrTjz9afsSjVeHuahK7FLDDT1a8hTsV/YK1CcmBRBTVP32iXQLoNMSrkyZGcg3+RfwISlADyCQqRLaFZWDfFj7+5p4IBrQB/wGndRobPBFqVCWO69gQAnBiVUZC/SiHhKqCsyzRbKWaCgIlf34RSNToMBeXmYbLkzbHL8XbHL69D7cNqakWDZw19z3+qDLvj+VNb3yUZWXdlxZSQEJcsJAUomBOpJ9AXqCDkbKS4Y4wQnR31aTgqpDpGYRaePtyv/c/wDX7yEmXZyC2hR78UXli945SA36p51CLDym5J0xXRmdaD+mSZ3nhF6RQ7DvH6IFsJjT3/eD3qAJ8rp0QHVAEfgAa1vl5V5cJuNeCM0TqUUBKyEblegsLJuKu0KkHeS5LWSwDWVJVh2cwD1anVpY7K5W/tTc2UWZLhmjVn1mLfedfm5H3jB+m31T+beid+z4apHpxmd1qLx7EpnqA8BOpIjQd6F5BtbRQ9M0TMDYkJUBKVixFkHYb1vcVxa9n7muN3NhWdg2Se5tsgL/VpA9Ms6LUHTSRpYLQEOBFJGd7gtwlIJ8scd4FOeFqEuDE/ruPwOl847MOhFexqYNw3QCuaN1z4xUsgnfYKdskSu23Gigc2h2u2+SYI0Qxc5ukAnPKSMxdjWUfQNDJ0NzJml5D906KiHv+n4xQ9768sHx+/3jZl48NszafXjLVSfOdpIhztyKqoFbdheNUeiiy7AKaJTN1lBscmKoAWS4jIUOmYKtwlsikaUoZH1PXLl/V6ziom3ui2yINcZyB1dDYpemUUYOklFkS7fhPgFBRhKxQDkj6sqict2A5ezzcb0oiROFvNT7+5p4IBqQCzjgFa4q8ockpmSp+hu0Jhu6yF0bapblHGxnVuITRArExLvgsbsaJyQDCwRlCroxOqxpzz5I4fM0qvoTTwAABAASURBVGnZQ96+eNFD3//qRWf++1VtHHN9Mxv6YJJVHxdnanUnizgfdOiyiiJabGGH/lsE32azlBahJ/trFvIX7QsSdQiBe3dQOQGKpHN4lQp0qQ+xHhxou8pDyfBWd6IzJV6dpWfn6NEpMhECNCCeHeYuRZ6zwDeXxFApBc3DI1A+xVC8vHK5VEbv6mngAGuASHGAa9xFdSF0Eho3zpMFOHorOb2GnACm3I4FaL00OBDQuoQC0+byMHthcN1vzAtAcbN8Yro9FJcW07vDgrxOOPP5q449+zWPXPaQC94y8LCLfjuDgW3Trv6eiSw8fbyZIvXKaKUZUkfvVRvoMATkryMkKZtKBUnc5QB1JvoTUswLaKZpakvDQcEqCT046gSESBCIsjhB3orgdNkrVwZuPyHkKBf/ZtkpgP3ilKMOhSRQfHTvIkXyyGuRRyJgFd08SuputxF4PoxXWoHe1dPAAdYAreEA17iL6ozLosDYCVpnkWPObrovIuYseNGquuYDHkSAYKdI8h2zVzff7AsUjdrza4hRfxkW0HXaaSPBike95/HLHvGeD097J399wi767rSqv7ml9H3aqo2sHMHqcaASIzNt+H0lYpiFSxzsdAovrcH3Btk+njyrABkPJQrSPjLt7UD8znfHPGCegkCwVCQJwwrrIC8CVNyebtxWRUqpEpzXTS4AtBuFmw0ZFH2lGCHtkMwE7g5GHfjcr1MEYhWESNOUnnZ+v+Jj79HTwAHUwI4ocQCrvX1VSjWTQKVjtBd+FLHohfCFNkiDZhJvxZNX+icEN77M3prWxWzFG6MQw+tSF/TSVJZrIfKg/8HHP/Hg/7n2M854oX/UI9/89NGjFl3RMYu/MRZXXzpt++/dRt3v5Aa5HwCegYubQFXibBWxJm3OgKgB6ABBbRg2dfKrDr4Ti7TPdgtpMDeceFFcqhaenipU030IWG0nMhUQi7lvBwuVTbYC3fptN+OOT11TUga6SHRKGArxVSpjsP2eTe6+2yII5X+JyT6wOff96H36ciIbJfdbs+ZiU2Q4Ah+9Jh8cDXRH8MGp+1a1dibH2yUPG1zGpRm9AG1o8Awxa2SgQUoBAT8JdyQBvB3fbx1XSDONdmYQlfufdetvB+5NQO74h735rHWVY38+lQ5/cbSdnDqdtXWmcyR5zCUql6EEApsRJORUVdPjitk9joCXEhcCvgu4aINE/sdDvoIsKZ1iG+Qh3zgZABKhDhVBTCeAkjhDF/MTybIe5tFyEMSqEJSA9jRqGLtm86/f/Rfc5vIR9KOYbigLAJtLqKEJqGB9Uj2TAXkHvylhiu2XeHLyEgiIxzGUUjBe+di1g5PMjN61nzVwwrkjfcc85t3LTjj37YvlJ0v7uboFzX7BDLjrv//yeGZ06ybP0HwIcjmNUsxWtLcd4GYNqQtuGrYwMBrgbDokLLwQKdWlcqkKy2VcK9XIVO3JJ5x74H9gfM/HvPHeN+klH5/MF/24haEHNCJ6VQhg01lgmNtDgwEcl5dzlPtAxi4SfMqpDeqE61jmyQBNIuBB/hwWvSYmMk0BhjxFYUI8VEAe8ZOF9gx835MagCSBjQmCXFKiOYmBmkJot13Y1dhtnsoMaOpU2IEhBNDoESoHFJ42+wq7uJwCgS1ATgDPsgzl/n7EUYKJ6ZYoYBelesnzoYFjznzxMcvPeesrxrPBS+JwxW+nvRU/3zZe/cDRZ53/oPngfyjy0AtJ6HLotlZKATj9QwnoQS7FhxBtljG5LUHO0ehobwQ8SSHR+njDMat8k7iicTbbHdDSobSP8sDSu6h6cED3i446+4KnbVPLvjJuBp8bVQdMXq4A9FphDTwuW7X1oBiHeHCOh5SuyoaSbJnpHjwLhASU0OXwkUOBICdAZxyg+U5wC/jOLQB48o15ICTLWKWAchksRHCLiYsJZInr0YMM6NGFnkaNjl2Yjn7ipl/82zewk0spPQDqWsHxCSgqmOJAAdBqLo0vO9xM3v6W8hBF/sSTlEmiFIYenl+uY6qzeHB7pl5k/jSwZo1Z+eALnp2E97h0Kl7+/qm8/1GbtzSOmoyzUxswLzF9y756/KNef2j+qa191JLex/LzWjyNm2Pcwc78IIDLachirFIDQUuCLt0ishhudynnaIS2+xnyfY4APwiQ0bPQxseW8ZlSWw/e7ucVswXnPVj0wFe/YDSufmlj0xyHsA9tGnvcaEBTJvFOQ78EpQwcCdJGIZHC8UFSQvJbOS45FdFC0btTYDvFwxOvLE3gMd0RCOX3bOI9IWMh3mQKWWaiQ7AnOx2GCAJ6djaCi2bg4mmEdgaDXuuP/Wrsjcyy01spv+YorNQhGRQM+WqypxwiyxwVsuviG7ZfGh5BNeKEYwjwcqqbZwoe2x0b/zT0rnnVwNGPfd3gki13uzQurfrspvH8njEq7Gf2U7WGrNNGzJXETdvayyay2meWnvXmJ85r5YcAM47OhSNl2dgxo1XXOmnMdCJuYzyzstKwHL07eSvySERZFEDAbxCaBb2MHVyid5OSX5RbVJee8MjT1/zn7X9iITzmiU47bU2w4sw3vjrxFn0iNjUgoHdVeHRUt2+4fI1QLpXQIvAVW2D0zlDsr0nTW2xHiyDWYQsyKC4/rQmRqxKs8uHZAAG9wZBtDGblzZXH7wZgPnglwKf3KKEOGWcuRTVmbeTxFLxsGgNBhJUDFscOu2tPXGxfeO1lnxibZXW7wHqq6rjv50S/skfHeskOBZ4aid2uyK0SnFZQHiecJIMmqJfLVcxMd9BJ9Tm3yth72WsNrDz79cNLHvmWF810Bq+fQPUJY9wqQM2HRQswEcdMk7wtJ7sSwtpiTCYVTOmVl/ad9Z7H8sMRc+uF1NJK2dtWCv1OzqUPewaw9g7FKwyOOeYMkdHZWwGOxDetNZ3FlDFLHKhh01R0/1Zp4EQm7Lc7O+qUZzt/cKSVB9ACPDL4piZBFAM4BH2CbzvpwJQFiNhGemZADhBUFFJmS+EIgEKZy+isZbAMxdu1eQLFAwptU3igBujZgZdS3fYyCmTklSRA3IGfdVDLmuhPxzCUbMEqvQ13G27jrOO8qx99Sv95//3FN+3kBLbgwgc1a1xd/gUFmYIVoxgwTsOyOkrO0FJe3O5SFE0S8w69T8+DJkl3dlo8dx5eQgCsPkK+92ifNKBWnHPhEztY8oVEL/lo5vUPZSoENHuJ4wRZBM9TyBKGSiNhX0Qdji+/ButXtCkPfPC4R1xwWP278TvSJrVyR58P7LdWc3KbzW3HOQdtTFG5Kp63fzgxMfkoBAvQuhQ9D0YAmqTiUzkFw035PIpgpNOjGImpBC3rPxzYP9cJ57z29JauvGXrTKdq6L3lzQZCenUBlxKIOvCCkHtnbTiXICe46VngUly2MxFOEUjY9twoWJPDKpbxEpRKOUrlDIGfQkAxUyzPPTqnLBeWDpoN1gKaaQSTdlDmcnVQtTAYj2K4sw4nYBMedYzDv5x7PC5cczpe+tC+0846pk3LwK6vkbco6+n+7qFHxnxW1Ixi0LA+aMe0W9+SfKsUpaDo0VkCsGG7PC5hGzNNOBPu1wnnVjIchi+rHnn+iavPfeclziz+ynSkzpmaiXWzFUPGkOKY19wbNWEZsrLx/CqUV4b2SvxuEXg50skNPCyaPr6d4B/lN5+HoYpu16Ri3N4u9SAlaN+b8D1MC2ZZ7k9pHio4GjMKuq1QOxoam0FgkxwKDl3QY78qIKWR6XKJY8DBq5aRtNtQfum53a9SYn5pPPJevm0mWxHU+njomUAAL+60kHQi+DT0LOKA1JSXBzHK1wVeGIvZ0HKJ2kItn8BQthHLsptxcrgV96iP4r5DU3jAohmc0T+Gu1Y34bTSZpwSkvyNODXchLsEm3G6z9DbjLvz2/0GxvHQxQ08895DuOC8++BD//xkXPB3D8NjTx/CSZVpHOuP4fTB7Hl31PozL4O2SnsABWRG0S0IsFb6w6luigSMUe0oSOI7EtuY0MM0voecgK4KgNRIMt2/Y7ZefDc0MDKiV5/zhuWLz3zDhVYvvmrbtH3K5olmWKryDAkavvxAnGPL0au37LM8jqB9H1m7VYx/6TKP73G7iaBW54rHwvmDz8pX6/vgCLhodQunlVd+7lntdtxcB3oDBnQ6rIZTDpanjiiuWXGVhWJnwjFRepAdDdAmGWoipUKOohwNkSsuWG3APX7YLIHOI2RxduKxa7447x286OEj90q84RemqszN4Bx0aJBnKZQfAGGIVIRwGiq3lJYy8oDBUmZmAHEAvo2xXE3itGATnnJcByOPGMbnnnUqPveME/HpZxyLTz59Nb707OPw9eefgktecAo+//fH4wvPPhqfecYKfPJvSc84Gp/7+xPw+X84GZ/+++PwsWcdg/MfXsUTjmvgZHMzFifrUEvGEaQNhC5DpRTe4/cf/7hPLe70bpy0XGm6djrV8J0H7QBLjxI6YwSAC+AoP5P5wpsRp2hABWl+kzTmNexDx86gQnIur0xg0I75rXfvhgacWv2o9xy77DHvO6//N7WPjOaLrprC0BtHOypIeapuOGl2shi6WkLKcc/uALQCuM0BDjtrObmXaS0M4VIU/89fr8LJxmfufsx0ytXJZnBEnM7q3dD2AcyinKfdddAaeZIDBAbAsn4hBju5FQ0MNCQJ5LMuwE7yk9jnXcRhPM5gtI++ShWtZgR/cOVrJf98UuRKb0xdBTroI1sFn7MoPAMnp6d5CrqcMEaRDMHaB5QP2ccyXM4OmCaWYQsefWIZb15zPy43T8eTT6vjBLMRq7EBR6U3Y2XnBqyMb8Cq7EYc627GSd56nF7ahruWR3HXylhBp5a3sMx6rHY3YXl6E5YlN2FxugGD2Vb051Oo2BkCXQTPpVydpitQ6izHLq7p8CjtlNLKKSjpC+ugtIXSjiU0wHQHgpoCv3cJvJgMycEoQOArCEV2zMUVPJxw7vc4o6F33aIBdcK5r1981Jkj91784H9es+Lct7558OH/dulEPvSdqaz+hUZae3HbVodSVJHqMjJdgi3GkOVEnqGYMS2Z0X4gDrkyYGexL9hH7CfwXVHvcIadwTSl0aFdVIcWPXflfZ89jMP84ohdWC1UOr9OZqVSuQzZu7utdGJEQkU6DckpvgkVCbc8iiR+Ar0o0PpUhW57ZDE9E6FcG8ZMM33SsU/4j3n7Xy2u5vLChP1PTjo5bOLgqxBJswMYGVgJoGJoFwH03mSJnjrauZM9FIdSPIHTqttw/rnH4V/OORr365vAsXYKA0kLgechJzmrCYyaM7OBg5JxS9YKTto3C0Kae3xKvC7O2UhzgAMZFqzTskTMvb0Ohzp5ug6XywnCPF8San1X5tjpXZka8wxrUkoVbKhGWAUoUS5D7MElfSkkRebCmYFU1l+SdETT3f7uQ6sWPfpf31d9xDtu3Jws3Tpm+37X9lddPBVX3tLM7ZPaWXRamkSe5vLUxA49BJW6AAAQAElEQVTIDWSihAloIx4UxwaEpIPYy3Ae+5x5JJ+skEBbUiT4cEpM3kLTs1eIEfYBo1MbPBcET8BhfknLF1QTgzy53miHKGqBq89bZHO3RG8bc8qyE7tU7CfB3pKFhgpl4KyCF1QQlvrQblu68YH2asN/e0vGfYtFmT6jnXCeDarwTQjHgeeVqxyYBB04GOOgVQrLQUZJgYz1Ue4lfozTBmK85Jy74W/uuQTL7SgWYZJLzXGodAaKBw3IMyiWYyvgqJRccTAT5ByXyFQVGQFODid42AHm10i6gKSle2fJSWiZ15KXBQWBZ9OA+j6JiTu9jZdVjNYBBadGNbiNukM+8gA7hW3YIXHnUcd8t/milIKGWoQj+DrjhR/3Vz/54/+0NR66oVU66pUtPbQ6DRapyBtCogbQjnyk0t86h+LqQLEDfGvh5aI0DSiSU1AEMa08GO3DKKaBl3SPEL8BHhPmiFG5FftEZYS7CIkBTHnoeZJ8OJNeaI2L49b1HjuhVOKeAo2ZVrmDiDsR9w6MTYkxSmkZAOz4jEvjJFMIaouQooRWVj73hHn652POlO8t4loORtmIJz4h5+Dk+gJQOQ0bBCQHZXwoj6OLHt6Aa+Cu1Sm8ac0DcObRJXgT6+FrzrcEB1tK4A1ohMxXyTuciZvQOobyfPLzYcjbyzJoz4MxBkZbaNZjCEtGgI88QEOAA6B8ZDqk4YT0+UJYp0UY8nRYMVh98p8vHuHuDm53NWPUtXIhoGFVl+BUN59z5JF343f0VLP5mUepbtxJWb77yt7uj4Uy+XC9b9eu0TE8Vw0c9+GJtC/IwhVAaRn7qMJxEkD7A4BXBVUPIh2UMvTRPJQ4vkKZKTn5cYABsFBKQWsNyezYP4oTO6CgZCnLbgL4cBZgXj7ALAVZKcP03KvBmsX3X3q3V7NCyXF4kmhoQbVsaSnaVlZZmiVtBGG4g2y7EFUxC2muAyEzVpFki6g2BJY4BpSCCcqwnQS8YVUJujxwv/LiRffCPFyZdUd7noaSWVg78qdQnGmhGYJEcLK5gvZ8aJtBp+M4ttTACx55Ao5TN2OFP4NBenkqacInn1Y7Qt5uwIAD1eYcpxm4Zu0Sl60QnjQAlyVMjskzh3GOZEE0AziIAQvLGT8nOXgAlzeKwAdoFldQwjdunI5WZQg7ucoGiwlMfvGJdUFTGkU2rIeVdpMpXhHZwwf5wkKv3sNih1V2W13xrxvHE5WbfqSNHOCYDHliH1YqiKe4silXQG1Duit3hvoyUEqxjx1UMaFlYASymsnZJzkB0PKkS7x8zyiEvoFmGgQcVYpuyPFBG3GarzImKoPIU4NOXDIlP+CiVtIPTyqavJCaduXnnt0KTfJXZ1MejROkdhSu6KE9EZnG3mzAr3HQ5Bbye7vS4DB8gmiLiNdM1OBUUrn/jlXsZVwpqwcFoMFBlecxDAeqIygZpQlYCrkN4EhW3vImVpdn8Ji7VPCwo2KcVB1HMn0TByYB3qTQWYJ6ZRFMxonWUSIZ2Jb7eyxvcn53MVKtkBqDTNFIYDnmHUkxM0HNsK4gRO6H9Og0LGXQDly2AvIzF0U9OqeYznJZVNMqWsmCt7vjTmOZy9NAvNXuRw0nlle8KMbIFLt3KaUKQ5XcAnQSKji6MxI78ui0NR+pzcT+Eq9Uh/QFdAjNrsyaU4inx9A3VIdtToMdFoN9bWUPmL5dwr7M2eeetVCcNIEcTqUFMQEcROAQA5jHcVVgeBDlc7wYLlg5YiD5oRiwP6A5j7U5XuIyjGF9pUC+8OPheeuF2CyTN/+nHJquaMp2w10+pQmzJEZc9KRktoxZgk4JeSKgyZEUGERxG1GrBb9eRdtqqNrw0+73d5/ftxltZISDRJlKuYQs6QD0zFwhgkLOpaaTZQUHK3SJc6lF3TZwl6EYT7rPCgym26DSSZToxCouRYnIKJa+XHKDe38gcKV+HZPhCkyUVqMRLEXb60dC43Ac+D7VpEVHUmFOMTIHRy+SFcMiZz4fTVPDhLcUY/4qTDKcMUOIi/JA2UOAducZIu5tKQgqS3Ph58hcjIP1ARqOJHmVUhLsNimloJQq8gvgWWcWFy9H4GO0hZoKakitgrNUAPWs0hyKfRb4imN0BmE5aGkTv4nLgC8LgGX0rDsmQGx89i37xJG4IQPx3uitgaCoWFZULFspCQ80lJY8UgHrkHHCkiiI6VIx+zTg5B83Rj+//v+NbGauBXfPl0B6vhjNJx+dtX8dRy0Yr2sYRecQyMChgN246LRsz+U4GBwyFDNeMSj4KfB4WJkwVWE6UvedNMEpTN37e2TE2Sy1vGDIG4QD224X/JTvwdLDs8qHNkSmzgSWBw285LFn4Cg9CT9NgZwzrCPpgHIqyKxsdYaIA3jGr2FjsAJ/dMfi0psr+N66Ev4wStAMF8PLchBdWV2KnOCVmgqsX4bSGoqzueLM70r9uHrCw5evTvCZq4GvXm/w13gx0tIQxCAUwXiwFj4KO7k6ST7Y6cSc9Sm3olximE5BgEopvju3k1K3SZI8lEdSLb0RCedIe3Qn5l6OtLCNpuaWhuXyFPSwjPGoAYuME1XG7QWjNI8Wkm/ZTvsDiJovKPv5N4tx4Qf01kP2c5X9ACjDccPugUzoXBEEMvtBhkTOUaiRWoPclJFnBsbjSoGAijiBx2Wu5l7wkJ8lbvKmDwzFG18mxUiH7a0XYssqJv99iUCXsfPALqNZ7SCmvInYMluRxN4K0nAcIA7ybS67LSKKM5kitEER9IQIJOAsZ5m1yRnVBUP/WGTc+4cznml06DFy9AFphqBUgSHQuYx1hgQxymazNoZ0Aw85eRFO6kuwSLc5ztkeDlgZg0lqYUUoL4SS2ZZbKBvyYXz6J1fjzR//Kj72tR/h37/4dVz87R9gy9gEiroUy3PaT9nuRBlCu6YRMM0BHoGp02jiV7/5Lb763R/jv779U/zbJT/BB7/6M3z/j1sQ145CzEkkNHr4xx9/Zz9uc2m/0m85wThLfgTs4jOjTmmmypvlQ4jBXt26slfFDoNCo5f9U9OzKYwRpNJgF3IsMCRYaS8A922Tms5/iMtGMlIzm1r/r1U/l70O5jV05nKGAVwngkdvj4xY3ucSeAaO+3a1oWEoTnzOK8PKZOpVkEUpKtU6qlyBqNY0+tDZHI39+anpFepfbrriA1OHgVrvsAnU7h1+PygfS162PvAc154OdG72UAYaOw1fDFIIsCxPIrhtjzu+F+lMoeFunYqeevq+/iUUm2+p1QdZl0fiYIxjrkg7APnDo5rpVfqujaPKTZxFsFuqOzA8jIDKkRqNnIPeKnqBuopcVTCTaKxranz463/G13+5DTOtDKuGAhy/xMPqxR5MoBBpD5muI1Mkxq1ie5DzPweAcjAY4ibdPVfV8bATa3jQSUM4/piluGrjJN7x9T/hP/9nS5oGi+FpNZDPjJ3JQre6cxVUnMjP1G4/iN5YCQGSSQRVViCRvSClyAe6vBdFD5siJTQvd/S+wQkx53DPOFU5er907rhVh/Ewav12rrHpb/718qC99qKSblvuywABJ1DpDgKacgbym0p2NUqcZMH96ea2cbiU/ZPxW64BIR0ibXVQM5jiELrI5etOb//f+78NjAinuaoO25BaWHhtOzkqRWHg3xjSu7lFusI4gFlDuyWd/cQ+Ld63f9NwBLwibXsIeiMOwgVyzZXRHDSlerWR9j9fkveWPKR/TjttDiogKFehacxGgMIzTKN3x8Fc8xKcOGxw8mIDEzWAjIcwHJg582kN+AQ9RcqV4djNEXFg3rz2Gpy4rA//9OQz8fKnnInXPPdJeO5THo2+qgff9wEOdMe6iharHE4rWPIjt+KbR5B/8OnH4vmPux9e+uT74qVPfSie+oj74OiVS2ChfMW6Am3Kx65cert/MqRKdU+WWQqAokaV6Iz5wfowe8m32ehuB0p1SxFIw90udBhmzFtbPl02VKpRUEXIRnqcpLi8Nca3nqbrx6S5e9g2PqfbW36iDP2AlGPNGJYLkLZTjrkacqJkxFP8clhCwD3pUiXkdwdiHDRXM4NVMxYiSvsr6pub/ud150//78cm53gfCaFeiI285JLz8k5n5o9pxk6lsd5eRjWbZBmSJM8sORRmT9O8daicNJXlilDiJEcTjhK0E4W8uuw5x625+HZLOVawW3c0teWKpUM1uDyB/LEBWVrkYH28i5lYZajRsztlaYglpRyGwAQvpLRlLjd9BDahk9fkpNyBZt7+IMTR1Qzv+od7Y+RvlmHNiTHu5m/G0bqJuo2QTY/DRwIvj+DnMUou4XsGQ2md8pBxhDsBcnoNOprE0aU2Tgu34e7eWjzvnlW89Qkn4by7D0G1RqGUwkDgnzYyMkKlkAHvNWsuNlFqyhbUkXN8WnTdbMkiusU+X9aq0j4zOYQZDHoz/1tRUeZryz7nREWfHOwLR6JT1p/Du/eOzbv+Nx+eCbOt5/cbmSjb4PoUTv4cGvMnPNCypEpfPzKuXJLmOOKZLfDiLRg2M51KuunCMBl72EAp/VjWmvj7E895xxH3J7Zk5O6ozwUT76tVrlJKkGIHkdztxVXin7Bz2fM7ZOxGHST/LLGsspw1mSbAJwSJl2vQfp2HAbVTTaX+mG7JPX96nfwGlUxnnmeBwCChx6a5F1dwMholgluJ3t1Rg2WUXATZq3EwFMFAFZksz1BSLl8SyIQeaAJQCBxf6+DkagMD0Tos1jMo5zPwkgYGayE4I7BkXpD8nirgkshwc1tRH45MrWbbSb54DdE0NAd/rb0FK4NJnNLXxjIzhWolgOVeoUK26K7+1FIyK+4r40bFK9WHrTPFu3boYh35QpEvdQe5nMQlshek2ci9KHa4FIlnJm70EX3XY//IoY9gHYyMUYNG7qpNG97ufyEw+ZuPXanTyc/SJYen6dlzMitXKoBmP3k+2jzwSuM2qjUfS/ucW+zPXFx3W+/e/OWbL9jy01dfPRRMvcflzd9GefTju63512MPF13uTjv2YaTuDvu9z2OtvQEEsjvioPhROUewyLuGyHe+AIpfhMBQrL4wTGmqZj4NyLsYsfPgUiDJgJlMYTox52AH74YZd/seu+ZTjWh64w/CMAeyDlJPwVoH8BaT9tIEfZ6HlcODAL24hGvCDkd3Kvs0IgQBCloT7DJo5k3oIRIvUfJq3J7pAwoj4H5cewoua0GRV878ThlA2solDNKMQNjhCW8ExTroKiJmHSjXucQJqE0Cbbmf9YPUgWcyJDxU0dqTHb6h/jC4C78Ud2VRpd5KspVWaRRAx9JsEbCn4Mb+KRju5OGcVjtJPmKSrv/+yIyvs0tLpRJ8rwoIlWtAiYcKJlRNf9GTlp914VNuq5AoHv/goqGhPGulCCtldFozgKiySh4Eu9pwX8dzjW+Y9vpHbvr5hX+79scXXjfH48rvv3uD8tM36v663dY0nzrtMSPL5r4d7qFeqA3M0saGvnq1xmlfdgAAEABJREFUowgWys2KqSycmpOYaUW6JAjNpjN/EZsLi5dbP9QsEwkVefhcTqaZg670PerUvyzd6/83Qj2w/5E0J6FLhhXmAMEIuQJSzcOKBIPcQ1lBzy5UMQSINAFRsjgwr4CdtQQTCu5yGLbV416OtooeHBGZoXw2lRJMWEbU7CBgmNN7zJUHgOUs+eQkltcEpwKl6FXGWQ6rNHRYgY0TgAYRhj4ybgn55QCG9XjOqXq5fE9yocDATKqG/FLf8Zb6saCuWUP3ZnlQzuJlx/Qi4fYPllfWFekFWDKmpK0MtXLdD4wfqbdrT34rxPivtOWYYB9rObNxAcDJK1L+MTNq2fv6HvTWV6x4/EhlTkde31E3x4m7TAVlxJzgwIkPPABTWROlSvo7NNc9p+RNP3PjLz7007kyO4Zrf3jRT9qNbf/ggDMjV3/lCee+LNzx++Ea343RenCavqTsb/XybLOmsdB2ocSYleOThstZTMGDs5rvDAtj1OBn5qMh0oYkv1CRSON0BI9biN3MzPJdWfLkMk57GlOdaHmzvmiv/98I/UHp5wNBgJogWGcGxSBMQjplA/A4MDVBTv5JWDWbhk4bMNpC2xwegQgFYBG0CF5geUMgMvTOcrZQc6Zv0wtNTAk5T2qzzCAIKnK+gUQb5F6AjHoClzMzjRms27AemmmWerGOreRBiC/eXxJDE9iYhITv4lnGOb1QLqu5IELFCxZh9spS1xdlGHTKQPLnSjOkbtkGKJ4ykzcok2SnKhnwG/WMgvhaQCZDzXJFf1gCON/FKAl2FAPKth1Tjuj7pm88d6rqrnm17yZhqA0VG4Ck6bFpY9Dx6kfP+KvevnlmyVXlsz/8ndojPviFLFn0zU7mPwxGU3ccM87Btx3Uk20fHipdfWbzZ2+5eOuPLmrx4y7v0R+9+7Nhu/Xulq68xoWnnrvLjIfRB9HWgmyObU2N1gK1WYPGKoZVSMnRgC4pJdakmTpHjM7eqjC42xjf7LduMPcN3F4LuNy0cETUXPuYbHv/eMLL9u7/LXv5T941vaysPo3JTaiXHXTWQFivIJ2aQWQtvJJMzpRbK4R+APlLsh7TFZvkYJBrIQ+OAKEEEEhKKTSjDhxBdOP0NK64/gZsbTSQ0YOTfZ40ihAEHpQiXx629A0Ooa+vD5Nj4xA0FDAt9Q8i4t7OlvEJ/Ph/fol12ybQSYFKtR++/MGFPIXl0jkMw0WXjIz4oiNtSrU2M7k53TstyYDKAQgxgIKaSy9erTxvRbOlmO+WZKtm444WOhs9fIM7b9kNn//nXw5X84uqAcBhiKDcxz4tQbxwyzHp968ou/LKYztuyWNbbvgZurr8wZ0mV6oyztnvA9USaqbz7plf/H8v3/TtT7TvvMZujsDOXGST9s87mf2vM8590/Hd1MP3OTcWF1wL/3TSddO+Tq6j/QPiVWD2oodWxJQDMYNRS9r7WwzPEjB0oJDmGal8XN5c+ay95XjysPnW6nqMYYwh6KxH3toChA5+rQ8TqcGErXA/bwC5NSgFBD/LLiDYiRwZo0Ky8i3qZzqbDuV72NaYwsc+/xm87p2fws//71eItYNHWOoPmKk1TV0wZEIOAzqLiJsExEaTp7U5oukZoNKPr/7o53jfp3+G//zKN6C4P5TxyE/+OZiihYUETOfsqrWdTlnqNsaUnWwaysttaQeAE69v++ft6ZZJQjReeh0AG0ZyktkZSH/mFNc6NNG7Cg04L7mg4sXfr1Q9JJx8Im4k+0NDKPfXkSZ00rjy0Jy0nArQbLZQXroY2nNQKT3zxuj3y2r8PQWjPXhc/4sPj9bs2AX9gcWMWfylU895w/I9KH7IZZVRuDCFHhmx0dSWP3oexWNH04lgpHuLcSp6PZCZrZu010/nCBq1KsHHcvCE0KaO6aZ6x92e9V/c7d0zthdffLF53D2G9LMfcvQfH3mc3nzW8QGG882ouCl4OkNML65lA8Tck0nb3PsiyKJoB+B2VhUTHffbAq2KFYsmiukc8JSCz3WgozeGlC6aLA01echpLJc+w8uWYYBtWr/2BpbzCKohOnGEk+96Olau9nHPe94TPsHH0hNUBLTQDyBXtVo7pr9e5w45kHTSpfK/n5T0guYmGcpUvN/uQQFuk6Zm+4fzEtuntxO4/HWK7w6TtylyxL7e9JnnRnUz9obhcrwW2TR87qWm3F7pxDGC/n7OFz5sow1VHUJp8crCU7cEwbqfoZRNvGXTZe8d2xvl3fjTd/wimdn40tGZ6D5Trv8tZ7zwhf7e8DkUytx+hC4gqQdK8Z98gwQ0bigKVhiceAwWjkspIabu050mCXyf/RvFsHEO7VeQm4FFG9vuuXvC+H8/+a76/Vobv/7EY/XXnnEq7v6mxx29/J1/dy/807kn4PjKFJKpm5EmHYxPN5HTuylVCDCCXGyTOETSPEMgkV+uCLGBAL8REqCTFEcPDOEtL3sF/ut9r8LfPOThKHGG13FGhGPJoASXpVSRICG7lB5qKSxj5ZIV6HDpm0Vt9JUN7nuPk3DRW1+Hxzz0fijzFLgCwJOKXI407iBJkr7MEYmZXhnou2tAviIDX3e49Q7xbvWOInQTNRTb0CVLeUgEc6W6GfiGAuQE6Ai2uUs3d8v1nqKB67743CvM9J9fdNRSTVTjgQU9evgh+4VK9UsAgc5xmzPw69Sjh8HFQ/CzyTeN//odv5Hye0s3/ORd/+X70UdUqe8F4+tW/93e8pnncvPOTs87x3lk6McTV2udtaHZ2fTACtY0HCdARwPFrOdQpO/FozBSekVxGkOVq4Dy0ZpuI/fqqC897QWnPefTy7Ab189GRryVJnz30TU8vtTYgGVqHCvsJhyV3YCn3K0Pjz05xAlmM/paN6M1tp5eUxtcL4OoB9o8W6GLJhoLGKsAx0oZ8AmEHrM4lhtDielLuSfnieD08lAiXAVlILOiEXCjB6AnYFsR4xWU6wOYmmmi2I/M2yh7OfqIsSWdc3ndgOIGt5LKCI6eZ6CN8Zq5Z+THxVGUP87N6bwQZMeHCEdhtydpxoQY8JavQoxuvx2hDwR5Yh+UUrAEclZ9/fYMvUihgbWX/uNP8rHrnry4rm+G/CQJ1KTxgchyItEo9w1jhnuu3BlBMj3+22Pije8uCu7jI2xPnY985sdZMPSOox/1jjP2kd2CLH7LCF2A4h0XD25TtnMdBNgKw9NFh2sYKKUK2jexLbwKvSLydrmG9spQQQnNVoLxTnC3qWxwt06plt5l9bFHDZWflNE70mHI09CN2LpxLSqdLTg2vRbPP6OC1z98EV70wGHcZ1UJg7USMlNG5tWR00MDL+XAtmH2UhA8yzyLRmsKuhZwkFeQ8/Q2pwHknoM1/JbF6BAK23QNvbAG0LED9wD1wDAs9+OuuWkDBpYthymXqTEHw3a2GlOQikwpAJII4NJa6jZK2s/FdlY2l920Osgye4xjfhSXLZ7FQwQrIvKg0BLMkqIcXQKrsAVBWXQvTdBVAOspSpE3Ifcv6F2308Cm77z8R2Fz03mr6v4P61RZIP1KH9xnL2oeNNUCg1X10tbFfvzmyy//RHo7BnuRsOFX7++U8k1v9ErlPAmX/McpZ799eC/YLOgieiFLJ/9szHPxj2AT0FIoKnuez+4togt13/b2abnPJZ4PaIGWy8LAL0EHZbS5pE28/ueetmakdme8QxPdzcbNZR7Xof93+RUY6B9CHwEmJCCV43EcX+3g3FOH8OT7HYOl5QxZNA1nNMGLi0g2SRzXog6CRRHyYZnOABWCcUpQSvMEimUEayIuWTuUO6iG0AFzkUFOl4k35NRibPMWXHvTWhx9/Gru/XAZRM8t4XJdsY3VahWOcUdgRkiPQWsI4GXkTwfR5Z42fSuG+lOekuSZg5RhDd27kI/5CbCSILI4RoQgL4zPio2i4Gxh+eSKMlKWnwAoIrNWyTr0rp1q4MZL/v63fZ1rnjqIrf+8rNxGv99ELezwMHwTVgzFMO3rXnHTD179w50W3svEtT/44O/aExvfkKfJPZs6+Hey2d6djB/yd3f0LeBmVHTy38gjwGgYE9BQc/heCEc0sGJFuyf7LnNZGp2iUWqbwyiDLMlpiIYrTIdm4h7S9E49a5eFZz84369Z8sjjNu5z73ugTKAr1wcBXYaTLTAesZY9IGA7yr5FIMvIaAY+MhQ/PYEtsCI3dM4IPjlJO4BYCU0EMuAL81h6SZ00gseZPTAepD6VNlDiJrV1CVLLfJ6PweEhnHK3UxFw3at0AuVieGGJXAzSVAH0rgrsEY8ZgDIGmnVaKKvD/jDquPtmmYZHXpCL9UrQJQ0UoCdvFiyCWy7y5jeRvZtmyZfZ6cWBHokXBECW01HPEHoKY1uu2dbN13vuTANXX/JPzXUX/92HFs/8tjrg3fzMqnfjB+rV9W8z6R/veu23/vnLOyuzr2nbfvLG/yrlWz9iTfjU1ee845/2ld9CKs+Ru5DEub0srhld3l+CC4xG3mgAiiIT6KAVDI0U+3TRWEGiMdNMQc7buUk8I1BF4Yr3Ll7zkTv07jKt14flwBrfQJFRWKLAmUMWE2jCKmC8LqhlESz31LQBSiWPRh+zPtYvT0VQYOhIcitGhECQ0MYUoKcZr4dlOrpcAJJ3iV4oCEgRQb+dk1+pjiaXsS3uPUZKTWRecNl00vlv5mmJl5bScw1LVeS5gwoDgN6c8AdBkkvWnGBpvdpApZGal6TkyRUuGMCJQHdE1N/cZz0XoV6lrHicrBABPcqMh0Ci5LK0PesA8rfatufvRXalgcu/PdK++asv+cL6Lz3vlZu/8rI3/eUrb7xqV3nnI72+8c+vMoi+7dUHLjzxCa996HzwXAg8bhmbC0Ganciw9pLzpgfL+LmNW/Cr3HSn1xR3Oih+NmG4DNtJmb1KokdSlFMZFD0uARrnSgSP6onKLHll8W0XD1Or/amVcnOORh+1eSDAU1e/WgL3PyB7ZzG9RU3PKfDpmTpHkMsBVuDoAuXsASGwfkOgEmIy5i5FMJPDDDqEMClhpxXzJNVHKahNN5rpe0c75vFNb+iRTVM/bzTzX97w+141pStrNsfurKkMa9p+dY0q155NB7ZTCkqIZ6ZhFLk7gqzxAEEk7RHvVJ6KDOXB0kyEc0HAFJmZ89Y389ySQB4Ete3v8k34bU8ge8YVPbqEfQY2LPR9JJ0mPEUl8VvvXngauPrqSxIvHj1fIZ+YyQc+tjtbOQuvFbeXiKZ2+8SFlqLjsW8i7yCVfSYRjsDhVSrI0lTe9p3ESAlxheHTeC1JmDoYtJspwvqqN536lHefKGk7oxMfet5oK/fe7uhZeZUqRCqXxIibM2SpSSyVZ3yQI42djhWXkykMPTbCF4QMH2o70YtlGwUEi/1EenRgOQQhvTELGC+K2u1XDDzn7a9e9cwLv7P0Sef/ZNXTXnPJUU975YdXPPWf3r/66a/86nHPeOOVK54xMnbUeSMTwe8738fQ9y0AABAASURBVNBB+FPxsELyUKw3Y5tjS5EETOlu5XkO4wd+I84Hp9sZ4BGYoUGRmAmFjEVEHiwL0RHBvQglLukkcbotvW9HnlJWGwPHLQJ+ArcDkbRbqAQKZc/2DidEKQuUbvzZu69pja97da08dFq7XfnCAhVzj8TSe5T7IGWuuvYvhuohbT1ApyVLWQulFA0/n0eJNMRQHdkKU2e51qTB+uUqxmeSwAyc8hqMjOxSX0v+NPmFsTR4aSvo34BKP9o8BAj7+2BKBqVyCLgMjt4pCGKe58ERMBz5z9UHy1oFHejdMQZumSGmCC3PIS9r5JYQKlQKwUOELZPG/kzy7Q6pkRGWLDdSNjC3DgmX2E6W136Fxdmk3CGzzvnlWnnreOd+zdhBPDtZ7mJHGRnnB8il+BBwFg8VhfBMuM0tbbMCdOwrTbDOswTl0EC89LQ18bXbZO+9LjANbP7Zuy9NJ6fe05pKnnDCI95wh6ubBSb6TsXhSN9p+oJKLLvJm3ydXZ/yVNLzNErcE5MfA0MriEHtm7BdFTh6KcLLQcPSOIt3LjnTVhueV0PLLXrW6suXnrmrugRQlvztKz+yRQ88YiIYfFnat/QjsfI/0kjzVzttvq7DAIpAB/HSoOFzmciKCqxQsNh+EUUINXDMI/IYekY534rv9L4SAQ/fqyu/vLRI243Htu9+ehnXqQ/TysDQIzZEqTyOAJ7qQipRCgRg7flBaaoTPSZVBGPKl1MQ+Xz7KihkkcgMO8pOmUGS1O3ljGY99BSZX9qScJlfCTxUfPcDJvXuBa4BT028bajqfz+sDL3nPk+58PELXNw7FI8j8Q6/L4iPzc5Yw1ful9wAQ8j9H67hAHpKQaW0j/JJ8zXtXSiHJQg40AtDwDQLqBTlcglJrLBhIg9rK097A+7kOuWJz7pm+WP+4d8Grmi/PExO/Oe+v73gvS0dvskqPQmeiIq3ZFMLWUqq3EKWr9qRaVcUQIFyAJ4FQjquXpxD82DB+JSLe36+0kCcDqtW9IxtF4/c4cEJeK2/+H1lO7rxjV4SrTC+gW1Nw6gcftxAyBCyd+cRiI3ndeI0j+J0tTYBsRHQ2gPogTJGTju/lWN68WDIW14lv1N8EXJMKYWwUQSP7+VSgDRqIix3rmaOw/c+TFq29ifvmu6vTj1LKbNtvF26aPU5bzhk//0sLWfh98rVl4wkWRz9vlapcXnYgR/SCH0fSbNZeEb71gKiChk4UBW0SzhDAycpvqgMspdl4cErD+PGze2zT3jcRU9l9ju9xdNT551HuAJqV0z8dbzZvpSMoZSBIoGAkmZ2lg/BlrGcYCD7dIwW7VIEGt/48DyCepwga7WgghAqzTFcrrw0sMFFG7/0kaPcyAiFl1K3prVf/MDSIEo+uLhe+qfAWOQEOk3AlFwm9CGTh0wa0B4iF6rxht3QSYNq4kK+Kzh6zgoio4VTIqPqygXqpkgXTmAa0yWN+io8YgVgTo/iHnL5GtYCRHIC64UIywFuOubmhLl69yGggd9+/R3jUdJ8DoLwJFNZ9G6KLD3M4NC6d2okC7EJKndXhGF50qehpGkExeWcL97OPglLQxbvhqevAEGIRq7okijxdmjMYtIJjxsEhFwe0ICHoPvv/sWTHn/RKXtSrQBfMND3Dod8KuNSVCkPIAgYenqWIFuQmuNoQRG6xG/MJlnhCO5yuos0YaqDsYmpuuxF/Wr61xMnmfdt+srIM7d+8c2PHPvimx4+8YWRp0198a3vWqbav6wG2QuStKWssjBcSoPeJJzh4axB5nmQ9FxrRGYRfnnFprGbNsewXj+kXqctFNuvqQ9H/TjKreB4qJphTkYwXSRXhQ5zOE1STJH/D64NYPwykMfIsxa059BWPiy8cYyMOObq3YeIBq7//gU/6nQmL2hH9plHP/pfX3eIiH0rMQ8ZsOur4s8lxOuyPAKMAbg8kn07tc8mYwuFKCeq0DRukBwKvgQIHXjI+RLRs4KuopMP+m3/6AvXrLmYQmC3r/4/tm9sO++zAQ88LI8LWlEDlstkYaBhCWCUg/XJu5BTbKIQvziS5MgL74pfmU8A2eNSvqyTFXUT//Mi1/70Yt35xjDSbw266HP9LnlNSSfHeSqBIqArghBL8tYFOfJ0jFlfo8XDmKYZxmg2UI9sBcUhN+tCwCayLkoCUJaCKCsKApwkUG+KBKapAvAwe0k9Bjm9b01vFPT6FHnI7/2CUvh/zORIvfsQ0sBgv/2Ace1v+1749tPPff1urXD2vHn7r4SMyP3HfR45//mTj55Q6c2/CJysDD34JoCmp7HPVTgaNLpqUGKw9GLAEIWRM8ZTVbolPGCtwQUBtkw2oEtDT/lfO/b0PalbvLu2XvTZOErbOtSo9hkoP6FflEKxTQJexlpgtl7IRRBxlK0gAR9JK8jy2SX6gYxreM7jllhYgQqrdKG8jAcD+SzIeQy1AxsjD3qV5EkYggLfleGpbwXrozJumNYnpSjBo24hyBTHzKEhwAuI3uc8OuqLsikSyIucd3J35QMPkyy9WWlaTn6+7yHw9WU7KdBLWuAa4HZSc9jOPL0Wuijzht938qPfdPICF/lW4ulbvS3wl0o2eqlPz05bjSRKERB89k1kab6GGC2dN7KigdIDwQ6Ao6sh7TzhXmEbMUFJ1/q45Kuj3H/cBXd71n8cy0K7fdt29dpw0dIftRrTkOVeuznNshngGHQfkCWjggVXkJBQ8ZMQg9vdAkKWKOLo5SoBHsucBO9cefSxHFICtxaQogcILvtZKcgUcimWk7DFcmltCf4y7f3yxkaAjg3gMZOhDHJa6xh3ZAt6iOCSVuKOObCdhIuQ5kOIgSPN3SKb1rA8hS5Vqww7yDqttXOfe+GhpYErf3RRK29sPdsPakdFamDkjDMOnb9/Nzs6Dw2FD6Xjvw6RrA/pjRguv6J2A2J8+yK9orGj8E4szdoy5qAcCgIvK2u6fh56culp+SHzQkx2FLbM+CdN2PpbmGW376XPelZ763Tz29WlRyFqJeir9bMsu0C8KNbOl6Je8fAMAcqzGYxLSBISFCUDyYmU9PRsESpoggkIcsgNgVP4GThPQ2kH2ds05APr0L2Yh/qTeMbyHVWzjWAxfrspv8cmO4QEZSSdBODeYCAHQYo5SYX3KcDJVyeyiuJJjjwc0+ZuteOLJIp+c0YIwC5LUS0Z5NF0mym9+xDVwFU/et8vG1ONf4E/8LTNy054/aHSDH2oCCpy/uqSV3XqJv+4z/0nSwMu/n2nfNgl7f4H8aIg3sxcEecBQqkFxAsi+MCjoWoCSVBFOw6Q+SueteLJ73/1XJE7C5VSzpr+n3Qie5NW4jF6cOCpaOEl7dgVjqzyggqQoUfJkoQVC3HehHICnFW6SFP045gZoBdVyMoXTa9O8V0LKynAmpgMFoCUTZWHCJU4qixvXTWav+Y3a6crE64POuyDIhgqm6MoKwWg+J/le4Y5MHOs26mCIx87ys7XHW7jsY087dDUW9zpYLDqJ7XQ9P5C8Q46OhSjiyqtf087MxfnqX7LUY+64GmHQht2PUoXqPRV5P8Z0kwdT/h0OcQtBrcvAhPQ4MhASOKiFgNlCUSKJIDnG8DGQBwhy4Hy4ApsmzEoLb3/e44776OPYOHdupdfvXlDGoTf9E0feEgKyxPgjHXkKqAE3iwPyuDmKAMEaOlVKUnjEtsJ0BCErIANv2kreSgUWIbAZyinEbAiKcu2iHclimJZ+Zt4MZOaqopJNdBZ26p/4ud/mTrnxhmF3NSRGg9eYKC5txZnKeXRBQnISaw7KTBJbspBFISwllchySdhQZQvjyLyC2ApWq1SBuLpv5ZK+Y3F997jkNXA5d8eaQf+zD8Pl8PmQH3xx0954ivvutAbI+N3oct4K/mu+tITt4au+c1yXxl5Zz5WQ7RCWDhNwCAYFADCGpX1oMSzY6i9kCkEQoIHCLBQCp2ZNlQwgPUTGmborh+9299+7C7MdKe3GhmxUx31iVac5361D5aA4QhcDoQRxsE4YMjHI0n3kBSjAlgMurdlYJnTSimSA19IDBVBjy6Zx6gnQIeAeUsAeTtSojU6OsCM6muNqSVf+M2m/Gu/Xx+drbhvh1IFadRB4nL4YVA4imQKKgeg96kog3Lo1qcARrqEuUszoovk7oOvvo88ZyGWzdIOPBVff+WqP23il959iGvgpu+NbHGtLY80ztXTYNm7V53zyqGF3CS9kIXblWyemvqKT2ACl1s75pGN+jmSdKXEIiW2KyLIkU/3h7DdeJGThgkBHO6DaQKek/8Rsex5EUSKP4tEbwo8US0OB3QZG8f9E7PB+/37yf/wzXpR/k4eaxdPXOv313/RTmcA1i97a6wdDuwOvwJnSshZN3QJTov3GhagWGCGLE2VgyGoKZvyFJZAAl6Cj/TqmIBCRmZWOb1SVUWS8KNXRhaEaLGOGa+25cZ26fm/Hy1f8H8b1FM2RXXEGcHV0ZMLPDgNxEV7WY6sQVm0ZZyhYXVzHqbILp9vR04xiRnZIkaKW/6JX1GuPSW/sbNFYu9xyGvgLz95269ntt30PGDw0Xl5xW5v6RyMhtO6Dka1+1ZnrTTzv4GL/6yMgRKbmmWnlIJSt6bZTzsNCpuUL2QibOYIUIU3owh6jLEOBc0lpILll2yW6EGxXJbksKaOqzckD4ryRd9bsxu/vzvrrJGsrfQbnCyNuTyVNZ7Lc6SkdpKhnWnEBNHMr6HjykU8JfDlAnwEKwF05JSD+WF8pFxXJ1xyZobSChBTQmgCnakgSQN4fUsQE0SnrM7GM/Op36+dvPfPb95w8e/XTQ/e0KydPZHW6cVxKBA8UZR3yNg2aOEnBLac/Jx4iSB3ywe1JXlwyyVzwW2Sio9KKURTU6iVA/iq1fPqCq0cPo+1//v+Tzenpz7RmMlfv/px5z9mobaMI3yhirZrua769HM3eFHrByUutxTN8LY5laKBMrEABYZ7cgsACkHRoGcLigEL8MnPQYSkTsVzS01gCD1AKQXVN4QNUfDgvy5Z/uUz1ny8H3dyXdNJrkgRbBBehntsEgrYNaMUU60YEx2LUVIDIVpyQkrgyg2X0/T6lPagtYEh0Fl6W86rQJfrsKUy2tCIlEGuywxDpKX+aCL31m1p4XN/3DB1r5Of9rrnn/eqN20cGRmx103VHrO+WbpHw1agtOapLz07WaoLACs2QMnDMaIB8XBhCPp8LXQ+qx/JIkk7kihM8ogOs5hfLEy5Bk/TudTJr5nQuw8zDfRn0289dunA1cDQd4951D/fbyE2Ty9Eoe5cJuUqduob/X7a9GhUSt3a4gTkZIkpdEe8CpsEVVCgG+15lo3jByeGKr+5I3/tQCNnPslbMGQCSCpHkkRcAsb0jCydLY11reCpk30rPnnKs/9tuMi6i8cD1rwy0kHfVxWBSRFceFBLANOQP8EUZQ6NKMP4TAdTrQxT7QzTUY5G4tBKgA49v8T5hNu/Xj1VAAAQAElEQVSA+2sVdPISGplCyxpk5f6261+yoeHVf3bzTPLu68Ymn37dROOBn1k785xHvupdf6KqKDjwgOf959DmrP910/T8wD08I16yyMq2AwqgJwtOJkUzWUL2+yzbLySaAPXSJfCSFCFGeRcsGMqE4ZXLsGkG4W/zZEZ7U4c12Emzj0S69r/ftrGx+drnVSt9qNSOee9JD3/xyoWmh1tG6EKT7E7kWQv8qi8b+6nnEgi4zdFcMaVosHMvuww1lNP8SvcMQkAX9zKGeUEgoMnv62wBAJJHqMtbANGvBcUPZT0av+Ke2HQHmNbLnhKXTv72yU/45C738JRSrhnrn8HzWQ+gDeAHHsIwgOxvBfKDaWXQbHcw3WhjdJo0k2BrM8GWRobNzRxbWwpbp4FmVkbu1W9uovTEiSw4469bkvtd07FPunLwuDfc8x9f/Y0HvuRVhSfHhhb3mSM/86Zx9Oc2zmBlKu2mVwfqwVnF7xSE77I3B+fYass0C/lkdVc/kgLHZMeYhIzO3czSjcpkAYusMYOg5BPE6cd6iK74zCunuhl6z8NNAzdd9r5ftyfGntRuuwfp0qqXLrT2bR+bC02wO5XnkvPyrLHpQq/4Zf+tcxNIMEe3/rKzN10AnqKxg54LaKACYk6ntH8SjVbe5ZvjMq5LHpxSsEoj4X4ZPEPAi+FiQkfYj/EtEdZNBg/Ilp1w84lP+sg9dlarpMUm+KMOqxstwcWxbs3Q475b2deolzxUA4MS40opgoVCK3WYSTQmYoPRyMNYFGAi8nHj5pn0uo1jo15Q+8mxT331X+/1vNduuv8zXz5z3uxfXZG6dqSt14895+Zp9ZiOLQMKvHLwPAM5EU0R/AzbqaylN2sBerdOOYYWfMJSTgjdBuicpIGXU3zccvvVKpI4ptebIU2T3v9N7BbVHJaxm37y/33TV9m7pzv6dUc94g3nLKRG6oUkzJ7KsvZbz/t9qNNPG1mCERD2tDxooIrGqbj8A8NuecvknESPUZPo2cknx4+OQOC4Se/gwzEOel4ICBhOIzRACfRk6HkFg8uRqzpunFCD2eIzfnrceV/5Bxa/3T0R5KN5UN6U8+AhJ3CKd2pkH9BkqPoONS/HcDVEH4HP930ovww5tGh5/WiYIUyrPmTBEFRpyE+sv+Smra0VuJPrnn/3+XOz8sqLOq5OflXAZtyry+jEyVAIoNg2lQOKByAeW6no3UFRJwrgR1ilmKqh2GaIUnDrSzFNCFKGn+a2EhSBXLn8Eib17sNcAw5jHy7Vy//r96/8wbHnvOa+u9XcA5BJH4A69msVFa/xnoppjAe0UC3WCA1LdBLgcE6WohZ8nZVBw/F7990ydzab3g0KI+1GwYxzMYazPGjA3bJMKoxdA/KD45CAxyRoBc/zUPxzKx4kWG8AG2f8Idd/6idPesZ3v/ygF372aMk2R9+5fHM0boYbU2oQka7BEfTo2KHEeqo8Cen3gbLO4RsLox00+WutoSUTPS6QGtE0PIIhvPLS0Vb6L3O8dxbe51mfeFjLW/yfm6dsv9WEMnpnSinwBshX5JefwTimO6uYbshGkeQWXVmJFCSpyjEqSRLC8j+NnHycMCz0A+Q8MdZKI2RbVJZ+lSV692Gugeu//+4NncnN/+J7HrQ//O+nPPp1xyyEJtNaF4IYey/DzZ/7m7+sqo1/wiQNGOWB2iVQOTgCBpEIhYfBuCqMj8arhDQUchJPHxWXqgQUFJbL7JLP+lA2LAg87SRTfshJKcskpJxEKxcjJyggs0gYJgSQnHy5/gP4DvKBKmPrZIptUfVvx5NV19zr+Zf8DWav8aH7+t+6qtW4NlqE6WApT1JLEMlMFgNxA4GNUKV3Vw81KoFC6FmUTYpBP8Jibwr9ehuG+yNE8VYEoRfOTLXv+1/v+diSWfa3Ck59xpeftik+5rJtcd+KZkpeZeqBNUJrFMtXepTgkYd1MUR3lnuJKb1XJxJJO8XDk7Yp0S3QTdf0Cm1BirU5PnL2gWU5WI/604B4zblFYBJsuuTx65mtdx8BGtjyi3f/tr3t2kd3svSebV157Zlnjng4yBdH40GWYB6qdxN//eJgGWtdntKVsFBeCNCr04Ho1zEuNy2Rhksr5YsFLRG3XHyHkKRoKAE8x7JCUkaSi+/Mo3K+MeSTdg/tbEGCbU5ZuAI4b8mT8FQVfhUdVcWmdljaFA9+7YQX/uDLp//jt+5z3Rb19C9f0XriZ387hZ+uVdjoVqDhLUGsyoCAsq8IGzkBz2G44mNZX4DldYMlZYshL0W/aqPftLBoIESeaRx93D3u2cjrH3vV6z9x0sjIiF4zcnFwxgu/fK/TXvSjz23Lln9pxi1CIy1DB3XEcQIo6kTaWrTRQgmYsZ1OkpnmSCiIWZmuSCgI2y86nGy/vFpIOTIBFHUIFHr0CJo+9x49FW2TFPSuI0YD63/23h8qG71Ne6UXb6zgvIPdcH2wBZiP+v/ylfOvsunUJ8PQQUDOCehxL8qmMbgChLaahshlmwIMPRcj/1KARm4JKCyxbyIQ4GQ52SWCrSLRQ4KEJB16aEdtmLCCFCXMtDS2jrm/bcW1/3fVZv/Tv2+vxrc2LcF//N7h0mtLuLl0KmYGT8SULiOlN5WmKXTSQSmbQSWbRN3NYJBe0pJSiJXVOvpcAol7qPFUdpG6dmLoPte0j7/ih9OP+v417ZN/tMVb/T9/Hcczo2AAbYFOelqO+3J+aQBEVepF71P7BeQtdSBADwFCgj+EJM70jPJbm8PknS/vU0W9woekBgZU630ujn5Q61/9X8c86q0H9fd3+zbSF5D6F3mtj+nO6NpAW9pcjnKthMD3oJ0qPIzC46ABGnp8hks2pxRc4bXsmwqUA/kLMUL+Sgy98P4yJpIM0z0PnTRHSqBpZ/Q6g0WY6pT9DVMKM3oltnmrcW26Ehdf0cC7vnstvnOjj60Dd8e2yvFoVZcjKw/BBFUEJoQqANpHquuIvGGgdhzG7TJ0aqfi67/ZiJ9e0znq1zeh/H+b9KOuvKn1sI1bsyr8AbRaEeTnLH7gEYssrKVcmt4r9v5yCtQhiaFwUdJ+ZFAF2eKbCnyAk0tfmH5T8vToyNLAn3/4/omSil6b5iox5SXfPP5RbzzqYGlg3yz9YEm9k3r/9MW/m1xab7/ENzFggE5jBlnEuBODZoKAEJdpjt7GLcXno/nCQ0h12Rb8LVAAnoVNI8DQsyS46LAKj8DVdiVMRT5qfSugcwfDfa5xW8H1bil+NrEM77hsCiM/HMdPJo/GX3AM1rslGHMDmFYDaGApJrAc29RyrDcn4Cp9L3xz/TJc+O0bcdmmGq5Pl6JRWYVY9wGmCkOPskRQ6/N96KiJrDWDQGfIJayXsK+XU2xbMWk4srJQhDghwEJ07eRUVzPenLyeGXr3EaiBa37w9itnJjf8/ejkzNI0XHHRMWeO7PvA2ws9ipXuRbGFWeT6zz75RyU1/fnQz3iCqeH7IUBDFDNkpLhzGqeQcrrwyIrEvX6IoRs4Lg9BUFVymFHw1ds56iAAEQC6VEKSZsiSBLki8JS47Byfhlx5lAJegKw0hFE3hA04Gv9vcw3vuPQv+MCP1uHjv5rAJddo/GjTIP576zC+t66CL/2pg0/+agxv/vIV+OQvtuCq1hA2qUVQw0chaZGfMoDxyF6h3WjQk7OMA6VyAI9La1CspDHFtG46IwD2/Cm6dQpwig84NtUW5MTlFXZMr1b8RsVLOPNIQo+ORA2s+/GbLuHW8luVCs9T5erzD4YO9MGodH/WuTRsXtTntW5KowTWhbCzldG5ILgpWAJNrgkETNf09uZskq97dQvQOe6BdYkI4rhsg2FdpuBnowiwljcBiPuIINiAu3eWSz0M9lEedoFHoGhNIZ8ZQ5lxo8uYSgcxHp6Cy8ZW4gvrVuLdfxzEa/7Hx6t/rnDhrwz+/S8+vnKjh6vzVZiqHYtObSkSeo6d1jT8xXXW2WH9KXLW7XFvL1Yecr+MmCDYbjbglz1QbOaZ0xCje3g7TiQgmEFCllVOcdvAgpWTFMDbCMi3Gr9ZFHrT6F1HtAZWNje/M5kev6Tev/jdJ5z7xvsfaGXoA13h/q7vz5/6mz9W8tGP9vdXkDmA9gcoMUCJs7maBBo6QMPkY19uYe7IT0gMXt6FN708ME2RvJAeOwEHWQZTJhAmbRTyyDI3TwCjAI/pIb3Q3KIz3UTUyZFxCdrEACb0Cmwzx2CDPg4bPKFjsT44GhvNUdhilmHSDGDSBWgkLAO2M9BIOw0UByTCn4cDoHeZchkdkaxngDIPSzoEYcN6RW7s68U2sK1dLpp61d0on3mniUXDfb+77DPPZYVM6N1HrAZ+9av3dwb74rfEncnRzO/7yapzRoYOpDJuGZUHstb9XNegXv8fJZ3+1mkHz9P0qnJYAgm0BwEd0BsxxhAM7b5JohycstsJAhwEPEXDV86DkCXiai6dhWzClZynWGcObuYxzEiUgd9h6I2VFwHlfi5zNTqdGUSNCeg4gYlT+FkML+3AxdPI4ybbo6BMAGvYNsQwvoOhx2hswn3AhHUr8ib5bCeBFrJ0LepmMmWEqgC54cs+DgG2FSTZu7NcxjvHGYZcJQ2MGg9IGqNbJekwpl7TdlMDV3/7zX/utG96dWy9ahoOfXrF40c4EHez8D5m28eRvo+176fiV3zmlVOms+mCsh/bZGYcpUoZYb0CbpgBAT0oGqGlwXvc02Ow11II0BUelE7JQ0CPIMYYoAqwUWR+CzGV9SoSuHyGIIEAg3heVr4ZKB1CefQEgxJUWAH3NpBkFin3+tI0h/yMowBrxm2qYBNNX46ApzxYRY4ETeI76wa6y3YA5L29Pnkp6me3E5ggP/yVd2bb55uAp7hEFrIEfUdZFNvYX/EQ2Hhsn/n3GBw2Glj34w9ekiWtCzLnPSF2tZeyYYq032+O+v1ex0GpYNNXnvajOra+tTrch6jdRjw1Cs+n5bdbhTx5miDNkiK+9w/y0zGg5oiemhLAc+heGpogIACkC+Cbe2doFTTJy3P43MvTLociEjouLV1Qhiv1FQT5P5AJlXm6Wh0EyqRwGCrge0gSD01X4BjKfmSmfDiCjXSsZwFf+Gc5DNuq85ReX856LZQFFGUC82IvL1WUIyMBUQi0KcYkVQhMsWxbe1MQZFeid/U0sIMGRn/05reFtv3ZanXoXcsf/bZH7fBpv0X1fuO8ABgvc9MXhar1a1o3TMnAI6D4pRCg8Qc1AQqDwt73UlblpKAYewYUICdx8fCEwMtCfnBrFaNzN8FPkUCQkdCjh2XIRyMjOOQgAnW9MfBSCvBIhnGPD3pw0GWIB6gJaoqeFLhcBj00kJ+QtEfIFu+K7AwMBRCcF/Az9CqVc9AOUOAD+3LZWR478tGQ+oWrVilqJt842ELvZyeikB7tqAGXja1/rc46N9b7hr908hNew32cHT/Pf1zPP8uFw/HKzz27NeQ1rIfRvQAAEABJREFU39kXpI3ARsQjenOtDowXcB+Jh4PEj32VVgBPkclcyOjsndPoZU+vS5YZBAQKEiASkCLlPBLNBcToajkkUJZLYpcBOYn7b7D0RF2b7zxdlYOOHCBmw0qe7d5aynL0Lrlnx0ayXmYnz0wFyFSIHF1yxUnxbJfvAM6zAu9VoJAR8CzLSjsBx1hxs71G5EmnJ351yXkUvkjtPXoa2K6Bbb/54Fbd2PxynXYGo5nyxfsb8GZH/vb6D7vI9df/+ruDfus/FYHB0z7kXxE4AolXrc5LWxU9M2V9SIjCYxO2Fo4I6FQGkCS0OmOaUPcbP/BdIefeVs68QuClYAmFjgDSJS3eG/NorcEbmm6g8Ry0VjDa0lvNSAk9tYxlMoCgyQhDBccjC0duUgedO1jlSJbfRIZuiH24FCyUeIoEPMzWK+2GYoP4TSPn8rl53T5U0St6mGtg7Y8u/E7aGX9NbsqP7sxU3rA/m3vYgx0uG8n6s43vLAX+zSlBKee+laPHlMnPMuSUch+0qwhuyga087BLhefkkaOotQsojh5U9w+B5pADjVtIgAcoTlO1haUnZrk0BcFJKQVNUgJW5I8shM09WEiZBFZFsPSacnp3TqWQOkAgg1yUCUISVyzB+q1JYU1cUDd/BsfvDiInI/twC6ApghooEchVeAqwijyKIJi1J3+wD+x7RY8ADdzwgwsv8kqlS/3Bo1933BPe9Tf7q8n7Ptr3l2R7wXdXRbic3dafTzyrXydp6Gv4oQ9kXPYxjt28lKDDrfLK3pSoTzFVQiFGZ+/Cw2F8LmT0VneXnTwtICwEeAhSjqHjnpqQ4jvEcwQBVM3xFwBjOWUhlwCLEFPkVTAGkBchiRT5CG7KoQu0/FzUV2Tf50dR93Z+c5GurIZ199ng/+1zJT0Gh7sGXCdNnw0vuz439Q8f95iRk/ZHg7ujcn9wXmA8b/zqk36xzG7814Anp1Y2+w0NUwCvuwFGaUUVBDABG2X43r0VPZYdqZsq+RQcUcpyp188qy45fu6CkCJQFWQNimWuhHNpzKZm+bIA0UeeVrhJBE5kIBHWAIIU6J0pphZR4UFeYAjK6bjn1yVDPtIGFil4sxIJGSjmVSwjcoDgCb6D/LGPF1kDxodNLaAFkEmWMsg7vebQ93DFN547tY/V9IofARrY+qPzWy7f9JKwFi7LgtpH9sf+HUfmEaDJ2SZ6nes+VgvSn2Uz46CFwpS5/CTEKKVmc0jAeGHFt6hGFe80aNgCeyTXjtT1mCyThBhsv4XHbWn7xyIivOeoSLjdQ3jOkXy8NT9H0BICwy5JHiG7g6y3LnPrfJJ3b4mL2DSHrnD/05JHpwmfAKc9jUp9EC631zK1d/c0sFsaWHvpyE86kxvPb880H1Ezw+/erUJ7kEmsYA+yH9pZL//2q8d8O/mOJYuqU3ApQENVu9GkXS1Fd6PooZFlH6T0A+4nttrgCQl0rUyAa/MAuYF2I0Lcjj+/D6x7RY9ADaz/zpvfd1TZ/9boWPPFJ597wT/MpwqOKLATxd34+b/5cTSx6SMmjaGylP5Q4bbJJ8g+GR8oqEiheoolX/FSPMSLAz08QMoJiUtTfDoiH0parbmEpk5swoOTtIX+oT74xkNfJbhYPveop4E90YBrjf798NLlV7dQ/9djnvSmJ+1J2TvKS2u+o8+H57fl/epdKwcGfunzIEC5W8BKqcJ0wZUtoWw2ju51O++Om+8Q6n4+Yp9JowE/8OB7PuQMpVwuIWrOIG1OYlNl3dojVjG9hu+1Bq647ANTzU7rNR1XWZG4ZV856Yn/3xv2mtkOBY9IsLumEbfHt67vaPlnWvJvU3lIsR30FEFOiEoST8+JBTMO+oBFUDxuAcji9Yh9WJhKCdZapFEKl+R0ih3yPMaqpf0Wn3gR9woOZ+X02ra/NNBObNRspBjf2gjijv7H+ajnyAO7NWtMdXzdha2xrQ9N2w3Ib+6U/F5t7rdiStRaPCRSkCuesw/x5oS4bENBs+lHaJBzopCmG8WTWJ4MRzyFrVQDdCbX/Z+k96ingT3VwDFnjpTC0uCaoVIFxy8ZbNVd9Po95bGz/Ecc2K1qnfSk3Lrne77nJa1pCNCBBmtImseiugCwW8Eb9XbEqYlt3r1bieerDPIsR1Aqw/I9zjoo6/h7u8ehl6ungVs0cPyTR5aoRcMfb840X1Qxnff4zfUnX/Xjd3zulhx7HzuirPjox75kcCryn+l0uAjKKmQR4qYAXsw9JyqRHp7NEoDLW3DXjim3uW9Rl4IFsfE234+0Vw3HE+0cCsYESOIU4MGE51FPcfOP6F09DexcAztNPeHcl/U10qELZ5r+s6th/raB8fIb//jfb9u408x7kchRuRelDtEiylt6qldZ/Lg4Uci4z+SHXHolLeRxh0YbwRDstHZQRDHx8qDn1MNw7lR2LjxEdTDfYptyFQoG0Apd9Lcwivqy+QQW+nXGC31ZMg2c+YqBpQ989ZKh+71s1eL7nX/isge98vRlD/yX+yx6wCsftuRB//LIpQ961ROWPejV5y1/4KueufyBr34B4y9l+KolD3r1BcsecsFbljzsgncte9gbPrT0Ya/7+LKHve6zS8983ZeXP/T8byx92Gt/OPCAV/38qHPe8uulZ11wxbKzR65Z/diLblp01oWjS85+R3P5mW/97+POfOW9F7qaDpR8HbXkdZk1Lyh52QU3/uj8N11++fzu+XJUHqimHPx61o+7J05NZ56mgSJN6LvRE+FmuoubyAh6yqXwtIUAnZNlLex2oR1t2c29CeAJzb0fsaFG3orh6CTnSRsBDyuoSFQC35XKYbynajn5kS9dcdwj3vyUVY946+sWPeyNb17+8Lf+65KHjbx76UPf+v5lD3nnR5c++KJPLnvoez+7+GHv+srQw9966aKzR76z8hEX/njlWW+9bOXD3/bLox71zssXn/n2KwfPfPtflj/mg2uHHvHedUOP+sDWgUd/eGrg0R9p9Z3z0bR2zkdc+REfcuHDP+T8+inJJlvttO3yyUlv6dZmuGr9dLjk2gmz7KoJb9lvZ/xll02ZZT+aNEu/OWGWfmXcW/o50icmvSUfnvCXvXfaW/bWcTX05gkMvWbcLX7ZOBa/kOGzx93w345hyRPHsehRnfLRD13fLN1vNBu4+5gdOunm0Xx101+6aFtUrY7n1bMyf9EHT33IC5fvqa4Op/xnPH6kcsKTL3qbCUqv9+PRd238zksv3B/tO3LA7rSRoG949d9Ch7CCXKHPkGCnc4B7TBkBL2cIm0PJYYVzkFPGWyv9yFHXrdu967eg3g8qCggDJO0peJ7HsD0ORNO7LnX7L8se/uL7TuRDF4+7ga9ubJbfMaOWv2VbMvimSbvo/Ml88Ssm7bKXTLnF/zCRL3r2lF18HunJk/nwY6fTJY8YbQ89bCpZ9IBNU5V7ddTSuzaz4VMmWtVjJzqVo6aT6pLpuNQ/nfqVmczzmplBx/qInYcUIRJdvWNSFSS3oRhlxEwTSnUJGSooQqaluoxMVZGSJIzzEDA1IBiA9RhWhhC1OO5KfUgRILblB/rl4aNvr5EjI+W0Mz9Sm86WvW16pvWGrD36oaWm+a/7q+WHg/Xulm7qg9mx0zPJahgDNGegfZ/lLJSxgIuAtNNdzuYJND06WcrCbvflmHfuFpVpOC7VhOZSj9QwkX89If/OmDozpZBnPQ5DgwNr+710227r5MwRLywd/53ULnrQTLMMp4eR5mXkykcOA0tdW8Ys+J/KYAuiZ65ydFLusXo+Ih6QhNUaWlGM1FnyUIBWyNmfLmPehPlS9jP3adnRgIspXjZLHAPYBSmOgZ2R5Ge6cjknxxSak2SXLOMWHrdJNMljeinwYXkYZuMWYDm+fIVApfCNg1+qNFtJyg8U5Ui7R0Z07Aevd7r0Cp1O/dvyY6ZefeWPLtpvutBHin5rtfp9XZJysOVQ5RJslkF+R6dl0HKvDmnM8d9CRtBzeSZ2AsX9OxY4UlS0V+00PiePqAMqjhgSww9LyNPOjZefvHm39+xO7C8/a+t4tnimqeCFA/Ar/XAEChAU5O8AWp1ycrEFdSHJgS/FXOR4GGJJfrWMNuUwpQDKaCQd2gxDRU+zmOBkklPcoyVpZWCUD0/zHZrtJjmSxPckpPcvY2hHUpwghSRNQsN6sziBCUPWqekAa2iCdDI9jmLloL3fR+3OZgpxxN1H/9x7KaehNyTx1Ee3/s/7X3b5Jz6R7k8lSA/vT/4LhrfN7T21MVC5zKgUizOyy3MaVQbFwccPAL85HlZk4g1wICulmHHuFlUJzb33QnCiyHly7XPyEO9FOYWonaDdao9iZERwabeUNNZIn5XrAJWBIaQ2Rpo1gXIOaIKoacOaDgTwrBKWBs6F5FsBFCct1p+ZFFE0A5Q0Mtl3lf9lpa+hPVV4mhSToipA/kIql7GOZFONnAdViktaOHr5e0rWI0+SFwC+TxZBQdanTDtQnOTICIA+94nzToSYwAeP9fXVoLmV0mi3r9+4etsUjqDrmDNHSnd58gff6MLyB/1y+5OdzqbXHYjm6wNRyUKowwGny0zqB6b4k+xeWAa8oJhdtYCaZg4amixnXdoh9iVQXA4pJov8ErjC2OQN/NYlHMLXfIiutSY4CdhEtHkaMZecpcDjenG3uSvl1VeZsIJmm4BF/EAeA5x4CiXPshHdFzT7DmsYY2ZOYCCOIWAc7CUuG9M2wZLplpMZpG9nSVFWpT0mmYIATR6kwptjdE/CWZ4cQADBDMRmIUePtEsAhw9MqcpqQu7TteAPDrASXYAfcockiaF0uhmXXCKl+e3wv9esWWO8wH/t+Ex2oe95Xy7HN79m7P+9u3EgWs6ePhDVHPw6sryyDPQ8ckXvoBIgkz0cDm6lQuRW067oQZsM3FwBWlxi0FMgLhaCy5IEUo6AWBicZb7cQkl52leR6Yh8aDjQs8k1iHRIuR1QpjeVzEztNtitetyFK2JdqWcEIrAs8g4guoYHZORtOSm5MuthXUx3XNJCsa9Uwr4SjNAQkIFVAPsXXKLCEHSlXwSEYIFZKvpOeMwSZvuzqI9pexXKARcFkElRsyrFeCEQxQHB1KaWy2UD4Z1GBGHu3xHtAHqSfZVyrtLxI+rPYF05ffILI6dHTOB9be13Xv6MP//w/bu93YF9vDhS9pHDoVCcs4mCH3rK44Z1MSI5DjXtwlB6TQIUwKGZ8UlDsjEsN7PzuA3NUaxIMljBWRuyvKVhahIKY2KRI/h2CXUWclmpHQJ6V1kcoRx6k7urkjRVD0tyvYSODotI3xClRN+MgpMQCAqQPzha9BCz8HACQrMAxhQCh2JAYlFG+F48d/GwBSYKLgphO5+iQpbZk1AqlPyAYlSTJISSNKG5dEvpLV9ERhK9X74Qa+2WkpddjiPkOumc85+d+5WP1qv+xSWovwMKbeFAXV1LP1C1HcR6jFHQXMIUE69HjwGAo03AOmAAABAASURBVHenlIJSirjl4ArvgCohoIFgl3Sa7I4EsqEMDmS6gCzkunzoQYixCJHVEXvrEicM+YvPCoipr77+OvIs3e09KO5pnZxlmZalHzsCBWH2kn6YjS6oYEdh6N1DCBw3TL/VeCDoOQ44WRkoRQXxe3FLXCjPprOsub5IO4wfsnQ96QnvfdWkHfisg/1myW575fXff3l8oJvc7aEDXeuBro97ItyvjjM5jTU0zlZ3laXpkXQ3vUUgUYUQB2UBbCmQNOGyNgEug3h4XUPU9AWYTyvin2SUskcqWdhib82C+wLwwpAqUkma2dHd1Yh1Xp+Awa3yCxDcKmGhvnCsgGMBEs7JSF3MRTk8BPxyATzJxwkSkpeTquLeIvcmt4xe9lEeG+Owvv7YOuPF07H33nrf4C/6bOsFf/jWuzcdjAZLTx2Meg94nVG7NRHw1EzBQFV4ksdlqO10IBfHJAPNYehxSMrAJXH/CXmErMO9U3ouhjkUl8Eyi4sXkovXobol+emIvTW9FxSn2Rm9YIvUpvBKPI7cDY3c48xXDMCZ45SiviW/6FTCQ4kEzWblJYZ1Y6ITTokgKeUgYN7NpkHcK/IoTpU2b8v/jOiwHkTHP/p9T468oX8LffWzwZuuOPsP33/Hbk+EhaLm8UHtzyO3BczKU+5G+b2Tz6Wsm/XsUPIpcXesKcIcZklzgEIM2HETnN6dTduQmdiItsQwpYgYJr07HOGXEl1RB74fIG02ked54Ix/CpPu9G5afazT3oN3mVF0vcuPC+CDjAMRo1jGSuQ2RNAT/TiG3bGlAEE9lvOZZrLOj25T4k5fT3r8RYvu/7SPHXPCuS8L7zTzQc5wzJmvfZrfP3hpbjs/LeuJZ15++f79Hd2dNVfM987yHBbfPS+/PiA42SwHPAE5Not7dpibagl0TgYip2eZiYGMGUh5Gy5uwaYdFL+Qp//HD7w5YmmMUoQvR+yddxJ4ngdnDUylhmazDav9ZbujkDQvDfBQe6jQt6M+d6fQQssjQEdyMn5msawQcXYSwPaQHzn+5r75Okfg8j06iT36vI89KKkdd8l45fgfucVnffjYx1y0uuC3AB/HPPotLzKLVn8pSad+M6A3v/iab40clKXrjqrRO74cznEP6V8Nx5uT314RsDSXsTCzzZd0GayzQCfGp0DjUxZEOVIHLo0ZWmgZvE40xW8SHOEUVqvI4gxZlMIzJSgvhPP8e5z09JFFd6aa1HhLbM4+sDvokhPI9nILHgApO4Fuu7y3iziIZwfHCZZjDGB+5pFxGGjbWhXP7Pap9THP+XQpLR/34jHbf+aGVvnEjVH9BWnfyneQ3YK7j3/4G59sasv+PUqSTYHb9tg/f+ud1y8EIbvaXwiS7G8Z8sZfAh7CaihinM/xRwPb0cjASyuApJTiC7+Ld6cdQKDLoxYBL4J2s+liiPKNOY/ku1AhvTplAmQZ96dAL0+X791JysfcmV6SXD/Siq53JNGrkBSWdAn3hYTXjjTHS3gLzb1LuOP7XBlJvxNSBDzF/blbsmmAw6YgSSQvbbiakIlWGxgBv6R58eWX7/6yLu+UV6bB4jOaroKOqiIyQ5hx/U8/9TEXLijv7rhHvuvsYPjES0PjX15O2/f469ffMS4qWAikF4IQeyfDnpVKW1M3l32FPEuR82BCKQU5jcWtLgEySeiG4sQVyxAZnHmCnEtZxw14cQohmissXfIfueTkB3Jcywd+hbqVSUKhkyJoRX3Dd6qVUvWJggl3mm9fMkhn7UhzvAhAuC1Jf86lcXxAaC7/LkJpMWQFUHzvjpsiOvtwXKd7YQjbaQPKg6IseRbBR/RN7MGVK68vR3kxFGds8gHI05WRlPrvvwds9mvWkx/55jV+3+Kf0KO7Im1ufNb133/DQTuM2FlDxWR3ln7YpW26/BPtTmvi6nLgI6hUYZOYFAGcleE4ZGcHrBifvN5KAeLNZdyLSujdMfSVgwFzciAzequsR9qLLPk9nnJn3As13Av1SiGmpmZgSsN39kcpVSfDIqf28xCcA6+5cK6D5t6V9D1pLn0vQhkDcghRjJvtrCSiiKf0dqUuL4CinlzU5rmYRrma79FfcqaWgsCpULsU2sbQOfeTLesw1bvuhcjzXmTl2a9/qh5ceXEQYrxstzzzuu9e8Jd5r2QfGVKH+8jhECpeqZlfeEZxucWBwhkWQjvKL4AnxDQHDadm1VOMZpbhqWxOcjaC5jjjUGZOSzpy75xGp6lH+XfHQlm7hfqS5fCrS198R1pZctYFd0tyA4tZHd9R5n35JkCzs/JzIDcXsg2FJzf3LmV2VVa+FWShZCJkK1CQK1KLB6MybJR1yGX56vtwaQoYD/Wy325FM2NFvt18mNxq4yx3YnJOtFlBoO4yVVmxmyz2W7bTzjn/IYOLV11iPNV2zc2nX/3tN/95v1W2D4z1PpQ95Ipm8cwf4qQNGycw8g9fZWBDzbbDAgJ0BQGQb/LPlOSfLElcNOViDliWTwl2XM4aguFcaRw617xK6vmcFLi3KYbshQFXVwEaUw3EeXnVGWd8nBtVO69uppW/SPvhLRPKzrPte+ptQUz6ckcSQBOSmubSJT6XJvHdpe2DQQaLhnIaYRjCNx4wNQ3OsvB9wy3g1n+PLh7t/shzN3l7LudZh4XhUttwqEoxpiDT1TvfLpDM+4lOe/QbHxz2rfqJscn12dQN97/qW2/cup+q2me2ep85HEIMSmV1db1SRlguQ5ZfnHI5IEESNTgApGI6ZsiBCs6c4NqkOIdQOb9nAJexWSL/siKHEeNg6pF7W3ieRtqagSxfRV1IIsCEiDIfW1b0n7EL3aig0v+MxCo4qF1kmcdkAS4hAgXmSN6F5H3HUOK7WbUMlW5WC3fLS5GkOH40qTPT/QcSqn8QVBZgc6Tt5uV7+pdOMmUch2KWcwKm1pFzos1VgKA6uLio8CA8jj7zxY8rD676RZzaSSRjf/fX773rTwdBjN2uUu92zsMgY5S212VJvDanV2blN3ZKDG1HFciUKcTGyiexXg5YSAgHCOBxzwQsm2dJFzBxZF9R1IRfr0BpGnGD3ks5gFetoN1xCEqDr96Zds4444VeDr/fWbWzz/ObdlswE+5KQdHj08ZAeR4UQyglX8BO7ZK8C3VT7+A5O14kh6wKwPFEVEIxboBStQplHRzHjGZdaRxhsL+2QbLvCVltskSZOFMhhKwu0asLMN5Mlu4Jn/nKe8rjXnHmytUnfXumOQ1PtR/xx2+87bfzxXt/8WHP7C/WC4/voO2Me4H+P2X8YkAXg7zYa5mTlepwQhz4bi6Ns7ajV+dmEzgzQ/7eWpZA2wzdPRvJy3Iy0G9Fkn5bknxguTnSRRzFJYYzR0UCH3qWGBT33HcJi4SD9qCWoI0p6k+zGKhwGcuDiqwZwStVEbvgCcXH2zy29i29Vyp69nx+kfYx2MtbsVuEMKd3RUaSIBNTQfKuiGUaRhkECigb26h7dt2gn91Q9+P1VRM1QqYbxwfY10U5httF00UfFWxF7qIuDiHJDg9OaaAAulv6xPFdfkKY8PTfFt8B25jCouH+dpx29vh/D2iN/CNk28oh3rBhfRpWeegfWj6INRcbHMDr1Medf6+hoaO/2Wq1olopOv3Kr7/xqgNY/V5XxV7a67KHXMGrL/tokxP9tZn2oENuGGdccskIhoVyCsrOESAgpuTfx3LgO36HXHMzPQcw1248Eetw2HP4KQdnQdLQnHkVaPR8Nxzk/EReIOlZYh00GEWeCuAejOqmF+85oFISQ74DUkbxuxDjTJNyUGROEoPCwbzYDuMC5DyVhq+ogIwUQlEHORveVPBPOPftt1tmtfLO4xPqG8rfJ+lZBRQcitB65CXEQFMOQ/DVpDwhyGl4VsPEabuO7L8q6cSzS3b9fZeu33ZapXPdGQNq8mlB3Pls6FTiew6wDcBwS00nQNEH1D2TDUmxzULdSpkVHEcEPCjWiRSKAwzMB8rgSBxSUNoAHEs61Iij9g1GuRvIeI/uapBFcXu8EZIVHMeHDDh6jNx+HjhjcFLvEbN9yHz6E976oLB64k+jNEhKCo/9wyUjV+8DuwNa9IAp6YC26g4q80z2p3q9mth2G6BXIuNSsqvZQXxLiK4hiSURZCCXZBYCHzZBzv07GeSOm3rENebQyGnEll4gc4BREj3DApg43smRmYp77psYA5h+S37mU10CL0lnwBwWhSh8mQsZXQC3DCESZaaQFFxTTg3H5X7GpWI7XHo7784L++6mgxBICEZSbm9bUSjCzpbWRd0Aw4KICtIp7OPQKGSt8azfb71m6ejEC8Z/ccE3tv307Vuvvnok2fKLD49u+PHI94bDmRf7+fQHXNZ24CECG4CC2Hdg/wvX2YoYzNXJqNRR1Cc9ZYu2K44lfkGhD6ORcglbYnttpwNPpxtcBXu8jG230kZ/X2kKnHyVAiDgyUjKjc+tk4OzKM/0/Xif8sjnPiysLfmhdXqgPblhzW8vueC/92N188761n047+wXHkPbmPl9YOMtPBaDLpZRHDccPF3wuX1cKX7csRnFu0VOjyFOIi56MjjuVwngyWwOmeE5o4NpOb00pwl2QjQaR1C0BVlYptHZQM4eyLWGU1wOiQeg6O0oGioNSMyH1sNvDhIXGcH0gmhQirSjaAcnbqk0NkKEE3mUhaMOlLSdaSpYcs6Ocp122kjg+Yv7bUZPqMRyBJIdv+9JXHQiOrTicpGPKhLoVedlwNZJspcYIGpP2iX9yTtH//d1HxGA21kdN102EgVu83+ESP9YDfqZpQbECoX+i77UrEGzbWwvY/wASHuLuKQxhe9sMvOge1EeI2Msz4l7bCv72SAe3/TtEc603Sy7ei591IePPeFvv3783PfSssVjad7eFslvPaljRDFFs4jjFOl0ROZzOfdPePKj33C3+qJ7f2OyGVejzuh9//qDd1622zUtkIz7XUkLpJ3bxVg8jXUuGr9Gc7a3HCgchdu/7TwyqyLHkVtkkIFNsjlAsAP37QyXFJoEybI9X5F59jHLo3ijAc0BlrwT/CCDV5IdJ+iCJD9J0ueMqYhLAbAafit4dN8P5tOK3CJATtkFeUROlUMV+lDQweCKM88c4UcU19Si/PQU5aOQpkDUKtL2+iETj3hWRWiLOrv1Uj8EHlCXHr+HOr3Jj7f8+53VM/qr919f8fWVnZkY4AGLrvEEtWgPAZz6lj0ySH8oB3bCLDvGmUcJyjEPJJS6Jc4cubSTINdpdbhfN4Q0mr7T/a0TH/vOV+eDd1875R9//eInfPXfjltzcf/1H35MPDYdj2ovgFYOXtkvwpxbeZFviPCsbH/cIyP6pMdfdIpfPuqrncSUSl7yyGu//frf7Y+q9jdPjor9XcXC4i8zu+uMf7fksekyMAXtaLASvR1RdFmSShZGOcBlYDOzGJfsmxDokGTQmYXPwkaIrpomgQNeyz4SDU7icPTWCuo3h5T4AAAQAElEQVTWqwQYyA7IAHpBKMABgBXS2w1X8bsQig+Ag2aGLnXjfD1IN5tbyOMIKGB7C2KKo/FrCeGhjfKxG1bd625zIqry8F2brXylCkOokDa608lhLvedhdSDeMKsp6hTJVCKQKW438Y4SGk8jXKIb2341b/v1qGASdK2xz4LCHQ2Yt+ICPTCIW2k7ou2Mk2xfZA+YVuLkO1XVEjxnUMEfBdSUNCa3jr3ieNOK6mU81/izq7Sqc9I/T6MNdq27Q390ygWfx7P+MPf5Wbp8dovw+NQUlxTpJ1mwSlwSVhE5vlxz8dc+NCl/1P+UoT+7yp4q0I0n/6XS8//yTxXc8DYcbQcsLoWTEUVL/luKl4FB+CuhRLVqNt8dsDc4FaM07uzKQ1LTiK5h2JouJoGIKXks/yWTwmI4daXfJMUJXkFNDlwJZ+ka7LtkkXhLRZG5ZjdFTFGitvRiFCQyImDdtG+i7q7bbaMCzGgbJab97kpr2hmZjvYdZwZzo0OXMb2cHknOfeJBFQgOmC9nDQ0CHicIEDdghqrVEL4ym3b3To0ocTTBrn8VWvx3MFL6pAGMnrr2/E1I4GtBavz+JBb5CGxnPyVHcWODQnunlbWb03dqWeXxzOfjaMZoMRFtV+zTVQeh1R/zFT6Hp5x/y9uTCPlJFvp64fTisci3BCUaueRTlszUut49Vek3sB5m0anjnNJ4/2Xf+3V35jHKg44K/bIAa9z3yqch9IbLiutLRv7e6idjeCdqcSAyNOt2coAl6gYFyltw8q/rEDMgZfAGe7hqRSO+1YFFV4B8ymWE6BUORz3gIpvjCsap7EZPIKeJ6EFPJ7oGYKkhoMSwyUvqbELtN1UClQkHdwHZVEaKBCPghcAY6EcqJMAjh5XK40RGb/7K38uieD7K9KYp50EFIinyxbudRtYD2ti8YxccoD6tNQtRM+sXe52s40kjikk7vRaccYLK2nmLQML5nETwXAfy0hRIYuCr2ObWRukrVLPLGnx1AvQZV6FWy4uYX3f5/I1Bg+0tqxbPkYUu+XzzmJrv/OsD/ZnWz/cX/aIaRl0GFrlu2o+usGVQoP6oiVA7iNOPShlqOVsf3h2SRvx1lbWQr3fy9PWxj/sTNZDKY09cyiJO1+yjtiqrz6ueWIIemMFVxm0RUQeO6hFjFlAsSAOeIJQd6ArFACYE9gIUpqDXxW8LJRSBQmnghSfBRXWyZfurYrXubokw1ycofOYaS5NQ/BEsstyDZAY65GAuQ727ehdQNo/SyKPg0FOQ0zzDFZX7w44dcwVq/uaafpgU/Ud0hyqaCPbKgX2hpQlWxac1YMF9eU0ilcBUlIp7IPyqydizRrOWMx7B7dfOupMBNWHJJx4gmqIZGKc/IUnSSadgoSB1DErd9GJUqPmcJB8ki4EkQbiJUbNBsJAw9joh7v7Lye23uPPr/Cbf31O3Uxf5jpj2ri2DmolJZ5dY3IaulxDToCV1QO05mkK5vW6+pKRxPPyTy1bsahJpLvsmsve+9V5reAgMOv2ykGo+GBXmc9s+XZ/1Y+VDGAuR0FviqMV4EA3vgFSbqBrDt7ZpZZSjAuYCRXmZLtNsAo2zqUYizMP9+ukiKOhgXMu7R/goCz+X6GWfBn3PE7ESc7yfFcB8sxA+1Wxf6Rc3oWlOlKWzxGwuE8ycFI/2ZMZoCwNiQZWGJrFwb10t3rK5DgRqJxyWUeZqRdKqT0PXlB60pKn/3TJTNxXU55//zyNFOjZGe1jny5WxWpFHSQDOOqr2MMLACsU0qsLECflxy8fO+Ued1TX0Q9+x+C07XttpIKBjBMYDJUdUD6CJ1gPwP5SHBNS4U4YcRiwzbMfJL8QX7MsQ7laRRa1kcfRt5i0e/fIiB376povH5ve9PTheNNLufUywbkDWeK4uq1BcZwia1NMC2Xz2u4x3bNcfja50ctb0WB/sNvbAHtWw4HNPTtSD2ylC6G2bb/54FadNr8tP5HwSgHEKCFAxj2RPI7hcYCCAxXGQCnFT64rNuNM4E1joFEXiQRKS1JKMbvZTtoYgMaiPfLnno2h4QsqZuSvPA3f0Hvjd69SRTw1xeVCHzxu2jemp2hfGpaej0MIgIarNMAqQZNSBOiCHAf6rFi402s/ZRCjE70Je04OSimKaUELhFyWoB7Frq68eqVlgnKS8pvMBkWQQ+2D/Iq6M+RjOIEAHhwMwDRQAsyCkvEraKfBUIyh7y16yCuWYydX5SEvXL4t1//TRPDQVg6YWg3JDFebonORT4g6R0HMIDzYThTLVnmx8tgpheUSOpOjKBE3w3L2fzvNdAeJV379JdtGv/Psj1Ra409NJ8e29tX7IMCatxuo1UtQHANwefUOWOz1p0raSUPtZcap2l4zWUAF9QKS5YCLUkL7JyZPi1m3+JExwSvo66PBOGTNJrRPkKFUznIwCzkHpRwMCYU3mAFcwoIHFClBMmWagF5OkMy5V2WzBCowsBJvc2ZPI0BZ2kyESjlAwtM0rTUn6DZ0LUSzNY40b8JUPPjlCvPSQhDMhgRGMS7WrSiH7OkJ4aBebAuNTRFmnDLUjSYp0MWlVDngSPR0qR4gLN3f6uwRzvL4hV4r2G6lFPPt6806BeCEhJXoV6WAnMrqFDkPjjhzoZX1LWm61VeVHvDGNy95xJvPqZ/xjw8efMhrH1s5+01vj/3Vf1Z9w3dR1QrYIuQ55eIyUZw5MEUxwhRIO4v+YxqkPmkHupdjBiGqAgUxWbYcZEyEfTX01710tDHNdTE/7MW95dKn/GwJ0s+6uI0sz6HLHpozk6wqRa2/Xt0LlndaJLFenrdUQlXSKO40+4LPoBe8hPtRwHqQ/X5ooLK5VA5RqlUhtpe0eJxfeGAORv4NLQcW3bquFLczUAsYjjeXWkUXJlQ5QroavrbgwRs8alelBDzZGzQ5PJWhTvAr8tgIPiKoaBxl00LZMcQ4agHrz8dhk2kaDY0WiqEAHcNCCgsxOOUY4OBdjoArJOAPGr8ujF9DnCwnwkmbkUMpgyyzxDb1L2mWPQeSj0t3YxQUy+17Cyyc6upE5AAysswBlZBSescpVCBLWcutgeoQwmVvGWuE3wkX3eX7trz6W+2o/vpcDwx2pme4c9EGfOqa+4kimvY8yugglyoCJVGSvGiGvAuEA2XokuRTnAAgDPhZ/tWEo0wub3wbe/Bn2Fn0dnefF18VegoyoWrOGeWKT2DOEUdp/+0yz0NCKQ9yp70k8Cs9sJsHfR5UFkHa+atNo99HXLJE05MoBeJJKYSeoYGESJst0EoBQUEhcAhbi5yemxg6vTJLt0whaWnN0zshj6ezoe0QvCKEroOBErCMj2X1IBouYVuYN28eKrlrvGjyD6v6za+Or6c/Oyoc/97KyrZLF5l1X1hWGfvP1YPxR48exEcGq+Ya5VJAjMexcrkVXxk6aAgxelBvATshR6MXspTViTdFoAM9XRHOUl9p1DkDUeduyHMl+hRQsOIVz4KC5NtTEpDLDL03kuNEAk42ilqB8GQckmYyOB1DVwx4QgBDMCv19Xlj7ag2HWUa/gCgStB9dYAya8N8eQ7F0LY58cAy3ZIrPWzuCZIZ3xXJkngX/aIhExCUg2LdDDB3GU6iSRLBxlM/nkvb23C0ufZG3/ey0C8h4yoh5YrBUE6nlQi/t2x3Wa5ZcTbOkySx8X7hv8uK99MH9tJ+4nwIsL3yRxe1AmSXLVnGo3yjuBpNoBnGrTaUUlxKlsEIAA5uS6IR0FgtKQdgQ53+27JK8y4ralOnLK1sPm64tGH5kN4wUK3cUGvd5aem9eUHq4nP3kdt/sTd1JZP3aO89bNnLB370gOP2fz5B50ydsmj73Xjp8964F8/e87Dr/3cUx577Wf+7inrvvTCZ17/n2tesPY/zvmnG5d/4+X9fvp/vk1pQ2JYDhAPBnJpmpRHMnw58F0oQM+KeQsI8HDGUTZuATgCHsTSKZIm0BkCH9XJfEBHJo40I2Lwlaq8hQff9/YmH7AuqVZYKKdZvSJpvpJ4g560yxPYTgOWE0er1UJETxOpAgLaMD1PNDqwWQ7l+bBTk1CVEgKf30MDAVSnyIhLVue4f+r8Lm9qHwRHvnRvZsds/zD3bBqHCrcyqrUS0qj5127i3j9rtcrmLG7FljxNEIDTBqAVPBNU957rrkvWXCXPVJb4tfJ+8Rx3XfP++bK9X/YP+4XPNfTyb7ebrelarY6MRqGUArhcFWNM5UTW0ZCF2BTlhc4Ly/BKFeX7vq7oVmfLD1/3500/eO01m77zinU3XfLcLWsvOW966+ee3cLIiCAUS+3lzfJ+Z6sKbQcejXS7d6cAR/B1oCHCw5yh72Ut+1aMenGcAJx4aAS7ghmND9CUEDDynbJrT3F/MuJnpYv9PIKCyK0EaJiXH/b+Fh5C1IXJfZg8IOYQkASUhOSfBNL78XlQUGK/atFb5iEYWgV0Mig46EADMcEuc6gMDcO1Z3iCywOKvAWoHHI5BFR8OEsey+WkDILtYAxskwRcXaJYxso7uleWJ+1aX7il+7b3z8ZUPl4p+Yk2BFHq2/khMoJw5lRl77nuuuQ454c0T6JGnnPW33W+Q+ULe/lQEXX/yLn2OxdcV/bz/2k1G1DGh9I+4HmszEJzwHocVL5LUPWi0aFy50OLK+qpiyrec/vK+FwlzLgGYtb9cY+M6FKpKoLMcrcQYwJ0cVvuC4rX0TU2fnIorj19Lwrt5LG7fDhDoHBytvMwgFJQAiouL7wpj7KmcQLiCsBvIAhaAqTIj1sXxh5fRbupE3p1AqBgvSAAdInpUh+ZysSV0HsLAu4rEHOT8Unw0ATIMyh6oZy8YFOLdrsNQ2AEtyt0STBEsTT58MmM8ryFOD6gRAAS64cQ21PIIcUKUqj4/hU8ANt6S8G9i00tnm7bNJmyUQueJtjmEecOkq+re8fxjksNNzblGi72giDk5D2rhDsus+PXhRY/5BswHwr1460fDkINqwParnLwQtpjSl8hhc9Bv7ispob1zX8z/r1XvmLzd1749S3fed5/jX/nhc9eVa2+cj7q3xmPE8bv68f+cCkmAGdisDTQIl8RZ0yngJw6ArQ3vdcEgjlbzPLCZwcCirTCayNoKRqxEGbjRoNzggfD/SPQyAvgErcmISiTMi61ZE/JJR0g7cCIh8RlLeS3hjKhKAfHtAIYsA9XwdPC6Qw5QTUjbecp34S1AJo2sJzEYgJt8b1EJCJYSNwag4yAp+iBEj2QUydEQi5tNbFYPDrmVQRrxIAS4j4gNDhQ4FQG8ABCZYZOoKEMfKPnxc8Ai2lGdBpdue4RS3nihN26Tn7ISx+04oGvf/mSs976moGz33JB3yP+daR69vvfWZ086l1jW7f1uc64y6Y2AI1NSBrr3bax8SeF57z3B9VHvOu/Bx75vv83+Kh/+8PgYz529ZLHfXTzcY9///t3q9KdZLr88k9kxuapilL/zMvYkJ3kOZSS2JuHjNVVSwAAEABJREFUkrj7R9blx49dVjFmk5HRmRNEOi2USgEyHvNXwyxFOvP3637yof+V2u/xpJGB05/wvhNO+Jt3rRpterRsSZ1/6o/9UuaVyzkhVwwSMtacR+PrkmLNykm9jBCIunlo9KqbtifvklcIxRJUygMFa1aiPQPN5Z98l6U9a+BEkBfgkMtJM4FBEVQUZZBQVFhwIIBQdPg0fIOE/AgW2kIpVYAoyLsgfiny781DhBRi3SAJ4BZyKjKTdCGmd7+BNamC+JV3F6QYKdK2l5OEgsjEGcYY8gnhI8AmJHEwnSAvgXw2PIYWctCAmiV+t+0YJZgxjIxY7ObVVtWnz6hFH5zMl7xrKht660w68P+10uC1rTh/eafTGsxa0xatceeaY851Gi6Ns6PjuHpOKxk4ayrqe+BkVL3HZDs8dbRllrWz8qmAtG43K791NudleepSh22LpWG3/niovbFXDjWR51/eyz/xibRPZf9uiGulKnem6TXJL9/D0MD3G9/d9LMLil++H/fEtz9m83T1C1NZ5QeTae3rTTX9uvmXpsvRhmHAJXTZEEjEYVK5gcr8gjRDn+TRwCS31Ra7RQSeIt8OITfW4FheqPjG+PZQWeQ8Wc15SGJJxSmrCCOjht8cjV5ziW9sAo/LUp/eET0BYlhOy0jpzVloekR51oLNuf9F0ANyOBJYHkqJ+Ic2OVGGB0uAY2uh5F1I+obhor5hV/VL6/akkZqdIXzoRENpH6B3D22geSn5oMU9too8lYavjQsUHD1Q5SPghOjnlIR7qV4WY+lQnbOjZMXeXTk7i2A3s2Ha7B2DhVNKLxxR7liS/f21XvW/OVDy4rTThDIaGU9kfXo1Nm9+Rupece577znT6nvfZBo+ZrRlj59sZvfWpjxy2pp/rMn3+SabpkHmkhIKTyKHgjgGQijiGo4rLovuNdeNdxLS+Ir8O4YSnyOxHyVjepaPo5EISTU5S3IJyCcUTUxCiDU6esI2giXgWQKjJeg5EkiSJsCWckkLIcrshIfUY2nEt/KcCo6H2IP6gehKQhFd4hKSnJAoLtnaiWau4Ntu307l45qTTuGpcrKDEPvfEneIpuRDvkVVDlxlwlLv0heKfeFIChnnME427JPm1Og0C4g0DPb8tkqlstc5VKdR7HnxBVWiUNmCkuggCbNoZura0NjLLD0Opxxq/TV41E6pPnStiOTroXMtBk9OXBUJDdXwdK4x3YRuuOOwH65Mp+XIduo5vUxrYlgdwzEUyhmmXge5IdCwbsWJfo5k0t85aWh6G7eluXIql+8Gei6UPSiSR29BcT2qCEwq92CYRpGAhPYje3MqR2YyiJyZyiG6A8HQ0hNBQYq2SuNUGlB0MpwPZUMSN/9dCaAngkP9oiq6TZB2kgg2oEcL1YEy7TGXTO7R/3Mid52buX5EXvCQPs7JvluJU8KfJAAocXaG0xGkLgkz04ZVbUB3YJjO84x9+netuVJxO1doWsPOwyF9cQQe0vLPm/CXXTYS1Ur5L2qVMrRXRnOmRXDxYGnKUklQLS+eanGS5GzJrTRkdO3TBNy7qtxfvs875Wk1s/kw8QlQADQHu5KQA529ZhnnGGRC9+Zrka37dudPRXaSS8rBOd5CFpKu+F58E8+NSyLF5aljXFEbt5DkAGyRlwIRECFejgCa9qBJfEAphUJ2owA5AJjNr5QBMqZ12RziT1GmRdcLl1DAKYVGyn3fqYkNqzZw4GC3r1Tba5z0t6ayuLqAkOyBUmWgPjVJwqKzfGKQzw/cfRE9O62gqGfF01rNyceoeLf+aOmuhOM8msQUIyqX/V3lOVTS9aEi6AGR00z+tOaZbTbiYK0OYCa1mJ6ZuYvU3XJbtupaAwhnkCXj4FLXab8PqrLowfJ9vinN/b440QOgF1QQPSKIFyR7MwWVAabJKtNxYDsO7J0ST2xdQRm9rh1Iz8VTpov3kDCMYelNWCWhUEIw7xDQxHNIYLnnVhDzOPKEoZ7o+YFb8CILxFOzHuUyUDDFf3IqC+7rgd4fpAx5gOW1eCXIgCLEIXrNgpzoUvpAiP0AagrI2X4Cno2u3N0/6zSnBNd2N3rKgyYh0xA1gZMOMtYn2wM5+4v7y8j5LlTMfIbVUvdEpzTXyDMDK/kTddMc370JnbZxzj4L8haZ7w2HhVOGmlw4whxsSZZOZL8Prbs+EFCh52Y5iOr14X8QuSza3xoeNOuBGEZba+PMORcitqW7yff5pizT9Sw1xIQQBZCIi8exXdgR5VKCcjSnuXrl9fZkCWAsruZyzYYEGGFVAA3joGFCjFSWRhKHfM1YkGCm6anIKFFMUxmBL4HsE8HGAA3OgMy5xAXJMIumnEpOaHOWozeYxxHzJQCNFI48Wc7ResXzYCIUy8xKdegFbLo0H9CQ5aUQqE9FPWqSYXu1jb6/pw0b/d2SbQELBZrusFKgq9Ylreksa44/BW0M+AAfKMaHYgldAgzHiwng0bP2ebhhbb6Wmfb6NipPHNuR+IG/10wWSEEZxgtElIMvxmWXjWTV1H2xnHooZRkqNOBWo/LIRWe/66wtl7zh6lpmzx+u9W+p+BWtlabuNPzy0N3Pff3Fi1/4wo/P62DIYlVzsYJHQPW4R+jBQXPQaXpJHsHCJ0h4AJTTd0iagCh5UACkhua70Fwa0QvILSD/hIpegrMWjid5yAh0TFcsB/mXJEwzyivqgtSpDbwg4OlfDpW2ISd/fk4gjBqo0y7KRiHjYU8BBsYAXAoJKZbRVF2ep1BMxiF9KUATZOj7wPNRNChzUEqx30hc/uvM/R57fI2wx7PNNm6xX2SCcOj2EwPpH6fIUXM8aNbjAVHKHYIACoxza0DRu1M8vQf7LkXKCRp7fTmbJJ6MuSxnA/eazYIoqBeEFAtIiKpNv1wJuM6yHCY0/oiOiXXVj6561Hvud8Olr/mKa3UewW2SNx937IqvLVo28OOhoUWf065SX3zP+y151yf/tz5fTalV6wMc1wQeAhG9IrqRHMwc9HCwyGU3iPjEb7ussPvNEbAKIjNLwMoJSDmBXLwzJ4BDftiR6I2xUibl5MwDB+oBLCeAaCkHWLtSDh4BS8JO1EG1rwo/MEiSCPV6DTNTY2gT6Pr6+5mdMotxCrKRnMTJWW5F74cZJLoAaTdEIuiDBzW6Ku2kKUUx4JcQhjzEIgDVKjVsDWoTu8Hpdllsnv3e516cUgJs8lkDjCs1+04gM/SiwVPuSjmATWK4RhNgvwSlEpI8K/4+YqWa7tMBRdRJojAMkbWJvzi0L2rw0G7AfEv/25++dDw3zS+i6nOnQuWZcq4d5afMTJf+a/nZn/i7iZ+97s8T333Rv/bXtj796OMqT1lVGnzRSUuGNvv9fcO1406iZc+PRK1mc3XGgQxDwNEOskTi+Ialx2SNhuUmdEHassJbSNHr65KFIjB5XFsSnOFx0jeMawWmOxhlQeeMnloKOBqpkLSY5SFUAJHjN8sCOXhMC0U5hKQcDD9RDgmbNkcni2EJjA16dl61DBX66HDPE9w/guwxgssreqmQAsKOrMkOh/ylQ9hGDM1lZNC3GGjniDtAUOqHVcEPwNXC3rSxA/fdlJOKE6+YkwQrgJBiv7D36dUpdkAOw73QdnMMxssQDFeBLEKcUh52eitOfnv99z/Mzt0bCbpllFfvZHmAjqv0PLuuSg7e80nPef/A2f/0b8PnPO8/h7r0vtlQ3t839NiXfHTwwaQzmU/Cc573vqEzX/jxRWc//z+WnvmPH1km9JDnfmixfL/bo95TfcCa95UHFvd/KkraQMnTmU1cWK0hc95J0xPNz686+/3Xr378RW+YbtsH2U77hHZ9+nGo9j+5Uvc7i8M4v/jPfw7mQxuhl9y/GnIwuwaMbULntKA8QdfLIkDxVFhASuUc2Pwm33dGLmlgjmw8A9uZhiPlEcOI7zEPXf5/9q4ESorqXP+3qqvX6b17ZpwZBgTUpx4JPo3ENbjELAriKGo0mrhEXOISN0AY6GGLAxoUoqhxOwkxT8eoJ8o2CszgCIhgVBZBtmHW3pfq7tqX998hk6DPc5J5ElnsOv3NvXXrr/rv/W7dr/66l24UjAhUvL5aBIKDhWgC+lT+ATA0wKkboAOJKCJGEciNLICuFIFx2QByKfCGPAAOAmVuK2h4vpZNgSoWTVBpaEmfqThWaCRkonCDgYKr9+FgcHUor0EF22J34BSmBEqhAGC1ASEsChELkmS8XXHxA67Aj+/ynHbRRO/I0ff6hlCMu9c3FPeHXnSrdzgeo+lILKs953b/KZdM8gd+HPEwDvtOxmLHpqGoAQIjc9wBggIIYNJsHwzk01bmAhXnTxUB+4UumuITzcQIWpbVlVVjIs7AqLs8Q8ZFfPTap1w7qc9HX/6S3/hHYvmXQet6wtiH3DU4FgoqsBrO/bEWb2jI6Ii9YsQDrvDoO8pOGNvopjbDsa60Ladc+xv/yeMjgTNumBM84/LJX8A56JPiH35+EfGN7MN832gcl/9EBPf7sf/YOXhdikvoGMa60vwPb44Ezhz/a0cfAQP4Q+/CAZgffqZymXOmxoZekhyuFwW76wXJVvl80eZ8XrQ5nytYK36f0d2/V3XPM5Il9IyiuZ/mSfnTCuN+WrV6F6kk/DRvuhflrZ6n4pp3oRIIze9UAvNEhrvG6S572+mwLPNWh9/Rrca7VdXB5vKweymY2udOu/MHTo6bb7dZ33KayitWU7jHzbHfYxzhGrd+/GlLN8aGfV2mlEJXh1rc08wpPcs5ObrMKqWXccX8MlLILwdRWEGkwgpWzjZzKt9s0Q5E4R2LRpHDNPeOE6R37SC/4zAlmm92Ymo3pWY7I65wgPKO08C8Ka2wm/JyF1FW4PEVLiI3O4i8wgnycgorSMtsoC61GsoyTpcQ4lJWE5dyqrCUEXJLgFWW8NH2ZVY1s0zjezDNLbeXscssRN4MgIGFqSEdBgBGk8gfmIwCJisi8BjR4UjdCGoOwSjYNCTAiUsAnEhlMaLSBRQdDMOtnPMUDjxTgxCoz5iOaZK9ckZF9bDZftuxc8Dqn+3wnjLL7h4+i9hrZwFTPdsbHDTT5EINfsZdLwvkaqfLp/RFxXgtQPGic540MZBHHR8YOmqgyWHPYFQJgA8TFCUgmIoy2DgrhD2BapfunF5dNShCNOcs4hncaDGPedQeHDZXdRzXqLkGzcmR0KwMeGfwmj8i6qEGgQnP5D2DZ0r6oAapYIvYPcdcKCsEDNZ3m2SrjWjB6ilWx39NTghQb9iHzzbdlY1saOhcUffOJY7qxqLiblTLqueCu3aubAs3qo6KxoJZ1cib1Y26M9SouirnqkbNPNUc8qhp+H9bNH3zRdPzhGh4FojMoAUSW7tQZGsWihZ/H0xPzULDeczCpGBdIHmPWUhcwSfBcezvbf7jroIBbswA7Q8787JY7/2EF8eTgnQ1W5SuURLRa3WEmoheZyRjPzMzieuZTPznKidDL2kAABAASURBVCPcqBPhxqLce6M1lfmFLuV/DmL+eoes3uBSYzeVe8TbXUXlXo+1/b7Ok7bfJSybMFawe8cO94tjKg3xUi2z7TKnt/tyT7A4Ti1oP3IV+LOUdPbEkJMNeh3GT8rDvp1ul+1HMpBpFm/5fzdvL1a98be9/+9fRQmWm3cGXMa4Cq1j3DH6vsuHOMRxw138uBOd6cuGq+Jlw5Qtlx0rfza2FjGMy43px1AudylFjbxrDEW5uOPSSnH7mJCvd2w4F7usytgzplJIXlbJp8eV84mx4ULmsspiflylkLvcb9t7eQjLfda942jqte+uoyh3dVwRcu69MmTffQXa1dUa3XU1RmfdcOfmy4eoHVcMEYpXDhbydVWFQl1lIV9XS6LjKgPZOquS3gQYdYKpA+DrF5j09sFbjuDgwYGK8kcLjmAYoOMro45RNmfFdpkygCGA023HpQJJASnZICvR2aqYm23o2Zkcm51e2LOnXsm2T3WRbH0xlarviu+d5jQL09Risd6QEtNMsRDRi/nZHhuZpRVTbzJEBSA6MkfZMsBAhTWAgEk5ZCygKSoYuo7TBvhCYaCZrgDr4oDTxKxS5Keaqc7ZoKRnhjnndA6YhxlQJ+bziUkFYk7qzklTUoJ9Wla1TVdU14yiYm8ommURwXQ1iGyw0bAGfiepyipgAdvkf1c3bM+bnHdRt2Is0NjgI4I91MCy1fXEUzXFYnNNysbyE3O64yFFsj/Y3Z15yGa1TuREYaJVKky2S/nJDpF/GBRhEoj8REbtfdDQeu+X1Oh9nBq/l9Pi93BS/J6iGLub4fl7mFy6D4aauNvMpe9mLPw9FjV9t1lM3cnH9v4SlPgrMMANe2iAZxxm5k1NEaXlpRulfqxruk/8Kmx6doJA8ekfHyy2NN1ZeP+Fm/P/xMR8y1N3Fja9NUGg/4UcRCIGAN5VTVfpeI66a9ndcntLRKLHKOg+9UHPXzT50szkG85Ip+PR4bigebVhZc/ISnBriofbVOsQfMQDvLp27YBDbvQrdDVdJVJfFNuarlL6sWvZT2Ra1o/+8gPT/mP9aTty1N5yo0T3afpV6ELuaPmBKc0fCHqcXoOinwtadiDosXb0F2az411GnuEMGQgyCnRBj87bEScOWgRYwaQjCY7MzSQAnMMKDM6fqjKPjZCA4zQQC71Q4SUfJN+b0ptoearQ3vJ4lmLzkkcyW9fNT29dMT9N8+0tkWy25fEszW9dEekrpykt72m+v9OhJ9vcbAEsRAQgCgCdnyUAQFgEihtBWPHWIih+Ar5Cow1nUUHPdkO5Q1nes+b+zl0fLOTp9Te88avUpj9PSG768wPJ7W88nOpquiVNLAlT1pPflST5xpwizxUN9XVBkTcWdL1T0qFXUtV2zZCmcZwB6WT8WZPADsEwOoL+8ihxWGP5XHFbT4Ffnk4Kj3++O3WTyjhGWhJdwla8dvfKh1Mb/vCr1Ab0dSC2Nt2Xptj88uRMP9ow3w9ahmMr/Q88f9/+PKb9NuuaIumWlyISDHBjBmhfMv8KBgghplMvLJGFYlkxJ6ouD0Q5l/MVIZsb9OqrJhvGyZOvOO2oLjrppPFWiU+XWbCVDEYiYDKYox8cqChyABxA36CFI3pTZQkMVAGLA1dkTQ4USQKvywaFXE/r122YnWS32BklbyU6YdAHAQaAUMD+jQqfTqcIABg7ip6qYyBdhJDHAYaYWLvf6At/ydDRv7xo8IX3PBm+IPK5mNHSik6Wy6b5mKxrN/OS+v1sURiS4/MOPs8ToVhkDE0DNZ9HBybJCTyRJBFSyTTk0lkLnyuUF3Liaclo9jqn3Ts3z+dXFjQiDr946sph50z40Rc8HwY7yNxhUIujoArXXToiI+UyLT6nY6/Agy8vQJVieEcUarRRu/STTvpTa+dxL7y5YdBR0NR/qwkZz7HDJHCBQuygggVMKmwMSh9D8HxzPwjNA0qheUQCwASwMAAMB1rWRCkKgJ3xgS4buLhTHND3YeErNldv7/uMqm5kDQtYGReuRzHokgEr/XFRXEwCUACJA7oZ9AHC2MBqWsBuYaNWm+VD+NJ20ug7KhhbzSuxov+OrB48TuFCYJouALy+ig9sChNFdf+DSQcwDQANH06cC0RdxawJwDEAtN9YLKcpmtAfORVVFVCSQUZxRPG/gAG2JHZwFG+aVFiWSaU+N0zYa5pwCQYv95sWy9VWT/mVMus/i5jh/DPPbMSQ5igm4e9NS6nmFSrnABUFzuiLRnCgEBxAgOhbsKARCc3jmAKCsnGYAjvTpMDqY59CH/5eX0ygDyjgNn8FMMQGQrYIXp8bHHauB77mtm1bk8JqarMdOaS/KefxBoBghKxks2AtcwNoyB9LACx4SxkaTgiY4LCwQDTpY46RcXHoixU4OZxIyHziWrfNfM7BSHttRACbSSGiVEqA+9gCGbAVKNoCooh5uq/gcQE4k8e5wDxY1ByCB1ZJo/blgFF6wEnSRTdXaHNapFlCvvd8O5gNX/T+hb1DssMcEq9HqVOxo7iKF9NmIp2swIf7yVlBG0Ic4Cto4BA09rx9omKZMOF09T/V/KoxEWfFxfNcByI8+smy8OjI/0Ho7EZ34McLPNUX/i7oHh0JOc6cVR04b9Yg7wUzh3lGTT0udP7ME/znRkb4zqn/jues+u9SuM+bcpb/7CnneM+beoH33Icv9Jw78YeVP5j5E//3p4wpO3tyne+imXXWM6f91H5B4/Wsv7pOMFig/8wORx82WUFVk3Cwyn1g+ubxNCynH3obHqZgUUgoGAtAP2iUSkGVDufrQC7iJwWaWgBnwImCqO8sFPm9tGVfF5IuP1kRCICDswCDk8IemwtC5YPAQewQDlSA2+6EoMsBfrsVfA4LVAZdYDHFlZ82P1r8su+mpia9c93vViRaG37Jr35wqCe+3m0r7PqeTWi/3il21bvVnkV+PfZ6ABItYSa9IcymP6m0ZD+ttGQ+LWczH5SzqVXlTOb1MJN6OkRS00IkfrNT2nKhj2yuyrc+XJZcHTk31javPrr+uZbNbYsyX/Z/qPeZQ12Bo8k/FbKu9t2RHJ9bluHTa1mWicXiZqAnmrXu6Yq/3JPPwy8iq+23NC6tuWbKnwcdxK+YkRMumfEzOwn8LV9g96UL7s68WtWV06pjvOGO8uaQZM6oTlOkjFo+YQ7JJy3VfLroy/WqzmS+EEwQx6CutOTv0JnaXUVLzecp2f9Znq38OEcqP8J0fZ4tX18wK9/LMpWtPITf4UnFCp5ULY3mbG/lLDVvFtiK17K67zXNFv6TxBsvyho7gmFsOkYiBmOaJmPqFCgPWh8YMDHFd6DD/QbAlU7oh4H17QcN8WjdFREcPicAq4GFVYHoedCU7FYb4+yih78uku/Pzedjn1S51d7qIElWuOSusBLfHGT0Dp/WuctnL+5xW8SeMkdij8tR+MypCh/b966a/ei/4zexranAb3r2A/7DRYszGxbMTq594o5o22NX9LY+en7nqt+M6lz5yMh9K+d8Z9/KR76D+9/rWj3vwu7Wxit61zx2e/S9R2fG2h5/IbfhxVXJ9xb3/jv+DrVNSewOcg/YY/auzl37tqW7Ejt7unoXd+3dt7m3Jx7r6Ukq+/blaqMF6fjuLAzOFm012zjvsd+96YWhwy6fVz7qlscrTh0/OQyRyID75NS6WbW6brkv1pU4npisV5M1l5AvOqVsjpOlIqJAFFkwKQxN0ECVVNBEhKwauqoRC6OpiqQxLNEK6bRmGoaOy6WGrmiGiZPe+4HV0lhi6hQWAgbHEITVHWKMgoyn2ginW4ghKKTME2SsKmEcJsPaNGCsOhCLAYQx8RoIExjQCIsuGBQ8EyM947CFBV8LOQ7nzKwc2G1WcDrs4HI6wO1ygsdlg4DHAQ5NNCrdFiPo1LWgXdvishSf61o3H5dQD87Nte+9Ob2d70/s2d18e7yn5YEkvy6Szrw7KZfZNCmXaIkUYs0PFns2RQTq8+t+Y+Lg1PjwvApzeFZrQLU6rIz35LZXJDt2PtP+2cd/3L5x7Yydn26c0LHj01/H9+19Uc0l35CLudfT0d7F8WT8GVEovILa8LrNFVwq8JalhPibTt3InzLQBsnpnpTJ924Ju5Qcp3TxZRBNu0hvykZ6E06I9TpJNOok8U5EhwOi7Q6mZ7ed9O52Mj07g1z8M5vWud3PJbe4SXxrdUjbUu2RPw47hU+qPcZHNQFu46CgfWNt0PbBoJB9/ZCQe93QsL+tDxWBliqvffUJw2tbBodc744YWtH8X4Pcb1eXya9VuYWXPRB72g+xp4Jm9IkAxB4LmLHH/CQ51wfpOV6SnuMh6el+iE8PMLH6AMQn+Uh0op/E7seyewMkdo+PxO8IIHwQv80PsZsp0PZ6H8SuCzKxn/qZ2HgKtKkLkvhYHxMb4yfxiynQ34U+JnouBdqcGSCJM4Js4nQfJEZQBCB5UgiSx1P49OhgP6RqA5ZUTYiJHRPm0pVlTCzsMbIBl7on4DK6/U69y29XO/xWud3PSXv9rLDbz8o7fKa0z8fku3ze7C6fm/k8qNl2jtqzYs6SgfZhyf4/z0BJ7A4yx3+Yf3v3a4/fdupr864hS+Zf5W5eMD747sLx4VVPXjl81ZNXD1696JrhH7x487EfLb5txKYXbzl16+IbR25bfNPpm1/91WkfvfrQ6L+9/dtPBlqlbS1PFXavXXhD+3uNvuymecH8plnHFD+cXiVvmlEjbIgMEdbPGiysnz0ccZy4dtbxYtuME6W2aScKbdNPTrXUj5A2PnJKfPWUU3NrIyO7mx88tXPFr0+Pr3rwtK7ld5/RtfT2UZ1Lbh3VseSWszreuums9r9ef/aeN689b/cbPz1v91+uOb/99Wsv2PGnuvP3/OWGH2x6qe6H2/9y65gdf73rqj3LH/pZ73sNt/esbbize+2Me6NtDQ/EEanWyMRMa2RKbnVkCr86MiPdGpmRaonMSq2Z3phpbZiL+79Nr5n+BNotyLROX5RCZNZMfya9JvICBdouzqyJvJxsifxPuiXyGgXavJFsnf5WpiXydrp1+jsUqTWRVZmWhjYKtFmfap32YXL1tE2ZNdM2U6TW1H+WWFO/kyLzfkNHes3UztSqqd0YKUXjK6fE8i2RZK5tcibX9kgm2xLJfhUy7zbmKOir5g583cSoiu9561lhoP1Xsv9mGCiJ3TfDc8lLiYESA4eYgZLYHeIOOJTuS75LDHybGCiJ3bept0ttLTHwLWagJHbf4s4vNb3EwLeJgZLYfZt6u9TWg8NA6SpHJAMlsTsiu61U6RIDJQYGykBJ7AbKWMm+xECJgSOSgZLYHZHdVqp0iYEjkYFDW+eS2B1a/kveSwyUGPiGGCiJ3TdEdMlNiYESA4eWgZLYHVr+S95LDJQY+IYYOILF7htiqOSmxECJgaOCgZLYHRXdWGpEiYESA/+KgZLY/SuGSsdLDJQYOCoY+F8AAABOywskAAAAAklEQVT//8Ldr0UAAAAGSURBVAMAKKIK9T4gi6gAAAAASUVORK5CYII=

================================================================================
--- ফাইল পাথ (File Path): images/nagad.png [Binary Content - Base64 Encoded] ---
================================================================================

iVBORw0KGgoAAAANSUhEUgAAARMAAAC3CAMAAAAGjUrGAAABAlBMVEX////tHCT3lB3sAADtFB3vTVHsAAv3jgD97e785OX3jQD2igDsAAf3rK33trf609P3kxrsABLtDhn+9PX4mh32o6XtEST3kQ//+vr70KvsACX5w8TwV1v959XsCBX5ycrvQUb72trycHP82Lr6u4L3srP83cP+8OT6w5P4oUb1mZv3mzX7y6L4qlz5xcb0eB/xZmn0jY/uLjT1nJ75tXbzg4X6wI3zbyD2jB7wTSLuLSP95dL4plPzhojyenz5sGvuNzzxWCHvQCP4nj/zckn1kGr2j1/3oXP0gljxVzvyY0T5s2X4omHxVC72jVPuKR3yZDj1hzT3lTf6y7n1gB/yYyAXgxxfAAANiklEQVR4nO2cjX+iOBrHgSBY8AWoBVqtVq3a1r5o25m+O512b3fv9u52727m//9XLgkBQghKlRnHab6fz+5YRSU/nrc8CUqSQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBALB96Pvr/sMfjSGY/OI+8J2t97p1Le2v/P5rJ/RsWEpJmsoW4PZAQjR1nJi6+PI9BRF8a7p57pTGWhtVQ5R13Vya2E01hWMOYqeGzwDW05gr/EMvztDwwskUbwz8tSODVSZAaz1JL8vp6YSYT6gZ5pyhRXkfWnykZJEsV5hnpkAjiLvSZNDQ6ExhtI2XxIZvJfy5SgpiWIpknSl8TV5JxXKrqkw6LuS1H63mnTr0n5KEsXSYR7meg8or/uMvzV+ryVJnpXSRNFhhX+ZSsRIk611n/M3ZgBgCXbmpSVRUIXf4RnKT67JdgmAutQ3eJIo+idJKnEMBXTXfdrfkg5w7Ikk6TxFPPO4Dyd/HEOBKg5Nb3x2uLu/7gEUzwmQ27+MpEOOJpb5CAe8fXXJ85269GAolufphvm4O1r8PRtED0ryt2tplM45ij6GtX15xs7+iCYdaT/0Nk83H4frHkhxtDS5/Sv0j+tUgPWMU/j6E+CXJzI4l0YGfbSyu+6xFETJltu/jXXJT1drx9AfmhrXRrAmzYQmqJRRfgpbadmy8+srrEGO2GhifoQvM9M/ta1VojYbqEk+OxMwzzZ/EtTTZPX3Y8scSbrFjA5e8rJMGYmjAVD6sFPrdLcg9fPq0znHuDxj000FZhz373941lgaJq+4pUO/qcd9pDYAvWpYo/l+ZAycuIzta3NB5akGUzB0nWSEtTwoyXnoN2oFzDro+NHu4aNimoYB/xt/Oh36EqfKC9pQmwpqjDi/wWEY+8l6DVtJWM+r4HKAjh5e64buRTMiy9Nh/k3Pj/TrRV/7Q1NyZPcff0ADMeJCA2NASbpEEvDchIeODqEeaZtIS2J56x7VSqAOgI2KV+9MOqXtBFk/aa7Zdg0euX9mcmeHHMyNDrE+HLX6+6uFuwGfqDHjSu0Zh1cwgw9H+RVRvE/rHtZKzGB5+ifWQh9KlBfg9Ysn1G50nLqE2vi5FcENqA0GzXTdX5CZoPBhUsPySTABLfjIP+bOljPYbM+RJg50nX9iEzDpGt3oS0FfDTzBB/txZEWJRjcg8B9eP07ZeM/BZvIvbCaWIg0jY/Ae4YtV+CKowgd90wr1MMefjvrDfchD//TwGErDycObXdijaOL+Gw/LepT6kSZ4hRgGE4DyTT9wKc/wDofscPdPX01GFmximwtKOvKfQckFLX431ATvJNjRaEl085qqTPsPo0id0ZFHqxItLm8ocNiy+9c4GMthXJ5gM2kHjvOAJNH1o4SFPJiG6Z0dhSr1x0akyoZ7Di4/3P8orCY4SNYADq8jOFovPaEbmqirZpjHp0G3sa/oq3vO1mA6m/Sm58t/wurglrM7jjQJfcdA3eaW1kLHjD3FOOZ0WUmjxdJx81pCi+5WynOqB6UctIJVsx0ZVOy249gATImt1XK9P2ayuo0i15Ff/stqYo0lVNWr6As+6pZ5yn3zazQN1HV8xL7nsZ5z0FZzAHbgoee2Fi+U2Nhr4VQs1/upT1p9XaWFXOcuthOSi/EQa/jz903Py2jFj+gCT8c92GOd8RzeelAaDQowZVZJcKWIT/AtFKAJdp2/GlEQIdNiHGEnH9ARY/010xzpyZFljNGbzpick1OTHelDauGorW6tQ5M61uQizqFBHYv2VUiSg/7XNx+z355c9bDwllFfSqyot8AcyDhsDQyakSQOfgkW17IK6qEmthbgkGO0LFZfp61qtCZoL5JBnAilAHSEPkcSSXpMzgr14//50rRGH+HXsyHNKvukOvCjnS2gdV7eLjcnuN0JuoEm9k4VM5hhUZzeoBozGFB/NVeVBBexsSaKBwMCips6iglY8P547vv7zLzQMi/r4CTvt/uBJmirxiDcJ0dCK5x9XqK2uP0cPBvucKlViKtRlJv1/CNeDPb2WBNTkg7RlTeioDqen9pS7fpbF7Rneb+dtKuQufdCp+jFL0/i/YTRDpe0JtVLUAFgVtzWhmCFItIEaoGvvBm+/rBoUXzMzP9u92S1lffbKU0OSCgFHer1nrZQk5pTwe9sgw95v3URIKkJ9Bl05VFcCVi4Hn7Itpn2ZPky77fzNEm4Qas9X5NyKU5W2mUxO8jKrCZHOKC8ofuxyzaa9t6wNZTSZEJ8J3C8rdATwm1RfE0Gie3LTu5rMZdgM4l70whjLEwycMaD004+howmt+5ymuyEbgKmnQ9o1XXmxyeYoUmPqWi0QtwnWKZwv4aaKAauOXT+rSk89g2OJplxeat6clKNvYPSJN56awe7F2wb2wrRiqPJ9mVqTb+QvctEk8+xJg9oL5vOn97wGDGafJmjSfcAaDasz6IkQWki7bBlrOrgj4nTNSbSpFthC1w1maGXhWhyFw0JWcjQWEGTi2xNTiLvbxPPoDWBLzuhDwSP2hP0NF+T6nlqJiDLxcTYUJMv4ZDwfFh5gyaM7zS+ZsaTJ3oUto2mJQlNpO4EhhEYSuRqJ0jCOAdxNVGpfBMKDQoq3MpEk5toUGjy189oDfBgYmzjLksTdrcx6mkmNYF0m7UmnsPhNOSgQoerSSQEnBKRSaYzWUEHGlJc30eJR9FRO03JH2NPGU3QaT5zjiunbB2KktIkInAN5IR8TSJ7ey4PSBTupD5kSYJvpBIPXr8b5t8RwOx9g2Usv47tpbfCga6f1KQVxyGiSXeBJqAXZ6alNWAJFoPdu9s4yqLpX347sRK1fePGDcuuJJGZwDl/dCNhu5zQZBvE5h+UtYs0wd1iPLUvznXCqRcMKLGhoCibu6fJpB0cTngpkVxMx5kOqtMS2T+pklBANKlqgLyz/uxEL8zRRJsFb8OPC8nDmBNS98TOo7xpGxq7H9CV8c7QFEHp7hwEf5WfgrQcFu6BJlAhULoaVJ8uw6SN/CFbE6eEnwniSXHhJNyVRTuPNb9jkoTZi3Pj0udPQRwnsr8t2YnGFmqChFBp31Kz8w5+LqhHggZdgbfLhCX1C2Uoev4Nv8x+wMYLvn6cAwFt3z68pv5zLArR5IAtTMFAmqNJhXxa0Kwr8pZEMvF0P1NDM3KHE6Z7grJOoisUgV00bB/7oFWW/LjGIJqcsDfW4Vu5MzUJb/SuB0csKwCHqU2cJ46y+Zd7+5wIK1dqnCOx9GHO9YED5Ylv8CDP+2xVh0NEliZRUMXJSz1YVgAORGXGUPJ5j88E2C97lJsnwTE2UgvA8tOP7SLUqpkQBUzJsXxNokkVdv/8vb08kMSTMBTFzHUfDtO0D6KJWuIdGuQ3tRz9YcMRO4wmdI9IDXuJGZrE9Qg2rwLLE8hTOzSUOPUE27YW8ZEp6y+wmVQGvGODQKiCabfc7YUBoKoxmkh1GTgq2swP5HBNIkMTykOxJrwgtjSRW9OpB6bYhaKwN9s2yAD5R5Ph22Q1i649EvOdZu/ZlktPcbWRoQmVe9XCNYkWL927C0oUb5Eop6wkOMDK7Yz+3wnbFEOazNopTVKwmoQ1cHwEyuHF+k4c2RLeA91nbkw5ZCUJPCdzfGxSwUGxmTkvjmE0kbozoKkJDdD8pNC8I1G3DN/TuUfJ2mCBSO8LvXWD0JcZ/2tJUQCKF+UlNIFfvnMZ7BUiYBMs+GckYkNJhBSFvxEHcWqwqzqNezLU7GbXSaLPFmi3lCaQzhP1Nw4xRd8KHxXV7l1SFM+85qiya6U2DzdeiJnMc+tafIMlIAnbWVKTBDhLcCvFFehGVzBZpWBVzhK/Q+YPrznbYUl8XXS1/GkbAE2rADlcJ5eL0ERCdlJ0QJFmdqYo6N7Y8fXRLuT08MwzefepxJIsbGJs1XZ2BvGumWI0wU0gDUaYTpH3w8dzVDam4GiL9pKjfeT8jeSh4yxxrYrRJCgI26j0eesJzKEOaFF4A8+kcXvvhlHizXGuGE2kwtczMNT+Ovf+823KVLIluQgVCXZcv42CNInyvFadd9hbKVF99WRFO1cR5W4vfFdliRXsgjRB9+59A01i+8Om8jWXqTQu5MhK7GVm62pBmmyrJKsX+6Mj2xrd+nNfLhYrcvsSGUnUfn4bsrZQk1mw129BqNouAbttk5ZLcWwlNri47ssXZZ6tNG7v9txYkiX3w0zRLHn+9s3uAcgTvuvTDyfF/zTNVnL3AlTlJkuVRuPihVJEbj8vu8u93AILf3poAOy1/YpVmV5gCGS5u4DjbyTlaFgXd65LH6dxe2s5aaoLf8rMnxXbCngL/gHbOnfdvfvPN19ukRRInNsvN3f3e0lF8KrtKvzgv+4242x1cSHQUe7vZfiPy+iBGorFJsAfjxpw0qrMQ5N/6h/dwmy3Mn7okotKN3d+Ypoq/5cueYoc/PxGQrgCeVRRgVxwI+eHxr/i/MJyEgdcvidFMLUS0DJlcSqgV+j9IZtCeacEgJ3SBd3UOalt+B3EK+CfT/G9a5qN0VAra3L1Li0kSbnerF5NIVeDZvcHrzkFAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgK4v8KHAgHpmmjUAAAAABJRU5ErkJggg==

================================================================================
--- ফাইল পাথ (File Path): images/rocket.png [Binary Content - Base64 Encoded] ---
================================================================================

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

================================================================================
--- ফাইল পাথ (File Path): images/Screenshot_2025-10-19_211100-removebg-preview.png [Binary Content - Base64 Encoded] ---
================================================================================

iVBORw0KGgoAAAANSUhEUgAAASgAAACDCAYAAAA+q4aAAAAQAElEQVR4AexdiZN0VXU/580HHyB8gCxxAURZNZEIKEkUF0BFSgglYoQkbhQaQ4gLpYKyGD5QEEqDYhQlIoKFy4fRRFm0UHADShRDGZOqxOSvEKbfu/eck995r3umZ+/p6Z5e5vS837v33f3+7n2/Pve+7p6C4hUMBAPBwJgyEAI1pgMTzQoGggGiEKiYBcFAMDC2DIRAje3QjL5h0YJgYNQMhECNegSi/mAgGFiRgcLMngbs38YOuH69B9zdgW1AiNiK9EVEMBAMDJOB4smW/NvvW3IvcA/83wH+5clZ2fX7Ur4O/x1Votta2b7YSnYTcH2Z7Aq4H2xVdvFstrfkbGdUlZ0AIXsmsCcQgjbMEYuyg4FxYGCT2uBicioT/SnwZ6jzFOC1xHQmG70B/vOTyNtyknfmLO8FLk1ZroF7Qxa5WZLcUVb5O0nyg7Ot/HirzP9elvLjspKvQcg+UYm9B4J1NnAc4FbabigzjmAgGAgGemKgMC6ofxDy8u5GvEOJnyHGR2ejk5PYeRCyD1WVfPr3s9mtsp89Verjs6U9MFvZlyFel5fZzi3NjoVw7dlTSyNRMBAMbDkG3ILaQKfXzs4M24xoHwjR4Wr6ClV9exa9NmfdlUt9uEr2cwjZ7Vgmvj8le6WZ7buBBkXWYCAYmCIG1laYNTq7XutLjGgeun8SPb5SfVtS/VQyfQj7W7/Bnte3WmIfnE32KgiWLw033M41ujFZ0dHaYGCLMLDpNz4zE3MHM6AZTTAmCBEplEtEDxWRcyTLDaryw9msLlg/gHB9Angd0u2NTHEEA8HAFmAA6rDBXkJcsBHlm1E9AdJEc4BQUcFExQyKmN8LU1hZDlErctZnZ9HTsuqHxOy+WaHfzGa7CxbWu1pmR0Owtm+wB5E9GAgGxpSBjQvUOjtmLj5KpA6h2nKCyCwqpWlWUTSuxzuwf0WS5XBYWefnrF+QUn+dMv0Ee1c3WrLXIk1YV4uYjMutxsB09bdRgA30SZloPYAmLUgP04kWoN0W5mb5566DyJvqQHKoHMQIIqd7ichJkuUDlej3U2VP5Gy3An+O+BCrNpfhBAOTykBzx29i631V142VqnZrybFSvIczM0TKsOluhCUgJZHnVUkuTFn+FU8HHwNuglC9DHC18yyBYCAYmCAGNixQ2DmCbWN9gxhrvm60yWNmYub2VbfjTW5gjNphaVkXFC3BXjvESo+tsrz3qVJ/Olvag7OVXQih2tFdUviDgWBgvBnwO328W7hG64yYFgCaZrVwuXgVpMSszC9XsltnM/1yVuy6WbPD1ii2z+jIFgwEA4NkYOIFao6MjhU2FzDvgeVE2KtyHCVZL7NMvy3F7khmpyEuvn4zT1X4goGxYmB6BGoFWplhUrXjIEbYs1IXqr1T1rdgj+qBVrYfYFP9rxG3VztZOMFAMDAmDEy+QK1iOTnHEB53sNDjOXiYb8CLiIvVq0qRO8tMj4vY5Yjbr84Qp2BgsAxEaX0wMPkCtUanITj1Z606yZiZ/PNVzG3Bwqa6p8mSj2lluRZW1eMp2U6EHUTxCgaCgZEyMPUCNc+ud3UpjIt6k739yXV/+vfcSuXKUuhx7FO5RRWfp5onMXzBwKYy4Hfspla42ZV1rKVOvbCMFlhUfk2wopi5XgJ6OlOinOSQlPK1EK6Hstl5SLe7xwWCgWBg8xiYeoGCsDibKwJaRA6CSDlqi4rnk1eVnJgr/VrKdD82089BeV2x8+nCFwwEA4NnYOoFqj/K2rQY46mfAeqb6aeI2i5JdDtE6uj+yo1cwUAwsB4G2nfierKMW1q3f5ZDb+0sIEKOxak7lpRh6SdGlLHWqyQXSeWtVbKHk9hVEKp9FueL62AgGBgcA1MgUIMjY2lJRb0vxdys6uq9KQiViByQk15dVvoQln3nL80XIZPEQLR1fBkoxrdpQ26ZQXQcDPPIsUJ1SkxuTVExQw73u0UlyAur6oRkdleZ7TZYU09foYgIDgaCgT4Z2LoC1SNhEJ65p37MTMxMLlRN9sKf9lEWeUcr208gVOc24XEOBoKBQTCw9QQKlg9Mojnu3HhyzAWs5Onk67i1UHGd2pd+WPb9oajuglB9DqIW//ihZiZOwcDGGBi5QG2s+cPP7Z+jcnRqMqwI52FUbNvWWFUQLogU5Zz/FpbUj7A39fpOnnCDgWCgPwamQKC8C8thBULcXOoCdKXboFqSCdZQs8Rr5+HCyFH/jhVSKzbNlYy8HESQI6ueUIp868lSrkL++LUEilcw0B8Dfmf3lzNy1Qwozlp/yBOeuaNe+m0nsqsrpVsgUvF1mTluwhMM9M5ACFTvXK2R0ql0tJO5SQXkLBdgX+o+iNRR7ZhwemUg0m15BrruqC3PxUAIgBAtKEfF/JPoJyehe7EvdcaCyLgIBoKBVRkIgVqVnrUjC1hJjvmUBfasuA2rg/0pX8p6ZDK7u6rsb+rAOAUDwcCaDIRArUnRRhIUzRM+FOGWlWTdS1RvKUvZiesZBMcRDAQDqzBQrBgXEetjAJZU/Siv7bYdlOEUN4AoNf8iy+jK2USfwXX8hAsYiiMYWIkBv3NWiovwgTPgyz/D8g9LP7OLWok+D5GKjyEMnOcocFoYCIEa8kjOW1JUL/eYfWVXYOOc/CdcLiiT+j8X9UCKVzAQDCxkIARqIR+bfmVqF2ED/QZYUvWHpza9AX1VGJmCgc1hIARqozwzlmvLYVG5HUtqsZvxiC+pXVIpXbEoS1wGA1uegRCoUU8BKBasJ8pZrm6JXTzq5kT9wcA4MRACteHRaL7s0m8xzM3KDiLFkuXGMlv8ZEu/ZEa+cWBgoG0IgRoonestrCDmRqA8J0RqD1H93GyyV/p1IBjY6gwUW52AwfW/Y0mt7ior1UDFTUojo3mRUtWDzPTOqrIXIUkcwcCWZiAEasTDD0Fqfy6qESnsmRPCDoVs3WVmh424eVF9MDBSBkKgNky/U9g7CiuoBur1XFRsI+MZoCBzS6qAH24Sff6TLbkbIrWeX+dEqXEEA9PDQH2PTE93Jr0nneFwt8ZLKqE7IVJ7TXrPov3BQD8M+F3QT77IMygGsCdFjhXKy1nPaiW6FSK1fYUkERwMTC0DIVBjPrTYj/I9qb/Mma6HSM2MeXOjeWPMwCQ2LQRqxKNWGGFParVGYG/KjJLa+yqlj6yWMuKCgWljIARqzEeUmdHCwq0okmxXi9hFCIgjGNgSDIRAjekwG3TJ0d08LPG4UvtUme287vDwBwPTykAI1CaN7CCqgUDBitLtonpzMnv5IMqMMoKBcWYgBGqcR8fbVjC5JWU4uUB5EAIOlEy3lGbPr6/jFAxMKQMhUBMysMxY87X//54LlZq+QLN9Fv74n3sTMobRzPUzEAK1fs42JwcsJlhKRHjKx9RYUdS2phSBokZZ5NRK6HMQqfiM1OaMynBqiVJXZCAEakVqxiPCIFCOxa2BKJGHi+pbykzX4TrGcjFJcT3xDMSkHvMhdBFa2EQfsoKYuQ6GMJGovL+V6fI6IE7BwBQxUExRX6a2K0tFqukqM0QKS8FapCTvbFX2901MnIOB6WAgBGrMx9E1yEEQIkfzG1JESgUZ9qSUjLAdheWekVj9i5x/MeZdiuYFAz0zEALVM1WjSeji5Fi2dmuGj5mJXbDM/DNS/oucr6J4BQNTwEAzw6egI5PbBR8Cx6IesBEBBgvJ4X6Hp+yAsfYzt6wgTtT+HSkVO8BMv1SavYDiFQxMOAM+1ye8C9H8eQaw7DMjiNTzNNuXzezg+bjwrZ+ByDFqBkKgRj0CA6ofYlSX5AaVwuoSkZOeSvZVhMcHOWtm4jSJDIRATeKo9dBmCBOZymuS0Bfh36OHLJEkGBg7BkKgxm5INtYgZmyYO3xfCkUlkfNbop+BSO2GyziCgYliYIwFaqJ4HFljmXnlurHeU1Xfk3pnlXUnRGqVxCsXEzHBwKgYCIEaFfMDqpd5XnMgQCjVh9QBLw5mJg/PapeVSu+jeAUDE8TA/EyeoEZHU5cy4CLkoe52o+DmZ8wbS0qvy9nO9nSBYGASGAiBmoRRWqWNLkYezczE3I2Z+tqFibDUY+xJwb+9FPlsVdlJNNmvaP0WYSAEaqoHetHwQqjQ3UOE7Z9nzQ6HP45gYKwZWDSDx7qt0bjlGHDRcSyK86AGBQwoB8Gl+nt7avRCEroN1tf+i7LFZTAwVgyEQI3VcAy/MRAlwlIPsFNaQjfjevfh1xo1BAP9MdCPQPVXU+QaLgONuUS1meT+JbX5UM/DkMbE/io+frCEqAgYIwZ8xo5Rc6Ipw2KAmeeKhtVUf/TALSlTvTTnfMlcZHiCgTFiIARqjAZj2E1h5vrJXnc9IoLlnt4AkXpnd3j4g4FxYCAEahxGYZPbwMx1jVjlwZJiEqVCjW/OZhv+sbu64DgFAwNiIARqQESOrBg28t+JWgJa+Oos6xaG4unezAwlKFUr5e1lJV9MZqcsTBNXwcDoGAiBGh33Y1GzEkSKZ4ibH7zbNyW6vTL747FoXDRiyzMQArXFp4D/Kue2oqj3ptzKEpXDqkp3tcyO2OLURPcHzUAf5RV95IksU8QAc7Mf1emSixRwFGX7BtxndcLDDQZGwUAI1ChYH7M6IUTYLLe6VcyNYInqibNJvom4/eqIOAUDI2AgBGoEpI9jlRCiulnMPL/cE31ZFroDcU+rI+MUDGwyAyFQm0z4yKpbo2LGRjlR13QwrnOklM+qst0OkdqzDohTMLCJDHTNyE2sNaoaWwYgRPPLPQiWf5BTspwrQp9F3PaxbXg0bCoZCIGaymHdSKd8SjiaMnhmGwkZVSlfkIQ+CZHa1sTEORgYPgPzM3H4dUUNk8oAlnsQJlLRv8uZroI/5s2kjuWy7R7fwJho4zs2I26ZTw0HETOTElNWo6R2ZZXpoxCpZpOK4hUMDI+BZgYOr/woeUoYYGaCKFG9J6V2VVa6FNchUlMyvuPajRCocR2ZEbcLqzpyEDbKHcxMzFy3SlUpZbvORaoOiFMwMCQGQqCGRGzvxY5/SuZGmJi5FilYTlSLlOh1IvY+XPP49yJaOIkMhEBN4qhtcpshQKixwBLPdaiASM3U1yrYk0rpH3POVyCNByI8jo0wAB4Z2A3YDuwF7A3sBxwIHAwcBBwA7At4nKfxtFP5dLXYCJmRd+swgJth2c5miBSwM2f9GNLE56SWZWn5QPDl4nIY3NPF7BLw+Pks9O2U6YEq2c/LSn/VKuU/gf8Bfgf8L/C7shT3O/6rVaYnyjI9Upb5wTLlu3OWm0VQltmZZnYssA8wsW8eIVDLz50IbTPg+1ArA9OnmCEhplL00lbSL+BmiK/FtLnrOOBkBti3MntxzvbWVrIby9LubSV64smW/Ddw/2xLPtmq5N1lkrOrLK9IoidmtWOh/4cCBwL7AnsDO7LRfnA97BCx4shsxfHZ+GQI2xtbyS6erVBWS76Lcv9jtrT/Qz0Pl9m+VGW7JcHZowAACjhJREFUoDR7vplNzLcCMMM6NIYbDKyfgVq8IFC+o27GbyuFdsX/3CMsh21HSnYKcFVV0T0Qid/kyh4tM30FIvWBpHZGznqkcbEdAH3FMDAjRC5kJyWhC5LSlyTTr0uln81muxV4K8TqOesf9c3LEQK1eVxPZU3c9R0+3ziXrGdQtvtztjdMZYdX6BRu9D3dQkrJPliW+r3Zyn4LEfpRJXp1UjldxA7Fw88ZpKtLMGznOeqLIZ68Ph+XxjVCO7ajjSdgfC7MWb7SyvbbVtb70XYXq32G2JS+ig6B6ou2yNRhwCd+44cFYFY/3ZOsx4jSN5KYb55P7f/dQ9/3qCo7MSX5aJXsIa30kSxyg6i8XkQOAdySaujBmZmJeR5FMfzbj7mpD9UvcxSUkzwtZzk9J/1KmfUxjNk1ZvaMZRKPJGj4DI2kWwOpNArpgQFTblIVcLEfRdQIVRLZLYleg03fr2LCP69JNPln9GU7rI3jS7FLW9l+mEweqdT+AX09KattE6P6U/ednhqDjxoebqSIh3iTYu3l6KQbletWXNMmI7T/mJTtCizTfwkrayf6OnKhCoEa1cyYpnp9lqM/zFxbCNQWKcnqS4o3wbq4J2c7BxOekWwiD7T9sErsIojSvTnpIynl63POLzWl3YC5PjFzzYFbR465iC4PkiBNV8AIvUWxDW1hWHpMCqVyqw9W1bOz6JVlpQ+L2IfR95E9+AiBGuHkmIaq/WbzftQ3KawDZqbmxoTlgCVfxsZLVjs2i30TT5luwmQ/gCbkhbbuB2F9MzaTv45N7l/D/08qdqqobce9TEZM8xYS+stLAblCqq4zE4GiGpuwwqO1XooEhn1EJpeCpv1KRlKPnT0XFtXHKyxfYVG9jkbw8laNoNqocloY8Jut0xfM6Y4XNyADM3hnNrwzq2NGRN+Dyf4AbvRzcfOP7d4U2nZ4Ers8q/24FPm65PxmEXm6QmwVN693soDl4XB/N5DX+9oFLO2gAsgKLmgBuvMNy8/s49BguTp8zBwex1RgzDytf2yqIH/BSoQVrC/GG9B3Jdl16N+mWlNNK7wlgWCgDwY6k7uT1S0LR73qw75UgRuZ8Q6NexR7HEpJ9EVYKu3C4/a78a58Oib8tk7eUbpox94525llJbe1Snk0VfnaVMlxuDGhKvOWEpHfMkVtYbiV4f1aDIMoWMeaQnIDELSke4u5W5JgAAHoF0TRaqxWnDKRgwyeuYRoOMbP+5ckbytzvqxVyYM521lzSYbsQQuGXEMUHwwsYsBvGlU7Kxvdk4TuhFC9BmG7LUo29Euvs2qewu1MSX+SJX8X7XoHwv8AICEbehvGsoIFIuUt7MgExMv4JaK2K4l9BBy5qeUJhoZOzUOrIAre2gz4XG/Qvb+hsEAAkRnJeh4m/Perir5XZXs7Jv2OYTKG8v17a0eL2HvE6D5R+XnKemUWPR5hWJoZ2gZrguqbEU1p2g3PgqNApxwLArsukAu2ls2hK2qsvAU0uBudxqF71A1FTwQBjiS6vUr0sVapt4DPPTp5huFOpEANg4goczgMYALPFczMxMz1tYcrWb3sExGGOLxWxb6Mif/ThL0OwJd//gXZDS0BUY9/OPJAL69MBkvJ7isrfaxK8umqzKchvv39QSYlJkP7mJmYmXyz35im+8XWU/+YGyLAV82TqmLs6MIs5B8j2aunQvpIFALVB2mRpYsBn+DLoSuJexWnGpjnhr0pBzMu8M6sgBD7hHccVwldlpTun63sCSwB7yvFPl5me1Nl9uKW2RG4SZ4JPB3wb/TvaLv7w30G4o9Euj9B+nOS2BWzmb6NJ3CPJ7X7Mx6dV6KnJNEdAOqy5mZD3d4GKmYgULgl4M750e5lj06fF0UiN3qzKBCXkD7UYkuAqJEedTfIiGpPl0sLX7VQY9yIYRs60EsPq7K+scp2F7gfyvf7nM+FLYmrYGBIDDAzMc/DsHlOmOwMeJWGGe/vzA4RxXKLngVL59Wpkg/nrN+E+wtJ+vhspb+aTfqLVrZHIT4/c8xW9thssiek1CdSqY8i/beqpNdolrNE5FAvEzeRV0PMTG4dOQg3mgNVU+fl6TrohK3kTv4NVL9trNS9JeHKTZCh48yMMcI4iZ6dEt0Gzga+j4hqmgrjHAwMkoHOtFfGBAYIMN92NlvwRAlz3N+/iTDx8f4NP96hXTTwbu2ioYhQhAoep2GvCktB3ZFVn5lFjkg5H5tVXgj8EeKPENWDxXQv+KkDz+vldINQdgd1OOogeAx3Xwe0xssNjk4Sv4k66IR1XE/nINhqy6OTcoQuGsgGprvQaY3C0wBi5Dzh2g/QBcqYmBnjSSQq56VM13vcIOG8DrK8KCsY6IkBvNtiYrskESY51S/M9drvH2BkZlg5jgLuNqBAXHNDMDMRdUBzL2au07ll1A1mT0tzr07d5nfZXGjj8aSO5mr1M+7r1RNMSuwyPHSazryYuyam0/cCy2EXsKxGqnaJ4OFDk2Iw52IwxUQpwcBCBnxi1cBaoFgJyGLU/JHP+DbqEDOf8LWINYLiN0pdInIVxFgeOoiK+tpdw422Ejx+KZDVj3a97I+z2n4PXg2oihyrpfE4T9MAliEvhacZJWyZNnlYp01s1mbYXaMZ8INeIMwwZEaCeE/vSGJUlvYJ4NxO/o26ProbLSPyBwPBwBZlQImxeGUivAkZZEuZ9jCym1Kylw6CksEK1CBaFGUEA8HAxDHQWQm6tQur6tlY8d0I/74b7UgI1EYZjPzBQDCwgAHDmhbi9NKUdOeCiD4uQqD6IC2yBAPBwCIG2IjwpJbwgjhh/1BJ1N6dkp2GoL6PEKi+qYuM62MgUk87A8zYi+rqpBntDvh39nbrCl6XNwRqXXRF4mAgGOhmgE2xNW7E3IgTM9d+RagioaiemhK9nfp8hUD1SVxkCwaCgYUMMPPCABcpVVKzi7Hs239RZE+XIVA90RSJgoFgYDkGmBtRggA1n1nDJfbI68+INS4TnuodV2X6yHL522ErOiFQK1ITEcFAMLBxBopauMjoXRCxE9dbXgjUehmL9MFAMNDFgO80ObqC3OvmE1x3HFl1R6l0IYLWdYRArYuuSBwMBAM9M+DKhMQGF9YTmZr/Z5+jEdTzEQLVM1VTmzA6FgwMjAGl5qsvir0oB0GcvHAXKFU9OCud59e9IgSqV6YiXTAQDPTFADMT8wwsKCIVO9vMDuq1oBCoXpmKdMFAMLACA4ZwBZY/mLmOgDARrKgTROjVdUAPpxCoHkiKJMHAVmWgt343AtSkdbFqfH629iVzk8avVen1EKuefse8UGIsE5kEa0UHFVz/fAJ23eF6FStBEeGAE0cwEAxsUQbcxumAqPG1VckZYSWIETQGF7W2EGXSkxPRMQhZ8yhUDQXMp3OF8ytmJmZ2byAYCAaCgQEw4PKFYoyfM6N0JoRrzf9SXOSca4FaTouWC0PxcQQDwUAw0BMDzAuNHIgS9MawYqOjUMCxwKrH/wMAAP//+bOAuAAAAAZJREFUAwBIabqugIAjzgAAAABJRU5ErkJggg==

================================================================================
--- ফাইল পাথ (File Path): images/Screenshot_2025-10-19_214428-removebg-preview.png [Binary Content - Base64 Encoded] ---
================================================================================

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

================================================================================
--- ফাইল পাথ (File Path): images/upay.png [Binary Content - Base64 Encoded] ---
================================================================================

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

================================================================================
--- ফাইল পাথ (File Path): js/main.js [Text Content] ---
================================================================================

document.addEventListener('DOMContentLoaded', function() {
    
    // --- সাইডবার টগল করার কোড ---
    const menuIcon = document.getElementById('menu-icon');
    const sidebar = document.getElementById('sidebar');
    const mainContent = document.querySelector('.main-content');

    if (menuIcon) {
        menuIcon.addEventListener('click', function() {
            sidebar.classList.toggle('open');
            mainContent.classList.toggle('shifted');
        });
    }

    
    // --- Modal (পপআপ) নিয়ন্ত্রণ করার কোড ---
    
    // প্রয়োজনীয় এলিমেন্টগুলো সিলেক্ট করা
    const modal = document.getElementById('gatewayModal');
    const openBtn = document.getElementById('openModalBtn');
    const closeBtn = document.querySelector('.modal .close-button');
    const cancelBtn = document.querySelector('.modal .cancel-btn');

    // "+ New gateway" বাটনে ক্লিক করলে Modal খুলবে
    if (openBtn) {
        openBtn.onclick = function() {
            if (modal) {
                modal.style.display = 'block';
            }
        }
    }

    // Close (x) বাটনে ক্লিক করলে Modal বন্ধ হবে
    if (closeBtn) {
        closeBtn.onclick = function() {
            if (modal) {
                modal.style.display = 'none';
            }
        }
    }

    // "Cancel" বাটনে ক্লিক করলে Modal বন্ধ হবে
    if (cancelBtn) {
        cancelBtn.onclick = function() {
            if (modal) {
                modal.style.display = 'none';
            }
        }
    }

    // Modal এর বাইরে ক্লিক করলে Modal বন্ধ হবে
    window.onclick = function(event) {
        if (event.target == modal) {
            modal.style.display = 'none';
        }
    }

    // ★★★ নতুন যুক্ত কোড: Payment Link Copy Functionality ★★★
    
    // টোস্ট নোটিফিকেশনের জন্য একটি div তৈরি করা
    const toast = document.createElement('div');
    toast.id = 'toast-notification';
    document.body.appendChild(toast);

    function showToast(message, isSuccess = true) {
        toast.textContent = message;
        toast.className = isSuccess ? 'show success' : 'show error';
        setTimeout(() => {
            toast.className = toast.className.replace('show', '');
        }, 3000);
    }

    document.querySelectorAll('.action-copy').forEach(button => {
        button.addEventListener('click', function(e) {
            e.preventDefault();
            const linkId = this.dataset.id;
            const originalHtml = this.innerHTML;
            this.innerHTML = 'Copying...';
            this.disabled = true;

            fetch('get_payment_link.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                },
                body: 'id=' + encodeURIComponent(linkId)
            })
            .then(response => response.json())
            .then(data => {
                if (data.success && data.url) {
                    navigator.clipboard.writeText(data.url).then(() => {
                        showToast('Copied successfully!');
                    }).catch(() => {
                        showToast('Failed to copy link.', false);
                    });
                } else {
                    showToast('Could not generate link.', false);
                }
            })
            .catch(() => {
                showToast('An error occurred.', false);
            })
            .finally(() => {
                this.innerHTML = originalHtml;
                this.disabled = false;
            });
        });
    });
});

================================================================================
--- ফাইল পাথ (File Path): paymentlink/default.php [Text Content] ---
================================================================================

<?php
// dashboard_project/paymentlink/default.php

require '../db_connect.php';

// URL থেকে ব্যবহারকারীর আইডি নেওয়া হচ্ছে। এটি ছাড়া সিস্টেম বুঝবে না কার গেটওয়ে ব্যবহার করতে হবে।
$user_id = $_GET['account'] ?? null;
if (!$user_id) {
    die("Invalid or incomplete payment link. Account identifier is missing.");
}

// ব্যবহারকারীর অস্তিত্ব যাচাই করা
$stmt_user = $pdo->prepare("SELECT id FROM users WHERE id = ?");
$stmt_user->execute([$user_id]);
if ($stmt_user->rowCount() === 0) {
    die("The account associated with this link does not exist.");
}

// ফর্ম সাবমিট হলে এই অংশটি কাজ করবে
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $customer_name = trim($_POST['full_name']);
    $customer_email = trim($_POST['email']);
    $customer_mobile = trim($_POST['mobile_number']);
    $amount = (float)($_POST['amount']);
    $reference = trim($_POST['reference']) ?: null;

    // প্রয়োজনীয় তথ্য যাচাই
    if (empty($customer_name) || empty($customer_email) || empty($customer_mobile) || $amount <= 0) {
        die("Please fill all required fields correctly.");
    }

    try {
        // নতুন ট্রানজেকশন আইডি তৈরি
        $transaction_unique_id = sha1(uniqid(rand(), true) . microtime());
        
        // বেস URL তৈরি করা
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
        $host = $_SERVER['HTTP_HOST'];
        $directory = rtrim(dirname(dirname($_SERVER['PHP_SELF'])), '/\\');
        $base_project_url = "{$protocol}://{$host}{$directory}";
        
        $cancel_url = "{$base_project_url}/checkout.php?trx_id={$transaction_unique_id}&status=cancelled";

        $sql = "INSERT INTO transactions (user_id, unique_id, amount, customer_name, customer_email, success_url, cancel_url, meta_data) 
                VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
        
        $stmt_insert = $pdo->prepare($sql);
        $stmt_insert->execute([
            $user_id,
            $transaction_unique_id,
            $amount,
            $customer_name,
            $customer_email,
            $base_project_url . '/index.php', // সফল হলে ড্যাশবোর্ডে পাঠানো যেতে পারে
            $cancel_url,
            json_encode([
                'source' => 'default_payment_link',
                'reference' => $reference,
                'customer_mobile' => $customer_mobile // মোবাইল নম্বর meta_data তে সেভ করা হচ্ছে
            ])
        ]);

        // চেকআউট পেজে রিডাইরেক্ট করা হচ্ছে
        header("Location: ../checkout.php?trx_id=" . $transaction_unique_id);
        exit();

    } catch (PDOException $e) {
        die("Could not initiate payment session: " . $e->getMessage());
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Complete Your Payment</title>
    <?php
        // ডাইনামিকভাবে বেস URL তৈরি করা হচ্ছে, যাতে CSS সঠিকভাবে লোড হয়
        $base_project_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]" . rtrim(dirname(dirname($_SERVER['PHP_SELF'])), '/\\');
    ?>
    <link rel="stylesheet" href="<?php echo $base_project_url; ?>/css/style.css?v=<?php echo filemtime('../css/style.css'); ?>">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body class="default-link-body">
    <div class="default-link-container">
        <!-- বাম পাশের প্যানেল -->
        <div class="left-panel">
            <img src="<?php echo $base_project_url; ?>/images/logo.png" alt="Company Logo" class="company-logo">
            <img src="<?php echo $base_project_url; ?>/images/customer-attraction.png" alt="Illustration" class="illustration-img">
        </div>

        <!-- ডান পাশের প্যানেল (ফর্ম) -->
        <div class="right-panel">
            <form action="default.php?account=<?php echo htmlspecialchars($user_id); ?>" method="POST">
                <div class="form-input-group">
                    <i class="fas fa-user"></i>
                    <input type="text" name="full_name" placeholder="Full Name" required>
                </div>
                <div class="form-input-group">
                    <i class="fas fa-envelope"></i>
                    <input type="email" name="email" placeholder="Email" required>
                </div>
                <div class="form-input-group">
                    <i class="fas fa-phone"></i>
                    <input type="text" name="mobile_number" placeholder="Mobile Number" required>
                </div>
                <div class="form-input-group">
                    <i class="fas fa-dollar-sign"></i>
                    <input type="number" step="0.01" name="amount" placeholder="Amount" required>
                </div>
                <div class="form-input-group">
                    <i class="fas fa-paper-plane"></i>
                    <input type="text" name="reference" placeholder="Reference (optional)">
                </div>
                <button type="submit" class="btn btn-primary submit-btn">Submit</button>
            </form>
        </div>
    </div>
</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): paymentlink/pay.php [Text Content] ---
================================================================================

<?php
require '../db_connect.php';

// .htaccess থেকে আসা লিঙ্ক আইডি
$unique_link_id = $_GET['link_id'] ?? null;
if (!$unique_link_id) {
    die("Payment Link ID is missing.");
}

// লিঙ্কের তথ্য ডেটাবেস থেকে আনা
$stmt_link = $pdo->prepare("SELECT * FROM payment_links WHERE unique_link_id = ?");
$stmt_link->execute([$unique_link_id]);
$link_details = $stmt_link->fetch(PDO::FETCH_ASSOC);

// লিঙ্কটি বৈধ কিনা তা পরীক্ষা করা
if (!$link_details || $link_details['status'] == 0) {
    http_response_code(404);
    die("This payment link is invalid or inactive.");
}
if (!$link_details['is_default'] && $link_details['quantity'] <= 0) {
    http_response_code(404);
    die("This payment link is no longer available.");
}

$user_id = $link_details['user_id'];

// ফর্ম সাবমিট হলে এই অংশটি কাজ করবে
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ফর্ম থেকে ডেটা গ্রহণ করা
    $customer_name = trim($_POST['full_name']);
    $customer_email = trim($_POST['email']);
    $customer_mobile = trim($_POST['mobile_number']);
    
    // লিঙ্কের ধরন অনুযায়ী অ্যামাউন্ট এবং রেফারেন্স সেট করা
    if ($link_details['is_default']) {
        $amount = (float)$_POST['amount'];
        $reference = trim($_POST['reference']) ?: null;
    } else {
        $amount = $link_details['amount']; // পরিমাণ নির্দিষ্ট
        $reference = null;
    }
    
    if (empty($customer_name) || empty($customer_email) || empty($customer_mobile) || $amount <= 0) {
        die("Please fill all required fields correctly.");
    }

    try {
        // মূল transactions টেবিলে পেমেন্ট সেশন তৈরি করা
        $transaction_unique_id = sha1(uniqid(rand(), true) . microtime());
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
        $host = $_SERVER['HTTP_HOST'];
        $directory = rtrim(dirname(dirname($_SERVER['PHP_SELF'])), '/\\');
        $base_project_url = "{$protocol}://{$host}{$directory}";
        $cancel_url = "{$base_project_url}/checkout?trx_id={$transaction_unique_id}&status=cancelled";

        $meta_data = [
            'source' => $link_details['is_default'] ? 'default_payment_link' : 'payment_link',
            'payment_link_id' => $link_details['id'],
            'customer_mobile' => $customer_mobile,
            'reference' => $reference // ডিফল্ট লিঙ্কের রেফারেন্স
        ];

        $sql_trans = "INSERT INTO transactions (user_id, unique_id, amount, customer_name, customer_email, success_url, cancel_url, meta_data) 
                      VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
        $stmt_trans = $pdo->prepare($sql_trans);
        $stmt_trans->execute([$user_id, $transaction_unique_id, $amount, $customer_name, $customer_email, $base_project_url, $cancel_url, json_encode($meta_data)]);
        
        header("Location: {$base_project_url}/checkout?trx_id=" . $transaction_unique_id);
        exit();

    } catch (PDOException $e) {
        die("Could not initiate payment session: " . $e->getMessage());
    }
}

// === HTML View পার্ট ===
$base_project_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]" . rtrim(dirname(dirname($_SERVER['PHP_SELF'])), '/\\');
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Complete Your Payment</title>
    <link rel="stylesheet" href="<?php echo $base_project_url; ?>/css/style.css?v=<?php echo filemtime('../css/style.css'); ?>">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<?php if ($link_details['is_default']): ?>
<!-- ডিফল্ট লিঙ্কের জন্য ভিউ -->
<body class="default-link-body">
    <div class="default-link-container">
        <div class="left-panel">
            <img src="<?php echo $base_project_url; ?>/images/logo.png" alt="Company Logo" class="company-logo">
            <img src="<?php echo $base_project_url; ?>/images/customer-attraction.png" alt="Illustration" class="illustration-img">
        </div>
        <div class="right-panel">
            <form action="" method="POST">
                <div class="form-input-group"><i class="fas fa-user"></i><input type="text" name="full_name" placeholder="Full Name" required></div>
                <div class="form-input-group"><i class="fas fa-envelope"></i><input type="email" name="email" placeholder="Email" required></div>
                <div class="form-input-group"><i class="fas fa-phone"></i><input type="text" name="mobile_number" placeholder="Mobile Number" required></div>
                <div class="form-input-group"><i class="fas fa-dollar-sign"></i><input type="number" step="0.01" name="amount" placeholder="Amount" required></div>
                <div class="form-input-group"><i class="fas fa-paper-plane"></i><input type="text" name="reference" placeholder="Reference (optional)"></div>
                <button type="submit" class="btn btn-primary submit-btn">Submit</button>
            </form>
        </div>
    </div>
</body>
<?php else: ?>
<!-- সাধারণ লিঙ্কের জন্য ভিউ -->
<body class="cancellation-body">
    <div class="link-form-container">
        <div class="link-form-header">
             <div class="product-image-wrapper"><img src="<?php echo $base_project_url; ?>/images/product-placeholder.png" alt="Product Image"></div>
            <h2><?php echo htmlspecialchars($link_details['product_name']); ?></h2>
            <p><?php echo htmlspecialchars($link_details['product_description']); ?></p>
        </div>
        <form action="" method="POST" class="link-form-body">
            <div class="form-row">
                <div class="form-group half-width"><label for="full_name">Full Name <span class="required-star">*</span></label><input type="text" id="full_name" name="full_name" required></div>
                <div class="form-group half-width"><label for="email">Email <span class="required-star">*</span></label><input type="email" id="email" name="email" required></div>
            </div>
            <div class="form-group"><label for="mobile">Mobile Number <span class="required-star">*</span></label><input type="text" id="mobile" name="mobile_number" required></div>
            <button type="submit" class="btn btn-primary" style="width: 100%; margin-top: 15px; padding: 15px; font-size: 18px;">Pay <?php echo htmlspecialchars($link_details['amount']); ?> BDT</button>
        </form>
    </div>
</body>
<?php endif; ?>
</html>

================================================================================
--- ফাইল পাথ (File Path): templates/footer.php [Text Content] ---
================================================================================

</div> <!-- .main-content বন্ধ করার ট্যাগ -->

<!-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ -->
<!-- ★★★      মূল সমাধান: সাইডবার এবং অন্যান্য কার্যকারিতার জন্য main.js ফাইলটি এখানে লোড করা হচ্ছে      ★★★ -->
<!-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ -->
<script src="js/main.js?v=<?php echo @filemtime(__DIR__ . '/../js/main.js'); ?>"></script>

</body>
</html>

================================================================================
--- ফাইল পাথ (File Path): templates/header.php [Text Content] ---
================================================================================

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ড্যাশবোর্ড</title>
    <!-- ক্যাশ বাস্টিং সহ CSS ফাইল লিংক করা -->
    <link rel="stylesheet" href="css/style.css?v=<?php echo filemtime('css/style.css'); ?>">
    <!-- Font Awesome CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
    <header class="header">
        <!-- বাম পাশের অংশ (শুধুমাত্র মেনু আইকন) -->
        <div class="header-left">
            <div class="header-icon" id="menu-icon">
                <i class="fas fa-bars"></i>
            </div>
        </div>

        <!-- মাঝখানের অংশ (টাইটেল) -->
        <div class="header-title">
            <h1>আমার ওয়েবসাইট</h1>
        </div>

        <!-- ডান পাশের অংশ (শুধুমাত্র লগআউট আইকন) -->
        <div class="header-right">
            <a href="logout.php" class="header-icon">
                <i class="fas fa-sign-out-alt"></i>
            </a>
        </div>
    </header>

================================================================================
--- ফাইল পাথ (File Path): templates/sidebar.php [Text Content] ---
================================================================================

<aside class="sidebar" id="sidebar">
    <div class="sidebar-header">
        <i class="fas fa-rocket logo-icon"></i>
        <span class="logo-text">Dashboard</span>
    </div>
    <ul class="sidebar-menu">
        <li><a href="customers.php"><i class="fas fa-users"></i><span>Customers</span></a></li>

        <!-- Modules Dropdown Menu -->
        <li class="sidebar-dropdown">
            <a href="#">
                <i class="fas fa-puzzle-piece"></i>
                <span>Modules</span>
                <i class="fas fa-chevron-down dropdown-icon"></i>
            </a>
            <ul class="dropdown-container">
                <li><a href="credit_eligibility.php">Credit Eligibility</a></li>
            </ul>
        </li>

        <li><a href="updates.php"><i class="fas fa-sync-alt"></i><span>updates</span></a></li>
         <li class="sidebar-header">License Manager</li>
        <li><a href="products.php"><i class="fas fa-box-open"></i><span>Products</span></a></li>
        <li><a href="licenses.php"><i class="fas fa-key"></i><span>Licenses</span></a></li>
    </ul>
</aside>

<!-- নতুন ড্রপডাউন এবং ডিজাইন সমস্যার সমাধানের জন্য CSS -->
<style>
    /* ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ */
    /* ★★★      মূল সমাধান: আইকন এবং টেক্সটের মধ্যে নির্দিষ্ট স্পেস যুক্ত করা হয়েছে      ★★★ */
    /* ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ */
    .sidebar-menu li a {
        display: flex;
        align-items: center;
        gap: 15px; /* এই লাইনটি আইকন এবং টেক্সটের মধ্যে ১৫ পিক্সেল ফাঁকা জায়গা তৈরি করবে */
    }
    .sidebar-dropdown > a {
        justify-content: space-between;
    }
    .dropdown-container {
        display: none;
        padding-left: 25px;
        background-color: rgba(0,0,0,0.05);
        list-style: none;
    }
    .dropdown-container a {
        font-size: 15px !important;
        padding: 10px 15px !important;
    }
    .dropdown-icon {
        transition: transform 0.3s ease;
    }
    .sidebar-dropdown.active .dropdown-icon {
        transform: rotate(180deg);
    }
</style>

<!-- ড্রপডাউন মেনুর জন্য JavaScript -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    var dropdowns = document.getElementsByClassName("sidebar-dropdown");
    for (var i = 0; i < dropdowns.length; i++) {
        dropdowns[i].querySelector('a').addEventListener("click", function(e) {
            e.preventDefault();
            
            var parentLi = this.parentElement;
            parentLi.classList.toggle("active");
            
            var dropdownContent = parentLi.querySelector(".dropdown-container");
            if (dropdownContent.style.display === "block") {
                dropdownContent.style.display = "none";
            } else {
                dropdownContent.style.display = "block";
            }
        });
    }
});
</script>

<div class="main-content">

