Advertisement
Guest User

Untitled

a guest
May 4th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.72 KB | None | 0 0
  1. package com.usthb.modeles;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10.  
  11. public class ServeurMiniFacebook {
  12.  
  13.  
  14. //TOUS LES ABONNES
  15. private static HashMap<String,Abonne> baseAbonnes= new HashMap<String,Abonne>(); //la cl? est le username de l'abonn?
  16.  
  17. //TOUS LES GROUPES
  18. private static HashMap<String,Groupe> baseGroupes= new HashMap<String,Groupe>(); //la cl? est le nom du groupe
  19.  
  20. //TOUS LES POSTS
  21. private static HashMap<Integer,Post> basePosts= new HashMap<Integer,Post>();//la clé est la le codePost
  22.  
  23. //methode qui retourne l'abonné à partir d'un username
  24. public static Abonne getAbonne(String username) {
  25. return baseAbonnes.get(username);
  26. }
  27.  
  28. //methode qui retourne le groupe à partir d'un groupName
  29. public static Groupe getGroupe(String groupName) {
  30. return baseGroupes.get(groupName);
  31. }
  32.  
  33. //methode qui retourne le poste à partir du code post
  34.  
  35. public static Post getPost(Integer codePost) {
  36. return basePosts.get(codePost);
  37. }
  38.  
  39.  
  40. //SOME TESTS
  41. public static boolean userExiste(String username) {
  42. return baseAbonnes.containsKey(username);
  43.  
  44. }
  45.  
  46. public static boolean groupeExiste(String groupName) {
  47. return baseGroupes.containsKey(groupName);
  48. }
  49.  
  50. public static boolean postExiste(int codePost) {
  51. return baseGroupes.containsKey(codePost);
  52. }
  53.  
  54.  
  55.  
  56.  
  57.  
  58. /***************REQUETES*****************/
  59.  
  60.  
  61.  
  62. /************ABONNES***********/
  63.  
  64. public static Abonne inscrireAbonne(Abonne abo){ //MAJ : ENVOYER PARAM ABONNE ET LE CREER ICI
  65. baseAbonnes.put(abo.getUsername(),abo);
  66. return abo;
  67. }
  68.  
  69.  
  70.  
  71. public static void supprimerAbonne(String user) {//d?sactiver le compte
  72.  
  73. // TROUVER SOLUTION
  74. // supprimerTousLesAmis(abo);
  75. baseAbonnes.remove(user);
  76. }
  77.  
  78.  
  79.  
  80. public static void quitterGroupe(String user,String grp){
  81.  
  82. if(groupeExiste(grp)) {
  83. getGroupe(grp).supprimerMembre(user);
  84. getAbonne(user).quitterGroupe(grp);
  85. }
  86. }
  87.  
  88. public static void rejoindreGroupe(String user,String grp){
  89. Abonne abo=getAbonne(user);
  90. Groupe g=getGroupe(grp);
  91. if(g!=null){
  92. g.ajouterMembre(abo);
  93. abo.ajouterGroupe(g);
  94. }
  95. }
  96.  
  97.  
  98.  
  99. public static void ajouter(String user,String ami,String message) {//ajouter qlqn
  100. Abonne abo=getAbonne(ami);
  101. if(abo!=null){
  102. abo.ajouterInvitation(new Invitation(user,message));
  103. }
  104. }
  105.  
  106. public static void refuserInvitation(String user1,int indice){
  107. getAbonne(user1).refuserInvitation(indice);
  108. }
  109.  
  110.  
  111. public static void accepterInvitation(String user1,int indice){
  112.  
  113. Abonne abo1=getAbonne(user1),
  114. abo2=getAbonne(abo1.accepterInvitation(indice));
  115. if(abo2==null) return;
  116. abo1.ajouterAmi(abo2);
  117. abo2.ajouterAmi(abo1);
  118. notifier(abo2,user1," votre invitation.","invitation");
  119. }
  120. /*
  121. public static void supprimerInvitation(String user,Invitation inv){
  122. Abonne abo=getAbonne(user);
  123. ArrayList invits;
  124. invits = inv.getRecepteur().getInvitations();
  125. invits.remove(inv);
  126.  
  127. }
  128. */
  129.  
  130.  
  131. public static void supprimerAmi(String abo,String ami){//supprimer qlqn de sa liste d'ami
  132. getAbonne(abo).supprimerAmi(ami);
  133. getAbonne(ami).supprimerAmi(abo);
  134. }
  135.  
  136.  
  137. public static void supprimerTousLesAmis(String user){
  138. getAbonne(user).supprimerTousLesAmis();
  139. }
  140.  
  141.  
  142.  
  143. /************GROUPES************/
  144.  
  145. public static Groupe creerGroupe(String createur,String groupName){
  146. Abonne abo=getAbonne(createur);
  147. Groupe grp=new Groupe(abo,groupName);
  148. baseGroupes.put(groupName, grp);
  149. abo.ajouterGroupe(grp);
  150. return grp;
  151. }
  152.  
  153.  
  154. public static void supprimerGroupe(String grp) {
  155. baseGroupes.remove(grp);
  156. }
  157.  
  158.  
  159.  
  160.  
  161. public static void afficherGroupe(String user) {//affiche tous les groupes o? l'abonn? est membre
  162. getAbonne(user).afficherGroupes();
  163. }
  164.  
  165.  
  166.  
  167.  
  168. /*************POSTES*************/
  169. public static Post creerPost(String poster,String contenu, String visibilite){
  170. Post p=new Post(poster, contenu, visibilite);
  171. basePosts.put(p.getCodePost(), p);
  172. return p;
  173. }
  174.  
  175. //connexion & déconnexion
  176.  
  177. public static boolean checkPassword(String user,String password){
  178. return getAbonne(user).getPassword().equals(password);
  179.  
  180. }
  181.  
  182. public static void seConnecter(String user) {
  183. getAbonne(user).setOnline(true);
  184. }
  185.  
  186. public static void seDeconnecter(String user) {
  187. getAbonne(user).setOnline(false);
  188. }
  189.  
  190. public static void notifier(Abonne recepteur ,String emetteur,String information,String type){
  191. recepteur.ajouterNotification(new Notification(emetteur,new StringBuilder(information),type));
  192. }
  193.  
  194. public static void alerterAmis(Abonne abo){
  195. HashMap<String,Abonne> listeAmis = abo.getListeAmis();
  196. for(Abonne recepteur: listeAmis.values()) {
  197. notifier(recepteur,abo.getUsername()," un nouveau statut.","publication");
  198. }
  199. }
  200. public static void alerterMembres(Groupe grp,String user){
  201. HashMap<String,Abonne> membres = grp.getMembres();
  202. for(Abonne recepteur: membres.values()) {
  203. notifier(recepteur,user," un nouveau statut dans "+grp.getGroupName()+".","publication");
  204. }
  205. }
  206.  
  207. //PUBLIER SUR MUR
  208.  
  209. public static void publier(String user,String contenu,String visibilite) {
  210. Abonne abo=getAbonne(user);
  211. Post p=creerPost(user,contenu,visibilite);
  212. abo.ajouterPost(p.getCodePost()); //ajouter le post au mur de celui qui l'a post?
  213. if(!visibilite.toLowerCase().equals("privé")) {
  214. alerterAmis(abo); //alerter les amis d'abo de la publication d'un certain contenu
  215. abo.ajouterActuAmis(p.getCodePost());
  216. }
  217. }
  218.  
  219. //PUBLIER DANS UN GROUPE
  220.  
  221. public static void publier(String user,String contenu, String grp,String visibilite) {//publier dans groupe
  222.  
  223. Groupe g=getGroupe(grp);
  224. if(g!=null && g.membreExiste(user))
  225. {
  226. Post p =creerPost(user,contenu,visibilite);
  227. g.ajouterPost(p.getCodePost());
  228.  
  229. alerterMembres(g,user); //alerter les membres du groupe
  230. g.ajouterActuMembres(p.getCodePost());
  231. }
  232. }
  233.  
  234. //METHODES EPINGLER (EN CHOISIR 2)
  235.  
  236.  
  237. public static void epingler(Post p) {
  238. p.setEpinglee(true);
  239. //ça peut servir à l'afficher en premier
  240. }
  241. public static void desepingler(Post p) {
  242. p.setEpinglee(false);
  243. }
  244.  
  245. public static ArrayList<Post> rechercher(String chercheur,String recherche) {
  246. Abonne abo1=getAbonne(chercheur),
  247. abo2=getAbonne(recherche);
  248. ArrayList<Integer> codes= abo2.getMur();
  249. ArrayList<Post> mur= new ArrayList<>();
  250. Post p;
  251.  
  252. Visibilite v= Visibilite.publique;
  253. // POUR SAVOIR QUI RECHERCHE QUI POUR POUVOIR CONNAITRE LA VISIBILITE ACCORDEE
  254. if(chercheur.equals(recherche)) v= Visibilite.privé;
  255. else if(abo2.sontAmis(chercheur)) v= Visibilite.amis;
  256. else if(abo2.ontAmisCommuns(abo1)) v=Visibilite.listeamis;
  257. int k=0;
  258. for(int i:codes){
  259. p=getPost(i);
  260. if(p!=null && p.visible(v)){
  261. if(!p.isEpinglee())
  262. mur.add(k,p);
  263. else{
  264. mur.add(0,p);
  265. k++;
  266. }
  267. }
  268. }
  269. return mur;
  270.  
  271. }
  272.  
  273. public static ArrayList<Post> rechercherGroupe(String user,String recherche){
  274. Groupe grp = getGroupe(recherche);
  275. ArrayList<Integer> codes = grp.getMur();
  276. ArrayList<Post> mur = new ArrayList<Post>();
  277. Post p;
  278.  
  279. Visibilite v;
  280. if(grp.membreExiste(user))
  281. v= Visibilite.groupe;
  282. else
  283. v= Visibilite.publique;
  284.  
  285. int k=0;
  286. for(int i:codes){
  287. p=getPost(i);
  288. if(p!=null && p.visible(v)){
  289. if(!p.isEpinglee())
  290. mur.add(k,p);
  291. else{
  292. mur.add(0,p);
  293. k++;
  294. }
  295. }
  296. }
  297. return mur;
  298.  
  299.  
  300.  
  301. }
  302.  
  303. public static void reagir(String user,Reaction react,int codePost) {//abo => abonné ayant r?agi, poster=>abonné ayant posté le post p
  304. Post p = getPost(codePost);
  305. if(p==null) return;
  306. boolean reagis=p.aReagis(user);
  307. if(reagis && p.memeReaction(user,react))
  308. p.supprimerReaction(user); //supprimer la réaction de l'ensemble des réactions au post
  309. else{
  310. p.ajouterReaction(user,react);
  311. if(!reagis && !user.equals(p.getPoster())) //if(abo==poster) il réagi à sa propre publication (habes)
  312. notifier(getAbonne(p.getPoster()),user," à votre publication.","reaction");//alerter le poster seulement de la réaction d'abo à son post
  313. }
  314. }
  315.  
  316. //REAGIR A UN COMMENTAIRE
  317.  
  318. public static void reagir(String user,Reaction react,int codePost,int indice) {
  319. Post p = getPost(codePost);
  320. if(p==null) return;
  321. Commentaire c = p.getComment(indice);
  322. if(c==null) return;
  323. boolean reagis=c.aReagis(user);
  324. if(reagis && c.memeReaction(user,react))
  325. p.supprimerReaction(user); //supprimer la réaction de l'ensemble des réactions au commentaire
  326. else{
  327. c.ajouterReaction(user,react);
  328. if(!reagis && !user.equals(c.getUser())) //if(abo==poster) il réagi à sa propre publication (habes)
  329. notifier(getAbonne(p.getPoster()),user," à votre commentaire.","reaction");//alerter le poster seulement de la réaction d'abo à son post
  330. }
  331. }
  332.  
  333.  
  334. //METHODES COMMENTAIRES
  335.  
  336. public static void commenter(String user,int codePost,String comment) { //abo => abonn? qui va commenter, poster=>abonn? qui a post? le post p
  337.  
  338. Post p=getPost(codePost);
  339. if(p==null) return;
  340. p.ajouterCommentaire(new Commentaire(user,new StringBuilder(comment),codePost));
  341. //alerter le poster si ce n'est pas lui qui a commenté a publication
  342. if(!user.equals(p.getPoster()))
  343. notifier(getAbonne(p.getPoster()),user," votre publication.","commentaire");
  344.  
  345. }
  346.  
  347. //supprimer un commentaire
  348.  
  349. public static void supprimerCommentaire(String user,int codePost,int indice) { //commentaire de user
  350. Post p = getPost(codePost);
  351. if(p==null) return;
  352. p.supprimerCommentaire(indice);
  353.  
  354. }
  355.  
  356. //partager dans un groupe
  357.  
  358. public static void partager(String user,int codePost,String grp,String visibilite) {
  359. Post p=getPost(codePost);
  360. if(p==null) return;
  361. Groupe g = getGroupe(grp);
  362. if(g!=null && g.membreExiste(user)) //abo doit etre membre du groupe
  363. publier(user,"a partagé la publication de "
  364. +p.getPoster()+"\n"+p.getContenu(),grp,visibilite);
  365. }
  366. //partager un post
  367.  
  368.  
  369. public static void partager(String user,int codePost, String visibilite) {
  370. Post p = getPost(codePost);
  371. if(p==null) return;
  372. publier(user,"a partagé la publication de "
  373. +p.getPoster()+"\n"+p.getContenu(),visibilite);
  374. }
  375.  
  376. public static void lireNotification(String user,int indice){
  377. ArrayList<Notification> notifs= getAbonne(user).getNotifications();
  378. notifs.get(indice).setEtat(true);
  379. }
  380.  
  381.  
  382. public static ArrayList<Post> filActu(String user){
  383. Abonne abo=getAbonne(user);
  384. ArrayList<Integer> codes = abo.getActu();
  385. ArrayList<Post> actu = new ArrayList<Post>();
  386. Post p;
  387. for(int i:codes){
  388. p=getPost(i);
  389. if(p!=null)
  390. actu.add(0,p);
  391. }
  392. return actu;
  393. }
  394.  
  395. private static void supprimerPost(int codePost){
  396. Abonne abo= getAbonne(getPost(codePost).getPoster());
  397. abo.supprimerPost(codePost);
  398. abo.supprimerActuAmis(codePost);
  399. basePosts.remove(codePost);
  400. }
  401.  
  402.  
  403. public static byte etatAmis(String user,String ami){
  404. Abonne abo=getAbonne(user);
  405. Abonne abo2=getAbonne(ami);
  406. boolean check1=abo.invitationEnvoyee(ami),
  407. check2=abo2.invitationEnvoyee(user);
  408.  
  409.  
  410. if(abo2.sontAmis(user))
  411. return 3;
  412. else if(check1||check2 ){
  413. if(check1)
  414. return 1;
  415. else
  416. return 2;
  417. }
  418. else
  419. return 0;
  420.  
  421. }
  422.  
  423. ////////////////////////////LE MAIN////////////////////////////////////////////////////
  424.  
  425.  
  426. public static void main(String args[]) throws IOException, ClassNotFoundException{
  427.  
  428.  
  429.  
  430. //BEGIN OF DECLARATION
  431.  
  432. Abonne sfn= new Abonne("Zeghoud","Sofiane","20/05/1998","homme","sofman","imene","djami3a","info","isil");
  433. Abonne imn= new Abonne("Kerboua","Imene","30/05/1999","femme","minette","sofiane","","","huehue");
  434. Abonne azdn= new Abonne("Bouchtout","Azzeddine","20/04/1995","Homme","PapiAzzou","haha","etudiant","info","universitaire");
  435. Abonne hda = new Abonne("Hassani","Hadda","20/04/1998","femMe","Hino","sofiane<3","etudiante","info","universitaire");
  436. /*Abonne ada = new Abonne("Macefeuk","Adda","20/04/1996","HoMme","toeflboi69","haha","etudiant","info","universitaire");
  437. Abonne scra= new Abonne("Laliam","Secoura","20/04/2000","femMe","sucrette","sofiane<3","etudiante","info","universitaire");
  438. */
  439. inscrireAbonne(sfn);
  440. inscrireAbonne(imn);
  441. inscrireAbonne(hda);
  442. inscrireAbonne(azdn);
  443.  
  444. ajouter("sofman","minette","cc cv");
  445. ajouter("PapiAzzou","minette","hello you");
  446. ajouter("Hino","minette","slt sccept pliz");
  447. ajouter("PapiAzzou","sofman","bla bla");
  448.  
  449. publier("minette","Ceci est pour everybody !","publique");
  450. publier("minette","Ceci est pour les amis de mes amis","listeamis");
  451. publier("sofman","Hey there!","publique");
  452. publier("sofman","I'm watchin' a movie XD","amis");
  453. publier("minette","Ceci est pour mes amis","amis");
  454. publier("minette","blabla","amis");
  455. publier("minette","oh","amis");
  456. publier("minette","shit","amis");
  457. publier("minette","fuuuu","amis");
  458. publier("minette","This is le poste le plus loooooooooooooooooooooooooooooooooooooooooooooooong !","amis");
  459. publier("minette","Ceci est pour moi-même","privé");
  460. publier("PapiAzzou","Hey there!","publique");
  461.  
  462. //END OF DECLARATION
  463.  
  464.  
  465.  
  466.  
  467.  
  468. ServerSocket socket=null;
  469. Socket serveur=null;
  470. ObjectInputStream in=null;
  471. ObjectOutputStream out=null;
  472.  
  473.  
  474. String username,password,ami,message,visibilite,groupe;
  475. Abonne abo,abo2;
  476. Groupe grp;
  477. Post p;
  478. int indice,code;
  479. Integer ind;
  480. boolean check;
  481.  
  482. while(true){
  483. try{
  484. socket=new ServerSocket(2018);
  485. serveur = socket.accept();
  486. out=new ObjectOutputStream(serveur.getOutputStream());
  487. in=new ObjectInputStream(serveur.getInputStream());
  488.  
  489. byte choix;
  490.  
  491. choix = in.readByte();
  492. switch(choix){
  493.  
  494. case 1 : //LA CONNEXION
  495. username=(String)in.readObject();
  496.  
  497. check=userExiste(username);
  498. out.writeBoolean(check);
  499. out.flush();
  500. if(!check) break;
  501.  
  502.  
  503. password=(String) in.readObject();
  504.  
  505. check=checkPassword(username,password);
  506. out.writeBoolean(check);
  507. out.flush();
  508. if(!check) break;
  509.  
  510. seConnecter(username);
  511. break;
  512.  
  513. case 2: //L'INSCRIPTION
  514. username=(String) in.readObject();
  515.  
  516. check = !userExiste(username);
  517. out.writeBoolean(check);
  518. out.flush();
  519. if(!check) break;
  520.  
  521. abo= new Abonne((String)in.readObject(),
  522. (String)in.readObject(),
  523. (String)in.readObject(),
  524. (String)in.readObject(),
  525. username,
  526. (String)in.readObject(),
  527. (String)in.readObject(),
  528. (String)in.readObject(),
  529. (String)in.readObject());
  530. inscrireAbonne(abo);
  531. break;
  532.  
  533. case 3: //LA DECONNEXION
  534. username=(String) in.readObject();
  535.  
  536. seDeconnecter(username);
  537. break;
  538.  
  539. case 4: //ENVOYER LA LISTE DE NOTIFICATIONS
  540. username=(String) in.readObject();
  541. out.writeObject(getAbonne(username).getNotifications());
  542. out.flush();
  543. break;
  544.  
  545. case 5: //ENVOYER LA LISTE D'INVITATIONS
  546. username=(String) in.readObject();
  547. out.writeObject(getAbonne(username).getInvitations());
  548. out.flush();
  549. break;
  550.  
  551. case 6: //AJOUTER
  552. username=(String) in.readObject();
  553. ami=(String) in.readObject();
  554. message=(String) in.readObject();
  555. switch(etatAmis(username,ami)){
  556. case 0:
  557. ajouter(username,ami,message);
  558. break;
  559. case 1:
  560. //I DON'T KNOW i want it to accept the invitation but ma3endish l'indice
  561.  
  562. break;
  563. case 2:
  564. getAbonne(ami).annulerInvitation(username);
  565. break;
  566. case 3:
  567. supprimerAmi(username,ami);
  568. break;
  569. }
  570.  
  571. break;
  572.  
  573. case 7: //LIRE UNE NOTIFICATION
  574. username=(String) in.readObject();
  575. indice=in.read();
  576. lireNotification(username,indice);
  577. break;
  578.  
  579. case 8: //ACCEPTER INVITATION
  580. username=(String) in.readObject();
  581. indice= in.read();
  582. accepterInvitation(username,indice);
  583. break;
  584.  
  585. case 9: //REFUSER INVITATION
  586. username=(String) in.readObject();
  587. indice=in.read();
  588. refuserInvitation(username,indice);
  589. break;
  590.  
  591. case 10: //ENVOYER LA LISTE DES POSTS DU FIL D'ACTUALITES
  592. username=(String) in.readObject();
  593. ArrayList<Post> posts=filActu(username);
  594. out.writeObject(posts);
  595. out.flush();
  596. break;
  597.  
  598. case 11: //REAGIR A UN POST OU A UN COMMENTAIRE
  599. username=(String) in.readObject();
  600. Reaction react=(Reaction) in.readObject();
  601. code=in.read();
  602. ind=(Integer) in.readObject();
  603. if(ind==null)
  604. reagir(username, react, code);
  605. else
  606. reagir(username, react, code, ind);
  607.  
  608.  
  609.  
  610. break;
  611.  
  612. case 12: //ENVOYER AL LISTE DES POSTS DU MUR DE QUELQU'UN
  613. username=(String) in.readObject();
  614. ami=(String) in.readObject();
  615. ArrayList<Post> mur=rechercher(username,ami);
  616. out.writeObject(mur);
  617. out.flush();
  618. break;
  619. case 13://EPINGLER UN POST
  620. indice=in.read(); //indice=codePost
  621. p=getPost(indice);
  622. if(p==null) break;
  623.  
  624. if(!p.isEpinglee())
  625. epingler(p);
  626. else
  627. desepingler(p);
  628. System.out.println(getPost(indice).isEpinglee());
  629. break;
  630. case 14://SUPPRIMER UN POST
  631. indice=in.read(); //indice=codePost
  632. supprimerPost(indice);
  633. break;
  634. case 15://MASQUER UN POST
  635. username= (String) in.readObject();
  636. indice = in.read();
  637. getAbonne(username).supprimerActu(indice);
  638. break;
  639. case 16: //CE QUE AFFICHE LE BOUTON AJOUTER
  640. username= (String) in.readObject();
  641. ami= (String) in.readObject();
  642. out.writeByte(etatAmis(username,ami));
  643. out.flush();
  644. break;
  645.  
  646. case 17://PUBLIER SUR LE MUR
  647. username= (String) in.readObject();
  648. message=(String) in.readObject();
  649. visibilite=(String) in.readObject();
  650. publier(username, message, visibilite);
  651. break;
  652. case 18: //CREER UN GROUPE
  653. username= (String) in.readObject();
  654. groupe= (String) in.readObject();
  655. check=!groupeExiste(groupe);
  656. out.writeBoolean(check);
  657. if(!check) break;
  658. creerGroupe(username,groupe);
  659. break;
  660. case 19: //REJOINDRE OU QUITTER UN GROUPE
  661. username= (String) in.readObject();
  662. groupe= (String) in.readObject();
  663. grp=getGroupe(groupe);
  664. if(grp.membreExiste(username))
  665. quitterGroupe(username,groupe);
  666. else
  667. rejoindreGroupe(username,groupe);
  668. break;
  669. case 20: //VERIFIER SI UN MEMBRE EXISTE DANS UN GROUPE
  670. username= (String) in.readObject();
  671. groupe= (String) in.readObject();
  672. out.writeBoolean(getGroupe(groupe).membreExiste(username));
  673. out.flush();
  674. break;
  675. case 21: //ENVOYER LES INFOS D'UN MEMBRE
  676. ami= (String) in.readObject();
  677. abo= getAbonne(ami);
  678. out.writeObject(abo.getInfos());
  679. out.flush();
  680. break;
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687. }
  688.  
  689.  
  690. }catch(IOException e){
  691. System.out.println(e+" Impossible de se connecter");
  692. }finally{
  693. in.close();
  694. out.close();
  695. socket.close();
  696. serveur.close();
  697.  
  698. }
  699.  
  700.  
  701.  
  702. }
  703.  
  704. }
  705.  
  706. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement