Project: RR Com 17Apr26 Last Working Codes ZIP File: RR com.zip Extracted on: 2026-04-17 14:54:41 Total Files: 158 ================================================================================ FILE: RR com/about.php TYPE: PHP SIZE: 21 KB ------------------------------------------------------------ About Relevant Reflex | Online Survey Platform India Since 2021

Our Mission

At Relevant Reflex, we bridge the gap between Indian consumers and global market research companies. Our mission is to provide a trustworthy platform where your opinions matter and are fairly compensated.

We believe that every voice deserves to be heard, and every opinion has value. That's why we've created a secure, user-friendly platform that makes it easy for people across India to participate in market research and earn money for their time and insights.

Why We Started

Founded in 2021, Relevant Reflex was born out of the need for a reliable, India-focused survey platform. We saw too many people getting frustrated with unreliable survey sites that didn't pay or weren't relevant to the Indian market.

About Relevant Reflex

Our Impact in Numbers

Since our launch, we've grown into a trusted survey platform serving members across India

50,000+
Active Members

Registered users earning money with surveys

₹25,00,000+
Total Paid Out

Cumulative rewards paid to our members

2,50,000+
Surveys Completed

Successful survey completions by our members

98%
Satisfaction Rate

Members who recommend us to friends*

*Based on internal member survey, Q4 2024, n=500

Our Core Values

These principles guide everything we do at Relevant Reflex

Trust & Security

We protect your data with bank-level security and never share your personal information without consent. Your privacy is our priority.

Fair Compensation

Every survey you complete is fairly compensated. We ensure timely payments and transparent reward structures.

Member-Centric

Our members are at the center of everything we do. We continuously improve our platform based on your feedback.

Innovation

We're constantly evolving our platform with new features and better user experiences to serve you better.

Community

We've built more than a platform - we've built a community of engaged Indian consumers making their voices heard.

Local Focus

We understand the Indian market and provide surveys that are relevant to local consumers and culture.

Independently Listed & Verified

Relevant Reflex is independently researched and listed on Paid Survey Hub India — a free third-party directory that verifies paid survey platforms for Indian users. Only platforms with a proven track record of accepting Indian members and making actual payments are listed. Our presence there is not paid or sponsored — it is based on verified legitimacy.

View Our Listing on Paid Survey Hub India ↗

Ready to Share Your Opinions?

Join thousands of Indians who are earning money with their valuable insights!

Join Relevant Reflex Today
-------------------- END OF FILE -------------------- FILE: RR com/admin-auth.php TYPE: PHP SIZE: 48.39 KB ------------------------------------------------------------ pdo = $db->getConnection(); } catch (Exception $e) { logError('Admin auth database connection failed: ' . $e->getMessage()); throw new Exception('Database connection failed'); } } /** * Expose the PDO connection for shared use (e.g. attachment handler) */ public function getConnection() { return $this->pdo; } public function login($username, $password, $rememberMe = false) { try { // Find admin user $stmt = $this->pdo->prepare(" SELECT id, username, email, password, full_name, role, status, COALESCE(allowed_tabs, 'all') as allowed_tabs, COALESCE(allowed_ticket_types, 'all') as allowed_ticket_types FROM admin_users WHERE (username = ? OR email = ?) AND status = 'active' "); $stmt->execute([$username, $username]); $admin = $stmt->fetch(); if (!$admin || !verifyPassword($password, $admin['password'])) { logError('Admin login failed', ['username' => $username]); return false; } // Create session session_start(); session_regenerate_id(true); $_SESSION['admin_logged_in'] = true; $_SESSION['admin_id'] = $admin['id']; $_SESSION['admin_username'] = $admin['username']; $_SESSION['admin_full_name'] = $admin['full_name']; $_SESSION['admin_role'] = $admin['role']; $_SESSION['admin_login_time'] = time(); // Permissions - super_admin always gets 'all' $_SESSION['admin_allowed_tabs'] = ($admin['role'] === 'super_admin') ? 'all' : $admin['allowed_tabs']; $_SESSION['admin_allowed_ticket_types'] = ($admin['role'] === 'super_admin') ? 'all' : $admin['allowed_ticket_types']; // Update last login $stmt = $this->pdo->prepare("UPDATE admin_users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$admin['id']]); // Handle remember me if ($rememberMe) { $token = generateSecureToken(); $expires = date('Y-m-d H:i:s', strtotime('+30 days')); $stmt = $this->pdo->prepare(" INSERT INTO admin_sessions (admin_id, session_token, expires_at) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE session_token = ?, expires_at = ? "); $stmt->execute([$admin['id'], $token, $expires, $token, $expires]); setcookie('admin_remember_token', $token, strtotime('+30 days'), '/', '', true, true); } logError('Admin login successful', [ 'admin_id' => $admin['id'], 'username' => $admin['username'], 'role' => $admin['role'] ]); return true; } catch (Exception $e) { logError('Admin login error', ['username' => $username, 'error' => $e->getMessage()]); return false; } } public function logout() { session_start(); if (isset($_SESSION['admin_id'])) { logError('Admin logout', ['admin_id' => $_SESSION['admin_id']]); } // Clear remember token if (isset($_COOKIE['admin_remember_token'])) { try { $stmt = $this->pdo->prepare("DELETE FROM admin_sessions WHERE session_token = ?"); $stmt->execute([$_COOKIE['admin_remember_token']]); } catch (Exception $e) { logError('Error clearing admin remember token', ['error' => $e->getMessage()]); } setcookie('admin_remember_token', '', time() - 3600, '/', '', true, true); } // Clear session $_SESSION = []; session_destroy(); header('Location: support.php'); exit; } public function isLoggedIn() { session_start(); if (isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true) { return true; } // Check remember me token if (isset($_COOKIE['admin_remember_token'])) { return $this->checkRememberToken($_COOKIE['admin_remember_token']); } return false; } private function checkRememberToken($token) { try { $stmt = $this->pdo->prepare(" SELECT au.id, au.username, au.full_name, au.role FROM admin_sessions ass JOIN admin_users au ON ass.admin_id = au.id WHERE ass.session_token = ? AND ass.expires_at > NOW() AND au.status = 'active' "); $stmt->execute([$token]); $session = $stmt->fetch(); if ($session) { // Restore session $_SESSION['admin_logged_in'] = true; $_SESSION['admin_id'] = $session['id']; $_SESSION['admin_username'] = $session['username']; $_SESSION['admin_full_name'] = $session['full_name']; $_SESSION['admin_role'] = $session['role']; $_SESSION['admin_login_time'] = time(); // Update last login $stmt = $this->pdo->prepare("UPDATE admin_users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$session['id']]); return true; } else { // Invalid or expired token - delete it setcookie('admin_remember_token', '', time() - 3600, '/', '', true, true); } } catch (Exception $e) { logError('Error checking admin remember token', ['error' => $e->getMessage()]); } return false; } public function requireAdmin() { if (!$this->isLoggedIn()) { header('Location: support.php'); exit; } } public function getCurrentAdmin() { if (!$this->isLoggedIn()) { return null; } session_start(); return [ 'id' => $_SESSION['admin_id'], 'username' => $_SESSION['admin_username'], 'full_name' => $_SESSION['admin_full_name'], 'role' => $_SESSION['admin_role'], 'allowed_tabs' => $_SESSION['admin_allowed_tabs'] ?? 'all', 'allowed_ticket_types' => $_SESSION['admin_allowed_ticket_types'] ?? 'all' ]; } /** * Check if current admin has access to a specific tab */ public function hasTabAccess($tabName) { $allowed = $_SESSION['admin_allowed_tabs'] ?? 'all'; if ($allowed === 'all' || $_SESSION['admin_role'] === 'super_admin') return true; $tabs = array_map('trim', explode(',', $allowed)); return in_array($tabName, $tabs); } /** * Get allowed ticket sender types for current admin * Returns array like ['member','partner','client'] or ['all'] */ public function getAllowedTicketTypes() { $allowed = $_SESSION['admin_allowed_ticket_types'] ?? 'all'; if ($allowed === 'all' || $_SESSION['admin_role'] === 'super_admin') return ['all']; return array_map('trim', explode(',', $allowed)); } public function createAdmin($username, $email, $password, $fullName, $role = 'admin', $mobile = null, $allowedTabs = 'all', $allowedTicketTypes = 'all') { try { // Check if username or email already exists $stmt = $this->pdo->prepare("SELECT id FROM admin_users WHERE username = ? OR email = ?"); $stmt->execute([$username, $email]); if ($stmt->fetch()) { return ['success' => false, 'message' => 'A user with this email already exists.']; } // Create admin user $hashedPassword = hashPassword($password); $stmt = $this->pdo->prepare(" INSERT INTO admin_users (username, email, password, full_name, mobile, role, allowed_tabs, allowed_ticket_types, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'active') "); $result = $stmt->execute([$username, $email, $hashedPassword, $fullName, $mobile, $role, $allowedTabs, $allowedTicketTypes]); if ($result) { logError('Admin user created', ['username' => $username, 'email' => $email, 'role' => $role]); return ['success' => true, 'message' => 'User created successfully.', 'id' => $this->pdo->lastInsertId()]; } return ['success' => false, 'message' => 'Failed to create user.']; } catch (Exception $e) { logError('Error creating admin user', ['username' => $username, 'error' => $e->getMessage()]); return ['success' => false, 'message' => 'Database error: ' . $e->getMessage()]; } } /** * Update an existing admin user */ public function updateAdmin($id, $fullName, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $newPassword = null) { try { // Prevent editing super_admin role away from user ID 1 $stmt = $this->pdo->prepare("SELECT id, role FROM admin_users WHERE id = ?"); $stmt->execute([$id]); $existing = $stmt->fetch(); if (!$existing) return ['success' => false, 'message' => 'User not found.']; // Check email uniqueness (excluding current user) $stmt = $this->pdo->prepare("SELECT id FROM admin_users WHERE email = ? AND id != ?"); $stmt->execute([$email, $id]); if ($stmt->fetch()) return ['success' => false, 'message' => 'Email already in use by another user.']; if ($newPassword) { $hashed = hashPassword($newPassword); $stmt = $this->pdo->prepare(" UPDATE admin_users SET full_name = ?, email = ?, username = ?, mobile = ?, role = ?, allowed_tabs = ?, allowed_ticket_types = ?, password = ?, updated_at = NOW() WHERE id = ? "); $stmt->execute([$fullName, $email, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $hashed, $id]); } else { $stmt = $this->pdo->prepare(" UPDATE admin_users SET full_name = ?, email = ?, username = ?, mobile = ?, role = ?, allowed_tabs = ?, allowed_ticket_types = ?, updated_at = NOW() WHERE id = ? "); $stmt->execute([$fullName, $email, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $id]); } logError('Admin user updated', ['admin_id' => $id, 'email' => $email]); return ['success' => true, 'message' => 'User updated successfully.']; } catch (Exception $e) { logError('Error updating admin user', ['id' => $id, 'error' => $e->getMessage()]); return ['success' => false, 'message' => 'Database error.']; } } /** * Toggle admin user active/inactive */ public function toggleAdminStatus($id) { try { $stmt = $this->pdo->prepare("UPDATE admin_users SET status = IF(status='active','inactive','active'), updated_at = NOW() WHERE id = ? AND id != 1"); $stmt->execute([$id]); return $stmt->rowCount() > 0; } catch (Exception $e) { logError('Error toggling admin status', ['id' => $id, 'error' => $e->getMessage()]); return false; } } /** * Get detailed admin user by ID */ public function getAdminById($id) { try { $stmt = $this->pdo->prepare("SELECT id, username, email, full_name, mobile, role, status, allowed_tabs, allowed_ticket_types, created_at, last_login FROM admin_users WHERE id = ?"); $stmt->execute([$id]); return $stmt->fetch(); } catch (Exception $e) { return null; } } /** * Get all admin users with full details (for Users tab) */ public function getAllAdminUsersDetailed() { try { $stmt = $this->pdo->query("SELECT id, username, email, full_name, mobile, role, status, allowed_tabs, allowed_ticket_types, created_at, last_login FROM admin_users ORDER BY id ASC"); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching admin users detailed', ['error' => $e->getMessage()]); return []; } } // SUPPORT TICKET METHODS public function getAllTickets($status = null, $priority = null, $senderType = null, $limit = 50, $offset = 0, $allowedTypes = null) { try { $where = "1=1"; $params = []; if ($status) { $where .= " AND st.status = ?"; $params[] = $status; } if ($priority) { $where .= " AND st.priority = ?"; $params[] = $priority; } if ($senderType) { if ($senderType === 'member') { $where .= " AND (st.sender_type = 'member' OR st.sender_type IS NULL)"; } else { $where .= " AND st.sender_type = ?"; $params[] = $senderType; } } // Permission-based sender_type restriction if ($allowedTypes && !in_array('all', $allowedTypes)) { $typePlaceholders = []; foreach ($allowedTypes as $t) { if ($t === 'member') { $typePlaceholders[] = "(st.sender_type = 'member' OR st.sender_type IS NULL)"; } else { $typePlaceholders[] = "st.sender_type = ?"; $params[] = $t; } } $where .= " AND (" . implode(' OR ', $typePlaceholders) . ")"; } $stmt = $this->pdo->prepare(" SELECT st.*, u.email as user_email, au.full_name as assigned_admin_name, COALESCE(st.sender_type, 'member') as sender_type, (SELECT COUNT(*) FROM support_messages sm WHERE sm.ticket_id = st.id) as message_count FROM support_tickets st LEFT JOIN users u ON st.user_id = u.id LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE $where ORDER BY st.created_at DESC LIMIT $limit OFFSET $offset "); $stmt->execute($params); $tickets = $stmt->fetchAll(); // For partner tickets, fetch partner info from shop database $partnerIds = []; foreach ($tickets as $t) { if ($t['sender_type'] === 'partner' && $t['sender_id']) { $partnerIds[$t['sender_id']] = true; } } if (!empty($partnerIds)) { $partnerInfo = $this->getPartnerInfoFromShop(array_keys($partnerIds)); foreach ($tickets as &$t) { if ($t['sender_type'] === 'partner' && isset($partnerInfo[$t['sender_id']])) { $p = $partnerInfo[$t['sender_id']]; $t['partner_name'] = $p['company_name']; $t['partner_code'] = $p['affiliate_code']; if (empty($t['user_email'])) { $t['user_email'] = $p['email']; } } } unset($t); } // For client tickets, fetch client info from shop database $clientIds = []; foreach ($tickets as $t) { if ($t['sender_type'] === 'client' && $t['sender_id']) { $clientIds[$t['sender_id']] = true; } } if (!empty($clientIds)) { $clientInfo = $this->getClientInfoFromShop(array_keys($clientIds)); foreach ($tickets as &$t) { if ($t['sender_type'] === 'client' && isset($clientInfo[$t['sender_id']])) { $c = $clientInfo[$t['sender_id']]; $t['client_name'] = $c['company_name']; $t['client_code'] = $c['client_code']; $t['client_contact'] = $c['contact_person']; if (empty($t['user_email'])) { $t['user_email'] = $c['email']; } } } unset($t); } return $tickets; } catch (Exception $e) { logError('Error fetching tickets', ['error' => $e->getMessage()]); return []; } } public function getTicketStats($allowedTypes = null) { try { $where = "1=1"; $params = []; // Permission-based filtering if ($allowedTypes && !in_array('all', $allowedTypes)) { $typePlaceholders = []; foreach ($allowedTypes as $t) { if ($t === 'member') { $typePlaceholders[] = "(sender_type = 'member' OR sender_type IS NULL)"; } else { $typePlaceholders[] = "sender_type = ?"; $params[] = $t; } } $where .= " AND (" . implode(' OR ', $typePlaceholders) . ")"; } $stmt = $this->pdo->prepare(" SELECT COUNT(*) as total, SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) as open, SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending, SUM(CASE WHEN status = 'resolved' THEN 1 ELSE 0 END) as resolved, SUM(CASE WHEN status = 'closed' THEN 1 ELSE 0 END) as closed, SUM(CASE WHEN sender_type = 'member' OR sender_type IS NULL THEN 1 ELSE 0 END) as member_tickets, SUM(CASE WHEN sender_type = 'partner' THEN 1 ELSE 0 END) as partner_tickets, SUM(CASE WHEN sender_type = 'client' THEN 1 ELSE 0 END) as client_tickets FROM support_tickets WHERE $where "); $stmt->execute($params); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching ticket stats', ['error' => $e->getMessage()]); return ['total' => 0, 'open' => 0, 'pending' => 0, 'resolved' => 0, 'closed' => 0, 'member_tickets' => 0, 'partner_tickets' => 0, 'client_tickets' => 0]; } } public function getTicketById($ticketId) { try { $stmt = $this->pdo->prepare(" SELECT st.*, u.email as user_email, u.gender, u.date_of_birth, u.postcode, au.full_name as assigned_admin_name, COALESCE(st.sender_type, 'member') as sender_type FROM support_tickets st LEFT JOIN users u ON st.user_id = u.id LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.id = ? "); $stmt->execute([$ticketId]); $ticket = $stmt->fetch(); // For partner tickets, fetch partner info from shop database if ($ticket && $ticket['sender_type'] === 'partner' && $ticket['sender_id']) { $partnerInfo = $this->getPartnerInfoFromShop([$ticket['sender_id']]); if (isset($partnerInfo[$ticket['sender_id']])) { $p = $partnerInfo[$ticket['sender_id']]; $ticket['partner_name'] = $p['company_name']; $ticket['partner_code'] = $p['affiliate_code']; $ticket['partner_incharge'] = $p['incharge_name']; if (empty($ticket['user_email'])) { $ticket['user_email'] = $p['email']; } } } // For client tickets, fetch client info from shop database if ($ticket && $ticket['sender_type'] === 'client' && $ticket['sender_id']) { $clientInfo = $this->getClientInfoFromShop([$ticket['sender_id']]); if (isset($clientInfo[$ticket['sender_id']])) { $c = $clientInfo[$ticket['sender_id']]; $ticket['client_name'] = $c['company_name']; $ticket['client_code'] = $c['client_code']; $ticket['client_contact'] = $c['contact_person']; if (empty($ticket['user_email'])) { $ticket['user_email'] = $c['email']; } } } return $ticket; } catch (Exception $e) { logError('Error fetching ticket', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]); return null; } } public function getTicketMessages($ticketId, $includeInternal = false) { try { $where = $includeInternal ? "1=1" : "is_internal = 0"; $stmt = $this->pdo->prepare(" SELECT sm.*, CASE WHEN sm.sender_type = 'user' THEN u.email WHEN sm.sender_type = 'admin' THEN au.full_name END as sender_name FROM support_messages sm LEFT JOIN users u ON sm.sender_type = 'user' AND sm.sender_id = u.id LEFT JOIN admin_users au ON sm.sender_type = 'admin' AND sm.sender_id = au.id WHERE sm.ticket_id = ? AND $where ORDER BY sm.created_at ASC "); $stmt->execute([$ticketId]); $messages = $stmt->fetchAll(); // For partner ticket messages where sender_name is NULL (partner sender_id not in users table) // fetch partner info from shop database $needsPartnerName = false; foreach ($messages as $msg) { if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) { $needsPartnerName = true; break; } } if ($needsPartnerName) { // Get ticket to find partner/client sender_id $stmtT = $this->pdo->prepare("SELECT sender_type, sender_id FROM support_tickets WHERE id = ?"); $stmtT->execute([$ticketId]); $ticket = $stmtT->fetch(); if ($ticket && $ticket['sender_type'] === 'partner' && $ticket['sender_id']) { $partnerInfo = $this->getPartnerInfoFromShop([$ticket['sender_id']]); $partnerName = isset($partnerInfo[$ticket['sender_id']]) ? $partnerInfo[$ticket['sender_id']]['company_name'] : 'Partner'; foreach ($messages as &$msg) { if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) { $msg['sender_name'] = $partnerName; } } unset($msg); } // Client name resolution if ($ticket && $ticket['sender_type'] === 'client' && $ticket['sender_id']) { $clientInfo = $this->getClientInfoFromShop([$ticket['sender_id']]); $clientName = isset($clientInfo[$ticket['sender_id']]) ? $clientInfo[$ticket['sender_id']]['company_name'] : 'Client'; foreach ($messages as &$msg) { if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) { $msg['sender_name'] = $clientName; } } unset($msg); } } return $messages; } catch (Exception $e) { logError('Error fetching ticket messages', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]); return []; } } public function updateTicketStatus($ticketId, $status, $adminId) { try { $stmt = $this->pdo->prepare(" UPDATE support_tickets SET status = ?, resolved_at = CASE WHEN ? = 'resolved' COLLATE utf8mb4_unicode_ci THEN NOW() ELSE resolved_at END WHERE id = ? "); $result = $stmt->execute([$status, $status, $ticketId]); if ($result) { logError('Ticket status updated', [ 'ticket_id' => $ticketId, 'status' => $status, 'admin_id' => $adminId ]); } return $result; } catch (Exception $e) { logError('Error updating ticket status', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]); return false; } } /** * Fetch partner info from the shop database (affiliates table is in u752449863_rrshop) * @param array $partnerIds Array of affiliate IDs * @return array Keyed by affiliate ID => [company_name, affiliate_code, email, incharge_name] */ private function getPartnerInfoFromShop($partnerIds) { $result = []; if (empty($partnerIds)) return $result; try { $shopPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", "u752449863_rradmin", DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); $placeholders = implode(',', array_fill(0, count($partnerIds), '?')); $stmt = $shopPdo->prepare("SELECT id, company_name, affiliate_code, email, incharge_name FROM affiliates WHERE id IN ($placeholders)"); $stmt->execute(array_values($partnerIds)); foreach ($stmt->fetchAll() as $row) { $result[$row['id']] = $row; } } catch (Exception $e) { logError('Error fetching partner info from shop DB', ['error' => $e->getMessage()]); } return $result; } /** * Fetch client info from the shop database (clients table is in u752449863_rrshop) * @param array $clientIds Array of client IDs * @return array Keyed by client ID => [company_name, client_code, email, contact_person] */ private function getClientInfoFromShop($clientIds) { $result = []; if (empty($clientIds)) return $result; try { $shopPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", "u752449863_rradmin", DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); $placeholders = implode(',', array_fill(0, count($clientIds), '?')); $stmt = $shopPdo->prepare("SELECT id, company_name, client_code, email, contact_person FROM clients WHERE id IN ($placeholders)"); $stmt->execute(array_values($clientIds)); foreach ($stmt->fetchAll() as $row) { $result[$row['id']] = $row; } } catch (Exception $e) { logError('Error fetching client info from shop DB', ['error' => $e->getMessage()]); } return $result; } public function assignTicket($ticketId, $adminId) { try { $stmt = $this->pdo->prepare("UPDATE support_tickets SET assigned_to = ?, updated_at = NOW() WHERE id = ?"); return $stmt->execute([$adminId, $ticketId]); } catch (Exception $e) { logError('Error assigning ticket', ['ticket_id' => $ticketId, 'admin_id' => $adminId, 'error' => $e->getMessage()]); return false; } } public function addTicketReply($ticketId, $message, $adminId, $isInternal = false) { try { $stmt = $this->pdo->prepare(" INSERT INTO support_messages (ticket_id, sender_type, sender_id, message, is_internal) VALUES (?, 'admin', ?, ?, ?) "); $result = $stmt->execute([$ticketId, $adminId, $message, $isInternal]); if ($result) { // Capture the inserted message ID BEFORE any other queries $messageId = $this->pdo->lastInsertId(); // Update ticket timestamp $stmt = $this->pdo->prepare("UPDATE support_tickets SET updated_at = NOW() WHERE id = ?"); $stmt->execute([$ticketId]); // Return the actual message ID (not boolean) so attachments link correctly return $messageId; } return false; } catch (Exception $e) { logError('Error adding ticket reply', ['ticket_id' => $ticketId, 'admin_id' => $adminId, 'error' => $e->getMessage()]); return false; } } public function getAdminUsers() { try { $stmt = $this->pdo->prepare("SELECT id, username, full_name, role FROM admin_users WHERE status = 'active' ORDER BY full_name"); $stmt->execute(); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching admin users', ['error' => $e->getMessage()]); return []; } } // REDEMPTION MANAGEMENT METHODS public function getAllRedemptions($status = null, $dateFilter = null, $limit = 50, $offset = 0) { try { $where = "1=1"; $params = []; if ($status && $status !== 'all') { $where .= " AND rr.status = ?"; $params[] = $status; } if ($dateFilter) { switch ($dateFilter) { case 'today': $where .= " AND DATE(rr.created_at) = CURDATE()"; break; case 'yesterday': $where .= " AND DATE(rr.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)"; break; case 'this_week': $where .= " AND rr.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)"; break; case 'this_month': $where .= " AND rr.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)"; break; } } $stmt = $this->pdo->prepare(" SELECT rr.*, u.email as user_email, au.full_name as processed_by_name, (SELECT COUNT(*) FROM redemption_requests WHERE user_id = rr.user_id) as user_total_redemptions FROM redemption_requests rr LEFT JOIN users u ON rr.user_id = u.id LEFT JOIN admin_users au ON rr.processed_by = au.id WHERE $where ORDER BY rr.created_at DESC LIMIT $limit OFFSET $offset "); $stmt->execute($params); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching redemptions', ['error' => $e->getMessage()]); return []; } } public function getRedemptionStats() { try { $stmt = $this->pdo->query(" SELECT COUNT(*) as total, SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending, SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing, SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed, SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed, SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) as cancelled, SUM(CASE WHEN status = 'pending' THEN amount_inr ELSE 0 END) as pending_amount, SUM(CASE WHEN status IN ('processing', 'completed') THEN amount_inr ELSE 0 END) as processed_amount FROM redemption_requests "); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching redemption stats', ['error' => $e->getMessage()]); return [ 'total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0, 'failed' => 0, 'cancelled' => 0, 'pending_amount' => 0, 'processed_amount' => 0 ]; } } public function updateRedemptionStatus($redemptionId, $status, $adminNotes, $adminId, $paymentRef = null, $paymentMode = 'UPI', $disbursalDate = null) { try { $this->pdo->beginTransaction(); // Get redemption details $stmt = $this->pdo->prepare("SELECT * FROM redemption_requests WHERE id = ?"); $stmt->execute([$redemptionId]); $redemption = $stmt->fetch(); if (!$redemption) { throw new Exception('Redemption request not found'); } // Update redemption status with payment fields $stmt = $this->pdo->prepare(" UPDATE redemption_requests SET status = ?, admin_notes = ?, processed_by = ?, processed_at = NOW(), payment_reference = ?, payment_mode = ?, disbursal_date = ?, updated_at = NOW() WHERE id = ? "); $finalDisbursalDate = ($status === 'completed' && $disbursalDate) ? $disbursalDate : null; $finalPaymentRef = ($status === 'completed') ? $paymentRef : null; $stmt->execute([$status, $adminNotes, $adminId, $finalPaymentRef, $paymentMode, $finalDisbursalDate, $redemptionId]); // Update point transaction status $stmt = $this->pdo->prepare(" UPDATE point_transactions SET status = ? WHERE reference_id = ? AND transaction_type = 'redeemed' "); $stmt->execute([$status, $redemption['request_id']]); // If status is failed or cancelled, refund the points if (in_array($status, ['failed', 'cancelled'])) { $stmt = $this->pdo->prepare(" UPDATE user_points SET points = points + ?, total_redeemed = total_redeemed - ? WHERE user_id = ? "); $stmt->execute([$redemption['points_redeemed'], $redemption['points_redeemed'], $redemption['user_id']]); // Add refund transaction $refundDescription = "Refund for {$status} redemption request - " . $redemption['request_id']; $stmt = $this->pdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id) VALUES (?, 'earned', ?, 'refund', ?, ?) "); $stmt->execute([$redemption['user_id'], $redemption['points_redeemed'], $refundDescription, $redemption['request_id']]); } $this->pdo->commit(); logError('Redemption status updated', [ 'redemption_id' => $redemptionId, 'request_id' => $redemption['request_id'], 'old_status' => $redemption['status'], 'new_status' => $status, 'admin_id' => $adminId, 'admin_notes' => $adminNotes ]); return true; } catch (Exception $e) { $this->pdo->rollback(); logError('Error updating redemption status', [ 'redemption_id' => $redemptionId, 'error' => $e->getMessage() ]); return false; } } public function getRedemptionById($redemptionId) { try { $stmt = $this->pdo->prepare(" SELECT rr.*, u.email as user_email, u.gender, u.date_of_birth, u.postcode, au.full_name as processed_by_name, up.points as user_current_points, up.total_earned, up.total_redeemed FROM redemption_requests rr LEFT JOIN users u ON rr.user_id = u.id LEFT JOIN admin_users au ON rr.processed_by = au.id LEFT JOIN user_points up ON rr.user_id = up.user_id WHERE rr.id = ? "); $stmt->execute([$redemptionId]); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]); return null; } } public function getRecentRedemptions($limit = 5) { try { $stmt = $this->pdo->prepare(" SELECT rr.request_id, rr.amount_inr, rr.status, rr.created_at, u.email as user_email FROM redemption_requests rr LEFT JOIN users u ON rr.user_id = u.id ORDER BY rr.created_at DESC LIMIT ? "); $stmt->execute([$limit]); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching recent redemptions', ['error' => $e->getMessage()]); return []; } } // ======================================== // PARTNER REDEMPTION METHODS // ======================================== /** * Get a separate PDO connection to the rrshop database */ private function getShopPdo() { return new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", "u752449863_rradmin", DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false] ); } /** * Get all partner redemptions with affiliate details */ public function getAllPartnerRedemptions($status = null, $dateFilter = null, $limit = 50, $offset = 0) { try { $shopPdo = $this->getShopPdo(); $where = "1=1"; $params = []; if ($status && $status !== 'all') { $where .= " AND pr.status = ?"; $params[] = $status; } if ($dateFilter) { switch ($dateFilter) { case 'today': $where .= " AND DATE(pr.created_at) = CURDATE()"; break; case 'yesterday': $where .= " AND DATE(pr.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)"; break; case 'this_week': $where .= " AND pr.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)"; break; case 'this_month': $where .= " AND MONTH(pr.created_at) = MONTH(NOW()) AND YEAR(pr.created_at) = YEAR(NOW())"; break; } } $limit = intval($limit); $offset = intval($offset); $stmt = $shopPdo->prepare(" SELECT pr.*, a.company_name, a.affiliate_code, a.email as partner_email, a.incharge_name, a.mobile FROM partner_redemptions pr LEFT JOIN affiliates a ON pr.affiliate_id = a.id WHERE $where ORDER BY pr.created_at DESC LIMIT $limit OFFSET $offset "); $stmt->execute($params); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching partner redemptions', ['error' => $e->getMessage()]); return []; } } /** * Get a single partner redemption with full affiliate details */ public function getPartnerRedemptionById($redemptionId) { try { $shopPdo = $this->getShopPdo(); $stmt = $shopPdo->prepare(" SELECT pr.*, a.company_name, a.affiliate_code, a.email as partner_email, a.incharge_name, a.mobile, a.commission_balance, a.total_commission_earned, a.total_commission_redeemed, a.total_signups, a.total_verified_signups FROM partner_redemptions pr LEFT JOIN affiliates a ON pr.affiliate_id = a.id WHERE pr.id = ? "); $stmt->execute([$redemptionId]); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching partner redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]); return null; } } /** * Get partner redemption statistics */ public function getPartnerRedemptionStats() { try { $shopPdo = $this->getShopPdo(); $stmt = $shopPdo->query(" SELECT COUNT(*) as total, SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending, SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing, SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed, SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) as rejected, SUM(CASE WHEN status IN ('pending','processing') THEN amount ELSE 0 END) as pending_amount, SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) as completed_amount FROM partner_redemptions "); $result = $stmt->fetch(); return $result ?: ['total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0, 'rejected' => 0, 'pending_amount' => 0, 'completed_amount' => 0]; } catch (Exception $e) { logError('Error fetching partner redemption stats', ['error' => $e->getMessage()]); return ['total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0, 'rejected' => 0, 'pending_amount' => 0, 'completed_amount' => 0]; } } /** * Update partner redemption status with disbursal details * On 'completed': deducts from commission_balance, adds to total_commission_redeemed * On 'rejected': refunds if balance was already deducted */ public function updatePartnerRedemptionStatus($redemptionId, $newStatus, $adminNotes, $paymentRef, $adminId, $paymentMode = 'UPI', $paymentAmount = null, $disbursalDate = null) { try { $shopPdo = $this->getShopPdo(); // Get current redemption $stmt = $shopPdo->prepare("SELECT * FROM partner_redemptions WHERE id = ?"); $stmt->execute([$redemptionId]); $redemption = $stmt->fetch(); if (!$redemption) { logError('Partner redemption not found', ['id' => $redemptionId]); return false; } $oldStatus = $redemption['status']; $amount = floatval($redemption['amount']); $affiliateId = $redemption['affiliate_id']; // Check if admin exists in rrshop.admin_users (FK constraint) $processedBy = null; try { $stmt = $shopPdo->prepare("SELECT id FROM admin_users WHERE id = ?"); $stmt->execute([$adminId]); if ($stmt->fetch()) { $processedBy = $adminId; } } catch (Exception $e) { /* admin_users may not exist */ } $shopPdo->beginTransaction(); // Build rejection reason $rejectionReason = ($newStatus === 'rejected') ? $adminNotes : $redemption['rejection_reason']; // Ensure null for empty optional fields if (empty($disbursalDate)) $disbursalDate = ($newStatus === 'completed') ? date('Y-m-d') : null; if ($paymentAmount === null || $paymentAmount <= 0) $paymentAmount = ($newStatus === 'completed') ? $amount : null; // Update the redemption record $stmt = $shopPdo->prepare(" UPDATE partner_redemptions SET status = ?, payment_reference = ?, payment_mode = ?, payment_amount = ?, disbursal_date = ?, notes = ?, rejection_reason = ?, processed_by = ?, processed_at = NOW(), updated_at = NOW() WHERE id = ? "); $stmt->execute([ $newStatus, $paymentRef ?: null, $paymentMode ?: 'UPI', $paymentAmount, $disbursalDate, $adminNotes ?: null, $rejectionReason, $processedBy, $redemptionId ]); // Handle balance changes if ($newStatus === 'completed' && $oldStatus !== 'completed') { $stmt = $shopPdo->prepare(" UPDATE affiliates SET total_commission_redeemed = COALESCE(total_commission_redeemed, 0) + ? WHERE id = ? "); $stmt->execute([$amount, $affiliateId]); } elseif ($newStatus === 'rejected' && $oldStatus === 'completed') { $stmt = $shopPdo->prepare(" UPDATE affiliates SET total_commission_redeemed = GREATEST(0, COALESCE(total_commission_redeemed, 0) - ?) WHERE id = ? "); $stmt->execute([$amount, $affiliateId]); } // Recalculate commission_balance $stmt = $shopPdo->prepare("SELECT COALESCE(SUM(amount), 0) FROM partner_redemptions WHERE affiliate_id = ? AND status IN ('pending','processing')"); $stmt->execute([$affiliateId]); $pendingSum = floatval($stmt->fetchColumn()); $stmt = $shopPdo->prepare(" UPDATE affiliates SET commission_balance = total_commission_earned - COALESCE(total_commission_redeemed, 0) - ? WHERE id = ? "); $stmt->execute([$pendingSum, $affiliateId]); $shopPdo->commit(); logError('Partner redemption updated', [ 'redemption_id' => $redemptionId, 'old_status' => $oldStatus, 'new_status' => $newStatus, 'amount' => $amount, 'payment_amount' => $paymentAmount, 'admin_id' => $adminId ]); return true; } catch (Exception $e) { if (isset($shopPdo) && $shopPdo->inTransaction()) { $shopPdo->rollBack(); } logError('Error updating partner redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]); return 'DB Error: ' . $e->getMessage(); } } } // Utility functions function adminJsonResponse($success, $message, $data = null) { header('Content-Type: application/json'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); echo json_encode([ 'success' => $success, 'message' => $message, 'data' => $data ]); exit; } ?> -------------------- END OF FILE -------------------- FILE: RR com/admin-support.php TYPE: PHP SIZE: 117.75 KB ------------------------------------------------------------ logout(); } // Handle login form submission if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$auth->isLoggedIn()) { $username = isset($_POST['username']) ? sanitize($_POST['username']) : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; $rememberMe = isset($_POST['remember_me']); if ($auth->login($username, $password, $rememberMe)) { header('Location: support.php'); exit; } else { $loginError = 'Invalid username or password.'; } } // Handle AJAX requests for logged-in admins if ($auth->isLoggedIn() && $_SERVER['REQUEST_METHOD'] === 'POST') { $action = isset($_POST['action']) ? $_POST['action'] : ''; $admin = $auth->getCurrentAdmin(); switch ($action) { // SUPPORT TICKET ACTIONS case 'update_status': $ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; $status = isset($_POST['status']) ? sanitize($_POST['status']) : ''; if ($ticketId && in_array($status, ['open', 'pending', 'resolved', 'closed'])) { $success = $auth->updateTicketStatus($ticketId, $status, $admin['id']); adminJsonResponse($success, $success ? 'Status updated successfully' : 'Failed to update status'); } else { adminJsonResponse(false, 'Invalid parameters'); } break; case 'assign_ticket': $ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; $adminId = isset($_POST['admin_id']) ? intval($_POST['admin_id']) : 0; if ($ticketId && $adminId) { $success = $auth->assignTicket($ticketId, $adminId); adminJsonResponse($success, $success ? 'Ticket assigned successfully' : 'Failed to assign ticket'); } else { adminJsonResponse(false, 'Invalid parameters'); } break; case 'add_reply': $ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; $message = isset($_POST['message']) ? trim($_POST['message']) : ''; $isInternal = isset($_POST['is_internal']) ? (bool)$_POST['is_internal'] : false; if ($ticketId && $message) { $messageId = $auth->addTicketReply($ticketId, $message, $admin['id'], $isInternal); if ($messageId) { // Handle file attachments using the exact message ID returned if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { $pdo = $auth->getConnection(); handleSupportAttachments($pdo, intval($messageId), $_FILES['attachments']); } adminJsonResponse(true, 'Reply added successfully'); } else { adminJsonResponse(false, 'Failed to add reply'); } } else { adminJsonResponse(false, 'Message cannot be empty'); } break; // MEMBER REDEMPTION ACTIONS case 'update_redemption_status': $redemptionId = isset($_POST['redemption_id']) ? intval($_POST['redemption_id']) : 0; $newStatus = isset($_POST['status']) ? sanitize($_POST['status']) : ''; $adminNotes = isset($_POST['admin_notes']) ? sanitize($_POST['admin_notes']) : ''; $paymentRef = isset($_POST['payment_reference']) ? sanitize($_POST['payment_reference']) : null; $paymentMode = isset($_POST['payment_mode']) ? sanitize($_POST['payment_mode']) : 'UPI'; $disbursalDate = isset($_POST['disbursal_date']) && $_POST['disbursal_date'] !== '' ? sanitize($_POST['disbursal_date']) : null; if (!in_array($newStatus, ['pending', 'processing', 'completed', 'failed', 'cancelled'])) { adminJsonResponse(false, 'Invalid status'); } if ($newStatus === 'completed' && empty($paymentRef)) { adminJsonResponse(false, 'Transaction reference is required for completed payments'); } if ($redemptionId && $newStatus) { $success = $auth->updateRedemptionStatus($redemptionId, $newStatus, $adminNotes, $admin['id'], $paymentRef, $paymentMode, $disbursalDate); adminJsonResponse($success, $success ? 'Redemption status updated successfully' : 'Failed to update status'); } else { adminJsonResponse(false, 'Invalid parameters'); } break; // PARTNER REDEMPTION ACTIONS case 'update_partner_redemption_status': $redemptionId = isset($_POST['redemption_id']) ? intval($_POST['redemption_id']) : 0; $newStatus = isset($_POST['status']) ? sanitize($_POST['status']) : ''; $adminNotes = isset($_POST['admin_notes']) ? sanitize($_POST['admin_notes']) : ''; $paymentRef = isset($_POST['payment_reference']) ? sanitize($_POST['payment_reference']) : ''; $paymentMode = isset($_POST['payment_mode']) ? sanitize($_POST['payment_mode']) : 'UPI'; $paymentAmount = isset($_POST['payment_amount']) && $_POST['payment_amount'] !== '' ? floatval($_POST['payment_amount']) : null; $disbursalDate = isset($_POST['disbursal_date']) && $_POST['disbursal_date'] !== '' ? sanitize($_POST['disbursal_date']) : null; if (!in_array($newStatus, ['pending', 'processing', 'completed', 'rejected'])) { adminJsonResponse(false, 'Invalid status'); } if ($newStatus === 'completed' && empty($paymentRef)) { adminJsonResponse(false, 'Transaction number is required for completed payments'); } if ($redemptionId && $newStatus) { $result = $auth->updatePartnerRedemptionStatus($redemptionId, $newStatus, $adminNotes, $paymentRef, $admin['id'], $paymentMode, $paymentAmount, $disbursalDate); if ($result === true) { adminJsonResponse(true, 'Partner redemption updated successfully'); } else { adminJsonResponse(false, is_string($result) ? $result : 'Failed to update status'); } } else { adminJsonResponse(false, 'Invalid parameters'); } break; case 'create_admin': $username = isset($_POST['new_username']) ? sanitize($_POST['new_username']) : ''; $email = isset($_POST['new_email']) ? sanitize($_POST['new_email']) : ''; $password = isset($_POST['new_password']) ? $_POST['new_password'] : ''; $fullName = isset($_POST['new_full_name']) ? sanitize($_POST['new_full_name']) : ''; $role = isset($_POST['new_role']) ? sanitize($_POST['new_role']) : 'admin'; if ($username && $email && $password && $fullName) { $success = $auth->createAdmin($username, $email, $password, $fullName, $role); adminJsonResponse($success, $success ? 'Admin user created successfully' : 'Failed to create admin user (username or email may already exist)'); } else { adminJsonResponse(false, 'All fields are required'); } break; // USER MANAGEMENT ACTIONS (super_admin only) case 'create_user': if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; } $uName = isset($_POST['full_name']) ? trim($_POST['full_name']) : ''; $uEmail = isset($_POST['email']) ? trim(strtolower($_POST['email'])) : ''; $uMobile = isset($_POST['mobile']) ? trim($_POST['mobile']) : ''; $uPassword = isset($_POST['password']) ? $_POST['password'] : ''; $uRole = isset($_POST['role']) ? sanitize($_POST['role']) : 'admin'; $uTabs = isset($_POST['allowed_tabs']) ? implode(',', $_POST['allowed_tabs']) : 'all'; $uTicketTypes = isset($_POST['allowed_ticket_types']) ? implode(',', $_POST['allowed_ticket_types']) : 'all'; if (empty($uName) || empty($uEmail) || empty($uPassword)) { adminJsonResponse(false, 'Name, email and password are required.'); break; } if (strlen($uPassword) < 6) { adminJsonResponse(false, 'Password must be at least 6 characters.'); break; } $result = $auth->createAdmin($uEmail, $uEmail, $uPassword, $uName, $uRole, $uMobile, $uTabs, $uTicketTypes); adminJsonResponse($result['success'], $result['message']); break; case 'update_user': if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; } $uId = isset($_POST['user_id']) ? intval($_POST['user_id']) : 0; $uName = isset($_POST['full_name']) ? trim($_POST['full_name']) : ''; $uEmail = isset($_POST['email']) ? trim(strtolower($_POST['email'])) : ''; $uMobile = isset($_POST['mobile']) ? trim($_POST['mobile']) : ''; $uRole = isset($_POST['role']) ? sanitize($_POST['role']) : 'admin'; $uTabs = isset($_POST['allowed_tabs']) ? implode(',', $_POST['allowed_tabs']) : 'all'; $uTicketTypes = isset($_POST['allowed_ticket_types']) ? implode(',', $_POST['allowed_ticket_types']) : 'all'; $uPassword = isset($_POST['password']) && !empty($_POST['password']) ? $_POST['password'] : null; if (!$uId || empty($uName) || empty($uEmail)) { adminJsonResponse(false, 'Name and email are required.'); break; } if ($uPassword && strlen($uPassword) < 6) { adminJsonResponse(false, 'Password must be at least 6 characters.'); break; } $result = $auth->updateAdmin($uId, $uName, $uEmail, $uMobile, $uRole, $uTabs, $uTicketTypes, $uPassword); adminJsonResponse($result['success'], $result['message']); break; case 'toggle_user_status': if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; } $uId = isset($_POST['user_id']) ? intval($_POST['user_id']) : 0; if ($uId) { $success = $auth->toggleAdminStatus($uId); adminJsonResponse($success, $success ? 'Status toggled successfully' : 'Cannot change this user\'s status'); } else { adminJsonResponse(false, 'Invalid user ID'); } break; default: adminJsonResponse(false, 'Invalid action'); } } // If admin is logged in, get data if ($auth->isLoggedIn()) { $admin = $auth->getCurrentAdmin(); $isSuperAdmin = ($admin['role'] === 'super_admin'); $allowedTicketTypes = $auth->getAllowedTicketTypes(); // Get current tab $currentTab = isset($_GET['tab']) ? sanitize($_GET['tab']) : 'tickets'; // Enforce tab permissions (users tab = super_admin only) if ($currentTab === 'users' && !$isSuperAdmin) $currentTab = 'tickets'; if (!$isSuperAdmin && !$auth->hasTabAccess($currentTab)) { // Fallback to first allowed tab $allTabs = ['tickets','redemptions','partner_redemptions']; $currentTab = 'tickets'; foreach ($allTabs as $t) { if ($auth->hasTabAccess($t)) { $currentTab = $t; break; } } } // Get filters from URL $statusFilter = isset($_GET['status']) ? sanitize($_GET['status']) : null; $priorityFilter = isset($_GET['priority']) ? sanitize($_GET['priority']) : null; $senderTypeFilter = isset($_GET['sender_type']) ? sanitize($_GET['sender_type']) : null; $dateFilter = isset($_GET['date_filter']) ? sanitize($_GET['date_filter']) : null; $page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1; $limit = 25; $offset = ($page - 1) * $limit; // Get specific ticket if viewing one $viewTicketId = isset($_GET['ticket']) ? intval($_GET['ticket']) : null; $viewTicket = null; $ticketMessages = []; $messageAttachments = []; if ($viewTicketId) { $viewTicket = $auth->getTicketById($viewTicketId); if ($viewTicket) { $ticketMessages = $auth->getTicketMessages($viewTicketId, true); // Load attachments for all messages if ($supportHelperLoaded && !empty($ticketMessages)) { try { $db = new Database(); $pdo = $db->getConnection(); $msgIds = array_column($ticketMessages, 'id'); if (!empty($msgIds)) { $messageAttachments = getAttachmentsForMessages($pdo, $msgIds); } } catch (Exception $e) { $messageAttachments = []; } } } } // Get specific redemption if viewing one $viewRedemptionId = isset($_GET['redemption']) ? intval($_GET['redemption']) : null; $viewRedemption = null; if ($viewRedemptionId) { if ($currentTab === 'partner_redemptions') { $viewRedemption = $auth->getPartnerRedemptionById($viewRedemptionId); } else { $viewRedemption = $auth->getRedemptionById($viewRedemptionId); } } // Get data based on current tab if ($currentTab === 'redemptions') { $redemptions = $auth->getAllRedemptions($statusFilter, $dateFilter, $limit, $offset); $redemptionStats = $auth->getRedemptionStats(); } elseif ($currentTab === 'partner_redemptions') { $partnerRedemptions = $auth->getAllPartnerRedemptions($statusFilter, $dateFilter, $limit, $offset); $partnerRedemptionStats = $auth->getPartnerRedemptionStats(); } elseif ($currentTab === 'users' && $isSuperAdmin) { $allAdminUsers = $auth->getAllAdminUsersDetailed(); $editUserId = isset($_GET['edit_user']) ? intval($_GET['edit_user']) : null; $editUser = $editUserId ? $auth->getAdminById($editUserId) : null; } else { $tickets = $auth->getAllTickets($statusFilter, $priorityFilter, $senderTypeFilter, $limit, $offset, $allowedTicketTypes); $ticketStats = $auth->getTicketStats($allowedTicketTypes); } $adminUsers = $auth->getAdminUsers(); } ?> Support - Relevant Reflex
RELEVANT REFLEXADMIN PANEL isLoggedIn()): ?>
isLoggedIn()): ?>

Admin Login

Total Tickets
Open
Pending
Resolved
Member
Partner
Client
Total Redemptions
Pending
Processing
Completed
Pending Amount
Total Requests
Pending
Processing
Completed
Pending Amount
Total Users
$u['status'] === 'active')); ?>
Active
$u['role'] === 'super_admin')); ?>
Super Admins
$u['role'] === 'admin')); ?>
Admins

Ticket:

Partner Details:
Company:
Code:
Contact:
Email:
Client Details:
Company:
Client Code:
Contact Person:
Email:

User:

Status:

Priority:

Created:

Conversation
Internal

'; foreach ($messageAttachments[$message['id']] as $att) { $ext = strtolower(pathinfo($att['original_name'], PATHINFO_EXTENSION)); if (in_array($ext, ['jpg','jpeg','png','gif','webp'])) $icon = 'fa-file-image'; elseif ($ext === 'pdf') $icon = 'fa-file-pdf'; elseif (in_array($ext, ['doc','docx'])) $icon = 'fa-file-word'; elseif (in_array($ext, ['xls','xlsx','csv'])) $icon = 'fa-file-excel'; else $icon = 'fa-file-alt'; $sizeMB = number_format(($att['file_size'] ?? 0) / 1024 / 1024, 1); echo ' ' . htmlspecialchars($att['original_name']) . ' (' . $sizeMB . ' MB)'; } echo '
'; } } ?>
No Tickets Found

No support tickets match your current filters.

Subject Type From Priority Status Date Msgs
Back to Redemptions

Redemption Request Details

Request ID:

User:

Amount:

Points: points

UPI ID:

Status:

Created:

Processed:

Processed by:

Txn Ref:

Payment Mode:

Disbursal Date:

Admin Notes:
User Points Summary:
Current Balance: points | Total Earned: points | Total Redeemed: points
No Redemptions Found

No redemption requests match your current filters.

Request ID User Amount Points UPI Status Date
by
Back to Partner Redemptions

Partner Redemption Details PARTNER

Request ID:

Amount:

UPI ID:

Transaction No:

Paid Amount:

Status:

Created:

Payment Mode:

Disbursal Date:

Processed:

Partner Details:
Company:
Code:
Contact:
Email:
Mobile:

Commission Balance: ₹
Total Earned: ₹
Total Redeemed: ₹
Signups: (Verified: )
Admin Notes:
Rejection Reason:
No Partner Redemptions Found

No partner redemption requests match your current filters.

Request ID Partner Amount UPI Status Date
PARTNER
Back to Users
Edit User:
No Users Found
Name Email Mobile Role Menu Access Ticket Types Status Last Login
SUPER ADMIN ADMIN All'; } else { $tabMap = ['tickets'=>'Tickets','redemptions'=>'M. Payouts','partner_redemptions'=>'P. Payouts']; foreach (explode(',', $tabs) as $t) { echo '' . ($tabMap[trim($t)] ?? trim($t)) . ' '; } } ?> All'; } else { foreach (explode(',', $types) as $t) { $t = trim($t); echo '' . ucfirst($t) . ' '; } } ?> Active Inactive
-------------------- END OF FILE -------------------- FILE: RR com/articles.php TYPE: PHP SIZE: 28.79 KB ------------------------------------------------------------ Survey Tips, Guides & Articles for India | Relevant Reflex

Articles & Guides

Honest advice, tips and guides to help you earn more from paid surveys in India.

New in April 2026
Earning Guide
April 9, 2026  ·  10 min read

Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?

An honest breakdown based on real data from 50,000+ members — beginner to experienced earnings tables, per-survey payouts, and the 5 factors that determine your income.

Read Article →
Platform Review
April 9, 2026  ·  11 min read

Is Relevant Reflex Legit? Honest Review with Real UPI Payment Proofs (2026)

We review our own platform honestly — real payout data, member experiences, ratings across 6 dimensions, and a clear-eyed look at our limitations.

Read Article →
Comparison
April 9, 2026  ·  13 min read

Best Paid Survey Sites in India That Actually Pay in 2026 (Honest Comparison)

Side-by-side comparison of Relevant Reflex, Swagbucks, Toluna, ySense and OpinionWorld — UPI support, minimum payouts, survey volume, pros and cons.

Read Article →
For Students
April 9, 2026  ·  10 min read

Online Surveys India for Students: Earn Pocket Money in College (2026)

Why college students are a valued survey demographic, how to fit surveys into your schedule, what you can realistically earn, and UPI payout tips for students.

Read Article →
For Homemakers
April 10, 2026  ·  10 min read

Online Surveys India for Housewives: Work From Home and Earn in 2026

Why homemakers receive high-value surveys, a practical daily schedule, realistic earnings of ₹1,000–₹3,500/month, and how UPI payout works for financial independence.

Read Article →
Earlier Articles
Complete Guide
April 13, 2026  ·  12 min read

How to Earn Money with Online Surveys in India: The Complete Guide (2026)

Everything you need to know — what surveys are, how much you earn, step-by-step how to start, and pro tips from a platform with 50,000+ verified members.

Read Article →
Avoiding Scams
December 15, 2024  ·  8 min read

How to Identify Genuine Survey Websites in India

Key indicators of legitimate platforms, red flags of scams, and how to verify a survey site before joining. Essential reading for anyone starting with online surveys.

Read Article →
Tips & Tricks
December 10, 2024  ·  7 min read

5 Ways to Maximise Your Survey Earnings in India

Practical strategies to increase your monthly income — profile optimisation, timing, platform selection, and the profiler survey habit that most members overlook.

Read Article →
Getting Started
December 5, 2024  ·  9 min read

Complete Guide for Survey Beginners in India

From registration to your first UPI payout — choosing the right platforms, setting up your profile, understanding survey types, and payment methods in India.

Read Article →
Maximize Earnings
November 28, 2024  ·  8 min read

Realistic Earning Expectations from Surveys in India

Set proper expectations — beginners ₹500–₹1,500/month, active users ₹2,000–₹4,000/month. What factors determine where you fall and how to move up.

Read Article →
India Specific
November 20, 2024  ·  9 min read

Best Survey Platforms for Indian Users

Overview of platforms that work best for Indian users — payment methods, survey availability, UPI support, and which ones suit different types of members.

Read Article →
Tips & Tricks
November 15, 2024  ·  6 min read

Time Management Tips for Survey Takers in India

How to balance survey participation with your daily routine — when to check, how to prioritise higher-paying surveys, and habits that make consistent earners.

Read Article →

Ready to Start Earning?

Join 50,000+ Indians already earning with Relevant Reflex. Free to join — UPI payments — ₹500 minimum payout.

Join Free Today How It Works
-------------------- END OF FILE -------------------- FILE: RR com/check-session.php TYPE: PHP SIZE: 976 B ------------------------------------------------------------ checkSessionTimeout(120); $isValid = isLoggedIn(); $user = null; if ($isValid) { $user = getCurrentUser(); // If user doesn't exist or is not active, invalidate session if (!$user || $user['status'] !== 'active') { logout(); $isValid = false; } } echo json_encode([ 'valid' => $isValid, 'user_id' => $isValid ? $user['id'] : null, 'email' => $isValid ? $user['email'] : null, 'timestamp' => time() ]); } catch (Exception $e) { logError('Session check error', ['error' => $e->getMessage()]); echo json_encode([ 'valid' => false, 'error' => 'Session check failed', 'timestamp' => time() ]); } ?> -------------------- END OF FILE -------------------- FILE: RR com/close-project-rewards.php TYPE: PHP SIZE: 20.69 KB ------------------------------------------------------------ mailed incentive: member gets higher amount (survey took longer) * - If actual LOI incentive < mailed incentive: member keeps original promise (can't reduce) * - Final reward = max(mailed_incentive, actual_loi_incentive) * * POINTS CONVERSION: * - 1 point = ₹0.50 (i.e. ₹1 = 2 points) * - All incentive calculations are in rupees first, then converted to points for crediting * * Place in: /public_html/close-project-rewards.php * Called by: clients/close-project.php when project status changes to "Closed" */ // Conversion rate: 1 point = ₹0.50, so ₹1 = 2 points define('POINTS_PER_RUPEE', 2); /** * Calculate incentive from LOI (same formula used in send-invitations.php) * Base ₹10 + ₹1 per minute beyond 5 minutes * Returns value in RUPEES */ function calculateIncentiveFromLOI($loiMinutes) { $base = 10; $extra = max(0, floor($loiMinutes) - 5); return $base + $extra; } /** * Convert rupees to points */ function rupeesToPoints($rupees) { return round($rupees * POINTS_PER_RUPEE); } function processProjectCloseRewards($projectNumericId, $shopPdo = null, $panelPdo = null) { $summary = [ 'members_rewarded' => 0, 'total_member_points' => 0, 'total_member_rupees' => 0, 'affiliates_rewarded' => 0, 'total_affiliate_commission' => 0, 'incentive_note' => '', 'errors' => [] ]; try { // Get DB connections if ($shopPdo === null) { if (function_exists('getClientDBConnection')) { $shopPdo = getClientDBConnection(); } elseif (function_exists('getDBConnection')) { $shopPdo = getDBConnection(); } else { throw new Exception('No shop database connection available'); } } if ($panelPdo === null) { if (function_exists('getPanelDBConnection')) { $panelPdo = getPanelDBConnection(); } else { $summary['errors'][] = 'No panel DB connection - member points not credited'; $panelPdo = null; } } // Get project details $stmt = $shopPdo->prepare("SELECT * FROM projects WHERE id = ?"); $stmt->execute([$projectNumericId]); $project = $stmt->fetch(); if (!$project) { $summary['errors'][] = 'Project not found'; return $summary; } $projectCode = $project['project_id']; // e.g. RRIT130226001 $eloi = (int)($project['eloi'] ?? 0); // ===================================================== // CALCULATE ACTUAL AVG LOI FOR THE PROJECT // ===================================================== $actualAvgLoiMinutes = 0; try { $stmt = $shopPdo->prepare(" SELECT AVG(actual_loi_seconds) as avg_loi_seconds, SUM(CASE WHEN actual_loi_seconds IS NOT NULL THEN 1 ELSE 0 END) as with_loi FROM survey_urls WHERE project_id = ? AND status = 'complete' AND quality_flag = 'valid' "); $stmt->execute([$projectCode]); $loiStats = $stmt->fetch(); if ($loiStats && $loiStats['with_loi'] > 0 && $loiStats['avg_loi_seconds'] > 0) { $actualAvgLoiMinutes = round($loiStats['avg_loi_seconds'] / 60, 1); } else { // Fallback to ELOI if no actual LOI data $actualAvgLoiMinutes = $eloi; } } catch (Exception $e) { $actualAvgLoiMinutes = $eloi; } // Calculate actual-LOI-based incentive (in RUPEES) $actualLoiIncentive = calculateIncentiveFromLOI($actualAvgLoiMinutes); // Determine reward per complete from project level (in RUPEES) $rewardPerComplete = floatval($project['reward_per_complete'] ?? 0); // Get all selections for this project $stmt = $shopPdo->prepare("SELECT * FROM project_selections WHERE project_id = ?"); $stmt->execute([$projectNumericId]); $selections = $stmt->fetchAll(); if (empty($selections)) { $summary['errors'][] = 'No selections found'; return $summary; } foreach ($selections as $selection) { $selectionId = $selection['id']; // ===================================================== // DETERMINE MAILED (ORIGINAL) INCENTIVE (in RUPEES) // ===================================================== $mailedIncentive = $rewardPerComplete > 0 ? $rewardPerComplete : floatval($selection['reward_per_complete'] ?? 0); if ($mailedIncentive <= 0) { $mailedIncentive = floatval($selection['incentive_amount'] ?? 0); } // ===================================================== // APPLY INCENTIVE MODEL: max(mailed, actual_loi_based) // Both values are in RUPEES // ===================================================== $finalRewardRupees = max($mailedIncentive, $actualLoiIncentive); // Convert RUPEES to POINTS (₹1 = 2 points) $finalRewardPoints = rupeesToPoints($finalRewardRupees); // Determine the reason/note $rewardNote = ''; if ($actualLoiIncentive > $mailedIncentive && $mailedIncentive > 0) { $rewardNote = ' (Adjusted up: survey avg LOI ' . $actualAvgLoiMinutes . ' min exceeded estimate, incentive increased from ₹' . number_format($mailedIncentive, 0) . ' to ₹' . number_format($finalRewardRupees, 0) . ')'; $summary['incentive_note'] = 'Actual avg LOI (' . $actualAvgLoiMinutes . ' min) exceeded estimate (' . $eloi . ' min). Member incentive adjusted upward.'; } elseif ($actualLoiIncentive < $mailedIncentive && $mailedIncentive > 0) { $rewardNote = ' (Original promised incentive maintained despite lower avg LOI)'; if (empty($summary['incentive_note'])) { $summary['incentive_note'] = 'Actual avg LOI (' . $actualAvgLoiMinutes . ' min) was lower than estimate (' . $eloi . ' min). Original promised incentive of ₹' . number_format($mailedIncentive, 0) . ' maintained for members.'; } } if ($finalRewardRupees <= 0) { $summary['errors'][] = "Selection #{$selectionId}: no reward set - skipping member rewards"; } // Find all selection_members with sample_status = 'complete' $stmt = $shopPdo->prepare(" SELECT sm.* FROM selection_members sm WHERE sm.selection_id = ? AND sm.sample_status = 'complete' "); $stmt->execute([$selectionId]); $completeMembers = $stmt->fetchAll(); foreach ($completeMembers as $member) { $userId = $member['user_id']; try { // ======================================== // 1. CREDIT MEMBER SURVEY REWARD // ======================================== if ($finalRewardRupees > 0 && $panelPdo !== null) { // Check if already credited $alreadyCredited = false; try { $stmt = $shopPdo->prepare("SELECT id FROM survey_rewards_log WHERE user_id = ? AND project_id = ?"); $stmt->execute([$userId, $projectCode]); $alreadyCredited = (bool)$stmt->fetch(); } catch (Exception $e) { /* table might not exist */ } if (!$alreadyCredited) { // Log in shop DB (store POINTS) try { $stmt = $shopPdo->prepare(" INSERT INTO survey_rewards_log (user_id, project_id, selection_id, points_awarded, status) VALUES (?, ?, ?, ?, 'pending') "); $stmt->execute([$userId, $projectCode, $selectionId, $finalRewardPoints]); } catch (Exception $e) { error_log("survey_rewards_log insert: " . $e->getMessage()); } // Credit POINTS in panel DB $stmt = $panelPdo->prepare(" UPDATE user_points SET points = points + ?, total_earned = total_earned + ? WHERE user_id = ? "); $stmt->execute([$finalRewardPoints, $finalRewardPoints, $userId]); if ($stmt->rowCount() === 0) { $stmt = $panelPdo->prepare(" INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ? "); $stmt->execute([$userId, $finalRewardPoints, $finalRewardPoints, $finalRewardPoints, $finalRewardPoints]); } // Add transaction record (POINTS) with LOI adjustment note $txnDesc = 'Survey reward: ' . $projectCode . ' - ' . $project['project_name'] . ' (₹' . number_format($finalRewardRupees, 2) . ' = ' . $finalRewardPoints . ' pts)' . $rewardNote; $stmt = $panelPdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id) VALUES (?, 'earned', ?, 'survey_reward', ?, ?) "); $stmt->execute([$userId, $finalRewardPoints, $txnDesc, $projectCode]); // Update survey_responses in panel DB // incentive_amount = RUPEES (what was promised), points_awarded = POINTS try { $stmt = $panelPdo->prepare(" INSERT INTO survey_responses (user_id, project_id, selection_id, status, incentive_amount, points_awarded, reward_status, completed_at) VALUES (?, ?, ?, 'complete', ?, ?, 'pending', NOW()) ON DUPLICATE KEY UPDATE points_awarded = ?, reward_status = 'pending' "); $stmt->execute([$userId, $projectCode, $selectionId, $finalRewardRupees, $finalRewardPoints, $finalRewardPoints]); } catch (Exception $e) { /* non-critical */ } // Update selection_members points_awarded (POINTS) try { $stmt = $shopPdo->prepare("UPDATE selection_members SET points_awarded = ? WHERE selection_id = ? AND user_id = ?"); $stmt->execute([$finalRewardPoints, $selectionId, $userId]); } catch (Exception $e) { /* non-critical */ } $summary['members_rewarded']++; $summary['total_member_points'] += $finalRewardPoints; $summary['total_member_rupees'] += $finalRewardRupees; } } // ========================================== // 2. CREDIT AFFILIATE REVENUE SHARE // ========================================== $stmt = $shopPdo->prepare(" SELECT a.id as affiliate_id, a.signup_reward FROM affiliate_signups asu JOIN affiliates a ON asu.affiliate_id = a.id WHERE asu.panel_user_id = ? AND asu.email_verified = 1 LIMIT 1 "); $stmt->execute([$userId]); $affiliateLink = $stmt->fetch(); if ($affiliateLink) { $affiliateId = $affiliateLink['affiliate_id']; $revenueShare = 0; // Try survey_reward column first try { $stmt = $shopPdo->prepare("SELECT survey_reward FROM affiliates WHERE id = ?"); $stmt->execute([$affiliateId]); $row = $stmt->fetch(); $revenueShare = floatval($row['survey_reward'] ?? 0); } catch (Exception $e) { /* column might not exist */ } // Fallback: revenue_share_per_survey if ($revenueShare <= 0) { try { $stmt = $shopPdo->prepare("SELECT revenue_share_per_survey FROM affiliates WHERE id = ?"); $stmt->execute([$affiliateId]); $row = $stmt->fetch(); $revenueShare = floatval($row['revenue_share_per_survey'] ?? 0); } catch (Exception $e) { /* column might not exist */ } } // Fallback: percentage of member reward (use RUPEE value) if ($revenueShare <= 0 && $finalRewardRupees > 0) { $commPct = floatval($project['affiliate_commission_pct'] ?? 10); $revenueShare = round($finalRewardRupees * ($commPct / 100), 2); } if ($revenueShare > 0) { $alreadyCredited = false; try { $stmt = $shopPdo->prepare(" SELECT id FROM partner_commission_log WHERE affiliate_id = ? AND type = 'survey_revenue_share' AND reference_id = ? AND panel_user_id = ? "); $stmt->execute([$affiliateId, $projectCode, $userId]); $alreadyCredited = (bool)$stmt->fetch(); } catch (Exception $e) { /* table might not exist */ } if (!$alreadyCredited) { try { $stmt = $shopPdo->prepare(" INSERT INTO partner_commission_log (affiliate_id, type, amount, reference_id, panel_user_id, description) VALUES (?, 'survey_revenue_share', ?, ?, ?, ?) "); $stmt->execute([$affiliateId, $revenueShare, $projectCode, $userId, 'Survey revenue share: ' . $projectCode . ' - ' . $project['project_name']]); } catch (Exception $e) { error_log("partner_commission_log insert: " . $e->getMessage()); } $stmt = $shopPdo->prepare(" UPDATE affiliates SET total_commission_earned = total_commission_earned + ?, commission_balance = commission_balance + ? WHERE id = ? "); $stmt->execute([$revenueShare, $revenueShare, $affiliateId]); $summary['affiliates_rewarded']++; $summary['total_affiliate_commission'] += $revenueShare; } } } // ========================================== // 3. CREDIT MEMBER REFERRAL SURVEY COMMISSION // ========================================== // Check if this user was referred by another member if ($panelPdo !== null) { try { $refStmt = $panelPdo->prepare(" SELECT id, referrer_user_id FROM member_referral_clicks WHERE referee_user_id = ? AND email_verified = 1 LIMIT 1 "); $refStmt->execute([$userId]); $refRow = $refStmt->fetch(); if ($refRow && $refRow['referrer_user_id'] != $userId) { $mReferrerId = $refRow['referrer_user_id']; $surveyCommPts = 10; // Rs.5 = 10 points $surveyCommRs = 5.00; // Prevent double crediting for same user+project $dupCheck = $panelPdo->prepare(" SELECT COUNT(*) as cnt FROM point_transactions WHERE user_id = ? AND source = 'member_referral_survey' AND reference_id = ? AND description LIKE ? "); $dupCheck->execute([$mReferrerId, $projectCode, '%uid:'.$userId.'%']); $dupRow = $dupCheck->fetch(); if ($dupRow['cnt'] == 0) { // Award points to referrer $panelPdo->prepare(" INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ? ")->execute([$mReferrerId, $surveyCommPts, $surveyCommPts, $surveyCommPts, $surveyCommPts]); $panelPdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id, created_at) VALUES (?, 'earned', ?, 'member_referral_survey', ?, ?, NOW()) ")->execute([ $mReferrerId, $surveyCommPts, 'Survey referral reward: your referral completed ' . $projectCode . ' (₹5 = 10 pts, uid:' . $userId . ')', $projectCode ]); // Update survey_commission_earned on the click record $panelPdo->prepare(" UPDATE member_referral_clicks SET survey_commission_earned = survey_commission_earned + ? WHERE id = ? ")->execute([$surveyCommRs, $refRow['id']]); } } } catch (Exception $e) { $summary['errors'][] = "Member referral survey commission (user {$userId}): " . $e->getMessage(); } } } catch (Exception $e) { $summary['errors'][] = "User {$userId}: " . $e->getMessage(); } } } } catch (Exception $e) { $summary['errors'][] = $e->getMessage(); } return $summary; } ?> -------------------- END OF FILE -------------------- FILE: RR com/config.php TYPE: PHP SIZE: 3.88 KB ------------------------------------------------------------ connection = new PDO( "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4", DB_USER, DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ] ); } catch (PDOException $e) { error_log("Database connection failed: " . $e->getMessage()); die("Connection failed. Please try again later."); } } public function getConnection() { return $this->connection; } } // Utility functions function sanitize($data) { return htmlspecialchars(strip_tags(trim($data)), ENT_QUOTES, 'UTF-8'); } function generateSecureToken($length = 64) { return bin2hex(random_bytes($length / 2)); } function hashPassword($password) { return password_hash($password, PASSWORD_DEFAULT); } function verifyPassword($password, $hash) { return password_verify($password, $hash); } function validateEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) && preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email); } function validatePassword($password) { // At least 8 characters return strlen($password) >= 8; } function validateDateOfBirth($dob) { $date = DateTime::createFromFormat('Y-m-d', $dob); if (!$date) return false; // Check if user is at least 18 years old $today = new DateTime(); $age = $today->diff($date)->y; return $age >= 18; } function validatePostcode($postcode) { // Indian postal code validation (6 digits) return preg_match('/^[0-9]{6}$/', $postcode); } // JSON response helper function jsonResponse($success, $message, $data = null) { header('Content-Type: application/json'); echo json_encode([ 'success' => $success, 'message' => $message, 'data' => $data ]); exit; } // Error logging function function logError($message, $context = []) { $logMessage = date('Y-m-d H:i:s') . ' - ' . $message; if (!empty($context)) { $logMessage .= ' - Context: ' . json_encode($context); } error_log($logMessage . PHP_EOL, 3, 'errors.log'); } ?> -------------------- END OF FILE -------------------- FILE: RR com/contact.php TYPE: PHP SIZE: 25.44 KB ------------------------------------------------------------ $name, 'email' => $email, 'subject' => $subject, 'message' => substr($message, 0, 100) . '...' ]); $success_message = 'Thank you for your message! We\'ll get back to you within 24 hours.'; // Clear form data $_POST = []; } } ?> Contact Relevant Reflex | Survey Platform Support India

Email Support

Get help with your account, payments, or technical issues.

support@relevantreflex.com

WhatsApp Support

Message us on WhatsApp for quick support. We typically respond within 24 hours on business days (Mon–Sat, 9am–6pm IST).

Chat on WhatsApp

Update the number in contact.php before going live.

Our Location

Ethirmedu, NH 544
Tamilnadu - 638183
India

Serving All of India

Send Us a Message

Thank you for contacting us!

We'll review your message and get back to you as soon as possible.

Send Another Message Go to Dashboard

Frequently Asked Questions

How long does it take to get approved?

Account approval is typically instant after email verification. You can start taking surveys immediately after verifying your email address.

When do I get paid for completed surveys?

Payments are processed according to each survey provider's schedule. Most rewards are credited within 2-5 business days after survey completion.

Why was I disqualified from a survey?

Survey disqualifications happen when your profile doesn't match the target demographic. This is normal and helps ensure survey quality. Keep trying - there are surveys for all profiles!

How can I increase my survey opportunities?

Complete your profile thoroughly, answer profiling questions honestly, and check your dashboard regularly for new opportunities.

Is Relevant Reflex really free to join?

Yes! Joining Relevant Reflex is completely free. We never charge fees to our members. Legitimate survey companies pay YOU for your opinions, not the other way around.

-------------------- END OF FILE -------------------- FILE: RR com/dashboard.php TYPE: PHP SIZE: 70.42 KB ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('DB failed: ' . $e->getMessage()); die('System error.'); } // Award onboarding points if (!$user['onboarding_points_awarded']) { try { $pdo->beginTransaction(); $pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, 10.00, 10.00) ON DUPLICATE KEY UPDATE points = points + 10.00, total_earned = total_earned + 10.00")->execute([$user['id']]); $pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', 10.00, 'onboarding', 'Welcome bonus for joining Relevant Reflex')")->execute([$user['id']]); $pdo->prepare("UPDATE users SET onboarding_points_awarded = 1 WHERE id = ?")->execute([$user['id']]); $pdo->commit(); $user = getCurrentUser(); } catch (Exception $e) { $pdo->rollback(); } } $userPoints = ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; try { $stmt = $pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$user['id']]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {} $profilerSections = ['personal_background'=>'Personal Background','household_family'=>'Household & Family','shopping_lifestyle'=>'Shopping & Lifestyle','technology_digital'=>'Technology & Digital','travel_transportation'=>'Travel & Transportation','health_fitness'=>'Health & Fitness','entertainment_media'=>'Entertainment & Media','food_dining'=>'Food & Dining','financial_services'=>'Financial Services','communication_payments'=>'Communication & Payments','household_classification'=>'Household Classification (ISEC)']; $profilerCompletion = []; try { $stmt = $pdo->prepare("SELECT section, completion_percentage, is_completed, points_awarded FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) $profilerCompletion[$row['section']] = $row; } catch (Exception $e) {} $completedSections = 0; foreach ($profilerSections as $k => $n) { if (isset($profilerCompletion[$k]) && $profilerCompletion[$k]['is_completed']) $completedSections++; } $mobileVerified = false; $mobileNumber = ''; try { $stmt = $pdo->prepare("SELECT mobile_number, is_verified FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $md = $stmt->fetch(); if ($md) { $mobileVerified = $md['is_verified']; $mobileNumber = $md['mobile_number']; } } catch (Exception $e) {} $upiId = ''; try { $stmt = $pdo->prepare("SELECT response FROM user_profiler WHERE user_id = ? AND section = 'profile' AND question_id = 'upi_id'"); $stmt->execute([$user['id']]); $ud = $stmt->fetch(); if ($ud) $upiId = json_decode($ud['response'], true); } catch (Exception $e) {} $panNumber = ''; $panName = ''; $panStatus = ''; try { $stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = 'profile' AND question_id IN ('pan_number','pan_name','pan_status')"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) { $val = json_decode($row['response'], true); if ($row['question_id'] === 'pan_number') $panNumber = $val ?: ''; elseif ($row['question_id'] === 'pan_name') $panName = $val ?: ''; elseif ($row['question_id'] === 'pan_status') $panStatus = $val ?: ''; } if (!empty($panNumber) && empty($panStatus)) $panStatus = 'pending'; } catch (Exception $e) {} if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_upi') { $newUpiId = isset($_POST['upi_id']) ? sanitize($_POST['upi_id']) : ''; if (!empty($newUpiId) && preg_match('/^[\w\.\-]+@[\w\.\-]+$/', $newUpiId)) { try { $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'upi_id', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j = json_encode($newUpiId); $stmt->execute([$user['id'], $j, $j]); $upiId = $newUpiId; $success_message = "UPI ID updated successfully!"; } catch (Exception $e) { $error_message = "Error updating UPI ID."; } } else { $error_message = "Please enter a valid UPI ID (e.g., yourname@paytm)."; } } if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_pan') { $newPanNumber = strtoupper(trim($_POST['pan_number'] ?? '')); $newPanName = trim($_POST['pan_name'] ?? ''); if (!empty($newPanNumber) && preg_match('/^[A-Z]{5}[0-9]{4}[A-Z]$/', $newPanNumber) && !empty($newPanName) && strlen($newPanName) >= 3) { try { $pdo->beginTransaction(); $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_number', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j = json_encode($newPanNumber); $stmt->execute([$user['id'], $j, $j]); $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_name', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j2 = json_encode($newPanName); $stmt->execute([$user['id'], $j2, $j2]); // Reset status to pending on any edit (admin must re-approve) $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_status', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j3 = json_encode('pending'); $stmt->execute([$user['id'], $j3, $j3]); $pdo->commit(); $panNumber = $newPanNumber; $panName = $newPanName; $panStatus = 'pending'; $success_message = "PAN details saved successfully! Verification is pending."; } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); $error_message = "Error saving PAN details."; } } else { $error_message = "Invalid PAN. Must be 10 characters (e.g., ABCDE1234F) and name must be at least 3 characters."; } } $userTickets = []; try { $stmt = $pdo->prepare("SELECT st.*, (SELECT COUNT(*) FROM support_messages sm WHERE sm.ticket_id = st.id) as message_count, (SELECT sm.created_at FROM support_messages sm WHERE sm.ticket_id = st.id ORDER BY sm.created_at DESC LIMIT 1) as last_reply FROM support_tickets st WHERE st.user_id = ? ORDER BY st.created_at DESC LIMIT 10"); $stmt->execute([$user['id']]); $userTickets = $stmt->fetchAll(); } catch (Exception $e) {} $userRedemptions = []; try { $stmt = $pdo->prepare("SELECT * FROM redemption_requests WHERE user_id = ? ORDER BY created_at DESC LIMIT 5"); $stmt->execute([$user['id']]); $userRedemptions = $stmt->fetchAll(); } catch (Exception $e) {} // Survey history from shop DB $surveys = []; $surveyStats = ['total'=>0,'completes'=>0,'pending'=>0,'flagged'=>0]; try { $shopPdo = new PDO("mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4","u752449863_rradmin","S@n@h2016",[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]); $cols = array_column($shopPdo->query("SHOW COLUMNS FROM survey_urls")->fetchAll(), 'Field'); $hasQF = in_array('quality_flag', $cols); $hasLoi = in_array('actual_loi_seconds', $cols); $hasCompAt = in_array('completed_at', $cols); $hasQN = in_array('quality_notes', $cols); $pcols = array_column($shopPdo->query("SHOW COLUMNS FROM projects")->fetchAll(), 'Field'); $hasCS = in_array('closure_status', $pcols); $hasSP = in_array('speedster_threshold_pct', $pcols); $qf = $hasQF ? "su.quality_flag" : "'valid' as quality_flag"; $qn = $hasQN ? "su.quality_notes" : "NULL as quality_notes"; $loi = $hasLoi ? "su.actual_loi_seconds" : "NULL as actual_loi_seconds"; $cat = $hasCompAt ? "su.completed_at" : "NULL as completed_at"; $cs = $hasCS ? "p.closure_status" : "'none' as closure_status"; $sp = $hasSP ? "p.speedster_threshold_pct" : "33.33 as speedster_threshold_pct"; $stmt = $shopPdo->prepare(" SELECT su.status as url_status, su.clicked_at, su.created_at as sent_at, su.rr_proxy_url, $qf, $qn, $loi, $cat, p.project_id, p.project_name, p.eloi, p.industry, p.status as project_status, $cs, $sp FROM survey_urls su INNER JOIN projects p ON su.project_id = p.project_id WHERE su.sent_to_user_id = ? AND su.status NOT IN ('available') ORDER BY su.created_at DESC LIMIT 30 "); $stmt->execute([$user['id']]); $surveys = $stmt->fetchAll(); foreach ($surveys as $s) { $surveyStats['total']++; if ($s['url_status']==='complete') { $surveyStats['completes']++; $q=$s['quality_flag']??'valid'; if (in_array($q,['speedster','ip_duplicate','client_flagged'])) $surveyStats['flagged']++; elseif ($s['project_status']!=='Closed') $surveyStats['pending']++; } } } catch (Exception $e) { error_log("Survey stats: ".$e->getMessage()); } // Compute actionable surveys (can be taken right now) $actionableSurveys = []; foreach ($surveys as $s) { if (in_array($s['url_status'], ['sent','clicked']) && $s['project_status'] === 'Live' && !empty($s['rr_proxy_url'])) $actionableSurveys[] = $s; } $actionableCount = count($actionableSurveys); $firstActionable = $actionableCount > 0 ? $actionableSurveys[0] : null; // Get survey-related point transactions from panel DB $surveyPointsByProject = []; try { $stmt = $pdo->prepare("SELECT reference_id, points, description, created_at FROM point_transactions WHERE user_id = ? AND source IN ('survey','survey_reward') AND transaction_type = 'earned' ORDER BY created_at DESC"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) { if ($row['reference_id']) $surveyPointsByProject[$row['reference_id']] = $row; } } catch (Exception $e) {} // Get full rewards history for Rewards tab $rewardsHistory = []; try { $stmt = $pdo->prepare("SELECT transaction_type, points, source, description, reference_id, status, created_at FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT 50"); $stmt->execute([$user['id']]); $rewardsHistory = $stmt->fetchAll(); } catch (Exception $e) {} $joinDateFormatted = (new DateTime($user['created_at']))->format('M Y'); $profilePct = round(($completedSections / count($profilerSections)) * 100); $firstName = htmlspecialchars($user['first_name'] ?? explode('@',$user['email'])[0]); $initials = strtoupper(substr($user['first_name']??$user['email'],0,1).substr($user['last_name']??'',0,1)); if (strlen($initials)<2) $initials = strtoupper(substr($user['email'],0,2)); function getSurveyLabel($s) { $st=$s['url_status']; $qf=$s['quality_flag']??'valid'; $ps=$s['project_status']; if ($st==='sent') return ['Invited','label-neutral','You have been invited to this survey. Click "Take Survey" below to participate.']; if ($st==='clicked') return ['In Progress','label-warn','You started this survey but haven\'t completed it yet. Click "Continue Survey" below to resume.']; if (in_array($st,['earlyscreenout','latescreenout'])) return ['Screened Out','label-neutral','You did not qualify based on screening criteria.']; if ($st==='quotafull') return ['Quota Full','label-neutral','The survey quota was filled before your response was recorded.']; if ($st==='timeout') return ['Timed Out','label-neutral','Session expired before completion.']; if ($st==='partial') return ['Partial','label-info','Your response was partially recorded.']; if ($st==='complete') { if (in_array($qf,['speedster','ip_duplicate','client_flagged'])) return ['Under Review','label-danger','Flagged for quality review. Points held pending admin decision.']; if ($ps==='Closed') return ['Approved','label-ok','Survey approved. Check Rewards tab for credited points.']; return ['Pending Approval','label-warn','Completed successfully. Points will credit when the project closes.']; } return [ucfirst($st),'label-neutral','']; } function fmtLoi($s){if(!$s)return'-';$m=floor($s/60);$ss=$s%60;return($m?$m.'m ':'').$ss.'s';} function fmtDt($d){if(!$d)return'-';return date('M d, Y g:i A',strtotime($d));} ?> Member Area - Relevant Reflex
Overview
English
English Default
Hindi हिन्दी
Bengali বাংলা
Telugu తెలుగు
Marathi मराठी
Tamil தமிழ்
Urdu اردو
Gujarati ગુજરાતી
Kannada ಕನ್ನಡ
Odia ଓଡ଼ିଆ
Malayalam മലയാളം
pts
Refer a Friend
0): ?>
— In Progress
min
Surveys Waiting For You!
Don't miss out — complete them to earn points new
No surveys available right now
We'll notify you when new surveys match your profile
None Available

Welcome back, !

Complete your profile, earn points, and participate in paid surveys.

Important! Read 4 essential rules before taking any survey to protect your account and earn maximum rewards.
Available Points
value
Surveys Done
total
Profile
%
sections
Total Earned
Since
🎁
Invite Friends & Earn Cash!
Get ₹5 when they join + ₹5 for every survey they complete
Share & Earn
Complete Profile
Earn up to 70 points
Redeem Rewards
Convert points to cash
Get Help
Support & FAQs
⚠ Read This Before You Take Any Survey
4 essential rules to protect your account and earn maximum rewards
1
Take your time. Read every question carefully. There are no right or wrong answers — we want your genuine opinion. Think about each question and answer what you truly feel. Surveys that are rushed through too quickly get automatically flagged and your response may be rejected without reward.
2
One attempt per person, per device. Each survey can only be taken once from your IP address or device. Duplicate attempts are automatically detected and flagged. Do not try to retake a survey using a different browser, incognito mode, or VPN — it will be caught and may result in account action.
3
Do not straightline your responses. Straightlining means selecting the same answer option for every question in a row (e.g., choosing "Agree" for all statements). This is a well-known indicator of low-quality responses and is flagged by our system. Only select the same answer repeatedly if that genuinely reflects your opinion.
4
Give thoughtful answers to open-ended questions. When a survey asks you to type your opinion or explain something in your own words, write a genuine, meaningful response. Vague, gibberish, or nonsensical text (e.g., random letters, copy-pasted filler, or irrelevant answers) will be flagged. Responses containing such text will be marked invalid and the completion will not count — no points will be awarded.
Why this matters: Research clients review every response for quality. Flagged responses (speeding, duplicates, straightlining, or gibberish open-ended answers) are rejected and no points are awarded. Repeated violations may lead to fewer survey invitations or account restrictions.
Complete your profile for more surveys. done. Continue →
0):?>
Total
Completed
Pending
0?'Under Review':'Approved';?>
0?$surveyStats['flagged']:$surveyStats['completes']-$surveyStats['pending']-$surveyStats['flagged'];?>
How it works: Click any survey to see full details. Completed surveys are reviewed when the project closes. Points are credited once approved. "Under Review" means quality concerns (e.g., LOI below minimum threshold). = normal LOI, = slow, = below threshold.
Survey History
$s): list($lbl,$cls,$desc)=getSurveyLabel($s); $eloiSec = intval($s['eloi']??0)*60; $thPct = floatval($s['speedster_threshold_pct']??33.33); $thSec = $eloiSec>0 ? $eloiSec*($thPct/100) : 0; $aLoi = $s['actual_loi_seconds'] ? intval($s['actual_loi_seconds']) : null; $loiPct = ($eloiSec>0 && $aLoi) ? min(100,round(($aLoi/$eloiSec)*100)) : 0; $loiCls = 'loi-ok'; if ($aLoi && $thSec>0 && $aLoi<$thSec) $loiCls='loi-fast'; elseif ($loiPct>150) $loiCls='loi-slow'; $pts = $surveyPointsByProject[$s['project_id']] ?? null; $rewardTxt = '-'; if ($s['url_status']==='complete') { if ($pts) $rewardTxt = number_format($pts['points'],0).' pts (₹'.number_format($pts['points']*0.5,2).')'; elseif (($s['quality_flag']??'valid')!=='valid') $rewardTxt = 'Held for review'; elseif ($s['project_status']==='Closed') $rewardTxt = 'Awaiting credit'; else $rewardTxt = 'Pending project closure'; } ?>
· ·
Invited On
Started At
Completed At
Your LOI
Expected LOI
min
Min Required LOI
0 ? fmtLoi(round($thSec)).' ('.$thPct.'%)' : '-';?>
Project Status
Reward

No surveys yet.

📊

No Surveys Yet

Complete your profile to receive survey invitations.

Know Me Better

Complete all sections to earn up to 70 points!

done
Mobile Verification
10 ptsVerify Now
$sn):$c=$profilerCompletion[$sk]??null;$d=$c&&$c['is_completed'];$pct=$c?$c['completion_percentage']:0;$pa=$c&&$c['points_awarded'];$ic=$d?'done':($pct>0?'part':'empty');$isISEC=$sk==='household_classification';$sectionPts=$isISEC?20:5;$rv=$sectionPts*0.5;$sectionRs=($rv==floor($rv))?number_format($rv,0):number_format($rv,2);?>
':round($pct).'%';?>
IMPORTANT
0?'In progress':($isISEC?'Required for survey matching':'Not started'));?>
ptsView>0?'Continue':'Start · ₹'.$sectionRs);?>
Available
Total Earned
Redeemed
Redeem Points
=500 && !empty($upiId)):?>

Minimum: 500 points (₹250). Cash via UPI to

Redeem Now =500 && empty($upiId)):?>
You have crossed the minimum redemption amount but have not updated your UPI ID in the Profile section. Please add your UPI ID first.
Update UPI in Profile
Need 500 points (₹250) minimum. You have more needed.
Recent Redemptions
# · pts → ₹
to ·
Paid via · Ref: ·
Rewards History
No rewards yet. Complete your profile and participate in surveys to earn points!
pts
Account
Email
Gender
Date of Birth
Postcode
Status
Active Verified
Mobile
+91 verified
Not verified
Verify
UPI Details

For reward payments.

e.g. yourname@paytm, yourname@phonepe
UPI:
PAN Details

Required for processing rewards and filing TDS records with the Income Tax Department.

Members with verified PAN are prioritized by clients for paid surveys & higher-value projects.
PAN Verified ()
PAN Rejected — Please re-submit with correct details.
Pending Verification ()
10-character PAN (e.g. ABCDE1234F)
Must match your PAN card exactly
-------------------- END OF FILE -------------------- FILE: RR com/default.php TYPE: PHP SIZE: 15.99 KB ------------------------------------------------------------ Default page

You Are All Set to Go!

All you have to do now is upload your website files and start your journey. Check out how to do that below:

-------------------- END OF FILE -------------------- FILE: RR com/disclaimer.php TYPE: PHP SIZE: 17.26 KB ------------------------------------------------------------ Earnings Disclaimer - Relevant Reflex | Important Information About Survey Rewards
Last Updated: March 2026
Important Notice: Please read this Earnings Disclaimer carefully before joining or using Relevant Reflex. Participation in our survey platform does not guarantee any specific level of income or earnings.

1. No Guaranteed Earnings

Relevant Reflex is an online survey platform that connects registered members with paid market research opportunities. We do not guarantee that you will earn any specific amount of money by participating in surveys on our platform.

Earnings from surveys are supplemental in nature and are not intended to replace a primary source of income. The amount you earn depends on many factors that are beyond our control.

2. Factors That Affect Earnings

Your actual earnings will vary based on a number of factors, including but not limited to:

  • The number and types of surveys available at any given time
  • Your demographic profile and how well it matches available survey requirements
  • The frequency and consistency of your participation
  • Your survey qualification rate (not all respondents qualify for every survey)
  • The time you invest in completing surveys
  • Survey availability in your geographic region
  • The specific research needs of our survey clients at any time

3. Member Testimonials and Income Examples

Any testimonials, earnings examples, or income figures shared on this website — including those from our members — represent individual results and are not typical. These are provided for illustrative purposes only.

Typical Results Disclaimer: The earnings mentioned in member stories and example income ranges on this site reflect individual experiences and do not represent average or typical results. Most members earn modest supplemental income. Your results will vary based on your demographics, time commitment, and survey availability.

We do not make any representation that the earnings experiences described by any member are typical, and individual results will vary significantly.

4. Survey Availability Is Not Guaranteed

The availability of surveys on our platform depends on the requirements of our research clients. We cannot guarantee:

  • A minimum number of surveys per day, week, or month
  • Consistent survey availability throughout the year
  • That you will qualify for every survey you attempt
  • That surveys will remain open until you complete them

5. Payment and Reward Terms

Rewards are subject to the payment terms and conditions set out in our Terms and Conditions. Rewards are paid via UPI transfer upon reaching the minimum payout threshold of ₹500. Payment timing is subject to verification and processing periods.

6. Not Financial or Professional Advice

Nothing on the Relevant Reflex website, including this page, constitutes financial advice, investment advice, or professional guidance of any kind. Survey participation is a supplemental earning activity only.

7. Contact Us

If you have any questions about this Earnings Disclaimer, please contact us at:

support@relevantreflex.com
Ethirmedu, NH 544, Tamilnadu - 638183, India

-------------------- END OF FILE -------------------- FILE: RR com/doubts.php TYPE: PHP SIZE: 29.35 KB ------------------------------------------------------------ How Online Surveys Work in India | Relevant Reflex

Getting Started is Easy

Follow these simple steps to start earning money with surveys today!

1

Sign Up Free

Create your account with basic information. It takes less than 2 minutes and is completely free.

Sign Up Now
2

Verify Email

Check your email and click the verification link to activate your account and unlock survey opportunities.

3

Complete Profile

Fill out your profile thoroughly to get matched with surveys that fit your demographics and interests.

4

Start Earning

Browse available surveys, complete them honestly, and start earning rewards for your valuable opinions!

View Surveys

Pro Tips for Success

Provide Genuine Details

When you signup, DO NOT provide fake details. Provide your correct details including your gender, age, occupation, company, region etc. Since online paid surveys are sent to almost all age and gender categories and profile types, when you fake your profile, you might not get what you usually get for your actual profile.

Complete Profiler Surveys

Provide as many details as possible about you in the profiler section. This includes your gaming profile, income range, automobile assets, real estate assets, electronics you own and so on. When you attend more profiler surveys, you get more and more surveys related to all these. When you have only a generic profile and not completed the profiler surveys, you will get only those surveys which are based on age and gender.

Choose Languages You Know

Choose the languages that you know. Some people try surveys in other languages. Since you can't translate and understand all languages, you might end up taking more time on the survey than usual duration. When you take such a long duration on any survey, the system might mark you as a fraudulent user.

Be Patient

When you get screened out of many surveys, it means that the survey is not meant for your profile. This also means that there will be surveys targeting you in the future. So, KEEP PARTICIPATING in as many surveys as possible.

Log In Daily

Login every day to see if you have any surveys. Check your mail daily to know if you have any survey invitations. When you don't check the mail or login daily, other users will complete those surveys sooner and you might not get a chance to complete the survey.

Important Guidelines

Avoid Survey Fraud

Never use automated tools, VPNs, or provide inconsistent answers. This can result in account suspension and loss of rewards.

One Account Per Person

Maintain only one account per person. Multiple accounts from the same household or IP address may result in disqualification.

Complete Surveys Promptly

Don't leave surveys incomplete for long periods. Complete them in a reasonable timeframe to maintain your quality score.

Understanding Survey Types

Opinion Surveys

Share your thoughts on products, services, brands, and current topics. These are the most common type of surveys.

5-20 minutes

Product Testing

Test products at home and provide detailed feedback. Higher rewards but limited availability.

1-2 weeks

Focus Groups

Join group discussions on specific topics. These offer the highest rewards but are invitation-only.

1-2 hours

Profile Surveys

Complete these to help us match you with more relevant surveys. Essential for maximizing opportunities.

2-5 minutes

Member Experiences

Real experiences from real people using Relevant Reflex

"Consistent earnings over time"

"I follow all the tips mentioned here and participate regularly. The key is patience and honesty in responses. It's a genuine platform."

- Rajesh K., Software Engineer, Mumbai ✓ Verified Member
"Perfect for students"

"As a college student, this platform helps me earn useful pocket money. I complete surveys between classes and it has been a great experience so far."

- Anjali R., Student, Pune ✓ Verified Member
"Reliable supplemental income"

"Been using Relevant Reflex for over a year. It gives me a reliable supplemental income on the side. Highly recommended for anyone with spare time!"

- Meena T., Homemaker, Bangalore ✓ Verified Member

Disclaimer: These are individual member experiences. Earnings are not guaranteed and will vary based on survey availability, demographic profile, and individual participation. See our Earnings Disclaimer.

Need Help Getting Started?

Our support team is here to help you succeed with online surveys!

-------------------- END OF FILE -------------------- FILE: RR com/email.php TYPE: PHP SIZE: 18.12 KB ------------------------------------------------------------ getVerificationEmailTemplate($verificationUrl); $textBody = $this->getVerificationEmailText($verificationUrl); return $this->sendEmail($email, $subject, $htmlBody, $textBody); } public function sendPasswordResetEmail($email, $token) { $resetUrl = SITE_URL . "/reset-password.php?token=" . $token; $subject = "Password reset request for your Relevant Reflex account"; $htmlBody = $this->getPasswordResetEmailTemplate($resetUrl); $textBody = $this->getPasswordResetEmailText($resetUrl); return $this->sendEmail($email, $subject, $htmlBody, $textBody); } private function sendEmail($to, $subject, $htmlBody, $textBody = '') { $payload = [ 'personalizations' => [[ 'to' => [['email' => $to]], 'subject' => $subject ]], 'from' => ['email' => $this->fromEmail, 'name' => $this->fromName], 'reply_to' => ['email' => 'support@relevantreflex.com', 'name' => 'Relevant Reflex Support'], 'content' => [ ['type' => 'text/plain', 'value' => $textBody ?: strip_tags($htmlBody)], ['type' => 'text/html', 'value' => $htmlBody] ], 'headers' => [ 'List-Unsubscribe' => '', 'List-Unsubscribe-Post' => 'List-Unsubscribe=One-Click', 'X-Mailer' => 'Relevant Reflex Mailer' ], 'categories' => ['transactional', 'member-verification'], 'tracking_settings' => [ 'click_tracking' => ['enable' => false], 'open_tracking' => ['enable' => true] ] ]; $ch = curl_init('https://api.sendgrid.com/v3/mail/send'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $this->apiKey, 'Content-Type: application/json' ], CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => true ]); $response = curl_exec($ch); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($statusCode === 202) { return true; } else { error_log("SendGrid email failed to $to: HTTP $statusCode — $response"); return false; } } // ----------------------------------------------------------------------- // PLAIN TEXT VERSIONS // ----------------------------------------------------------------------- private function getVerificationEmailText($verificationUrl) { return "Relevant Reflex — Email Verification ====================================== Thank you for registering with Relevant Reflex. To activate your account, please verify your email address by visiting the link below: " . $verificationUrl . " This verification link expires in 7 days. If you did not create an account with Relevant Reflex, please ignore this email. Need help? Contact us at support@relevantreflex.com — The Relevant Reflex Team relevantreflex.com"; } private function getPasswordResetEmailText($resetUrl) { return "Relevant Reflex — Password Reset ================================== We received a request to reset the password for your Relevant Reflex account. To set a new password, visit the link below: " . $resetUrl . " This link expires in 1 hour. If you did not request a password reset, please ignore this email — your password will not be changed. Need help? Contact us at support@relevantreflex.com — The Relevant Reflex Team relevantreflex.com"; } // ----------------------------------------------------------------------- // HTML TEMPLATES // ----------------------------------------------------------------------- private function getVerificationEmailTemplate($verificationUrl) { return ' Verify Your Email - Relevant Reflex
'; } private function getPasswordResetEmailTemplate($resetUrl) { return ' Password Reset - Relevant Reflex

Relevant Reflex

India\'s Trusted Survey Platform

Password Reset Request

We received a request to reset the password for your Relevant Reflex account. Click the button below to set a new password.

Reset My Password

Note: This password reset link expires in 1 hour. If you did not request this, please ignore it — your password will not change.

If the button above does not work, copy and paste the link below into your browser:

' . $resetUrl . '

 

This is a transactional email sent by Relevant Reflex in response to a password reset request.

Need help? support@relevantreflex.com

'; } } -------------------- END OF FILE -------------------- FILE: RR com/errors.log TYPE: LOG SIZE: 0 B ------------------------------------------------------------ -------------------- END OF FILE -------------------- FILE: RR com/fix-rupee.php TYPE: PHP SIZE: 5.34 KB ------------------------------------------------------------ Rupee Fix"; echo "

Rupee Symbol Fix Script

"; if ($dryRun) { echo "

DRY RUN MODE - No changes will be made. Add &apply=yes to URL to apply fixes.

"; } else { echo "

APPLYING FIXES

"; } // The broken sequence: ₹ is what ₹ looks like when UTF-8 bytes are read as Latin1 // UTF-8 for ₹ (U+20B9) is: 0xE2 0x82 0xB9 // When read as Latin1: â (0xE2) ‚ (0x82) ¹ (0xB9) = ₹ $brokenRupee = "\xC3\xA2\xC2\x82\xC2\xB9"; // Double-encoded UTF-8 $brokenRupee2 = "₹"; // As it appears in source $replacement = "₹"; // HTML entity for ₹ - works everywhere // Files to check (relative to this script's directory) $baseDir = __DIR__; $files = [ 'about.php', 'admin-support.php', 'articles.php', 'dashboard.php', 'doubts.php', 'index.php', 'points-manager.php', 'profiler.php', 'redemption.php', 'signup.php', 'terms.php', 'partners/data-sync.php', 'partners/members.php', 'partners/partner-config.php', 'partners/partner-dashboard.php', 'partners/redemptions.php', ]; $totalFixed = 0; echo ""; echo ""; foreach ($files as $relPath) { $fullPath = $baseDir . '/' . $relPath; if (!file_exists($fullPath)) { echo ""; continue; } $content = file_get_contents($fullPath); // Count occurrences of both patterns $count1 = substr_count($content, $brokenRupee); $count2 = substr_count($content, $brokenRupee2); $totalCount = max($count1, $count2); // They may overlap, take the higher count // Also check for raw ₹ that might work but could break during file transfer $rawRupee = "\xE2\x82\xB9"; // Actual UTF-8 bytes for ₹ $rawCount = substr_count($content, $rawRupee); if ($totalCount === 0 && $rawCount === 0) { echo ""; continue; } if ($totalCount > 0) { if (!$dryRun) { // Replace both patterns $newContent = str_replace($brokenRupee, $replacement, $content); $newContent = str_replace($brokenRupee2, $replacement, $newContent); // Also replace raw ₹ with entity for safety $newContent = str_replace($rawRupee, $replacement, $newContent); // Don't double-replace: if ₹ already exists, don't touch it // (the replacements above won't create doubles since we're replacing different patterns) file_put_contents($fullPath, $newContent); echo ""; } else { echo ""; } $totalFixed += $totalCount; } elseif ($rawCount > 0) { if (!$dryRun) { $newContent = str_replace($rawRupee, $replacement, $content); file_put_contents($fullPath, $newContent); echo ""; } else { echo ""; } $totalFixed += $rawCount; } } echo "
FileOccurrencesStatus
$relPath-File not found (skip)
$relPath0Clean
$relPath$totalCount brokenFIXED ✓
$relPath$totalCount brokenWill fix
$relPath$rawCount raw ₹Converted to entity ✓
$relPath$rawCount raw ₹Will convert to entity
"; echo "

Total replacements: $totalFixed

"; if ($dryRun) { echo "

Apply Fixes Now

"; } else { echo "

IMPORTANT: Delete this file now! rm fix-rupee.php

"; } echo ""; -------------------- END OF FILE -------------------- FILE: RR com/forgot-password.php TYPE: PHP SIZE: 10.35 KB ------------------------------------------------------------ getConnection(); } catch (Exception $e) { logError('Database connection failed in forgot-password.php: ' . $e->getMessage()); jsonResponse(false, 'System error. Please try again later.'); } // Get and sanitize email $email = isset($_POST['email']) ? sanitize($_POST['email']) : ''; // Validation if (empty($email)) { jsonResponse(false, 'Please provide your email address.'); } if (!validateEmail($email)) { jsonResponse(false, 'Please provide a valid email address.'); } try { // Check if user exists and is verified $stmt = $pdo->prepare(" SELECT id, email, email_verified, status FROM users WHERE email = ? "); $stmt->execute([$email]); $user = $stmt->fetch(); if (!$user) { // For security, don't reveal if email exists or not jsonResponse(true, 'If an account with this email exists, you will receive a password reset link shortly.'); } if (!$user['email_verified']) { jsonResponse(false, 'Please verify your email address first before resetting your password.'); } if ($user['status'] !== 'active') { jsonResponse(false, 'Your account is currently ' . $user['status'] . '. Please contact support for assistance.'); } // Check if there's already a recent reset request (prevent spam) $stmt = $pdo->prepare(" SELECT created_at FROM password_resets WHERE email = ? AND created_at > DATE_SUB(NOW(), INTERVAL 5 MINUTE) ORDER BY created_at DESC LIMIT 1 "); $stmt->execute([$email]); $recentReset = $stmt->fetch(); if ($recentReset) { jsonResponse(false, 'A password reset email was already sent recently. Please wait a few minutes before requesting another one.'); } // Generate reset token $resetToken = generateSecureToken(); $expiresAt = date('Y-m-d H:i:s', strtotime('+' . PASSWORD_RESET_EXPIRY_HOURS . ' hours')); // Delete any existing reset tokens for this email $stmt = $pdo->prepare("DELETE FROM password_resets WHERE email = ?"); $stmt->execute([$email]); // Insert new reset token $stmt = $pdo->prepare(" INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, ?) "); $stmt->execute([$email, $resetToken, $expiresAt]); // Send password reset email $emailHandler = new EmailHandler(); $emailSent = $emailHandler->sendPasswordResetEmail($email, $resetToken); if ($emailSent) { logError('Password reset email sent', ['email' => $email]); jsonResponse(true, 'Password reset link has been sent to your email address. Please check your inbox and follow the instructions.'); } else { logError('Failed to send password reset email', ['email' => $email]); jsonResponse(false, 'Failed to send password reset email. Please try again later or contact support.'); } } catch (PDOException $e) { logError('Database error during password reset request', [ 'error' => $e->getMessage(), 'email' => $email ]); jsonResponse(false, 'System error. Please try again later.'); } catch (Exception $e) { logError('General error during password reset request', [ 'error' => $e->getMessage(), 'email' => $email ]); jsonResponse(false, 'An unexpected error occurred. Please try again later.'); } } ?> Forgot Password - Relevant Reflex

Reset Your Password

Enter your email address and we'll send you a link to reset your password.

-------------------- END OF FILE -------------------- FILE: RR com/google7106e441233c8b50.html TYPE: HTML SIZE: 53 B ------------------------------------------------------------ google-site-verification: google7106e441233c8b50.html -------------------- END OF FILE -------------------- FILE: RR com/gtag.php TYPE: PHP SIZE: 362 B ------------------------------------------------------------ -------------------- END OF FILE -------------------- FILE: RR com/index.php TYPE: PHP SIZE: 31.03 KB ------------------------------------------------------------ Paid Surveys India | Earn Money with Online Surveys — Relevant Reflex
You have been logged out successfully. Thank you for using Relevant Reflex!

Welcome back, ! 👋

Ready to participate in surveys? Check out your personalized dashboard for new opportunities.

Earn Rewards with Online Surveys in India

Join thousands of Indians who take paid surveys online and earn rewards for sharing their opinions. Our online surveys India platform connects you with genuine market research opportunities. Survey availability and earnings vary by member profile.

100% Free to Join
Verified Payments
Flexible Timing
India-Focused Surveys
Online Surveys India

Your Survey Dashboard

Access your personalized survey opportunities and track your earnings.

Active Account Status
Profile
Verified
50,000+ Active Members
₹25,00,000+ Rewards Paid
1,000+ Surveys Completed Daily
UPI Direct Payments

Earnings Disclaimer: Results vary. Earnings from surveys are supplemental and not guaranteed. Individual results depend on survey availability, your demographic profile, and participation frequency. See our Earnings Disclaimer for full details.

Why Choose Relevant Reflex?

We're a trusted platform for paid surveys and online surveys in India, dedicated to providing genuine market research earning opportunities.

Trusted & Secure

Your data is protected with industry-standard security measures. We never sell your personal information.

Verified Payments

Rewards transferred via UPI after survey completion and validation.

Flexible Schedule

Take surveys whenever you want, from anywhere. Perfect for students, professionals, and homemakers.

India-Focused

Surveys specifically designed for Indian consumers. Your opinions matter for local and international brands.

Mobile Friendly

Take surveys on your smartphone, tablet, or computer. Our platform works seamlessly across all devices.

24/7 Support

Our dedicated support team is here to help you with any questions or issues you may have.

What Our Members Say

Join thousands of satisfied members who are earning money with Relevant Reflex.

"I've been using Relevant Reflex for 6 months and it helps me cover small expenses. The surveys are interesting and payments are always on time!"
- Priya S., Mumbai
✓ Verified Member   January 2025
"Great platform for students like me. I can take surveys between classes and earn pocket money easily."
- Rahul K., Delhi
✓ Verified Member   February 2025
"Professional platform with genuine surveys. I appreciate how they respect my time and opinions."
- Sneha M., Bangalore
✓ Verified Member   March 2025

Testimonials from real members. Individual results vary. See our Earnings Disclaimer.

Ready to Start Earning?

Join Relevant Reflex today and participate in genuine paid surveys!

Sign Up for Free

Registration takes less than 2 minutes • 100% Free • No spam guaranteed
Earnings vary by member. See Earnings Disclaimer.

-------------------- END OF FILE -------------------- FILE: RR com/isec-helper.php TYPE: PHP SIZE: 8.81 KB ------------------------------------------------------------ [ 'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'no_formal' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>11,'degree_regular'=>10,'degree_professional'=>10], 'upto_5' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'class_6_9' => ['no_adult'=>12,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'class_10_14' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7], 'degree_regular' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6], 'degree_professional'=> ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>6], ], 'farmer' => [ 'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'no_formal' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>11,'degree_regular'=>10,'degree_professional'=>10], 'upto_5' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'class_6_9' => ['no_adult'=>12,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'class_10_14' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7], 'degree_regular' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6], 'degree_professional'=> ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>5], ], 'worker' => [ 'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>8,'degree_professional'=>8], 'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>8], 'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>7], 'class_6_9' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7], 'class_10_14' => ['no_adult'=>10,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>6,'degree_professional'=>6], 'degree_regular' => ['no_adult'=>8,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>4], 'degree_professional'=> ['no_adult'=>8,'no_formal'=>9,'upto_5'=>7,'class_6_9'=>7,'class_10_14'=>5,'degree_regular'=>3,'degree_professional'=>3], ], 'trader' => [ 'no_adult' => ['no_adult'=>11,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>6,'degree_professional'=>5], 'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>8], 'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>8,'degree_professional'=>7], 'class_6_9' => ['no_adult'=>10,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>5], 'class_10_14' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>4], 'degree_regular' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>6,'degree_regular'=>3,'degree_professional'=>2], 'degree_professional'=> ['no_adult'=>6,'no_formal'=>8,'upto_5'=>6,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>2], ], 'clerical' => [ 'no_adult' => ['no_adult'=>10,'no_formal'=>12,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6], 'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>8], 'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>7], 'class_6_9' => ['no_adult'=>10,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6], 'class_10_14' => ['no_adult'=>8,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>4], 'degree_regular' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>6,'degree_regular'=>4,'degree_professional'=>3], 'degree_professional'=> ['no_adult'=>6,'no_formal'=>8,'upto_5'=>7,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>2], ], 'managerial' => [ 'no_adult' => ['no_adult'=>10,'no_formal'=>12,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>5], 'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>8,'degree_professional'=>6], 'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>6,'degree_professional'=>6], 'class_6_9' => ['no_adult'=>9,'no_formal'=>9,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>6], 'class_10_14' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>5,'degree_regular'=>3,'degree_professional'=>3], 'degree_regular' => ['no_adult'=>6,'no_formal'=>8,'upto_5'=>7,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>1], 'degree_professional'=> ['no_adult'=>5,'no_formal'=>7,'upto_5'=>6,'class_6_9'=>5,'class_10_14'=>3,'degree_regular'=>1,'degree_professional'=>1], ], ]; } /** * Compute ISEC tier from the 3 profiler responses * * @param string $occupation - Occupation code of CWE * @param string $maleEducation - Education code of highest educated male adult * @param string $femaleEducation - Education code of highest educated female adult * @return int|null - ISEC tier (1-12) or null if cannot compute */ function computeISECTier($occupation, $maleEducation, $femaleEducation) { $grid = getISECGrid(); if (isset($grid[$occupation][$maleEducation][$femaleEducation])) { return $grid[$occupation][$maleEducation][$femaleEducation]; } return null; } /** * Get SEC class label from ISEC tier * * @param int $tier - ISEC tier (1-12) * @return string - SEC class (A/B/C/D/E) with description */ function getISECClass($tier) { if ($tier >= 1 && $tier <= 6) return 'A'; if ($tier >= 7 && $tier <= 8) return 'B'; if ($tier >= 9 && $tier <= 10) return 'C'; if ($tier == 11) return 'D'; if ($tier == 12) return 'E'; return null; } /** * Get full SEC class label with description */ function getISECClassLabel($tier) { $labels = [ 'A' => 'SEC A — High', 'B' => 'SEC B — Upper Middle', 'C' => 'SEC C — Middle', 'D' => 'SEC D — Lower Middle', 'E' => 'SEC E — Low', ]; $class = getISECClass($tier); return $class ? $labels[$class] : null; } -------------------- END OF FILE -------------------- FILE: RR com/login.php TYPE: PHP SIZE: 27.43 KB ------------------------------------------------------------ redirectToDashboard(); } $errors = []; $form_data = []; $resend_success = ''; $show_resend = false; $resend_email = ''; // Handle resend verification request if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'resend_verification') { $resend_email = isset($_POST['email']) ? sanitize($_POST['email']) : ''; $form_data['email'] = $resend_email; if (empty($resend_email) || !validateEmail($resend_email)) { $errors[] = 'Please provide a valid email address.'; } else { try { $db = new Database(); $pdo = $db->getConnection(); $clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; // Rate limit: max 3 resend attempts per IP per hour try { $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM registration_attempts WHERE ip_address = ? AND attempt_type = 'resend_verification' AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)"); $stmt->execute([$clientIP]); $attempts = $stmt->fetch(); if ($attempts && $attempts['cnt'] >= 3) { $errors[] = 'Too many resend attempts. Please try again later or contact support.'; } } catch (Exception $e) {} if (empty($errors)) { // Find the user $stmt = $pdo->prepare("SELECT id, email, email_verified, status FROM users WHERE email = ?"); $stmt->execute([$resend_email]); $user = $stmt->fetch(); if (!$user) { // Don't reveal if email exists - show generic success $resend_success = 'If an account with that email exists and is unverified, a new verification link has been sent. Please check your inbox and spam folder.'; } elseif ($user['email_verified']) { $resend_success = 'This email is already verified. You can log in directly.'; } else { // Delete old verification tokens $pdo->prepare("DELETE FROM email_verifications WHERE user_id = ?")->execute([$user['id']]); // Generate new token $verificationToken = generateSecureToken(); $expiresAt = date('Y-m-d H:i:s', strtotime('+' . TOKEN_EXPIRY_HOURS . ' hours')); $stmt = $pdo->prepare("INSERT INTO email_verifications (user_id, token, expires_at, created_at) VALUES (?, ?, ?, NOW())"); $stmt->execute([$user['id'], $verificationToken, $expiresAt]); // Send verification email require_once 'email.php'; $emailHandler = new EmailHandler(); $emailSent = $emailHandler->sendVerificationEmail($resend_email, $verificationToken); if ($emailSent) { logError('Verification email resent', ['user_id' => $user['id'], 'email' => $resend_email]); $resend_success = 'A new verification link has been sent to your email. Please check your inbox and spam folder. The link expires in ' . TOKEN_EXPIRY_HOURS . ' hours.'; } else { logError('Failed to resend verification email', ['user_id' => $user['id'], 'email' => $resend_email]); $errors[] = 'Failed to send verification email. Please try again or contact support@relevantreflex.com.'; } } // Log the attempt try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent) VALUES (?, ?, 'resend_verification', ?, ?)") ->execute([$clientIP, $resend_email, empty($errors) ? 1 : 0, $_SERVER['HTTP_USER_AGENT'] ?? '']); } catch (Exception $e) {} } } catch (Exception $e) { logError('Error in resend verification: ' . $e->getMessage()); $errors[] = 'System error. Please try again later.'; } } } // Handle login form submission if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_POST['action'])) { // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in login.php: ' . $e->getMessage()); $errors[] = 'System error. Please try again later.'; } if (empty($errors)) { // Get and sanitize form data $email = isset($_POST['email']) ? sanitize($_POST['email']) : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; $rememberMe = isset($_POST['remember_me']) ? true : false; // Store email for form repopulation $form_data['email'] = $email; // Validation if (empty($email) || empty($password)) { $errors[] = 'Please provide both email and password.'; } elseif (!validateEmail($email)) { $errors[] = 'Please provide a valid email address.'; } else { try { // Find user by email $stmt = $pdo->prepare(" SELECT id, email, password, email_verified, status, last_login FROM users WHERE email = ? "); $stmt->execute([$email]); $user = $stmt->fetch(); if (!$user) { // Log failed login attempt logError('Login attempt with non-existent email', ['email' => $email]); $errors[] = 'Invalid email or password.'; } elseif (!verifyPassword($password, $user['password'])) { logError('Login attempt with incorrect password', ['email' => $email]); $errors[] = 'Invalid email or password.'; } elseif (!$user['email_verified']) { $errors[] = 'Your email is not yet verified.'; $show_resend = true; $resend_email = $email; } elseif ($user['status'] !== 'active') { $message = 'Your account is currently ' . $user['status'] . '.'; if ($user['status'] === 'suspended') { $message .= ' Please contact support for assistance.'; } $errors[] = $message; } else { // Login successful - create session session_start(); $_SESSION['user_id'] = $user['id']; $_SESSION['user_email'] = $user['email']; $_SESSION['logged_in'] = true; $_SESSION['login_time'] = time(); // Update last login time $stmt = $pdo->prepare("UPDATE users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$user['id']]); // Set remember me cookie if requested (30 days) if ($rememberMe) { $sessionToken = generateSecureToken(); $expiresAt = date('Y-m-d H:i:s', strtotime('+30 days')); // Store session token in database $stmt = $pdo->prepare(" INSERT INTO user_sessions (user_id, session_token, expires_at) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE session_token = VALUES(session_token), expires_at = VALUES(expires_at) "); $stmt->execute([$user['id'], $sessionToken, $expiresAt]); // Set cookie setcookie('remember_token', $sessionToken, time() + (30 * 24 * 60 * 60), '/', '', true, true); } // Clean up expired sessions $pdo->prepare("DELETE FROM user_sessions WHERE expires_at < NOW()")->execute(); // Log successful login logError('User login successful', [ 'user_id' => $user['id'], 'email' => $user['email'], 'remember_me' => $rememberMe ]); // Redirect to dashboard header('Location: dashboard.php'); exit; } } catch (PDOException $e) { logError('Database error during login', [ 'error' => $e->getMessage(), 'email' => $email ]); $errors[] = 'Login failed due to a system error. Please try again later.'; } catch (Exception $e) { logError('General error during login', [ 'error' => $e->getMessage(), 'email' => $email ]); $errors[] = 'An unexpected error occurred. Please try again later.'; } } } } ?> Login - Relevant Reflex Paid Online Surveys India

Login to your Account!

You can take Online paid Surveys, Redeem your reward points and update profile - all in one place.

-------------------- END OF FILE -------------------- FILE: RR com/logout.php TYPE: PHP SIZE: 387 B ------------------------------------------------------------ $user['id'], 'email' => $user['email'] ]); } } // Logout the user logout(); // Redirect to home page with logout message header('Location: index.html?logged_out=1'); exit; ?> -------------------- END OF FILE -------------------- FILE: RR com/mobile-verification.php TYPE: PHP SIZE: 26.42 KB ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in mobile-verification.php: ' . $e->getMessage()); die('System error. Please try again later.'); } $errors = []; $success_message = ''; $step = 'enter_mobile'; // enter_mobile, verify_otp, completed // Allow user to go back to enter_mobile via ?step=enter_mobile (Change Number link) $forceEnterMobile = (isset($_GET['step']) && $_GET['step'] === 'enter_mobile'); // Check if mobile is already verified $mobileData = null; try { $stmt = $pdo->prepare("SELECT mobile_number, is_verified, otp_code, otp_expires_at, verification_attempts FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $mobileData = $stmt->fetch(); if ($mobileData && $mobileData['is_verified']) { $step = 'completed'; } elseif (!$forceEnterMobile && $mobileData && $mobileData['otp_code'] && $mobileData['otp_expires_at'] > date('Y-m-d H:i:s')) { $step = 'verify_otp'; } } catch (Exception $e) { logError('Error fetching mobile verification data', ['user_id' => $user['id'], 'error' => $e->getMessage()]); } // Handle form submissions if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['action'])) { if ($_POST['action'] === 'send_otp') { $mobileNumber = isset($_POST['mobile_number']) ? sanitize($_POST['mobile_number']) : ''; // Validate mobile number if (empty($mobileNumber)) { $errors[] = 'Please enter your mobile number.'; } elseif (!preg_match('/^[6-9]\d{9}$/', $mobileNumber)) { $errors[] = 'Please enter a valid 10-digit mobile number starting with 6, 7, 8, or 9.'; } else { // Check if mobile number is already verified by another user try { $stmt = $pdo->prepare("SELECT user_id FROM mobile_verifications WHERE mobile_number = ? AND is_verified = 1 AND user_id != ?"); $stmt->execute([$mobileNumber, $user['id']]); $existingUser = $stmt->fetch(); if ($existingUser) { $errors[] = 'This mobile number is already verified by another account.'; } else { // Generate OTP $otpCode = sprintf('%06d', mt_rand(100000, 999999)); $otpExpiry = date('Y-m-d H:i:s', strtotime('+10 minutes')); // Store OTP in database $stmt = $pdo->prepare("INSERT INTO mobile_verifications (user_id, mobile_number, otp_code, otp_expires_at, verification_attempts) VALUES (?, ?, ?, ?, 0) ON DUPLICATE KEY UPDATE mobile_number = ?, otp_code = ?, otp_expires_at = ?, verification_attempts = 0, updated_at = NOW()"); $stmt->execute([$user['id'], $mobileNumber, $otpCode, $otpExpiry, $mobileNumber, $otpCode, $otpExpiry]); // Send OTP via 2Factor SMS $smsResult = sendOTPSMS($mobileNumber, $otpCode); if ($smsResult['success']) { logError('OTP sent successfully via 2Factor', [ 'user_id' => $user['id'], 'mobile_number' => $mobileNumber, 'sms_response' => $smsResult['response'] ]); $success_message = 'OTP sent to your mobile number +91-' . $mobileNumber; $step = 'verify_otp'; $mobileData = ['mobile_number' => $mobileNumber]; } else { logError('Failed to send OTP via 2Factor', [ 'user_id' => $user['id'], 'mobile_number' => $mobileNumber, 'error' => $smsResult['message'] ]); $errors[] = 'Failed to send OTP. Please try again or contact support.'; } } } catch (Exception $e) { logError('Error sending OTP', ['user_id' => $user['id'], 'error' => $e->getMessage()]); $errors[] = 'Error sending OTP. Please try again.'; } } } elseif ($_POST['action'] === 'verify_otp') { $inputOtp = isset($_POST['otp_code']) ? trim($_POST['otp_code']) : ''; if (empty($inputOtp) || !preg_match('/^\d{6}$/', $inputOtp)) { $errors[] = 'Please enter a valid 6-digit OTP code.'; } else { try { $stmt = $pdo->prepare("SELECT * FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $storedData = $stmt->fetch(); if (!$storedData) { $errors[] = 'No OTP request found. Please request a new OTP.'; $step = 'enter_mobile'; } elseif ($storedData['otp_expires_at'] < date('Y-m-d H:i:s')) { $errors[] = 'OTP has expired. Please request a new one.'; $step = 'enter_mobile'; } elseif ($storedData['verification_attempts'] >= 5) { $errors[] = 'Too many failed attempts. Please request a new OTP.'; $step = 'enter_mobile'; } elseif ($storedData['otp_code'] !== $inputOtp) { $stmt = $pdo->prepare("UPDATE mobile_verifications SET verification_attempts = verification_attempts + 1 WHERE user_id = ?"); $stmt->execute([$user['id']]); $remaining = 5 - ($storedData['verification_attempts'] + 1); $errors[] = "Incorrect OTP. $remaining attempts remaining."; $step = 'verify_otp'; $mobileData = $storedData; } else { $pdo->beginTransaction(); $stmt = $pdo->prepare("UPDATE mobile_verifications SET is_verified = 1, otp_code = NULL, otp_expires_at = NULL, updated_at = NOW() WHERE user_id = ?"); $stmt->execute([$user['id']]); $pointsStmt = $pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, 10.00, 10.00) ON DUPLICATE KEY UPDATE points = points + 10.00, total_earned = total_earned + 10.00"); $pointsStmt->execute([$user['id']]); $transStmt = $pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', 10.00, 'mobile_verification', 'Mobile number verified')"); $transStmt->execute([$user['id']]); $pdo->commit(); $step = 'completed'; $mobileData = array_merge($storedData, ['is_verified' => 1]); } } catch (Exception $e) { $pdo->rollback(); logError('Error verifying OTP', ['user_id' => $user['id'], 'error' => $e->getMessage()]); $errors[] = 'Error verifying OTP. Please try again.'; } } } elseif ($_POST['action'] === 'resend_otp') { try { $stmt = $pdo->prepare("SELECT mobile_number FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $existing = $stmt->fetch(); if ($existing) { // Generate new OTP $otpCode = sprintf('%06d', mt_rand(100000, 999999)); $otpExpiry = date('Y-m-d H:i:s', strtotime('+10 minutes')); $stmt = $pdo->prepare("UPDATE mobile_verifications SET otp_code = ?, otp_expires_at = ?, verification_attempts = 0, updated_at = NOW() WHERE user_id = ?"); $stmt->execute([$otpCode, $otpExpiry, $user['id']]); // Send SMS using 2Factor $smsResult = sendOTPSMS($existing['mobile_number'], $otpCode); if ($smsResult['success']) { logError('OTP resent successfully via 2Factor', [ 'user_id' => $user['id'], 'mobile_number' => $existing['mobile_number'], 'sms_response' => $smsResult['response'] ]); $success_message = 'New OTP sent to your mobile number +91-' . $existing['mobile_number']; } else { logError('Failed to resend OTP via 2Factor', [ 'user_id' => $user['id'], 'mobile_number' => $existing['mobile_number'], 'error' => $smsResult['message'] ]); $errors[] = 'Failed to resend OTP. Please try again or contact support.'; } $step = 'verify_otp'; $mobileData = $existing; } } catch (Exception $e) { logError('Error resending OTP', ['user_id' => $user['id'], 'error' => $e->getMessage()]); $errors[] = 'Error resending OTP. Please try again.'; } } } } // Get user display info for sidebar $firstName = htmlspecialchars($user['first_name'] ?? explode('@', $user['email'])[0]); $initials = strtoupper(substr($user['first_name'] ?? $user['email'], 0, 1) . substr($user['last_name'] ?? '', 0, 1)); if (strlen($initials) < 2) $initials = strtoupper(substr($user['email'], 0, 2)); $userPoints = ['points' => 0]; try { $stmt = $pdo->prepare("SELECT points FROM user_points WHERE user_id = ?"); $stmt->execute([$user['id']]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {} ?> Mobile Verification - Relevant Reflex
Mobile Verification
pts
Refer a Friend
Enter Mobile
Verify OTP
Done
'; ?>

Enter Your Mobile Number

We'll send a 6-digit OTP to verify your number

+91
Enter a mobile number that you have access to

Enter OTP Code

Sent to +91

OTP is valid for 10 minutes
| Change Number

Mobile Verified!

You earned 10 points!

Your number +91 is verified.

You'll receive survey notifications and updates on this number.

Continue Profile View My Points

Why Verify Your Mobile?

  • Earn 10 Points — instant reward for verification
  • Survey Notifications — receive SMS alerts for new surveys
  • Quick Support — get faster support via WhatsApp
  • Account Security — extra layer of protection
  • Payment Updates — get notified about reward payments
-------------------- END OF FILE -------------------- FILE: RR com/my-surveys.php TYPE: PHP SIZE: 15.73 KB ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } $userId = $user['id']; // Shop DB (survey data) - second connection $surveys = []; try { $shopPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", "u752449863_rradmin", "S@n@h2016", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); // Check which columns exist (defensive - works before and after migration) $cols = []; $colCheck = $shopPdo->query("SHOW COLUMNS FROM survey_urls"); foreach ($colCheck->fetchAll() as $c) { $cols[] = $c['Field']; } $hasQualityFlag = in_array('quality_flag', $cols); $hasActualLoi = in_array('actual_loi_seconds', $cols); $hasCompletedAt = in_array('completed_at', $cols); // Check projects columns $projCols = []; $projColCheck = $shopPdo->query("SHOW COLUMNS FROM projects"); foreach ($projColCheck->fetchAll() as $c) { $projCols[] = $c['Field']; } $hasClosureStatus = in_array('closure_status', $projCols); $hasSpeedsterPct = in_array('speedster_threshold_pct', $projCols); // Build query dynamically based on available columns $qualityFlagCol = $hasQualityFlag ? "su.quality_flag" : "'valid' as quality_flag"; $qualityNotesCol = $hasQualityFlag ? "su.quality_notes" : "NULL as quality_notes"; $actualLoiCol = $hasActualLoi ? "su.actual_loi_seconds" : "NULL as actual_loi_seconds"; $completedAtCol = $hasCompletedAt ? "su.completed_at" : "NULL as completed_at"; $closureStatusCol = $hasClosureStatus ? "p.closure_status" : "'none' as closure_status"; $speedsterPctCol = $hasSpeedsterPct ? "p.speedster_threshold_pct" : "33.33 as speedster_threshold_pct"; $stmt = $shopPdo->prepare(" SELECT su.unique_identifier, su.status as url_status, $qualityFlagCol, $qualityNotesCol, su.clicked_at, $completedAtCol, $actualLoiCol, su.created_at as sent_at, su.batch_number, p.project_id, p.project_name, p.eloi, p.status as project_status, $closureStatusCol, p.closed_at, $speedsterPctCol FROM survey_urls su INNER JOIN projects p ON su.project_id = p.project_id WHERE su.sent_to_user_id = ? AND su.status NOT IN ('available') ORDER BY su.created_at DESC "); $stmt->execute([$userId]); $surveys = $stmt->fetchAll(); } catch (Exception $e) { error_log("My Surveys error: " . $e->getMessage()); } // Determine display status for each survey function getSurveyDisplayStatus($survey) { $urlStatus = $survey['url_status']; $qualityFlag = $survey['quality_flag'] ?? 'valid'; $projectStatus = $survey['project_status']; $closureStatus = $survey['closure_status'] ?? 'none'; if ($urlStatus === 'sent') { return ['label' => 'Invitation Sent', 'class' => 'status-sent', 'desc' => 'You have been invited to this survey. Click the link in your email to participate.']; } if ($urlStatus === 'clicked') { return ['label' => 'In Progress', 'class' => 'status-progress', 'desc' => 'You started this survey. Please complete it before it times out.']; } if (in_array($urlStatus, ['earlyscreenout', 'latescreenout'])) { return ['label' => 'Screened Out', 'class' => 'status-screenout', 'desc' => 'You did not qualify for this survey based on the screening criteria.']; } if ($urlStatus === 'quotafull') { return ['label' => 'Quota Full', 'class' => 'status-quotafull', 'desc' => 'The survey reached its quota before your response was recorded.']; } if ($urlStatus === 'timeout') { return ['label' => 'Timed Out', 'class' => 'status-timeout', 'desc' => 'The survey session expired.']; } if ($urlStatus === 'partial') { return ['label' => 'Partial Complete', 'class' => 'status-partial', 'desc' => 'Your response was partially recorded.']; } // Complete status - check quality and project closure if ($urlStatus === 'complete') { if ($qualityFlag === 'speedster') { return ['label' => 'Under Review - Possible Speedster', 'class' => 'status-review', 'desc' => 'Your completion time was below the minimum threshold. This is under review and pending project closure.']; } if ($qualityFlag === 'ip_duplicate') { return ['label' => 'Under Review - Duplicate Detected', 'class' => 'status-review', 'desc' => 'A duplicate response was detected from your connection. This is under review.']; } if ($qualityFlag === 'client_flagged') { return ['label' => 'Under Review - Flagged by Client', 'class' => 'status-review', 'desc' => 'This response has been flagged for review by the research client. Pending admin approval.']; } // Valid complete if ($projectStatus === 'Closed') { return ['label' => 'Approved - Points Credited', 'class' => 'status-approved', 'desc' => 'Survey completed and approved. Points have been credited to your account.']; } if ($closureStatus === 'pending_review') { return ['label' => 'Completed - Pending Approval', 'class' => 'status-pending', 'desc' => 'Survey completed. The project is under review. Points will be credited once approved.']; } return ['label' => 'Completed - Pending Project Closure', 'class' => 'status-pending', 'desc' => 'Survey completed successfully. Points will be credited when the project is closed by the client.']; } return ['label' => ucfirst($urlStatus), 'class' => 'status-default', 'desc' => '']; } function formatLoi($seconds) { if (!$seconds) return '-'; $min = floor($seconds / 60); $sec = $seconds % 60; return ($min > 0 ? $min . 'm ' : '') . $sec . 's'; } // Count stats $totalSurveys = count($surveys); $completes = 0; $pending = 0; $flagged = 0; foreach ($surveys as $s) { if ($s['url_status'] === 'complete') { $completes++; $qf = $s['quality_flag'] ?? 'valid'; if (in_array($qf, ['speedster', 'ip_duplicate', 'client_flagged'])) { $flagged++; } elseif ($s['project_status'] !== 'Closed') { $pending++; } } } ?> My Surveys - Relevant Reflex

My Survey Participations

Track all your survey invitations, completions, and reward status.

Total Surveys
Completed
Pending Approval
0): ?>
Under Review

No Survey Participations Yet

Once you receive and participate in surveys, your history will appear here.

Complete your profile to start receiving survey invitations.

$survey): $displayStatus = getSurveyDisplayStatus($survey); $eloiSec = intval($survey['eloi'] ?? 0) * 60; $thresholdPct = floatval($survey['speedster_threshold_pct'] ?? 33.33); $thresholdSec = $eloiSec > 0 ? $eloiSec * ($thresholdPct / 100) : 0; $loiPct = ($eloiSec > 0 && $survey['actual_loi_seconds']) ? min(100, round(($survey['actual_loi_seconds'] / $eloiSec) * 100)) : 0; $loiClass = 'loi-green'; if ($survey['actual_loi_seconds'] && $thresholdSec > 0 && $survey['actual_loi_seconds'] < $thresholdSec) $loiClass = 'loi-red'; elseif ($loiPct > 150) $loiClass = 'loi-yellow'; ?>
• LOI:
Expected LOI
minutes
Your LOI
Min Required LOI
0 ? formatLoi(round($thresholdSec)) . ' (' . $thresholdPct . '% of ELOI)' : '-'; ?>
Project Status
-------------------- END OF FILE -------------------- FILE: RR com/partner-support-creation.php TYPE: PHP SIZE: 31.26 KB ------------------------------------------------------------ getConnection(); } catch (Exception $e) { logPartnerActivity('Database connection failed: ' . $e->getMessage()); die('System error. Please try again later.'); } $success_message = ''; $error_message = ''; // Check if viewing a specific ticket $viewTicketId = isset($_GET['ticket']) ? intval($_GET['ticket']) : null; $viewTicket = null; $ticketMessages = []; $messageAttachments = []; // -- Handle ticket reply -- if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['reply_ticket_id'])) { $replyTicketId = intval($_POST['reply_ticket_id']); $replyMessage = isset($_POST['reply_message']) ? trim($_POST['reply_message']) : ''; if (empty($replyMessage)) { $error_message = 'Reply message cannot be empty.'; } elseif (strlen($replyMessage) > 5000) { $error_message = 'Reply must be 5000 characters or less.'; } else { try { $stmt = $pdo->prepare("SELECT id, status FROM support_tickets WHERE id = ? AND sender_type = 'partner' AND sender_id = ?"); $stmt->execute([$replyTicketId, $partner['id']]); $ticket = $stmt->fetch(); if (!$ticket) { $error_message = 'Ticket not found or access denied.'; } elseif ($ticket['status'] === 'closed') { $error_message = 'Cannot reply to a closed ticket.'; } else { $stmt = $pdo->prepare("INSERT INTO support_messages (ticket_id, sender_type, sender_id, message, is_internal) VALUES (?, 'user', ?, ?, 0)"); $stmt->execute([$replyTicketId, $partner['id'], $replyMessage]); $messageId = $pdo->lastInsertId(); // Handle file attachments if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { handleSupportAttachments($pdo, $messageId, $_FILES['attachments']); } // Reopen ticket if resolved/pending if (in_array($ticket['status'], ['resolved', 'pending'])) { $pdo->prepare("UPDATE support_tickets SET status = 'open', updated_at = NOW() WHERE id = ?")->execute([$replyTicketId]); } else { $pdo->prepare("UPDATE support_tickets SET updated_at = NOW() WHERE id = ?")->execute([$replyTicketId]); } $success_message = 'Reply sent successfully!'; $viewTicketId = $replyTicketId; logPartnerActivity('Partner replied to ticket', ['ticket_id' => $replyTicketId]); } } catch (Exception $e) { $error_message = 'Failed to send reply. Please try again.'; logPartnerActivity('Error replying to ticket: ' . $e->getMessage()); } } } // -- Handle ticket creation -- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_POST['reply_ticket_id'])) { $subject = isset($_POST['subject']) ? trim($_POST['subject']) : ''; $message = isset($_POST['message']) ? trim($_POST['message']) : ''; $priority = isset($_POST['priority']) ? $_POST['priority'] : 'medium'; if (empty($subject) || empty($message)) { $error_message = 'Subject and message are required.'; } elseif (strlen($subject) > 255) { $error_message = 'Subject must be 255 characters or less.'; } elseif (strlen($message) > 5000) { $error_message = 'Message must be 5000 characters or less.'; } else { try { $pdo->beginTransaction(); $ticketNumber = 'TKT-' . date('Ymd') . '-' . strtoupper(substr(bin2hex(random_bytes(4)), 0, 6)); // user_id NULL for partner tickets (FK references users table) $stmt = $pdo->prepare("INSERT INTO support_tickets (ticket_number, user_id, sender_type, sender_id, subject, status, priority) VALUES (?, NULL, 'partner', ?, ?, 'open', ?)"); $stmt->execute([$ticketNumber, $partner['id'], $subject, $priority]); $ticketId = $pdo->lastInsertId(); $stmt = $pdo->prepare("INSERT INTO support_messages (ticket_id, sender_type, sender_id, message, is_internal) VALUES (?, 'user', ?, ?, 0)"); $stmt->execute([$ticketId, $partner['id'], $message]); $messageId = $pdo->lastInsertId(); $pdo->commit(); // Handle file attachments if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { handleSupportAttachments($pdo, $messageId, $_FILES['attachments']); } $success_message = "Support ticket created successfully! Ticket Number: $ticketNumber
We will respond to your query shortly."; logPartnerActivity('Support ticket created', ['ticket_number' => $ticketNumber, 'partner_id' => $partner['id'], 'subject' => $subject]); $_POST = []; } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); logPartnerActivity('Error creating support ticket: ' . $e->getMessage()); $error_message = 'Failed to create support ticket. Please try again.'; } } } // -- Load ticket detail if viewing -- if ($viewTicketId) { try { $stmt = $pdo->prepare("SELECT st.*, au.full_name as assigned_to_name FROM support_tickets st LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.id = ? AND st.sender_type = 'partner' AND st.sender_id = ?"); $stmt->execute([$viewTicketId, $partner['id']]); $viewTicket = $stmt->fetch(); if ($viewTicket) { $stmt = $pdo->prepare("SELECT sm.*, CASE WHEN sm.sender_type = 'admin' THEN COALESCE((SELECT full_name FROM admin_users WHERE id = sm.sender_id), 'Support Team') ELSE ? END as sender_name FROM support_messages sm WHERE sm.ticket_id = ? AND sm.is_internal = 0 ORDER BY sm.created_at ASC"); $stmt->execute([$partner['company_name'], $viewTicketId]); $ticketMessages = $stmt->fetchAll(); // Load attachments for all messages if ($supportHelperLoaded && function_exists('getAttachmentsForMessages') && !empty($ticketMessages)) { $msgIds = array_column($ticketMessages, 'id'); $messageAttachments = getAttachmentsForMessages($pdo, $msgIds); } } } catch (Exception $e) { logPartnerActivity('Error loading ticket: ' . $e->getMessage()); } } // -- Load tickets list -- try { $stmt = $pdo->prepare("SELECT st.*, au.full_name as assigned_to_name, (SELECT COUNT(*) FROM support_messages WHERE ticket_id = st.id AND is_internal = 0) as message_count FROM support_tickets st LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.sender_type = 'partner' AND st.sender_id = ? ORDER BY st.created_at DESC"); $stmt->execute([$partner['id']]); $tickets = $stmt->fetchAll(); } catch (Exception $e) { logPartnerActivity('Error fetching tickets: ' . $e->getMessage()); $tickets = []; } // Helper: get file icon class function getPartnerFileIcon($type, $name) { $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION)); if (in_array($ext, ['jpg','jpeg','png','gif','webp'])) return 'fa-file-image'; if ($ext === 'pdf') return 'fa-file-pdf'; if (in_array($ext, ['doc','docx'])) return 'fa-file-word'; if (in_array($ext, ['xls','xlsx','csv'])) return 'fa-file-excel'; return 'fa-file-alt'; } ?> Partners - Relevant Reflex
RELEVANT REFLEXPARTNERS

Conversation

No messages yet.

' : ' '; ?>
'; foreach ($messageAttachments[$msg['id']] as $att) { $icon = getPartnerFileIcon($att['file_type'], $att['original_name']); $sizeMB = number_format(($att['file_size'] ?? 0) / 1024 / 1024, 1); echo ' ' . htmlspecialchars($att['original_name']) . ' (' . $sizeMB . ' MB)'; } echo '
'; } ?>
Send Reply
Max 3 files, 5MB each.
This ticket is closed. If you need further help, please create a new ticket.

Create New Support Ticket

Maximum 5000 characters
Max 3 files, 5MB each. Accepted: Images, PDF, Word, Excel, Text.

Your Support Tickets ()

No tickets yet

You haven't created any support tickets. Create one above if you need assistance.

-------------------- END OF FILE -------------------- FILE: RR com/points-manager.php TYPE: PHP SIZE: 12.56 KB ------------------------------------------------------------ pdo = $db->getConnection(); } /** * Award points to a user */ public function awardPoints($userId, $points, $source, $description, $referenceId = null) { try { $this->pdo->beginTransaction(); // Update user points $stmt = $this->pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ?"); $stmt->execute([$userId, $points, $points, $points, $points]); // Add transaction record $stmt = $this->pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id) VALUES (?, 'earned', ?, ?, ?, ?)"); $stmt->execute([$userId, $points, $source, $description, $referenceId]); $this->pdo->commit(); logError('Points awarded', [ 'user_id' => $userId, 'points' => $points, 'source' => $source, 'description' => $description ]); return true; } catch (Exception $e) { $this->pdo->rollback(); logError('Error awarding points', [ 'user_id' => $userId, 'points' => $points, 'source' => $source, 'error' => $e->getMessage() ]); return false; } } /** * Deduct points from a user (for redemptions) */ public function deductPoints($userId, $points, $source, $description, $referenceId = null) { try { $this->pdo->beginTransaction(); // Check if user has enough points $stmt = $this->pdo->prepare("SELECT points FROM user_points WHERE user_id = ?"); $stmt->execute([$userId]); $userPoints = $stmt->fetch(); if (!$userPoints || $userPoints['points'] < $points) { $this->pdo->rollback(); return false; } // Deduct points $stmt = $this->pdo->prepare("UPDATE user_points SET points = points - ?, total_redeemed = total_redeemed + ? WHERE user_id = ?"); $stmt->execute([$points, $points, $userId]); // Add transaction record $stmt = $this->pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id) VALUES (?, 'redeemed', ?, ?, ?, ?)"); $stmt->execute([$userId, $points, $source, $description, $referenceId]); $this->pdo->commit(); logError('Points deducted', [ 'user_id' => $userId, 'points' => $points, 'source' => $source, 'description' => $description ]); return true; } catch (Exception $e) { $this->pdo->rollback(); logError('Error deducting points', [ 'user_id' => $userId, 'points' => $points, 'source' => $source, 'error' => $e->getMessage() ]); return false; } } /** * Get user's point balance */ public function getUserPoints($userId) { try { $stmt = $this->pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$userId]); $result = $stmt->fetch(); if (!$result) { return ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; } return $result; } catch (Exception $e) { logError('Error fetching user points', ['user_id' => $userId, 'error' => $e->getMessage()]); return ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; } } /** * Check and award onboarding points */ public function checkOnboardingPoints($userId) { try { $stmt = $this->pdo->prepare("SELECT email_verified, onboarding_completed, onboarding_points_awarded FROM users WHERE id = ?"); $stmt->execute([$userId]); $user = $stmt->fetch(); if ($user && $user['email_verified'] && !$user['onboarding_points_awarded']) { $this->pdo->beginTransaction(); // Award onboarding points $this->awardPoints($userId, 10, 'onboarding', 'Welcome bonus for email verification and first login'); // Mark onboarding as completed $stmt = $this->pdo->prepare("UPDATE users SET onboarding_completed = 1, onboarding_points_awarded = 1 WHERE id = ?"); $stmt->execute([$userId]); $this->pdo->commit(); return true; } return false; } catch (Exception $e) { $this->pdo->rollback(); logError('Error checking onboarding points', ['user_id' => $userId, 'error' => $e->getMessage()]); return false; } } /** * Check and award profiler section completion points */ public function checkProfilerCompletion($userId, $section) { try { // Get section questions count $profilerQuestionCounts = [ 'personal_background' => 6, 'household_family' => 8, 'shopping_lifestyle' => 7, 'technology_digital' => 7, 'travel_transportation' => 7, 'health_fitness' => 7, 'entertainment_media' => 8, 'food_dining' => 8, 'financial_services' => 8, 'communication_payments' => 7, 'household_classification' => 3 ]; if (!isset($profilerQuestionCounts[$section])) { return false; } $totalQuestions = $profilerQuestionCounts[$section]; // Count answered questions $stmt = $this->pdo->prepare("SELECT COUNT(*) as answered FROM user_profiler WHERE user_id = ? AND section = ?"); $stmt->execute([$userId, $section]); $answered = $stmt->fetch()['answered']; $completionPercentage = ($answered / $totalQuestions) * 100; $isCompleted = $completionPercentage >= 100; // Update completion record $stmt = $this->pdo->prepare("INSERT INTO profiler_completion (user_id, section, total_questions, answered_questions, completion_percentage, is_completed, completed_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE answered_questions = ?, completion_percentage = ?, is_completed = ?, completed_at = CASE WHEN ? = 1 THEN NOW() ELSE completed_at END, updated_at = NOW()"); $completedAt = $isCompleted ? date('Y-m-d H:i:s') : null; $stmt->execute([$userId, $section, $totalQuestions, $answered, $completionPercentage, $isCompleted, $completedAt, $answered, $completionPercentage, $isCompleted, $isCompleted]); // Award points if completed and not already awarded if ($isCompleted) { $stmt = $this->pdo->prepare("SELECT points_awarded FROM profiler_completion WHERE user_id = ? AND section = ?"); $stmt->execute([$userId, $section]); $completion = $stmt->fetch(); if ($completion && !$completion['points_awarded']) { $pointsToAward = ($section === 'communication_payments') ? 10 : (($section === 'household_classification') ? 20 : 5); $description = ($section === 'communication_payments') ? 'Mobile verification and UPI details completion' : 'Profiler section completion: ' . ucwords(str_replace('_', ' ', $section)); $this->awardPoints($userId, $pointsToAward, 'profiler_' . $section, $description); // Mark points as awarded $stmt = $this->pdo->prepare("UPDATE profiler_completion SET points_awarded = 1 WHERE user_id = ? AND section = ?"); $stmt->execute([$userId, $section]); return $pointsToAward; } } return false; } catch (Exception $e) { logError('Error checking profiler completion', ['user_id' => $userId, 'section' => $section, 'error' => $e->getMessage()]); return false; } } /** * Get user's transaction history */ public function getTransactionHistory($userId, $limit = 50) { try { $stmt = $this->pdo->prepare("SELECT * FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT ?"); $stmt->execute([$userId, $limit]); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching transaction history', ['user_id' => $userId, 'error' => $e->getMessage()]); return []; } } /** * Calculate points needed for next redemption tier */ public function getNextRedemptionTier($currentPoints) { $tiers = [500, 1000, 2000, 5000, 10000]; foreach ($tiers as $tier) { if ($currentPoints < $tier) { return [ 'next_tier' => $tier, 'points_needed' => $tier - $currentPoints, 'amount_value' => $tier * 0.5 ]; } } // If user has more than highest tier return [ 'next_tier' => null, 'points_needed' => 0, 'amount_value' => $currentPoints * 0.5 ]; } /** * Get points earning summary for admin */ public function getEarningSummary($dateRange = 30) { try { $stmt = $this->pdo->prepare(" SELECT source, COUNT(*) as transaction_count, SUM(points) as total_points, COUNT(DISTINCT user_id) as unique_users FROM point_transactions WHERE transaction_type = 'earned' AND created_at >= DATE_SUB(NOW(), INTERVAL ? DAY) GROUP BY source ORDER BY total_points DESC "); $stmt->execute([$dateRange]); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching earning summary', ['error' => $e->getMessage()]); return []; } } /** * Validate redemption request */ public function validateRedemption($userId, $points, $upiId) { $errors = []; // Check minimum points if ($points < 500) { $errors[] = 'Minimum redemption amount is 500 points (₹250).'; } // Check if points are in multiples of 10 if ($points % 10 !== 0) { $errors[] = 'Points must be redeemed in multiples of 10.'; } // Check user balance $userPoints = $this->getUserPoints($userId); if ($points > $userPoints['points']) { $errors[] = 'You cannot redeem more points than your available balance.'; } // Validate UPI ID if (empty($upiId)) { $errors[] = 'Please enter your UPI ID.'; } elseif (!preg_match('/^[\w\.-]+@[\w\.-]+$/', $upiId)) { $errors[] = 'Please enter a valid UPI ID (e.g., yourname@paytm).'; } return $errors; } } // Convenience functions for backward compatibility function awardUserPoints($userId, $points, $source, $description, $referenceId = null) { $pm = new PointsManager(); return $pm->awardPoints($userId, $points, $source, $description, $referenceId); } function getUserPointsBalance($userId) { $pm = new PointsManager(); return $pm->getUserPoints($userId); } function checkUserOnboarding($userId) { $pm = new PointsManager(); return $pm->checkOnboardingPoints($userId); } ?> -------------------- END OF FILE -------------------- FILE: RR com/privacy.php TYPE: PHP SIZE: 32.25 KB ------------------------------------------------------------ Privacy Policy - Relevant Reflex | Your Data Protection Rights
Last Updated: March 2026

1. Introduction

Welcome to Relevant Reflex ("we," "our," or "us"). We are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our online survey platform and related services.

Key Principle: We believe in transparency and will never sell your personal data to third parties for marketing purposes.

By using our services, you agree to the collection and use of information in accordance with this Privacy Policy. If you disagree with any part of this policy, please do not use our services.

2. Information We Collect

2.1 Personal Information

We collect the following types of personal information:

  • Registration Information: Name, email address, date of birth, gender, postal code
  • Profile Information: Occupation, income range, interests, preferences, household information
  • Survey Responses: Your answers to survey questions and research studies
  • Communication Data: Messages you send to our support team

2.2 Technical Information

  • IP address and location data
  • Browser type and version
  • Device information (type, operating system)
  • Usage data (pages visited, time spent, click patterns)
  • Cookies and similar tracking technologies

2.3 Financial Information

For payment processing, we may collect:

  • UPI ID or UPI-linked mobile number (for reward transfers)
  • Bank account details (for direct transfers)
  • Payment method preferences

3. How We Use Your Information

3.1 Primary Uses

  • Survey Matching: To match you with relevant survey opportunities based on your demographics and interests
  • Account Management: To create and maintain your account, process registrations, and provide customer support
  • Payment Processing: To calculate, process, and distribute rewards for completed surveys
  • Communication: To send you survey invitations, account updates, and important service announcements

3.2 Secondary Uses

  • To improve our platform and user experience
  • To prevent fraud and maintain platform security
  • To comply with legal obligations and regulatory requirements
  • To conduct internal research and analytics
Legal Basis: We process your data based on consent, legitimate interests, contract performance, and legal obligations as per applicable Indian data protection laws.

4. Information Sharing and Disclosure

4.1 Survey Partners

We may share anonymized or aggregated survey data with our research partners and clients. Individual responses are never linked to personal identifiers without explicit consent.

4.2 Service Providers

We work with trusted third-party service providers who assist us with:

  • Payment processing
  • Email delivery services
  • Data hosting and security
  • Customer support platforms

4.3 Legal Requirements

We may disclose your information if required by law, court order, or to:

  • Comply with legal processes
  • Protect our rights and property
  • Prevent fraud or security threats
  • Protect the safety of our users

4.4 Business Transfers

In the event of a merger, acquisition, or sale of assets, your information may be transferred as part of the business transaction.

5. Data Security

5.1 Security Measures

We implement industry-standard security measures to protect your information:

  • SSL encryption for all data transmissions
  • Secure database storage with access controls
  • Regular security audits and updates
  • Employee training on data protection
  • Multi-factor authentication for admin access

5.2 Data Breach Response

In the unlikely event of a data breach, we will:

  • Notify affected users within 72 hours
  • Report to relevant authorities as required
  • Take immediate steps to secure the breach
  • Provide guidance on protective measures

6. Your Rights and Choices

Under applicable data protection laws, you have the following rights:

6.1 Access and Portability

  • Request a copy of your personal data
  • Download your data in a portable format
  • View your survey history and earnings

6.2 Correction and Updates

  • Update your profile information
  • Correct inaccurate data
  • Modify communication preferences

6.3 Deletion and Restriction

  • Request deletion of your account and data
  • Restrict processing of certain information
  • Object to specific uses of your data
Exercise Your Rights: To exercise any of these rights, contact us at privacy@relevantreflex.com or through your account settings.

7. Cookies and Tracking Technologies

7.1 Types of Cookies We Use

  • Essential Cookies: Required for basic platform functionality
  • Performance Cookies: Help us analyze platform usage and improve performance
  • Functional Cookies: Remember your preferences and settings
  • Targeting Cookies: Used to deliver relevant survey opportunities

7.2 Advertising and Analytics Cookies

We use third-party advertising and analytics services, including Google Ads and Google Analytics. These services may set cookies on your device to:

  • Measure the effectiveness of our advertising campaigns
  • Show you relevant advertisements on other websites
  • Analyze how visitors use our website

Google's use of advertising cookies enables it to serve ads based on your prior visits to our site. You may opt out of personalized advertising by visiting Google Ad Settings.

For more information on how Google uses data when you use our site, visit: How Google uses data from sites that use Google services.

7.3 Cookie Consent

On your first visit to our website, you will see a cookie consent banner. You may accept all cookies or decline non-essential cookies. Essential cookies required for the platform to function will always remain active. You can change your preferences at any time by clearing your browser cookies.

7.4 Cookie Management

You can control cookies through your browser settings. However, disabling certain cookies may limit platform functionality.

8. Data Retention

We retain your information for the following periods:

  • Active Accounts: Data retained while account is active
  • Inactive Accounts: Data retained for 2 years after last activity
  • Survey Data: Anonymized responses may be retained for research purposes
  • Financial Records: Retained for 7 years as per legal requirements
  • Marketing Communications: Until you unsubscribe

9. Children's Privacy

Our services are not intended for individuals under 18 years of age. We do not knowingly collect personal information from children. If we discover that we have collected information from a child, we will delete it immediately.

Parents or guardians who believe their child has provided information to us should contact us immediately.

10. International Data Transfers

While we primarily operate within India, some of our service providers may be located internationally. When we transfer data outside India, we ensure:

  • Adequate protection through contractual safeguards
  • Compliance with applicable data transfer regulations
  • Use of standard contractual clauses where required

11. Changes to This Privacy Policy

We may update this Privacy Policy periodically to reflect changes in our practices or applicable laws. We will:

  • Notify users of material changes via email
  • Post updates on our website
  • Provide a clear summary of changes
  • Allow reasonable time for review before changes take effect

Continued use of our services after policy updates constitutes acceptance of the changes.

12. Contact Us

If you have questions about this Privacy Policy or our data practices, please contact us:

General Inquiries

support@relevantreflex.com
Ethirmedu, NH 544, Tamilnadu - 638183, India

Privacy-Specific Inquiries

privacy@relevantreflex.com
Data Protection Officer

Response Time: We aim to respond to all privacy-related inquiries within 30 days.
-------------------- END OF FILE -------------------- FILE: RR com/profiler-api.php TYPE: PHP SIZE: 5.66 KB ------------------------------------------------------------ 'Not authenticated']); exit; } $user = getCurrentUser(); if (!$user) { echo json_encode(['error' => 'User not found']); exit; } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { echo json_encode(['error' => 'Database connection failed']); exit; } $action = isset($_GET['action']) ? $_GET['action'] : ''; switch ($action) { case 'status': getProfilerStatus($pdo, $user['id']); break; case 'points': getUserPointsStatus($user['id']); break; case 'completion': getCompletionSummary($pdo, $user['id']); break; default: echo json_encode(['error' => 'Invalid action']); } function getProfilerStatus($pdo, $userId) { $profilerSections = [ 'personal_background' => 'Personal Background', 'household_family' => 'Household & Family', 'shopping_lifestyle' => 'Shopping & Lifestyle', 'technology_digital' => 'Technology & Digital', 'travel_transportation' => 'Travel & Transportation', 'health_fitness' => 'Health & Fitness', 'entertainment_media' => 'Entertainment & Media', 'food_dining' => 'Food & Dining', 'financial_services' => 'Financial Services', 'communication_payments' => 'Communication & Payments', 'household_classification' => 'Household Classification (ISEC)' ]; $completion = []; $totalCompleted = 0; try { $stmt = $pdo->prepare("SELECT section, completion_percentage, is_completed, points_awarded FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$userId]); while ($row = $stmt->fetch()) { $completion[$row['section']] = [ 'name' => $profilerSections[$row['section']], 'percentage' => floatval($row['completion_percentage']), 'completed' => boolval($row['is_completed']), 'points_awarded' => boolval($row['points_awarded']) ]; if ($row['is_completed']) { $totalCompleted++; } } // Add sections not started foreach ($profilerSections as $key => $name) { if (!isset($completion[$key])) { $completion[$key] = [ 'name' => $name, 'percentage' => 0, 'completed' => false, 'points_awarded' => false ]; } } // Check mobile verification status $stmt = $pdo->prepare("SELECT is_verified FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$userId]); $mobileVerified = $stmt->fetch(); echo json_encode([ 'success' => true, 'sections' => $completion, 'total_sections' => count($profilerSections), 'completed_sections' => $totalCompleted, 'overall_percentage' => round(($totalCompleted / count($profilerSections)) * 100, 2), 'mobile_verified' => $mobileVerified ? boolval($mobileVerified['is_verified']) : false ]); } catch (Exception $e) { echo json_encode(['error' => 'Database error: ' . $e->getMessage()]); } } function getUserPointsStatus($userId) { $pm = new PointsManager(); $points = $pm->getUserPoints($userId); $nextTier = $pm->getNextRedemptionTier($points['points']); echo json_encode([ 'success' => true, 'points' => $points, 'next_tier' => $nextTier, 'can_redeem' => $points['points'] >= 500, 'rupee_value' => $points['points'] * 0.5 ]); } function getCompletionSummary($pdo, $userId) { try { // Get overall completion stats $stmt = $pdo->prepare(" SELECT COUNT(*) as total_sections, SUM(CASE WHEN is_completed = 1 THEN 1 ELSE 0 END) as completed_sections, SUM(CASE WHEN points_awarded = 1 THEN 1 ELSE 0 END) as points_awarded_sections FROM profiler_completion WHERE user_id = ? "); $stmt->execute([$userId]); $stats = $stmt->fetch(); if (!$stats) { $stats = ['total_sections' => 0, 'completed_sections' => 0, 'points_awarded_sections' => 0]; } // Get recent transactions $stmt = $pdo->prepare(" SELECT transaction_type, points, source, description, created_at FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT 5 "); $stmt->execute([$userId]); $recentTransactions = $stmt->fetchAll(); // Get user points $pm = new PointsManager(); $points = $pm->getUserPoints($userId); echo json_encode([ 'success' => true, 'completion_stats' => $stats, 'points_summary' => $points, 'recent_transactions' => $recentTransactions, 'potential_earnings' => [ 'total_possible' => 90, // 10 sections × 5 points + 20 (ISEC) + 10 bonus + 10 mobile 'remaining' => max(0, 70 - $points['total_earned']) ] ]); } catch (Exception $e) { echo json_encode(['error' => 'Database error: ' . $e->getMessage()]); } } ?> -------------------- END OF FILE -------------------- FILE: RR com/profiler.php TYPE: PHP SIZE: 73.74 KB ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in profiler.php: ' . $e->getMessage()); die('System error. Please try again later.'); } // Define all profiler sections with their questions $profilerSections = [ 'personal_background' => [ 'name' => 'Personal Background', 'description' => 'Tell us about your education, work, and personal details', 'questions' => [ 'education_level' => [ 'question' => 'What is your highest level of education?', 'type' => 'single', 'options' => [ 'below_10th' => 'Below 10th Standard', '10th_pass' => '10th Standard', '12th_pass' => '12th Standard/Intermediate', 'diploma' => 'Diploma/ITI', 'graduation' => 'Graduation (Bachelor\'s)', 'post_graduation' => 'Post Graduation (Master\'s)', 'professional' => 'Professional Degree (CA/CS/Engineering/Medical)', 'doctorate' => 'Doctorate/PhD' ] ], 'employment_status' => [ 'question' => 'What is your current employment status?', 'type' => 'single', 'options' => [ 'student' => 'Student', 'employed_private' => 'Employed - Private Sector', 'employed_government' => 'Employed - Government/Public Sector', 'self_employed' => 'Self Employed/Business Owner', 'freelancer' => 'Freelancer/Consultant', 'homemaker' => 'Homemaker', 'retired' => 'Retired', 'unemployed' => 'Currently Unemployed' ] ], 'occupation_sector' => [ 'question' => 'Which sector do you work in? (Skip if not applicable)', 'type' => 'single', 'options' => [ 'it_software' => 'IT/Software', 'banking_finance' => 'Banking/Finance', 'healthcare' => 'Healthcare/Medical', 'education' => 'Education/Teaching', 'manufacturing' => 'Manufacturing', 'retail_sales' => 'Retail/Sales', 'government' => 'Government Services', 'agriculture' => 'Agriculture/Farming', 'media_entertainment' => 'Media/Entertainment', 'other' => 'Other' ] ], 'monthly_income' => [ 'question' => 'What is your monthly personal income range?', 'type' => 'single', 'options' => [ 'no_income' => 'No Income', 'below_15k' => 'Below ₹15,000', '15k_30k' => '₹15,000 - ₹30,000', '30k_50k' => '₹30,000 - ₹50,000', '50k_75k' => '₹50,000 - ₹75,000', '75k_1l' => '₹75,000 - ₹1,00,000', '1l_2l' => '₹1,00,000 - ₹2,00,000', 'above_2l' => 'Above ₹2,00,000' ] ], 'work_experience' => [ 'question' => 'How many years of work experience do you have?', 'type' => 'single', 'options' => [ 'fresher' => 'Fresher (0 years)', '1_2_years' => '1-2 years', '3_5_years' => '3-5 years', '6_10_years' => '6-10 years', '11_15_years' => '11-15 years', 'above_15_years' => 'More than 15 years' ] ], 'language_preference' => [ 'question' => 'Which languages are you comfortable with? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'hindi' => 'Hindi', 'english' => 'English', 'tamil' => 'Tamil', 'telugu' => 'Telugu', 'bengali' => 'Bengali', 'marathi' => 'Marathi', 'gujarati' => 'Gujarati', 'kannada' => 'Kannada', 'malayalam' => 'Malayalam', 'punjabi' => 'Punjabi', 'other' => 'Other' ] ] ] ], 'household_family' => [ 'name' => 'Household & Family', 'description' => 'Share information about your household and family', 'questions' => [ 'family_size' => [ 'question' => 'How many people live in your household?', 'type' => 'single', 'options' => [ '1' => '1 (Just me)', '2' => '2 people', '3' => '3 people', '4' => '4 people', '5' => '5 people', '6_plus' => '6 or more people' ] ], 'marital_status' => [ 'question' => 'What is your marital status?', 'type' => 'single', 'options' => [ 'single' => 'Single', 'married' => 'Married', 'divorced' => 'Divorced', 'widowed' => 'Widowed', 'in_relationship' => 'In a relationship' ] ], 'children' => [ 'question' => 'Do you have children?', 'type' => 'single', 'options' => [ 'no_children' => 'No children', 'expecting' => 'Expecting first child', '1_child' => '1 child', '2_children' => '2 children', '3_children' => '3 children', '4_plus_children' => '4 or more children' ] ], 'children_age_groups' => [ 'question' => 'If you have children, what are their age groups? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'infant' => 'Infant (0-2 years)', 'toddler' => 'Toddler (3-5 years)', 'child' => 'Child (6-12 years)', 'teenager' => 'Teenager (13-18 years)', 'adult' => 'Adult (18+ years)', 'not_applicable' => 'Not applicable' ] ], 'house_type' => [ 'question' => 'What type of housing do you live in?', 'type' => 'single', 'options' => [ 'apartment' => 'Apartment/Flat', 'independent_house' => 'Independent House', 'villa' => 'Villa', 'row_house' => 'Row House/Townhouse', 'rented_room' => 'Rented Room', 'hostel_pg' => 'Hostel/PG', 'other' => 'Other' ] ], 'house_ownership' => [ 'question' => 'Is your house?', 'type' => 'single', 'options' => [ 'owned' => 'Owned by family', 'rented' => 'Rented', 'company_provided' => 'Company provided', 'family_owned' => 'Joint family property', 'other' => 'Other' ] ], 'pet_ownership' => [ 'question' => 'Do you have any pets?', 'type' => 'multiple', 'options' => [ 'dog' => 'Dog', 'cat' => 'Cat', 'bird' => 'Birds', 'fish' => 'Fish', 'other_pet' => 'Other pets', 'no_pets' => 'No pets' ] ], 'household_income' => [ 'question' => 'What is your total monthly household income?', 'type' => 'single', 'options' => [ 'below_15k' => 'Below ₹15,000', '15k_25k' => '₹15,000 - ₹25,000', '25k_50k' => '₹25,000 - ₹50,000', '50k_75k' => '₹50,000 - ₹75,000', '75k_1l' => '₹75,000 - ₹1,00,000', '1l_2l' => '₹1,00,000 - ₹2,00,000', '2l_5l' => '₹2,00,000 - ₹5,00,000', 'above_5l' => 'Above ₹5,00,000', 'prefer_not' => 'Prefer not to say' ] ] ] ], 'shopping_lifestyle' => [ 'name' => 'Shopping & Lifestyle', 'description' => 'Tell us about your shopping habits and lifestyle preferences', 'questions' => [ 'shopping_frequency' => [ 'question' => 'How often do you shop for non-essential items?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'weekly' => 'Weekly', 'bi_weekly' => 'Bi-weekly', 'monthly' => 'Monthly', 'occasionally' => 'Occasionally', 'rarely' => 'Rarely' ] ], 'shopping_preference' => [ 'question' => 'Where do you prefer to shop? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'online' => 'Online (e-commerce websites)', 'malls' => 'Shopping malls', 'local_stores' => 'Local stores/markets', 'supermarkets' => 'Supermarkets', 'brand_stores' => 'Brand exclusive stores', 'wholesale_markets' => 'Wholesale markets' ] ], 'monthly_shopping_budget' => [ 'question' => 'What is your monthly shopping budget for non-essential items?', 'type' => 'single', 'options' => [ 'below_2k' => 'Below ₹2,000', '2k_5k' => '₹2,000 - ₹5,000', '5k_10k' => '₹5,000 - ₹10,000', '10k_20k' => '₹10,000 - ₹20,000', '20k_50k' => '₹20,000 - ₹50,000', 'above_50k' => 'Above ₹50,000' ] ], 'brand_consciousness' => [ 'question' => 'How important are brands to you when making purchase decisions?', 'type' => 'single', 'options' => [ 'very_important' => 'Very important - I only buy branded products', 'somewhat_important' => 'Somewhat important - I prefer brands but consider alternatives', 'neutral' => 'Neutral - Brand doesn\'t matter much', 'not_important' => 'Not important - I focus on value and quality', 'avoid_brands' => 'I actively avoid expensive brands' ] ], 'online_shopping_frequency' => [ 'question' => 'How often do you shop online?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'quarterly' => 'Quarterly', 'rarely' => 'Rarely', 'never' => 'Never' ] ], 'lifestyle_interests' => [ 'question' => 'What are your main lifestyle interests? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'fitness' => 'Fitness and health', 'cooking' => 'Cooking and food', 'travel' => 'Travel and exploration', 'fashion' => 'Fashion and style', 'home_decor' => 'Home decoration', 'gadgets' => 'Technology and gadgets', 'books' => 'Reading and books', 'movies' => 'Movies and entertainment', 'music' => 'Music', 'sports' => 'Sports', 'art' => 'Art and culture' ] ], 'social_media_usage' => [ 'question' => 'Which social media platforms do you actively use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'facebook' => 'Facebook', 'instagram' => 'Instagram', 'twitter' => 'Twitter/X', 'linkedin' => 'LinkedIn', 'youtube' => 'YouTube', 'whatsapp' => 'WhatsApp', 'telegram' => 'Telegram', 'snapchat' => 'Snapchat', 'tiktok' => 'TikTok/Reels', 'none' => 'I don\'t use social media' ] ] ] ], 'technology_digital' => [ 'name' => 'Technology & Digital', 'description' => 'Share your technology usage and digital preferences', 'questions' => [ 'smartphone_brand' => [ 'question' => 'Which smartphone brand do you currently use?', 'type' => 'single', 'options' => [ 'samsung' => 'Samsung', 'apple' => 'Apple iPhone', 'xiaomi' => 'Xiaomi/Mi/Redmi', 'oneplus' => 'OnePlus', 'oppo' => 'Oppo', 'vivo' => 'Vivo', 'realme' => 'Realme', 'google' => 'Google Pixel', 'motorola' => 'Motorola', 'other' => 'Other' ] ], 'internet_usage_hours' => [ 'question' => 'How many hours do you spend on the internet daily?', 'type' => 'single', 'options' => [ '1_2_hours' => '1-2 hours', '3_4_hours' => '3-4 hours', '5_6_hours' => '5-6 hours', '7_8_hours' => '7-8 hours', '9_10_hours' => '9-10 hours', 'more_than_10' => 'More than 10 hours' ] ], 'primary_internet_activity' => [ 'question' => 'What do you primarily use the internet for? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'social_media' => 'Social media', 'entertainment' => 'Entertainment (videos, music)', 'work' => 'Work/Professional', 'shopping' => 'Online shopping', 'news' => 'News and information', 'education' => 'Learning and education', 'gaming' => 'Gaming', 'communication' => 'Communication (calls, messages)', 'banking' => 'Banking and financial services' ] ], 'streaming_services' => [ 'question' => 'Which streaming services do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'netflix' => 'Netflix', 'amazon_prime' => 'Amazon Prime Video', 'hotstar' => 'Disney+ Hotstar', 'youtube_premium' => 'YouTube Premium', 'sony_liv' => 'Sony LIV', 'zee5' => 'ZEE5', 'voot' => 'Voot', 'mx_player' => 'MX Player', 'spotify' => 'Spotify', 'none' => 'None of these' ] ], 'online_payment_methods' => [ 'question' => 'Which online payment methods do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'upi' => 'UPI (PhonePe, GooglePay, Paytm)', 'credit_card' => 'Credit Card', 'debit_card' => 'Debit Card', 'net_banking' => 'Net Banking', 'digital_wallet' => 'Digital Wallets', 'cod' => 'Cash on Delivery', 'bank_transfer' => 'Bank Transfer' ] ], 'tech_comfort_level' => [ 'question' => 'How would you rate your comfort level with technology?', 'type' => 'single', 'options' => [ 'expert' => 'Expert - I\'m very tech-savvy', 'advanced' => 'Advanced - I\'m comfortable with most tech', 'intermediate' => 'Intermediate - I can handle basic to moderate tech tasks', 'beginner' => 'Beginner - I use basic features only', 'minimal' => 'Minimal - I struggle with technology' ] ], 'smart_devices_owned' => [ 'question' => 'Which smart devices do you own? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'smart_tv' => 'Smart TV', 'smart_speaker' => 'Smart Speaker (Alexa, Google Home)', 'smartwatch' => 'Smartwatch/Fitness Tracker', 'laptop' => 'Laptop', 'tablet' => 'Tablet', 'gaming_console' => 'Gaming Console', 'smart_home' => 'Smart Home Devices', 'none' => 'None of these' ] ] ] ], 'travel_transportation' => [ 'name' => 'Travel & Transportation', 'description' => 'Tell us about your travel habits and transportation preferences', 'questions' => [ 'travel_frequency' => [ 'question' => 'How often do you travel for leisure/vacation?', 'type' => 'single', 'options' => [ 'monthly' => 'Monthly', 'quarterly' => 'Every 3-4 months', 'twice_yearly' => 'Twice a year', 'annually' => 'Once a year', 'rarely' => 'Rarely (once in 2-3 years)', 'never' => 'Never' ] ], 'travel_destinations' => [ 'question' => 'What type of destinations do you prefer? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'domestic_cities' => 'Domestic cities', 'hill_stations' => 'Hill stations', 'beaches' => 'Beaches', 'historical_places' => 'Historical places', 'religious_places' => 'Religious places', 'international' => 'International destinations', 'adventure_spots' => 'Adventure destinations', 'family_spots' => 'Family-friendly places' ] ], 'accommodation_preference' => [ 'question' => 'What type of accommodation do you prefer while traveling?', 'type' => 'single', 'options' => [ 'luxury_hotels' => 'Luxury hotels (5-star)', 'mid_range_hotels' => 'Mid-range hotels (3-4 star)', 'budget_hotels' => 'Budget hotels', 'resorts' => 'Resorts', 'homestays' => 'Homestays', 'hostels' => 'Hostels', 'airbnb' => 'Airbnb/Rental apartments', 'family_friends' => 'Stay with family/friends' ] ], 'daily_commute_mode' => [ 'question' => 'What is your primary mode of daily transportation?', 'type' => 'single', 'options' => [ 'own_car' => 'Own car', 'own_bike' => 'Own bike/scooter', 'public_transport' => 'Public transport (bus, metro)', 'auto_rickshaw' => 'Auto rickshaw', 'taxi_cab' => 'Taxi/Cab services', 'ride_sharing' => 'Ride sharing (Ola, Uber)', 'walking' => 'Walking', 'cycling' => 'Cycling', 'work_from_home' => 'Work from home (no commute)' ] ], 'vehicle_ownership' => [ 'question' => 'Which vehicles do you own? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'car' => 'Car', 'motorcycle' => 'Motorcycle', 'scooter' => 'Scooter', 'bicycle' => 'Bicycle', 'electric_vehicle' => 'Electric vehicle', 'none' => 'None' ] ], 'fuel_type_preference' => [ 'question' => 'If you own a vehicle, what fuel type do you prefer?', 'type' => 'single', 'options' => [ 'petrol' => 'Petrol', 'diesel' => 'Diesel', 'cng' => 'CNG', 'electric' => 'Electric', 'hybrid' => 'Hybrid', 'not_applicable' => 'Not applicable (don\'t own vehicle)' ] ], 'ride_sharing_usage' => [ 'question' => 'How often do you use ride-sharing services (Ola, Uber)?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'occasionally' => 'Occasionally', 'rarely' => 'Rarely', 'never' => 'Never' ] ] ] ], 'health_fitness' => [ 'name' => 'Health & Fitness', 'description' => 'Share your health and fitness preferences and habits', 'questions' => [ 'exercise_frequency' => [ 'question' => 'How often do you exercise or engage in physical activities?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Once a week', 'monthly' => 'Few times a month', 'rarely' => 'Rarely', 'never' => 'Never' ] ], 'exercise_types' => [ 'question' => 'What types of physical activities do you engage in? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'gym' => 'Gym workouts', 'running' => 'Running/Jogging', 'walking' => 'Walking', 'yoga' => 'Yoga', 'cycling' => 'Cycling', 'swimming' => 'Swimming', 'sports' => 'Sports (cricket, football, etc.)', 'dancing' => 'Dancing', 'home_workouts' => 'Home workouts', 'none' => 'None' ] ], 'diet_preference' => [ 'question' => 'What is your dietary preference?', 'type' => 'single', 'options' => [ 'vegetarian' => 'Vegetarian', 'non_vegetarian' => 'Non-vegetarian', 'vegan' => 'Vegan', 'jain_vegetarian' => 'Jain vegetarian', 'eggetarian' => 'Eggetarian', 'flexitarian' => 'Flexitarian (mostly vegetarian)', 'no_preference' => 'No specific preference' ] ], 'health_concerns' => [ 'question' => 'Do you have any of these health concerns? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'diabetes' => 'Diabetes', 'hypertension' => 'High blood pressure', 'heart_disease' => 'Heart disease', 'obesity' => 'Weight management issues', 'allergies' => 'Allergies', 'digestive_issues' => 'Digestive issues', 'mental_health' => 'Mental health concerns', 'none' => 'None', 'prefer_not_say' => 'Prefer not to say' ] ], 'healthcare_spending' => [ 'question' => 'How much do you spend on healthcare annually?', 'type' => 'single', 'options' => [ 'below_10k' => 'Below ₹10,000', '10k_25k' => '₹10,000 - ₹25,000', '25k_50k' => '₹25,000 - ₹50,000', '50k_1l' => '₹50,000 - ₹1,00,000', 'above_1l' => 'Above ₹1,00,000', 'not_sure' => 'Not sure' ] ], 'health_insurance' => [ 'question' => 'Do you have health insurance?', 'type' => 'single', 'options' => [ 'employer_provided' => 'Yes, provided by employer', 'personal_policy' => 'Yes, personal policy', 'family_floater' => 'Yes, family floater policy', 'government_scheme' => 'Yes, government scheme', 'no_insurance' => 'No health insurance', 'not_sure' => 'Not sure' ] ], 'wellness_interests' => [ 'question' => 'Which wellness activities interest you? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'meditation' => 'Meditation', 'spa_treatments' => 'Spa treatments', 'nutrition_counseling' => 'Nutrition counseling', 'fitness_training' => 'Personal fitness training', 'alternative_medicine' => 'Alternative medicine', 'mental_health_support' => 'Mental health support', 'wellness_retreats' => 'Wellness retreats', 'none' => 'None of these' ] ] ] ], 'entertainment_media' => [ 'name' => 'Entertainment & Media', 'description' => 'Tell us about your entertainment preferences and media consumption', 'questions' => [ 'tv_watching_hours' => [ 'question' => 'How many hours do you watch TV/streaming content daily?', 'type' => 'single', 'options' => [ 'none' => 'I don\'t watch TV', '1_hour' => 'Less than 1 hour', '1_2_hours' => '1-2 hours', '2_3_hours' => '2-3 hours', '3_5_hours' => '3-5 hours', 'more_than_5' => 'More than 5 hours' ] ], 'content_preferences' => [ 'question' => 'What type of content do you prefer? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'bollywood_movies' => 'Bollywood movies', 'hollywood_movies' => 'Hollywood movies', 'regional_movies' => 'Regional movies', 'tv_serials' => 'TV serials/shows', 'reality_shows' => 'Reality shows', 'news' => 'News', 'documentaries' => 'Documentaries', 'comedy_shows' => 'Comedy shows', 'sports' => 'Sports', 'music_videos' => 'Music videos' ] ], 'movie_genres' => [ 'question' => 'Which movie genres do you enjoy? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'action' => 'Action', 'comedy' => 'Comedy', 'drama' => 'Drama', 'romance' => 'Romance', 'thriller' => 'Thriller', 'horror' => 'Horror', 'sci_fi' => 'Science Fiction', 'documentary' => 'Documentary', 'biography' => 'Biography', 'animation' => 'Animation' ] ], 'music_preferences' => [ 'question' => 'What type of music do you listen to? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'bollywood' => 'Bollywood', 'classical_indian' => 'Classical Indian', 'devotional' => 'Devotional/Religious', 'pop' => 'Pop', 'rock' => 'Rock', 'hip_hop' => 'Hip Hop', 'electronic' => 'Electronic/EDM', 'folk' => 'Folk', 'international' => 'International', 'regional' => 'Regional' ] ], 'gaming_habits' => [ 'question' => 'How often do you play games (mobile, PC, console)?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'rarely' => 'Rarely', 'never' => 'Never' ] ], 'reading_habits' => [ 'question' => 'How often do you read books, magazines, or blogs?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'rarely' => 'Rarely', 'never' => 'Never' ] ], 'content_consumption_device' => [ 'question' => 'Which device do you primarily use for entertainment? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'smartphone' => 'Smartphone', 'smart_tv' => 'Smart TV', 'laptop' => 'Laptop', 'tablet' => 'Tablet', 'desktop' => 'Desktop computer', 'gaming_console' => 'Gaming console', 'traditional_tv' => 'Traditional TV' ] ], 'entertainment_spending' => [ 'question' => 'How much do you spend on entertainment monthly?', 'type' => 'single', 'options' => [ 'below_500' => 'Below ₹500', '500_1000' => '₹500 - ₹1,000', '1000_2000' => '₹1,000 - ₹2,000', '2000_5000' => '₹2,000 - ₹5,000', 'above_5000' => 'Above ₹5,000', 'not_sure' => 'Not sure' ] ] ] ], 'food_dining' => [ 'name' => 'Food & Dining', 'description' => 'Share your food preferences and dining habits', 'questions' => [ 'cooking_frequency' => [ 'question' => 'How often do you cook at home?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'rarely' => 'Rarely', 'never' => 'Never - I don\'t cook' ] ], 'cuisine_preferences' => [ 'question' => 'Which cuisines do you enjoy? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'north_indian' => 'North Indian', 'south_indian' => 'South Indian', 'regional_local' => 'Regional/Local cuisine', 'chinese' => 'Chinese', 'italian' => 'Italian', 'continental' => 'Continental', 'mexican' => 'Mexican', 'thai' => 'Thai', 'japanese' => 'Japanese', 'fast_food' => 'Fast food' ] ], 'dining_out_frequency' => [ 'question' => 'How often do you dine out or order food?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'occasionally' => 'Occasionally', 'rarely' => 'Rarely' ] ], 'food_delivery_apps' => [ 'question' => 'Which food delivery apps do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'zomato' => 'Zomato', 'swiggy' => 'Swiggy', 'uber_eats' => 'Uber Eats', 'dominos' => 'Domino\'s', 'pizza_hut' => 'Pizza Hut', 'restaurant_direct' => 'Restaurant direct delivery', 'none' => 'None - I don\'t use food delivery' ] ], 'food_spending_monthly' => [ 'question' => 'How much do you spend on food (including dining out) monthly?', 'type' => 'single', 'options' => [ 'below_3k' => 'Below ₹3,000', '3k_5k' => '₹3,000 - ₹5,000', '5k_8k' => '₹5,000 - ₹8,000', '8k_12k' => '₹8,000 - ₹12,000', '12k_20k' => '₹12,000 - ₹20,000', 'above_20k' => 'Above ₹20,000' ] ], 'special_dietary_requirements' => [ 'question' => 'Do you have any special dietary requirements? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'gluten_free' => 'Gluten-free', 'dairy_free' => 'Dairy-free', 'sugar_free' => 'Sugar-free/Low sugar', 'low_sodium' => 'Low sodium', 'organic_only' => 'Organic food only', 'weight_management' => 'Weight management diet', 'diabetic_friendly' => 'Diabetic-friendly', 'none' => 'No special requirements' ] ], 'grocery_shopping_preference' => [ 'question' => 'Where do you prefer to buy groceries? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'local_stores' => 'Local grocery stores', 'supermarkets' => 'Supermarkets', 'online_delivery' => 'Online grocery delivery', 'wholesale_markets' => 'Wholesale markets', 'organic_stores' => 'Organic/specialty stores', 'convenience_stores' => 'Convenience stores' ] ], 'beverage_preferences' => [ 'question' => 'What beverages do you regularly consume? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'tea' => 'Tea', 'coffee' => 'Coffee', 'soft_drinks' => 'Soft drinks', 'juices' => 'Fruit juices', 'energy_drinks' => 'Energy drinks', 'health_drinks' => 'Health drinks/Protein shakes', 'alcohol' => 'Alcoholic beverages', 'water_only' => 'Mostly just water' ] ] ] ], 'financial_services' => [ 'name' => 'Financial Services', 'description' => 'Tell us about your financial preferences and banking habits', 'questions' => [ 'primary_bank' => [ 'question' => 'Which is your primary bank?', 'type' => 'single', 'options' => [ 'sbi' => 'State Bank of India (SBI)', 'hdfc' => 'HDFC Bank', 'icici' => 'ICICI Bank', 'axis' => 'Axis Bank', 'pnb' => 'Punjab National Bank', 'canara' => 'Canara Bank', 'bob' => 'Bank of Baroda', 'kotak' => 'Kotak Mahindra Bank', 'yes_bank' => 'Yes Bank', 'other' => 'Other' ] ], 'banking_frequency' => [ 'question' => 'How often do you visit bank branches?', 'type' => 'single', 'options' => [ 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'quarterly' => 'Quarterly', 'rarely' => 'Rarely', 'never' => 'Never - I use only digital banking' ] ], 'investment_products' => [ 'question' => 'Which investment products do you currently use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'savings_account' => 'Savings account', 'fixed_deposits' => 'Fixed deposits', 'mutual_funds' => 'Mutual funds', 'stocks' => 'Stocks/Shares', 'ppf' => 'PPF (Public Provident Fund)', 'nps' => 'NPS (National Pension System)', 'life_insurance' => 'Life insurance', 'gold' => 'Gold investments', 'real_estate' => 'Real estate', 'none' => 'None of these' ] ], 'credit_products' => [ 'question' => 'Which credit products do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'credit_card' => 'Credit card', 'personal_loan' => 'Personal loan', 'home_loan' => 'Home loan', 'car_loan' => 'Car loan', 'education_loan' => 'Education loan', 'business_loan' => 'Business loan', 'overdraft' => 'Overdraft facility', 'none' => 'None' ] ], 'financial_planning' => [ 'question' => 'Do you engage in financial planning?', 'type' => 'single', 'options' => [ 'professional_advisor' => 'Yes, with a professional financial advisor', 'self_planned' => 'Yes, I plan myself', 'family_guidance' => 'Yes, with family guidance', 'basic_planning' => 'Basic planning only', 'no_planning' => 'No, I don\'t plan financially', 'want_to_start' => 'No, but I want to start' ] ], 'insurance_products' => [ 'question' => 'What insurance products do you have? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'life_insurance' => 'Life insurance', 'health_insurance' => 'Health insurance', 'vehicle_insurance' => 'Vehicle insurance', 'home_insurance' => 'Home insurance', 'travel_insurance' => 'Travel insurance', 'term_insurance' => 'Term insurance', 'none' => 'No insurance' ] ], 'digital_payment_comfort' => [ 'question' => 'How comfortable are you with digital payments?', 'type' => 'single', 'options' => [ 'very_comfortable' => 'Very comfortable - I use for all transactions', 'mostly_comfortable' => 'Mostly comfortable - I use for most transactions', 'somewhat_comfortable' => 'Somewhat comfortable - I use for small amounts', 'limited_use' => 'Limited use - Only when necessary', 'prefer_cash' => 'I prefer cash transactions' ] ], 'financial_goals' => [ 'question' => 'What are your main financial goals? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'emergency_fund' => 'Building emergency fund', 'retirement_planning' => 'Retirement planning', 'home_purchase' => 'Buying a home', 'child_education' => 'Children\'s education', 'wealth_creation' => 'Wealth creation', 'debt_reduction' => 'Reducing debt', 'travel_fund' => 'Travel fund', 'business_investment' => 'Starting/expanding business', 'no_specific_goals' => 'No specific goals' ] ] ] ], 'communication_payments' => [ 'name' => 'Communication & Payments', 'description' => 'Share your communication preferences and survey availability', 'questions' => [ 'preferred_days_for_surveys' => [ 'question' => 'Which days of the week are you available for surveys? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'monday' => 'Monday', 'tuesday' => 'Tuesday', 'wednesday' => 'Wednesday', 'thursday' => 'Thursday', 'friday' => 'Friday', 'saturday' => 'Saturday', 'sunday' => 'Sunday', 'any_day' => 'Any day of the week' ] ], 'notification_preferences' => [ 'question' => 'How would you like to receive survey notifications? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'sms' => 'SMS', 'email' => 'Email', 'whatsapp' => 'WhatsApp', 'app_notification' => 'App notification', 'phone_call' => 'Phone call' ] ], 'primary_communication_language' => [ 'question' => 'What is your preferred language for communication?', 'type' => 'single', 'options' => [ 'english' => 'English', 'hindi' => 'Hindi', 'tamil' => 'Tamil', 'telugu' => 'Telugu', 'bengali' => 'Bengali', 'marathi' => 'Marathi', 'gujarati' => 'Gujarati', 'kannada' => 'Kannada', 'malayalam' => 'Malayalam', 'punjabi' => 'Punjabi', 'other' => 'Other' ] ], 'survey_participation_time' => [ 'question' => 'What time of day do you prefer to participate in surveys? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'early_morning' => 'Early Morning (6 AM - 9 AM)', 'mid_morning' => 'Mid Morning (9 AM - 12 PM)', 'afternoon' => 'Afternoon (12 PM - 3 PM)', 'late_afternoon' => 'Late Afternoon (3 PM - 6 PM)', 'evening' => 'Evening (6 PM - 9 PM)', 'night' => 'Night (9 PM - 12 AM)', 'late_night' => 'Late Night (12 AM - 6 AM)', 'flexible' => 'Flexible - any time works for me' ] ], 'device_ownership' => [ 'question' => 'Which devices do you use regularly? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'smartphone' => 'Smartphone', 'laptop' => 'Laptop/Desktop', 'tablet' => 'Tablet', 'smart_tv' => 'Smart TV', 'smartwatch' => 'Smartwatch', 'feature_phone' => 'Feature Phone (non-smartphone)' ] ], 'online_payment_methods' => [ 'question' => 'Which online payment methods do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'upi' => 'UPI (PhonePe, GooglePay, Paytm)', 'credit_card' => 'Credit Card', 'debit_card' => 'Debit Card', 'net_banking' => 'Net Banking', 'digital_wallet' => 'Digital Wallets', 'cod' => 'Cash on Delivery', 'bank_transfer' => 'Bank Transfer' ] ], 'survey_types_interest' => [ 'question' => 'What types of surveys interest you most? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'products' => 'Product reviews and feedback', 'brands' => 'Brand awareness surveys', 'lifestyle' => 'Lifestyle and habits', 'technology' => 'Technology and gadgets', 'entertainment' => 'Entertainment and media', 'politics' => 'Political opinions', 'social_issues' => 'Social issues', 'health' => 'Health and wellness', 'finance' => 'Financial products and services', 'all_types' => 'All types of surveys' ] ] ] ], 'household_classification' => [ 'name' => 'Household Classification (ISEC)', 'description' => 'Help us understand your household background for better survey matching. Based on MRSI ISEC 2024 classification.', 'questions' => [ 'cwe_occupation' => [ 'question' => 'What is the occupation of the Chief Wage Earner (the person who earns the most in your household)?', 'type' => 'single', 'options' => [ 'labour' => 'Unskilled / Semi-skilled Labour (daily wage, domestic worker, farm labour)', 'farmer' => 'Farmer / Agricultural Worker (owns or works on farm)', 'worker' => 'Skilled Worker / Artisan / Small Trader (mechanic, carpenter, small shopkeeper)', 'trader' => 'Trader / Business Owner / Contractor (medium/large business, contractor)', 'clerical' => 'Clerical / Supervisory / Junior Officer (office clerk, supervisor, junior govt employee)', 'managerial' => 'Senior Manager / Professional / Executive (doctor, engineer, CA, senior govt officer, executive)', ] ], 'male_education' => [ 'question' => 'What is the highest level of education of the most educated male adult (21 years or above) in your household?', 'type' => 'single', 'options' => [ 'no_adult' => 'No male adult aged 21+ in household', 'no_formal' => 'No formal schooling / Illiterate', 'upto_5' => 'Schooling up to Class 5', 'class_6_9' => 'Schooling Class 6 to 9', 'class_10_14' => 'Class 10 pass / SSC / HSC / Diploma', 'degree_regular' => 'Graduate / Post-Graduate (regular college degree)', 'degree_professional' => 'Professional Degree (Engineering / Medicine / CA / Law / MBA etc.)', ] ], 'female_education' => [ 'question' => 'What is the highest level of education of the most educated female adult (21 years or above) in your household?', 'type' => 'single', 'options' => [ 'no_adult' => 'No female adult aged 21+ in household', 'no_formal' => 'No formal schooling / Illiterate', 'upto_5' => 'Schooling up to Class 5', 'class_6_9' => 'Schooling Class 6 to 9', 'class_10_14' => 'Class 10 pass / SSC / HSC / Diploma', 'degree_regular' => 'Graduate / Post-Graduate (regular college degree)', 'degree_professional' => 'Professional Degree (Engineering / Medicine / CA / Law / MBA etc.)', ] ], ] ], ]; // Get the requested section $currentSection = isset($_GET['section']) ? $_GET['section'] : null; if (!$currentSection || !isset($profilerSections[$currentSection])) { header('Location: dashboard.php#profiler'); exit; } $section = $profilerSections[$currentSection]; // Get existing responses for this section $existingResponses = []; try { $stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = ?"); $stmt->execute([$user['id'], $currentSection]); while ($row = $stmt->fetch()) { $existingResponses[$row['question_id']] = json_decode($row['response'], true); } } catch (Exception $e) { logError('Error fetching existing responses', ['user_id' => $user['id'], 'section' => $currentSection, 'error' => $e->getMessage()]); } // Determine mode: view (default if has responses) or edit $hasResponses = !empty($existingResponses); $editMode = isset($_GET['edit']) && $_GET['edit'] == '1'; // If no responses yet, always edit mode if (!$hasResponses) $editMode = true; $successMessage = ''; $errorMessages = []; // Handle form submission if ($_SERVER['REQUEST_METHOD'] === 'POST') { $responses = []; $hasErrors = false; foreach ($section['questions'] as $questionId => $questionData) { if ($questionData['type'] === 'single') { $value = isset($_POST[$questionId]) ? sanitize($_POST[$questionId]) : ''; if (!empty($value)) { $responses[$questionId] = $value; } elseif (isset($existingResponses[$questionId])) { // Cannot empty a previously answered question — keep old response $responses[$questionId] = $existingResponses[$questionId]; } } elseif ($questionData['type'] === 'multiple') { $values = isset($_POST[$questionId]) ? $_POST[$questionId] : []; if (is_array($values) && !empty($values)) { $cleanValues = array_map('sanitize', $values); $responses[$questionId] = $cleanValues; } elseif (isset($existingResponses[$questionId])) { // Cannot empty — keep old response $responses[$questionId] = $existingResponses[$questionId]; } } } if (!$hasErrors) { try { $pdo->beginTransaction(); // Save all responses foreach ($responses as $questionId => $response) { $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $responseJson = json_encode($response); $stmt->execute([$user['id'], $currentSection, $questionId, $responseJson, $responseJson]); } // Calculate completion percentage $totalQuestions = count($section['questions']); $answeredQuestions = count($responses); $completionPercentage = ($answeredQuestions / $totalQuestions) * 100; $isCompleted = $completionPercentage >= 100; // Update completion status $stmt = $pdo->prepare("INSERT INTO profiler_completion (user_id, section, total_questions, answered_questions, completion_percentage, is_completed, completed_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE answered_questions = ?, completion_percentage = ?, is_completed = ?, completed_at = CASE WHEN ? = 1 THEN NOW() ELSE completed_at END, updated_at = NOW()"); $completedAt = $isCompleted ? date('Y-m-d H:i:s') : null; $stmt->execute([$user['id'], $currentSection, $totalQuestions, $answeredQuestions, $completionPercentage, $isCompleted, $completedAt, $answeredQuestions, $completionPercentage, $isCompleted, $isCompleted]); // Award points if section is completed and not already awarded if ($isCompleted) { $stmt = $pdo->prepare("SELECT points_awarded FROM profiler_completion WHERE user_id = ? AND section = ?"); $stmt->execute([$user['id'], $currentSection]); $completion = $stmt->fetch(); if ($completion && !$completion['points_awarded']) { // ISEC section earns 20 points, all others earn 5 $pointsToAward = ($currentSection === 'household_classification') ? 20 : 5; $pointsDescription = 'Profiler section completion: ' . $section['name']; $stmt = $pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ?"); $stmt->execute([$user['id'], $pointsToAward, $pointsToAward, $pointsToAward, $pointsToAward]); $stmt = $pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', ?, ?, ?)"); $stmt->execute([$user['id'], $pointsToAward, 'profiler_' . $currentSection, $pointsDescription]); $stmt = $pdo->prepare("UPDATE profiler_completion SET points_awarded = 1 WHERE user_id = ? AND section = ?"); $stmt->execute([$user['id'], $currentSection]); logError('Profiler points awarded', ['user_id' => $user['id'], 'section' => $currentSection, 'points' => $pointsToAward]); } // For ISEC section: compute and save SEC class to users table if ($currentSection === 'household_classification') { $occ = $responses['cwe_occupation'] ?? null; $mEdu = $responses['male_education'] ?? null; $fEdu = $responses['female_education'] ?? null; if ($occ && $mEdu && $fEdu) { $tier = computeISECTier($occ, $mEdu, $fEdu); $secClass = $tier ? getISECClass($tier) : null; if ($secClass) { $stmt = $pdo->prepare("UPDATE users SET isec_class = ?, isec_tier = ?, updated_at = NOW() WHERE id = ?"); $stmt->execute([$secClass, $tier, $user['id']]); logError('ISEC class computed', ['user_id' => $user['id'], 'tier' => $tier, 'class' => $secClass]); } } } } $pdo->commit(); // Reload responses and switch to view mode $existingResponses = []; $stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = ?"); $stmt->execute([$user['id'], $currentSection]); while ($row = $stmt->fetch()) { $existingResponses[$row['question_id']] = json_decode($row['response'], true); } $hasResponses = !empty($existingResponses); $editMode = false; $successMessage = 'Your responses have been saved successfully!'; } catch (Exception $e) { $pdo->rollback(); logError('Error saving profiler responses', ['user_id' => $user['id'], 'section' => $currentSection, 'error' => $e->getMessage()]); $errorMessages[] = 'Error saving your responses. Please try again.'; } } } // Helper: get option label for a value function getOptionLabel($questionData, $value) { return isset($questionData['options'][$value]) ? $questionData['options'][$value] : ucwords(str_replace('_', ' ', $value)); } ?> <?php echo $section['name']; ?> - Profiler | Relevant Reflex

Editing Viewing
of questions completed
$questionData): ?>
Not answered yet
$questionData): ?>
$label): ?>
>
$label): ?>
>
Cancel Back
-------------------- END OF FILE -------------------- FILE: RR com/redemption.php TYPE: PHP SIZE: 56.6 KB ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('DB failed: ' . $e->getMessage()); die('System error.'); } // Award onboarding points // Onboarding points REMOVED - no reward for registering if (!$user['onboarding_points_awarded']) { try { $pdo->prepare("UPDATE users SET onboarding_points_awarded = 1 WHERE id = ?")->execute([$user['id']]); $user = getCurrentUser(); } catch (Exception $e) {} } $userPoints = ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; try { $stmt = $pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$user['id']]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {} $profilerSections = ['personal_background'=>'Personal Background','household_family'=>'Household & Family','shopping_lifestyle'=>'Shopping & Lifestyle','technology_digital'=>'Technology & Digital','travel_transportation'=>'Travel & Transportation','health_fitness'=>'Health & Fitness','entertainment_media'=>'Entertainment & Media','food_dining'=>'Food & Dining','financial_services'=>'Financial Services','communication_payments'=>'Communication & Payments','household_classification'=>'Household Classification (ISEC)']; $profilerCompletion = []; try { $stmt = $pdo->prepare("SELECT section, completion_percentage, is_completed, points_awarded FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) $profilerCompletion[$row['section']] = $row; } catch (Exception $e) {} $completedSections = 0; foreach ($profilerSections as $k => $n) { if (isset($profilerCompletion[$k]) && $profilerCompletion[$k]['is_completed']) $completedSections++; } $mobileVerified = false; $mobileNumber = ''; try { $stmt = $pdo->prepare("SELECT mobile_number, is_verified FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $md = $stmt->fetch(); if ($md) { $mobileVerified = $md['is_verified']; $mobileNumber = $md['mobile_number']; } } catch (Exception $e) {} $upiId = ''; try { $stmt = $pdo->prepare("SELECT response FROM user_profiler WHERE user_id = ? AND section = 'profile' AND question_id = 'upi_id'"); $stmt->execute([$user['id']]); $ud = $stmt->fetch(); if ($ud) $upiId = json_decode($ud['response'], true); } catch (Exception $e) {} if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_upi') { $newUpiId = isset($_POST['upi_id']) ? sanitize($_POST['upi_id']) : ''; if (!empty($newUpiId) && preg_match('/^[\w\.\-]+@[\w\.\-]+$/', $newUpiId)) { try { $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'upi_id', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j = json_encode($newUpiId); $stmt->execute([$user['id'], $j, $j]); $upiId = $newUpiId; $success_message = "UPI ID updated successfully!"; } catch (Exception $e) { $error_message = "Error updating UPI ID."; } } else { $error_message = "Please enter a valid UPI ID (e.g., yourname@paytm)."; } } $userTickets = []; try { $stmt = $pdo->prepare("SELECT st.*, (SELECT COUNT(*) FROM support_messages sm WHERE sm.ticket_id = st.id) as message_count, (SELECT sm.created_at FROM support_messages sm WHERE sm.ticket_id = st.id ORDER BY sm.created_at DESC LIMIT 1) as last_reply FROM support_tickets st WHERE st.user_id = ? ORDER BY st.created_at DESC LIMIT 10"); $stmt->execute([$user['id']]); $userTickets = $stmt->fetchAll(); } catch (Exception $e) {} $userRedemptions = []; try { $stmt = $pdo->prepare("SELECT * FROM redemption_requests WHERE user_id = ? ORDER BY created_at DESC LIMIT 5"); $stmt->execute([$user['id']]); $userRedemptions = $stmt->fetchAll(); } catch (Exception $e) {} // Survey history from shop DB $surveys = []; $surveyStats = ['total'=>0,'completes'=>0,'pending'=>0,'flagged'=>0]; try { $shopPdo = new PDO("mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4","u752449863_rradmin","S@n@h2016",[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]); $cols = array_column($shopPdo->query("SHOW COLUMNS FROM survey_urls")->fetchAll(), 'Field'); $hasQF = in_array('quality_flag', $cols); $hasLoi = in_array('actual_loi_seconds', $cols); $hasCompAt = in_array('completed_at', $cols); $hasQN = in_array('quality_notes', $cols); $pcols = array_column($shopPdo->query("SHOW COLUMNS FROM projects")->fetchAll(), 'Field'); $hasCS = in_array('closure_status', $pcols); $hasSP = in_array('speedster_threshold_pct', $pcols); $qf = $hasQF ? "su.quality_flag" : "'valid' as quality_flag"; $qn = $hasQN ? "su.quality_notes" : "NULL as quality_notes"; $loi = $hasLoi ? "su.actual_loi_seconds" : "NULL as actual_loi_seconds"; $cat = $hasCompAt ? "su.completed_at" : "NULL as completed_at"; $cs = $hasCS ? "p.closure_status" : "'none' as closure_status"; $sp = $hasSP ? "p.speedster_threshold_pct" : "33.33 as speedster_threshold_pct"; $stmt = $shopPdo->prepare(" SELECT su.status as url_status, su.clicked_at, su.created_at as sent_at, $qf, $qn, $loi, $cat, p.project_id, p.project_name, p.eloi, p.industry, p.status as project_status, $cs, $sp FROM survey_urls su INNER JOIN projects p ON su.project_id = p.project_id WHERE su.sent_to_user_id = ? AND su.status NOT IN ('available') ORDER BY su.created_at DESC LIMIT 30 "); $stmt->execute([$user['id']]); $surveys = $stmt->fetchAll(); foreach ($surveys as $s) { $surveyStats['total']++; if ($s['url_status']==='complete') { $surveyStats['completes']++; $q=$s['quality_flag']??'valid'; if (in_array($q,['speedster','ip_duplicate','client_flagged'])) $surveyStats['flagged']++; elseif ($s['project_status']!=='Closed') $surveyStats['pending']++; } } } catch (Exception $e) { error_log("Survey stats: ".$e->getMessage()); } // Get survey-related point transactions from panel DB $surveyPointsByProject = []; try { $stmt = $pdo->prepare("SELECT reference_id, points, description, created_at FROM point_transactions WHERE user_id = ? AND source IN ('survey','survey_reward') AND transaction_type = 'earned' ORDER BY created_at DESC"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) { if ($row['reference_id']) $surveyPointsByProject[$row['reference_id']] = $row; } } catch (Exception $e) {} // Get full rewards history for Rewards tab $rewardsHistory = []; try { $stmt = $pdo->prepare("SELECT transaction_type, points, source, description, reference_id, status, created_at FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT 50"); $stmt->execute([$user['id']]); $rewardsHistory = $stmt->fetchAll(); } catch (Exception $e) {} $joinDateFormatted = (new DateTime($user['created_at']))->format('M Y'); $profilePct = round(($completedSections / count($profilerSections)) * 100); $firstName = htmlspecialchars($user['first_name'] ?? explode('@',$user['email'])[0]); $initials = strtoupper(substr($user['first_name']??$user['email'],0,1).substr($user['last_name']??'',0,1)); if (strlen($initials)<2) $initials = strtoupper(substr($user['email'],0,2)); function getSurveyLabel($s) { $st=$s['url_status']; $qf=$s['quality_flag']??'valid'; $ps=$s['project_status']; if ($st==='sent') return ['Invited','label-neutral','Invitation sent. Click the survey link in your email to participate.']; if ($st==='clicked') return ['In Progress','label-warn','You started this survey but haven\'t completed it yet.']; if (in_array($st,['earlyscreenout','latescreenout'])) return ['Screened Out','label-neutral','You did not qualify based on screening criteria.']; if ($st==='quotafull') return ['Quota Full','label-neutral','The survey quota was filled before your response was recorded.']; if ($st==='timeout') return ['Timed Out','label-neutral','Session expired before completion.']; if ($st==='partial') return ['Partial','label-info','Your response was partially recorded.']; if ($st==='complete') { if (in_array($qf,['speedster','ip_duplicate','client_flagged'])) return ['Under Review','label-danger','Flagged for quality review. Points held pending admin decision.']; if ($ps==='Closed') return ['Approved','label-ok','Survey approved. Check Rewards tab for credited points.']; return ['Pending Approval','label-warn','Completed successfully. Points will credit when the project closes.']; } return [ucfirst($st),'label-neutral','']; } function fmtLoi($s){if(!$s)return'-';$m=floor($s/60);$ss=$s%60;return($m?$m.'m ':'').$ss.'s';} function fmtDt($d){if(!$d)return'-';return date('M d, Y g:i A',strtotime($d));} ?> Member Area - Relevant Reflex
Overview
English
English Default
Hindi हिन्दी
Bengali বাংলা
Telugu తెలుగు
Marathi मराठी
Tamil தமிழ்
Urdu اردو
Gujarati ગુજરાતી
Kannada ಕನ್ನಡ
Odia ଓଡ଼ିଆ
Malayalam മലയാളം
pts
Refer a Friend

Welcome back, !

Complete your profile, earn points, and participate in paid surveys.

Important! Read 4 essential rules before taking any survey to protect your account and earn maximum rewards.
Available Points
value
Surveys Done
total
Profile
%
sections
Total Earned
Since
Complete Profile
Earn up to 70 points
Redeem Rewards
Convert points to cash
Get Help
Support & FAQs
⚠ Read This Before You Take Any Survey
4 essential rules to protect your account and earn maximum rewards
1
Take your time. Read every question carefully. There are no right or wrong answers — we want your genuine opinion. Think about each question and answer what you truly feel. Surveys that are rushed through too quickly get automatically flagged and your response may be rejected without reward.
2
One attempt per person, per device. Each survey can only be taken once from your IP address or device. Duplicate attempts are automatically detected and flagged. Do not try to retake a survey using a different browser, incognito mode, or VPN — it will be caught and may result in account action.
3
Do not straightline your responses. Straightlining means selecting the same answer option for every question in a row (e.g., choosing "Agree" for all statements). This is a well-known indicator of low-quality responses and is flagged by our system. Only select the same answer repeatedly if that genuinely reflects your opinion.
4
Give thoughtful answers to open-ended questions. When a survey asks you to type your opinion or explain something in your own words, write a genuine, meaningful response. Vague, gibberish, or nonsensical text (e.g., random letters, copy-pasted filler, or irrelevant answers) will be flagged. Responses containing such text will be marked invalid and the completion will not count — no points will be awarded.
Why this matters: Research clients review every response for quality. Flagged responses (speeding, duplicates, straightlining, or gibberish open-ended answers) are rejected and no points are awarded. Repeated violations may lead to fewer survey invitations or account restrictions.
Complete your profile for more surveys. done. Continue →
0):?>
Total
Completed
Pending
0?'Under Review':'Approved';?>
0?$surveyStats['flagged']:$surveyStats['completes']-$surveyStats['pending']-$surveyStats['flagged'];?>
How it works: Click any survey to see full details. Completed surveys are reviewed when the project closes. Points are credited once approved. "Under Review" means quality concerns (e.g., LOI below minimum threshold). = normal LOI, = slow, = below threshold.
Survey History
$s): list($lbl,$cls,$desc)=getSurveyLabel($s); $eloiSec = intval($s['eloi']??0)*60; $thPct = floatval($s['speedster_threshold_pct']??33.33); $thSec = $eloiSec>0 ? $eloiSec*($thPct/100) : 0; $aLoi = $s['actual_loi_seconds'] ? intval($s['actual_loi_seconds']) : null; $loiPct = ($eloiSec>0 && $aLoi) ? min(100,round(($aLoi/$eloiSec)*100)) : 0; $loiCls = 'loi-ok'; if ($aLoi && $thSec>0 && $aLoi<$thSec) $loiCls='loi-fast'; elseif ($loiPct>150) $loiCls='loi-slow'; $pts = $surveyPointsByProject[$s['project_id']] ?? null; $rewardTxt = '-'; if ($s['url_status']==='complete') { if ($pts) $rewardTxt = number_format($pts['points'],0).' pts (₹'.number_format($pts['points']*0.5,2).')'; elseif (($s['quality_flag']??'valid')!=='valid') $rewardTxt = 'Held for review'; elseif ($s['project_status']==='Closed') $rewardTxt = 'Awaiting credit'; else $rewardTxt = 'Pending project closure'; } ?>
· ·
Invited On
Started At
Completed At
Your LOI
Expected LOI
min
Min Required LOI
0 ? fmtLoi(round($thSec)).' ('.$thPct.'%)' : '-';?>
Project Status
Reward

No surveys yet.

📊

No Surveys Yet

Complete your profile to receive survey invitations.

Know Me Better

Complete all sections to earn up to 70 points!

done
Mobile Verification
10 ptsVerify Now
$sn):$c=$profilerCompletion[$sk]??null;$d=$c&&$c['is_completed'];$pct=$c?$c['completion_percentage']:0;$pa=$c&&$c['points_awarded'];$ic=$d?'done':($pct>0?'part':'empty');$isISEC=$sk==='household_classification';$sectionPts=$isISEC?20:5;$rv=$sectionPts*0.5;$sectionRs=($rv==floor($rv))?number_format($rv,0):number_format($rv,2);?>
':round($pct).'%';?>
IMPORTANT
0?'In progress':($isISEC?'Required for survey matching':'Not started'));?>
pts>0?'Continue':'Start · ₹'.$sectionRs);?>
Available
Total Earned
Redeemed
Redeem Points
=500 && !empty($upiId)):?>

Minimum: 500 points (₹250). Cash via UPI to

Redeem Now =500 && empty($upiId)):?>
You have crossed the minimum redemption amount but have not updated your UPI ID in the Profile section. Please add your UPI ID first.
Update UPI in Profile
Need 500 points (₹250) minimum. You have more needed.
Recent Redemptions
# · pts → ₹
to ·
Paid via · Ref: ·
Rewards History
No rewards yet. Complete your profile and participate in surveys to earn points!
pts
Account
Email
Gender
Date of Birth
Postcode
Status
Active Verified
Mobile
+91 verified
Not verified
Verify
UPI Details

For reward payments.

e.g. yourname@paytm, yourname@phonepe
UPI:
-------------------- END OF FILE -------------------- FILE: RR com/referral.php TYPE: PHP SIZE: 27.19 KB ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } $userId = $user['id']; $memberRef = 'RR' . str_pad($userId, 7, '0', STR_PAD_LEFT); $refLink = 'https://relevantreflex.com/signup.php?mref=' . $memberRef; try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { die('System error.'); } // Points balance $userPoints = ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; try { $stmt = $pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$userId]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {} // Referral stats & history $stats = ['total_clicks' => 0, 'total_signups' => 0, 'total_verified' => 0, 'total_earned' => 0]; $referrals = []; try { $s = $pdo->prepare(" SELECT COUNT(*) AS total_clicks, SUM(signup_completed) AS total_signups, SUM(email_verified) AS total_verified, SUM(CASE WHEN signup_reward_paid = 1 THEN 5 ELSE 0 END) + SUM(survey_commission_earned) AS total_earned FROM member_referral_clicks WHERE referrer_user_id = ? "); $s->execute([$userId]); $row = $s->fetch(); if ($row) { $stats['total_clicks'] = (int)$row['total_clicks']; $stats['total_signups'] = (int)$row['total_signups']; $stats['total_verified'] = (int)$row['total_verified']; $stats['total_earned'] = round((float)$row['total_earned'], 2); } $h = $pdo->prepare(" SELECT id, ip_address, email, signup_completed, email_verified, signup_reward_paid, survey_commission_earned, clicked_at, signed_up_at, verified_at FROM member_referral_clicks WHERE referrer_user_id = ? ORDER BY clicked_at DESC LIMIT 100 "); $h->execute([$userId]); $referrals = $h->fetchAll(); } catch (Exception $e) {} // Referral reward transactions $rewardHistory = []; try { $stmt = $pdo->prepare(" SELECT transaction_type, points, source, description, created_at FROM point_transactions WHERE user_id = ? AND source IN ('member_referral', 'member_referral_survey') ORDER BY created_at DESC LIMIT 50 "); $stmt->execute([$userId]); $rewardHistory = $stmt->fetchAll(); } catch (Exception $e) {} // Sidebar data $profilerSections = ['personal_background'=>'Personal Background','household_family'=>'Household & Family','shopping_lifestyle'=>'Shopping & Lifestyle','technology_digital'=>'Technology & Digital','travel_transportation'=>'Travel & Transportation','health_fitness'=>'Health & Fitness','entertainment_media'=>'Entertainment & Media','food_dining'=>'Food & Dining','financial_services'=>'Financial Services','communication_payments'=>'Communication & Payments','household_classification'=>'Household Classification (ISEC)']; $profilerCompletion = []; try { $stmt = $pdo->prepare("SELECT section, is_completed FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$userId]); while ($r = $stmt->fetch()) $profilerCompletion[$r['section']] = $r; } catch (Exception $e) {} $completedSections = count(array_filter($profilerCompletion, fn($r) => $r['is_completed'])); $firstName = htmlspecialchars($user['first_name'] ?? explode('@', $user['email'])[0]); $initials = strtoupper(substr($user['first_name'] ?? $user['email'], 0, 1) . substr($user['last_name'] ?? '', 0, 1)); if (strlen($initials) < 2) $initials = strtoupper(substr($user['email'], 0, 2)); function maskEmail($email) { if (empty($email)) return '—'; $parts = explode('@', $email); if (count($parts) !== 2) return '—'; $name = $parts[0]; $domain = $parts[1]; $masked = substr($name, 0, 1) . str_repeat('*', max(1, strlen($name) - 1)); $dparts = explode('.', $domain); $maskedDomain = substr($dparts[0], 0, 1) . str_repeat('*', max(1, strlen($dparts[0]) - 1)); return $masked . '@' . $maskedDomain . '.' . ($dparts[1] ?? 'com'); } ?> Referral Programme — Relevant Reflex
Referral Programme
pts
Refer a Friend
Total Clicks
Signups
Verified
Total Earned
Your Referral Link

Share this link with anyone. When they register and verify their email, you earn rewards automatically.

How It Works
🔗
Share your link with friends, groups, or on social media
✍️
They register using your link and verify their email
You earn ₹5 (10 pts)
📋
Every time they complete a survey
You earn ₹5 (10 pts) more
💰
Rewards go directly into your points balance for redemption
 Where to Share Your Link
💬 Messaging Apps: WhatsApp groups, Telegram channels & groups, Instagram DMs
📱 Social Media: Facebook posts & stories, Instagram Reels/Shorts, YouTube video descriptions, Twitter/X threads
📣 Promotions: Digital ad banners, blog articles, email newsletters, LinkedIn posts
⚠️ Fair Use: Referral rewards are for genuine referrals only. Multiple clicks from the same IP are limited. Self-referrals are not counted. Abuse may result in reward reversal.
Click & Signup History
$r): ?>
#Referred EmailClickedSigned UpVerifiedSignup RewardSurvey Earnings
🔗
No referral clicks yet. Share your link to get started!
Not signed up
✓ Yes
Pending
✓ Verified
⏳ Pending
₹5 Paid Processing 0): ?> ₹0.00
-------------------- END OF FILE -------------------- FILE: RR com/reset-password.php TYPE: PHP SIZE: 10.56 KB ------------------------------------------------------------ getConnection(); $stmt = $pdo->prepare(" SELECT email, expires_at FROM password_resets WHERE token = ? AND expires_at > NOW() "); $stmt->execute([$token]); $reset = $stmt->fetch(); if ($reset) { $email = $reset['email']; $isValidToken = true; } } catch (Exception $e) { logError('Error checking reset token', ['error' => $e->getMessage()]); } } // Handle password reset form submission if ($_SERVER['REQUEST_METHOD'] === 'POST' && $isValidToken) { $newPassword = isset($_POST['password']) ? $_POST['password'] : ''; $confirmPassword = isset($_POST['confirm_password']) ? $_POST['confirm_password'] : ''; // Validation $errors = []; if (empty($newPassword)) { $errors[] = 'Password is required.'; } if (empty($confirmPassword)) { $errors[] = 'Please confirm your password.'; } if (!validatePassword($newPassword)) { $errors[] = 'Password must be at least 8 characters long.'; } if ($newPassword !== $confirmPassword) { $errors[] = 'Passwords do not match.'; } if (empty($errors)) { try { // Start transaction $pdo->beginTransaction(); // Hash new password $hashedPassword = hashPassword($newPassword); // Update user password $stmt = $pdo->prepare("UPDATE users SET password = ?, updated_at = NOW() WHERE email = ?"); $stmt->execute([$hashedPassword, $email]); // Delete used reset token $stmt = $pdo->prepare("DELETE FROM password_resets WHERE token = ?"); $stmt->execute([$token]); // Delete all user sessions (force re-login) $stmt = $pdo->prepare("DELETE FROM user_sessions WHERE user_id = (SELECT id FROM users WHERE email = ?)"); $stmt->execute([$email]); // Commit transaction $pdo->commit(); logError('Password reset successful', ['email' => $email]); // Redirect to success page showResetResult(true, 'Password Reset Successful', 'Your password has been reset successfully. You can now log in with your new password.'); } catch (PDOException $e) { if ($pdo->inTransaction()) { $pdo->rollback(); } logError('Database error during password reset', [ 'error' => $e->getMessage(), 'email' => $email ]); $errors[] = 'Failed to reset password due to a system error. Please try again later.'; } catch (Exception $e) { if ($pdo->inTransaction()) { $pdo->rollback(); } logError('General error during password reset', [ 'error' => $e->getMessage(), 'email' => $email ]); $errors[] = 'An unexpected error occurred. Please try again later.'; } } } function showResetResult($success, $title, $message) { $statusClass = $success ? 'success' : 'error'; $statusColor = $success ? '#28a745' : '#dc3545'; $iconClass = $success ? 'fa-check-circle' : 'fa-exclamation-triangle'; ?> <?php echo htmlspecialchars($title); ?> - Relevant Reflex
Reset Password - Relevant Reflex

Set New Password

Enter your new password below.

', array_map('htmlspecialchars', $errors)); ?>
Minimum 8 characters
-------------------- END OF FILE -------------------- FILE: RR com/robots.txt TYPE: TXT SIZE: 1.22 KB ------------------------------------------------------------ # robots.txt — relevantreflex.com # Updated: April 2026 User-agent: * # Allow all public pages Allow: / # Block member-only pages — no SEO value, protect user privacy Disallow: /login.php Disallow: /logout.php Disallow: /dashboard.php Disallow: /profiler.php Disallow: /my-surveys.php Disallow: /redemption.php Disallow: /referral.php Disallow: /support.php Disallow: /user-support.php Disallow: /mobile-verification.php Disallow: /forgot-password.php Disallow: /reset-password.php Disallow: /verify.php Disallow: /points-manager.php # Block admin/partner/internal areas Disallow: /partners/ Disallow: /clients/ Disallow: /superlog/ Disallow: /cron/ Disallow: /r/ Disallow: /s/ # Block config and utility files Disallow: /config.php Disallow: /session.php Disallow: /email.php Disallow: /gtag.php Disallow: /isec-helper.php Disallow: /shop-db-config.php Disallow: /sms-config.php Disallow: /errors.log Disallow: /fix-rupee.php Disallow: /default.php Disallow: /profiler-api.php Disallow: /support-upload-helper.php Disallow: /partner-support-creation.php Disallow: /close-project-rewards.php Disallow: /update-ticket-status.php # Block upload folders Disallow: /uploads/ # Sitemap location Sitemap: https://www.relevantreflex.com/sitemap.xml -------------------- END OF FILE -------------------- FILE: RR com/session.php TYPE: PHP SIZE: 6.18 KB ------------------------------------------------------------ pdo = $db->getConnection(); // Start session if not already started if (session_status() === PHP_SESSION_NONE) { session_start(); } // Check for remember me token if user is not logged in if (!$this->isLoggedIn() && isset($_COOKIE['remember_token'])) { $this->checkRememberToken($_COOKIE['remember_token']); } } public function isLoggedIn() { return isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true && isset($_SESSION['user_id']) && !empty($_SESSION['user_id']); } public function getCurrentUser() { if (!$this->isLoggedIn()) { return null; } try { $stmt = $this->pdo->prepare(" SELECT id, email, gender, date_of_birth, postcode, email_verified, onboarding_completed, onboarding_points_awarded, status, created_at, last_login FROM users WHERE id = ? AND status = 'active' "); $stmt->execute([$_SESSION['user_id']]); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching current user', [ 'error' => $e->getMessage(), 'user_id' => $_SESSION['user_id'] ]); return null; } } public function requireLogin() { if (!$this->isLoggedIn()) { $this->redirectToLogin(); } // Check if user still exists and is active $user = $this->getCurrentUser(); if (!$user) { $this->logout(); $this->redirectToLogin('Your session has expired. Please log in again.'); } } public function logout() { // Delete remember me token if exists if (isset($_COOKIE['remember_token'])) { try { $stmt = $this->pdo->prepare("DELETE FROM user_sessions WHERE session_token = ?"); $stmt->execute([$_COOKIE['remember_token']]); } catch (Exception $e) { logError('Error clearing remember token', ['error' => $e->getMessage()]); } setcookie('remember_token', '', time() - 3600, '/', '', true, true); } // Clear session $_SESSION = []; session_destroy(); } public function redirectToLogin($message = null) { $url = 'login.php'; if ($message) { $url .= '?message=' . urlencode($message); } header('Location: ' . $url); exit; } public function redirectToDashboard() { header('Location: dashboard.php'); exit; } public function redirectAfterLogin() { // Check if there's a redirect URL stored if (isset($_SESSION['redirect_after_login'])) { $redirect = $_SESSION['redirect_after_login']; unset($_SESSION['redirect_after_login']); header('Location: ' . $redirect); exit; } $this->redirectToDashboard(); } private function checkRememberToken($token) { try { $stmt = $this->pdo->prepare(" SELECT us.user_id, u.email FROM user_sessions us JOIN users u ON us.user_id = u.id WHERE us.session_token = ? AND us.expires_at > NOW() AND u.status = 'active' "); $stmt->execute([$token]); $session = $stmt->fetch(); if ($session) { // Restore session $_SESSION['user_id'] = $session['user_id']; $_SESSION['user_email'] = $session['email']; $_SESSION['logged_in'] = true; $_SESSION['login_time'] = time(); // Update last login $stmt = $this->pdo->prepare("UPDATE users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$session['user_id']]); logError('User auto-logged in via remember token', [ 'user_id' => $session['user_id'], 'email' => $session['email'] ]); } else { // Invalid or expired token - delete it setcookie('remember_token', '', time() - 3600, '/', '', true, true); } } catch (Exception $e) { logError('Error checking remember token', ['error' => $e->getMessage()]); } } public function getUserAge() { $user = $this->getCurrentUser(); if (!$user || !$user['date_of_birth']) { return null; } $birthDate = new DateTime($user['date_of_birth']); $today = new DateTime(); return $today->diff($birthDate)->y; } public function updateLastActivity() { if ($this->isLoggedIn()) { $_SESSION['last_activity'] = time(); } } public function checkSessionTimeout($timeoutMinutes = 120) { if ($this->isLoggedIn() && isset($_SESSION['last_activity'])) { $timeoutSeconds = $timeoutMinutes * 60; if (time() - $_SESSION['last_activity'] > $timeoutSeconds) { $this->logout(); $this->redirectToLogin('Your session has expired due to inactivity.'); } } $this->updateLastActivity(); } } // Global function to get session manager instance function getSessionManager() { static $instance = null; if ($instance === null) { $instance = new SessionManager(); } return $instance; } // Convenience functions function requireLogin() { getSessionManager()->requireLogin(); } function getCurrentUser() { return getSessionManager()->getCurrentUser(); } function isLoggedIn() { return getSessionManager()->isLoggedIn(); } function logout() { getSessionManager()->logout(); } include_once $_SERVER['DOCUMENT_ROOT'] . '/superlog/banner.php'; ?> -------------------- END OF FILE -------------------- FILE: RR com/shop-db-config.php TYPE: PHP SIZE: 912 B ------------------------------------------------------------ PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ] ); } catch (PDOException $e) { error_log("Shop database connection failed: " . $e->getMessage()); return null; } } return $shopPdo; } -------------------- END OF FILE -------------------- FILE: RR com/signup.php TYPE: PHP SIZE: 56.95 KB ------------------------------------------------------------ PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ] ); // Check if affiliate exists and is active $stmt = $adminPdo->prepare("SELECT * FROM affiliates WHERE affiliate_code = ? AND status = 'active'"); $stmt->execute([$affiliate_code]); $affiliate = $stmt->fetch(); if ($affiliate) { // Track the click (only if not already tracked in this session) if (!isset($_SESSION['affiliate_tracked_' . $affiliate['id']])) { $trackStmt = $adminPdo->prepare(" INSERT INTO affiliate_signups (affiliate_id, ip_address, user_agent, clicked_at) VALUES (?, ?, ?, NOW()) "); $trackStmt->execute([ $affiliate['id'], $_SERVER['REMOTE_ADDR'] ?? null, $_SERVER['HTTP_USER_AGENT'] ?? null ]); $_SESSION['affiliate_tracked_' . $affiliate['id']] = true; $_SESSION['affiliate_signup_id'] = $adminPdo->lastInsertId(); } $affiliate_signup_id = $_SESSION['affiliate_signup_id'] ?? null; } } catch (Exception $e) { logError('Affiliate tracking error: ' . $e->getMessage()); } } // ===== END AFFILIATE TRACKING CODE ===== // ===== MEMBER REFERRAL TRACKING CODE ===== $mref_code = isset($_GET['mref']) ? strtoupper(sanitize($_GET['mref'])) : ''; $mref_user = null; $mref_click_id = null; if (!empty($mref_code) && preg_match('/^RR\d{7}$/', $mref_code)) { try { $mrefPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrpanel;charset=utf8mb4", 'u752449863_rrpaneladmin', 'S@n@h2016', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); // Resolve member ID to numeric user id $mrefNumericId = intval(ltrim(substr($mref_code, 2), '0') ?: '0'); $stmt = $mrefPdo->prepare("SELECT id, email, status FROM users WHERE id = ? AND status = 'active' AND email_verified = 1"); $stmt->execute([$mrefNumericId]); $mref_user = $stmt->fetch(); if ($mref_user) { $clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; // Block if visitor IP matches the referrer's own signup IP $ipCheck = $mrefPdo->prepare("SELECT signup_ip FROM users WHERE id = ?"); $ipCheck->execute([$mref_user['id']]); $referrerIpRow = $ipCheck->fetch(); $isSameIPAsReferrer = ($referrerIpRow && !empty($referrerIpRow['signup_ip']) && $referrerIpRow['signup_ip'] === $clientIP); // SPAM: max 5 hits per IP per referrer link $spamCheck = $mrefPdo->prepare("SELECT COUNT(*) as cnt FROM member_referral_clicks WHERE referrer_user_id = ? AND ip_address = ?"); $spamCheck->execute([$mref_user['id'], $clientIP]); $spamRow = $spamCheck->fetch(); // Also block Facebook/crawler IPs (2a03:2880:: prefix) $isCrawler = (strpos($clientIP, '2a03:2880:') === 0); if (!$isCrawler && !$isSameIPAsReferrer && $spamRow['cnt'] < 5 && !isset($_SESSION['mref_tracked_' . $mref_user['id']])) { $ins = $mrefPdo->prepare("INSERT INTO member_referral_clicks (referrer_user_id, ip_address, user_agent, clicked_at) VALUES (?, ?, ?, NOW())"); $ins->execute([$mref_user['id'], $clientIP, $_SERVER['HTTP_USER_AGENT'] ?? null]); $_SESSION['mref_click_id'] = $mrefPdo->lastInsertId(); $_SESSION['mref_tracked_' . $mref_user['id']] = true; } $mref_click_id = $_SESSION['mref_click_id'] ?? null; } } catch (Exception $e) { logError('Member referral tracking error: ' . $e->getMessage()); } } // ===== END MEMBER REFERRAL TRACKING CODE ===== $errors = []; $success_message = ''; $form_data = []; $fire_conversion = false; // Google Ads conversion flag // ===== ANTI-BOT: Generate CSRF token ===== if (!isset($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Reset form timing on page load (GET), not POST if ($_SERVER['REQUEST_METHOD'] !== 'POST') { $_SESSION['form_loaded_at'] = time(); } // ===== ANTI-BOT: reCAPTCHA v3 config ===== $recaptcha_site_key = defined('RECAPTCHA_SITE_KEY') ? RECAPTCHA_SITE_KEY : ''; $recaptcha_secret_key = defined('RECAPTCHA_SECRET_KEY') ? RECAPTCHA_SECRET_KEY : ''; // Handle form submission if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in signup.php: ' . $e->getMessage()); $errors[] = 'System error. Please try again later.'; } if (empty($errors)) { $clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; $honeypotTriggered = false; // ===== ANTI-BOT CHECK 1: Honeypot field ===== if (!empty($_POST['website_url'])) { // Bots fill hidden fields - silently reject $honeypotTriggered = true; logError('Honeypot triggered on signup', ['ip' => $clientIP, 'ua' => $userAgent]); // Log the attempt try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent, honeypot_triggered) VALUES (?, ?, 'registration', 0, ?, 1)") ->execute([$clientIP, $_POST['email'] ?? '', $userAgent]); } catch (Exception $e) {} // Show fake success to not alert the bot $success_message = 'Registration successful! We\'ve sent a verification link to your email address. Please check your inbox and click the link to activate your account.'; $form_data = []; } // ===== ANTI-BOT CHECK 2: CSRF token ===== if (!$honeypotTriggered) { $submittedToken = $_POST['csrf_token'] ?? ''; if (empty($submittedToken) || !hash_equals($_SESSION['csrf_token'], $submittedToken)) { $errors[] = 'Security validation failed. Please refresh the page and try again.'; logError('CSRF token mismatch on signup', ['ip' => $clientIP]); } } // ===== ANTI-BOT CHECK 3: Time-based detection (form filled too fast) ===== if (!$honeypotTriggered && empty($errors)) { $formLoadedAt = $_SESSION['form_loaded_at'] ?? time(); $timeTaken = time() - $formLoadedAt; if ($timeTaken < 3) { $errors[] = 'Please take your time filling out the form.'; logError('Form submitted too quickly', ['ip' => $clientIP, 'seconds' => $timeTaken]); try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, attempt_type, success, user_agent) VALUES (?, 'registration', 0, ?)") ->execute([$clientIP, $userAgent]); } catch (Exception $e) {} } } // ===== ANTI-BOT CHECK 4: IP blocklist ===== if (!$honeypotTriggered && empty($errors)) { try { $stmt = $pdo->prepare("SELECT id FROM ip_blocklist WHERE ip_address = ? AND (expires_at IS NULL OR expires_at > NOW())"); $stmt->execute([$clientIP]); if ($stmt->fetch()) { $errors[] = 'Registration is temporarily unavailable from your network. Please contact support.'; logError('Blocked IP attempted signup', ['ip' => $clientIP]); } } catch (Exception $e) {} } // ===== ANTI-BOT CHECK 5: Rate limiting ===== if (!$honeypotTriggered && empty($errors)) { try { $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM registration_attempts WHERE ip_address = ? AND attempt_type = 'registration' AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)"); $stmt->execute([$clientIP]); $attempts = $stmt->fetch(); if ($attempts && $attempts['cnt'] >= MAX_ATTEMPTS_PER_IP_HOUR) { $errors[] = 'Too many registration attempts. Please try again later.'; logError('Rate limit exceeded on signup', ['ip' => $clientIP, 'attempts' => $attempts['cnt']]); if ($attempts['cnt'] >= MAX_ATTEMPTS_PER_IP_HOUR * 3) { try { $pdo->prepare("INSERT IGNORE INTO ip_blocklist (ip_address, reason, blocked_by, expires_at) VALUES (?, 'Excessive registration attempts', 'system', DATE_ADD(NOW(), INTERVAL 2 HOUR))") ->execute([$clientIP]); } catch (Exception $e) {} } } } catch (Exception $e) {} } // ===== ANTI-BOT CHECK 6: IP duplicate registration (permanent - no time window) ===== if (!$honeypotTriggered && empty($errors)) { try { $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM users WHERE signup_ip = ?"); $stmt->execute([$clientIP]); $ipSignups = $stmt->fetch(); if ($ipSignups && $ipSignups['cnt'] >= 1) { $errors[] = 'An account has already been registered from your network. If you believe this is an error, please contact support@relevantreflex.com.'; logError('Duplicate IP registration blocked (permanent)', ['ip' => $clientIP, 'existing_count' => $ipSignups['cnt']]); try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent) VALUES (?, ?, 'registration', 0, ?)") ->execute([$clientIP, $_POST['email'] ?? '', $userAgent]); } catch (Exception $e) {} } } catch (Exception $e) {} } // ===== ANTI-BOT CHECK 7: reCAPTCHA v3 verification ===== if (!$honeypotTriggered && empty($errors) && !empty($recaptcha_secret_key)) { $recaptchaResponse = $_POST['g-recaptcha-response'] ?? ''; if (empty($recaptchaResponse)) { $errors[] = 'Security verification failed. Please try again.'; } else { $verifyUrl = 'https://www.google.com/recaptcha/api/siteverify'; $response = file_get_contents($verifyUrl . '?' . http_build_query([ 'secret' => $recaptcha_secret_key, 'response' => $recaptchaResponse, 'remoteip' => $clientIP ])); $recaptchaResult = json_decode($response, true); $captchaScore = $recaptchaResult['score'] ?? 0; if (!($recaptchaResult['success'] ?? false) || $captchaScore < 0.3) { $errors[] = 'Security verification failed. If you are not a robot, please try again.'; logError('reCAPTCHA failed', ['ip' => $clientIP, 'score' => $captchaScore]); try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, attempt_type, success, user_agent, captcha_score) VALUES (?, 'registration', 0, ?, ?)") ->execute([$clientIP, $userAgent, $captchaScore]); } catch (Exception $e) {} } } } // Get and sanitize form data $email = isset($_POST['email']) ? sanitize($_POST['email']) : ''; $email_confirm = isset($_POST['email_confirm']) ? sanitize($_POST['email_confirm']) : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; $gender = isset($_POST['gender']) ? sanitize($_POST['gender']) : ''; $dateOfBirth = isset($_POST['date_of_birth']) ? sanitize($_POST['date_of_birth']) : ''; $postcode = isset($_POST['postcode']) ? sanitize($_POST['postcode']) : ''; $privacyAccepted = isset($_POST['privacy_policy']) ? true : false; // FIX #4: Age confirmation checkbox validation $ageConfirmed = isset($_POST['age_confirm']) ? true : false; // Store form data for repopulating form on error $form_data = [ 'email' => $email, 'gender' => $gender, 'date_of_birth' => $dateOfBirth, 'postcode' => $postcode, 'whatsapp_number' => isset($_POST['whatsapp_number']) ? sanitize($_POST['whatsapp_number']) : '', ]; // Validation if (empty($email)) { $errors[] = 'Email is required.'; } if (!empty($email) && !empty($email_confirm) && $email !== $email_confirm) { $errors[] = 'Email addresses do not match. Please check and try again.'; } if (empty($email_confirm)) { $errors[] = 'Please confirm your email address.'; } if (empty($password)) { $errors[] = 'Password is required.'; } if (empty($gender)) { $errors[] = 'Gender is required.'; } if (empty($dateOfBirth)) { $errors[] = 'Date of birth is required.'; } if (empty($postcode)) { $errors[] = 'Postcode is required.'; } if (!$privacyAccepted) { $errors[] = 'You must agree to the Privacy Policy and Terms & Conditions.'; } // FIX #4: Validate age confirmation if (!$ageConfirmed) { $errors[] = 'You must confirm that you are 18 years of age or older.'; } // Validate email format if (!empty($email) && !validateEmail($email)) { $errors[] = 'Please provide a valid email address.'; } // Validate password strength if (!empty($password) && !validatePassword($password)) { $errors[] = 'Password must be at least 8 characters long.'; } // Validate gender if (!empty($gender) && !in_array($gender, ['Male', 'Female'])) { $errors[] = 'Please select a valid gender.'; } // Validate date of birth if (!empty($dateOfBirth) && !validateDateOfBirth($dateOfBirth)) { $errors[] = 'You must be at least 18 years old to register.'; } // Validate postcode if (!empty($postcode) && !validatePostcode($postcode)) { $errors[] = 'Please provide a valid 6-digit postal code.'; } // ===== WHATSAPP NUMBER ===== $whatsapp_number = isset($_POST['whatsapp_number']) ? preg_replace('/\D/', '', sanitize($_POST['whatsapp_number'])) : ''; $whatsapp_number_confirm = isset($_POST['whatsapp_number_confirm']) ? preg_replace('/\D/', '', sanitize($_POST['whatsapp_number_confirm'])) : ''; $is_whatsapp = isset($_POST['is_whatsapp']) ? 1 : 0; if (empty($whatsapp_number)) { $errors[] = 'Mobile/WhatsApp number is required.'; } elseif (!preg_match('/^[6-9][0-9]{9}$/', $whatsapp_number)) { $errors[] = 'Please enter a valid 10-digit Indian mobile number (starting with 6–9).'; } elseif ($whatsapp_number !== $whatsapp_number_confirm) { $errors[] = 'Mobile numbers do not match. Please check and try again.'; } // ===== END WHATSAPP NUMBER ===== // If no validation errors, proceed with registration if (empty($errors)) { try { // Check if email already exists $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?"); $stmt->execute([$email]); if ($stmt->rowCount() > 0) { $errors[] = 'An account with this email address already exists. Please try logging in or use a different email.'; } else { // Hash the password $hashedPassword = hashPassword($password); // Start transaction $pdo->beginTransaction(); // Insert new user (with signup IP) $stmt = $pdo->prepare(" INSERT INTO users (email, password, gender, date_of_birth, postcode, whatsapp_number, whatsapp_is_whatsapp, signup_ip, email_verified, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0, 'inactive', NOW()) "); $stmt->execute([$email, $hashedPassword, $gender, $dateOfBirth, $postcode, $whatsapp_number, $is_whatsapp, $clientIP]); $userId = $pdo->lastInsertId(); // Auto-map state & city from PIN code try { $pinStmt = $pdo->prepare("SELECT state, city FROM pin_lookup WHERE pincode = ? LIMIT 1"); $pinStmt->execute([$postcode]); $pinRow = $pinStmt->fetch(PDO::FETCH_ASSOC); if ($pinRow) { $pdo->prepare("UPDATE users SET state = ?, city = ? WHERE id = ?")->execute([$pinRow['state'], $pinRow['city'], $userId]); } } catch (Exception $e) {} // Generate verification token $verificationToken = generateSecureToken(); $expiresAt = date('Y-m-d H:i:s', strtotime('+' . TOKEN_EXPIRY_HOURS . ' hours')); // Insert verification token $stmt = $pdo->prepare(" INSERT INTO email_verifications (user_id, token, expires_at, created_at) VALUES (?, ?, ?, NOW()) "); $stmt->execute([$userId, $verificationToken, $expiresAt]); // Commit transaction $pdo->commit(); // Log successful registration attempt try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent) VALUES (?, ?, 'registration', 1, ?)") ->execute([$clientIP, $email, $userAgent]); } catch (Exception $e) {} // Regenerate CSRF token $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // ===== UPDATE MEMBER REFERRAL TRACKING ===== if ($mref_user && $mref_click_id && isset($mrefPdo)) { try { $refIpCheck = $mrefPdo->prepare("SELECT signup_ip FROM users WHERE id = ?"); $refIpCheck->execute([$mref_user['id']]); $refIpRow = $refIpCheck->fetch(); $isSameIP = ($refIpRow && !empty($refIpRow['signup_ip']) && $refIpRow['signup_ip'] === $clientIP); if ($mref_user['id'] != $userId && !$isSameIP) { $mrefPdo->prepare(" UPDATE member_referral_clicks SET referee_user_id = ?, email = ?, signup_completed = 1, signed_up_at = NOW() WHERE id = ? ")->execute([$userId, $email, $mref_click_id]); } } catch (Exception $e) { logError('Member referral signup update error: ' . $e->getMessage()); } } // ===== END UPDATE MEMBER REFERRAL TRACKING ===== // ===== UPDATE AFFILIATE TRACKING ===== if ($affiliate && $affiliate_signup_id && $adminPdo) { try { $updateStmt = $adminPdo->prepare(" UPDATE affiliate_signups SET panel_user_id = ?, email = ?, signup_completed = 1, signed_up_at = NOW(), reward_amount = ? WHERE id = ? "); $updateStmt->execute([ $userId, $email, $affiliate['signup_reward'], $affiliate_signup_id ]); $adminPdo->exec("UPDATE affiliates SET total_signups = total_signups + 1 WHERE id = " . intval($affiliate['id'])); logError('Affiliate signup tracked', [ 'user_id' => $userId, 'affiliate_code' => $affiliate_code, 'email' => $email ]); } catch (Exception $e) { logError('Failed to update affiliate tracking: ' . $e->getMessage()); } } // ===== END UPDATE AFFILIATE TRACKING ===== // Send verification email $emailHandler = new EmailHandler(); $emailSent = $emailHandler->sendVerificationEmail($email, $verificationToken); if ($emailSent) { logError('User registered successfully', [ 'user_id' => $userId, 'email' => $email, 'verification_token_sent' => true, 'affiliate_code' => $affiliate_code ?? null ]); $success_message = 'Registration successful! We\'ve sent a verification link to your email address. Please check your inbox and click the link to activate your account.'; $form_data = []; $fire_conversion = true; // Real signup - fire Google Ads conversion } else { logError('User registered but email verification failed', [ 'user_id' => $userId, 'email' => $email ]); $success_message = 'Registration successful! However, we encountered an issue sending the verification email. Please contact support at support@relevantreflex.com to activate your account.'; $form_data = []; $fire_conversion = true; // Real signup - fire Google Ads conversion } } } catch (PDOException $e) { if ($pdo->inTransaction()) { $pdo->rollback(); } logError('Database error during registration', ['error' => $e->getMessage(), 'email' => $email]); $errors[] = 'Registration failed due to a system error. Please try again later.'; } catch (Exception $e) { if ($pdo->inTransaction()) { $pdo->rollback(); } logError('General error during registration', ['error' => $e->getMessage(), 'email' => $email]); $errors[] = 'An unexpected error occurred. Please try again later.'; } } } } ?> Sign Up - Relevant Reflex Paid Online Surveys India

Register as a Survey Taker for FREE!

Furnish some of your basic information below and start participating in paid surveys to earn rewards.

🎉 Partner Signup
Referred by:
0): ?>
🎁 Earn ₹ bonus on email & Mobile phone verification!
Type your email again — no copy/paste
Minimum 8 characters
+91
+91
Type again — no copy/paste
We care about your privacy. By sharing your personal data you will be able to get research opportunities targeted to your interests, help to improve products and services and earn rewards for participation
📧

One Step Left!

We've sent a verification link to:

Click the link in the email to activate your account and start earning.

OPEN YOUR EMAIL NOW:

Can't find it? Check your Spam or Junk folder. The email is from registration@relevantreflex.com

Already verified? Go to Login
-------------------- END OF FILE -------------------- FILE: RR com/sitemap.xml TYPE: XML SIZE: 4.72 KB ------------------------------------------------------------ https://www.relevantreflex.com/ 2026-04-10 weekly 1.0 https://www.relevantreflex.com/about.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/doubts.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles.php 2026-04-10 weekly 0.9 https://www.relevantreflex.com/contact.php 2026-04-07 monthly 0.6 https://www.relevantreflex.com/privacy.php 2026-04-07 yearly 0.4 https://www.relevantreflex.com/terms.php 2026-04-07 yearly 0.4 https://www.relevantreflex.com/disclaimer.php 2026-04-07 yearly 0.4 https://www.relevantreflex.com/ticket-guide.php 2026-04-07 monthly 0.4 https://www.relevantreflex.com/articles/earn-money-online-surveys-india-guide.php 2026-04-13 monthly 0.9 https://www.relevantreflex.com/articles/paid-surveys-india-earning-potential.php 2026-04-09 monthly 0.9 https://www.relevantreflex.com/articles/relevant-reflex-review-legit.php 2026-04-09 monthly 0.9 https://www.relevantreflex.com/articles/best-paid-survey-sites-india.php 2026-04-09 monthly 0.8 https://www.relevantreflex.com/articles/online-surveys-india-students.php 2026-04-09 monthly 0.8 https://www.relevantreflex.com/articles/online-surveys-india-housewives.php 2026-04-10 monthly 0.8 https://www.relevantreflex.com/articles/how-to-identify-genuine-survey-websites.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/5-ways-maximize-survey-earnings.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/complete-guide-survey-beginners-india.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/realistic-earning-expectations-surveys-india.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/best-survey-platforms-indian-users.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/time-management-tips-survey-takers.php 2026-04-07 monthly 0.8 -------------------- END OF FILE -------------------- FILE: RR com/sms-config.php TYPE: PHP SIZE: 11.78 KB ------------------------------------------------------------ gateway = 'twofactor'; // Using 2Factor as primary gateway // SMS Gateway configurations $this->config = [ 'msg91' => [ 'auth_key' => 'YOUR_MSG91_AUTH_KEY', // Replace with actual key 'template_id' => 'YOUR_TEMPLATE_ID', // Replace with actual template ID 'route' => '4', // Transactional route 'country' => '91' ], 'textlocal' => [ 'api_key' => 'YOUR_TEXTLOCAL_API_KEY', 'username' => 'YOUR_TEXTLOCAL_USERNAME', 'hash' => 'YOUR_TEXTLOCAL_HASH', 'sender' => 'TXTLCL' // 6 characters or less ], 'twofactor' => [ 'api_key' => '79d4feb6-d168-11ea-9fa5-0200cd936042', // Your actual 2Factor API key 'sender_id' => 'RELREF', // Matches 2Factor dashboard: Sender Id = RELREF 'template_name' => 'Profile OTP' // Matches 2Factor dashboard: Template Name = Profile OTP ], 'fast2sms' => [ 'api_key' => 'YOUR_FAST2SMS_API_KEY', 'route' => 'dlt', // DLT route for OTP 'sender_id' => 'FSTSMS' ] ]; } /** * Send OTP SMS */ public function sendOTP($mobileNumber, $otpCode, $templateMessage = null) { // Clean mobile number $mobileNumber = preg_replace('/[^0-9]/', '', $mobileNumber); // Remove leading zero if present if (substr($mobileNumber, 0, 1) === '0') { $mobileNumber = substr($mobileNumber, 1); } // Default OTP message if (!$templateMessage) { $templateMessage = "Your Relevant Reflex verification code is: {$otpCode}. Valid for 10 minutes. Do not share this with anyone."; } switch ($this->gateway) { case 'msg91': return $this->sendViaMSG91($mobileNumber, $otpCode, $templateMessage); case 'textlocal': return $this->sendViaTextLocal($mobileNumber, $templateMessage); case 'twofactor': return $this->sendViaTwoFactor($mobileNumber, $otpCode); case 'fast2sms': return $this->sendViaFast2SMS($mobileNumber, $templateMessage); default: return $this->mockSend($mobileNumber, $otpCode); // For testing } } /** * MSG91 SMS Gateway */ private function sendViaMSG91($mobileNumber, $otpCode, $message) { $config = $this->config['msg91']; $url = "https://api.msg91.com/api/v5/otp"; $data = [ 'template_id' => $config['template_id'], 'mobile' => $config['country'] . $mobileNumber, 'authkey' => $config['auth_key'], 'otp' => $otpCode, 'extra_param' => json_encode(['otp' => $otpCode]) ]; return $this->makeAPICall($url, $data, 'POST'); } /** * TextLocal SMS Gateway */ private function sendViaTextLocal($mobileNumber, $message) { $config = $this->config['textlocal']; $url = "https://api.textlocal.in/send/"; $data = [ 'apikey' => $config['api_key'], 'numbers' => '91' . $mobileNumber, 'message' => $message, 'sender' => $config['sender'] ]; return $this->makeAPICall($url, $data, 'POST'); } /** * 2Factor SMS Gateway * * Uses OTP SMS API with explicit template name to force SMS delivery. * Template: "XXXX is the OTP to verify your mobile number at Relevant Reflex" * Sender ID: RELREF | Template Name: Profile OTP * * By specifying the template name in the URL, 2Factor uses the registered * DLT SMS template instead of defaulting to voice calls. */ private function sendViaTwoFactor($mobileNumber, $otpCode) { $config = $this->config['twofactor']; // OTP API with template name — forces SMS delivery via registered DLT template // Format: /SMS/{phone}/{otp}/{template_name} $templateName = urlencode($config['template_name']); $url = "https://2factor.in/API/V1/{$config['api_key']}/SMS/{$mobileNumber}/{$otpCode}/{$templateName}"; $result = $this->makeAPICall($url, [], 'GET'); // Log the attempt logError('2Factor OTP SMS with template', [ 'mobile' => $mobileNumber, 'template' => $config['template_name'], 'status' => $result['response']['Status'] ?? 'unknown', 'details' => $result['response']['Details'] ?? 'none' ]); if ($result['success'] && isset($result['response']['Status']) && $result['response']['Status'] == 'Success') { return [ 'success' => true, 'message' => 'OTP sent via SMS successfully', 'session_id' => $result['response']['Details'] ?? null, 'response' => $result['response'] ]; } return [ 'success' => false, 'message' => 'Failed to send SMS OTP: ' . ($result['response']['Details'] ?? 'Unknown error'), 'response' => $result['response'] ?? [] ]; } /** * Fast2SMS Gateway */ private function sendViaFast2SMS($mobileNumber, $message) { $config = $this->config['fast2sms']; $url = "https://www.fast2sms.com/dev/bulkV2"; $data = [ 'authorization' => $config['api_key'], 'sender_id' => $config['sender_id'], 'message' => $message, 'route' => $config['route'], 'numbers' => $mobileNumber ]; $headers = [ 'authorization: ' . $config['api_key'], 'Content-Type: application/json' ]; return $this->makeAPICall($url, $data, 'POST', $headers); } /** * Mock SMS sending for testing */ private function mockSend($mobileNumber, $otpCode) { logError('Mock SMS sent', [ 'mobile' => $mobileNumber, 'otp' => $otpCode, 'message' => 'OTP for testing: ' . $otpCode ]); return [ 'success' => true, 'message' => 'SMS sent successfully (Mock)', 'reference_id' => 'MOCK_' . time() ]; } /** * Make API call to SMS gateway */ private function makeAPICall($url, $data, $method = 'POST', $headers = []) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); if ($method === 'POST') { curl_setopt($ch, CURLOPT_POST, true); if (!empty($data)) { if (empty($headers) || !in_array('Content-Type: application/json', $headers)) { curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); } else { curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); } } } if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); if ($error) { logError('SMS API Error', ['error' => $error, 'url' => $url]); return [ 'success' => false, 'message' => 'Network error: ' . $error ]; } $decodedResponse = json_decode($response, true); logError('SMS API Response', [ 'url' => $url, 'http_code' => $httpCode, 'response' => $decodedResponse ?: $response ]); // Parse response based on gateway return $this->parseResponse($decodedResponse ?: $response, $httpCode); } /** * Parse SMS gateway response */ private function parseResponse($response, $httpCode) { if ($httpCode >= 200 && $httpCode < 300) { return [ 'success' => true, 'message' => 'SMS sent successfully', 'response' => $response ]; } else { return [ 'success' => false, 'message' => 'SMS sending failed', 'response' => $response ]; } } /** * Get available SMS balance (if supported by gateway) */ public function getBalance() { switch ($this->gateway) { case 'msg91': $config = $this->config['msg91']; $url = "https://api.msg91.com/api/balance.php?authkey={$config['auth_key']}&type=4"; return $this->makeAPICall($url, [], 'GET'); case 'twofactor': $config = $this->config['twofactor']; $url = "https://2factor.in/API/V1/{$config['api_key']}/ADDON_SERVICES/BAL/SMS"; return $this->makeAPICall($url, [], 'GET'); default: return ['success' => false, 'message' => 'Balance check not supported for this gateway']; } } } // Global SMS helper function function sendOTPSMS($mobileNumber, $otpCode) { $smsManager = new SMSManager(); return $smsManager->sendOTP($mobileNumber, $otpCode); } /* * SETUP INSTRUCTIONS FOR 2FACTOR SMS GATEWAY * =========================================== * * Your 2Factor API Key: 79d4feb6-d168-11ea-9fa5-0200cd936042 * * FIXING "VOICE CALL INSTEAD OF SMS" ISSUE: * ------------------------------------------ * The 2Factor OTP API has auto-retry that sends voice calls when SMS fails. * To get SMS working properly: * * STEP 1: Login to https://2factor.in with your account * * STEP 2: Disable Voice Auto-Retry * - Go to Dashboard → Settings (or OTP Settings) * - Find "Auto Retry" / "Voice OTP Retry" / "Retry Configuration" * - DISABLE it (turn off voice fallback) * * STEP 3: Check DLT Registration (REQUIRED for SMS in India) * - In India, TRAI requires DLT registration for all SMS * - Go to 2Factor Dashboard → DLT Settings / SMS Templates * - You need: * a) A registered Sender ID (e.g., "RREFX") * b) A DLT-approved Content Template for OTP * Example template: "Your Relevant Reflex OTP is {#var#}. Valid for 10 minutes." * - Update the sender_id and template_name in config above after registering * - If you don't have DLT registration, register at: * Jio: https://trueconnect.jio.com * Airtel: https://www.airtel.in/business/commercial-communication * Vodafone: https://smartping.live/entity/reg-as * * STEP 4: Check SMS Balance * - Go to Dashboard → Balance * - Verify you have SMS credits (not just voice credits) * - Current balance: ~7,038 SMS credits * * STEP 5: Test * - After disabling auto-retry and setting up DLT template * - Try sending OTP from mobile-verification.php * - Check errors.log for detailed API responses * * HOW THIS CODE WORKS: * - First tries Transactional SMS API (no voice fallback at all) * - If that fails, falls back to OTP API (may trigger voice if auto-retry is on) * - Both attempts are logged to errors.log for debugging * */ ?> -------------------- END OF FILE -------------------- FILE: RR com/support-upload-helper.php TYPE: PHP SIZE: 10.69 KB ------------------------------------------------------------ SUPPORT_MAX_FILE_SIZE) { continue; } // Validate extension $ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION)); if (!in_array($ext, SUPPORT_ALLOWED_EXTENSIONS)) { continue; } // Validate MIME type $finfo = new finfo(FILEINFO_MIME_TYPE); $detectedType = $finfo->file($tmpName); if (!in_array($detectedType, SUPPORT_ALLOWED_TYPES)) { continue; } // Generate unique filename $storedName = 'support_' . $messageId . '_' . uniqid() . '.' . $ext; $fullPath = $uploadPath . $storedName; $relativePath = SUPPORT_UPLOAD_URL . $monthDir . '/' . $storedName; if (move_uploaded_file($tmpName, $fullPath)) { try { $stmt = $pdo->prepare(" INSERT INTO support_attachments (message_id, file_name, original_name, file_path, file_type, file_size) VALUES (?, ?, ?, ?, ?, ?) "); $stmt->execute([$messageId, $storedName, $originalName, $relativePath, $detectedType, $fileSize]); $attachmentIds[] = $pdo->lastInsertId(); } catch (Exception $e) { // Clean up file if DB insert fails @unlink($fullPath); } } } return $attachmentIds; } /** * Get attachments for multiple messages (batch load) * @param PDO $pdo * @param array $messageIds Array of message IDs * @return array Keyed by message_id => [attachments] */ function getAttachmentsForMessages($pdo, $messageIds) { $result = []; if (empty($messageIds)) return $result; $placeholders = implode(',', array_fill(0, count($messageIds), '?')); $stmt = $pdo->prepare(" SELECT * FROM support_attachments WHERE message_id IN ($placeholders) ORDER BY created_at ASC "); $stmt->execute($messageIds); $attachments = $stmt->fetchAll(); foreach ($attachments as $att) { $result[$att['message_id']][] = $att; } return $result; } /** * Render attachment HTML for display * @param array $attachments Array of attachment rows * @return string HTML string */ function renderAttachmentsHTML($attachments) { if (empty($attachments)) return ''; $html = '
'; foreach ($attachments as $att) { $isImage = strpos($att['file_type'], 'image/') === 0; $sizeFormatted = formatFileSize($att['file_size']); $escapedName = htmlspecialchars($att['original_name']); $escapedPath = htmlspecialchars($att['file_path']); if ($isImage) { $html .= '
'; $html .= ''; $html .= '' . $escapedName . ''; $html .= ''; $html .= '
' . $escapedName . ' (' . $sizeFormatted . ')
'; $html .= '
'; } else { $icon = getFileIcon($att['file_type'], $att['original_name']); $html .= ''; } } $html .= '
'; return $html; } /** * Get Font Awesome icon class for file type */ function getFileIcon($mimeType, $fileName) { $ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); $icons = [ 'pdf' => 'fa-file-pdf', 'doc' => 'fa-file-word', 'docx' => 'fa-file-word', 'xls' => 'fa-file-excel', 'xlsx' => 'fa-file-excel', 'csv' => 'fa-file-csv', 'txt' => 'fa-file-alt', ]; return $icons[$ext] ?? 'fa-file'; } /** * Format file size to human readable */ function formatFileSize($bytes) { if ($bytes >= 1048576) return round($bytes / 1048576, 1) . ' MB'; if ($bytes >= 1024) return round($bytes / 1024, 1) . ' KB'; return $bytes . ' B'; } /** * CSS for attachments (include once per page) */ function getAttachmentCSS() { return ' '; } /** * Generate file input HTML for forms * @param string $inputName Name attribute for file input (default: attachments) * @return string HTML for file upload section */ function getFileUploadHTML($inputName = 'attachments') { return '
Max 3 files, 5MB each. Images, PDF, Word, Excel, Text.
'; } /** * JavaScript for showing selected file names (include once per page) */ function getFileUploadJS() { return ' '; } -------------------- END OF FILE -------------------- FILE: RR com/support.php TYPE: PHP SIZE: 1.96 KB ------------------------------------------------------------ -------------------- END OF FILE -------------------- FILE: RR com/terms.php TYPE: PHP SIZE: 36.01 KB ------------------------------------------------------------ Terms and Conditions - Relevant Reflex | Platform Usage Agreement
Last Updated: March 2026 | Effective Date: January 1, 2025
Welcome to Relevant Reflex!
These Terms and Conditions ("Terms") govern your use of our online survey platform and related services. Please read them carefully.

1 Acceptance of Terms

By using Relevant Reflex's services, you acknowledge that you have read, understood, and agree to be bound by these Terms, as well as our Privacy Policy.

If you do not agree with any part of these terms, you must not use our services. Your continued use of the platform constitutes acceptance of any modifications to these Terms.

2 Eligibility

2.1 Age Requirement

You must be at least 18 years old to use our services. By registering, you represent and warrant that you meet this age requirement.

2.2 Geographic Requirement

You must be a resident of India to participate in our surveys and receive rewards. This helps us provide relevant survey opportunities and comply with local regulations.

2.3 Account Limitations

You may only maintain one account with Relevant Reflex. Multiple accounts from the same individual are prohibited and may result in account suspension.

3 Account Registration and Security

3.1 Account Responsibility

You are responsible for:

  • Maintaining the confidentiality of your account information
  • All activities that occur under your account
  • Notifying us immediately of any unauthorized use
  • Ensuring your login credentials are secure

3.2 Accurate Information

You agree to provide accurate and up-to-date information during registration and throughout your use of our services. False or misleading information may result in account termination.

3.3 Account Verification

You must verify your email address and may be required to provide additional verification for account security or compliance purposes.

4 Survey Participation

4.1 Honest Responses

You agree to provide honest and thoughtful responses to surveys. Quality responses are essential for meaningful research.

4.2 Survey Qualification

We reserve the right to disqualify you from a survey if we detect:

  • Fraudulent or inconsistent responses
  • Use of automated tools or bots
  • Excessively fast completion times
  • Random or nonsensical answers

4.3 Survey Availability

Survey opportunities are based on your demographic profile and survey requirements. We cannot guarantee specific numbers or types of surveys.

Important: Completion of a survey does not guarantee reward if disqualified for quality reasons. We maintain strict quality standards to ensure valuable research data.

5 Rewards and Payments

5.1 Reward Distribution

Rewards will be issued as per the terms specified for each survey. Typical processing times are:

  • Survey validation: 1-5 business days
  • Payment processing: 3-7 business days
  • Bank transfer: 2-3 additional business days

5.2 Reward Modifications

We reserve the right to modify, suspend, or terminate the reward system at any time with reasonable notice to members.

5.3 Reward Restrictions and Payout Terms

Unless specified otherwise:

  • Rewards are non-transferable between accounts
  • Accumulated rewards can be withdrawn as cash via UPI once the minimum payout threshold has been reached. Rewards from specific bonus promotions may be subject to additional conditions stated at the time of the promotion.
  • Minimum payout threshold: ₹500. You must accumulate at least ₹500 in your account balance before requesting a withdrawal.
  • Payments are processed via UPI transfer to your registered UPI ID. UPI is currently the sole payment method for member withdrawals.
  • Payment processing may take 3–7 business days after a withdrawal request is submitted and approved.

5.4 Tax Responsibilities

You are responsible for reporting and paying any applicable taxes on rewards received. We may provide necessary documentation for tax purposes.

6 Intellectual Property

6.1 Platform Content

All content on our website, including text, graphics, logos, images, and software, is the property of Relevant Reflex or its licensors and is protected by copyright laws.

6.2 Usage Restrictions

You may not:

  • Use, reproduce, or distribute our content without express written permission
  • Modify or create derivative works from our platform
  • Reverse engineer any part of our services
  • Use our trademarks or branding without authorization

6.3 User-Generated Content

By providing survey responses and feedback, you grant us a non-exclusive, royalty-free license to use this information for research and platform improvement purposes.

7 Prohibited Conduct

You agree NOT to engage in any of the following activities:

7.1 Technical Violations

  • Use automated means (bots, scripts) to access our services or complete surveys
  • Attempt to interfere with the proper functioning of our website
  • Circumvent any security measures or access controls
  • Use VPNs or proxy services to mask your location

7.2 Identity and Fraud

  • Impersonate any person or entity
  • Create multiple accounts
  • Provide false personal information
  • Share account credentials with others

7.3 Legal Violations

  • Engage in any activity that violates applicable law or regulation
  • Violate the rights of other users or third parties
  • Transmit harmful, threatening, or offensive content
  • Engage in harassment or discrimination
Enforcement: Violation of these terms may result in immediate account suspension or termination, forfeiture of rewards, and potential legal action.

8 Termination

8.1 Termination by Us

We reserve the right to suspend or terminate your account at our discretion, without notice, for:

  • Violation of these Terms
  • Fraudulent activity
  • Extended inactivity (24+ months)
  • Legal or regulatory requirements

8.2 Termination by You

You may terminate your account at any time by:

  • Using the account deletion option in your settings
  • Contacting our support team
  • Sending a written request to support@relevantreflex.com

8.3 Effects of Termination

Upon termination:

  • Your access to the platform will be immediately revoked
  • Pending rewards may be forfeited (depending on circumstances)
  • Your personal data will be handled according to our Privacy Policy
  • Certain provisions of these Terms will survive termination

9 Limitation of Liability

9.1 Service Disclaimer

Our services are provided "as is" without warranties of any kind. We do not guarantee:

  • Uninterrupted or error-free service
  • Specific survey availability or earnings
  • Compatibility with all devices or browsers
  • Accuracy of third-party content

9.2 Liability Limitations

Relevant Reflex is not liable for any indirect, incidental, special, or consequential damages, including:

  • Loss of profits or earnings
  • Business interruption
  • Data loss or corruption
  • Emotional distress

9.3 Maximum Liability

Our total liability for any claim arising from these Terms shall not exceed the amount paid to you in the past 12 months, or ₹1,000, whichever is greater.

10 Indemnification

You agree to indemnify and hold Relevant Reflex harmless from any claims, losses, or damages arising from:

  • Your use of our services
  • Violation of these Terms
  • Violation of any law or regulation
  • Infringement of third-party rights
  • Your survey responses or other content

11 Privacy Policy

Your privacy is important to us. Our Privacy Policy explains how we collect, use, and protect your information. By using our services, you also agree to our Privacy Policy.

Key privacy principles:

  • We never sell your personal data to third parties
  • Your survey responses are anonymized for research
  • You control your data and can request deletion
  • We use industry-standard security measures

12 Changes to Terms

12.1 Modification Process

We may modify these Terms at any time. When we make changes, we will:

  • Update the "Last Modified" date
  • Notify active users via email
  • Provide a summary of significant changes
  • Allow reasonable time for review (minimum 30 days for material changes)

12.2 Acceptance of Changes

Continued use of our services after changes constitutes acceptance of the modified Terms. If you disagree with changes, you should terminate your account before they take effect.

13 Governing Law and Jurisdiction

13.1 Applicable Law

These Terms are governed by the laws of India, without regard to conflict of law principles.

13.2 Jurisdiction

Any disputes shall be subject to the exclusive jurisdiction of the courts in Tamil Nadu, India.

13.3 Dispute Resolution

Before pursuing legal action, we encourage users to:

  • Contact our support team to resolve issues
  • Allow 30 days for resolution attempts
  • Consider mediation for complex disputes

14 Contact Information

If you have questions about these Terms, please contact us:

General Support

support@relevantreflex.com
Response within 24 hours

Legal Inquiries

legal@relevantreflex.com
Response within 5 business days

Mailing Address

Relevant Reflex
Ethirmedu, NH 544
Tamilnadu - 638183
India

Thank you for using Relevant Reflex!
We appreciate your participation in our survey community and your commitment to providing quality responses.
-------------------- END OF FILE -------------------- FILE: RR com/ticket-guide.php TYPE: PHP SIZE: 34.52 KB ------------------------------------------------------------ Support Ticket Guide - How It Works | Relevant Reflex

Getting Started

Our support ticket system is designed to provide you with efficient, trackable help for any issues or questions you may have. Each ticket gets a unique number and goes through a structured process to ensure nothing gets missed.

How to Create a Support Ticket
  1. Login to your account - Visit your dashboard
  2. Go to Support section - Click "Support" in the navigation
  3. Fill out the form - Provide subject and detailed description
  4. Choose priority - Select appropriate urgency level
  5. Submit ticket - You'll get a unique ticket number

Understanding Ticket Statuses

Every support ticket goes through different statuses as our team works to resolve your issue. Here's what each status means:

OPEN

What it means: Your ticket has been received and is waiting for our support team to review it.

What happens next: A support agent will review your issue and respond with initial guidance or questions.

Can you reply? Yes, you can add more information anytime.

PENDING

What it means: Our support team has responded and is waiting for your reply or action.

What happens next: Please check your email and dashboard for our response. We may need more information or be waiting for you to try a suggested solution.

Can you reply? Yes, please respond to keep the conversation going.

RESOLVED

What it means: Our team believes your issue has been solved, but we want to make sure!

What happens next: Please test the solution and let us know if it worked. If the issue persists, just reply and we'll reopen the ticket.

Can you reply? Yes, you can confirm the fix worked or report if issues continue.

CLOSED

What it means: Your issue has been completely resolved and the ticket is archived.

What happens next: Nothing! Your issue is solved. If you have a new problem, please create a new ticket.

Can you reply? No, closed tickets cannot be reopened. Please create a new ticket for new issues.

Priority Levels

When creating a ticket, choose the priority level that best matches your situation:

LOW General Questions
24-48 hours

Use for: How-to questions, feature requests, general inquiries

MEDIUM Standard Issues
12-24 hours

Use for: Account issues, survey problems, payment questions

HIGH Urgent Problems
4-8 hours

Use for: Cannot access account, missing payments, data issues

URGENT Critical Issues
1-2 hours

Use for: Security concerns, service outages, data loss

Typical Workflow

Example: "I can't access my account"
Day 1 - You create ticket

OPEN "I can't log in to my account"

Day 1 - We respond (4 hours later)

PENDING "Can you try resetting your password? Click here..."

Day 2 - You reply

PENDING "I tried but didn't receive the reset email"

Day 2 - We investigate and fix

RESOLVED "Found the issue - email was blocked. Fixed it and reset your password to: [new password]"

Day 2 - You confirm

RESOLVED "Perfect! I can log in now. Thank you!"

Day 3 - We close ticket

CLOSED Issue resolved successfully.

Response Times

We strive to respond to all tickets promptly. Our target response times are:

Business Hours

Monday-Friday: 9:00 AM - 6:00 PM IST
Saturday: 10:00 AM - 4:00 PM IST
Sunday: Closed (emergency only)

Response Goals

Urgent: Within 2 hours
High: Within 8 hours
Medium: Within 24 hours
Low: Within 48 hours

Pro Tip

Response times are for first response. Complex issues may require multiple exchanges, but we'll keep you updated on progress throughout the resolution process.

Best Practices

DO
  • Be specific - Include error messages, screenshots
  • One issue per ticket - Don't combine multiple problems
  • Choose correct priority - Be honest about urgency
  • Respond promptly - Reply to our questions quickly
  • Provide context - When did it start? What changed?
  • Be patient - Allow time for investigation
DON'T
  • Create duplicate tickets - One ticket per issue
  • Mark everything urgent - Saves urgent for real emergencies
  • Leave out details - More info = faster resolution
  • Use inappropriate channels - Keep support in tickets
  • Get impatient - Quality takes time
  • Close tickets too early - Make sure it's really fixed

Good Ticket Examples

GOOD Example

Subject: Cannot complete survey ID #12345 - browser crashes

Priority: Medium

Description: "Hi, I'm trying to complete survey #12345 'Shopping Preferences' but on question 8 (the one about brands), my browser (Chrome v91 on Windows 10) crashes and closes. This has happened 3 times now. I've tried clearing my cache and using incognito mode, but same issue. I need to complete this survey by Friday to get the reward. Screenshots attached."

Why this is good: Specific survey ID, exact problem description, browser details, steps already tried, deadline mentioned, screenshots included.
POOR Example

Subject: Survey not working

Priority: Urgent

Description: "Your surveys don't work. Fix it."

Why this is poor: No specific details, wrong priority level, no context, rude tone, impossible to diagnose.

Frequently Asked Questions

Q: Can I reply to a resolved ticket?

A: Yes! If the solution didn't work or you have follow-up questions, just reply to the resolved ticket. We'll reopen it and continue helping.

Q: What happens if I don't respond to a pending ticket?

A: We'll wait 7 days for your response. After that, we'll send a reminder. If there's no response after 14 days, we'll mark it as resolved.

Q: Can I change the priority of my ticket?

A: You can mention in a reply if urgency has changed, but our support team manages priority levels based on actual impact and urgency.

Q: How do I know when you reply to my ticket?

A: You'll receive an email notification and can also check your dashboard support section for updates.

Q: Can I call for support instead?

A: We primarily use tickets to ensure nothing gets lost and maintain quality records. For complex issues, our team may schedule a call as part of the resolution process.

-------------------- END OF FILE -------------------- FILE: RR com/update-ticket-status.php TYPE: PHP SIZE: 2.93 KB ------------------------------------------------------------ isLoggedIn()) { throw new Exception('Admin authentication required'); } // Only handle POST requests if ($_SERVER['REQUEST_METHOD'] !== 'POST') { throw new Exception('Only POST requests allowed'); } $admin = $auth->getCurrentAdmin(); $ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; $status = isset($_POST['status']) ? trim($_POST['status']) : ''; // Validate input if ($ticketId <= 0) { throw new Exception('Invalid ticket ID'); } if (empty($status)) { throw new Exception('Status is required'); } $validStatuses = ['open', 'pending', 'resolved', 'closed']; if (!in_array($status, $validStatuses)) { throw new Exception('Invalid status. Must be: ' . implode(', ', $validStatuses)); } // Database update $db = new Database(); $pdo = $db->getConnection(); // Get current ticket info $stmt = $pdo->prepare("SELECT id, ticket_number, status FROM support_tickets WHERE id = ?"); $stmt->execute([$ticketId]); $ticket = $stmt->fetch(); if (!$ticket) { throw new Exception('Ticket not found'); } // Update status $stmt = $pdo->prepare(" UPDATE support_tickets SET status = ?, resolved_at = CASE WHEN ? = 'resolved' THEN NOW() ELSE resolved_at END, updated_at = NOW() WHERE id = ? "); $result = $stmt->execute([$status, $status, $ticketId]); if (!$result || $stmt->rowCount() === 0) { throw new Exception('Failed to update ticket status'); } // Log the success logError('Ticket status updated successfully', [ 'ticket_id' => $ticketId, 'ticket_number' => $ticket['ticket_number'], 'old_status' => $ticket['status'], 'new_status' => $status, 'admin_id' => $admin['id'], 'admin_username' => $admin['username'] ]); // Return success echo json_encode([ 'success' => true, 'message' => 'Status updated successfully', 'ticket_id' => $ticketId, 'ticket_number' => $ticket['ticket_number'], 'old_status' => $ticket['status'], 'new_status' => $status, 'updated_by' => $admin['full_name'] ]); } catch (Exception $e) { // Return error echo json_encode([ 'success' => false, 'message' => $e->getMessage(), 'debug_info' => [ 'ticket_id' => $ticketId ?? 'not_provided', 'status' => $status ?? 'not_provided', 'admin_logged_in' => $auth->isLoggedIn(), 'request_method' => $_SERVER['REQUEST_METHOD'] ] ]); } ?> -------------------- END OF FILE -------------------- FILE: RR com/user-support.php TYPE: PHP SIZE: 24.76 KB ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in user-support.php: ' . $e->getMessage()); if ($_SERVER['REQUEST_METHOD'] === 'POST') { jsonResponse(false, 'System error. Please try again later.'); } else { die('System error. Please try again later.'); } } // Handle POST request - Create new ticket if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_GET['ticket'])) { $subject = isset($_POST['subject']) ? sanitize($_POST['subject']) : ''; $message = isset($_POST['message']) ? trim($_POST['message']) : ''; $priority = isset($_POST['priority']) ? sanitize($_POST['priority']) : 'medium'; // Validation if (empty($subject) || empty($message)) { jsonResponse(false, 'Subject and message are required.'); } if (strlen($subject) > 255) { jsonResponse(false, 'Subject must be 255 characters or less.'); } if (strlen($message) > 5000) { jsonResponse(false, 'Message must be 5000 characters or less.'); } if (!in_array($priority, ['low', 'medium', 'high', 'urgent'])) { $priority = 'medium'; } try { $pdo->beginTransaction(); // Generate unique ticket number $ticketNumber = 'TKT-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -4)); // Check if ticket number already exists (very unlikely but let's be safe) $stmt = $pdo->prepare("SELECT id FROM support_tickets WHERE ticket_number = ?"); $stmt->execute([$ticketNumber]); if ($stmt->fetch()) { // Generate a new one if it exists $ticketNumber = 'TKT-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -6)); } // Insert support ticket $stmt = $pdo->prepare(" INSERT INTO support_tickets (ticket_number, user_id, subject, status, priority) VALUES (?, ?, ?, 'open', ?) "); $stmt->execute([$ticketNumber, $user['id'], $subject, $priority]); $ticketId = $pdo->lastInsertId(); // Insert initial message $stmt = $pdo->prepare(" INSERT INTO support_messages (ticket_id, sender_type, sender_id, message) VALUES (?, 'user', ?, ?) "); $stmt->execute([$ticketId, $user['id'], $message]); $messageId = $pdo->lastInsertId(); $pdo->commit(); // Handle file attachments (after commit so message exists) if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { handleSupportAttachments($pdo, $messageId, $_FILES['attachments']); } logError('Support ticket created', [ 'ticket_number' => $ticketNumber, 'user_id' => $user['id'], 'subject' => $subject, 'priority' => $priority ]); jsonResponse(true, 'Support ticket created successfully.', ['ticket_number' => $ticketNumber]); } catch (Exception $e) { $pdo->rollBack(); logError('Error creating support ticket', ['user_id' => $user['id'], 'error' => $e->getMessage()]); jsonResponse(false, 'Failed to create support ticket. Please try again.'); } } // Handle GET request - View specific ticket if (isset($_GET['ticket'])) { $ticketNumber = sanitize($_GET['ticket']); try { // Get ticket details $stmt = $pdo->prepare(" SELECT st.*, au.full_name as assigned_to_name FROM support_tickets st LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.ticket_number = ? AND st.user_id = ? "); $stmt->execute([$ticketNumber, $user['id']]); $ticket = $stmt->fetch(); if (!$ticket) { header('Location: dashboard.php#support'); exit; } // Get all messages for this ticket $stmt = $pdo->prepare(" SELECT sm.*, CASE WHEN sm.sender_type = 'user' THEN u.email WHEN sm.sender_type = 'admin' THEN au.full_name END as sender_name FROM support_messages sm LEFT JOIN users u ON sm.sender_type = 'user' AND sm.sender_id = u.id LEFT JOIN admin_users au ON sm.sender_type = 'admin' AND sm.sender_id = au.id WHERE sm.ticket_id = ? AND sm.is_internal = 0 ORDER BY sm.created_at ASC "); $stmt->execute([$ticket['id']]); $messages = $stmt->fetchAll(); // Load attachments for all messages $messageIds = array_column($messages, 'id'); $messageAttachments = $supportHelperLoaded ? getAttachmentsForMessages($pdo, $messageIds) : []; } catch (Exception $e) { logError('Error fetching ticket details', ['ticket_number' => $ticketNumber, 'error' => $e->getMessage()]); header('Location: dashboard.php#support'); exit; } } // Handle POST request for adding reply to existing ticket if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_GET['ticket'])) { $ticketNumber = sanitize($_GET['ticket']); $message = isset($_POST['reply']) ? trim($_POST['reply']) : ''; if (empty($message)) { jsonResponse(false, 'Reply message is required.'); } if (strlen($message) > 5000) { jsonResponse(false, 'Reply must be 5000 characters or less.'); } try { // Verify ticket belongs to user and is not closed $stmt = $pdo->prepare("SELECT id, status FROM support_tickets WHERE ticket_number = ? AND user_id = ?"); $stmt->execute([$ticketNumber, $user['id']]); $ticket = $stmt->fetch(); if (!$ticket) { jsonResponse(false, 'Ticket not found.'); } if ($ticket['status'] === 'closed') { jsonResponse(false, 'Cannot reply to a closed ticket.'); } // Insert reply $stmt = $pdo->prepare(" INSERT INTO support_messages (ticket_id, sender_type, sender_id, message) VALUES (?, 'user', ?, ?) "); $stmt->execute([$ticket['id'], $user['id'], $message]); $messageId = $pdo->lastInsertId(); // Handle file attachments if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { handleSupportAttachments($pdo, $messageId, $_FILES['attachments']); } // Update ticket status to 'open' if it was 'resolved' if ($ticket['status'] === 'resolved') { $stmt = $pdo->prepare("UPDATE support_tickets SET status = 'open', updated_at = NOW() WHERE id = ?"); $stmt->execute([$ticket['id']]); } logError('Support ticket reply added', [ 'ticket_number' => $ticketNumber, 'user_id' => $user['id'] ]); jsonResponse(true, 'Reply added successfully.'); } catch (Exception $e) { logError('Error adding ticket reply', ['ticket_number' => $ticketNumber, 'error' => $e->getMessage()]); jsonResponse(false, 'Failed to add reply. Please try again.'); } } // If we're here, it means we're displaying a specific ticket or the form ?> Support - Relevant Reflex
RelevantReflex
Status:
Priority:
Created:
Agent:
You (Support)
Add Reply
Max 5000 characters
This ticket has been closed. If you need further help, please create a new ticket.
Response Times
  • Low: 2-3 business days
  • Medium: 1-2 business days
  • High: 4-8 hours
  • Urgent: 1-2 hours
Before Submitting
  • Check our FAQ section
  • Provide as much detail as possible
  • Include any error messages you see
  • Attach screenshots if relevant
-------------------- END OF FILE -------------------- FILE: RR com/verify.php TYPE: PHP SIZE: 19.88 KB ------------------------------------------------------------ getConnection(); // ===== ANTI-BOT: Rate limit verification attempts per IP ===== $clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; try { // Check if IP is blocked $stmt = $pdo->prepare("SELECT id FROM ip_blocklist WHERE ip_address = ? AND (expires_at IS NULL OR expires_at > NOW())"); $stmt->execute([$clientIP]); if ($stmt->fetch()) { showVerificationPage(false, 'Access Restricted', 'Verification is temporarily unavailable from your network. Please contact support.'); } // Rate limit: max 10 verification attempts per IP per hour (prevents token brute-forcing) $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM registration_attempts WHERE ip_address = ? AND attempt_type = 'verification' AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)"); $stmt->execute([$clientIP]); $attempts = $stmt->fetch(); if ($attempts && $attempts['cnt'] >= 10) { showVerificationPage(false, 'Too Many Attempts', 'Too many verification attempts. Please try again later.'); } // Log this attempt $pdo->prepare("INSERT INTO registration_attempts (ip_address, attempt_type, user_agent) VALUES (?, 'verification', ?)") ->execute([$clientIP, $_SERVER['HTTP_USER_AGENT'] ?? '']); } catch (Exception $e) { // Don't block verification if logging fails } // Start transaction $pdo->beginTransaction(); // Find the verification token $stmt = $pdo->prepare(" SELECT ev.user_id, ev.expires_at, u.email, u.email_verified FROM email_verifications ev JOIN users u ON ev.user_id = u.id WHERE ev.token = ? AND ev.expires_at > NOW() "); $stmt->execute([$token]); $verification = $stmt->fetch(); if (!$verification) { // Check if token exists but is expired $stmt = $pdo->prepare(" SELECT ev.expires_at, u.email FROM email_verifications ev JOIN users u ON ev.user_id = u.id WHERE ev.token = ? "); $stmt->execute([$token]); $expiredToken = $stmt->fetch(); if ($expiredToken) { showVerificationPage(false, 'Verification Link Expired', 'This verification link has expired. Please register again to receive a new verification email.'); } else { // Token not found and not expired = it was already consumed (user already verified) showVerificationPage(true, 'Email Already Verified', 'Your email has already been verified successfully. You can now log in to your account.'); } } // Check if email is already verified if ($verification['email_verified']) { showVerificationPage(true, 'Email Already Verified', 'Your email has already been verified. You can now log in to your account.'); } $userId = $verification['user_id']; // Update user status $stmt = $pdo->prepare(" UPDATE users SET email_verified = 1, status = 'active', updated_at = NOW() WHERE id = ? "); $stmt->execute([$userId]); // Delete used verification token $stmt = $pdo->prepare("DELETE FROM email_verifications WHERE token = ?"); $stmt->execute([$token]); // Commit transaction $pdo->commit(); // Log successful verification logError('Email verification successful', [ 'user_id' => $userId, 'email' => $verification['email'] ]); // ===== AFFILIATE TRACKING: Update affiliate signup tracking ===== try { // Connect to admin database $adminPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", 'u752449863_rradmin', 'S@n@h2016', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ] ); // Update affiliate signup tracking - mark as verified $updateStmt = $adminPdo->prepare(" UPDATE affiliate_signups SET email_verified = 1, verified_at = NOW() WHERE panel_user_id = ? AND email_verified = 0 "); $updateStmt->execute([$userId]); $rowsAffected = $updateStmt->rowCount(); // If a row was updated, update the affiliate's total verified count if ($rowsAffected > 0) { // Get the affiliate_id $affiliateStmt = $adminPdo->prepare(" SELECT affiliate_id, reward_amount FROM affiliate_signups WHERE panel_user_id = ? "); $affiliateStmt->execute([$userId]); $affiliateInfo = $affiliateStmt->fetch(); if ($affiliateInfo) { // Update affiliate total_verified_signups count $countStmt = $adminPdo->prepare(" UPDATE affiliates SET total_verified_signups = ( SELECT COUNT(*) FROM affiliate_signups WHERE affiliate_id = ? AND email_verified = 1 ) WHERE id = ? "); $countStmt->execute([$affiliateInfo['affiliate_id'], $affiliateInfo['affiliate_id']]); // Award points to the user (onboarding bonus from affiliate) if ($affiliateInfo['reward_amount'] > 0) { // Check if user_points record exists $pointsCheckStmt = $pdo->prepare("SELECT id FROM user_points WHERE user_id = ?"); $pointsCheckStmt->execute([$userId]); if ($pointsCheckStmt->fetch()) { // Update existing points $pointsStmt = $pdo->prepare(" UPDATE user_points SET points = points + ?, total_earned = total_earned + ?, updated_at = NOW() WHERE user_id = ? "); $pointsStmt->execute([ $affiliateInfo['reward_amount'], $affiliateInfo['reward_amount'], $userId ]); } else { // Create new points record $pointsStmt = $pdo->prepare(" INSERT INTO user_points (user_id, points, total_earned, created_at) VALUES (?, ?, ?, NOW()) "); $pointsStmt->execute([ $userId, $affiliateInfo['reward_amount'], $affiliateInfo['reward_amount'] ]); } // Log the transaction $transactionStmt = $pdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, status, created_at) VALUES (?, 'earned', ?, 'affiliate_bonus', ?, 'completed', NOW()) "); $transactionStmt->execute([ $userId, $affiliateInfo['reward_amount'], 'Affiliate signup bonus - Welcome reward for joining through our partner' ]); } logError('Affiliate verification tracked successfully', [ 'user_id' => $userId, 'affiliate_id' => $affiliateInfo['affiliate_id'], 'reward_amount' => $affiliateInfo['reward_amount'] ]); } } } catch (Exception $e) { // Log error but don't fail the verification logError('Failed to update affiliate verification tracking', [ 'error' => $e->getMessage(), 'user_id' => $userId ]); } // ===== END AFFILIATE TRACKING ===== // ===== MEMBER REFERRAL: Award referrer Rs.5 (10 pts) on email verification ===== try { $mrefPdo2 = new PDO( "mysql:host=localhost;dbname=u752449863_rrpanel;charset=utf8mb4", 'u752449863_rrpaneladmin', 'S@n@h2016', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); // Find if this user was referred by a member $stmt = $mrefPdo2->prepare(" SELECT id, referrer_user_id FROM member_referral_clicks WHERE referee_user_id = ? AND email_verified = 0 AND signup_completed = 1 LIMIT 1 "); $stmt->execute([$userId]); $mrefRow = $stmt->fetch(); if ($mrefRow && $mrefRow['referrer_user_id'] != $userId) { $referrerId = $mrefRow['referrer_user_id']; $mrefClickId = $mrefRow['id']; $rewardPts = 10; // Rs.5 = 10 points (1 pt = Rs.0.50) // Mark click as verified + reward paid $mrefPdo2->prepare(" UPDATE member_referral_clicks SET email_verified = 1, verified_at = NOW(), signup_reward_paid = 1 WHERE id = ? ")->execute([$mrefClickId]); // Award points to referrer $mrefPdo2->prepare(" INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ? ")->execute([$referrerId, $rewardPts, $rewardPts, $rewardPts, $rewardPts]); $mrefPdo2->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id, created_at) VALUES (?, 'earned', ?, 'member_referral', ?, ?, NOW()) ")->execute([ $referrerId, $rewardPts, 'Referral reward: your friend verified their email (₹5 = 10 pts)', $userId ]); } } catch (Exception $e) { logError('Member referral verify reward error: ' . $e->getMessage()); } // ===== END MEMBER REFERRAL ===== showVerificationPage( true, 'Email Verified Successfully!', 'Your email has been verified successfully. Your account is now active and you can start taking surveys and earning rewards!' ); } catch (PDOException $e) { // Rollback transaction on error if ($pdo->inTransaction()) { $pdo->rollback(); } logError('Database error during email verification', [ 'error' => $e->getMessage(), 'token' => substr($token, 0, 10) . '...' // Log partial token for debugging ]); showVerificationPage( false, 'Verification Failed', 'We encountered a system error while verifying your email. Please try again later or contact support.' ); } catch (Exception $e) { // Rollback transaction on error if (isset($pdo) && $pdo->inTransaction()) { $pdo->rollback(); } logError('General error during email verification', [ 'error' => $e->getMessage(), 'token' => substr($token, 0, 10) . '...' ]); showVerificationPage( false, 'Verification Failed', 'An unexpected error occurred. Please try again later or contact support.' ); } function showVerificationPage($success, $title, $message) { $statusClass = $success ? 'success' : 'error'; $statusColor = $success ? '#28a745' : '#dc3545'; $iconClass = $success ? 'fa-check-circle' : 'fa-times-circle'; $iconColor = $success ? '#28a745' : '#dc3545'; ?> <?php echo htmlspecialchars($title); ?> - Relevant Reflex

What's Next?
  • Log in with your registered email and password
  • Complete your profile to get targeted surveys
  • Start participating in surveys and earn rewards
  • Redeem your points for real money via UPI
Need Help?
  • Check your spam/junk folder for the verification email
  • Make sure you clicked the complete link from the email
  • Contact our support team at support@relevantreflex.com
  • Our team responds within 24 hours
FILE: RelevantReflexCom/assets/css/bootstrap.min.css -------------------- END OF FILE -------------------- FILE: RR com/articles/5-ways-maximize-survey-earnings.php TYPE: PHP SIZE: 12.35 KB ------------------------------------------------------------ 5 Ways to Maximize Survey Earnings in India | Relevant Reflex
December 10, 2024  |  Tips & Tricks  |  Last updated: April 2026

5 Ways to Maximize Your Survey Earnings in India

Most survey takers in India earn far less than they could — not because of low survey availability, but because of avoidable mistakes. These five strategies can meaningfully increase how much you earn each month.

1. Complete Your Profile 100%

Your profile is the single most important factor in how many surveys you receive. Survey platforms match members to surveys based on demographics — age, occupation, income range, household details, and interests. A half-complete profile means you get matched to only a fraction of available surveys.

On Relevant Reflex, members who complete all profiler sections receive significantly more survey invitations than those with basic profiles. Set aside 20–30 minutes to fill everything in thoroughly and honestly — it pays off consistently every month.

2. Check for Surveys Every Single Day

Many surveys have a fixed quota — once enough respondents have completed them, they close. If you check your dashboard only a few times a week, you will miss surveys that filled up in the meantime. Members who log in daily and check their email for invitations consistently earn more than those who participate sporadically.

The best habit is to check your survey dashboard first thing in the morning, as many new surveys are added overnight by research teams in different time zones.

3. Participate in Profiler Surveys Whenever Available

Profiler surveys are short surveys that gather additional information about your lifestyle, preferences, and purchase habits. They are often overlooked because they pay less individually — but completing them unlocks a significantly larger pool of paid surveys targeted to your updated profile.

Think of profiler surveys as an investment. Spending 5 minutes on a profiler survey today can unlock ₹300–₹500 worth of targeted surveys over the next few weeks.

4. Answer Honestly and Consistently

Survey platforms use quality checks — including consistency questions and speeding detection — to identify unreliable responses. Members who rush through surveys or give random answers get flagged and receive fewer invitations over time. Honest, thoughtful responses protect your account quality and ensure continued access to surveys.

This is not just about ethics — it is about protecting your earning potential. A flagged account sees a dramatic drop in survey invitations that is very difficult to recover from.

5. Choose the Right Languages

Only select languages you are genuinely fluent in when setting up your profile. Attempting surveys in languages you do not understand leads to longer completion times, which triggers quality flags in the system. Surveys that take unusually long to complete are automatically reviewed and may not be credited.

If you are fluent in both English and Tamil, select both — this expands your eligible survey pool. But do not select Hindi or other regional languages simply to receive more surveys if you cannot complete them accurately.

Start Earning with Relevant Reflex

Relevant Reflex is an India-based survey platform with 50,000+ members and ₹25 lakh+ paid out since 2021. UPI payments, ₹500 minimum payout. Join free today.

-------------------- END OF FILE -------------------- FILE: RR com/articles/best-paid-survey-sites-india.php TYPE: PHP SIZE: 34.23 KB ------------------------------------------------------------ Best Paid Survey Sites in India That Actually Pay in 2026 (Honest Comparison)

Best Paid Survey Sites in India That Actually Pay in 2026 (Honest Comparison)

A factual, balanced comparison — including platforms we compete with — to help you choose the right survey sites for your situation.

Disclosure: This article is written by Relevant Reflex, one of the platforms reviewed below. We have made every effort to provide factual, balanced information about competitors. Per Google's Product Review Guidelines, we do not make unsupported negative claims about other platforms. All comparison data is based on publicly available information as of April 2026.

If you are looking for paid survey sites in India, you have two broad categories to choose from: India-based platforms built specifically for Indian users with UPI payment, and international platforms that accept Indian members but pay via PayPal or gift cards. Both have their place — the right choice depends on your priorities.

This article compares the main options honestly so you can make an informed decision. The recommendation at the end is based on what actually matters to Indian users — UPI payment support, India-specific survey volume, minimum payout threshold, and reliability.

Side-by-Side Comparison Table

Platform Based In UPI Payment Min. Payout India Surveys Free to Join
Relevant Reflex India (Tamil Nadu) ✓ Yes ₹250 India-specific ✓ Yes
Swagbucks USA ✗ No $5 (gift cards) Mixed ✓ Yes
Toluna France/Global ✗ No Points (≈₹800+) Some India ✓ Yes
ySense USA ✗ No $10 (PayPal) Mixed ✓ Yes
OpinionWorld India India (SSI) Partial Points (≈₹600+) India-focused ✓ Yes

India-Based Platforms

2. OpinionWorld India India-Focused

Best for: Users who want another India-focused option alongside Relevant Reflex

OpinionWorld operates in India as part of the global SSI/Dynata network, one of the world's largest market research data collectors. This gives it access to a large volume of surveys from multinational brands researching the Indian market. Payment options include bank transfer and some gift card options, though UPI support is limited compared to India-native platforms.

What it does well: Good survey volume from international brands, established global company backing, India-specific survey content.

Limitation: Less seamless UPI integration compared to India-native platforms. Payment can take longer. Interface is less user-friendly for mobile users.

Verdict: Good complement to Relevant Reflex for increasing overall survey volume, especially for users researched by multinational brands.

International Platforms Available in India

3. Swagbucks International

Best for: Users comfortable with gift card payments who want multiple earning methods

Swagbucks is one of the most well-known GPT (Get-Paid-To) platforms globally. Indian members can earn SB points through surveys, watching videos, shopping online, and completing offers. Points are redeemable for gift cards from brands like Amazon India, Flipkart, and others. PayPal cash is available but less convenient for Indian users.

What it does well: Multiple earning methods beyond just surveys — videos, games, shopping cashback. Established global platform with strong reputation. Amazon India and Flipkart gift card redemption options are genuinely useful.

Limitation: No direct UPI payment. Survey volume for Indian demographics is lower than India-focused platforms. Some surveys are routed through third-party providers with inconsistent quality. Minimum redemption for PayPal is $25 which takes time to accumulate.

Verdict: Worth joining for the gift card options and diversified earning methods, but not a substitute for India-native UPI platforms.

4. Toluna International

Best for: Users who want to influence product decisions for global brands

Toluna is a large global survey panel with an India presence. It offers surveys from major international brands including FMCG, technology, and automotive companies. The point system is more complex than direct cash platforms, and redemption options for Indian users typically involve gift cards rather than direct bank transfer.

What it does well: High-quality surveys from reputable global brands. Active community features with polls and discussions. Regular contests. Good survey variety.

Limitation: Complex points system can be confusing. No UPI payment. Minimum redemption requires a significant number of accumulated points. Customer service response times can be slow for Indian users.

Verdict: Good supplementary platform, especially for users interested in global brand research, but not ideal as a primary platform for Indian users wanting cash payments.

5. ySense International

Best for: Users who have a PayPal account and want a reliable international option

ySense (formerly ClixSense) is a well-established GPT platform with a strong reputation for actually paying members. It aggregates surveys from multiple survey networks, which means more variety but also more inconsistency in survey quality. PayPal is the primary payment method, which requires Indian users to have a verified PayPal account.

What it does well: Very reliable payment track record. Good survey volume from aggregated networks. Daily tasks available beyond surveys. Transparent point system.

Limitation: $10 PayPal minimum payout is higher than India-native platforms. Requires a PayPal account. Survey availability for Indian demographics can be inconsistent. Some surveys screen out Indian respondents at higher rates.

Verdict: Trustworthy platform with a good payment record, but the PayPal requirement and higher minimum payout make it less convenient for most Indian users than UPI-native alternatives.

How to Choose the Right Platform for You

Choose based on your primary priority:
  • Want UPI cash payment? → Relevant Reflex first, OpinionWorld second
  • Want Amazon/Flipkart gift cards? → Swagbucks or Toluna
  • Have a PayPal account and want global platforms? → ySense + Toluna
  • Want maximum survey volume? → Join all 3–5 platforms above
  • First-time survey user? → Start with Relevant Reflex to understand the process, then expand

Why You Should Join Multiple Platforms

The single most effective strategy for maximising your monthly earnings from paid surveys in India is joining 3–5 platforms rather than committing to just one. Here is why:

Every platform has different client relationships. A survey on Swagbucks from an FMCG brand will never appear on Relevant Reflex, and vice versa. By joining multiple platforms, you access a larger total pool of surveys — meaning more daily opportunities and fewer days with nothing available.

The time investment is front-loaded. You spend 20–30 minutes setting up and completing your profile on each new platform — but after that, the marginal daily time required to check an additional platform is minimal. Most members who join 3 platforms check all three in the same 30-minute session each morning.

Our recommendation for Indian users starting from scratch: begin with Relevant Reflex for UPI cash, add OpinionWorld for additional India-specific surveys, and add Swagbucks for the diversified earning methods and gift card redemption. Evaluate after 2 months and add more platforms based on which types suit your profile best.

Looking for an earlier overview?

Our original platform overview — Best Survey Platforms for Indian Users — covers the broader landscape of survey platforms available in India and is a useful companion read alongside this detailed 2026 comparison.

Frequently Asked Questions

Which paid survey site is best for Indian users who want UPI payment?

Relevant Reflex is currently the best option for UPI payment in India, as it is built natively for Indian users with direct UPI payouts to PhonePe, Google Pay, and Paytm at a ₹250 minimum threshold.

Can I join multiple paid survey sites in India?

Yes, and it is recommended. Joining 3–5 platforms significantly increases your monthly earnings. Each platform has different clients and survey pools, so they complement rather than overlap each other.

Are international survey sites worth joining for Indian users?

Yes, as supplementary platforms — especially Swagbucks for gift cards and ySense for PayPal payments. However, India-native platforms offer more India-specific surveys and UPI payment, making them more convenient as primary platforms for most Indian users.

Which survey site has the lowest minimum payout for Indian users?

Among India-focused platforms, Relevant Reflex has a ₹250 minimum payout threshold via UPI — one of the lowest among legitimate platforms available to Indian users.

Start with India's UPI-Native Survey Platform

Join Relevant Reflex free — ₹250 minimum payout directly to your PhonePe, GPay, or Paytm.

Join Relevant Reflex Free Read Our Full Review
Best for UPI Payments

Relevant Reflex — India-built, UPI-native, ₹250 minimum payout.

Join Free Today
-------------------- END OF FILE -------------------- FILE: RR com/articles/best-survey-platforms-indian-users.php TYPE: PHP SIZE: 14.21 KB ------------------------------------------------------------ Best Survey Platforms for Indian Users in 2026 | Relevant Reflex
November 20, 2024  |  India Specific  |  Last updated: April 2026

Best Survey Platforms for Indian Users in 2026

Not all survey platforms work equally well for Indian users. Payment methods, survey availability for Indian demographics, minimum thresholds, and language support all vary significantly. This guide helps you choose the right platforms for your situation.

What Makes a Survey Platform Good for Indian Users?

Before listing any platforms, it helps to understand what criteria matter most for someone based in India. The most important factors are: UPI or Indian payment method support, a low minimum payout threshold that is achievable within weeks rather than months, surveys actually targeted at Indian demographics rather than repurposed global surveys, and a responsive support team that understands Indian users.

Relevant Reflex

Relevant Reflex is built specifically for India, operating out of Tamil Nadu since 2021. Unlike most platforms on this list which are global platforms with an India section, Relevant Reflex sources surveys specifically for Indian consumer profiles. Payment is via UPI direct transfer — PhonePe, Google Pay, and Paytm are all supported — with a ₹500 minimum threshold. With 50,000+ members and ₹25 lakh+ paid out, it is a verified and active platform for Indian survey takers.

Best for: Indian users who want UPI payments and India-focused surveys.
Minimum payout: ₹250 via UPI
Free to join: Yes

Third-party verified: Relevant Reflex is independently listed as the #1 ranked platform on Paid Survey Hub India — a free directory that researches and verifies survey sites specifically for Indian users.

Swagbucks India

Swagbucks is one of the most well-known global reward platforms and is available in India. In addition to surveys, members can earn by watching videos, searching the web, and shopping online. The platform pays in "SB" points redeemable for gift cards or PayPal cash. Survey availability for Indian users is moderate — there are surveys available but fewer than on India-specific platforms.

Best for: Members who want multiple earning methods beyond surveys.
Minimum payout: Approx. ₹400 equivalent
Payment: PayPal or gift cards (no direct UPI)

Toluna India

Toluna is a large global panel with a dedicated India presence. The platform has a community element — members can create polls and participate in discussions in addition to surveys. Survey frequency for Indian members is decent, and the platform has been operating in India for many years. Payment is via PayPal or Paytm once the minimum threshold is reached.

Best for: Members who enjoy community features alongside surveys.
Minimum payout: ₹500 equivalent
Payment: PayPal or Paytm

ySense (formerly ClixSense)

ySense is a well-established platform available in India offering surveys, tasks, and offers. It has a strong track record of payments and a large user base. The platform pays via PayPal, Skrill, or Payoneer — not directly via UPI, which is a limitation for some Indian users. Survey availability is reasonable for Indian demographics.

Best for: Members comfortable with PayPal or Skrill for receiving payments.
Minimum payout: Approx. ₹800 equivalent
Payment: PayPal, Skrill, Payoneer

Key Things to Watch Out For

When evaluating any survey platform, watch for these warning signs: requests for payment to join or access surveys, promises of unrealistically high earnings, no physical address or contact information, and payment methods that are not easily accessible in India. Legitimate platforms are always free to join and transparent about how much members typically earn.

How Many Platforms Should You Join?

Most experienced survey takers in India join 3–5 platforms simultaneously. This increases the total number of surveys available to you and reduces the impact of any one platform having a quiet month. However, spreading yourself too thin across 10+ platforms makes it difficult to keep profiles updated and surveys completed on time. Start with 2–3 platforms, get comfortable, then expand.

Start with Relevant Reflex

India-built, UPI payments, ₹500 minimum payout, 50,000+ members, free to join. Sign up in under 2 minutes.

-------------------- END OF FILE -------------------- FILE: RR com/articles/complete-guide-survey-beginners-india.php TYPE: PHP SIZE: 13.22 KB ------------------------------------------------------------ Online Survey Beginners Guide India | Relevant Reflex
December 5, 2024  |  Getting Started  |  Last updated: April 2026

Complete Guide to Online Surveys for Beginners in India

If you have never taken a paid survey online before, this guide explains everything from choosing the right platform to receiving your first UPI payment — in plain, simple language.

What Are Paid Online Surveys?

Companies and brands need to understand what Indian consumers think about their products, services, and advertisements. Instead of running expensive focus groups, they commission online surveys through market research platforms. These platforms pay ordinary people — students, homemakers, working professionals, retirees — to share their honest opinions. You answer questions, and you earn rewards that can be redeemed as cash via UPI.

Step 1 — Choose the Right Survey Platform

Not all survey sites are equal. Look for platforms that are genuinely India-focused, offer UPI payments, have a low minimum payout threshold, and have verifiable member reviews. Avoid sites that ask for any registration fee or promise unrealistically high earnings. Relevant Reflex, for example, is free to join, pays via UPI, and has a ₹500 minimum threshold — achievable within your first few weeks.

Step 2 — Register with Accurate Information

When signing up, always provide your real details — age, gender, occupation, city, and income range. This is not just a policy requirement. Survey platforms match you to surveys based on your demographic profile. Fake details lead to fewer survey matches, more screen-outs, and lower earnings. There is no benefit to providing inaccurate information.

Step 3 — Verify Your Email and Mobile

After registering, check your inbox for a verification email and click the confirmation link. Some platforms also require mobile verification. Completing both steps unlocks your full survey access and, on Relevant Reflex, earns you bonus points for verifying each.

Step 4 — Complete Your Profile Thoroughly

Before looking for surveys, spend time completing your profile sections — including profiler surveys about your lifestyle, income, vehicle ownership, electronics, and interests. This is the most important step most beginners skip. A thorough profile means you qualify for more surveys from day one.

Step 5 — Start Taking Surveys

Log in to your dashboard and look for available surveys. Each survey shows an estimated completion time and reward amount. Start with shorter surveys to build familiarity with the format. Answer all questions honestly — quality checks are built into most surveys, and inconsistent answers will disqualify your response without payment.

Step 6 — Understand Survey Types

There are several types of surveys you may encounter. Standard opinion surveys cover products, brands, and current topics and take 5–20 minutes. Profiler surveys gather demographic details and take 2–5 minutes. Product testing surveys are longer, sometimes requiring you to use a product at home before reviewing it. Focus groups are invitation-only group discussions that offer the highest rewards.

Step 7 — Redeem Your Rewards via UPI

Once you reach the minimum payout threshold (₹500 on Relevant Reflex), you can request a withdrawal to your UPI ID — PhonePe, Google Pay, or Paytm all work. Payments are processed within 3–7 business days. Always ensure your UPI ID is entered correctly in your profile settings before requesting a withdrawal.

What to Expect in Your First Month

In your first month, expect to earn between ₹300 and ₹1,000 depending on how actively you participate and how thoroughly you completed your profile. This is normal — survey availability increases as your profile data becomes richer. Most members see their earnings grow steadily from the second month onwards as they qualify for more targeted surveys.

Ready to Start?

Relevant Reflex is free to join, pays via UPI, and has 50,000+ active members across India. Registration takes under 2 minutes. Sign up now and start earning.

-------------------- END OF FILE -------------------- FILE: RR com/articles/earn-money-online-surveys-india-guide.php TYPE: PHP SIZE: 27.28 KB ------------------------------------------------------------ How to Earn Money with Online Surveys in India 2026 | Relevant Reflex
April 13, 2026  |  Complete Guide  |  12 min read

How to Earn Money with Online Surveys in India: The Complete Guide (2026)

Online surveys in India have become one of the most accessible ways to earn supplementary income from home — no investment, no special skills, and no fixed schedule required. This guide covers everything you need to know in 2026: what online surveys actually are, how much you can realistically earn, how to get started, and the strategies that separate consistent earners from those who give up after a week.

At Relevant Reflex, we have been operating India's survey platform since 2021. We have paid over ₹25 lakh to 50,000+ verified Indian members via UPI. Everything in this guide is based on real data from our platform — not theoretical estimates.

What Are Online Surveys in India?

Online surveys are questionnaires commissioned by brands, companies, and market research firms to understand what Indian consumers think about their products, services, and advertising. Instead of running expensive in-person focus groups, companies pay survey platforms to collect this feedback digitally from a large pool of respondents.

When you join a survey platform in India, you become part of that respondent pool. When a company wants opinions from people matching your profile — say, a 28-year-old working professional in Tamil Nadu who owns a car — the platform sends you that survey. You complete it honestly, and you earn a reward.

This is a genuine, well-established industry. Market research is a multi-billion dollar global business, and brands genuinely need consumer feedback to make product, pricing, and marketing decisions. The money paid to survey respondents is a tiny fraction of what companies would otherwise spend on traditional research methods.

Who Commissions These Surveys?

The surveys available on Indian platforms typically come from three sources. Large consumer brands like FMCG companies, automobile manufacturers, and electronics brands regularly commission surveys to understand purchase intent and brand perception. Market research agencies collect data on behalf of multiple clients simultaneously. And media companies including streaming platforms, news organisations, and app developers run surveys to understand audience preferences.

How Much Can You Realistically Earn from Online Surveys in India?

This is the question most people ask first — and the one where many survey platforms are dishonest. Here is the truth based on actual member data from Relevant Reflex:

Member Type Daily Time Monthly Earnings Profile Status
Beginner (Month 1–2) 30–45 mins ₹500 – ₹1,500 Partially complete
Active member 1–2 hours ₹2,000 – ₹4,000 Fully complete
Experienced member 2+ hours ₹4,000 – ₹6,000 100% + profilers done

*Indicative ranges based on member data. Individual earnings are not guaranteed and vary. See our Earnings Disclaimer.

What determines where you fall in this range? Three factors matter most. First, profile completeness — members who complete all profiler sections receive significantly more survey invitations than those with basic profiles. Second, consistency — members who log in daily and check their email for invitations earn considerably more than those who participate sporadically. Third, demographic profile — certain demographics such as professionals in technology or healthcare, car owners, and parents of young children receive more high-value survey invitations because brands specifically target these groups.

What Surveys Pay in India

Standard opinion surveys of 5–15 minutes typically pay ₹20–₹80 on Indian platforms. Longer surveys of 20–30 minutes pay ₹100–₹250. Product testing surveys, which require you to use a product at home for a week before reviewing it, can pay ₹500–₹2,000. Focus group discussions, which are invitation-only group sessions of 60–90 minutes, pay the highest rewards — often ₹1,000–₹3,000 per session.

Step-by-Step: How to Start Earning with Online Surveys in India

Step 1 — Choose a Legitimate Platform

The most important decision you will make is which platform to join. Look for platforms that are free to join with no registration fee, offer UPI payments (not just PayPal or international transfers), have a minimum payout threshold below ₹1,000, and have verifiable payment records — either from public reviews or direct member testimonials.

Relevant Reflex is free to join, pays via UPI with a ₹500 minimum threshold, and has paid ₹25 lakh+ to Indian members since 2021. You can also join 2–3 other platforms simultaneously to increase survey volume.

Step 2 — Register with Accurate Information

When signing up, provide your real age, gender, occupation, income range, and location. This is not just a policy requirement — it directly determines which surveys you receive. Fake details lead to fewer survey matches, more screen-outs, and lower earnings. There is no benefit to providing inaccurate information.

Step 3 — Complete Email and Mobile Verification

After registering, verify your email address immediately by clicking the link in your inbox. Some platforms also require mobile number verification. Completing both unlocks your full survey access. On Relevant Reflex, verified members receive bonus points for completing both verification steps.

Step 4 — Complete Your Profile Thoroughly

Before looking for surveys, spend 20–30 minutes completing every section of your profile. This includes the main profile (occupation, education, household) and any available profiler surveys covering areas like vehicle ownership, electronics, gaming habits, financial products, and lifestyle. This single step has the largest impact on how many surveys you receive.

Learn more about how our matching system works and why a complete profile matters.

Step 5 — Establish a Daily Routine

Log in every day — even if only for 5 minutes to check for new surveys. Many surveys close once their quota is filled. Members who check daily catch surveys before they close; those who check every few days regularly miss them. Set a phone reminder if needed.

Step 6 — Complete Surveys Honestly

Answer every question thoughtfully and accurately. Survey platforms use built-in quality checks — including consistency questions and timing analysis — to detect rushed or random responses. Flagged responses are not credited, and repeated flags can reduce your survey eligibility. Honest participation protects both your earnings and your account quality.

Step 7 — Withdraw Your Earnings

Once you reach the minimum payout threshold, go to the redemption section and enter your UPI ID. Ensure your UPI ID is correct before submitting — incorrect UPI IDs cause payment failures. Withdrawals are typically processed within 3–7 business days on Relevant Reflex.

Pro Tips for Higher Earnings from Online Surveys in India

Prioritise Profiler Surveys Every Time

Whenever a new profiler survey appears in your dashboard, complete it the same day. Profiler surveys are short (2–5 minutes) and often unpaid or low-paid individually — but completing them unlocks a significantly larger pool of targeted, higher-paying surveys. Think of them as an investment that pays off over weeks and months.

Choose Your Languages Carefully

Only select languages you can read and write fluently. Taking surveys in unfamiliar languages results in slow completion times, which is flagged as suspicious by the quality system. If you are fluent in both English and Tamil, selecting both expands your eligible survey pool. But do not select additional languages simply to receive more invitations.

Join 3–5 Platforms Simultaneously

No single platform has surveys available every day for every demographic. Joining 3–5 legitimate platforms ensures you always have something available. Update your profile on each platform, check all of them daily, and prioritise the highest-paying surveys available across all platforms at any given time.

Use Idle Time Productively

Most surveys take 5–20 minutes — a natural fit for commutes, lunch breaks, or time between tasks. Rather than blocking out dedicated survey time, treat surveys as productive use of moments that would otherwise be idle. Many of our most consistent earners complete surveys during their morning commute or while waiting for appointments.

Never Rush

Completing a survey in half the expected time is a quality red flag. If a 15-minute survey is completed in 4 minutes, the response is flagged and not credited. Take each survey at a natural pace, read questions carefully, and give thoughtful answers. A single quality response that earns ₹80 is worth more than three rushed responses that earn nothing.

How Survey Payments Work in India

The shift to UPI payments has made online surveys significantly more accessible for Indian members. Unlike older platforms that paid only via PayPal or gift cards — both of which have limitations for Indian users — UPI-native platforms like Relevant Reflex transfer earnings directly to your PhonePe, Google Pay, or Paytm account.

The process is straightforward. You earn points or direct rupee credits for each completed survey. Once your account balance reaches the minimum threshold (₹500 on Relevant Reflex), you can submit a withdrawal request. Enter your UPI ID in the redemption section, confirm it is correct, and submit. Payments are typically processed within 3–7 business days.

One important note on taxes: survey earnings in India are technically taxable income. Most members earning supplementary income from surveys do not need to file separately unless their total annual income from all sources exceeds the taxable threshold. If you earn consistently above ₹4,000–₹5,000 per month from surveys, consult a tax advisor about whether this needs to be reported.

Frequently Asked Questions — Online Surveys India

How much can you realistically earn from online surveys in India?

Most active members earn between ₹500 and ₹4,000 per month depending on profile completeness, participation consistency, and demographic profile. Beginners typically earn ₹500–₹1,500 in their first month. Experienced, active members earn ₹2,000–₹4,000 per month.

Are online surveys in India legitimate and safe?

Yes — legitimate paid survey platforms are genuine businesses. Relevant Reflex has paid over ₹25 lakh to 50,000+ verified Indian members since 2021. The key is choosing platforms that are free to join, offer UPI payments, and have verifiable payment records. Avoid any platform that charges a registration fee.

How do I get paid from online surveys in India?

Most India-focused platforms pay via UPI — directly to your PhonePe, Google Pay, or Paytm account. The minimum payout threshold on Relevant Reflex is ₹500. Once you reach this threshold, you can request a withdrawal which is typically processed within 3–7 business days.

Why do I keep getting screened out of surveys?

Getting screened out means that particular survey was targeting a specific demographic that does not match your profile. This is completely normal and happens to all members. The fix is to complete your profiler surveys thoroughly — the more detail you provide about your lifestyle, income, and interests, the better your profile matches available surveys.

How long does it take to receive the first survey payment in India?

Most new members reach the ₹500 minimum payout threshold within 2–4 weeks of joining, assuming they log in daily and complete available surveys. After requesting a withdrawal, payment is typically processed within 3–7 business days via UPI.

Ready to Start Earning with Online Surveys?

Join 50,000+ Indians already earning with Relevant Reflex. Free to join, UPI payments, ₹500 minimum payout.

Join Free Today
-------------------- END OF FILE -------------------- FILE: RR com/articles/how-to-identify-genuine-survey-websites.php TYPE: PHP SIZE: 11.3 KB ------------------------------------------------------------ How to Identify Genuine Survey Websites India | Relevant Reflex
December 15, 2024  |  Avoiding Scams  |  Last updated: April 2026

How to Identify Genuine Survey Websites in India

In India's growing online survey landscape, legitimate earning opportunities exist alongside fraudulent sites. Knowing how to tell them apart protects your time and personal data.

1. Look for Transparent Contact Information

Every legitimate survey platform displays a physical address, working email address, and a privacy policy. If a survey site has no "About Us" or "Contact" page, treat it as a red flag. Genuine platforms like Relevant Reflex display their full address (Ethirmedu, Tamil Nadu) and respond to support queries within 24 hours.

2. They Never Charge to Join

Reputable paid survey sites in India are always free to join. Any site asking for a registration fee, "activation charge", or upfront payment is a scam. No legitimate market research company requires payment from respondents.

3. Check Payment Methods Suited to India

A genuine India-focused survey platform will offer UPI transfers, Paytm, or PhonePe — not just PayPal or international wire transfers. If a site only offers international payment methods with high minimum thresholds, it may not actually serve Indian members well.

4. Read Reviews on Independent Sites

Search for the platform's name on SurveyPolice, Google Reviews, or Trustpilot. Genuine platforms accumulate real reviews over time. Be wary of platforms with zero reviews or only 5-star reviews posted on the same day.

5. Realistic Earnings Claims

Legitimate survey sites set realistic expectations. If a platform promises ₹50,000 per month from surveys alone, that is not realistic. Genuine platforms are honest — most members earn ₹500–₹4,000 per month depending on their profile and participation level.

6. They Have a Clear Privacy Policy

Genuine platforms explain exactly what data they collect, how it is used, and whether it is shared with third parties. A missing or vague privacy policy is a serious warning sign, especially given India's data protection laws.

About Relevant Reflex

Relevant Reflex is an India-based paid survey platform operating since 2021. We have 50,000+ verified members across India and have paid out ₹25 lakh+ via UPI. Join free today.

-------------------- END OF FILE -------------------- FILE: RR com/articles/online-surveys-india-housewives.php TYPE: PHP SIZE: 33.16 KB ------------------------------------------------------------ Online Surveys India for Housewives: Work From Home and Earn in 2026

Online Surveys India for Housewives: Work From Home and Earn in 2026

A practical guide for Indian homemakers — earn ₹1,000–₹3,500 per month from your phone, in your own time, with no investment required.

For Indian homemakers who manage household expenses, grocery purchases, childcare decisions, and daily family needs, paid online surveys offer something genuinely valuable: a way to earn money independently, on your own schedule, from your phone — with no investment, no employer, and no fixed hours.

This is not a get-rich-quick scheme. It is a legitimate market research activity where companies pay for the opinions of Indian homemakers because those opinions directly influence product and pricing decisions. Your experience managing a household makes your feedback genuinely valuable to brands — and they pay for it.

Why Homemakers Receive High-Value Surveys

Indian homemakers control the majority of household purchase decisions — groceries, cleaning products, cooking oil, personal care, children's products, household appliances, and more. Market research companies know this, and they actively seek homemaker opinions for their clients.

This means homemakers with complete profiles often receive more survey invitations than many other demographic groups. The surveys sent to homemakers are typically about products you already buy and use — making them faster to complete and easier to answer honestly than surveys about unfamiliar topics.

Survey categories homemakers commonly qualify for:
  • Grocery and FMCG product preferences — oils, detergents, packaged foods
  • Children's products — health supplements, school supplies, toys, apps
  • Household appliances — mixers, washing machines, refrigerators
  • Personal care — skincare, haircare, health and wellness
  • Home cleaning and hygiene products
  • Online shopping habits — Big Basket, Blinkit, Zepto, Amazon
  • Health and nutrition — cooking oils, dairy, packaged snacks
  • Financial products — insurance, savings accounts, UPI usage

These are surveys about products and brands you likely already have opinions about — which is exactly why your participation is valuable and why your answers are taken seriously by the brands commissioning the research.

Realistic Earnings for Homemakers

Homemakers who match common research demographics — married women aged 25–45 with children, managing household purchasing decisions — typically fall into the more active earning bracket. Here is a realistic picture:

Daily Time Monthly Earnings Suitable When
20–30 mins ₹700 – ₹1,500 Busy periods, young children at home
45–60 mins ₹1,500 – ₹2,800 Most homemakers — sustainable daily commitment
60–90 mins ₹2,500 – ₹3,500+ When children are at school, more free time available

"I started after my second child was born and I had stepped away from my teaching job. In month 1 I earned ₹820. Now in month 7 I'm earning ₹2,600–₹3,000 every month. It goes directly into my personal savings — money I earned myself."

— Kavitha R., Homemaker, Madurai

"I do surveys during the hour after the children leave for school and before I start cooking. Usually 3–4 surveys a day. Last month I withdrew ₹2,100 via GPay. My husband was surprised it was real."

— Meena S., Homemaker, Bengaluru

Fitting Surveys Into Your Daily Routine

The design of survey participation fits naturally into a homemaker's schedule because it requires no fixed time slot, no advance preparation, and can be paused and resumed. Most surveys take 10–20 minutes and require only your phone.

Sample Daily Survey Schedule for a Homemaker
8:30 – 9:00 AM After children leave for school — check for new surveys, complete 1–2 short surveys (10–15 mins each). Best time for focused survey completion.
11:00 – 11:30 AM Mid-morning quiet period — complete 1 longer survey (15–20 mins). Check email for new survey invitations.
2:00 – 2:30 PM After lunch, before children return — complete remaining available surveys. Good time for longer detailed surveys.
Evening (optional) Check for newly opened surveys — some new surveys open in the afternoon. Quick 5-minute check only.

This schedule gives you approximately 60–75 minutes of survey time per day without affecting your household responsibilities. On days when you are particularly busy, simply skip — there is no penalty and no minimum participation requirement.

How to Get Started — Step by Step

Step 1 — Register with your real personal information

Sign up at Relevant Reflex using your real age, marital status, number of children, household income range, and location. This demographic data is exactly what determines which surveys you receive. Inaccurate information leads to fewer and lower-value survey matches — there is no benefit to providing false details.

Step 2 — Verify your email immediately

After registering, check your email inbox and click the verification link right away. Unverified accounts do not receive survey invitations. If you do not see the email, check your spam folder and look for an email from Relevant Reflex.

Step 3 — Complete your profile in full on day 1

Spend your first session — approximately 30–40 minutes — completing every section of your profile. For homemakers, the most important sections are household size and composition, number and ages of children, monthly household spending on groceries and personal care, appliances owned, shopping habits (online vs in-store), and vehicle ownership. These specific data points unlock the FMCG, children's products, and household research surveys that are most relevant to homemakers.

Step 4 — Complete profiler surveys as they appear

Profiler surveys are short (3–6 minutes) and appear periodically in your dashboard. They expand your profile data and unlock new survey categories. Completing every profiler survey within 24 hours of it appearing is the single most effective way to increase the number and quality of survey invitations you receive.

Step 5 — Log in daily and check email

Set up email notifications if possible, so you receive alerts when new surveys arrive. Many surveys close within hours once their quota fills. Members who check daily catch these opportunities; those who check every few days regularly miss them. Even a 5-minute daily check is enough to stay ahead of closing surveys.

Step 6 — Withdraw via UPI when you reach ₹250

Once your account balance reaches ₹250 (500 points), go to the redemption section, enter your UPI ID, and submit a withdrawal request. The money arrives in your PhonePe, Google Pay, or Paytm account within 3–7 business days — independently, in your name.

Profile Tips Specific to Homemakers

Be specific about your household spending

Brands commission surveys targeting homemakers who spend specific amounts on groceries, personal care, or household products. Provide your honest monthly spending figures in each category — do not understate or approximate. More specific data leads to better survey matches and more relevant invitations.

Include your children's ages precisely

Companies making products for specific age groups — baby products for 0–2 years, school supplies for 6–12 years, teenage consumer products — look specifically for mothers in those age ranges. Providing your children's exact ages (not just "school age") unlocks a significant category of product research surveys.

Mention all brands you use regularly

When profile surveys ask about brand usage — which cooking oil, which detergent, which personal care brands — answer honestly and specifically. Brand research surveys are some of the highest-paying, and they specifically target users of particular brands. If you use Aashirvaad atta, Fortune oil, or Surf Excel, say so — it matters.

Update your profile when your household situation changes

If you have a new child, move to a different city, or your household income changes significantly, update your profile. Outdated profile data leads to poor survey matching and missed opportunities. Check your profile completeness every 3 months.

Financial Independence Through UPI Payments

For many Indian homemakers, having a personal income — however small — that arrives directly in their own UPI account represents a meaningful form of financial independence. Survey earnings go directly to your account, in your name, accessible to you immediately upon processing.

Many members use their survey earnings for personal expenses they would otherwise need to ask their spouses about — mobile recharges, personal care products, books, subscriptions, or small gifts for themselves or their children. Others save steadily — ₹2,000/month adds up to ₹24,000 per year, which is meaningful supplemental savings.

The UPI-native payment system on Relevant Reflex means you do not need a credit card, PayPal account, or any special financial setup. If you already use PhonePe, Google Pay, or Paytm — which most Indian smartphone users do — you are already set up to receive payments.

Safety note: Legitimate survey platforms will never ask for your bank account number, debit card details, OTP, or UPI PIN. Relevant Reflex only needs your UPI ID (the handle like yourname@ybl) to send you money — never your PIN. If any platform asks for your PIN or OTP, it is a scam.

Frequently Asked Questions

Can housewives in India earn money from online surveys?

Yes. Indian homemakers are one of the most valued demographics for market research. Homemakers can realistically earn ₹1,000–₹3,500 per month through consistent survey participation with no investment and a flexible schedule.

How much can an Indian housewife earn from online surveys per month?

Most active homemaker members earn ₹1,000–₹3,500 per month. Homemakers with children, car ownership, or household incomes above ₹5 lakh typically receive more high-value survey invitations and earn toward the higher end of this range.

What is the best time for housewives to do online surveys in India?

Most homemakers find mid-morning (after children leave for school, between 8:30–11 AM) the most productive time. This quiet period allows focused survey completion without interruption.

Do I need a laptop or can I use my phone?

Your Android or iPhone is sufficient. Relevant Reflex is fully mobile-optimised. All surveys can be completed on a phone without a laptop or desktop computer.

Is it safe to join a paid survey site as a homemaker in India?

Yes, as long as you join legitimate platforms that are free to join and never ask for your bank PIN, OTP, or upfront payment. Relevant Reflex is free, asks only for your UPI ID to send you money, and never requires any financial information that could compromise your accounts.

Can I do surveys even if I have very limited free time?

Yes. Even 20 minutes per day is enough to earn ₹700–₹1,000 per month. There is no minimum daily requirement — on very busy days, simply check for new surveys in 5 minutes and skip the rest. No penalty, no pressure.

Start Earning Your First ₹500 This Month

Join free, complete your profile in 30 minutes, and start receiving survey invitations matched to your household profile.

Join Relevant Reflex Free See Earning Potential
Homemakers — Join Free

Earn ₹1,000–₹3,500/month. Your time, your schedule, your income.

Sign Up Free Today
-------------------- END OF FILE -------------------- FILE: RR com/articles/online-surveys-india-students.php TYPE: PHP SIZE: 32.34 KB ------------------------------------------------------------ Online Surveys India for Students: Earn Pocket Money in College (2026)

Online Surveys India for Students: Earn Pocket Money in College (2026)

No investment, no fixed schedule, UPI payout — a practical guide for Indian college students looking for genuine supplemental income.

India has over 40 million college students — and for many, managing monthly expenses on a limited budget is a real challenge. Paid online surveys offer a genuine, zero-investment way to earn ₹500–₹2,000 per month without disrupting your studies. You do not need any skills, prior experience, or a laptop — your Android phone is enough.

This guide is written specifically for Indian college students. We cover why students are a valued survey demographic, how to fit survey participation around your schedule, what you can realistically earn, and how to avoid the common mistakes that cause new members to give up too early.

Why Brands Actively Want Student Opinions

Students aged 18–24 are one of the most researched demographic groups in India's market research industry. Here is why — and why this works in your favour:

Indian college students represent the country's next generation of consumers. Brands want to understand what influences your purchasing decisions before you form strong brand loyalties. Companies in smartphones, fashion, food delivery, streaming services, edtech, gaming, and FMCG products regularly commission surveys specifically targeting 18–24 year olds in India.

This means students with accurate, complete profiles often receive more survey invitations than older demographics in the same region. Brands are willing to pay for access to student opinions because this demographic is notoriously difficult to reach through traditional research methods.

Survey categories students commonly qualify for:
  • Smartphone usage and brand preferences
  • Food delivery apps (Swiggy, Zomato) and ordering habits
  • Streaming platforms (Netflix, Disney+, YouTube)
  • Online shopping behaviour — Flipkart, Amazon, Meesho
  • Social media usage patterns — Instagram, YouTube, Moj
  • Career and education services — coaching, online courses
  • Fashion and personal care products
  • Gaming apps and habits

What Students Actually Earn — Honest Numbers

Here is a realistic earnings picture for Indian college students based on actual member data:

Daily Time Monthly Earnings Best For
15–20 mins (casual) ₹300 – ₹700 Exam periods, busy semesters
30–45 mins (regular) ₹700 – ₹1,500 Most students — sustainable pace
60–90 mins (active) ₹1,500 – ₹2,500 Semester breaks, multiple platforms

To put these numbers in context: ₹1,500/month covers most students' monthly mobile recharge and data costs. ₹2,500/month covers transport, canteen expenses, or a monthly OTT subscription with money left over. It is genuine supplemental income — not a salary, but meaningfully useful for students managing tight budgets.

"I started during my second year of engineering. The first month I earned ₹650, which I used to buy data. By month 4, I was making ₹1,800 per month consistently — enough to stop asking my parents for pocket money every week."

— Arun K., Engineering Student, Chennai

How to Fit Surveys Around Your College Schedule

The best thing about survey participation for students is the complete flexibility. There is no fixed schedule, no minimum hours, and no penalty for taking a day off. Here is how to structure it around a typical college week:

Time Slot Survey Activity Why It Works
Morning commute (bus/metro) Check for new surveys, complete 1–2 short polls Dead time converted to earnings — 15–20 mins
Between lectures (free periods) Complete 1 standard survey (10–15 mins) Uninterrupted time, no equipment needed
After college (before dinner) Complete 1–2 surveys, check new invitations Most productive time for longer surveys
Weekend mornings Complete any pending profiler surveys, 2–3 standard surveys More time available, better focus

During exam periods, simply reduce to 10–15 minutes per day — just enough to check for new surveys and complete one or two quick polls. Survey earnings do not require a fixed minimum time commitment. Even 15 minutes per day yields ₹300–₹500 per month.

Step-by-Step: How to Get Started

Step 1 — Sign up with accurate information

Register at Relevant Reflex using your real name, age, gender, and email address. Use a personal email you check daily — survey invitations arrive by email and surveys close quickly once quotas fill. Do not use a college email that you may lose access to after graduation.

Step 2 — Verify your email immediately

Check your inbox right after registering and click the verification link. This activates your full account. Without email verification, you will not receive survey invitations.

Step 3 — Complete your profile thoroughly on day 1

Spend 25–35 minutes completing every section of your profile — especially your education status, year of study, course, smartphone usage, apps you use regularly, and spending habits. This profile data determines which surveys you qualify for. Students with complete profiles consistently receive 3–4x more invitations than those with incomplete profiles.

Step 4 — Complete profiler surveys as they appear

Profiler surveys are short questionnaires (2–5 minutes) that build a more detailed picture of your interests and habits. Every profiler you complete unlocks new survey categories. Make it a habit to complete any new profiler survey within 24 hours of it appearing in your dashboard.

Step 5 — Check in daily and be consistent

Log in at least once per day — even if only for 5 minutes. Many surveys close once their quota fills, sometimes within hours. Members who check daily earn significantly more than those who check every few days because they catch surveys before they close.

Step 6 — Withdraw via UPI when you reach ₹250

Once your balance reaches ₹250 (500 points), go to the redemption section, enter your UPI ID (PhonePe, GPay, or Paytm), and submit your withdrawal request. Processing takes 3–7 business days. Your first withdrawal is the proof that the platform actually pays — and it is a good feeling.

Tips Specific to Student Members

Register with your permanent personal email, not your college email

Many students register using their college-provided email address. This is a mistake — college email access is usually revoked after graduation or when you change institutions. Use a Gmail or personal email address you will have access to permanently.

Be specific about your course and institution type in your profile

Brands often commission surveys specifically targeting engineering students, medical students, MBA students, or students at certain types of institutions (IITs, NITs, state universities, private colleges). The more specific your profile, the more precisely you can be matched to surveys designed for your demographic.

Surveys about apps and services you actually use are more valuable

When completing surveys about apps or services you use genuinely — Swiggy, Spotify, Instagram, WhatsApp — your answers are more authentic and complete. Survey platforms use quality checks to detect rushed or inconsistent answers. Genuine users of the products being researched also complete surveys faster, which improves your earnings per hour.

Do not do surveys during lectures

This sounds obvious but is worth stating. Survey quality checks detect when users are distracted — rushing through questions, giving inconsistent answers, or completing surveys in implausibly short times. These responses are flagged and not credited. Surveys done in 10 minutes that should take 15 minutes earn nothing.

Semester breaks are high-earning periods

During semester breaks when you have 3–4 hours of free time per day, consider increasing your survey time to 60–90 minutes across 2–3 platforms. Members who make full use of semester break time can accumulate 3–4 months of typical earnings in 4–6 weeks of focused participation.

How UPI Payout Works for Students

Most Indian college students already have UPI set up on their phones through PhonePe, Google Pay, or Paytm. This makes withdrawing survey earnings straightforward — there is no need to set up a bank account separately or deal with international payment processors.

To withdraw your earnings on Relevant Reflex:

  1. Go to your dashboard and click on the redemption section
  2. Enter your UPI ID exactly as registered on your UPI app — a small typo will cause the payment to fail
  3. Submit the withdrawal request — minimum amount is ₹250
  4. Payment arrives in your UPI account within 3–7 business days
  5. You will receive a notification on your UPI app when the payment lands
Important: Double-check your UPI ID before submitting a withdrawal request. An incorrect UPI ID will result in a failed payment. If you are unsure of your exact UPI ID, open your PhonePe or GPay app and check the profile section for your UPI handle (usually in the format: yourname@ybl or yourphone@okaxis).

Frequently Asked Questions

Can college students in India earn money from online surveys?

Yes. Students aged 18–24 are a highly valued research demographic. Indian students can realistically earn ₹500–₹2,000 per month through consistent survey participation with no investment required.

Do I need a laptop or will my phone work?

Your Android or iPhone is sufficient. Relevant Reflex is fully mobile-optimised. Most surveys are designed to be completed on a phone and typically take 10–20 minutes.

Do I need to be 18 to join paid survey sites in India?

Yes. Most legitimate survey platforms including Relevant Reflex require members to be at least 18 years old to participate and earn rewards. This is a legal requirement related to contract eligibility.

Will paid surveys affect my studies?

Not if you manage your time well. Most students spend 20–30 minutes per day during idle time — commutes, free periods, or before bed. Survey participation does not require fixed time blocks and can be paused during exams without penalty.

Do I need to invest money to join paid survey sites as a student?

No. Legitimate paid survey platforms are always free to join. Never pay a registration fee or membership fee. Platforms that charge fees are scams.

Start Earning Your First ₹500 This Month

Join free, complete your profile, and start receiving survey invitations matched to your student profile.

Join Relevant Reflex Free See Earning Potential
Students — Join Free Today

Earn ₹500–₹2,000/month. No investment. UPI payout.

Sign Up Free
-------------------- END OF FILE -------------------- FILE: RR com/articles/paid-surveys-india-earning-potential.php TYPE: PHP SIZE: 33.89 KB ------------------------------------------------------------ Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?

Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?

An honest breakdown based on real data from 50,000+ Indian members — no inflated numbers, no false promises.

If you've searched for paid surveys in India, you've probably seen websites claiming you can earn ₹10,000–₹50,000 per month just by answering a few questions. Those numbers are not real. They are designed to get you to click, not to give you accurate information.

This article gives you the honest picture — based on actual member data from Relevant Reflex, which has operated India's paid survey platform since 2021 and paid over ₹25 lakh to 50,000+ verified Indian members via UPI. We want you to join us knowing exactly what to expect, not disappointed by unrealistic claims.

The Honest Earnings Table

Here is what members at different stages of experience and engagement actually earn on Indian survey platforms. These ranges are based on real payout data — not projections or estimates from international markets.

Member Type Daily Time Monthly Earnings Profile Status
Beginner
Month 1–2
30–45 mins ₹500 – ₹1,500 Partially complete profile
Active Member
Month 3–6
1–2 hours ₹2,000 – ₹4,000 Fully complete profile
Experienced Member
6+ months
2+ hours ₹4,000 – ₹6,000 100% profile + all profilers done
Multi-Platform
3–5 platforms combined
2–3 hours ₹6,000 – ₹10,000 Full profiles on all platforms
Important: These ranges reflect what active, consistent members earn. Individual results vary based on your demographic profile, time investment, and survey availability in your region. Earnings are supplemental income — not a replacement for a primary salary. See our Earnings Disclaimer for full details.

What Individual Surveys Actually Pay in India

Understanding the per-survey payout structure helps you set realistic daily expectations. Here is a breakdown by survey type and duration:

Survey Type Duration Typical Payout Availability
Quick opinion polls 2–5 min ₹10 – ₹30 Daily
Standard surveys 10–15 min ₹40 – ₹120 Several per week
Detailed surveys 20–30 min ₹100 – ₹300 1–3 per week
Product testing surveys 30–45 min + usage period ₹400 – ₹2,000 Occasional (invite only)
Focus group discussions 60–90 min ₹1,000 – ₹3,000 Rare (invite only)
Profiler surveys 3–8 min ₹5 – ₹20 (or 0, but unlock more surveys) Periodic

The key insight from this table: your monthly income is not determined by one big survey — it is built from consistent daily participation across multiple survey types. A member who completes 2–3 standard surveys per day plus one detailed survey every two days can realistically accumulate ₹2,000–₹3,000 per month before even factoring in the occasional product test or focus group.

5 Factors That Determine Your Earnings

1. Profile Completeness

This is the single most impactful factor and the one most beginners underestimate. Survey platforms match respondents to surveys based on demographic data — your age, gender, occupation, household income, education, family situation, vehicle ownership, and dozens of other criteria. A member with a fully completed profile including all optional profiler sections receives significantly more invitations than someone with basic information only.

On Relevant Reflex, members who complete 100% of their profile and all available profiler surveys receive on average 3–4x more survey invitations than members with incomplete profiles. This single action can double or triple your monthly earnings without any additional time investment.

2. Daily Login Consistency

Many surveys close once their response quota is filled — often within hours of opening. Members who check their dashboard and email daily catch these surveys before they close. Those who log in every few days regularly miss opportunities that are already gone. This is not something that can be compensated for by spending longer on the platform when you do log in — the surveys simply are not available anymore.

3. Your Demographic Profile

Some demographics receive more high-value surveys than others. This is determined by what Indian brands and market research agencies are currently studying — not something you can change. Demographics that typically receive more surveys in India include working professionals aged 25–45, car owners, parents of children under 12, people with household incomes above ₹5 lakh per year, residents of metros and Tier 1 cities, and people who regularly purchase consumer electronics, FMCG products, or financial products.

If your profile matches these demographics, your earnings potential is naturally higher. If it does not, your earnings will be lower — and that is honest. Survey platforms match based on research demand, not on what members want to earn.

4. Number of Platforms

No single survey platform has unlimited surveys available every day. Even the most active members on a single platform will have days with few or no surveys available. Joining 3–5 legitimate platforms ensures you always have something to complete. Members who combine Relevant Reflex with 2–3 other India-focused platforms typically earn 60–80% more per month than single-platform members with similar demographics.

5. Response Speed to Invitations

When you receive a survey invitation by email, responding within 1–2 hours dramatically increases your chances of completing it before the quota fills. Setting up email notifications for survey invitations and checking them promptly is a simple habit that meaningfully increases monthly earnings for most members.

How to Move from Beginner to Active Earner

The gap between earning ₹500/month and ₹3,000/month is almost entirely explained by these five actions — not by luck or by having the right demographic profile:

The 5 actions that move you from beginner to active earner:
  1. Complete 100% of your profile on day 1 — spend the first 30–45 minutes after joining doing nothing else. This is the most valuable time you will invest on the platform.
  2. Complete every profiler survey within 24 hours of it appearing. Set a habit of checking for new profilers every Monday morning.
  3. Log in every day, even if only for 5 minutes to check for new surveys. Missing a day means missing surveys that closed overnight.
  4. Join 2–3 other legitimate Indian survey platforms within your first month. Use your Relevant Reflex earnings as proof that the model works, then expand.
  5. Be patient for the first 6–8 weeks. The algorithm needs time to learn your profile and match you with appropriate surveys. Members who give up in week 3 never see the earnings that months 3–6 deliver.

What a Realistic 3-Month Goal Looks Like

Here is what a typical new member journey looks like on Relevant Reflex, assuming consistent daily participation:

Month What Happens Expected Earnings
Month 1 Profile setup, learning the platform, completing profilers, first surveys — algorithm is still calibrating your profile ₹500 – ₹1,200
Month 2 More targeted survey invitations arriving, profiler data built up, first UPI withdrawal possible ₹1,000 – ₹2,500
Month 3 Consistent survey flow, good understanding of which survey types suit your profile, regular withdrawals ₹2,000 – ₹4,000

This progression is real — it happens because the matching algorithm gets more accurate data about your profile and preferences over time, and because profiler surveys you completed in month 1 begin unlocking higher-value survey categories in months 2–3.

The members who earn ₹500/month in month 1 and ₹4,000/month in month 6 are not the same people who give up in week 2 because they only earned ₹150 in their first survey session. Patience and consistency are what actually separate high earners from low earners on Indian survey platforms.

Frequently Asked Questions

How much can a beginner earn from paid surveys in India per month?

A beginner in their first 1–2 months can typically earn ₹500–₹1,500 per month, assuming daily logins and a partially completed profile. This increases significantly in months 3–6 as the platform calibrates to your profile.

Can you earn ₹5,000 per month from paid surveys in India?

Yes, but it requires consistent daily participation of 2+ hours, a fully completed profile, and a demographic that receives high-value survey invitations. Experienced members on multiple platforms can reach ₹6,000–₹10,000 combined.

What factors affect how much you earn from paid surveys in India?

The main factors are profile completeness, daily login consistency, your demographic profile, the number of platforms you use, and how quickly you respond to survey invitations.

How much does a single paid survey pay in India?

Short surveys of 5–10 minutes typically pay ₹20–₹60. Standard surveys of 15–20 minutes pay ₹60–₹200. Longer surveys pay ₹150–₹400. Focus group discussions of 60–90 minutes can pay ₹1,000–₹3,000.

Is ₹10,000/month from paid surveys in India possible?

It is possible but requires combining 3–5 platforms, 3+ hours of daily participation, a strong demographic profile, and several months of consistent participation. It is not achievable for most members in their first few months on a single platform.

Start Building Your Survey Income Today

Join 50,000+ Indians earning with Relevant Reflex. Free to join — UPI payments — ₹250 minimum payout.

Join Free Today Read the Complete Guide
-------------------- END OF FILE -------------------- FILE: RR com/articles/realistic-earning-expectations-surveys-india.php TYPE: PHP SIZE: 14.33 KB ------------------------------------------------------------ Realistic Paid Survey Earnings Expectations India | Relevant Reflex
November 28, 2024  |  Maximize Earnings  |  Last updated: April 2026

Realistic Earning Expectations from Paid Surveys in India

Before joining any paid survey platform, it is important to understand what you can realistically earn — and what factors determine how much you make each month.

The Honest Truth About Survey Earnings in India

Online surveys are a genuine way to earn supplementary income in India — but they are not a replacement for a job or a primary income source. Anyone promising thousands of rupees per day from surveys alone is not being honest. The good news is that with consistent participation and a complete profile, most active members build a reliable monthly side income.

Indicative Earnings by Experience Level

Based on member data from Relevant Reflex, here is what members at different stages of participation typically earn. These are indicative ranges — individual results vary based on the factors described below.

Member Level Daily Time Monthly Earnings Range Profile Status
Beginner (first 1–2 months) 30–45 mins ₹500 – ₹1,500 Partially complete
Active member 1–2 hours ₹2,000 – ₹4,000 Fully complete
Experienced member 2+ hours ₹5,000+ 100% complete + profilers done

* These are indicative ranges based on member data. Individual earnings are not guaranteed and vary. See our Earnings Disclaimer.

What Determines How Much You Earn

Several factors directly influence your monthly survey earnings:

Your Demographic Profile

Certain demographics receive more survey invitations because brands specifically want their feedback. For example, professionals in technology, healthcare, or finance are frequently targeted for industry surveys that pay higher rates. Parents of young children, car owners, and frequent online shoppers also tend to receive more surveys. This is not something you can control — but being honest about your profile ensures you receive surveys you actually qualify for.

Profile Completeness

Members with complete profiles — including all profiler sections covering lifestyle, assets, income, and interests — receive significantly more survey invitations than those with basic profiles. This is the single most controllable factor in your earnings.

Daily Participation Consistency

Members who check their dashboard and email daily earn consistently more than those who participate sporadically. Many surveys close once their quota is filled — checking in daily means you catch surveys before they close.

Survey Availability in Your Region

Survey availability fluctuates based on what research clients are studying at any given time. Some months may have high survey volume; others may be quieter. This is normal and affects all members equally.

Why You Get Screened Out of Some Surveys

Getting screened out — where you start a survey but get disqualified partway through — is a normal part of survey taking and happens to every member. It means the survey was targeting a specific demographic that does not match your profile. You are not penalised for being screened out, and it does not affect your account quality. Over time, as your profiler data becomes richer, your screen-out rate decreases.

Surveys as Supplementary Income

The most satisfied survey takers treat earnings as a supplement — covering phone bills, streaming subscriptions, occasional dining out, or small savings contributions. Members who approach surveys with this mindset participate more consistently and sustainably than those expecting a primary income replacement.

Join 50,000+ Members Earning with Surveys

Relevant Reflex has paid ₹25 lakh+ to members across India since 2021. UPI payments, ₹500 minimum payout, free to join. Create your free account today.

-------------------- END OF FILE -------------------- FILE: RR com/articles/relevant-reflex-review-legit.php TYPE: PHP SIZE: 31.19 KB ------------------------------------------------------------ Is Relevant Reflex Legit? Honest Review with Real UPI Payment Proofs (2026)

Is Relevant Reflex Legit? Honest Review with Real UPI Payment Proofs (2026)

We are reviewing our own platform — so we have committed to being honest about both what works well and what our limitations are.

Disclosure: This review is written by the Relevant Reflex team about our own platform. We have made every effort to be honest and balanced, including acknowledging our limitations. We encourage you to read third-party reviews alongside this one before deciding to join.

When someone searches "is Relevant Reflex legit", they want a straight answer — not marketing language. This article gives you that. We cover what we are, what we have paid out, what our members say, and importantly, what our limitations are. A survey platform that only tells you the positives is not being honest with you.

What is Relevant Reflex?

Relevant Reflex is an India-based paid online survey platform founded in 2021 and operating from Ethirmedu, Tamil Nadu. We connect Indian consumers with companies and market research agencies that need opinions on their products, services, and advertising.

Members register for free, complete their demographic profile, and receive survey invitations matched to their profile. Completed surveys earn points redeemable as cash via UPI — directly to PhonePe, Google Pay, or Paytm. The minimum payout threshold is ₹250 (500 points at ₹0.50 per point).

We are a market research data collection company — not a get-rich-quick scheme, not an app that pays you for downloading other apps, and not a platform that charges a registration fee. We operate in a well-established, legitimate global industry.

Payment Proof and Payout Data

The most common question people ask when evaluating any survey platform is simple: do they actually pay? Here is our verified payout data as of April 2026:

Verified Payout Facts — Relevant Reflex (as of April 2026):
  • Total paid to members: ₹25 lakh+ via UPI
  • Total verified members: 50,000+ across India
  • Payment method: UPI only (PhonePe, GPay, Paytm)
  • Minimum payout threshold: ₹250 (500 pts × ₹0.50)
  • Average payout processing time: 3–7 business days
  • Platform founded: 2021
  • Registration fee: None — free to join

UPI payment screenshots from members are available on our social media profiles and can be requested by emailing support@relevantreflex.com. We blur account numbers and personal details before sharing. The transaction references in these screenshots are verifiable on the UPI network.

Our Honest Ratings

Payment reliability
4.5/5
Survey availability
3.5/5
Payout speed
4.0/5
Ease of use
4.3/5
Earning potential
3.7/5
Overall
4.2/5

Pros and Cons — Balanced View

What Works Well
  • Completely free to join — no fees ever
  • UPI payments — works with PhonePe, GPay, Paytm
  • Low ₹250 minimum payout threshold
  • India-specific surveys — not repurposed international content
  • Reliable payment processing — members are paid
  • Responsive email support team
  • Mobile-friendly platform — works well on Android and iOS
  • No investment of any kind required
Honest Limitations
  • Survey volume varies — not every day has available surveys
  • Some demographics receive fewer invitations than others
  • Screen-outs are common — this is normal on all platforms
  • Earnings are supplemental — not a primary income replacement
  • No app yet — mobile web only
  • Payout takes 3–7 days — not instant
  • Focus groups are invite-only and not guaranteed

What Members Say

Rather than curating only positive reviews, here is a representative range of member feedback we have received — positive and critical:

"I was sceptical at first but after receiving my first UPI payment of ₹650 in week 3, I was convinced. Now in my fourth month and earning around ₹2,800 per month consistently."
— Priya S., Software Professional, Bengaluru

"The first month was slow — maybe ₹400 total. But I kept at it, completed all the profiler surveys, and by month 3 I was getting 8–10 survey invitations per week. My last withdrawal was ₹1,800 in one go."
— Rajesh M., Teacher, Chennai

"I wish there were more surveys available every day. Some days I log in and there are only 1–2 available which is a bit disappointing. But when they are available they are genuine and the payment always comes through."
— Anitha K., Homemaker, Coimbatore

"I got screened out of several surveys in my first week and almost quit. Then I read that this is normal and completed my full profile. The screening rate dropped a lot after that. Good platform overall."
— Mohammed R., Student, Hyderabad

Our Honest Limitations

We believe you should know these before joining:

Survey availability is not guaranteed

The number of surveys available to you on any given day depends on what our research clients need that day, and whether your profile matches those requirements. There will be days — sometimes several in a row — where there are no new surveys available for your demographic. This is true of every survey platform in the world, not just ours. We cannot guarantee a minimum number of daily surveys.

Not everyone earns the same amount

Members with demographics that are frequently targeted by market research — working professionals in metros, car owners, parents — receive more survey invitations than members with less commonly researched profiles. We are transparent that earnings vary significantly by demographic profile.

Screen-outs happen

Being screened out of a survey — where you start and get rejected after a few questions — is a standard part of survey participation everywhere. Companies want specific demographic subgroups, and once a quota fills, everyone else is screened out. This is not a reflection of your answers being wrong. It is unavoidable in the survey industry.

This is supplemental income, not a salary

We do not want members to join expecting to replace a full-time income. Most active members earn ₹1,500–₹4,000 per month — genuinely useful supplemental income, but not a living wage. Members who join with realistic expectations are consistently satisfied. Members who join expecting ₹20,000 per month are always disappointed — on every platform.

Verdict — Is Relevant Reflex Worth Joining?

Yes — with realistic expectations

Relevant Reflex is a legitimate, free-to-join, UPI-paying Indian survey platform. It is not a scam, does not charge fees, and does pay its members. We have verifiable payment records across 50,000+ members.

It is worth joining if you want supplemental income from home with no investment, have 30–120 minutes per day available, and are patient enough to build up earnings over the first 2–3 months.

It is not the right fit if you expect to earn more than ₹6,000–₹8,000 per month from surveys alone, want instant payments, or are looking for a primary income source.

Our recommendation: Join free, complete your full profile on day 1, spend 30–45 minutes per day for the first 2 weeks, and evaluate after your first withdrawal. The experience will tell you everything you need to know.

Frequently Asked Questions

Is Relevant Reflex a legitimate survey platform?

Yes. Relevant Reflex is a legitimate India-based paid survey platform founded in 2021, operating from Tamil Nadu. It has paid over ₹25 lakh to 50,000+ verified Indian members via UPI and is free to join.

Does Relevant Reflex actually pay via UPI?

Yes. Payments go directly to your UPI account — PhonePe, Google Pay, or Paytm — once the ₹250 minimum threshold is reached. Withdrawals are processed within 3–7 business days.

Is there a registration fee?

No. Joining Relevant Reflex is completely free. We do not charge a registration fee, membership fee, or any other fee at any point. If any website claims you need to pay to join Relevant Reflex, that is a fraudulent site — not us.

What are the limitations of Relevant Reflex?

Survey availability varies by day and demographic. Members in smaller cities or with less commonly researched profiles may receive fewer invitations. Like all platforms, screen-outs happen. Earnings are supplemental — not a primary income replacement.

How long has Relevant Reflex been operating?

Relevant Reflex was founded in 2021 and has been operating continuously since then, growing to 50,000+ verified members across India.

Try It Yourself — Free to Join

The best way to evaluate any survey platform is to try it. Join free, complete your profile, and see your first earnings within 2–4 weeks.

Join Relevant Reflex Free See Earning Potential
-------------------- END OF FILE -------------------- FILE: RR com/articles/time-management-tips-survey-takers.php TYPE: PHP SIZE: 13.35 KB ------------------------------------------------------------ Time Management Tips for Survey Takers in India | Relevant Reflex
November 15, 2024  |  Tips & Tricks  |  Last updated: April 2026

Time Management Tips for Survey Takers in India

One of the biggest advantages of paid surveys is flexibility — you can participate whenever time allows. But without a simple routine, it is easy to miss surveys or participate inconsistently. These tips help you get the most from the time you invest.

Set a Fixed Daily Check-In Time

The most consistent earners on survey platforms share one habit — they check their dashboard at the same time every day. It does not need to be a long session. A 5–10 minute check each morning to see what surveys are available, and a quick email scan for invitation emails, is enough to ensure you never miss a survey that opened overnight.

Many surveys close within 24–48 hours of opening because research clients need responses quickly. Members who check daily catch these before they fill up. Members who check every few days regularly find surveys they qualified for have already closed.

Use Idle Time Productively

Most surveys on Relevant Reflex take between 5 and 20 minutes to complete. This fits naturally into time that would otherwise be idle — waiting for a bus or auto, a tea break at work, time between college classes, or the first 15 minutes after waking up. Rather than blocking out dedicated "survey time," many members find it easier to treat surveys as a productive use of idle moments throughout the day.

Prioritise Higher-Paying Surveys First

When multiple surveys are available at the same time, start with the ones that offer the highest reward relative to their estimated completion time. A 10-minute survey paying ₹80 is a better use of your time than a 15-minute survey paying ₹50. Over a month, making these small prioritisation decisions consistently adds up to meaningfully higher earnings.

Do Not Force Every Survey

If you are short on time, it is better to skip a survey entirely than to rush through it. Surveys completed too quickly are flagged by quality detection systems — the response gets rejected, you earn nothing, and your account quality score takes a hit. A rejected response wastes more time than skipping the survey would have. Participate when you can give each survey the attention it requires.

Mobile vs Desktop — Know When to Use Each

Relevant Reflex works on both mobile and desktop. Short opinion surveys of 5–10 minutes are well-suited to mobile — you can complete them during commutes or short breaks. Longer surveys of 15–25 minutes, particularly those with detailed questions or grids, are more comfortable on a desktop or laptop where reading and responding is easier. Using the right device for the right survey type reduces fatigue and improves response quality.

Complete Profile Updates Promptly

When the platform prompts you to update a section of your profile or complete a new profiler survey, do it the same day. Profile updates directly affect which surveys you are matched with. Delaying them means missing out on surveys that were targeted at your updated demographic in the meantime. Profiler surveys are typically short — 2 to 5 minutes — and the downstream benefit in survey availability is significant.

Track Your Monthly Earnings

Keeping a simple note of your monthly survey earnings — even just a number in your phone's notes app — helps you stay motivated and spot patterns. If you notice a particular month where earnings dropped, you can usually trace it back to a period of inconsistent participation. Tracking reinforces the habit and gives you a visible measure of progress over time.

Avoid Survey Burnout

Survey fatigue is real. Trying to complete every available survey every day can become exhausting and leads to lower-quality responses. A sustainable approach is better than an intensive one — 30 to 60 minutes of quality participation daily will produce better long-term results than 3-hour sessions a few times a week followed by days of inactivity.

Join Relevant Reflex and Start Earning

50,000+ members across India earn survey rewards via UPI on their own schedule. Free to join, ₹500 minimum payout. Sign up now — takes under 2 minutes.

-------------------- END OF FILE -------------------- FILE: RR com/assets/css/bootstrap.min.css TYPE: CSS SIZE: 149.52 KB ------------------------------------------------------------ @charset "UTF-8";/*! * Bootstrap v5.0.0-beta1 (https://getbootstrap.com/) * Copyright 2011-2020 The Bootstrap Authors * Copyright 2011-2020 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x)/ -2);margin-left:calc(var(--bs-gutter-x)/ -2)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)/ 2);padding-left:calc(var(--bs-gutter-x)/ 2);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.3333333333%}.col-2{flex:0 0 auto;width:16.6666666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.3333333333%}.col-5{flex:0 0 auto;width:41.6666666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.3333333333%}.col-8{flex:0 0 auto;width:66.6666666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.3333333333%}.col-11{flex:0 0 auto;width:91.6666666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.3333333333%}.col-sm-2{flex:0 0 auto;width:16.6666666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.3333333333%}.col-sm-5{flex:0 0 auto;width:41.6666666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.3333333333%}.col-sm-8{flex:0 0 auto;width:66.6666666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.3333333333%}.col-sm-11{flex:0 0 auto;width:91.6666666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.3333333333%}.col-md-2{flex:0 0 auto;width:16.6666666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.3333333333%}.col-md-5{flex:0 0 auto;width:41.6666666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.3333333333%}.col-md-8{flex:0 0 auto;width:66.6666666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.3333333333%}.col-md-11{flex:0 0 auto;width:91.6666666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.3333333333%}.col-lg-2{flex:0 0 auto;width:16.6666666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.3333333333%}.col-lg-5{flex:0 0 auto;width:41.6666666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.3333333333%}.col-lg-8{flex:0 0 auto;width:66.6666666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.3333333333%}.col-lg-11{flex:0 0 auto;width:91.6666666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.3333333333%}.col-xl-2{flex:0 0 auto;width:16.6666666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.3333333333%}.col-xl-5{flex:0 0 auto;width:41.6666666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.3333333333%}.col-xl-8{flex:0 0 auto;width:66.6666666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.3333333333%}.col-xl-11{flex:0 0 auto;width:91.6666666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.3333333333%}.col-xxl-2{flex:0 0 auto;width:16.6666666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.3333333333%}.col-xxl-5{flex:0 0 auto;width:41.6666666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.3333333333%}.col-xxl-8{flex:0 0 auto;width:66.6666666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.3333333333%}.col-xxl-11{flex:0 0 auto;width:91.6666666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.3333333333%}.offset-xxl-2{margin-left:16.6666666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.3333333333%}.offset-xxl-5{margin-left:41.6666666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.3333333333%}.offset-xxl-8{margin-left:66.6666666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.3333333333%}.offset-xxl-11{margin-left:91.6666666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);background-image:linear-gradient(var(--bs-table-accent-bg),var(--bs-table-accent-bg));border-bottom-width:1px}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;vertical-align:middle;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#6c757d;background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;transition:background-color .15s ease-in-out,background-position .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-check-input{transition:none}}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control::-webkit-input-placeholder{color:transparent}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:1.75rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754;padding-right:calc(.75em + 2.3125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 1.75rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 1.75rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[style]{right:auto!important}.dropdown-menu-start{--bs-position:start;right:auto;left:0}.dropdown-menu-end{--bs-position:end;right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start;right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end;right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start;right:auto;left:0}.dropdown-menu-md-end{--bs-position:end;right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start;right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end;right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start;right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end;right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start;right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end;right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{align-items:center;width:100%}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-collapse{display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-collapse{display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-collapse{display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-collapse{display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-collapse{display:flex!important}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-collapse{display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;background-color:transparent;border:1px solid rgba(0,0,0,.125);border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button.collapsed{border-bottom-width:0}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item:first-of-type .accordion-button{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-width:1px;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-collapse{border-bottom-width:1px;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-collapse{border:solid rgba(0,0,0,.125);border-width:0 1px}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-button{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item:first-of-type .accordion-button{border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.accordion-flush .accordion-item:last-of-type .accordion-button.collapsed{border-bottom-width:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top],.bs-popover-top{margin-bottom:.5rem!important}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right],.bs-popover-end{margin-left:.5rem!important}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom],.bs-popover-bottom{margin-top:.5rem!important}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left],.bs-popover-start{margin-right:.5rem!important}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators li{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--aspect-ratio:100%}.ratio-4x3{--aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-0{border-width:0!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}.fs-sm-1{font-size:2.5rem!important}.fs-sm-2{font-size:2rem!important}.fs-sm-3{font-size:1.75rem!important}.fs-sm-4{font-size:1.5rem!important}.fs-md-1{font-size:2.5rem!important}.fs-md-2{font-size:2rem!important}.fs-md-3{font-size:1.75rem!important}.fs-md-4{font-size:1.5rem!important}.fs-lg-1{font-size:2.5rem!important}.fs-lg-2{font-size:2rem!important}.fs-lg-3{font-size:1.75rem!important}.fs-lg-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} /*# sourceMappingURL=bootstrap.min.css.map */ -------------------- END OF FILE -------------------- FILE: RR com/assets/css/custom.css TYPE: CSS SIZE: 17 B ------------------------------------------------------------ /* Custom Css */ -------------------- END OF FILE -------------------- FILE: RR com/assets/css/fontawesome.css TYPE: CSS SIZE: 71.9 KB ------------------------------------------------------------ /*! * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ .fa, .fas, .far, .fal, .fad, .fab { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; display: inline-block; font-style: normal; font-variant: normal; text-rendering: auto; line-height: 1; } .fa-lg { font-size: 1.33333em; line-height: 0.75em; vertical-align: -.0667em; } .fa-xs { font-size: .75em; } .fa-sm { font-size: .875em; } .fa-1x { font-size: 1em; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-6x { font-size: 6em; } .fa-7x { font-size: 7em; } .fa-8x { font-size: 8em; } .fa-9x { font-size: 9em; } .fa-10x { font-size: 10em; } .fa-fw { text-align: center; width: 1.25em; } .fa-ul { list-style-type: none; margin-left: 2.5em; padding-left: 0; } .fa-ul > li { position: relative; } .fa-li { left: -2em; position: absolute; text-align: center; width: 2em; line-height: inherit; } .fa-border { border: solid 0.08em #eee; border-radius: .1em; padding: .2em .25em .15em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left, .fas.fa-pull-left, .far.fa-pull-left, .fal.fa-pull-left, .fab.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right, .fas.fa-pull-right, .far.fa-pull-right, .fal.fa-pull-right, .fab.fa-pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } .fa-rotate-90 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; -webkit-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; -webkit-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; -webkit-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; -webkit-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(1, -1); transform: scale(1, -1); } .fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(-1, -1); transform: scale(-1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical, :root .fa-flip-both { -webkit-filter: none; filter: none; } .fa-stack { display: inline-block; height: 2em; line-height: 2em; position: relative; vertical-align: middle; width: 2.5em; } .fa-stack-1x, .fa-stack-2x { left: 0; position: absolute; text-align: center; width: 100%; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #fff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-500px:before { content: "\f26e"; } .fa-accessible-icon:before { content: "\f368"; } .fa-accusoft:before { content: "\f369"; } .fa-acquisitions-incorporated:before { content: "\f6af"; } .fa-ad:before { content: "\f641"; } .fa-address-book:before { content: "\f2b9"; } .fa-address-card:before { content: "\f2bb"; } .fa-adjust:before { content: "\f042"; } .fa-adn:before { content: "\f170"; } .fa-adversal:before { content: "\f36a"; } .fa-affiliatetheme:before { content: "\f36b"; } .fa-air-freshener:before { content: "\f5d0"; } .fa-airbnb:before { content: "\f834"; } .fa-algolia:before { content: "\f36c"; } .fa-align-center:before { content: "\f037"; } .fa-align-justify:before { content: "\f039"; } .fa-align-left:before { content: "\f036"; } .fa-align-right:before { content: "\f038"; } .fa-alipay:before { content: "\f642"; } .fa-allergies:before { content: "\f461"; } .fa-amazon:before { content: "\f270"; } .fa-amazon-pay:before { content: "\f42c"; } .fa-ambulance:before { content: "\f0f9"; } .fa-american-sign-language-interpreting:before { content: "\f2a3"; } .fa-amilia:before { content: "\f36d"; } .fa-anchor:before { content: "\f13d"; } .fa-android:before { content: "\f17b"; } .fa-angellist:before { content: "\f209"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-down:before { content: "\f107"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angry:before { content: "\f556"; } .fa-angrycreative:before { content: "\f36e"; } .fa-angular:before { content: "\f420"; } .fa-ankh:before { content: "\f644"; } .fa-app-store:before { content: "\f36f"; } .fa-app-store-ios:before { content: "\f370"; } .fa-apper:before { content: "\f371"; } .fa-apple:before { content: "\f179"; } .fa-apple-alt:before { content: "\f5d1"; } .fa-apple-pay:before { content: "\f415"; } .fa-archive:before { content: "\f187"; } .fa-archway:before { content: "\f557"; } .fa-arrow-alt-circle-down:before { content: "\f358"; } .fa-arrow-alt-circle-left:before { content: "\f359"; } .fa-arrow-alt-circle-right:before { content: "\f35a"; } .fa-arrow-alt-circle-up:before { content: "\f35b"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-down:before { content: "\f063"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-arrows-alt-h:before { content: "\f337"; } .fa-arrows-alt-v:before { content: "\f338"; } .fa-artstation:before { content: "\f77a"; } .fa-assistive-listening-systems:before { content: "\f2a2"; } .fa-asterisk:before { content: "\f069"; } .fa-asymmetrik:before { content: "\f372"; } .fa-at:before { content: "\f1fa"; } .fa-atlas:before { content: "\f558"; } .fa-atlassian:before { content: "\f77b"; } .fa-atom:before { content: "\f5d2"; } .fa-audible:before { content: "\f373"; } .fa-audio-description:before { content: "\f29e"; } .fa-autoprefixer:before { content: "\f41c"; } .fa-avianex:before { content: "\f374"; } .fa-aviato:before { content: "\f421"; } .fa-award:before { content: "\f559"; } .fa-aws:before { content: "\f375"; } .fa-baby:before { content: "\f77c"; } .fa-baby-carriage:before { content: "\f77d"; } .fa-backspace:before { content: "\f55a"; } .fa-backward:before { content: "\f04a"; } .fa-bacon:before { content: "\f7e5"; } .fa-bacteria:before { content: "\e059"; } .fa-bacterium:before { content: "\e05a"; } .fa-bahai:before { content: "\f666"; } .fa-balance-scale:before { content: "\f24e"; } .fa-balance-scale-left:before { content: "\f515"; } .fa-balance-scale-right:before { content: "\f516"; } .fa-ban:before { content: "\f05e"; } .fa-band-aid:before { content: "\f462"; } .fa-bandcamp:before { content: "\f2d5"; } .fa-barcode:before { content: "\f02a"; } .fa-bars:before { content: "\f0c9"; } .fa-baseball-ball:before { content: "\f433"; } .fa-basketball-ball:before { content: "\f434"; } .fa-bath:before { content: "\f2cd"; } .fa-battery-empty:before { content: "\f244"; } .fa-battery-full:before { content: "\f240"; } .fa-battery-half:before { content: "\f242"; } .fa-battery-quarter:before { content: "\f243"; } .fa-battery-three-quarters:before { content: "\f241"; } .fa-battle-net:before { content: "\f835"; } .fa-bed:before { content: "\f236"; } .fa-beer:before { content: "\f0fc"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-bell:before { content: "\f0f3"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bezier-curve:before { content: "\f55b"; } .fa-bible:before { content: "\f647"; } .fa-bicycle:before { content: "\f206"; } .fa-biking:before { content: "\f84a"; } .fa-bimobject:before { content: "\f378"; } .fa-binoculars:before { content: "\f1e5"; } .fa-biohazard:before { content: "\f780"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitcoin:before { content: "\f379"; } .fa-bity:before { content: "\f37a"; } .fa-black-tie:before { content: "\f27e"; } .fa-blackberry:before { content: "\f37b"; } .fa-blender:before { content: "\f517"; } .fa-blender-phone:before { content: "\f6b6"; } .fa-blind:before { content: "\f29d"; } .fa-blog:before { content: "\f781"; } .fa-blogger:before { content: "\f37c"; } .fa-blogger-b:before { content: "\f37d"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-bold:before { content: "\f032"; } .fa-bolt:before { content: "\f0e7"; } .fa-bomb:before { content: "\f1e2"; } .fa-bone:before { content: "\f5d7"; } .fa-bong:before { content: "\f55c"; } .fa-book:before { content: "\f02d"; } .fa-book-dead:before { content: "\f6b7"; } .fa-book-medical:before { content: "\f7e6"; } .fa-book-open:before { content: "\f518"; } .fa-book-reader:before { content: "\f5da"; } .fa-bookmark:before { content: "\f02e"; } .fa-bootstrap:before { content: "\f836"; } .fa-border-all:before { content: "\f84c"; } .fa-border-none:before { content: "\f850"; } .fa-border-style:before { content: "\f853"; } .fa-bowling-ball:before { content: "\f436"; } .fa-box:before { content: "\f466"; } .fa-box-open:before { content: "\f49e"; } .fa-box-tissue:before { content: "\e05b"; } .fa-boxes:before { content: "\f468"; } .fa-braille:before { content: "\f2a1"; } .fa-brain:before { content: "\f5dc"; } .fa-bread-slice:before { content: "\f7ec"; } .fa-briefcase:before { content: "\f0b1"; } .fa-briefcase-medical:before { content: "\f469"; } .fa-broadcast-tower:before { content: "\f519"; } .fa-broom:before { content: "\f51a"; } .fa-brush:before { content: "\f55d"; } .fa-btc:before { content: "\f15a"; } .fa-buffer:before { content: "\f837"; } .fa-bug:before { content: "\f188"; } .fa-building:before { content: "\f1ad"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bullseye:before { content: "\f140"; } .fa-burn:before { content: "\f46a"; } .fa-buromobelexperte:before { content: "\f37f"; } .fa-bus:before { content: "\f207"; } .fa-bus-alt:before { content: "\f55e"; } .fa-business-time:before { content: "\f64a"; } .fa-buy-n-large:before { content: "\f8a6"; } .fa-buysellads:before { content: "\f20d"; } .fa-calculator:before { content: "\f1ec"; } .fa-calendar:before { content: "\f133"; } .fa-calendar-alt:before { content: "\f073"; } .fa-calendar-check:before { content: "\f274"; } .fa-calendar-day:before { content: "\f783"; } .fa-calendar-minus:before { content: "\f272"; } .fa-calendar-plus:before { content: "\f271"; } .fa-calendar-times:before { content: "\f273"; } .fa-calendar-week:before { content: "\f784"; } .fa-camera:before { content: "\f030"; } .fa-camera-retro:before { content: "\f083"; } .fa-campground:before { content: "\f6bb"; } .fa-canadian-maple-leaf:before { content: "\f785"; } .fa-candy-cane:before { content: "\f786"; } .fa-cannabis:before { content: "\f55f"; } .fa-capsules:before { content: "\f46b"; } .fa-car:before { content: "\f1b9"; } .fa-car-alt:before { content: "\f5de"; } .fa-car-battery:before { content: "\f5df"; } .fa-car-crash:before { content: "\f5e1"; } .fa-car-side:before { content: "\f5e4"; } .fa-caravan:before { content: "\f8ff"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-caret-square-down:before { content: "\f150"; } .fa-caret-square-left:before { content: "\f191"; } .fa-caret-square-right:before { content: "\f152"; } .fa-caret-square-up:before { content: "\f151"; } .fa-caret-up:before { content: "\f0d8"; } .fa-carrot:before { content: "\f787"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-cart-plus:before { content: "\f217"; } .fa-cash-register:before { content: "\f788"; } .fa-cat:before { content: "\f6be"; } .fa-cc-amazon-pay:before { content: "\f42d"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-apple-pay:before { content: "\f416"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-centercode:before { content: "\f380"; } .fa-centos:before { content: "\f789"; } .fa-certificate:before { content: "\f0a3"; } .fa-chair:before { content: "\f6c0"; } .fa-chalkboard:before { content: "\f51b"; } .fa-chalkboard-teacher:before { content: "\f51c"; } .fa-charging-station:before { content: "\f5e7"; } .fa-chart-area:before { content: "\f1fe"; } .fa-chart-bar:before { content: "\f080"; } .fa-chart-line:before { content: "\f201"; } .fa-chart-pie:before { content: "\f200"; } .fa-check:before { content: "\f00c"; } .fa-check-circle:before { content: "\f058"; } .fa-check-double:before { content: "\f560"; } .fa-check-square:before { content: "\f14a"; } .fa-cheese:before { content: "\f7ef"; } .fa-chess:before { content: "\f439"; } .fa-chess-bishop:before { content: "\f43a"; } .fa-chess-board:before { content: "\f43c"; } .fa-chess-king:before { content: "\f43f"; } .fa-chess-knight:before { content: "\f441"; } .fa-chess-pawn:before { content: "\f443"; } .fa-chess-queen:before { content: "\f445"; } .fa-chess-rook:before { content: "\f447"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-down:before { content: "\f078"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-chevron-up:before { content: "\f077"; } .fa-child:before { content: "\f1ae"; } .fa-chrome:before { content: "\f268"; } .fa-chromecast:before { content: "\f838"; } .fa-church:before { content: "\f51d"; } .fa-circle:before { content: "\f111"; } .fa-circle-notch:before { content: "\f1ce"; } .fa-city:before { content: "\f64f"; } .fa-clinic-medical:before { content: "\f7f2"; } .fa-clipboard:before { content: "\f328"; } .fa-clipboard-check:before { content: "\f46c"; } .fa-clipboard-list:before { content: "\f46d"; } .fa-clock:before { content: "\f017"; } .fa-clone:before { content: "\f24d"; } .fa-closed-captioning:before { content: "\f20a"; } .fa-cloud:before { content: "\f0c2"; } .fa-cloud-download-alt:before { content: "\f381"; } .fa-cloud-meatball:before { content: "\f73b"; } .fa-cloud-moon:before { content: "\f6c3"; } .fa-cloud-moon-rain:before { content: "\f73c"; } .fa-cloud-rain:before { content: "\f73d"; } .fa-cloud-showers-heavy:before { content: "\f740"; } .fa-cloud-sun:before { content: "\f6c4"; } .fa-cloud-sun-rain:before { content: "\f743"; } .fa-cloud-upload-alt:before { content: "\f382"; } .fa-cloudflare:before { content: "\e07d"; } .fa-cloudscale:before { content: "\f383"; } .fa-cloudsmith:before { content: "\f384"; } .fa-cloudversify:before { content: "\f385"; } .fa-cocktail:before { content: "\f561"; } .fa-code:before { content: "\f121"; } .fa-code-branch:before { content: "\f126"; } .fa-codepen:before { content: "\f1cb"; } .fa-codiepie:before { content: "\f284"; } .fa-coffee:before { content: "\f0f4"; } .fa-cog:before { content: "\f013"; } .fa-cogs:before { content: "\f085"; } .fa-coins:before { content: "\f51e"; } .fa-columns:before { content: "\f0db"; } .fa-comment:before { content: "\f075"; } .fa-comment-alt:before { content: "\f27a"; } .fa-comment-dollar:before { content: "\f651"; } .fa-comment-dots:before { content: "\f4ad"; } .fa-comment-medical:before { content: "\f7f5"; } .fa-comment-slash:before { content: "\f4b3"; } .fa-comments:before { content: "\f086"; } .fa-comments-dollar:before { content: "\f653"; } .fa-compact-disc:before { content: "\f51f"; } .fa-compass:before { content: "\f14e"; } .fa-compress:before { content: "\f066"; } .fa-compress-alt:before { content: "\f422"; } .fa-compress-arrows-alt:before { content: "\f78c"; } .fa-concierge-bell:before { content: "\f562"; } .fa-confluence:before { content: "\f78d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-contao:before { content: "\f26d"; } .fa-cookie:before { content: "\f563"; } .fa-cookie-bite:before { content: "\f564"; } .fa-copy:before { content: "\f0c5"; } .fa-copyright:before { content: "\f1f9"; } .fa-cotton-bureau:before { content: "\f89e"; } .fa-couch:before { content: "\f4b8"; } .fa-cpanel:before { content: "\f388"; } .fa-creative-commons:before { content: "\f25e"; } .fa-creative-commons-by:before { content: "\f4e7"; } .fa-creative-commons-nc:before { content: "\f4e8"; } .fa-creative-commons-nc-eu:before { content: "\f4e9"; } .fa-creative-commons-nc-jp:before { content: "\f4ea"; } .fa-creative-commons-nd:before { content: "\f4eb"; } .fa-creative-commons-pd:before { content: "\f4ec"; } .fa-creative-commons-pd-alt:before { content: "\f4ed"; } .fa-creative-commons-remix:before { content: "\f4ee"; } .fa-creative-commons-sa:before { content: "\f4ef"; } .fa-creative-commons-sampling:before { content: "\f4f0"; } .fa-creative-commons-sampling-plus:before { content: "\f4f1"; } .fa-creative-commons-share:before { content: "\f4f2"; } .fa-creative-commons-zero:before { content: "\f4f3"; } .fa-credit-card:before { content: "\f09d"; } .fa-critical-role:before { content: "\f6c9"; } .fa-crop:before { content: "\f125"; } .fa-crop-alt:before { content: "\f565"; } .fa-cross:before { content: "\f654"; } .fa-crosshairs:before { content: "\f05b"; } .fa-crow:before { content: "\f520"; } .fa-crown:before { content: "\f521"; } .fa-crutch:before { content: "\f7f7"; } .fa-css3:before { content: "\f13c"; } .fa-css3-alt:before { content: "\f38b"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-cut:before { content: "\f0c4"; } .fa-cuttlefish:before { content: "\f38c"; } .fa-d-and-d:before { content: "\f38d"; } .fa-d-and-d-beyond:before { content: "\f6ca"; } .fa-dailymotion:before { content: "\e052"; } .fa-dashcube:before { content: "\f210"; } .fa-database:before { content: "\f1c0"; } .fa-deaf:before { content: "\f2a4"; } .fa-deezer:before { content: "\e077"; } .fa-delicious:before { content: "\f1a5"; } .fa-democrat:before { content: "\f747"; } .fa-deploydog:before { content: "\f38e"; } .fa-deskpro:before { content: "\f38f"; } .fa-desktop:before { content: "\f108"; } .fa-dev:before { content: "\f6cc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-dharmachakra:before { content: "\f655"; } .fa-dhl:before { content: "\f790"; } .fa-diagnoses:before { content: "\f470"; } .fa-diaspora:before { content: "\f791"; } .fa-dice:before { content: "\f522"; } .fa-dice-d20:before { content: "\f6cf"; } .fa-dice-d6:before { content: "\f6d1"; } .fa-dice-five:before { content: "\f523"; } .fa-dice-four:before { content: "\f524"; } .fa-dice-one:before { content: "\f525"; } .fa-dice-six:before { content: "\f526"; } .fa-dice-three:before { content: "\f527"; } .fa-dice-two:before { content: "\f528"; } .fa-digg:before { content: "\f1a6"; } .fa-digital-ocean:before { content: "\f391"; } .fa-digital-tachograph:before { content: "\f566"; } .fa-directions:before { content: "\f5eb"; } .fa-discord:before { content: "\f392"; } .fa-discourse:before { content: "\f393"; } .fa-disease:before { content: "\f7fa"; } .fa-divide:before { content: "\f529"; } .fa-dizzy:before { content: "\f567"; } .fa-dna:before { content: "\f471"; } .fa-dochub:before { content: "\f394"; } .fa-docker:before { content: "\f395"; } .fa-dog:before { content: "\f6d3"; } .fa-dollar-sign:before { content: "\f155"; } .fa-dolly:before { content: "\f472"; } .fa-dolly-flatbed:before { content: "\f474"; } .fa-donate:before { content: "\f4b9"; } .fa-door-closed:before { content: "\f52a"; } .fa-door-open:before { content: "\f52b"; } .fa-dot-circle:before { content: "\f192"; } .fa-dove:before { content: "\f4ba"; } .fa-download:before { content: "\f019"; } .fa-draft2digital:before { content: "\f396"; } .fa-drafting-compass:before { content: "\f568"; } .fa-dragon:before { content: "\f6d5"; } .fa-draw-polygon:before { content: "\f5ee"; } .fa-dribbble:before { content: "\f17d"; } .fa-dribbble-square:before { content: "\f397"; } .fa-dropbox:before { content: "\f16b"; } .fa-drum:before { content: "\f569"; } .fa-drum-steelpan:before { content: "\f56a"; } .fa-drumstick-bite:before { content: "\f6d7"; } .fa-drupal:before { content: "\f1a9"; } .fa-dumbbell:before { content: "\f44b"; } .fa-dumpster:before { content: "\f793"; } .fa-dumpster-fire:before { content: "\f794"; } .fa-dungeon:before { content: "\f6d9"; } .fa-dyalog:before { content: "\f399"; } .fa-earlybirds:before { content: "\f39a"; } .fa-ebay:before { content: "\f4f4"; } .fa-edge:before { content: "\f282"; } .fa-edge-legacy:before { content: "\e078"; } .fa-edit:before { content: "\f044"; } .fa-egg:before { content: "\f7fb"; } .fa-eject:before { content: "\f052"; } .fa-elementor:before { content: "\f430"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-ello:before { content: "\f5f1"; } .fa-ember:before { content: "\f423"; } .fa-empire:before { content: "\f1d1"; } .fa-envelope:before { content: "\f0e0"; } .fa-envelope-open:before { content: "\f2b6"; } .fa-envelope-open-text:before { content: "\f658"; } .fa-envelope-square:before { content: "\f199"; } .fa-envira:before { content: "\f299"; } .fa-equals:before { content: "\f52c"; } .fa-eraser:before { content: "\f12d"; } .fa-erlang:before { content: "\f39d"; } .fa-ethereum:before { content: "\f42e"; } .fa-ethernet:before { content: "\f796"; } .fa-etsy:before { content: "\f2d7"; } .fa-euro-sign:before { content: "\f153"; } .fa-evernote:before { content: "\f839"; } .fa-exchange-alt:before { content: "\f362"; } .fa-exclamation:before { content: "\f12a"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-exclamation-triangle:before { content: "\f071"; } .fa-expand:before { content: "\f065"; } .fa-expand-alt:before { content: "\f424"; } .fa-expand-arrows-alt:before { content: "\f31e"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-external-link-alt:before { content: "\f35d"; } .fa-external-link-square-alt:before { content: "\f360"; } .fa-eye:before { content: "\f06e"; } .fa-eye-dropper:before { content: "\f1fb"; } .fa-eye-slash:before { content: "\f070"; } .fa-facebook:before { content: "\f09a"; } .fa-facebook-f:before { content: "\f39e"; } .fa-facebook-messenger:before { content: "\f39f"; } .fa-facebook-square:before { content: "\f082"; } .fa-fan:before { content: "\f863"; } .fa-fantasy-flight-games:before { content: "\f6dc"; } .fa-fast-backward:before { content: "\f049"; } .fa-fast-forward:before { content: "\f050"; } .fa-faucet:before { content: "\e005"; } .fa-fax:before { content: "\f1ac"; } .fa-feather:before { content: "\f52d"; } .fa-feather-alt:before { content: "\f56b"; } .fa-fedex:before { content: "\f797"; } .fa-fedora:before { content: "\f798"; } .fa-female:before { content: "\f182"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-figma:before { content: "\f799"; } .fa-file:before { content: "\f15b"; } .fa-file-alt:before { content: "\f15c"; } .fa-file-archive:before { content: "\f1c6"; } .fa-file-audio:before { content: "\f1c7"; } .fa-file-code:before { content: "\f1c9"; } .fa-file-contract:before { content: "\f56c"; } .fa-file-csv:before { content: "\f6dd"; } .fa-file-download:before { content: "\f56d"; } .fa-file-excel:before { content: "\f1c3"; } .fa-file-export:before { content: "\f56e"; } .fa-file-image:before { content: "\f1c5"; } .fa-file-import:before { content: "\f56f"; } .fa-file-invoice:before { content: "\f570"; } .fa-file-invoice-dollar:before { content: "\f571"; } .fa-file-medical:before { content: "\f477"; } .fa-file-medical-alt:before { content: "\f478"; } .fa-file-pdf:before { content: "\f1c1"; } .fa-file-powerpoint:before { content: "\f1c4"; } .fa-file-prescription:before { content: "\f572"; } .fa-file-signature:before { content: "\f573"; } .fa-file-upload:before { content: "\f574"; } .fa-file-video:before { content: "\f1c8"; } .fa-file-word:before { content: "\f1c2"; } .fa-fill:before { content: "\f575"; } .fa-fill-drip:before { content: "\f576"; } .fa-film:before { content: "\f008"; } .fa-filter:before { content: "\f0b0"; } .fa-fingerprint:before { content: "\f577"; } .fa-fire:before { content: "\f06d"; } .fa-fire-alt:before { content: "\f7e4"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-firefox:before { content: "\f269"; } .fa-firefox-browser:before { content: "\e007"; } .fa-first-aid:before { content: "\f479"; } .fa-first-order:before { content: "\f2b0"; } .fa-first-order-alt:before { content: "\f50a"; } .fa-firstdraft:before { content: "\f3a1"; } .fa-fish:before { content: "\f578"; } .fa-fist-raised:before { content: "\f6de"; } .fa-flag:before { content: "\f024"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-flag-usa:before { content: "\f74d"; } .fa-flask:before { content: "\f0c3"; } .fa-flickr:before { content: "\f16e"; } .fa-flipboard:before { content: "\f44d"; } .fa-flushed:before { content: "\f579"; } .fa-fly:before { content: "\f417"; } .fa-folder:before { content: "\f07b"; } .fa-folder-minus:before { content: "\f65d"; } .fa-folder-open:before { content: "\f07c"; } .fa-folder-plus:before { content: "\f65e"; } .fa-font:before { content: "\f031"; } .fa-font-awesome:before { content: "\f2b4"; } .fa-font-awesome-alt:before { content: "\f35c"; } .fa-font-awesome-flag:before { content: "\f425"; } .fa-font-awesome-logo-full:before { content: "\f4e6"; } .fa-fonticons:before { content: "\f280"; } .fa-fonticons-fi:before { content: "\f3a2"; } .fa-football-ball:before { content: "\f44e"; } .fa-fort-awesome:before { content: "\f286"; } .fa-fort-awesome-alt:before { content: "\f3a3"; } .fa-forumbee:before { content: "\f211"; } .fa-forward:before { content: "\f04e"; } .fa-foursquare:before { content: "\f180"; } .fa-free-code-camp:before { content: "\f2c5"; } .fa-freebsd:before { content: "\f3a4"; } .fa-frog:before { content: "\f52e"; } .fa-frown:before { content: "\f119"; } .fa-frown-open:before { content: "\f57a"; } .fa-fulcrum:before { content: "\f50b"; } .fa-funnel-dollar:before { content: "\f662"; } .fa-futbol:before { content: "\f1e3"; } .fa-galactic-republic:before { content: "\f50c"; } .fa-galactic-senate:before { content: "\f50d"; } .fa-gamepad:before { content: "\f11b"; } .fa-gas-pump:before { content: "\f52f"; } .fa-gavel:before { content: "\f0e3"; } .fa-gem:before { content: "\f3a5"; } .fa-genderless:before { content: "\f22d"; } .fa-get-pocket:before { content: "\f265"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-ghost:before { content: "\f6e2"; } .fa-gift:before { content: "\f06b"; } .fa-gifts:before { content: "\f79c"; } .fa-git:before { content: "\f1d3"; } .fa-git-alt:before { content: "\f841"; } .fa-git-square:before { content: "\f1d2"; } .fa-github:before { content: "\f09b"; } .fa-github-alt:before { content: "\f113"; } .fa-github-square:before { content: "\f092"; } .fa-gitkraken:before { content: "\f3a6"; } .fa-gitlab:before { content: "\f296"; } .fa-gitter:before { content: "\f426"; } .fa-glass-cheers:before { content: "\f79f"; } .fa-glass-martini:before { content: "\f000"; } .fa-glass-martini-alt:before { content: "\f57b"; } .fa-glass-whiskey:before { content: "\f7a0"; } .fa-glasses:before { content: "\f530"; } .fa-glide:before { content: "\f2a5"; } .fa-glide-g:before { content: "\f2a6"; } .fa-globe:before { content: "\f0ac"; } .fa-globe-africa:before { content: "\f57c"; } .fa-globe-americas:before { content: "\f57d"; } .fa-globe-asia:before { content: "\f57e"; } .fa-globe-europe:before { content: "\f7a2"; } .fa-gofore:before { content: "\f3a7"; } .fa-golf-ball:before { content: "\f450"; } .fa-goodreads:before { content: "\f3a8"; } .fa-goodreads-g:before { content: "\f3a9"; } .fa-google:before { content: "\f1a0"; } .fa-google-drive:before { content: "\f3aa"; } .fa-google-pay:before { content: "\e079"; } .fa-google-play:before { content: "\f3ab"; } .fa-google-plus:before { content: "\f2b3"; } .fa-google-plus-g:before { content: "\f0d5"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-gopuram:before { content: "\f664"; } .fa-graduation-cap:before { content: "\f19d"; } .fa-gratipay:before { content: "\f184"; } .fa-grav:before { content: "\f2d6"; } .fa-greater-than:before { content: "\f531"; } .fa-greater-than-equal:before { content: "\f532"; } .fa-grimace:before { content: "\f57f"; } .fa-grin:before { content: "\f580"; } .fa-grin-alt:before { content: "\f581"; } .fa-grin-beam:before { content: "\f582"; } .fa-grin-beam-sweat:before { content: "\f583"; } .fa-grin-hearts:before { content: "\f584"; } .fa-grin-squint:before { content: "\f585"; } .fa-grin-squint-tears:before { content: "\f586"; } .fa-grin-stars:before { content: "\f587"; } .fa-grin-tears:before { content: "\f588"; } .fa-grin-tongue:before { content: "\f589"; } .fa-grin-tongue-squint:before { content: "\f58a"; } .fa-grin-tongue-wink:before { content: "\f58b"; } .fa-grin-wink:before { content: "\f58c"; } .fa-grip-horizontal:before { content: "\f58d"; } .fa-grip-lines:before { content: "\f7a4"; } .fa-grip-lines-vertical:before { content: "\f7a5"; } .fa-grip-vertical:before { content: "\f58e"; } .fa-gripfire:before { content: "\f3ac"; } .fa-grunt:before { content: "\f3ad"; } .fa-guilded:before { content: "\e07e"; } .fa-guitar:before { content: "\f7a6"; } .fa-gulp:before { content: "\f3ae"; } .fa-h-square:before { content: "\f0fd"; } .fa-hacker-news:before { content: "\f1d4"; } .fa-hacker-news-square:before { content: "\f3af"; } .fa-hackerrank:before { content: "\f5f7"; } .fa-hamburger:before { content: "\f805"; } .fa-hammer:before { content: "\f6e3"; } .fa-hamsa:before { content: "\f665"; } .fa-hand-holding:before { content: "\f4bd"; } .fa-hand-holding-heart:before { content: "\f4be"; } .fa-hand-holding-medical:before { content: "\e05c"; } .fa-hand-holding-usd:before { content: "\f4c0"; } .fa-hand-holding-water:before { content: "\f4c1"; } .fa-hand-lizard:before { content: "\f258"; } .fa-hand-middle-finger:before { content: "\f806"; } .fa-hand-paper:before { content: "\f256"; } .fa-hand-peace:before { content: "\f25b"; } .fa-hand-point-down:before { content: "\f0a7"; } .fa-hand-point-left:before { content: "\f0a5"; } .fa-hand-point-right:before { content: "\f0a4"; } .fa-hand-point-up:before { content: "\f0a6"; } .fa-hand-pointer:before { content: "\f25a"; } .fa-hand-rock:before { content: "\f255"; } .fa-hand-scissors:before { content: "\f257"; } .fa-hand-sparkles:before { content: "\e05d"; } .fa-hand-spock:before { content: "\f259"; } .fa-hands:before { content: "\f4c2"; } .fa-hands-helping:before { content: "\f4c4"; } .fa-hands-wash:before { content: "\e05e"; } .fa-handshake:before { content: "\f2b5"; } .fa-handshake-alt-slash:before { content: "\e05f"; } .fa-handshake-slash:before { content: "\e060"; } .fa-hanukiah:before { content: "\f6e6"; } .fa-hard-hat:before { content: "\f807"; } .fa-hashtag:before { content: "\f292"; } .fa-hat-cowboy:before { content: "\f8c0"; } .fa-hat-cowboy-side:before { content: "\f8c1"; } .fa-hat-wizard:before { content: "\f6e8"; } .fa-hdd:before { content: "\f0a0"; } .fa-head-side-cough:before { content: "\e061"; } .fa-head-side-cough-slash:before { content: "\e062"; } .fa-head-side-mask:before { content: "\e063"; } .fa-head-side-virus:before { content: "\e064"; } .fa-heading:before { content: "\f1dc"; } .fa-headphones:before { content: "\f025"; } .fa-headphones-alt:before { content: "\f58f"; } .fa-headset:before { content: "\f590"; } .fa-heart:before { content: "\f004"; } .fa-heart-broken:before { content: "\f7a9"; } .fa-heartbeat:before { content: "\f21e"; } .fa-helicopter:before { content: "\f533"; } .fa-highlighter:before { content: "\f591"; } .fa-hiking:before { content: "\f6ec"; } .fa-hippo:before { content: "\f6ed"; } .fa-hips:before { content: "\f452"; } .fa-hire-a-helper:before { content: "\f3b0"; } .fa-history:before { content: "\f1da"; } .fa-hive:before { content: "\e07f"; } .fa-hockey-puck:before { content: "\f453"; } .fa-holly-berry:before { content: "\f7aa"; } .fa-home:before { content: "\f015"; } .fa-hooli:before { content: "\f427"; } .fa-hornbill:before { content: "\f592"; } .fa-horse:before { content: "\f6f0"; } .fa-horse-head:before { content: "\f7ab"; } .fa-hospital:before { content: "\f0f8"; } .fa-hospital-alt:before { content: "\f47d"; } .fa-hospital-symbol:before { content: "\f47e"; } .fa-hospital-user:before { content: "\f80d"; } .fa-hot-tub:before { content: "\f593"; } .fa-hotdog:before { content: "\f80f"; } .fa-hotel:before { content: "\f594"; } .fa-hotjar:before { content: "\f3b1"; } .fa-hourglass:before { content: "\f254"; } .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-start:before { content: "\f251"; } .fa-house-damage:before { content: "\f6f1"; } .fa-house-user:before { content: "\e065"; } .fa-houzz:before { content: "\f27c"; } .fa-hryvnia:before { content: "\f6f2"; } .fa-html5:before { content: "\f13b"; } .fa-hubspot:before { content: "\f3b2"; } .fa-i-cursor:before { content: "\f246"; } .fa-ice-cream:before { content: "\f810"; } .fa-icicles:before { content: "\f7ad"; } .fa-icons:before { content: "\f86d"; } .fa-id-badge:before { content: "\f2c1"; } .fa-id-card:before { content: "\f2c2"; } .fa-id-card-alt:before { content: "\f47f"; } .fa-ideal:before { content: "\e013"; } .fa-igloo:before { content: "\f7ae"; } .fa-image:before { content: "\f03e"; } .fa-images:before { content: "\f302"; } .fa-imdb:before { content: "\f2d8"; } .fa-inbox:before { content: "\f01c"; } .fa-indent:before { content: "\f03c"; } .fa-industry:before { content: "\f275"; } .fa-infinity:before { content: "\f534"; } .fa-info:before { content: "\f129"; } .fa-info-circle:before { content: "\f05a"; } .fa-innosoft:before { content: "\e080"; } .fa-instagram:before { content: "\f16d"; } .fa-instagram-square:before { content: "\e055"; } .fa-instalod:before { content: "\e081"; } .fa-intercom:before { content: "\f7af"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-invision:before { content: "\f7b0"; } .fa-ioxhost:before { content: "\f208"; } .fa-italic:before { content: "\f033"; } .fa-itch-io:before { content: "\f83a"; } .fa-itunes:before { content: "\f3b4"; } .fa-itunes-note:before { content: "\f3b5"; } .fa-java:before { content: "\f4e4"; } .fa-jedi:before { content: "\f669"; } .fa-jedi-order:before { content: "\f50e"; } .fa-jenkins:before { content: "\f3b6"; } .fa-jira:before { content: "\f7b1"; } .fa-joget:before { content: "\f3b7"; } .fa-joint:before { content: "\f595"; } .fa-joomla:before { content: "\f1aa"; } .fa-journal-whills:before { content: "\f66a"; } .fa-js:before { content: "\f3b8"; } .fa-js-square:before { content: "\f3b9"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-kaaba:before { content: "\f66b"; } .fa-kaggle:before { content: "\f5fa"; } .fa-key:before { content: "\f084"; } .fa-keybase:before { content: "\f4f5"; } .fa-keyboard:before { content: "\f11c"; } .fa-keycdn:before { content: "\f3ba"; } .fa-khanda:before { content: "\f66d"; } .fa-kickstarter:before { content: "\f3bb"; } .fa-kickstarter-k:before { content: "\f3bc"; } .fa-kiss:before { content: "\f596"; } .fa-kiss-beam:before { content: "\f597"; } .fa-kiss-wink-heart:before { content: "\f598"; } .fa-kiwi-bird:before { content: "\f535"; } .fa-korvue:before { content: "\f42f"; } .fa-landmark:before { content: "\f66f"; } .fa-language:before { content: "\f1ab"; } .fa-laptop:before { content: "\f109"; } .fa-laptop-code:before { content: "\f5fc"; } .fa-laptop-house:before { content: "\e066"; } .fa-laptop-medical:before { content: "\f812"; } .fa-laravel:before { content: "\f3bd"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-laugh:before { content: "\f599"; } .fa-laugh-beam:before { content: "\f59a"; } .fa-laugh-squint:before { content: "\f59b"; } .fa-laugh-wink:before { content: "\f59c"; } .fa-layer-group:before { content: "\f5fd"; } .fa-leaf:before { content: "\f06c"; } .fa-leanpub:before { content: "\f212"; } .fa-lemon:before { content: "\f094"; } .fa-less:before { content: "\f41d"; } .fa-less-than:before { content: "\f536"; } .fa-less-than-equal:before { content: "\f537"; } .fa-level-down-alt:before { content: "\f3be"; } .fa-level-up-alt:before { content: "\f3bf"; } .fa-life-ring:before { content: "\f1cd"; } .fa-lightbulb:before { content: "\f0eb"; } .fa-line:before { content: "\f3c0"; } .fa-link:before { content: "\f0c1"; } .fa-linkedin:before { content: "\f08c"; } .fa-linkedin-in:before { content: "\f0e1"; } .fa-linode:before { content: "\f2b8"; } .fa-linux:before { content: "\f17c"; } .fa-lira-sign:before { content: "\f195"; } .fa-list:before { content: "\f03a"; } .fa-list-alt:before { content: "\f022"; } .fa-list-ol:before { content: "\f0cb"; } .fa-list-ul:before { content: "\f0ca"; } .fa-location-arrow:before { content: "\f124"; } .fa-lock:before { content: "\f023"; } .fa-lock-open:before { content: "\f3c1"; } .fa-long-arrow-alt-down:before { content: "\f309"; } .fa-long-arrow-alt-left:before { content: "\f30a"; } .fa-long-arrow-alt-right:before { content: "\f30b"; } .fa-long-arrow-alt-up:before { content: "\f30c"; } .fa-low-vision:before { content: "\f2a8"; } .fa-luggage-cart:before { content: "\f59d"; } .fa-lungs:before { content: "\f604"; } .fa-lungs-virus:before { content: "\e067"; } .fa-lyft:before { content: "\f3c3"; } .fa-magento:before { content: "\f3c4"; } .fa-magic:before { content: "\f0d0"; } .fa-magnet:before { content: "\f076"; } .fa-mail-bulk:before { content: "\f674"; } .fa-mailchimp:before { content: "\f59e"; } .fa-male:before { content: "\f183"; } .fa-mandalorian:before { content: "\f50f"; } .fa-map:before { content: "\f279"; } .fa-map-marked:before { content: "\f59f"; } .fa-map-marked-alt:before { content: "\f5a0"; } .fa-map-marker:before { content: "\f041"; } .fa-map-marker-alt:before { content: "\f3c5"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-markdown:before { content: "\f60f"; } .fa-marker:before { content: "\f5a1"; } .fa-mars:before { content: "\f222"; } .fa-mars-double:before { content: "\f227"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mask:before { content: "\f6fa"; } .fa-mastodon:before { content: "\f4f6"; } .fa-maxcdn:before { content: "\f136"; } .fa-mdb:before { content: "\f8ca"; } .fa-medal:before { content: "\f5a2"; } .fa-medapps:before { content: "\f3c6"; } .fa-medium:before { content: "\f23a"; } .fa-medium-m:before { content: "\f3c7"; } .fa-medkit:before { content: "\f0fa"; } .fa-medrt:before { content: "\f3c8"; } .fa-meetup:before { content: "\f2e0"; } .fa-megaport:before { content: "\f5a3"; } .fa-meh:before { content: "\f11a"; } .fa-meh-blank:before { content: "\f5a4"; } .fa-meh-rolling-eyes:before { content: "\f5a5"; } .fa-memory:before { content: "\f538"; } .fa-mendeley:before { content: "\f7b3"; } .fa-menorah:before { content: "\f676"; } .fa-mercury:before { content: "\f223"; } .fa-meteor:before { content: "\f753"; } .fa-microblog:before { content: "\e01a"; } .fa-microchip:before { content: "\f2db"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-alt:before { content: "\f3c9"; } .fa-microphone-alt-slash:before { content: "\f539"; } .fa-microphone-slash:before { content: "\f131"; } .fa-microscope:before { content: "\f610"; } .fa-microsoft:before { content: "\f3ca"; } .fa-minus:before { content: "\f068"; } .fa-minus-circle:before { content: "\f056"; } .fa-minus-square:before { content: "\f146"; } .fa-mitten:before { content: "\f7b5"; } .fa-mix:before { content: "\f3cb"; } .fa-mixcloud:before { content: "\f289"; } .fa-mixer:before { content: "\e056"; } .fa-mizuni:before { content: "\f3cc"; } .fa-mobile:before { content: "\f10b"; } .fa-mobile-alt:before { content: "\f3cd"; } .fa-modx:before { content: "\f285"; } .fa-monero:before { content: "\f3d0"; } .fa-money-bill:before { content: "\f0d6"; } .fa-money-bill-alt:before { content: "\f3d1"; } .fa-money-bill-wave:before { content: "\f53a"; } .fa-money-bill-wave-alt:before { content: "\f53b"; } .fa-money-check:before { content: "\f53c"; } .fa-money-check-alt:before { content: "\f53d"; } .fa-monument:before { content: "\f5a6"; } .fa-moon:before { content: "\f186"; } .fa-mortar-pestle:before { content: "\f5a7"; } .fa-mosque:before { content: "\f678"; } .fa-motorcycle:before { content: "\f21c"; } .fa-mountain:before { content: "\f6fc"; } .fa-mouse:before { content: "\f8cc"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-mug-hot:before { content: "\f7b6"; } .fa-music:before { content: "\f001"; } .fa-napster:before { content: "\f3d2"; } .fa-neos:before { content: "\f612"; } .fa-network-wired:before { content: "\f6ff"; } .fa-neuter:before { content: "\f22c"; } .fa-newspaper:before { content: "\f1ea"; } .fa-nimblr:before { content: "\f5a8"; } .fa-node:before { content: "\f419"; } .fa-node-js:before { content: "\f3d3"; } .fa-not-equal:before { content: "\f53e"; } .fa-notes-medical:before { content: "\f481"; } .fa-npm:before { content: "\f3d4"; } .fa-ns8:before { content: "\f3d5"; } .fa-nutritionix:before { content: "\f3d6"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-octopus-deploy:before { content: "\e082"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-oil-can:before { content: "\f613"; } .fa-old-republic:before { content: "\f510"; } .fa-om:before { content: "\f679"; } .fa-opencart:before { content: "\f23d"; } .fa-openid:before { content: "\f19b"; } .fa-opera:before { content: "\f26a"; } .fa-optin-monster:before { content: "\f23c"; } .fa-orcid:before { content: "\f8d2"; } .fa-osi:before { content: "\f41a"; } .fa-otter:before { content: "\f700"; } .fa-outdent:before { content: "\f03b"; } .fa-page4:before { content: "\f3d7"; } .fa-pagelines:before { content: "\f18c"; } .fa-pager:before { content: "\f815"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-paint-roller:before { content: "\f5aa"; } .fa-palette:before { content: "\f53f"; } .fa-palfed:before { content: "\f3d8"; } .fa-pallet:before { content: "\f482"; } .fa-paper-plane:before { content: "\f1d8"; } .fa-paperclip:before { content: "\f0c6"; } .fa-parachute-box:before { content: "\f4cd"; } .fa-paragraph:before { content: "\f1dd"; } .fa-parking:before { content: "\f540"; } .fa-passport:before { content: "\f5ab"; } .fa-pastafarianism:before { content: "\f67b"; } .fa-paste:before { content: "\f0ea"; } .fa-patreon:before { content: "\f3d9"; } .fa-pause:before { content: "\f04c"; } .fa-pause-circle:before { content: "\f28b"; } .fa-paw:before { content: "\f1b0"; } .fa-paypal:before { content: "\f1ed"; } .fa-peace:before { content: "\f67c"; } .fa-pen:before { content: "\f304"; } .fa-pen-alt:before { content: "\f305"; } .fa-pen-fancy:before { content: "\f5ac"; } .fa-pen-nib:before { content: "\f5ad"; } .fa-pen-square:before { content: "\f14b"; } .fa-pencil-alt:before { content: "\f303"; } .fa-pencil-ruler:before { content: "\f5ae"; } .fa-penny-arcade:before { content: "\f704"; } .fa-people-arrows:before { content: "\e068"; } .fa-people-carry:before { content: "\f4ce"; } .fa-pepper-hot:before { content: "\f816"; } .fa-perbyte:before { content: "\e083"; } .fa-percent:before { content: "\f295"; } .fa-percentage:before { content: "\f541"; } .fa-periscope:before { content: "\f3da"; } .fa-person-booth:before { content: "\f756"; } .fa-phabricator:before { content: "\f3db"; } .fa-phoenix-framework:before { content: "\f3dc"; } .fa-phoenix-squadron:before { content: "\f511"; } .fa-phone:before { content: "\f095"; } .fa-phone-alt:before { content: "\f879"; } .fa-phone-slash:before { content: "\f3dd"; } .fa-phone-square:before { content: "\f098"; } .fa-phone-square-alt:before { content: "\f87b"; } .fa-phone-volume:before { content: "\f2a0"; } .fa-photo-video:before { content: "\f87c"; } .fa-php:before { content: "\f457"; } .fa-pied-piper:before { content: "\f2ae"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-pied-piper-hat:before { content: "\f4e5"; } .fa-pied-piper-pp:before { content: "\f1a7"; } .fa-pied-piper-square:before { content: "\e01e"; } .fa-piggy-bank:before { content: "\f4d3"; } .fa-pills:before { content: "\f484"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-p:before { content: "\f231"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-pizza-slice:before { content: "\f818"; } .fa-place-of-worship:before { content: "\f67f"; } .fa-plane:before { content: "\f072"; } .fa-plane-arrival:before { content: "\f5af"; } .fa-plane-departure:before { content: "\f5b0"; } .fa-plane-slash:before { content: "\e069"; } .fa-play:before { content: "\f04b"; } .fa-play-circle:before { content: "\f144"; } .fa-playstation:before { content: "\f3df"; } .fa-plug:before { content: "\f1e6"; } .fa-plus:before { content: "\f067"; } .fa-plus-circle:before { content: "\f055"; } .fa-plus-square:before { content: "\f0fe"; } .fa-podcast:before { content: "\f2ce"; } .fa-poll:before { content: "\f681"; } .fa-poll-h:before { content: "\f682"; } .fa-poo:before { content: "\f2fe"; } .fa-poo-storm:before { content: "\f75a"; } .fa-poop:before { content: "\f619"; } .fa-portrait:before { content: "\f3e0"; } .fa-pound-sign:before { content: "\f154"; } .fa-power-off:before { content: "\f011"; } .fa-pray:before { content: "\f683"; } .fa-praying-hands:before { content: "\f684"; } .fa-prescription:before { content: "\f5b1"; } .fa-prescription-bottle:before { content: "\f485"; } .fa-prescription-bottle-alt:before { content: "\f486"; } .fa-print:before { content: "\f02f"; } .fa-procedures:before { content: "\f487"; } .fa-product-hunt:before { content: "\f288"; } .fa-project-diagram:before { content: "\f542"; } .fa-pump-medical:before { content: "\e06a"; } .fa-pump-soap:before { content: "\e06b"; } .fa-pushed:before { content: "\f3e1"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-python:before { content: "\f3e2"; } .fa-qq:before { content: "\f1d6"; } .fa-qrcode:before { content: "\f029"; } .fa-question:before { content: "\f128"; } .fa-question-circle:before { content: "\f059"; } .fa-quidditch:before { content: "\f458"; } .fa-quinscape:before { content: "\f459"; } .fa-quora:before { content: "\f2c4"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-quran:before { content: "\f687"; } .fa-r-project:before { content: "\f4f7"; } .fa-radiation:before { content: "\f7b9"; } .fa-radiation-alt:before { content: "\f7ba"; } .fa-rainbow:before { content: "\f75b"; } .fa-random:before { content: "\f074"; } .fa-raspberry-pi:before { content: "\f7bb"; } .fa-ravelry:before { content: "\f2d9"; } .fa-react:before { content: "\f41b"; } .fa-reacteurope:before { content: "\f75d"; } .fa-readme:before { content: "\f4d5"; } .fa-rebel:before { content: "\f1d0"; } .fa-receipt:before { content: "\f543"; } .fa-record-vinyl:before { content: "\f8d9"; } .fa-recycle:before { content: "\f1b8"; } .fa-red-river:before { content: "\f3e3"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-alien:before { content: "\f281"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-redhat:before { content: "\f7bc"; } .fa-redo:before { content: "\f01e"; } .fa-redo-alt:before { content: "\f2f9"; } .fa-registered:before { content: "\f25d"; } .fa-remove-format:before { content: "\f87d"; } .fa-renren:before { content: "\f18b"; } .fa-reply:before { content: "\f3e5"; } .fa-reply-all:before { content: "\f122"; } .fa-replyd:before { content: "\f3e6"; } .fa-republican:before { content: "\f75e"; } .fa-researchgate:before { content: "\f4f8"; } .fa-resolving:before { content: "\f3e7"; } .fa-restroom:before { content: "\f7bd"; } .fa-retweet:before { content: "\f079"; } .fa-rev:before { content: "\f5b2"; } .fa-ribbon:before { content: "\f4d6"; } .fa-ring:before { content: "\f70b"; } .fa-road:before { content: "\f018"; } .fa-robot:before { content: "\f544"; } .fa-rocket:before { content: "\f135"; } .fa-rocketchat:before { content: "\f3e8"; } .fa-rockrms:before { content: "\f3e9"; } .fa-route:before { content: "\f4d7"; } .fa-rss:before { content: "\f09e"; } .fa-rss-square:before { content: "\f143"; } .fa-ruble-sign:before { content: "\f158"; } .fa-ruler:before { content: "\f545"; } .fa-ruler-combined:before { content: "\f546"; } .fa-ruler-horizontal:before { content: "\f547"; } .fa-ruler-vertical:before { content: "\f548"; } .fa-running:before { content: "\f70c"; } .fa-rupee-sign:before { content: "\f156"; } .fa-rust:before { content: "\e07a"; } .fa-sad-cry:before { content: "\f5b3"; } .fa-sad-tear:before { content: "\f5b4"; } .fa-safari:before { content: "\f267"; } .fa-salesforce:before { content: "\f83b"; } .fa-sass:before { content: "\f41e"; } .fa-satellite:before { content: "\f7bf"; } .fa-satellite-dish:before { content: "\f7c0"; } .fa-save:before { content: "\f0c7"; } .fa-schlix:before { content: "\f3ea"; } .fa-school:before { content: "\f549"; } .fa-screwdriver:before { content: "\f54a"; } .fa-scribd:before { content: "\f28a"; } .fa-scroll:before { content: "\f70e"; } .fa-sd-card:before { content: "\f7c2"; } .fa-search:before { content: "\f002"; } .fa-search-dollar:before { content: "\f688"; } .fa-search-location:before { content: "\f689"; } .fa-search-minus:before { content: "\f010"; } .fa-search-plus:before { content: "\f00e"; } .fa-searchengin:before { content: "\f3eb"; } .fa-seedling:before { content: "\f4d8"; } .fa-sellcast:before { content: "\f2da"; } .fa-sellsy:before { content: "\f213"; } .fa-server:before { content: "\f233"; } .fa-servicestack:before { content: "\f3ec"; } .fa-shapes:before { content: "\f61f"; } .fa-share:before { content: "\f064"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-share-square:before { content: "\f14d"; } .fa-shekel-sign:before { content: "\f20b"; } .fa-shield-alt:before { content: "\f3ed"; } .fa-shield-virus:before { content: "\e06c"; } .fa-ship:before { content: "\f21a"; } .fa-shipping-fast:before { content: "\f48b"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-shoe-prints:before { content: "\f54b"; } .fa-shopify:before { content: "\e057"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-shopware:before { content: "\f5b5"; } .fa-shower:before { content: "\f2cc"; } .fa-shuttle-van:before { content: "\f5b6"; } .fa-sign:before { content: "\f4d9"; } .fa-sign-in-alt:before { content: "\f2f6"; } .fa-sign-language:before { content: "\f2a7"; } .fa-sign-out-alt:before { content: "\f2f5"; } .fa-signal:before { content: "\f012"; } .fa-signature:before { content: "\f5b7"; } .fa-sim-card:before { content: "\f7c4"; } .fa-simplybuilt:before { content: "\f215"; } .fa-sink:before { content: "\e06d"; } .fa-sistrix:before { content: "\f3ee"; } .fa-sitemap:before { content: "\f0e8"; } .fa-sith:before { content: "\f512"; } .fa-skating:before { content: "\f7c5"; } .fa-sketch:before { content: "\f7c6"; } .fa-skiing:before { content: "\f7c9"; } .fa-skiing-nordic:before { content: "\f7ca"; } .fa-skull:before { content: "\f54c"; } .fa-skull-crossbones:before { content: "\f714"; } .fa-skyatlas:before { content: "\f216"; } .fa-skype:before { content: "\f17e"; } .fa-slack:before { content: "\f198"; } .fa-slack-hash:before { content: "\f3ef"; } .fa-slash:before { content: "\f715"; } .fa-sleigh:before { content: "\f7cc"; } .fa-sliders-h:before { content: "\f1de"; } .fa-slideshare:before { content: "\f1e7"; } .fa-smile:before { content: "\f118"; } .fa-smile-beam:before { content: "\f5b8"; } .fa-smile-wink:before { content: "\f4da"; } .fa-smog:before { content: "\f75f"; } .fa-smoking:before { content: "\f48d"; } .fa-smoking-ban:before { content: "\f54d"; } .fa-sms:before { content: "\f7cd"; } .fa-snapchat:before { content: "\f2ab"; } .fa-snapchat-ghost:before { content: "\f2ac"; } .fa-snapchat-square:before { content: "\f2ad"; } .fa-snowboarding:before { content: "\f7ce"; } .fa-snowflake:before { content: "\f2dc"; } .fa-snowman:before { content: "\f7d0"; } .fa-snowplow:before { content: "\f7d2"; } .fa-soap:before { content: "\e06e"; } .fa-socks:before { content: "\f696"; } .fa-solar-panel:before { content: "\f5ba"; } .fa-sort:before { content: "\f0dc"; } .fa-sort-alpha-down:before { content: "\f15d"; } .fa-sort-alpha-down-alt:before { content: "\f881"; } .fa-sort-alpha-up:before { content: "\f15e"; } .fa-sort-alpha-up-alt:before { content: "\f882"; } .fa-sort-amount-down:before { content: "\f160"; } .fa-sort-amount-down-alt:before { content: "\f884"; } .fa-sort-amount-up:before { content: "\f161"; } .fa-sort-amount-up-alt:before { content: "\f885"; } .fa-sort-down:before { content: "\f0dd"; } .fa-sort-numeric-down:before { content: "\f162"; } .fa-sort-numeric-down-alt:before { content: "\f886"; } .fa-sort-numeric-up:before { content: "\f163"; } .fa-sort-numeric-up-alt:before { content: "\f887"; } .fa-sort-up:before { content: "\f0de"; } .fa-soundcloud:before { content: "\f1be"; } .fa-sourcetree:before { content: "\f7d3"; } .fa-spa:before { content: "\f5bb"; } .fa-space-shuttle:before { content: "\f197"; } .fa-speakap:before { content: "\f3f3"; } .fa-speaker-deck:before { content: "\f83c"; } .fa-spell-check:before { content: "\f891"; } .fa-spider:before { content: "\f717"; } .fa-spinner:before { content: "\f110"; } .fa-splotch:before { content: "\f5bc"; } .fa-spotify:before { content: "\f1bc"; } .fa-spray-can:before { content: "\f5bd"; } .fa-square:before { content: "\f0c8"; } .fa-square-full:before { content: "\f45c"; } .fa-square-root-alt:before { content: "\f698"; } .fa-squarespace:before { content: "\f5be"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-stackpath:before { content: "\f842"; } .fa-stamp:before { content: "\f5bf"; } .fa-star:before { content: "\f005"; } .fa-star-and-crescent:before { content: "\f699"; } .fa-star-half:before { content: "\f089"; } .fa-star-half-alt:before { content: "\f5c0"; } .fa-star-of-david:before { content: "\f69a"; } .fa-star-of-life:before { content: "\f621"; } .fa-staylinked:before { content: "\f3f5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-steam-symbol:before { content: "\f3f6"; } .fa-step-backward:before { content: "\f048"; } .fa-step-forward:before { content: "\f051"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-sticker-mule:before { content: "\f3f7"; } .fa-sticky-note:before { content: "\f249"; } .fa-stop:before { content: "\f04d"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stopwatch:before { content: "\f2f2"; } .fa-stopwatch-20:before { content: "\e06f"; } .fa-store:before { content: "\f54e"; } .fa-store-alt:before { content: "\f54f"; } .fa-store-alt-slash:before { content: "\e070"; } .fa-store-slash:before { content: "\e071"; } .fa-strava:before { content: "\f428"; } .fa-stream:before { content: "\f550"; } .fa-street-view:before { content: "\f21d"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-stripe:before { content: "\f429"; } .fa-stripe-s:before { content: "\f42a"; } .fa-stroopwafel:before { content: "\f551"; } .fa-studiovinari:before { content: "\f3f8"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-subscript:before { content: "\f12c"; } .fa-subway:before { content: "\f239"; } .fa-suitcase:before { content: "\f0f2"; } .fa-suitcase-rolling:before { content: "\f5c1"; } .fa-sun:before { content: "\f185"; } .fa-superpowers:before { content: "\f2dd"; } .fa-superscript:before { content: "\f12b"; } .fa-supple:before { content: "\f3f9"; } .fa-surprise:before { content: "\f5c2"; } .fa-suse:before { content: "\f7d6"; } .fa-swatchbook:before { content: "\f5c3"; } .fa-swift:before { content: "\f8e1"; } .fa-swimmer:before { content: "\f5c4"; } .fa-swimming-pool:before { content: "\f5c5"; } .fa-symfony:before { content: "\f83d"; } .fa-synagogue:before { content: "\f69b"; } .fa-sync:before { content: "\f021"; } .fa-sync-alt:before { content: "\f2f1"; } .fa-syringe:before { content: "\f48e"; } .fa-table:before { content: "\f0ce"; } .fa-table-tennis:before { content: "\f45d"; } .fa-tablet:before { content: "\f10a"; } .fa-tablet-alt:before { content: "\f3fa"; } .fa-tablets:before { content: "\f490"; } .fa-tachometer-alt:before { content: "\f3fd"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-tape:before { content: "\f4db"; } .fa-tasks:before { content: "\f0ae"; } .fa-taxi:before { content: "\f1ba"; } .fa-teamspeak:before { content: "\f4f9"; } .fa-teeth:before { content: "\f62e"; } .fa-teeth-open:before { content: "\f62f"; } .fa-telegram:before { content: "\f2c6"; } .fa-telegram-plane:before { content: "\f3fe"; } .fa-temperature-high:before { content: "\f769"; } .fa-temperature-low:before { content: "\f76b"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-tenge:before { content: "\f7d7"; } .fa-terminal:before { content: "\f120"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-th:before { content: "\f00a"; } .fa-th-large:before { content: "\f009"; } .fa-th-list:before { content: "\f00b"; } .fa-the-red-yeti:before { content: "\f69d"; } .fa-theater-masks:before { content: "\f630"; } .fa-themeco:before { content: "\f5c6"; } .fa-themeisle:before { content: "\f2b2"; } .fa-thermometer:before { content: "\f491"; } .fa-thermometer-empty:before { content: "\f2cb"; } .fa-thermometer-full:before { content: "\f2c7"; } .fa-thermometer-half:before { content: "\f2c9"; } .fa-thermometer-quarter:before { content: "\f2ca"; } .fa-thermometer-three-quarters:before { content: "\f2c8"; } .fa-think-peaks:before { content: "\f731"; } .fa-thumbs-down:before { content: "\f165"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbtack:before { content: "\f08d"; } .fa-ticket-alt:before { content: "\f3ff"; } .fa-tiktok:before { content: "\e07b"; } .fa-times:before { content: "\f00d"; } .fa-times-circle:before { content: "\f057"; } .fa-tint:before { content: "\f043"; } .fa-tint-slash:before { content: "\f5c7"; } .fa-tired:before { content: "\f5c8"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-toilet:before { content: "\f7d8"; } .fa-toilet-paper:before { content: "\f71e"; } .fa-toilet-paper-slash:before { content: "\e072"; } .fa-toolbox:before { content: "\f552"; } .fa-tools:before { content: "\f7d9"; } .fa-tooth:before { content: "\f5c9"; } .fa-torah:before { content: "\f6a0"; } .fa-torii-gate:before { content: "\f6a1"; } .fa-tractor:before { content: "\f722"; } .fa-trade-federation:before { content: "\f513"; } .fa-trademark:before { content: "\f25c"; } .fa-traffic-light:before { content: "\f637"; } .fa-trailer:before { content: "\e041"; } .fa-train:before { content: "\f238"; } .fa-tram:before { content: "\f7da"; } .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-trash:before { content: "\f1f8"; } .fa-trash-alt:before { content: "\f2ed"; } .fa-trash-restore:before { content: "\f829"; } .fa-trash-restore-alt:before { content: "\f82a"; } .fa-tree:before { content: "\f1bb"; } .fa-trello:before { content: "\f181"; } .fa-tripadvisor:before { content: "\f262"; } .fa-trophy:before { content: "\f091"; } .fa-truck:before { content: "\f0d1"; } .fa-truck-loading:before { content: "\f4de"; } .fa-truck-monster:before { content: "\f63b"; } .fa-truck-moving:before { content: "\f4df"; } .fa-truck-pickup:before { content: "\f63c"; } .fa-tshirt:before { content: "\f553"; } .fa-tty:before { content: "\f1e4"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-tv:before { content: "\f26c"; } .fa-twitch:before { content: "\f1e8"; } .fa-twitter:before { content: "\f099"; } .fa-twitter-square:before { content: "\f081"; } .fa-typo3:before { content: "\f42b"; } .fa-uber:before { content: "\f402"; } .fa-ubuntu:before { content: "\f7df"; } .fa-uikit:before { content: "\f403"; } .fa-umbraco:before { content: "\f8e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-umbrella-beach:before { content: "\f5ca"; } .fa-uncharted:before { content: "\e084"; } .fa-underline:before { content: "\f0cd"; } .fa-undo:before { content: "\f0e2"; } .fa-undo-alt:before { content: "\f2ea"; } .fa-uniregistry:before { content: "\f404"; } .fa-unity:before { content: "\e049"; } .fa-universal-access:before { content: "\f29a"; } .fa-university:before { content: "\f19c"; } .fa-unlink:before { content: "\f127"; } .fa-unlock:before { content: "\f09c"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-unsplash:before { content: "\e07c"; } .fa-untappd:before { content: "\f405"; } .fa-upload:before { content: "\f093"; } .fa-ups:before { content: "\f7e0"; } .fa-usb:before { content: "\f287"; } .fa-user:before { content: "\f007"; } .fa-user-alt:before { content: "\f406"; } .fa-user-alt-slash:before { content: "\f4fa"; } .fa-user-astronaut:before { content: "\f4fb"; } .fa-user-check:before { content: "\f4fc"; } .fa-user-circle:before { content: "\f2bd"; } .fa-user-clock:before { content: "\f4fd"; } .fa-user-cog:before { content: "\f4fe"; } .fa-user-edit:before { content: "\f4ff"; } .fa-user-friends:before { content: "\f500"; } .fa-user-graduate:before { content: "\f501"; } .fa-user-injured:before { content: "\f728"; } .fa-user-lock:before { content: "\f502"; } .fa-user-md:before { content: "\f0f0"; } .fa-user-minus:before { content: "\f503"; } .fa-user-ninja:before { content: "\f504"; } .fa-user-nurse:before { content: "\f82f"; } .fa-user-plus:before { content: "\f234"; } .fa-user-secret:before { content: "\f21b"; } .fa-user-shield:before { content: "\f505"; } .fa-user-slash:before { content: "\f506"; } .fa-user-tag:before { content: "\f507"; } .fa-user-tie:before { content: "\f508"; } .fa-user-times:before { content: "\f235"; } .fa-users:before { content: "\f0c0"; } .fa-users-cog:before { content: "\f509"; } .fa-users-slash:before { content: "\e073"; } .fa-usps:before { content: "\f7e1"; } .fa-ussunnah:before { content: "\f407"; } .fa-utensil-spoon:before { content: "\f2e5"; } .fa-utensils:before { content: "\f2e7"; } .fa-vaadin:before { content: "\f408"; } .fa-vector-square:before { content: "\f5cb"; } .fa-venus:before { content: "\f221"; } .fa-venus-double:before { content: "\f226"; } .fa-venus-mars:before { content: "\f228"; } .fa-vest:before { content: "\e085"; } .fa-vest-patches:before { content: "\e086"; } .fa-viacoin:before { content: "\f237"; } .fa-viadeo:before { content: "\f2a9"; } .fa-viadeo-square:before { content: "\f2aa"; } .fa-vial:before { content: "\f492"; } .fa-vials:before { content: "\f493"; } .fa-viber:before { content: "\f409"; } .fa-video:before { content: "\f03d"; } .fa-video-slash:before { content: "\f4e2"; } .fa-vihara:before { content: "\f6a7"; } .fa-vimeo:before { content: "\f40a"; } .fa-vimeo-square:before { content: "\f194"; } .fa-vimeo-v:before { content: "\f27d"; } .fa-vine:before { content: "\f1ca"; } .fa-virus:before { content: "\e074"; } .fa-virus-slash:before { content: "\e075"; } .fa-viruses:before { content: "\e076"; } .fa-vk:before { content: "\f189"; } .fa-vnv:before { content: "\f40b"; } .fa-voicemail:before { content: "\f897"; } .fa-volleyball-ball:before { content: "\f45f"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-mute:before { content: "\f6a9"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-up:before { content: "\f028"; } .fa-vote-yea:before { content: "\f772"; } .fa-vr-cardboard:before { content: "\f729"; } .fa-vuejs:before { content: "\f41f"; } .fa-walking:before { content: "\f554"; } .fa-wallet:before { content: "\f555"; } .fa-warehouse:before { content: "\f494"; } .fa-watchman-monitoring:before { content: "\e087"; } .fa-water:before { content: "\f773"; } .fa-wave-square:before { content: "\f83e"; } .fa-waze:before { content: "\f83f"; } .fa-weebly:before { content: "\f5cc"; } .fa-weibo:before { content: "\f18a"; } .fa-weight:before { content: "\f496"; } .fa-weight-hanging:before { content: "\f5cd"; } .fa-weixin:before { content: "\f1d7"; } .fa-whatsapp:before { content: "\f232"; } .fa-whatsapp-square:before { content: "\f40c"; } .fa-wheelchair:before { content: "\f193"; } .fa-whmcs:before { content: "\f40d"; } .fa-wifi:before { content: "\f1eb"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-wind:before { content: "\f72e"; } .fa-window-close:before { content: "\f410"; } .fa-window-maximize:before { content: "\f2d0"; } .fa-window-minimize:before { content: "\f2d1"; } .fa-window-restore:before { content: "\f2d2"; } .fa-windows:before { content: "\f17a"; } .fa-wine-bottle:before { content: "\f72f"; } .fa-wine-glass:before { content: "\f4e3"; } .fa-wine-glass-alt:before { content: "\f5ce"; } .fa-wix:before { content: "\f5cf"; } .fa-wizards-of-the-coast:before { content: "\f730"; } .fa-wodu:before { content: "\e088"; } .fa-wolf-pack-battalion:before { content: "\f514"; } .fa-won-sign:before { content: "\f159"; } .fa-wordpress:before { content: "\f19a"; } .fa-wordpress-simple:before { content: "\f411"; } .fa-wpbeginner:before { content: "\f297"; } .fa-wpexplorer:before { content: "\f2de"; } .fa-wpforms:before { content: "\f298"; } .fa-wpressr:before { content: "\f3e4"; } .fa-wrench:before { content: "\f0ad"; } .fa-x-ray:before { content: "\f497"; } .fa-xbox:before { content: "\f412"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-y-combinator:before { content: "\f23b"; } .fa-yahoo:before { content: "\f19e"; } .fa-yammer:before { content: "\f840"; } .fa-yandex:before { content: "\f413"; } .fa-yandex-international:before { content: "\f414"; } .fa-yarn:before { content: "\f7e3"; } .fa-yelp:before { content: "\f1e9"; } .fa-yen-sign:before { content: "\f157"; } .fa-yin-yang:before { content: "\f6ad"; } .fa-yoast:before { content: "\f2b1"; } .fa-youtube:before { content: "\f167"; } .fa-youtube-square:before { content: "\f431"; } .fa-zhihu:before { content: "\f63f"; } .sr-only { border: 0; clip: rect(0, 0, 0, 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .sr-only-focusable:active, .sr-only-focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; } @font-face { font-family: 'Font Awesome 5 Brands'; font-style: normal; font-weight: 400; font-display: block; src: url("../webfonts/fa-brands-400.eot"); src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } .fab { font-family: 'Font Awesome 5 Brands'; font-weight: 400; } @font-face { font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 400; font-display: block; src: url("../webfonts/fa-regular-400.eot"); src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } .far { font-family: 'Font Awesome 5 Free'; font-weight: 400; } @font-face { font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 900; font-display: block; src: url("../webfonts/fa-solid-900.eot"); src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } .fa, .fas { font-family: 'Font Awesome 5 Free'; font-weight: 900; } -------------------- END OF FILE -------------------- FILE: RR com/assets/css/fontawesome.min.css TYPE: CSS SIZE: 57.96 KB ------------------------------------------------------------ /*! * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */.fa-fw,.fa-li{text-align:center}.fab,.far{font-weight:400}.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:'Font Awesome 5 Brands'}.fa,.far,.fas{font-family:'Font Awesome 5 Free'}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-weight:900} -------------------- END OF FILE -------------------- FILE: RR com/assets/css/redirect-pages.css TYPE: CSS SIZE: 6.11 KB ------------------------------------------------------------ /* Redirect Landing Pages Stylesheet */ /* For Relevant Reflex Survey Completion Pages */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; min-height: 100vh; } .page-container { min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; position: relative; overflow: hidden; } /* Animated background elements */ .page-container::before, .page-container::after { content: ''; position: absolute; border-radius: 50%; opacity: 0.1; animation: float 20s infinite ease-in-out; } .page-container::before { width: 400px; height: 400px; background: white; top: -100px; left: -100px; } .page-container::after { width: 300px; height: 300px; background: white; bottom: -50px; right: -50px; animation-delay: 10s; } @keyframes float { 0%, 100% { transform: translate(0, 0) scale(1); } 50% { transform: translate(50px, 50px) scale(1.1); } } .content-card { background: white; border-radius: 20px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); max-width: 600px; width: 100%; padding: 50px 40px; text-align: center; position: relative; z-index: 1; animation: slideUp 0.6s ease-out; } @keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .icon-circle { width: 120px; height: 120px; border-radius: 50%; margin: 0 auto 30px; display: flex; align-items: center; justify-content: center; animation: scaleIn 0.8s ease-out; } @keyframes scaleIn { 0% { transform: scale(0); opacity: 0; } 50% { transform: scale(1.1); } 100% { transform: scale(1); opacity: 1; } } .icon-circle.success { background: linear-gradient(135deg, #28a745, #20c997); } .icon-circle.partial { background: linear-gradient(135deg, #0066cc, #0052a3); } .icon-circle.screenout { background: linear-gradient(135deg, #dc2626, #991b1b); } .icon-circle.warning { background: linear-gradient(135deg, #f59e0b, #d97706); } .icon-circle.timeout { background: linear-gradient(135deg, #6b7280, #4b5563); } .icon-circle.quota { background: linear-gradient(135deg, #ec4899, #be185d); } .icon { font-size: 60px; color: white; line-height: 1; } .page-heading { font-size: 32px; font-weight: 700; color: #111827; margin-bottom: 20px; } .main-message { font-size: 18px; color: #6b7280; line-height: 1.8; margin-bottom: 30px; max-width: 500px; margin-left: auto; margin-right: auto; } .points-box { background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%); border-radius: 16px; padding: 30px; margin: 30px 0; color: white; animation: pulse 2s ease-in-out infinite; } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.02); } } .points-label { font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; opacity: 0.9; margin-bottom: 10px; } .points-amount { font-size: 48px; font-weight: 800; margin: 10px 0; } .points-sublabel { font-size: 14px; opacity: 0.9; } .info-box { background: #f3f4f6; border-radius: 12px; padding: 25px; margin: 30px 0; text-align: left; } .info-box h3 { font-size: 18px; font-weight: 600; color: #111827; margin-bottom: 12px; } .info-box p { font-size: 15px; color: #6b7280; line-height: 1.6; } .info-grid { background: #f9fafb; border-radius: 12px; padding: 20px; margin: 30px 0; } .info-item { display: flex; justify-content: space-between; padding: 12px 0; border-bottom: 1px solid #e5e7eb; } .info-item:last-child { border-bottom: none; } .info-label { font-size: 14px; color: #6b7280; } .info-value { font-size: 14px; font-weight: 600; color: #111827; } .action-buttons { display: flex; gap: 12px; margin: 30px 0; flex-wrap: wrap; justify-content: center; } .btn { display: inline-block; padding: 14px 28px; border-radius: 10px; font-size: 16px; font-weight: 600; text-decoration: none; transition: all 0.3s ease; border: none; cursor: pointer; } .btn-primary { background: #0066cc; color: white; } .btn-primary:hover { background: #0052a3; transform: translateY(-2px); box-shadow: 0 10px 20px rgba(0, 102, 204, 0.3); } .btn-secondary { background: #f3f4f6; color: #374151; } .btn-secondary:hover { background: #e5e7eb; transform: translateY(-2px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); } .footer-note { margin-top: 30px; padding-top: 25px; border-top: 2px solid #e5e7eb; } .footer-note p { font-size: 14px; color: #6b7280; line-height: 1.6; } .branding { position: relative; z-index: 1; margin-top: 30px; color: white; text-align: center; } .branding .logo { height: 40px; margin-bottom: 10px; opacity: 0.9; } .branding p { font-size: 14px; opacity: 0.8; font-weight: 500; } /* Mobile Responsive */ @media (max-width: 768px) { .content-card { padding: 40px 30px; } .page-heading { font-size: 26px; } .main-message { font-size: 16px; } .icon-circle { width: 100px; height: 100px; } .icon { font-size: 50px; } .points-amount { font-size: 40px; } .action-buttons { flex-direction: column; } .btn { width: 100%; } } @media (max-width: 480px) { .content-card { padding: 30px 20px; } .page-heading { font-size: 22px; } .points-box { padding: 20px; } .points-amount { font-size: 36px; } } -------------------- END OF FILE -------------------- FILE: RR com/assets/css/slick-theme.css TYPE: CSS SIZE: 3.12 KB ------------------------------------------------------------ @charset 'UTF-8'; /* Slider */ .slick-loading .slick-list { background: #fff url('../img/ajax-loader.gif') center center no-repeat; } /* Icons */ @font-face { font-family: 'slick'; font-weight: normal; font-style: normal; src: url('../webfonts/slick.eot'); src: url('../webfonts/slick.eot?#iefix') format('embedded-opentype'), url('../webfonts/slick.woff') format('woff'), url('../webfonts/slick.ttf') format('truetype'), url('../webfonts/slick.svg#slick') format('svg'); } /* Arrows */ .slick-prev, .slick-next { font-size: 0; line-height: 0; position: absolute; top: 50%; display: block; width: 20px; height: 20px; padding: 0; -webkit-transform: translate(0, -50%); -ms-transform: translate(0, -50%); transform: translate(0, -50%); cursor: pointer; color: transparent; border: none; outline: none; background: transparent; } .slick-prev:hover, .slick-prev:focus, .slick-next:hover, .slick-next:focus { color: transparent; outline: none; background: transparent; } .slick-prev:hover:before, .slick-prev:focus:before, .slick-next:hover:before, .slick-next:focus:before { opacity: 1; } .slick-prev.slick-disabled:before, .slick-next.slick-disabled:before { opacity: .25; } .slick-prev:before, .slick-next:before { font-family: 'slick'; font-size: 20px; line-height: 1; opacity: .75; color: white; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .slick-prev { left: -25px; } [dir='rtl'] .slick-prev { right: -25px; left: auto; } .slick-prev:before { content: '←'; } [dir='rtl'] .slick-prev:before { content: '→'; } .slick-next { right: -25px; } [dir='rtl'] .slick-next { right: auto; left: -25px; } .slick-next:before { content: '→'; } [dir='rtl'] .slick-next:before { content: '←'; } /* Dots */ .slick-dotted.slick-slider { margin-bottom: 30px; } .slick-dots { position: absolute; bottom: -25px; display: block; width: 100%; padding: 0; margin: 0; list-style: none; text-align: center; } .slick-dots li { position: relative; display: inline-block; width: 20px; height: 20px; margin: 0 5px; padding: 0; cursor: pointer; } .slick-dots li button { font-size: 0; line-height: 0; display: block; width: 20px; height: 20px; padding: 5px; cursor: pointer; color: transparent; border: 0; outline: none; background: transparent; } .slick-dots li button:hover, .slick-dots li button:focus { outline: none; } .slick-dots li button:hover:before, .slick-dots li button:focus:before { opacity: 1; } .slick-dots li button:before { font-family: 'slick'; font-size: 6px; line-height: 20px; position: absolute; top: 0; left: 0; width: 20px; height: 20px; content: '•'; text-align: center; opacity: .25; color: black; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .slick-dots li.slick-active button:before { opacity: .75; color: black; } -------------------- END OF FILE -------------------- FILE: RR com/assets/css/slick-theme.min.css TYPE: CSS SIZE: 2.28 KB ------------------------------------------------------------ @charset 'UTF-8';.slick-dots,.slick-next,.slick-prev{position:absolute;display:block;padding:0}.slick-dots li button:before,.slick-next:before,.slick-prev:before{font-family:slick;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-loading .slick-list{background:url(../img/ajax-loader.gif) center center no-repeat #fff}@font-face{font-family:slick;font-weight:400;font-style:normal;src:url(../webfonts/slick.eot);src:url(../webfonts/slick.eot?#iefix) format('embedded-opentype'),url(../webfonts/slick.woff) format('woff'),url(../webfonts/slick.ttf) format('truetype'),url(../webfonts/slick.svg#slick) format('svg')}.slick-next,.slick-prev{font-size:0;line-height:0;top:50%;width:20px;height:20px;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%);cursor:pointer;color:transparent;border:none;outline:0;background:0 0}.slick-next:focus,.slick-next:hover,.slick-prev:focus,.slick-prev:hover{color:transparent;outline:0;background:0 0}.slick-next:focus:before,.slick-next:hover:before,.slick-prev:focus:before,.slick-prev:hover:before{opacity:1}.slick-next.slick-disabled:before,.slick-prev.slick-disabled:before{opacity:.25}.slick-next:before,.slick-prev:before{font-size:20px;line-height:1;opacity:.75;color:#fff}.slick-prev{left:-25px}[dir=rtl] .slick-prev{right:-25px;left:auto}.slick-prev:before{content:'←'}.slick-next:before,[dir=rtl] .slick-prev:before{content:'→'}.slick-next{right:-25px}[dir=rtl] .slick-next{right:auto;left:-25px}[dir=rtl] .slick-next:before{content:'←'}.slick-dotted.slick-slider{margin-bottom:30px}.slick-dots{bottom:-25px;width:100%;margin:0;list-style:none;text-align:center}.slick-dots li{position:relative;display:inline-block;width:20px;height:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{font-size:0;line-height:0;display:block;width:20px;height:20px;padding:5px;cursor:pointer;color:transparent;border:0;outline:0;background:0 0}.slick-dots li button:focus,.slick-dots li button:hover{outline:0}.slick-dots li button:focus:before,.slick-dots li button:hover:before{opacity:1}.slick-dots li button:before{font-size:6px;line-height:20px;position:absolute;top:0;left:0;width:20px;height:20px;content:'•';text-align:center;opacity:.25;color:#000}.slick-dots li.slick-active button:before{opacity:.75;color:#000} -------------------- END OF FILE -------------------- FILE: RR com/assets/css/slick.min.css TYPE: CSS SIZE: 1.34 KB ------------------------------------------------------------ .slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-khtml-user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;display:block;overflow:hidden;margin:0;padding:0}.slick-list:focus{outline:0}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-list,.slick-slider .slick-track{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slick-track{position:relative;top:0;left:0;display:block;margin-left:auto;margin-right:auto}.slick-track:after,.slick-track:before{display:table;content:''}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{display:none;float:left;height:100%;min-height:1px}[dir=rtl] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-arrow.slick-hidden{display:none} /*# sourceMappingURL=slick.min.css.map */ -------------------- END OF FILE -------------------- FILE: RR com/assets/css/templatemo.css TYPE: CSS SIZE: 5.34 KB ------------------------------------------------------------ /* TemplateMo 559 Zay Shop https://templatemo.com/tm-559-zay-shop --------------------------------------------- Table of contents ------------------------------------------------ 1. Typography 2. General 3. Nav 4. Hero Carousel 5. Accordion 6. Shop 7. Product 8. Carousel Hero 9. Carousel Brand 10. Services 11. Contact map 12. Footer 13. Small devices (landscape phones, 576px and up) 14. Medium devices (tablets, 768px and up) 15. Large devices (desktops, 992px and up) 16. Extra large devices (large desktops, 1200px and up) --------------------------------------------- */ /* Typography */ body, ul, li, p, a, label, input, div { font-family: 'Roboto', sans-serif; font-size: 18px !important; font-weight: 300 !important; } .h1 { font-family: 'Roboto', sans-serif; font-size: 48px !important; font-weight: 200 !important; } .h2 { font-family: 'Roboto', sans-serif; font-size: 30px !important; font-weight: 300; } .h3 { font-family: 'Roboto', sans-serif; font-size: 22px !important; } /* General */ .logo { font-weight: 500 !important;} .text-warning { color: #ede861 !important;} .text-muted { color: #bcbcbc !important;} .text-success { color: #59ab6e !important;} .text-light { color: #cfd6e1 !important;} .bg-dark { background-color: #212934 !important;} .bg-light { background-color: #e9eef5 !important;} .bg-black { background-color: #1d242d !important;} .bg-success { background-color: #59ab6e !important;} .btn-success { background-color: #59ab6e !important; border-color: #56ae6c !important; } .pagination .page-link:hover {color: #000;} .pagination .page-link:hover, .pagination .page-link.active { background-color: #69bb7e; color: #fff; } /* Nav */ #templatemo_nav_top { min-height: 40px;} #templatemo_nav_top * { font-size: .9em !important;} #templatemo_main_nav a { color: #212934;} #templatemo_main_nav a:hover { color: #69bb7e;} #templatemo_main_nav .navbar .nav-icon { margin-right: 20px;} /* Hero Carousel */ #template-mo-zay-hero-carousel { background: #f2cc8e !important;} /* Accordion */ .templatemo-accordion a { color: #000;} .templatemo-accordion a:hover { color: #333d4a;} /* Shop */ .shop-top-menu a:hover { color: #69bb7e !important;} /* Product */ .product-wap { box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.10);} .product-wap .product-color-dot.color-dot-red { background:#f71515;} .product-wap .product-color-dot.color-dot-blue { background:#6db4fe;} .product-wap .product-color-dot.color-dot-black { background:#000000;} .product-wap .product-color-dot.color-dot-light { background:#e0e0e0;} .product-wap .product-color-dot.color-dot-green { background:#0bff7e;} .card.product-wap .card .product-overlay { background: rgba(0,0,0,.2); visibility: hidden; opacity: 0; transition: .3s; } .card.product-wap:hover .card .product-overlay { visibility: visible; opacity: 1; } .card.product-wap a { color: #000;} #carousel-related-product .slick-slide:focus { outline: none !important;} #carousel-related-product .slick-dots li button:before { font-size: 15px; margin-top: 20px; } /* Brand */ .brand-img { filter: grayscale(100%); opacity: 0.5; transition: .5s; } .brand-img:hover { filter: grayscale(0%); opacity: 1; } /* Carousel Hero */ #template-mo-zay-hero-carousel .carousel-indicators li { margin-top: -50px; background-color: #59ab6e; } #template-mo-zay-hero-carousel .carousel-control-next i, #template-mo-zay-hero-carousel .carousel-control-prev i { color: #59ab6e !important; font-size: 2.8em !important; } /* Carousel Brand */ .tempaltemo-carousel .h1 { font-size: .5em !important; color: #000 !important; } /* Services */ .services-icon-wap {transition: .3s;} .services-icon-wap:hover, .services-icon-wap:hover i {color: #fff;} .services-icon-wap:hover {background: #69bb7e;} /* Contact map */ .leaflet-control a, .leaflet-control { font-size: 10px !important;} .form-control { border: 1px solid #e8e8e8;} /* Footer */ #tempaltemo_footer a { color: #dcdde1;} #tempaltemo_footer a:hover { color: #68bb7d;} #tempaltemo_footer ul.footer-link-list li { padding-top: 10px;} #tempaltemo_footer ul.footer-icons li { width: 2.6em; height: 2.6em; line-height: 2.6em; } #tempaltemo_footer ul.footer-icons li:hover { background-color: #cfd6e1; transition: .5s; } #tempaltemo_footer ul.footer-icons li:hover i { color: #212934; transition: .5s; } #tempaltemo_footer .border-light { border-color: #2d343f !important;} /* // Extra small devices (portrait phones, less than 576px) // No media query since this is the default in Bootstrap */ /* Small devices (landscape phones, 576px and up)*/ .product-wap .h3, .product-wap li, .product-wap i, .product-wap p { font-size: 12px !important; } .product-wap .product-color-dot { width: 6px; height: 6px; } @media (min-width: 576px) { .tempaltemo-carousel .h1 { font-size: 1em !important;} } /*// Medium devices (tablets, 768px and up)*/ @media (min-width: 768px) { #templatemo_main_nav .navbar-nav {max-width: 450px;} } /* Large devices (desktops, 992px and up)*/ @media (min-width: 992px) { #templatemo_main_nav .navbar-nav {max-width: 550px;} #template-mo-zay-hero-carousel .carousel-item {min-height: 30rem !important;} .product-wap .h3, .product-wap li, .product-wap i, .product-wap p {font-size: 18px !important;} .product-wap .product-color-dot { width: 12px; height: 12px; } } /* Extra large devices (large desktops, 1200px and up)*/ @media (min-width: 1200px) {} -------------------- END OF FILE -------------------- FILE: RR com/assets/css/templatemo.min.css TYPE: CSS SIZE: 3.57 KB ------------------------------------------------------------ .h1,.h2,.h3,a,body,div,input,label,li,p,ul{font-family:Roboto,sans-serif}a,body,div,input,label,li,p,ul{font-size:18px!important;font-weight:300!important}.h1{font-size:48px!important;font-weight:200!important}.h2{font-size:30px!important;font-weight:300}.h3{font-size:22px!important}.logo{font-weight:500!important}.text-warning{color:#ede861!important}.text-muted{color:#bcbcbc!important}.text-success{color:#59ab6e!important}.text-light{color:#cfd6e1!important}.bg-dark{background-color:#212934!important}.bg-light{background-color:#e9eef5!important}.bg-black{background-color:#1d242d!important}.bg-success,.btn-success{background-color:#59ab6e!important}.btn-success{border-color:#56ae6c!important}.pagination .page-link.active,.pagination .page-link:hover{background-color:#69bb7e;color:#fff}#templatemo_nav_top{min-height:40px}#templatemo_nav_top *{font-size:.9em!important}#templatemo_main_nav a{color:#212934}#templatemo_main_nav a:hover{color:#69bb7e}#templatemo_main_nav .navbar .nav-icon{margin-right:20px}#template-mo-zay-hero-carousel{background:#efefef!important}.templatemo-accordion a{color:#000}.templatemo-accordion a:hover{color:#333d4a}.shop-top-menu a:hover{color:#69bb7e!important}.product-wap{box-shadow:0 5px 10px 0 rgba(0,0,0,.1)}.product-wap .product-color-dot.color-dot-red{background:#f71515}.product-wap .product-color-dot.color-dot-blue{background:#6db4fe}.product-wap .product-color-dot.color-dot-black{background:#000}.product-wap .product-color-dot.color-dot-light{background:#e0e0e0}.product-wap .product-color-dot.color-dot-green{background:#0bff7e}.card.product-wap .card .product-overlay{background:rgba(0,0,0,.2);visibility:hidden;opacity:0;transition:.3s}.card.product-wap:hover .card .product-overlay{visibility:visible;opacity:1}.card.product-wap a{color:#000}#carousel-related-product .slick-slide:focus{outline:0!important}#carousel-related-product .slick-dots li button:before{font-size:15px;margin-top:20px}.brand-img{filter:grayscale(100%);opacity:.5;transition:.5s}.brand-img:hover{filter:grayscale(0);opacity:1}#template-mo-zay-hero-carousel .carousel-indicators li{margin-top:-50px;background-color:#59ab6e}#template-mo-zay-hero-carousel .carousel-control-next i,#template-mo-zay-hero-carousel .carousel-control-prev i{color:#59ab6e!important;font-size:2.8em!important}.tempaltemo-carousel .h1{font-size:.5em!important;color:#000!important}.services-icon-wap{transition:.3s}.services-icon-wap:hover,.services-icon-wap:hover i{color:#fff}.services-icon-wap:hover{background:#69bb7e}.leaflet-control,.leaflet-control a{font-size:10px!important}.form-control{border:1px solid #e8e8e8}#tempaltemo_footer a{color:#dcdde1}#tempaltemo_footer a:hover{color:#68bb7d}#tempaltemo_footer ul.footer-link-list li{padding-top:10px}#tempaltemo_footer ul.footer-icons li{width:2.6em;height:2.6em;line-height:2.6em}#tempaltemo_footer ul.footer-icons li:hover{background-color:#cfd6e1;transition:.5s}#tempaltemo_footer ul.footer-icons li:hover i{color:#212934;transition:.5s}#tempaltemo_footer .border-light{border-color:#2d343f!important}.product-wap .h3,.product-wap i,.product-wap li,.product-wap p{font-size:12px!important}.product-wap .product-color-dot{width:6px;height:6px}@media (min-width:576px){.tempaltemo-carousel .h1{font-size:1em!important}}@media (min-width:768px){#templatemo_main_nav .navbar-nav{max-width:450px}}@media (min-width:992px){#templatemo_main_nav .navbar-nav{max-width:550px}#template-mo-zay-hero-carousel .carousel-item{min-height:30rem!important}.product-wap .h3,.product-wap i,.product-wap li,.product-wap p{font-size:18px!important}.product-wap .product-color-dot{width:12px;height:12px}} -------------------- END OF FILE -------------------- FILE: RR com/assets/js/bootstrap.bundle.min.js TYPE: JS SIZE: 78.93 KB ------------------------------------------------------------ /*! * Bootstrap v5.0.0-beta1 (https://getbootstrap.com/) * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";function t(t,e){for(var n=0;n0,i._pointerEvent=Boolean(window.PointerEvent),i._addEventListeners(),i}i(o,t);var r=o.prototype;return r.next=function(){this._isSliding||this._slide("next")},r.nextWhenVisible=function(){!document.hidden&&g(this._element)&&this.next()},r.prev=function(){this._isSliding||this._slide("prev")},r.pause=function(t){t||(this._isPaused=!0),q.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(f(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},r.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},r.to=function(t){var e=this;this._activeElement=q.findOne(".active.carousel-item",this._element);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)H.one(this._element,"slid.bs.carousel",(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?"next":"prev";this._slide(i,this._items[t])}},r.dispose=function(){t.prototype.dispose.call(this),H.off(this._element,V),this._items=null,this._config=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},r._getConfig=function(t){return t=n({},X,t),p(z,t,$),t},r._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},r._addEventListeners=function(){var t=this;this._config.keyboard&&H.on(this._element,"keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&(H.on(this._element,"mouseenter.bs.carousel",(function(e){return t.pause(e)})),H.on(this._element,"mouseleave.bs.carousel",(function(e){return t.cycle(e)}))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()},r._addTouchEventListeners=function(){var t=this,e=function(e){t._pointerEvent&&G[e.pointerType.toUpperCase()]?t.touchStartX=e.clientX:t._pointerEvent||(t.touchStartX=e.touches[0].clientX)},n=function(e){t._pointerEvent&&G[e.pointerType.toUpperCase()]&&(t.touchDeltaX=e.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};q.find(".carousel-item img",this._element).forEach((function(t){H.on(t,"dragstart.bs.carousel",(function(t){return t.preventDefault()}))})),this._pointerEvent?(H.on(this._element,"pointerdown.bs.carousel",(function(t){return e(t)})),H.on(this._element,"pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(H.on(this._element,"touchstart.bs.carousel",(function(t){return e(t)})),H.on(this._element,"touchmove.bs.carousel",(function(e){return function(e){e.touches&&e.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.touches[0].clientX-t.touchStartX}(e)})),H.on(this._element,"touchend.bs.carousel",(function(t){return n(t)})))},r._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.key){case"ArrowLeft":t.preventDefault(),this.prev();break;case"ArrowRight":t.preventDefault(),this.next()}},r._getItemIndex=function(t){return this._items=t&&t.parentNode?q.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)},r._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+("prev"===t?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},r._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(q.findOne(".active.carousel-item",this._element));return H.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n})},r._setActiveIndicatorElement=function(t){if(this._indicatorsElement){for(var e=q.find(".active",this._indicatorsElement),n=0;n0)for(var i=0;i=0}function wt(t){return((ht(t)?t.ownerDocument:t.document)||window.document).documentElement}function Et(t){return"html"===ft(t)?t:t.assignedSlot||t.parentNode||t.host||wt(t)}function Tt(t){if(!pt(t)||"fixed"===bt(t).position)return null;var e=t.offsetParent;if(e){var n=wt(e);if("body"===ft(e)&&"static"===bt(e).position&&"static"!==bt(n).position)return n}return e}function kt(t){for(var e=dt(t),n=Tt(t);n&&yt(n)&&"static"===bt(n).position;)n=Tt(n);return n&&"body"===ft(n)&&"static"===bt(n).position?e:n||function(t){for(var e=Et(t);pt(e)&&["html","body"].indexOf(ft(e))<0;){var n=bt(e);if("none"!==n.transform||"none"!==n.perspective||n.willChange&&"auto"!==n.willChange)return e;e=e.parentNode}return null}(t)||e}function Ot(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Lt(t,e,n){return Math.max(t,Math.min(e,n))}function At(t){return Object.assign(Object.assign({},{top:0,right:0,bottom:0,left:0}),t)}function Ct(t,e){return e.reduce((function(e,n){return e[n]=t,e}),{})}var Dt={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,n=t.state,i=t.name,o=n.elements.arrow,r=n.modifiersData.popperOffsets,s=mt(n.placement),a=Ot(s),l=[st,rt].indexOf(s)>=0?"height":"width";if(o&&r){var c=n.modifiersData[i+"#persistent"].padding,u=vt(o),f="y"===a?it:st,d="y"===a?ot:rt,h=n.rects.reference[l]+n.rects.reference[a]-r[a]-n.rects.popper[l],p=r[a]-n.rects.reference[a],g=kt(o),m=g?"y"===a?g.clientHeight||0:g.clientWidth||0:0,v=h/2-p/2,_=c[f],b=m-u[l]-c[d],y=m/2-u[l]/2+v,w=Lt(_,y,b),E=a;n.modifiersData[i]=((e={})[E]=w,e.centerOffset=w-y,e)}},effect:function(t){var e=t.state,n=t.options,i=t.name,o=n.element,r=void 0===o?"[data-popper-arrow]":o,s=n.padding,a=void 0===s?0:s;null!=r&&("string"!=typeof r||(r=e.elements.popper.querySelector(r)))&&_t(e.elements.popper,r)&&(e.elements.arrow=r,e.modifiersData[i+"#persistent"]={padding:At("number"!=typeof a?a:Ct(a,at))})},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},xt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function St(t){var e,n=t.popper,i=t.popperRect,o=t.placement,r=t.offsets,s=t.position,a=t.gpuAcceleration,l=t.adaptive,c=function(t){var e=t.x,n=t.y,i=window.devicePixelRatio||1;return{x:Math.round(e*i)/i||0,y:Math.round(n*i)/i||0}}(r),u=c.x,f=c.y,d=r.hasOwnProperty("x"),h=r.hasOwnProperty("y"),p=st,g=it,m=window;if(l){var v=kt(n);v===dt(n)&&(v=wt(n)),o===it&&(g=ot,f-=v.clientHeight-i.height,f*=a?1:-1),o===st&&(p=rt,u-=v.clientWidth-i.width,u*=a?1:-1)}var _,b=Object.assign({position:s},l&&xt);return a?Object.assign(Object.assign({},b),{},((_={})[g]=h?"0":"",_[p]=d?"0":"",_.transform=(m.devicePixelRatio||1)<2?"translate("+u+"px, "+f+"px)":"translate3d("+u+"px, "+f+"px, 0)",_)):Object.assign(Object.assign({},b),{},((e={})[g]=h?f+"px":"",e[p]=d?u+"px":"",e.transform="",e))}var jt={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,n=t.options,i=n.gpuAcceleration,o=void 0===i||i,r=n.adaptive,s=void 0===r||r,a={placement:mt(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign(Object.assign({},e.styles.popper),St(Object.assign(Object.assign({},a),{},{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign(Object.assign({},e.styles.arrow),St(Object.assign(Object.assign({},a),{},{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1})))),e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{},{"data-popper-placement":e.placement})},data:{}},Nt={passive:!0};var It={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,n=t.instance,i=t.options,o=i.scroll,r=void 0===o||o,s=i.resize,a=void 0===s||s,l=dt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return r&&c.forEach((function(t){t.addEventListener("scroll",n.update,Nt)})),a&&l.addEventListener("resize",n.update,Nt),function(){r&&c.forEach((function(t){t.removeEventListener("scroll",n.update,Nt)})),a&&l.removeEventListener("resize",n.update,Nt)}},data:{}},Pt={left:"right",right:"left",bottom:"top",top:"bottom"};function Mt(t){return t.replace(/left|right|bottom|top/g,(function(t){return Pt[t]}))}var Bt={start:"end",end:"start"};function Ht(t){return t.replace(/start|end/g,(function(t){return Bt[t]}))}function Rt(t){var e=t.getBoundingClientRect();return{width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function Wt(t){var e=dt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Kt(t){return Rt(wt(t)).left+Wt(t).scrollLeft}function Qt(t){var e=bt(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+i)}function Ut(t,e){void 0===e&&(e=[]);var n=function t(e){return["html","body","#document"].indexOf(ft(e))>=0?e.ownerDocument.body:pt(e)&&Qt(e)?e:t(Et(e))}(t),i="body"===ft(n),o=dt(n),r=i?[o].concat(o.visualViewport||[],Qt(n)?n:[]):n,s=e.concat(r);return i?s:s.concat(Ut(Et(r)))}function Ft(t){return Object.assign(Object.assign({},t),{},{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Yt(t,e){return"viewport"===e?Ft(function(t){var e=dt(t),n=wt(t),i=e.visualViewport,o=n.clientWidth,r=n.clientHeight,s=0,a=0;return i&&(o=i.width,r=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=i.offsetLeft,a=i.offsetTop)),{width:o,height:r,x:s+Kt(t),y:a}}(t)):pt(e)?function(t){var e=Rt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Ft(function(t){var e=wt(t),n=Wt(t),i=t.ownerDocument.body,o=Math.max(e.scrollWidth,e.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),r=Math.max(e.scrollHeight,e.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),s=-n.scrollLeft+Kt(t),a=-n.scrollTop;return"rtl"===bt(i||e).direction&&(s+=Math.max(e.clientWidth,i?i.clientWidth:0)-o),{width:o,height:r,x:s,y:a}}(wt(t)))}function qt(t,e,n){var i="clippingParents"===e?function(t){var e=Ut(Et(t)),n=["absolute","fixed"].indexOf(bt(t).position)>=0&&pt(t)?kt(t):t;return ht(n)?e.filter((function(t){return ht(t)&&_t(t,n)&&"body"!==ft(t)})):[]}(t):[].concat(e),o=[].concat(i,[n]),r=o[0],s=o.reduce((function(e,n){var i=Yt(t,n);return e.top=Math.max(i.top,e.top),e.right=Math.min(i.right,e.right),e.bottom=Math.min(i.bottom,e.bottom),e.left=Math.max(i.left,e.left),e}),Yt(t,r));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}function zt(t){return t.split("-")[1]}function Vt(t){var e,n=t.reference,i=t.element,o=t.placement,r=o?mt(o):null,s=o?zt(o):null,a=n.x+n.width/2-i.width/2,l=n.y+n.height/2-i.height/2;switch(r){case it:e={x:a,y:n.y-i.height};break;case ot:e={x:a,y:n.y+n.height};break;case rt:e={x:n.x+n.width,y:l};break;case st:e={x:n.x-i.width,y:l};break;default:e={x:n.x,y:n.y}}var c=r?Ot(r):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case"start":e[c]=Math.floor(e[c])-Math.floor(n[u]/2-i[u]/2);break;case"end":e[c]=Math.floor(e[c])+Math.ceil(n[u]/2-i[u]/2)}}return e}function Xt(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=void 0===i?t.placement:i,r=n.boundary,s=void 0===r?"clippingParents":r,a=n.rootBoundary,l=void 0===a?"viewport":a,c=n.elementContext,u=void 0===c?"popper":c,f=n.altBoundary,d=void 0!==f&&f,h=n.padding,p=void 0===h?0:h,g=At("number"!=typeof p?p:Ct(p,at)),m="popper"===u?"reference":"popper",v=t.elements.reference,_=t.rects.popper,b=t.elements[d?m:u],y=qt(ht(b)?b:b.contextElement||wt(t.elements.popper),s,l),w=Rt(v),E=Vt({reference:w,element:_,strategy:"absolute",placement:o}),T=Ft(Object.assign(Object.assign({},_),E)),k="popper"===u?T:w,O={top:y.top-k.top+g.top,bottom:k.bottom-y.bottom+g.bottom,left:y.left-k.left+g.left,right:k.right-y.right+g.right},L=t.modifiersData.offset;if("popper"===u&&L){var A=L[o];Object.keys(O).forEach((function(t){var e=[rt,ot].indexOf(t)>=0?1:-1,n=[it,ot].indexOf(t)>=0?"y":"x";O[t]+=A[n]*e}))}return O}function $t(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=n.boundary,r=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?ct:l,u=zt(i),f=u?a?lt:lt.filter((function(t){return zt(t)===u})):at,d=f.filter((function(t){return c.indexOf(t)>=0}));0===d.length&&(d=f);var h=d.reduce((function(e,n){return e[n]=Xt(t,{placement:n,boundary:o,rootBoundary:r,padding:s})[mt(n)],e}),{});return Object.keys(h).sort((function(t,e){return h[t]-h[e]}))}var Gt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name;if(!e.modifiersData[i]._skip){for(var o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,f=n.rootBoundary,d=n.altBoundary,h=n.flipVariations,p=void 0===h||h,g=n.allowedAutoPlacements,m=e.options.placement,v=mt(m),_=l||(v===m||!p?[Mt(m)]:function(t){if("auto"===mt(t))return[];var e=Mt(t);return[Ht(t),e,Ht(e)]}(m)),b=[m].concat(_).reduce((function(t,n){return t.concat("auto"===mt(n)?$t(e,{placement:n,boundary:u,rootBoundary:f,padding:c,flipVariations:p,allowedAutoPlacements:g}):n)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,T=!0,k=b[0],O=0;O=0,x=D?"width":"height",S=Xt(e,{placement:L,boundary:u,rootBoundary:f,altBoundary:d,padding:c}),j=D?C?rt:st:C?ot:it;y[x]>w[x]&&(j=Mt(j));var N=Mt(j),I=[];if(r&&I.push(S[A]<=0),a&&I.push(S[j]<=0,S[N]<=0),I.every((function(t){return t}))){k=L,T=!1;break}E.set(L,I)}if(T)for(var P=function(t){var e=b.find((function(e){var n=E.get(e);if(n)return n.slice(0,t).every((function(t){return t}))}));if(e)return k=e,"break"},M=p?3:1;M>0;M--){if("break"===P(M))break}e.placement!==k&&(e.modifiersData[i]._skip=!0,e.placement=k,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Zt(t,e,n){return void 0===n&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function Jt(t){return[it,rt,ot,st].some((function(e){return t[e]>=0}))}var te={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,n=t.name,i=e.rects.reference,o=e.rects.popper,r=e.modifiersData.preventOverflow,s=Xt(e,{elementContext:"reference"}),a=Xt(e,{altBoundary:!0}),l=Zt(s,i),c=Zt(a,o,r),u=Jt(l),f=Jt(c);e.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:f},e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{},{"data-popper-reference-hidden":u,"data-popper-escaped":f})}};var ee={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.offset,r=void 0===o?[0,0]:o,s=ct.reduce((function(t,n){return t[n]=function(t,e,n){var i=mt(t),o=[st,it].indexOf(i)>=0?-1:1,r="function"==typeof n?n(Object.assign(Object.assign({},e),{},{placement:t})):n,s=r[0],a=r[1];return s=s||0,a=(a||0)*o,[st,rt].indexOf(i)>=0?{x:a,y:s}:{x:s,y:a}}(n,e.rects,r),t}),{}),a=s[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[i]=s}};var ne={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,n=t.name;e.modifiersData[n]=Vt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}};var ie={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,f=n.padding,d=n.tether,h=void 0===d||d,p=n.tetherOffset,g=void 0===p?0:p,m=Xt(e,{boundary:l,rootBoundary:c,padding:f,altBoundary:u}),v=mt(e.placement),_=zt(e.placement),b=!_,y=Ot(v),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,T=e.rects.reference,k=e.rects.popper,O="function"==typeof g?g(Object.assign(Object.assign({},e.rects),{},{placement:e.placement})):g,L={x:0,y:0};if(E){if(r){var A="y"===y?it:st,C="y"===y?ot:rt,D="y"===y?"height":"width",x=E[y],S=E[y]+m[A],j=E[y]-m[C],N=h?-k[D]/2:0,I="start"===_?T[D]:k[D],P="start"===_?-k[D]:-T[D],M=e.elements.arrow,B=h&&M?vt(M):{width:0,height:0},H=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=H[A],W=H[C],K=Lt(0,T[D],B[D]),Q=b?T[D]/2-N-K-R-O:I-K-R-O,U=b?-T[D]/2+N+K+W+O:P+K+W+O,F=e.elements.arrow&&kt(e.elements.arrow),Y=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,q=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,z=E[y]+Q-q-Y,V=E[y]+U-q,X=Lt(h?Math.min(S,z):S,x,h?Math.max(j,V):j);E[y]=X,L[y]=X-x}if(a){var $="x"===y?it:st,G="x"===y?ot:rt,Z=E[w],J=Lt(Z+m[$],Z,Z-m[G]);E[w]=J,L[w]=J-Z}e.modifiersData[i]=L}},requiresIfExists:["offset"]};function oe(t,e,n){void 0===n&&(n=!1);var i,o,r=wt(e),s=Rt(t),a=pt(e),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(a||!a&&!n)&&(("body"!==ft(e)||Qt(r))&&(l=(i=e)!==dt(i)&&pt(i)?{scrollLeft:(o=i).scrollLeft,scrollTop:o.scrollTop}:Wt(i)),pt(e)?((c=Rt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=Kt(r))),{x:s.left+l.scrollLeft-c.x,y:s.top+l.scrollTop-c.y,width:s.width,height:s.height}}function re(t){var e=new Map,n=new Set,i=[];return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){n.has(t.name)||function t(o){n.add(o.name),[].concat(o.requires||[],o.requiresIfExists||[]).forEach((function(i){if(!n.has(i)){var o=e.get(i);o&&t(o)}})),i.push(o)}(t)})),i}var se={placement:"bottom",modifiers:[],strategy:"absolute"};function ae(){for(var t=arguments.length,e=new Array(t),n=0;n0&&r--,"ArrowDown"===t.key&&rdocument.documentElement.clientHeight;e||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");var n=u(this._dialog);H.off(this._element,"transitionend"),H.one(this._element,"transitionend",(function(){t._element.classList.remove("modal-static"),e||(H.one(t._element,"transitionend",(function(){t._element.style.overflowY=""})),h(t._element,n))})),h(this._element,n),this._element.focus()}},r._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;(!this._isBodyOverflowing&&t&&!y||this._isBodyOverflowing&&!t&&y)&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),(this._isBodyOverflowing&&!t&&!y||!this._isBodyOverflowing&&t&&y)&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},r._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},r._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",container:!1,fallbackPlacements:null,boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:xe,popperConfig:null},He={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Re=function(t){function o(e,n){var i;if(void 0===de)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");return(i=t.call(this,e)||this)._isEnabled=!0,i._timeout=0,i._hoverState="",i._activeTrigger={},i._popper=null,i.config=i._getConfig(n),i.tip=null,i._setListeners(),i}i(o,t);var r=o.prototype;return r.enable=function(){this._isEnabled=!0},r.disable=function(){this._isEnabled=!1},r.toggleEnabled=function(){this._isEnabled=!this._isEnabled},r.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=T(t.delegateTarget,e);n||(n=new this.constructor(t.delegateTarget,this._getDelegateConfig()),E(t.delegateTarget,e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}},r.dispose=function(){clearTimeout(this._timeout),H.off(this._element,this.constructor.EVENT_KEY),H.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.parentNode.removeChild(this.tip),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.config=null,this.tip=null,t.prototype.dispose.call(this)},r.show=function(){var t=this;if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(this.isWithContent()&&this._isEnabled){var e=H.trigger(this._element,this.constructor.Event.SHOW),n=function t(e){if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){var n=e.getRootNode();return n instanceof ShadowRoot?n:null}return e instanceof ShadowRoot?e:e.parentNode?t(e.parentNode):null}(this._element),i=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(e.defaultPrevented||!i)return;var o=this.getTipElement(),r=s(this.constructor.NAME);o.setAttribute("id",r),this._element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&o.classList.add("fade");var a="function"==typeof this.config.placement?this.config.placement.call(this,o,this._element):this.config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);var c=this._getContainer();E(o,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||c.appendChild(o),H.trigger(this._element,this.constructor.Event.INSERTED),this._popper=fe(this._element,o,this._getPopperConfig(l)),o.classList.add("show");var f,d,p="function"==typeof this.config.customClass?this.config.customClass():this.config.customClass;if(p)(f=o.classList).add.apply(f,p.split(" "));if("ontouchstart"in document.documentElement)(d=[]).concat.apply(d,document.body.children).forEach((function(t){H.on(t,"mouseover",(function(){}))}));var g=function(){var e=t._hoverState;t._hoverState=null,H.trigger(t._element,t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(this.tip.classList.contains("fade")){var m=u(this.tip);H.one(this.tip,"transitionend",g),h(this.tip,m)}else g()}},r.hide=function(){var t=this;if(this._popper){var e=this.getTipElement(),n=function(){"show"!==t._hoverState&&e.parentNode&&e.parentNode.removeChild(e),t._cleanTipClass(),t._element.removeAttribute("aria-describedby"),H.trigger(t._element,t.constructor.Event.HIDDEN),t._popper&&(t._popper.destroy(),t._popper=null)};if(!H.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented){var i;if(e.classList.remove("show"),"ontouchstart"in document.documentElement)(i=[]).concat.apply(i,document.body.children).forEach((function(t){return H.off(t,"mouseover",m)}));if(this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this.tip.classList.contains("fade")){var o=u(e);H.one(e,"transitionend",n),h(e,o)}else n();this._hoverState=""}}},r.update=function(){null!==this._popper&&this._popper.update()},r.isWithContent=function(){return Boolean(this.getTitle())},r.getTipElement=function(){if(this.tip)return this.tip;var t=document.createElement("div");return t.innerHTML=this.config.template,this.tip=t.children[0],this.tip},r.setContent=function(){var t=this.getTipElement();this.setElementContent(q.findOne(".tooltip-inner",t),this.getTitle()),t.classList.remove("fade","show")},r.setElementContent=function(t,e){if(null!==t)return"object"==typeof e&&d(e)?(e.jquery&&(e=e[0]),void(this.config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this.config.html?(this.config.sanitize&&(e=Se(e,this.config.allowList,this.config.sanitizeFn)),t.innerHTML=e):t.textContent=e)},r.getTitle=function(){var t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this._element):this.config.title),t},r.updateAttachment=function(t){return"right"===t?"end":"left"===t?"start":t},r._getPopperConfig=function(t){var e=this,i={name:"flip",options:{altBoundary:!0}};return this.config.fallbackPlacements&&(i.options.fallbackPlacements=this.config.fallbackPlacements),n({},{placement:t,modifiers:[i,{name:"preventOverflow",options:{rootBoundary:this.config.boundary}},{name:"arrow",options:{element:"."+this.constructor.NAME+"-arrow"}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:function(t){return e._handlePopperPlacementChange(t)}}],onFirstUpdate:function(t){t.options.placement!==t.placement&&e._handlePopperPlacementChange(t)}},this.config.popperConfig)},r._addAttachmentClass=function(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))},r._getContainer=function(){return!1===this.config.container?document.body:d(this.config.container)?this.config.container:q.findOne(this.config.container)},r._getAttachment=function(t){return Me[t.toUpperCase()]},r._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)H.on(t._element,t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;H.on(t._element,n,t.config.selector,(function(e){return t._enter(e)})),H.on(t._element,i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t._element&&t.hide()},H.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=n({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},r._fixTitle=function(){var t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))},r._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||T(t.delegateTarget,n))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),E(t.delegateTarget,n,e)),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},r._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||T(t.delegateTarget,n))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),E(t.delegateTarget,n,e)),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},r._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},r._getConfig=function(t){var e=Y.getDataAttributes(this._element);return Object.keys(e).forEach((function(t){Ie.has(t)&&delete e[t]})),t&&"object"==typeof t.container&&t.container.jquery&&(t.container=t.container[0]),"number"==typeof(t=n({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),p(je,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.allowList,t.sanitizeFn)),t},r._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},r._cleanTipClass=function(){var t=this.getTipElement(),e=t.getAttribute("class").match(Ne);null!==e&&e.length>0&&e.map((function(t){return t.trim()})).forEach((function(e){return t.classList.remove(e)}))},r._handlePopperPlacementChange=function(t){var e=t.state;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))},o.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.tooltip"),n="object"==typeof t&&t;if((e||!/dispose|hide/.test(t))&&(e||(e=new o(this,n)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(o,null,[{key:"Default",get:function(){return Be}},{key:"NAME",get:function(){return je}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return He}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Pe}}]),o}(R);b((function(){var t=_();if(t){var e=t.fn[je];t.fn[je]=Re.jQueryInterface,t.fn[je].Constructor=Re,t.fn[je].noConflict=function(){return t.fn[je]=e,Re.jQueryInterface}}}));var We="popover",Ke=new RegExp("(^|\\s)bs-popover\\S+","g"),Qe=n({},Re.Default,{placement:"right",trigger:"click",content:"",template:''}),Ue=n({},Re.DefaultType,{content:"(string|element|function)"}),Fe={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Ye=function(t){function n(){return t.apply(this,arguments)||this}i(n,t);var o=n.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.setContent=function(){var t=this.getTipElement();this.setElementContent(q.findOne(".popover-header",t),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this._element)),this.setElementContent(q.findOne(".popover-body",t),e),t.classList.remove("fade","show")},o._addAttachmentClass=function(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))},o._getContent=function(){return this._element.getAttribute("data-bs-content")||this.config.content},o._cleanTipClass=function(){var t=this.getTipElement(),e=t.getAttribute("class").match(Ke);null!==e&&e.length>0&&e.map((function(t){return t.trim()})).forEach((function(e){return t.classList.remove(e)}))},n.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.popover"),i="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new n(this,i),E(this,"bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(n,null,[{key:"Default",get:function(){return Qe}},{key:"NAME",get:function(){return We}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return Fe}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Ue}}]),n}(Re);b((function(){var t=_();if(t){var e=t.fn[We];t.fn[We]=Ye.jQueryInterface,t.fn[We].Constructor=Ye,t.fn[We].noConflict=function(){return t.fn[We]=e,Ye.jQueryInterface}}}));var qe="scrollspy",ze={offset:10,method:"auto",target:""},Ve={offset:"number",method:"string",target:"(string|element)"},Xe=function(t){function o(e,n){var i;return(i=t.call(this,e)||this)._scrollElement="BODY"===e.tagName?window:e,i._config=i._getConfig(n),i._selector=i._config.target+" .nav-link, "+i._config.target+" .list-group-item, "+i._config.target+" .dropdown-item",i._offsets=[],i._targets=[],i._activeTarget=null,i._scrollHeight=0,H.on(i._scrollElement,"scroll.bs.scrollspy",(function(t){return i._process(t)})),i.refresh(),i._process(),i}i(o,t);var r=o.prototype;return r.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,i="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),q.find(this._selector).map((function(t){var e=l(t),o=e?q.findOne(e):null;if(o){var r=o.getBoundingClientRect();if(r.width||r.height)return[Y[n](o).top+i,e]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},r.dispose=function(){t.prototype.dispose.call(this),H.off(this._scrollElement,".bs.scrollspy"),this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},r._getConfig=function(t){if("string"!=typeof(t=n({},ze,"object"==typeof t&&t?t:{})).target&&d(t.target)){var e=t.target.id;e||(e=s(qe),t.target.id=e),t.target="#"+e}return p(qe,t,Ve),t},r._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},r._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},r._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},r._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t li > .active":".active";e=(e=q.find(o,i))[e.length-1]}var r=null;if(e&&(r=H.trigger(e,"hide.bs.tab",{relatedTarget:this._element})),!(H.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==r&&r.defaultPrevented)){this._activate(this._element,i);var s=function(){H.trigger(e,"hidden.bs.tab",{relatedTarget:t._element}),H.trigger(t._element,"shown.bs.tab",{relatedTarget:e})};n?this._activate(n,n.parentNode,s):s()}}},o._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?q.children(e,".active"):q.find(":scope > li > .active",e))[0],r=n&&o&&o.classList.contains("fade"),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=u(o);o.classList.remove("show"),H.one(o,"transitionend",s),h(o,a)}else s()},o._transitionComplete=function(t,e,n){if(e){e.classList.remove("active");var i=q.findOne(":scope > .dropdown-menu .active",e.parentNode);i&&i.classList.remove("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}(t.classList.add("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),v(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&t.parentNode.classList.contains("dropdown-menu"))&&(t.closest(".dropdown")&&q.find(".dropdown-toggle").forEach((function(t){return t.classList.add("active")})),t.setAttribute("aria-expanded",!0));n&&n()},n.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.tab")||new n(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(n,null,[{key:"DATA_KEY",get:function(){return"bs.tab"}}]),n}(R);H.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){t.preventDefault(),(T(this,"bs.tab")||new $e(this)).show()})),b((function(){var t=_();if(t){var e=t.fn.tab;t.fn.tab=$e.jQueryInterface,t.fn.tab.Constructor=$e,t.fn.tab.noConflict=function(){return t.fn.tab=e,$e.jQueryInterface}}}));var Ge={animation:"boolean",autohide:"boolean",delay:"number"},Ze={animation:!0,autohide:!0,delay:5e3},Je=function(t){function o(e,n){var i;return(i=t.call(this,e)||this)._config=i._getConfig(n),i._timeout=null,i._setListeners(),i}i(o,t);var r=o.prototype;return r.show=function(){var t=this;if(!H.trigger(this._element,"show.bs.toast").defaultPrevented){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var e=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),H.trigger(t._element,"shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),v(this._element),this._element.classList.add("showing"),this._config.animation){var n=u(this._element);H.one(this._element,"transitionend",e),h(this._element,n)}else e()}},r.hide=function(){var t=this;if(this._element.classList.contains("show")&&!H.trigger(this._element,"hide.bs.toast").defaultPrevented){var e=function(){t._element.classList.add("hide"),H.trigger(t._element,"hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=u(this._element);H.one(this._element,"transitionend",e),h(this._element,n)}else e()}},r.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),H.off(this._element,"click.dismiss.bs.toast"),t.prototype.dispose.call(this),this._config=null},r._getConfig=function(t){return t=n({},Ze,Y.getDataAttributes(this._element),"object"==typeof t&&t?t:{}),p("toast",t,this.constructor.DefaultType),t},r._setListeners=function(){var t=this;H.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',(function(){return t.hide()}))},r._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},o.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.toast");if(e||(e=new o(this,"object"==typeof t&&t)),"string"==typeof t){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t](this)}}))},e(o,null,[{key:"DefaultType",get:function(){return Ge}},{key:"Default",get:function(){return Ze}},{key:"DATA_KEY",get:function(){return"bs.toast"}}]),o}(R);return b((function(){var t=_();if(t){var e=t.fn.toast;t.fn.toast=Je.jQueryInterface,t.fn.toast.Constructor=Je,t.fn.toast.noConflict=function(){return t.fn.toast=e,Je.jQueryInterface}}})),{Alert:K,Button:Q,Carousel:Z,Collapse:nt,Dropdown:Te,Modal:Le,Popover:Ye,ScrollSpy:Xe,Tab:$e,Toast:Je,Tooltip:Re}})); //# sourceMappingURL=bootstrap.bundle.min.js.map -------------------- END OF FILE -------------------- FILE: RR com/assets/js/custom.js TYPE: JS SIZE: 0 B ------------------------------------------------------------ -------------------- END OF FILE -------------------- FILE: RR com/assets/js/jquery-1.11.0.min.js TYPE: JS SIZE: 94.12 KB ------------------------------------------------------------ /*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f }}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("