Advertisement
Wistaro

Wistaro - Sample code (5)

Jun 11th, 2019
481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 16.57 KB | None | 0 0
  1. <?php
  2. #script
  3. //Raport de bug
  4. function bug($message)
  5. {
  6.     $message = heure(time()).' : '.$message;
  7.     $message .= @file_get_contents('Templates/cache/bugs.txt');
  8.     file_put_contents('Templates/cache/bugs.txt', $message);
  9. }
  10. function getIdParrain($idUser){
  11.     return (floor(($idUser*61)/42)+182).$idUser;
  12. }
  13.  
  14. function getQueryResults($sql, $params = null, $style = PDO::FETCH_ASSOC)
  15. {
  16.     count_requete($requete);
  17.     global $bdd, $sql_error;
  18.     try
  19.     {
  20.         $req = $bdd->prepare($sql);
  21.         $req->execute($params);
  22.         $res = $req->fetchAll($style);
  23.         $sql_error = null;
  24.     } catch (PDOException $e)
  25.     {
  26.         $res = [];
  27.         $sql_error = $e->getCode();
  28.     }
  29.     return $res;
  30. }
  31. function is_mod_activated($idModule, $player){
  32.     $playerPsd = htmlspecialchars($player);
  33.     return (getQueryResults('SELECT COUNT(ID) AS mod_installed FROM modules_joueurs WHERE pseudo = ? && id_module = ? && base_link = 1', [$playerPsd,$idModule])[0]['mod_installed']) == 1;
  34. }
  35. function getModParam($idModule, $option, $player){
  36.     $playerPsd = htmlspecialchars($player);
  37.     $config = getQueryResults('SELECT config FROM modules_joueurs WHERE pseudo = ? && id_module = ?', [$playerPsd, $idModule])[0]['config'];
  38.    
  39.     $out = explode(';',$config);
  40.    
  41.     foreach($out as $val){
  42.    
  43.         $data = explode('=',$val);
  44.        
  45.         if($data[0] == $option){
  46.             return $data[1];
  47.         }
  48.     }  
  49.     return false;  
  50. }
  51. function returnAllParam($idModule, $player){
  52.     $playerPsd = htmlspecialchars($player);
  53.     $config = getQueryResults('SELECT config FROM modules_joueurs WHERE pseudo = ? AND id_module = ?', [$playerPsd, $idModule])[0]['config'];
  54.     $sortie_info = explode(';',$config);
  55.     return $sortie_info;
  56.  
  57.        
  58. }
  59. function  modifParamMod($idModule, $option, $newval, $player){
  60.    
  61.     $playerPsd = htmlspecialchars($player);
  62.     $oldConfig = getQueryResults('SELECT config FROM modules_joueurs WHERE pseudo = ? AND id_module = ?', [$playerPsd, $idModule])[0]['config'];
  63.    
  64.     $oldParam = getModParam($idModule, $option, $player);
  65.     $newConfig = str_replace($option.'='.$oldParam, $option.'='.$newval, $oldConfig);
  66.    
  67.     return getQueryResults('UPDATE modules_joueurs SET config = ? WHERE pseudo = ? AND id_module = ?',[$newConfig, $playerPsd, $idModule]);
  68. }
  69. function sql_query($requete)
  70. {
  71.     count_requete($requete);
  72.     require('log_bdd.php');
  73.    
  74.  
  75. try {
  76.     $bddW = new PDO($dsnW, $userW, $passwordW);
  77.     $bddW->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  78.  
  79. } catch (PDOException $e) {
  80.     die('Echec de la connexion : ' . $e->getMessage());
  81. }
  82.  
  83.     return @$bddW->query($requete);
  84. }
  85. function count_requete($requete)
  86. {
  87.     static $nb_requete = 0;
  88.     $nb_requete++;
  89.     return $nb_requete;
  90. }
  91. function dateDiff($date1, $date2){
  92.     $diff = abs($date1 - $date2); // abs pour avoir la valeur absolute, ainsi éviter d'avoir une différence négative
  93.     $retour = array();
  94.  
  95.     $tmp = $diff;
  96.     $retour['second'] = $tmp % 60;
  97.  
  98.     $tmp = floor( ($tmp - $retour['second']) /60 );
  99.     $retour['minute'] = $tmp % 60;
  100.  
  101.     $tmp = floor( ($tmp - $retour['minute'])/60 );
  102.     $retour['hour'] = $tmp % 24;
  103.  
  104.     $tmp = floor( ($tmp - $retour['hour'])  /24 );
  105.     $retour['day'] = $tmp;
  106.  
  107.     return $retour;
  108. }
  109.  
  110. function updateXpAlliances(){
  111.     $alliList = getQueryResults('SELECT id FROM alliances');
  112.     $isMe = false;
  113.  
  114.     foreach ($alliList as $alli) {
  115.         $xpMemberList = getQueryResults('SELECT xp, psd FROM users WHERE alliance = ?', [$alli['id']]);
  116.         $sumXp = 0;
  117.         foreach ($xpMemberList as $unicval) {
  118.              $sumXp+=$unicval['xp'];
  119.              if($unicval['psd'] == $_SESSION['psd']){
  120.                 $isMe = true;
  121.              }
  122.         }
  123.         if($isMe === true){ //update session variable
  124.             $_SESSION['xp_ally'] = $sumXp;
  125.             $isMe = false;
  126.         }
  127.         getQueryResults('UPDATE alliances SET xp  = ? WHERE id = ?', [$sumXp, $alli['id']]);
  128.  
  129.     }
  130.    
  131. }
  132.  
  133. //heure - date
  134. function heure($time)
  135. {
  136. return date('\l\e d/m à H:i', $time);
  137. }
  138. function heure_light($time)
  139. {
  140. return date('d/m à H\h', $time);
  141. }
  142. //Redirection header
  143. function redirection($addr)
  144. {
  145.     header('location: '.$addr);
  146. }
  147.  
  148. function maj_attdef_pl(){ /*Update planets static stats*/
  149.    
  150.     $infosJ = explode(' ', return_cache('cache_'.$_SESSION['psd'].'.cache'));
  151.     $frcJ = round($infosJ[1]/2,0);
  152.  
  153.     sql_query('UPDATE planetes SET att = clones+age/2, def = clones+age/2, portee = 5+(age/16), prod = 10*age-(clones/(age*2)) + 50');
  154. }
  155.  
  156. //File get contents
  157. function get_file($file)
  158. {
  159.     if(is_file($file))
  160.     return file_get_contents($file);
  161.     else
  162.     return bug('Le fichier '.$file.' est introuvable.
  163.     ');
  164. }
  165.  
  166. function prix2($org) /*Return unity prices with the selected organization*/
  167. {
  168.     $prix = Array('soldats' => 10, 'chevaliers' => 80, 'archers' => 80, 'heros' => 200);
  169.     /*if($org == 5)
  170.     $prix['soldats'] = 3;*/
  171.     return $prix;
  172. }
  173. function statsAtq($org) /*Return attack stats with the selected organization*/
  174. {
  175.     $statsAtq = Array('soldats' => 1, 'chevaliers' => 15, 'archers' => 30, 'heros' => 100);
  176.     if($org == 2)
  177.     $statsAtq['archers'] = 50;
  178.     elseif($org == 4)
  179.     $statsAtq['heros'] = 130;
  180.     elseif($org == 5)
  181.     $statsAtq['soldats'] = 2;
  182.     return $statsAtq;
  183. }
  184. function statsDef($org) /*Return defense stats with the selected organization*/
  185. {
  186.     $statsDef = Array('soldats' => 1, 'chevaliers' => 30, 'archers' => 15, 'heros' => 100);
  187.     if($org == 1)
  188.     $statsDef['chevaliers'] = 45;
  189.     elseif($org == 4)
  190.     $statsDef['heros'] = 130;
  191.     return $statsDef;
  192. }
  193. function unites($org) /*Return unities with the selected organization*/
  194. {
  195.     $unites = Array('Clones', 'Droïdes', 'Padawans', 'Jedis');
  196.     if($org == 1)
  197.     $unites[1] = 'Siths';
  198.     elseif($org == 2)
  199.     $unites[2] = 'Wookies';
  200.     elseif($org == 4)
  201.     $unites[3] = 'Zabraks';
  202.     elseif($org == 5)
  203.     $unites[0] = 'Eworks';
  204.     return $unites;
  205. }
  206. function verify_avatar($avatar)
  207. {
  208.     //$infosavatar = @getimagesize($avatar);
  209.     //if($infosavatar[0] > 50 OR $infosavatar[1] >50 OR $infosavatar[2] > 3)
  210.     //return false;
  211.     //else
  212.     //if(@fopen($avatar, 'r' ))
  213.     return true;
  214. }
  215.  
  216. function nombre_format($nombre) /*Better display of huge numbers*/
  217. {
  218.     if(strpos($_SERVER["HTTP_USER_AGENT"], 'Firefox') !== false){
  219.         return $nombre;
  220.     }else{
  221.         $nombre=number_format($nombre, 0, ',', ' ');
  222.         return $nombre;
  223.     }
  224.  
  225. }
  226. function safest($var)
  227. {
  228.   $var = htmlentities($var, ENT_QUOTES);
  229.   return $var;
  230. }
  231.  
  232.    
  233. function chatConnectes() /*Return the list of users online*/
  234.     {
  235.      
  236.         $timestampCinqMinutes = time()-(60*5); // timestamp qu'il sera dans 5 minutes
  237.         $dir = './Templates/cache/chat/';
  238.  
  239.         $fichierConnectes = glob($dir.'*.tmp'); // Récupération des fichiers temporaires déjà présents
  240.         $nbConnectes = 0; // Déclaration de la variable qui contiendra le nombre de connectés
  241.        
  242.         if($_SESSION['psd'] AND is_file($dir.$_SESSION['psd'].'.tmp')) // Si le visiteur est déjà connecté
  243.             {
  244.                 touch($dir.$_SESSION['psd'].'.tmp'); // On modifie la date de dernière modification du fichier
  245.             }
  246.         elseif($_SESSION['psd']) // Sinon
  247.             {
  248.                 $fichierVisiteur = fopen($dir.$_SESSION['psd'].'.tmp', 'x+'); // On crée un nouveau fichier
  249.                 fclose($fichierVisiteur);
  250.             }
  251.  
  252.         $fichiersConnectes = glob($dir.'*.tmp'); // On renouvelle la liste des fichiers temporaires
  253.  
  254.         foreach($fichiersConnectes AS $fichier)
  255.                 {
  256.                         if(filemtime($fichier) >= $timestampCinqMinutes) $nbConnectes++; // Si le fichier a été modifié dans les 5 dernières minutes, on incrémente $nbConnectes
  257.                         else unlink($fichier); // Sinon on le supprime
  258.                 }
  259.         return $nbConnectes;
  260.  
  261.     }
  262.    
  263. function utfdecode($machaine)
  264. {    
  265.  
  266.     $machaine=($machaine);
  267.  
  268.     $carracterasoucis = Array("ç","ä§","é","ä©","è","ä¨","ê",
  269. "äª","ë","ä«","Ê","äŠ","Ë","ä‹","î","ä®","ï","ä¯","ì"
  270. ,"Ã?","ä?","ò","ä²","ô","ä´","ö","ä¶","õ","ó","ø",
  271. "äµ","ä³","ä¸","Ô","ä”","Ö","ä–","Ã","ä","â","ä¢","ä",
  272. "ä¤","Ã¥","ä¥","Â","ä‚","Ä","ä„","ù","û","ü","ä¼","Û"
  273. ,"Ãœ","ä¹","ä»","ä¼","ä¼","ä›","äœ","ò","ñ","’");
  274.  
  275.     $topcool = Array("ç", "ç", "é", "é", "è", "è", "ê", "ê", "ë", "ë", "Ê", "Ê",
  276. "Ë", "Ë", "î", "î", "ï", "ï", "ì", "Î", "Î", "ò", "ò", "ô", "ô", "ö", "ö", "õ",
  277. "ó", "ø", "õ", "ó", "ø", "Ô", "Ô", "Ö", "Ö", "à", "à", "â", "â", "ä", "ä", "å",
  278. "å", "Â", "Â", "Ä", "Ä", "u", "û", "ü", "ü", "Û", "Ü", "u", "û", "ü", "ü", "Û",
  279. "Ü", "ñ", "ñ", "'");
  280.  
  281.     foreach($carracterasoucis as $key => $value)
  282.     $machaine = str_replace($carractereasoucis[$key], $topcool[$key], $machaine);  
  283.  
  284.     return $machaine;
  285. }
  286.  
  287.    
  288. function isconnect() /*Test a user to see if he's online*/
  289. {
  290.     sql();
  291.     $requete = sql_query('SELECT id
  292.     FROM users
  293.     WHERE users.psd = "'.$_SESSION['psd'].'" && users.mdp = "'.$_SESSION['mdp'].'" LIMIT 1');
  294.    
  295.     $pseudo = str_replace(' ', '', $_SESSION['psd']);
  296.     if(!$_SESSION['log'] OR empty($pseudo) OR !$requete->rowCount())
  297.     {
  298.         remove_cache('cache_'.$_SESSION['psd'].'.cache');
  299.         session_destroy();
  300.         return header('location: index.php?ok=e');
  301.         return exit();
  302.     }
  303.     else
  304.     {
  305.         return true;
  306.     }
  307. }
  308. function isadmin($pseudo)
  309. {
  310.     global $admin;// Voir conf.php
  311.     $i = 0;
  312.     foreach($admin as $key=>$value)
  313.     {
  314.         if($value == $pseudo)
  315.         $i = 1;
  316.     }
  317.     return $i;
  318. }
  319. function ismodo($pseudo)
  320. {
  321.     global $modo;// Voir conf.php
  322.     $i = 0;
  323.     foreach($modo as $key=>$value)
  324.     {
  325.         if($value == $pseudo)
  326.         $i = 1;
  327.     }
  328.     return $i;
  329. }
  330. function ispremium($pseudo)
  331. {
  332.     global $premium;// Voir conf.php
  333.     $i = 0;
  334.     foreach($premium as $key=>$value)
  335.     {
  336.         if($value == $pseudo)
  337.         $i = 1;
  338.     }
  339.     return $i;
  340. }
  341. function isboss($pseudo)
  342. {
  343.     global $boss;// Voir conf.php
  344.     $i = 0;
  345.     foreach($boss as $key=>$value)
  346.     {
  347.         if($value == $pseudo)
  348.         $i = 1;
  349.     }
  350.     return $i;
  351. }
  352.  
  353. function sql()
  354.     {
  355.        
  356.     }
  357.    
  358. # Calculs#
  359. function production($lv)
  360. {
  361. $or = floor($lv*$lv*40/9)*5;
  362. return $or;
  363. }
  364. function prix($lv)
  365. {
  366. $lv ++;
  367. $or = floor(($lv * $lv * $lv)/10);
  368. return $or;
  369. }
  370. function xp($lv)
  371. {
  372. $xp = ($lv >= 10)? ($lv-9) * 20 : -1;
  373. return $xp;
  374. }
  375. function lv($xp)
  376. {
  377. $lv = floor($xp-1 / 20);
  378. return $lv;
  379. }
  380.  
  381. function limite_xp($xp)
  382. {
  383.     return 50+round($xp/30);
  384. }
  385.  
  386. function limite_xp_ally($xp)
  387. {
  388.     return 300+round($xp/300);
  389. }
  390.  
  391. function total_sacrifice($xp)
  392. {
  393.     return round($xp*$xp/2+1);
  394. }
  395.  
  396. function total_victoires($xp)
  397. {
  398.     return round($xp/40+10);
  399. }
  400.  
  401. function maj_mine($user) //update this function every hour
  402. {
  403.  
  404.     include('pdo.php');
  405.     $user = htmlentities($user);
  406.  
  407.     $info_user = explode(' ', return_cache('cache_'.$user.'.cache'));
  408.  
  409.     $requete = sql_query('SELECT `timestamp`, `mine`, `ci`, banque, `etat`, `date_connexion`, `date`  
  410.     FROM users WHERE psd = "'.$user.'"');
  411.     $donnees = $requete->fetch(PDO::FETCH_ASSOC);
  412.     $timestamp = $donnees['timestamp'];
  413.     if($timestamp == 0)
  414.     sql_query('UPDATE `users` SET `timestamp` = "'.time().'" WHERE psd = "'.$user.'" LIMIT 1');
  415.     elseif(floor((time()+1)/3600) - floor($timestamp/3600) > 0)
  416.     {
  417.     sql_query('UPDATE `users` SET `timestamp` = "'.time().'" WHERE psd = "'.$user.'" LIMIT 1');
  418.    
  419.    
  420.         $mine = $donnees['mine'];
  421.         $user_ci = $donnees['ci'];
  422.         $banque = $donnees['banque'];
  423.         $etat = $donnees['etat'];
  424.         $date_connexion = $donnees['date_connexion'];
  425.         $date = $donnees['date'];
  426.         $veille = "";
  427.         $vacances = "";
  428.        
  429.         $retourdumode = time()+(3600*7*24);
  430.    
  431.         if(!empty($date) AND $date <= time())
  432.         {
  433.         $date = "";
  434.         $etat = 0;
  435.             if($etat == '3')
  436.             $veille = $retourdumode;
  437.             else
  438.             $vacances = $retourdumode;
  439.         }
  440.         elseif(!empty($donnees['veille']) AND $donnees['veille']<= time())
  441.         sql_query('UPDATE users SET veille="" WHERE psd = "'.$donnees['psd'].'"');
  442.    
  443.         $timeInnactif = time()-(60*60*24*7*2);     
  444.         $timeMort = time()-(60*60*24*7*6);
  445.         if($etat == '0' AND $date_connexion < $timeInnactif)
  446.         $etat = 1;
  447.         if($etat == '1' AND $date_connexion < $timeMort AND !isboss($donnees['psd']))
  448.         $etat = 6;
  449.         if(($etat == '6' OR $etat == '1') AND $date_connexion > $timeMort)
  450.         $etat = 0; 
  451.        
  452.         $production_ci = production($mine);
  453.        
  454.         if($etat == '3'){ //en veille
  455.             $production_ci = round($production_ci/2);
  456.         }elseif($etat == '4'){ //en vacances
  457.             $production_ci = round($production_ci/5);
  458.         }elseif($etat == '6'){
  459.             $production_ci = 0;
  460.         }
  461.            
  462.     if($user_ci < 0){
  463.     $nouveau_or = $production_ci;
  464.     }else{
  465.     $nouveau_or = $user_ci + $production_ci*(floor(time()/3600) - floor($timestamp/3600));
  466.     }
  467.    
  468.  
  469.     sql_query('UPDATE `users` SET `ci` = "'.$nouveau_or.'", banque = "'.$banque.'", `timestamp` = "'.time().'", cible = 0, attaque = 0, etat = "'.$etat.'", veille = "'.$veille.'", vacances = "'.$vacances.'", date = "'.$date.'" WHERE psd = "'.$user.'" LIMIT 1');
  470.  
  471.     }
  472.    
  473.    
  474.  
  475.  
  476.     return $or;
  477. }
  478. function sendMessageJournal($title, $text, $type, $user){ //send a notification to the journal of the selected user (use notifications V2)
  479.  
  480.             switch ($type) {
  481.                 case 'info':
  482.                     $icon = 'info.png';
  483.                     $alt = 'INFO';
  484.                     break;
  485.  
  486.                 case 'notif':
  487.                     $icon = 'ring.jpg';
  488.                     $alt = 'NOTIFICATION';
  489.                     break;
  490.                
  491.                 default:
  492.                     $icon = 'info.png';
  493.                     $alt = 'INFO';
  494.                     break;
  495.             }
  496.  
  497.             $journal = return_cache('Journal_'.$user.'.cache');
  498.             $idNotif = rand(1,100000);
  499.    
  500.             $message = '<tr>
  501.             <td>'.date('j/m').' - '.date('H:i:s').' <br /><img src="Template/images/'.$icon.'" alt="'.$alt.'" height="20px" width="20px"/></td>
  502.             <td class="txt" onclick="openNotif('.$idNotif .');">
  503.                 <b>'.$title.'</b><td class="openNotif"><a href="_CLEARNOTIF_"><img src="Template/images/bin.png" height="15px" width="15px"/></a></td>
  504.             </td>
  505.         </tr>
  506.         <tr class="notifoff" id="notif'.$idNotif .'" style="display:none;">
  507.             <td colspan="3">
  508.                 '.$text.'  
  509.             </td>
  510.         </tr>|||';
  511.     remove_cache('Journal_'.$user.'.cache');
  512.     create_cache($message.$journal, 'Journal_'.$user.'.cache');
  513. }
  514.  
  515. function sendMessageAlliance($msg, $alliance, $player){ /* Send message as "info" one the selected alliance (in the chat)*/
  516.  
  517.         sql_query('INSERT INTO chat_alliances (idalliance, psd, msg, date)     
  518.         VALUES ("'.$alliance.'", "-Info", "'.htmlspecialchars($msg).'", "'.time().'");');
  519. }
  520. function sendNotif($matches){  /*Send notif when people are mentionned (chat and forum)*/
  521.  
  522.     session_start();
  523.     $psd = $_SESSION['psd'];
  524.     $queryStr = '';
  525.     if(preg_match("#add.php#i", $_SERVER['SCRIPT_FILENAME'])){
  526.         $typeRequest = 'chat';
  527.     }elseif (preg_match("#forum.php#i", $_SERVER['SCRIPT_FILENAME'])) {
  528.         $typeRequest = 'forum';
  529.         $queryStr = $_SERVER['QUERY_STRING'];
  530.     }else{
  531.         $typeRequest = '???';
  532.     }
  533.     $result = getQueryResults('SELECT COUNT(ID) AS NB, psd FROM users WHERE psd = ?', [$matches[1]])[0];
  534.     $userExists = $result['NB'] == 1 ? true: false;
  535.     $psdUser = $result['psd'];
  536.  
  537.     if($matches[1] == 'everyone' AND (isadmin($psd) OR ismodo($psd) ) ){ //global broadcast
  538.         $getListUsers = getQueryResults('SELECT psd FROM users');
  539.         foreach ($getListUsers as $unicUser) {
  540.             sendMessageJournal('Notification','Vous avez été notifié dans le '.$typeRequest.' par '.$psd.'<br /><a href="'.$typeRequest.'.php?'.$queryStr.'">Voir le '.$typeRequest.'</a>.', 'notif', $unicUser['psd']);
  541.         }
  542.         return ($typeRequest == 'forum') ? '<gras>@everyone</gras>' : '<b>@everyone</b>';
  543.  
  544.     }elseif ($matches[1] == 'online' AND (isadmin($psd) OR ismodo($psd) )) {
  545.         //detection des membres en ligne, voir connectes.php
  546.         $i = 0;
  547.         $dir = './Templates/cache/';
  548.         $fichiersConnectes = glob($dir.'compteur/*.tmp');
  549.         $ajout_sql = '';
  550.         foreach($fichiersConnectes AS $fichier){
  551.             $pseudo = ucfirst(substr(basename($fichier), 0, -4));
  552.             if ($i == 0){
  553.                 $ajout_sql .= ' psd = "'.$pseudo.'"';
  554.             }else{
  555.                 $ajout_sql .= ' OR psd="'.$pseudo.'"';
  556.             }
  557.             $i++;
  558.         }
  559.         if ($ajout_sql == ""){
  560.             $ajout_sql = '1=2';
  561.         }
  562.         $i = 0;
  563.         $requete = sql_query('SELECT psd FROM users WHERE '.$ajout_sql);
  564.         while ($donnees = $requete->fetch(PDO::FETCH_ASSOC)){
  565.             sendMessageJournal('Notification','Vous avez été notifié dans le '.$typeRequest.' par '.$psd.'<br /><a href="'.$typeRequest.'.php?'.$queryStr.'">Voir le '.$typeRequest.'</a>.', 'notif', $donnees['psd']);
  566.         }
  567.  
  568.         return ($typeRequest == 'forum') ? '<gras>@online</gras>' : '<b>@online</b>';
  569.     }
  570.  
  571.     if($userExists){
  572.  
  573.         sendMessageJournal('Notification','Vous avez été notifié dans le '.$typeRequest.' par '.$psd.'<br /><a href="'.$typeRequest.'.php?'.$queryStr.'">Voir le '.$typeRequest.'</a>.', 'notif', $psdUser);
  574.  
  575.         return ($typeRequest == 'forum') ? '@<lien url="joueur.php?psd='.$psdUser.'">'.$psdUser.'</lien>' : '@<a href="joueur.php?psd='.$psdUser.'">'.$psdUser.'</a>';
  576.        
  577.  
  578.     }else{
  579.         return '@'.$matches[1];
  580.     }
  581.  
  582.  
  583.  
  584.  
  585. }
  586. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement