Jump to content

Crearea unui User Control Panel conectat la baza de date [Partea 1-2]


ImpulsE

Recommended Posts

Salutare, astăzi am decis să incep o serie de tutoriale cu ajutorul cărora sper să învățați puțin PHP, moduri de securizare ale unui site PHP și de ce lucruri esențiale are nevoie un User Control Panel ca să fie folositor pentru jucători cât și pentru staff. Țin să precizez că nu o să pun mare accent pe aspectul site-ului până când nu terminăm crearea întregului panel. După ce terminăm UCP-ul este posibil să mai fac și vreo două tutoriale în care să vă explic și câteva lucruri de bază despre cum ar trebui aranjat un UCP.
În acest tutorial o să creăm un User Panel Control care poate fi utilizat la aproape orice server care are o bază de date MySQL.

Fișiere și programe necesare:

Un program sau un webserver pe care să încărcați fișierele necesare UCP-ului și o bază de date MySQL. (Exemple de programe: wamp, xampp)
Un program cu ajutorul căruia puteți edita fișiere PHP, HTML și CSS cu care să fiți obișnuiți și să vă placă să lucrați în el.


Partea I a tutorialului:

Quote

 

((Crearea conexiunii la baza de date și scrierea câtorva informații despre server pe site-ul nostru.))

1.Pentru început o să creăm un fișier nou și o să îl denumim index.php, în acest fișier o să facem pagina principală a site-ului, pe această pagină intră utilizatorii în momentul în care ne accesează site-ul.

<html>
  <head>
    <title>Titlul site-ului</title> <!-- Aici trecem numele site-ului nostru -->
  </head>
  <body>
    <!-- Aici o să scriem tot ce trebuie să apară pe site. -->
  </body>
</html>


Cam așa arată pagina noastră la început, cu timpul o să tot adăugăm informații noi, dar acum trebuie să avem o pagină standard pe care se pot conecta utilizatori și nu o să le apară că pagina nu există.

2.Acum o să creăm un fișier nou în care o să ne conectăm la baza de date și o să citim sau inserăm diferite lucruri în aceasta și o să îl denumim connection.php

<?php
//Aici o să ne scriem întregul cod PHP.
?>


Acum o să facem conexiunea la baza de date, am pus mai multe explicații despre cod în comentariile din cod, cam așa ar trebui să arate noul nostru cod în pagina connection.php cu funcția de conectare la baza de date făcută:

<?php
//Aici o să ne scriem întregul cod PHP.
class Connection { //Aceasta este o clasă, este ca și un panou cu mai multe ”butoane” pe care le putem apăsa dacă dorim să executăm o acțiune.
	private static $instance; //O să ne folosim de acestă variabilă când citim de pe o pagină diferită informații din baza de date.  
    public static $con;    //Aici definim numele variabilului în care se află ”conexiunea”.
    
    private function __construct() { //Această functie este un __construct care să spunem că pornește automat când ”pornim panoul” adică class-ul.
        $db['mysql'] = array( //Aici definim datele necesare conexiunii la baza de date.
            'host'         =>     '127.0.0.1', //Aici punem IP-ul adică host-ul bazei noastre de date.
            'username'     =>     'root', //Aici punem username-ul cu care ne conectăm la baza de date.
            'password'     =>     '', //Aici punem parola pe care o folosim în momentul autentificării în baza de date.
            'dbname'     =>     'samp' //Aici scriem numele bazei de date la care dorim să ne conectăm.
        );

        try { //Încercăm să vedem dacă funcționează conexiunea fără erori.
            self::$con = new PDO('mysql:host='.$db['mysql']['host'].';dbname='.$db['mysql']['dbname'].';charset=utf8',$db['mysql']['username'],$db['mysql']['password']); //Aici executăm conexiunea.
            self::$con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            self::$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) { //Dacă nu functionează o să ne arate o eroare care nu poate fi folosită de alte persoane să afle date despre baza noastră de date.
            echo $e->getMessage();
        }
    }    
	
	public static function init() //Avem nevoie de această funcție ca să putem folosii restul funcțiilor noastre și pe pagina principală.
	{
		if (is_null(self::$instance))
		{
			self::$instance = new self();
		}
		return self::$instance;
	}	  
}
?>


Acum, ca să ne funcționeze acest cod și pe pagina principală trebuie să il includem, punem această linie de cod chiar la începutul paginii index.php:

<?php require_once('connection.php'); ?>


Acum o să citim din baza noastră de date numărul de conturi create pe server și o să le afișăm. Pentru început intrăm în pagina connection.php și înainte de închiderea ultimei acolade și ?> punem următorul cod:

    

    public static function getRegistredPlayers() { //Aici definim numele funcției cu ajutorul căreia o să aflăm numărul de conturi înregistrate pe server.
        try{
        $q = self::$con->prepare("SELECT COUNT(*) FROM `TABEL_CONTURI`"); //Aici executăm comanda de căutare a conturilor și numărarea lor în baza de date.
        $q->execute();
        $numar_conturi = $q->fetchColumn(); //Aici numărăm conturile existente în baza de date.
        return $numar_conturi;
        } catch (PDOException $e) {
            echo $e->getMessage();
        }    
    }    


Acum ne întoarcem la pagina index.php ca să afișăm numărul de conturi existente în baza de date. Următoarea linie de cod trebuie pusă în interiorul tag-urilor de <body></body>

Conturi existente: <?php echo Connection::init()->getRegistredPlayers(Connection::$con); //Executăm funcția de numărare a conturilor și le afisăm pe pagină. ?>

 

 

 

 

Partea a II-a a tutorialului:

Quote

((Crearea unei pagini de login și crearea unui profil pentru utilizator.))

Intrăm pe pagina index.php și chiar după linia cu <body> trecem următorul cod care o să ne redirecționeze la pagina de login dacă dăm click pe text:

<a href="login.php">Click aici pentru login</a><!--Aici trebuie să dea click utilizatorul ca să intre pe pagina de login.

Acum o să creăm un fișier nou și o să îl denumim login.php și punem următorul cod în el:

<?php session_start(); //Pornim o sesiune pe care o să o folosim pentru stocarea datelor despre jucător. ?>
<head>
<title>Titlul paginii</title>
</head>
<?php
require_once('connection.php'); //Aici solicităm pagina pe care avem funcțiile de conectare la baza de date.

După ce am adăugat codul trebuie să verificăm dacă utilizatorul este deja logat pe vreun cont sau nu, dacă acesta nu este logat pe niciun cont poate să dea login, dacă este deja logat o să îl redirecționăm la pagina de profil:

if(isset($_SESSION["user_username"])){ //Verificăm dacă este setată sesiunea cu numele utilizatorului, dacă este deja setată înseamnă că acesta este deja logat și o să îl redirecționăm pe pagina de profil.
	header('Location: profile.php'); //Aici îl redirecționăm pe pagina de profil.
	exit(); //Aici ne asigurăm că nu poate continua navigarea pe pagina de login chiar dacă nu este redirecționat către profil.
} else { //Aici o să punem codul dacă acesta nu este încă logat.

Acum că ne-am asigurat că acesta nu este logat pe niciun cont putem începe scrierea codului pentru login:

if(isset($_POST['login_submit'])){ //Verificăm dacă a fost apăsat sau nu butonul de login.
	if (!isset($_SESSION['token'])) { return false; } //Verificăm dacă este setată sesiunea numită ”token”.
	else if (!isset($_POST['login_token'])) { return false; } //Verificăm dacă există în post-ul userului input-ul ”login_token”.
	else if ($_SESSION['token'] !== $_POST['login_token']) { return false; } //Verificăm dacă input-ul diferă de sesiune, dacă diferă înseamnă că a fost modificat ceva de utilizator și nu este bine.
	else if ($_SESSION['token'] === $_POST['login_token']) {  //Verificăm dacă input-ul este similar cu sesiunea.
		if(Connection::init()->checkIfUserExists(Connection::$con, $_POST['login_name'], $_POST['login_password']) == 1){ //Ne asigurăm că numele și parola pe care încearcă să se logheze jucătorul există.
			$_SESSION["user_username"] = $_POST['login_name']; //Setăm sesiunea cu numele jucătorului.
			$_SESSION["user_id"] = Connection::init()->getUserID(Connection::$con, $_POST['login_name']); //Setăm sesiunea cu ID-ul din baza de date a utilizatorului.
			header('Location: profile.php'); //Aici îl redirecționăm pe pagina de profil după logare.
			exit(); //Aici ne asigurăm că nu poate continua navigarea pe pagina de login chiar dacă nu este redirecționat către profil.
		} else {
			header('Location: login.php'); //Aici îl redirecționăm înapoi pe pagina de login dacă contul este inexistent.
			exit(); //Aici ne asigurăm că nu poate continua navigarea pe pagina de login chiar dacă nu este redirecționat către pagina de login.
		}
		return true; 
	}
	else { return false; }	
} else {
	$token = md5(uniqid(rand(), true)); //Creăm un token unic și criptat.
	$_SESSION['token'] = $token; //Setăm sesiunea ”token”.
}
?>

Precizez că în mod normal trebuia scris prima dată codul HTML și după cel PHP dar am ales să îl pun în ordinea în care apare codul pe pagină ca să nu vă derutez și mai mult.

Acum putem scrie codul HTML pentru form-ul de login:

    
<b>Login</b> <!-- Acesta este un titlu simplu care apare peste form-ul de login. -->
<hr /> <!-- Aceasta este o linie care desparte titlul de form. -->
<form action="" method="post"> <!-- Aici începem form-ul de login. -->
	<label for="login_name">Nume utilizator: </label><input type="text" name="login_name"/><br /> <!-- Aici o să își scrie utilizatorul numele. -->
	<input type="hidden" name="login_token" value="<?php echo $token; ?>"> <!--Această linie ne folosește să creăm un cod unic pentru fiecare login și să ne asigurăm că nu ”se joacă” cineva cu sistemul nostru de login.-->
	<label for="login_password">Parola utilizator: </label><input type="password" name="login_password" /><br /> <!-- Aici o să își scrie utilizatorul parola. -->
	<button type="submit" name="login_submit">Logare</a></button> <!-- Acesta este butonul care trebuie apăsat să ne logăm. -->
</form>
<?php } ?> <!-- Închidem acolada pusă mai sus la codul în care am verificat dacă utilizatorul este logat pe alt cont sau nu. -->

Acum că am terminat pagina de login intrăm pe pagina connection.php și punem următorul cod înainte de închiderea ultimei acolade și ?>

	public static function checkIfUserExists($con, $username, $password) { //Aici definim numele funcției cu ajutorul căreia o să aflăm numărul de conturi înregistrate pe server.
		try{
			$stmt = Connection::$con->prepare("SELECT COUNT(*) FROM `TABEL_CONTURI` WHERE `Username` = :username AND `Password` = :password LIMIT 0,1");
			$stmt->bindParam(':username', $username,PDO::PARAM_STR);
			$stmt->bindParam(':password', $password,PDO::PARAM_STR);
			$stmt->execute();
			$exists = $stmt->fetchColumn();
			return $exists;
		} catch (PDOException $e) {
			echo $e->getMessage();
		}	
	}
	
	public static function getUserData($con, $userid, $data) { //Aici definim numele funcției cu ajutorul căreia o să aflăm numărul de conturi înregistrate pe server.
		try{
			$stmt = Connection::$con->prepare("SELECT `".$data."` FROM `TABEL_CONTURI` WHERE `UserID` = :userid");
			$stmt->bindParam(':userid', $userid,PDO::PARAM_STR);
			$stmt->execute();
			$row = $stmt->fetch();
			return $row[$data];
		} catch (PDOException $e) {
			echo $e->getMessage();
		}	
	}
	
	public static function getUserID($con, $username) { //Aici definim numele funcției cu ajutorul căreia o să aflăm numărul de conturi înregistrate pe server.
		try{
			$stmt = Connection::$con->prepare("SELECT `UserID` FROM `TABEL_CONTURI` WHERE `Username` = :username");
			$stmt->bindParam(':username', $username,PDO::PARAM_STR);
			$stmt->execute();
			$row = $stmt->fetch();
			return $row['UserID'];
		} catch (PDOException $e) {
			echo $e->getMessage();
		}	
	}

Acum o să creăm un fișier nou pe care o să îl denumim profile.php și punem următorul cod în el:

<?php
session_start(); //Pornim o sesiune pe care o să o folosim pentru login.
require_once('connection.php');

if(!isset($_SESSION["user_username"])){ //Verificăm dacă este setată sesiunea cu numele utilizatorului, dacă este deja setată înseamnă că acesta este deja logat și o să îl redirecționăm pe pagina de profil.
	header('Location: index.php'); //Aici îl redirecționăm pe pagina principala.
	exit(); //Aici ne asigurăm că nu poate continua navigarea pe pagina de login chiar dacă nu este redirecționat către profil.
} else { //Aici o să punem codul dacă acesta nu este încă logat.
	
$level = Connection::init()->getUserData(Connection::$con, $_SESSION["user_id"], "Level"); //Setăm ca variabila $level să aibă ca valoare nivelul contului citit din baza de date.
$money = Connection::init()->getUserData(Connection::$con, $_SESSION["user_id"], "Money"); //Setăm ca variabila $money să aibă ca valoare banii de pe contul jucătorului citit din baza de date.
$skin_id = Connection::init()->getUserData(Connection::$con, $_SESSION["user_id"], "Money"); //Setăm ca variabila $skin_id să aibă ca valoare skin-ul jucătorului citit din baza de date.
?>

<img src="http://weedarr.wdfiles.com/local--files/skinlistc/<?php echo $skin_id; ?>.png"> <!-- Punem o poză cu skin-ul utilizatorului pe pagină. -->
Level: <?php echo $level; ?>  <!-- Afișăm nivelul jucătorului. -->
Bani: <?php echo $money; ?>$ <!-- Afișăm banii deținuți de jucător. -->
<a href="logout.php">Click aici pentru logout</a><!--Aici trebuie să dea click utilizatorul ca să intre pe pagina de logout.
<?php } ?>

Cam așa ar arăta un profil foarte simplu și standard, voi desigur puteți citii mai multe date despre utilizator după modelele din cod și puteți aduce și alte modificări, dar eu am ales să fac un profil simplu în care să și pricepeți ceva.

Acum trebuie să facem un fișier nou numit logout.php în care punem următorul cod scurt:

<?php
session_start(); //Pornim o sesiune pe care o să o folosim pentru stocarea datelor despre jucător.

unset($_SESSION["user_username"]); //Oprim sesiunea cu numele utilizatorului.
unset($_SESSION["user_id"]); //Oprim sesiunea cu id-ul utilizatorului.

session_destroy(); //Distrugem sesiunea.
header('Location: index.php'); //Redirecționăm utilizatorul pe prima pagină.
exit();
?>

 

Aceasta ar fi prima parte a ghidului, nu o să intru în mai multe detalii în acest tutorial ca să nu vă încurc cu prea multe coduri din prima, o să fie puțin greu să urmați acest tutorial dacă  nu aveți cunoștințe în nicio limbă de programare web, dar o să încerc să explic cât mai bine.

Download panel: http://www.mediafire.com/download/3ou19n07p5ddu4p/Panel.rar

Despre ce o să fie partea a 3-a?: Crearea unui admin panel cu funcții RCON pentru panel-ul nostru.

Edited by ImpulsE
UPDATE: Partea a 2-a
  • Thanks 1
  • Upvote 9

Gh38gEQ.gif

Link to comment
Share on other sites

  • WopsS featured and pinned this topic

UPDATE:

  • A fost adăugată partea a 2-a a tutorialului în care vă explic cum să creați o pagină de login, un profil și o pagină de logout standard pentru panel.
  • Nu am creat și pagină de înregistrare fiindcă aceasta diferă foarte mult depinzând de GM-ul serverului, dacă dorește cineva să îl ajut cu o pagină de login este rugat să lase un reply și am să îi fac o pagină de register potrivită pentru GM.

Dacă aveți vreo nelămurire vă rog să îmi spuneți și o să vă explic, am pus la aproape fiecare linie din cod și explicație fiindcă după părerea mea așa pricepeți mai ușor.

Gh38gEQ.gif

Link to comment
Share on other sites

Daca poti pune si o arhiva cu produsul final, jos palaria pentru tutorial ;)

Editeaza "$db['mysql']['username']," (aveai cu U mare)

Edit: Am incercat in fel si chip si nu merge sa ma loghez pe cont. Am incercat sa introduc si whirlpool si fara whirlpool si degeaba plus ca imi apare mereu:  session_start(): Cannot send session cache limiter - headers already sent

