<?php

/**
 * PluginLicenseGuard v2.0
 *
 * نظام الترخيص الموحد لجميع الإضافات
 * ─────────────────────────────────────
 * ✅ يتحقق من الترخيص عبر license.ar-script.com
 * ✅ يتحقق أن الترخيص مخصص للإضافة الصحيحة (plugin_slug)
 * ✅ RSA-SHA256 للتوقيع — يمنع تزوير الردود
 * ✅ ربط الدومين تلقائياً عند أول تفعيل
 * ✅ كاش محلي 24 ساعة — بدون طلبات متكررة
 * ✅ عند التلاعب: يُبلّغ الخادم + يحذف الإضافة نهائياً
 */
class PluginLicenseGuard
{
    // ── نقاط الاتصال ──────────────────────────────────────────────────
    private const LICENSE_SERVER  = 'https://license.ar-script.com';
    private const VERIFY_ENDPOINT = '/api/verify.php';
    private const PING_ENDPOINT   = '/api/ping.php';
    private const REPORT_ENDPOINT = '/api/report.php';

    // ── المفتاح العام RSA (مضمّن — لا يُغيَّر إلا عند تبديل المفاتيح) ──
    private const PUBLIC_KEY_PEM = <<<PEM
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAs0Roys7vhPNqk60Uk+Ob
I/Epu0si4jm+xDTU+uzS0lnvRfzX3C9GyNlB3qkNFxi4bUqjjAq/M3bzYplO9wFS
zDQqu84LpFG1I2Pjeo7DB7dudEhGp9hDSFwkEFQuhE1F5DTDetsa7+WuhJrFZs56
uxIo0qyUNokj/3V+FrJs6B/r2lWjHvAvPzPqJlpLdajuaCGtXs1Q2jPwWzAg7zgm
/BeJkDrQHPIwCAUD7fwG3OwqBsLwAvRcO3qnTcED/dfAThQ6Aob2w+4ITmlt6VLx
gVcG+VjXUf1aI8pdrG5ljjWMmX03E4VOI4FlrUWXU7riNX/iMDoQevmS2MpTBgps
V3TgOsHsCiCzcoYEVZ2GDyR2Ku+qEcfh3Iq8uyEbJwBSdhG8u0942PHLA8mWhZ9c
+7q74L2OW1z7F36OhSFe5IGt0jB9pgFvZ4clOqF3F5I/G4K3ePXGSzXGtZwaAE/T
a5lyXl7yxM1Kk+WUcN1ohhtQSEUpvF2pAyO3Qlx7/i0OWfgHsAn9X06sgZnWY+T5
cvdxKASo9TDnkvfyUFGkRbMydFrLMm7OTfWT7asYLu57QvyJFbFaQEC68r2eJfxY
GlQkmM1h+aR/pxwCSfWz2azfdklSg8LU93ZozPw+2lcBCHVZDscbrRMPXXdzm+Pe
g9G16nv035J9c7vbe2/ISC8CAwEAAQ==
-----END PUBLIC KEY-----
PEM;

    // ── إعدادات الكاش ─────────────────────────────────────────────────
    private const CACHE_TTL        = 86400;   // 24 ساعة
    private const CACHE_STALE_TTL  = 604800;  // 7 أيام (احتياطي انقطاع الشبكة)
    private const PING_TTL         = 3600;    // تحديث خلفي كل ساعة
    private const CONNECT_TIMEOUT  = 8;
    private const REQUEST_TIMEOUT  = 15;

    // ══════════════════════════════════════════════════════════════════
    // نقطة الدخول الرئيسية
    // ══════════════════════════════════════════════════════════════════

    /**
     * @param string $pluginSlug   مثال: 'rewards-contest'
     * @param string $licenseKey   المفتاح من إعدادات الإضافة
     */
    public static function check(string $pluginSlug, string $licenseKey): void
    {
        $licenseKey = trim($licenseKey);

        if ($licenseKey === '') {
            self::denyNotActivated($pluginSlug);
        }

        $domain   = self::currentDomain();
        $cacheKey = $pluginSlug . ':' . hash('sha256', $licenseKey . $domain);

        // ── 1. قراءة الكاش المحلي ────────────────────────────────────
        $cached = self::cacheGet($cacheKey);
        if ($cached !== null) {
            if (($cached['action'] ?? 'block') !== 'allow') {
                if (($cached['status'] ?? '') === 'delete_required') {
                    self::selfDestruct($pluginSlug, $licenseKey, 'delete_required', $cached);
                }
                self::denyWithReason($pluginSlug, $cached);
            }

            // تحديث خلفي كل ساعة
            if (($cached['_cached_at'] + self::PING_TTL) < time()) {
                self::pingAsync($pluginSlug, $licenseKey, $domain, $cacheKey);
            }
            return;
        }

        // ── 2. طلب verify من الخادم ───────────────────────────────────
        $response = self::callServer(self::VERIFY_ENDPOINT, [
            'license_key' => $licenseKey,
            'domain'      => $domain,
            'fingerprint' => self::buildFingerprint($domain),
            'plugin_slug' => $pluginSlug,
        ]);

        if ($response === null) {
            // الخادم غير متاح — قبول الكاش القديم حتى 7 أيام
            $stale = self::cacheGet($cacheKey, allowStale: true);
            if ($stale && ($stale['action'] ?? '') === 'allow') {
                return;
            }
            self::denyServerUnreachable($pluginSlug);
        }

        // ── 3. التحقق من التوقيع RSA-SHA256 ──────────────────────────
        if (!self::verifySignature($response)) {
            self::reportViolation($pluginSlug, $licenseKey, 'tamper', $domain);
            self::denyWithReason($pluginSlug, [
                'status'  => 'tamper',
                'action'  => 'block',
                'message' => 'تعذّر التحقق من سلامة استجابة خادم الترخيص.',
            ]);
        }

        // ── 4. التحقق من plugin_slug (الترخيص للإضافة الصحيحة؟) ─────
        $serverSlug = $response['plugin_slug'] ?? null;
        if ($serverSlug !== null && $serverSlug !== '' && $serverSlug !== $pluginSlug) {
            $response['status']  = 'violation';
            $response['action']  = 'block';
            $response['message'] = "هذا الكود مخصص للإضافة [{$serverSlug}] وليس [{$pluginSlug}].";
            $response['_cached_at'] = time();
            self::cacheSet($cacheKey, $response);
            self::reportViolation($pluginSlug, $licenseKey, 'wrong_plugin', $domain);
            self::denyWithReason($pluginSlug, $response);
        }

        // ── 5. حفظ في الكاش ──────────────────────────────────────────
        $response['_cached_at'] = time();
        self::cacheSet($cacheKey, $response);

        // ── 6. تقييم القرار ───────────────────────────────────────────
        if (($response['action'] ?? 'block') !== 'allow') {
            if (($response['status'] ?? '') === 'delete_required') {
                self::selfDestruct($pluginSlug, $licenseKey, 'delete_required', $response);
            }

            self::denyWithReason($pluginSlug, $response);
        }
    }

    // ── Ping خفيف (read-only) ─────────────────────────────────────────
    public static function ping(string $pluginSlug, string $licenseKey): ?array
    {
        $licenseKey = trim($licenseKey);
        if ($licenseKey === '') return null;

        return self::callServer(self::PING_ENDPOINT, [
            'license_key' => $licenseKey,
            'domain'      => self::currentDomain(),
            'fingerprint' => self::buildFingerprint(self::currentDomain()),
            'plugin_slug' => $pluginSlug,
        ]);
    }

    // ── مسح الكاش ────────────────────────────────────────────────────
    public static function clearCache(string $pluginSlug, string $licenseKey): void
    {
        $key = $pluginSlug . ':' . hash('sha256', trim($licenseKey) . self::currentDomain());
        self::cacheDelete($key);
    }

    // ══════════════════════════════════════════════════════════════════
    // الحذف الذاتي عند التلاعب أو الانتهاك
    // ══════════════════════════════════════════════════════════════════

    private static function selfDestruct(
        string $slug,
        string $licenseKey,
        string $reason,
        array  $context = []
    ): never {
        $domain = self::currentDomain();

        // 1. أبلغ خادم الترخيص
        self::reportViolation($slug, $licenseKey, $reason, $domain);

        // 2. احذف مجلد الإضافة بالكامل
        $folder = defined('ROOT_PATH')
            ? ROOT_PATH . '/plugins/' . self::slugToFolder($slug)
            : null;

        if ($folder && is_dir($folder)) {
            self::deleteDirectory($folder);
        }

        // 3. احذف الكاش
        $cacheKey = $slug . ':' . hash('sha256', $licenseKey . $domain);
        self::cacheDelete($cacheKey);

        // 4. عطّل الإضافة في DB إذا أمكن
        try {
            if (function_exists('db')) {
                db()->prepare("UPDATE plugins SET is_active=0 WHERE slug=?")->execute([$slug]);
            }
        } catch (\Throwable $e) {}

        // 5. عرض صفحة الحذف
        http_response_code(403);
        $folderName = self::slugToFolder($slug);
        echo <<<HTML
<!DOCTYPE html>
<html dir="rtl" lang="ar">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>انتهاك الترخيص</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:system-ui,sans-serif;background:#0f172a;min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}
.box{background:#1e293b;border:1px solid #dc2626;border-radius:16px;padding:40px;max-width:480px;width:100%;text-align:center}
h2{color:#ef4444;font-size:1.4rem;margin:16px 0 12px}
p{color:#94a3b8;line-height:1.7;margin-bottom:8px;font-size:.9rem}
code{background:#0f172a;color:#f87171;padding:3px 8px;border-radius:6px;font-size:.85em;display:inline-block;margin:4px 0;word-break:break-all}
.badge{display:inline-block;background:#dc2626;color:#fff;padding:4px 12px;border-radius:20px;font-size:.75rem;margin-bottom:20px}
</style>
</head>
<body>
<div class="box">
    <div style="font-size:3rem">🚫</div>
    <span class="badge">LICENSE VIOLATION — PLUGIN REMOVED</span>
    <h2>تم حذف الإضافة بسبب انتهاك الترخيص</h2>
    <p>تم اكتشاف استخدام غير مرخص للإضافة <code>{$slug}</code></p>
    <p>السبب: <code>{$reason}</code></p>
    <p>الدومين: <code>{$domain}</code></p>
    <p style="margin-top:16px;font-size:.8rem;color:#64748b">
        تم حذف مجلد الإضافة نهائياً وإبلاغ خادم الترخيص.<br>
        للحصول على ترخيص شرعي:
        <a href="https://license.ar-script.com/store" style="color:#60a5fa">license.ar-script.com</a>
    </p>
</div>
</body>
</html>
HTML;
        exit;
    }

    // ── حذف مجلد بشكل كامل (recursive) ─────────────────────────────
    private static function deleteDirectory(string $dir): bool
    {
        if (!is_dir($dir)) return false;

        $items = new \RecursiveIteratorIterator(
            new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS),
            \RecursiveIteratorIterator::CHILD_FIRST
        );

        foreach ($items as $item) {
            if ($item->isDir()) {
                @rmdir($item->getRealPath());
            } else {
                @unlink($item->getRealPath());
            }
        }

        return @rmdir($dir);
    }

    // ── slug → folder name ────────────────────────────────────────────
    private static function slugToFolder(string $slug): string
    {
        return str_replace(' ', '', ucwords(str_replace('-', ' ', $slug)));
    }

    // ── إبلاغ خادم الترخيص عن انتهاك ────────────────────────────────
    private static function reportViolation(
        string $slug,
        string $licenseKey,
        string $reason,
        string $domain
    ): void {
        try {
            self::callServer(self::REPORT_ENDPOINT, [
                'license_key' => $licenseKey,
                'domain'      => $domain,
                'reason'      => $reason,
                'product'     => $slug,
                'plugin_slug' => $slug,
                'fingerprint' => self::buildFingerprint($domain),
                'email'       => self::getAdminEmail(),
            ]);
        } catch (\Throwable $e) {
            // لا نوقف التنفيذ إذا فشل البلاغ
        }
    }

    // ══════════════════════════════════════════════════════════════════
    // صفحات الرفض
    // ══════════════════════════════════════════════════════════════════

    private static function denyNotActivated(string $slug): never
    {
        self::renderDenyPage(
            '🔑 الإضافة غير مفعّلة',
            "إضافة <strong>{$slug}</strong> تحتاج كود ترخيص للعمل.",
            'not_activated', $slug
        );
        exit;
    }

    private static function denyWithReason(string $slug, array $response): never
    {
        $status  = $response['status']       ?? 'invalid';
        $message = $response['message']      ?? 'License error.';
        $bound   = $response['domain_bound'] ?? null;
        $expires = $response['expires']      ?? null;

        $titles = [
            'expired'         => '⏰ انتهت صلاحية الترخيص',
            'disabled'        => '🚫 الترخيص معطّل',
            'delete_required' => '🚫 تم إصدار أمر حذف نهائي',
            'violation'       => '⚠️ تعارض في بيانات الترخيص',
            'limit_reached'   => '🔒 تجاوز حد الدومينات',
            'invalid'         => '❌ ترخيص غير صالح',
            'tamper'          => '🛡️ تعذّر التحقق من الاستجابة',
        ];

        $title = $titles[$status] ?? '❌ خطأ في الترخيص';
        $extra = '';
        if ($bound)   $extra .= "<br><small>مرتبط بـ: <code>{$bound}</code></small>";
        if ($expires) $extra .= "<br><small>انتهى في: <code>{$expires}</code></small>";

        self::renderDenyPage($title, htmlspecialchars($message) . $extra, $status, $slug);
        exit;
    }

    private static function denyServerUnreachable(string $slug): never
    {
        self::renderDenyPage(
            '🌐 تعذّر الاتصال بخادم الترخيص',
            'تحقق من اتصال السيرفر بالإنترنت أو حاول لاحقاً.',
            'server_unreachable', $slug
        );
        exit;
    }

    private static function renderDenyPage(
        string $title,
        string $body,
        string $type,
        string $slug
    ): void {
        $isAdmin    = str_contains($_SERVER['REQUEST_URI'] ?? '', '/admin/');
        $pluginsUrl = '/admin/plugins?license_retry=' . urlencode($slug);
        $listUrl    = '/admin/plugins';
        $storeUrl   = 'https://license.ar-script.com/store';
        $domain     = htmlspecialchars(self::currentDomain(), ENT_QUOTES, 'UTF-8');
        $titleEsc   = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

        $accent = match ($type) {
            'expired' => '#f59e0b',
            'disabled', 'delete_required' => '#ef4444',
            'violation', 'tamper' => '#f97316',
            default => '#2563eb',
        };

        $messageHtml = $body;

        $cardHtml = <<<HTML
<div style="min-height:calc(100vh - 120px);display:flex;align-items:center;justify-content:center;padding:28px 14px">
    <div style="width:100%;max-width:760px">
        <div style="background:linear-gradient(180deg,#ffffff 0%,#fbfdff 100%);border:1px solid #e5e7eb;border-radius:28px;overflow:hidden;box-shadow:0 24px 60px rgba(15,23,42,.12)">
            <div style="padding:26px 28px;background:linear-gradient(135deg,{$accent} 0%,#111827 100%);color:#fff">
                <div style="display:flex;align-items:center;gap:14px;flex-wrap:wrap">
                    <div style="width:58px;height:58px;border-radius:18px;background:rgba(255,255,255,.14);display:flex;align-items:center;justify-content:center;font-size:28px">🔒</div>
                    <div>
                        <div style="font-size:.78rem;opacity:.82;font-weight:700;letter-spacing:.05em">LICENSE STATUS</div>
                        <div style="font-size:1.45rem;font-weight:800;line-height:1.35">{$titleEsc}</div>
                    </div>
                </div>
            </div>

            <div style="padding:28px">
                <div style="font-size:1rem;line-height:1.9;color:#334155;margin-bottom:18px">{$messageHtml}</div>

                <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin-bottom:22px">
                    <div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:18px;padding:16px">
                        <div style="font-size:.78rem;color:#64748b;margin-bottom:6px">Plugin</div>
                        <div style="font-weight:800;color:#0f172a"><code>{$slug}</code></div>
                    </div>
                    <div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:18px;padding:16px">
                        <div style="font-size:.78rem;color:#64748b;margin-bottom:6px">Domain</div>
                        <div style="font-weight:800;color:#0f172a"><code>{$domain}</code></div>
                    </div>
                </div>

                <div style="display:flex;gap:10px;flex-wrap:wrap">
                    <a href="{$pluginsUrl}" class="btn btn-primary fw-semibold" style="border-radius:12px;padding:.8rem 1.15rem">
                        <i class="bi bi-key me-1"></i>إدخال / تغيير كود الترخيص
                    </a>
                    <a href="{$listUrl}" class="btn btn-light fw-semibold" style="border-radius:12px;padding:.8rem 1.15rem;border:1px solid #e5e7eb">
                        <i class="bi bi-grid me-1"></i>العودة إلى الإضافات
                    </a>
                    <a href="{$storeUrl}" target="_blank" class="btn btn-outline-secondary fw-semibold" style="border-radius:12px;padding:.8rem 1.15rem">
                        <i class="bi bi-cart me-1"></i>شراء ترخيص
                    </a>
                </div>

                <div style="margin-top:18px;font-size:.86rem;color:#64748b;line-height:1.8">
                    يمكنك إغلاق هذه الصفحة والمتابعة بشكل طبيعي من لوحة التحكم، ثم فتح نفس مودل الترخيص الحالي من صفحة الإضافات لإعادة المحاولة.
                </div>
            </div>
        </div>
    </div>
</div>
HTML;

        if ($isAdmin) {
            if (defined('ROOT_PATH') && is_file(ROOT_PATH . '/admin/templates/header.php')) {
                require_once ROOT_PATH . '/admin/templates/header.php';
            }
            echo '<div class="content-wrapper"><section class="content">' . $cardHtml . '</section></div>';
            if (defined('ROOT_PATH') && is_file(ROOT_PATH . '/admin/templates/footer.php')) {
                require_once ROOT_PATH . '/admin/templates/footer.php';
            }
            return;
        }

        http_response_code(403);
        echo <<<HTML
<!DOCTYPE html>
<html dir="rtl" lang="ar">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>{$titleEsc}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
</head>
<body style="margin:0;background:#eef2f7;font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif">
{$cardHtml}
</body>
</html>
HTML;
    }

    private static function getAdminEmail(): string
    {
        try {
            if (!function_exists('db')) {
                return '';
            }

            $stmt = db()->prepare("
                SELECT email
                FROM admins
                WHERE email IS NOT NULL
                  AND email <> ''
                ORDER BY id ASC
                LIMIT 1
            ");
            $stmt->execute();
            $email = trim((string)$stmt->fetchColumn());
            return filter_var($email, FILTER_VALIDATE_EMAIL) ? $email : '';
        } catch (\Throwable $e) {
            return '';
        }
    }

    // ══════════════════════════════════════════════════════════════════
    // HTTP Client
    // ══════════════════════════════════════════════════════════════════

    private static function callServer(string $endpoint, array $payload): ?array
    {
        if (!function_exists('curl_init')) return null;

        $ch = curl_init(self::LICENSE_SERVER . $endpoint);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => json_encode($payload, JSON_UNESCAPED_UNICODE),
            CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'Accept: application/json'],
            CURLOPT_CONNECTTIMEOUT => self::CONNECT_TIMEOUT,
            CURLOPT_TIMEOUT        => self::REQUEST_TIMEOUT,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_SSL_VERIFYHOST => 2,
        ]);

        $body = curl_exec($ch);
        curl_close($ch);

        if (!$body) return null;
        $data = json_decode($body, true);
        return is_array($data) ? $data : null;
    }

    // ── Ping غير متزامن في الخلفية ───────────────────────────────────
    private static function pingAsync(
        string $slug,
        string $key,
        string $domain,
        string $cacheKey
    ): void {
        register_shutdown_function(function () use ($slug, $key, $domain, $cacheKey) {
            $res = self::callServer(self::PING_ENDPOINT, [
                'license_key' => $key,
                'domain'      => $domain,
                'fingerprint' => self::buildFingerprint($domain),
                'plugin_slug' => $slug,
            ]);
            if ($res && self::verifySignature($res)) {
                $res['_cached_at'] = time();
                self::cacheSet($cacheKey, $res);

                if (($res['action'] ?? 'block') !== 'allow'
                    && ($res['status'] ?? '') === 'delete_required') {
                    self::selfDestruct($slug, $key, 'delete_required', $res);
                }
            }
        });
    }

    // ══════════════════════════════════════════════════════════════════
    // RSA-SHA256 Signature Verification
    // ══════════════════════════════════════════════════════════════════

    private static function verifySignature(array $payload): bool
    {
        if (empty($payload['sig'])) return false;

        $sigRaw = base64_decode($payload['sig'], true);
        if ($sigRaw === false) return false;

        $data = $payload;
        unset($data['sig']);
        $data = self::sortRecursive($data);
        $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        if (!$json) return false;

        $pubKey = openssl_pkey_get_public(self::PUBLIC_KEY_PEM);
        if (!$pubKey) return false;

        return openssl_verify($json, $sigRaw, $pubKey, OPENSSL_ALGO_SHA256) === 1;
    }

    private static function sortRecursive(mixed $data): mixed
    {
        if (!is_array($data)) return $data;
        if (array_keys($data) !== range(0, count($data) - 1)) ksort($data);
        foreach ($data as $k => $v) $data[$k] = self::sortRecursive($v);
        return $data;
    }

    // ══════════════════════════════════════════════════════════════════
    // Cache Helpers
    // ══════════════════════════════════════════════════════════════════

    private static function cacheDir(): string
    {
        $base = defined('ROOT_PATH') ? ROOT_PATH . '/storage' : sys_get_temp_dir();
        $dir  = $base . '/plg_lic_cache';
        if (!is_dir($dir)) @mkdir($dir, 0750, true);
        return $dir;
    }

    private static function cacheFile(string $key): string
    {
        return self::cacheDir() . '/' . hash('sha256', $key) . '.json';
    }

    private static function cacheGet(string $key, bool $allowStale = false): ?array
    {
        $file = self::cacheFile($key);
        if (!is_file($file)) return null;

        $data = json_decode((string)@file_get_contents($file), true);
        if (!is_array($data)) return null;

        $age = time() - (int)($data['_cached_at'] ?? 0);
        $ttl = $allowStale ? self::CACHE_STALE_TTL : self::CACHE_TTL;
        return $age > $ttl ? null : $data;
    }

    private static function cacheSet(string $key, array $data): void
    {
        @file_put_contents(self::cacheFile($key), json_encode($data, JSON_UNESCAPED_UNICODE), LOCK_EX);
    }

    private static function cacheDelete(string $key): void
    {
        $f = self::cacheFile($key);
        if (is_file($f)) @unlink($f);
    }

    // ══════════════════════════════════════════════════════════════════
    // Helpers
    // ══════════════════════════════════════════════════════════════════

    public static function currentDomain(): string
    {
        $host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'localhost';
        $host = strtolower(trim($host));
        $host = preg_replace('/:\d+$/', '', $host);
        $host = preg_replace('/^www\./', '', $host);
        return $host;
    }

    private static function buildFingerprint(string $domain): string
    {
        return hash('sha256', $domain . php_uname('n') . PHP_MAJOR_VERSION);
    }
}