Edited by SoNNy.sys

Sinner.png

Link to comment
Share on other sites

1 hour ago, SoNNy.sys said:

Daca poti pune si o arhiva cu produsul final, jos palaria pentru tutorial ;)

Editeaza "$db['mysql']['username']," (aveai cu U mare)

Edit: Am incercat in fel si chip si nu merge sa ma loghez pe cont. Am incercat sa introduc si whirlpool si fara whirlpool si degeaba plus ca imi apare mereu:  session_start(): Cannot send session cache limiter - headers already sent

Scuze, m-am grabit cand am facut pagina de profile.php, uite ce trebuie sa modifici:

In loc de:

if(isset($_SESSION["user_username"])){ //Verificăm dacă este setată sesiunea cu numele utilizatorului, dacă este deja setată înseamnă că acesta este deja logat și o să îl redirecționăm pe pagina de profil.
    header('Location: profile.php'); //Aici îl redirecționăm pe pagina de profil.

pui:

if(!isset($_SESSION["user_username"])){ //Verificăm dacă este setată sesiunea cu numele utilizatorului, dacă este deja setată înseamnă că acesta este deja logat și o să îl redirecționăm pe pagina de profil.
    header('Location: index.php'); //Aici îl redirecționăm pe pagina principala.

Am modificat si [mysql][username], multumesc ca mi-ai spus.

Link de download adaugat: http://www.mediafire.com/download/3ou19n07p5ddu4p/Panel.rar

Daca nu reusesti sa iti pui hash-ul corect la parola anunta-ma si iti dau eu un cod pentru hash, doar sa imi spui ce tip de hash folosesti pe server.

Gh38gEQ.gif

Link to comment
Share on other sites

Nu merge login,  Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/rsesampc/public_html/panel/login.php:4) in /home/rsesampc/public_html/panel/login.php on line 5
Login  (Am incercat si cu scriptul facut de mine si cu arhiva postata)

Sinner.png

Link to comment
Share on other sites

5 hours ago, SoNNy.sys said:

Nu merge login,  Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/rsesampc/public_html/panel/login.php:4) in /home/rsesampc/public_html/panel/login.php on line 5
Login  (Am incercat si cu scriptul facut de mine si cu arhiva postata)

Pe pagina de login sterge session_start()-ul de dupa linia cu require_once('connection.php') si pune asta sa fie prima linie din codul tau:

<?php session_start(); //Pornim o sesiune pe care o să o folosim pentru stocarea datelor despre jucător. ?>

 

Gh38gEQ.gif

Link to comment
Share on other sites

6 minutes ago, WiDuAlK.SaMp said:

Iti sugerez ca viitorul tutorial sa il postezi intr-un alt topic, sa nu fie prea aglomerat acesta. ii vo da eu PIN.

Bine, ce parere ai, sa postez acum partea a 3-a cu admin panel sau sa fac un sistem de tombola de sarbatori si sa pun partea a 3-a dupa aceea?

Gh38gEQ.gif

Link to comment
Share on other sites

  • 1 month later...
On 12/7/2015 at 20:46, ImpulsE said:

UPDATE:

  • A fost adăugată partea a 2-a a tutorialului în care vă explic cum să creați o pagină de login, un profil și o pagină de logout standard pentru panel.
  • Nu am creat și pagină de înregistrare fiindcă aceasta diferă foarte mult depinzând de GM-ul serverului, dacă dorește cineva să îl ajut cu o pagină de login este rugat să lase un reply și am să îi fac o pagină de register potrivită pentru GM.

Dacă aveți vreo nelămurire vă rog să îmi spuneți și o să vă explic, am pus la aproape fiecare linie din cod și explicație fiindcă după părerea mea așa pricepeți mai ușor.

Ni la David...

Foarte fain tutorialul,chiar voiam sa vad asa ceva.

te pupa Joe! :* :monkey:

Edited by Adrian_Petre

 

 

Link to comment
Share on other sites

  • WopsS unfeatured and unpinned this topic
  • 5 months later...

29-Jul-2017 12:17:44 Europe/Bucharest] PHP Warning:  session_start(): open(/var/cpanel/php/sessions/ea-php56/sess_ka6imo7paeeul8hecc97r2rli6, O_RDWR) failed: No such file or directory (2) in /home/hoxpgmae/public_html/panel/index.php on line 2
[29-Jul-2017 12:17:47 Europe/Bucharest] PHP Warning:  session_start(): open(/var/cpanel/php/sessions/ea-php56/sess_ka6imo7paeeul8hecc97r2rli6, O_RDWR) failed: No such file or directory (2) in /home/hoxpgmae/public_html/panel/index.php on line 2
[29-Jul-2017 12:17:54 Europe/Bucharest] PHP Warning:  session_start(): open(/var/cpanel/php/sessions/ea-php56/sess_ka6imo7paeeul8hecc97r2rli6, O_RDWR) failed: No such file or directory (2) in /home/hoxpgmae/public_html/panel/index.php on line 2
[29-Jul-2017 12:17:57 Europe/Bucharest] PHP Warning:  session_start(): open(/var/cpanel/php/sessions/ea-php56/sess_ka6imo7paeeul8hecc97r2rli6, O_RDWR) failed: No such file or directory (2) in /home/hoxpgmae/public_html/panel/index.php on line 2

Link to comment
Share on other sites

  • 1 year later...
On 12/7/2015 at 8:46 PM, ImpulsE said:

UPDATE:

  • A fost adăugată partea a 2-a a tutorialului în care vă explic cum să creați o pagină de login, un profil și o pagină de logout standard pentru panel.
  • Nu am creat și pagină de înregistrare fiindcă aceasta diferă foarte mult depinzând de GM-ul serverului, dacă dorește cineva să îl ajut cu o pagină de login este rugat să lase un reply și am să îi fac o pagină de register potrivită pentru GM.

Dacă aveți vreo nelămurire vă rog să îmi spuneți și o să vă explic, am pus la aproape fiecare linie din cod și explicație fiindcă după părerea mea așa pricepeți mai ușor.

Salut, as avea eu nevoie sa ma ajuti cu o pagina de register potrivita pentru GM-ul meu. Ma poti contacta? ID skype: remusmihai99

Link to comment
Share on other sites

  • 11 months later...
  • 1 year later...
On 12/4/2015 at 5:25 PM, ImpulsE said:

Salutare, astăzi am decis să incep o serie de tutoriale cu ajutorul cărora sper să învățați puțin PHP, moduri de securizare ale unui site PHP și de ce lucruri esențiale are nevoie un User Control Panel ca să fie folositor pentru jucători cât și pentru staff. Țin să precizez că nu o să pun mare accent pe aspectul site-ului până când nu terminăm crearea întregului panel. După ce terminăm UCP-ul este posibil să mai fac și vreo două tutoriale în care să vă explic și câteva lucruri de bază despre cum ar trebui aranjat un UCP.
În acest tutorial o să creăm un User Panel Control care poate fi utilizat la aproape orice server care are o bază de date MySQL.

Fișiere și programe necesare:

Un program sau un webserver pe care să încărcați fișierele necesare UCP-ului și o bază de date MySQL. (Exemple de programe: wamp, xampp)
Un program cu ajutorul căruia puteți edita fișiere PHP, HTML și CSS cu care să fiți obișnuiți și să vă placă să lucrați în el.


Partea I a tutorialului:

 

Partea a II-a a tutorialului:

Aceasta ar fi prima parte a ghidului, nu o să intru în mai multe detalii în acest tutorial ca să nu vă încurc cu prea multe coduri din prima, o să fie puțin greu să urmați acest tutorial dacă  nu aveți cunoștințe în nicio limbă de programare web, dar o să încerc să explic cât mai bine.

Download panel: http://www.mediafire.com/download/3ou19n07p5ddu4p/Panel.rar

Despre ce o să fie partea a 3-a?: Crearea unui admin panel cu funcții RCON pentru panel-ul nostru.

Salut! Eu sunt la inceput, si as vrea asa stiu daca ar trebuii sa sterg // dupa cod gen 

<?php session_start(); //Pornim o sesiune pe care o să o folosim pentru stocarea datelor despre jucător. ?>

ar trebuie sa sterg //Pornim o sesiune pe care o să o folosim pentru stocarea datelor despre jucător.

??

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.