Nikolovska

[НП] лаб1.2 Систем за банкарско работење

Jun 1st, 2018
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 25.00 KB | None | 0 0
  1. /*Вовед во Java и класи (1)
  2. Систем за банкарско работење Problem 2 (3 / 3)
  3.  
  4. Треба да се креира апликација за банка која ќе управуваа со сметките на повеќе корисниците и ќе врши трансакции помеѓу
  5. нив. Банката работи само со долари и притоа сите суми на пари се претставуваат како стрингови со знакот $ на крај, и
  6. точка помеѓу бројот на центи и бројот на долари без празни места. Бројот на центи треба да се состои од две цифри без
  7. разлика на износот.
  8.  
  9. Пример:
  10.  
  11. 10 долари  10.00$
  12. 15 долари и 50 центи 15.50$
  13.  
  14. За потребите на ваквата апликација треба да се напишат класите Account,Transaction и Bank. Класата Account претставува
  15. една сметка на еден корисник и треба да ги чува следните податоци:
  16.  
  17. Име на корисникот,
  18. единствен идентификационен број (long)
  19. тековното салдо на сметката.
  20. Оваа класа исто така треба да ги имплементира и следниве методи
  21.  
  22. Account(String name, String balance) – конструктор со параметри (id-то треба да го генерирате сами со помош на класата
  23. java.util.Random)
  24.  
  25. getBalance():String
  26. getName():String
  27. getId():long
  28. setBalance(String balance)
  29. toString():String – враќа стринг во следниот формат, \n означува нов ред
  30.  
  31. Name:Andrej Gajduk\n Balance:20.00$\n
  32.  
  33. Класата Transaction претставува трансакција (префрлување пари од една на друга сметка), од страна на банката за што
  34. честопати се наплаќа провизија. За почеток треба да се напише класата Transaction со податочни членови за идентификационите
  35. броеви на две сметки, едната од која се одземаат парите и друга на која се додаваат парите, текстуален опис и износ на
  36. трансакцијата.
  37.  
  38. За оваа класа треба да ги имплементирате методите:
  39.  
  40. Transaction(long fromId, long toId, Stirng description, String amount) – конструктор со параметри
  41. getAmount():String
  42. getFromId():long
  43. getToId():long
  44. Оваа класа треба да е immutable, а можете и да ја направите и апстрактна бидејќи не е наменета директно да се користи
  45. туку само како основна класа за изведување на други класи.
  46.  
  47. Како што споменавме претходно банката наплаќа провизија за одредени трансакции. Има два типа на провизија, фискна сума
  48. и процент. Кај фиксна сума за било која трансакција без разлика на износот на трансакцијата се наплаќа исто провизија
  49. (пример 10$). Кај процент за секој еден долар од трансакцијата банката наплаќа одреден процент провизија (на пример 5%,
  50. или 5 центи на секој долар – процентите секогаш се целобројни и провизија се наплаќа само на цели долари).
  51.  
  52. За да се прави разлика меѓу различните типови на провизија, треба да напишете уште две класи кои ќе наследуваат од
  53. Transaction кои треба да ги именувате FlatAmountProvisionTransaction и FlatPercentProvisionTransaction.
  54.  
  55. Првата класа FlatAmountProvisionTransaction треба да содржи соодветен конструктор
  56.  
  57. FlatAmountProvisionTransaction(long fromId, long toId,String amount, String flatProvision) кој го иницијализира полето
  58. за опис на "FlatAmount" и соодветен get метод
  59.  
  60. getFlatAmount():String
  61. Слично и класата FlatPercentProvisionTransaction треба да има соодветен конструктор
  62.  
  63. FlatPercentProvisionTransaction (long fromId, long toId, String amount, int centsPerDolar) кој го иницијализира полето
  64. за опис на "FlatPercent" и соодветен get метод
  65.  
  66. getPercent():int
  67. Исто така треба да се преоптовари equals(Object o):boolean методот и за двете класи.
  68.  
  69. За крај треба да ја имплементирате класата Bank која ги чува сметките од своите корисници и дополнително врши трансакции.
  70. Класата освен сметките на своите корисници, треба да ги чува и сопственото име и вкупната сума на трансфери како и
  71. вкупната наплатена провизија од страна на банката за сите трансакции.
  72.  
  73. Класата Bank треба да ги нуди следните методи:
  74.  
  75. Bank(String name, Account accounts[]) – конструктор со соодветните параметри (направете сопствена копија на низата
  76. од сметки)
  77. makeTransaction(Transaction t):boolean – врши проверка дали корисникот ги има потребните средства на сметка и дали и
  78. двете сметки на кои се однесува трансакцијата се нависитина во банката и ако и двата услови се исполнето ја извршува
  79. трансакцијата и враќа true, во спротивно враќа false
  80. totalTransfers():String – ја дава вкупната сума на пари кои се префрлени во сите трансакции до сега
  81. totalProvision():String – ја дава вкупната провизија наплатена од банката за сите извршени трансакции до сега
  82. toString():String - го враќа името на банката во посебна линија во формат
  83.  
  84. Name:Banka na RM\n \n по што следат податоците за сите корисници.
  85.  
  86. Провизијата се наплаќа така што на основната сума на трансакцијата се додава вредноста не провизијата и таа сума се
  87. одзема од првата сметка.
  88.  
  89. За сите класи да се напишат соодветни equals и hashCode методи.*/
  90.  
  91.  
  92. import java.util.*;
  93. import java.util.stream.Collectors;
  94. import java.util.Random;
  95. import java.text.DecimalFormat;
  96.  
  97.  
  98. class Account {
  99.    
  100.     private String name;
  101.     private String balance;
  102.     private long id;
  103.    
  104.     public long Random() {
  105.             Random rnd = new Random();
  106.             id = rnd.nextLong();
  107.             return id;
  108.         }
  109.    
  110.     public Account(String name, String balance) {
  111.         this.name = name;
  112.         setBalance(balance);
  113.         this.id = Random();
  114.     }
  115.    
  116.     public String getBalance() {
  117.         return balance;
  118.     }
  119.    
  120.     public static double getDouble(String s) {
  121.         return Double.parseDouble(s.substring(0,s.length()-1));
  122.     }
  123.    
  124.     public double getDoubleBalance() {
  125.         return Double.parseDouble(balance.substring(0,balance.length()-1));
  126.     }
  127.    
  128.     public String getName() {
  129.         return name;
  130.     }
  131.    
  132.     public long getId() {
  133.         return id;
  134.     }
  135.    
  136.     public void setBalance(String newBalance) {
  137.         DecimalFormat dm = new DecimalFormat("#0.00");
  138.         balance = dm.format(getDouble(newBalance));
  139.         balance += "$";
  140.     }
  141.    
  142.     @Override
  143.     public String toString() {
  144.         return "Name: " + getName() + "\n" + "Balance: " + getBalance() + "\n";  
  145.     }
  146.  
  147.     @Override
  148.     public int hashCode() {
  149.         final int prime = 31;
  150.         int result = 1;
  151.         result = prime * result + ((balance == null) ? 0 : balance.hashCode());
  152.         result = prime * result + (int) (id ^ (id >>> 32));
  153.         result = prime * result + ((name == null) ? 0 : name.hashCode());
  154.         return result;
  155.     }
  156.  
  157.     @Override
  158.     public boolean equals(Object obj) {
  159.         if (this == obj)
  160.             return true;
  161.         if (obj == null)
  162.             return false;
  163.         if (getClass() != obj.getClass())
  164.             return false;
  165.         Account other = (Account) obj;
  166.         if (balance == null) {
  167.             if (other.balance != null)
  168.                 return false;
  169.         } else if (!balance.equals(other.balance))
  170.             return false;
  171.         if (id != other.id)
  172.             return false;
  173.         if (name == null) {
  174.             if (other.name != null)
  175.                 return false;
  176.         } else if (!name.equals(other.name))
  177.             return false;
  178.         return true;
  179.     }
  180.        
  181. }
  182.  
  183. abstract class Transaction {
  184.    
  185.     private final long fromId;
  186.     private final long toId;
  187.     private String description;
  188.     private String amount;
  189.    
  190.     public Transaction(long fromId, long toId, String description, String amount) {
  191.         this.fromId = fromId;
  192.         this.toId = toId;
  193.         this.description = description;
  194.         this.amount = amount;
  195.     }
  196.    
  197.     public String getDescription() {
  198.     return description;
  199.     }
  200.    
  201.     public long getFromId() {
  202.         return fromId;
  203.     }
  204.    
  205.     public long getToId() {
  206.         return toId;
  207.     }
  208.    
  209.     public String getAmount() {
  210.         return amount;
  211.     }
  212.    
  213.     public double getDoubleAmount() {
  214.         return Double.parseDouble(amount.substring(0,amount.length()-1));
  215.     }
  216.    
  217.     public abstract double getProvision();
  218.  
  219.     @Override
  220.     public int hashCode() {
  221.         final int prime = 31;
  222.         int result = 1;
  223.         result = prime * result + ((amount == null) ? 0 : amount.hashCode());
  224.         result = prime * result + ((description == null) ? 0 : description.hashCode());
  225.         result = prime * result + (int) (fromId ^ (fromId >>> 32));
  226.         result = prime * result + (int) (toId ^ (toId >>> 32));
  227.         return result;
  228.     }
  229.  
  230.     @Override
  231.     public boolean equals(Object obj) {
  232.         if (this == obj)
  233.             return true;
  234.         if (obj == null)
  235.             return false;
  236.         if (getClass() != obj.getClass())
  237.             return false;
  238.         Transaction other = (Transaction) obj;
  239.         if (amount == null) {
  240.             if (other.amount != null)
  241.                 return false;
  242.         } else if (!amount.equals(other.amount))
  243.             return false;
  244.         if (description == null) {
  245.             if (other.description != null)
  246.                 return false;
  247.         } else if (!description.equals(other.description))
  248.             return false;
  249.         if (fromId != other.fromId)
  250.             return false;
  251.         if (toId != other.toId)
  252.             return false;
  253.         return true;
  254.     }  
  255. }
  256.  
  257. class FlatAmountProvisionTransaction extends Transaction {
  258.    
  259.     private String flatProvision;
  260.    
  261.     public FlatAmountProvisionTransaction(long fromId, long toId, String amount, String flatProvision) {
  262.         super(fromId,toId,"FlatAmount",amount);
  263.         this.flatProvision = flatProvision;
  264.     }
  265.    
  266.     public String getFlatAmount(){
  267.         return flatProvision;
  268.     }
  269.    
  270.     public double getDoubleFlatAmount() {
  271.         return Double.parseDouble(flatProvision.substring(0,flatProvision.length()-1));
  272.     }
  273.    
  274.     @Override
  275.     public double getProvision() {
  276.         return getDoubleFlatAmount();
  277.     }
  278.    
  279.     @Override
  280.     public double getDoubleAmount() {
  281.         return super.getDoubleAmount() + getDoubleFlatAmount();
  282.     }
  283.  
  284.     @Override
  285.     public int hashCode() {
  286.         final int prime = 31;
  287.         int result = super.hashCode();
  288.         result = prime * result + ((flatProvision == null) ? 0 : flatProvision.hashCode());
  289.         return result;
  290.     }
  291.  
  292.     @Override
  293.     public boolean equals(Object obj) {
  294.         if (this == obj)
  295.             return true;
  296.         if (!super.equals(obj))
  297.             return false;
  298.         if (getClass() != obj.getClass())
  299.             return false;
  300.         FlatAmountProvisionTransaction other = (FlatAmountProvisionTransaction) obj;
  301.         if (flatProvision == null) {
  302.             if (other.flatProvision != null)
  303.                 return false;
  304.         } else if (!flatProvision.equals(other.flatProvision))
  305.             return false;
  306.         return true;
  307.     }  
  308. }
  309.  
  310. class FlatPercentProvisionTransaction extends Transaction {
  311.    
  312.     private int flatPercent;
  313.    
  314.     public FlatPercentProvisionTransaction(long fromId, long toId, String amount, int centsPerDollar) {
  315.         super(fromId,toId,"FlatPercent",amount);
  316.         flatPercent = centsPerDollar;
  317.     }
  318.    
  319.     public int getPercent() {
  320.         return flatPercent;
  321.     }
  322.    
  323.     @Override
  324.     public double getProvision() {
  325.         return flatPercent / 100.0 * (int)super.getDoubleAmount();
  326.     }
  327.    
  328.     @Override
  329.     public double getDoubleAmount() {
  330.         return super.getDoubleAmount() + getProvision();
  331.     }
  332.  
  333.     @Override
  334.     public int hashCode() {
  335.         final int prime = 31;
  336.         int result = super.hashCode();
  337.         result = prime * result + flatPercent;
  338.         return result;
  339.     }
  340.  
  341.     @Override
  342.     public boolean equals(Object obj) {
  343.         if (this == obj)
  344.             return true;
  345.         if (!super.equals(obj))
  346.             return false;
  347.         if (getClass() != obj.getClass())
  348.             return false;
  349.         FlatPercentProvisionTransaction other = (FlatPercentProvisionTransaction) obj;
  350.         if (flatPercent != other.flatPercent)
  351.             return false;
  352.         return true;
  353.     }
  354. }
  355.  
  356. class Bank {
  357.    
  358.     private String name;
  359.     private Account[] accounts;
  360.     private double totalTransfer;
  361.     private double totalProvision;
  362.    
  363.     public Bank(String name, Account [] accounts) {
  364.         this.name = name;
  365.         this.accounts = Arrays.copyOf(accounts, accounts.length);
  366.         totalTransfer = 0;
  367.         totalProvision = 0;
  368.     }
  369.    
  370.     boolean makeTransaction(Transaction t) {
  371.         int indexFrom = findID(t.getFromId());
  372.         int indexTo = findID(t.getToId());
  373.        
  374.         if (indexFrom == -1)
  375.             return false;
  376.         if (indexTo == -1)
  377.             return false;
  378.        
  379.        
  380.         double balanceFrom = accounts[indexFrom].getDoubleBalance();
  381.         double balanceTo = accounts[indexTo].getDoubleBalance();
  382.         if ( balanceFrom < t.getDoubleAmount())
  383.             return false;
  384.        
  385.        
  386.         double totalSum = t.getDoubleAmount();
  387.         double provision = t.getProvision();
  388.         totalTransfer += (totalSum - provision);
  389.         totalProvision += provision;
  390.         balanceFrom -= totalSum;
  391.          if (indexFrom == indexTo) {
  392.             balanceTo -= provision;
  393.         }
  394.         else {
  395.         balanceTo += (totalSum - provision);
  396.         }
  397.        
  398.         accounts[indexFrom].setBalance(balanceFrom+"$");
  399.         accounts[indexTo].setBalance(balanceTo + "$");
  400.         return true;
  401.     }
  402.    
  403.     private int findID(long a){
  404.         int index = -1;
  405.         for (int i=0; i<accounts.length; ++i){
  406.             if (a == accounts[i].getId()){
  407.                 index = i;
  408.                 break;
  409.             }
  410.         }
  411.         return index;
  412.     }
  413.    
  414.     public String totalProvision() {
  415.         DecimalFormat dm = new DecimalFormat("#0.00");
  416.         return dm.format(totalProvision) + "$";
  417.     }
  418.    
  419.     public String totalTransfers() {
  420.         DecimalFormat dm = new DecimalFormat("#0.00");
  421.         return dm.format(totalTransfer) + "$";
  422.     }
  423.    
  424.     public Account[] getAccounts() {
  425.         return Arrays.copyOf(accounts, accounts.length);
  426.     }
  427.    
  428.     @Override
  429.     public String toString() {
  430.         StringBuilder sb = new StringBuilder();
  431.         sb.append("Name: " + name + "\n\n");
  432.         for (Account a: accounts)
  433.             sb.append(a.toString());
  434.         return sb.toString();
  435.     }
  436.  
  437.     @Override
  438.     public int hashCode() {
  439.         final int prime = 31;
  440.         int result = 1;
  441.         result = prime * result + Arrays.hashCode(accounts);
  442.         result = prime * result + ((name == null) ? 0 : name.hashCode());
  443.         long temp;
  444.         temp = Double.doubleToLongBits(totalProvision);
  445.         result = prime * result + (int) (temp ^ (temp >>> 32));
  446.         temp = Double.doubleToLongBits(totalTransfer);
  447.         result = prime * result + (int) (temp ^ (temp >>> 32));
  448.         return result;
  449.     }
  450.  
  451.     @Override
  452.     public boolean equals(Object obj) {
  453.         if (this == obj)
  454.             return true;
  455.         if (obj == null)
  456.             return false;
  457.         if (getClass() != obj.getClass())
  458.             return false;
  459.         Bank other = (Bank) obj;
  460.         if (!Arrays.equals(accounts, other.accounts))
  461.             return false;
  462.         if (name == null) {
  463.             if (other.name != null)
  464.                 return false;
  465.         } else if (!name.equals(other.name))
  466.             return false;
  467.         if (Double.doubleToLongBits(totalProvision) != Double.doubleToLongBits(other.totalProvision))
  468.             return false;
  469.         if (Double.doubleToLongBits(totalTransfer) != Double.doubleToLongBits(other.totalTransfer))
  470.             return false;
  471.         return true;
  472.     }
  473.    
  474. }
  475. public class BankTester {
  476.  
  477.     public static void main(String[] args) {
  478.         Scanner jin = new Scanner(System.in);
  479.         String test_type = jin.nextLine();
  480.         switch (test_type) {
  481.             case "typical_usage":
  482.                 testTypicalUsage(jin);
  483.                 break;
  484.             case "equals":
  485.                 testEquals();
  486.                 break;
  487.         }
  488.         jin.close();
  489.     }
  490.  
  491.     private static void testEquals() {
  492.         Account a1 = new Account("Andrej", "20.00$");
  493.         Account a2 = new Account("Andrej", "20.00$");
  494.         Account a3 = new Account("Andrej", "30.00$");
  495.         Account a4 = new Account("Gajduk", "20.00$");
  496.         List<Account> all = Arrays.asList(a1, a2, a3, a4);
  497.         if (!(a1.equals(a1)&&!a1.equals(a2)&&!a2.equals(a1)&&!a3.equals(a1)&&!a4.equals(a1)
  498.                 && !a1.equals(null))) {
  499.             System.out.println("Your account equals method does not work properly.");
  500.             return;
  501.         }
  502.         Set<Long> ids = all.stream().map(Account::getId).collect(Collectors.toSet());
  503.         if (ids.size() != all.size()) {
  504.             System.out.println("Different accounts have the same IDS. This is not allowed");
  505.             return;
  506.         }
  507.         FlatAmountProvisionTransaction fa1 = new FlatAmountProvisionTransaction(10, 20, "20.00$", "10.00$");
  508.         FlatAmountProvisionTransaction fa2 = new FlatAmountProvisionTransaction(20, 20, "20.00$", "10.00$");
  509.         FlatAmountProvisionTransaction fa3 = new FlatAmountProvisionTransaction(20, 10, "20.00$", "10.00$");
  510.         FlatAmountProvisionTransaction fa4 = new FlatAmountProvisionTransaction(10, 20, "50.00$", "50.00$");
  511.         FlatAmountProvisionTransaction fa5 = new FlatAmountProvisionTransaction(30, 40, "20.00$", "10.00$");
  512.         FlatPercentProvisionTransaction fp1 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 10);
  513.         FlatPercentProvisionTransaction fp2 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 10);
  514.         FlatPercentProvisionTransaction fp3 = new FlatPercentProvisionTransaction(10, 10, "20.00$", 10);
  515.         FlatPercentProvisionTransaction fp4 = new FlatPercentProvisionTransaction(10, 20, "50.00$", 10);
  516.         FlatPercentProvisionTransaction fp5 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 30);
  517.         FlatPercentProvisionTransaction fp6 = new FlatPercentProvisionTransaction(30, 40, "20.00$", 10);
  518.         if (fa1.equals(fa1) &&
  519.                 !fa2.equals(null) &&
  520.                 fa2.equals(fa1) &&
  521.                 fa1.equals(fa2) &&
  522.                 fa1.equals(fa3) &&
  523.                 !fa1.equals(fa4) &&
  524.                 !fa1.equals(fa5) &&
  525.                 !fa1.equals(fp1) &&
  526.                 fp1.equals(fp1) &&
  527.                 !fp2.equals(null) &&
  528.                 fp2.equals(fp1) &&
  529.                 fp1.equals(fp2) &&
  530.                 fp1.equals(fp3) &&
  531.                 !fp1.equals(fp4) &&
  532.                 !fp1.equals(fp5) &&
  533.                 !fp1.equals(fp6)) {
  534.             System.out.println("Your transactions equals methods do not work properly.");
  535.             return;
  536.         }
  537.         Account accounts[] = new Account[]{a1, a2, a3, a4};
  538.         Account accounts1[] = new Account[]{a2, a1, a3, a4};
  539.         Account accounts2[] = new Account[]{a1, a2, a3};
  540.         Account accounts3[] = new Account[]{a1, a2, a3, a4};
  541.  
  542.         Bank b1 = new Bank("Test", accounts);
  543.         Bank b2 = new Bank("Test", accounts1);
  544.         Bank b3 = new Bank("Test", accounts2);
  545.         Bank b4 = new Bank("Sample", accounts);
  546.         Bank b5 = new Bank("Test", accounts3);
  547.  
  548.         if (!(b1.equals(b1) &&
  549.                 !b1.equals(null) &&
  550.                 !b1.equals(b2) &&
  551.                 !b2.equals(b1) &&
  552.                 !b1.equals(b3) &&
  553.                 !b3.equals(b1) &&
  554.                 !b1.equals(b4) &&
  555.                 b1.equals(b5))) {
  556.             System.out.println("Your bank equals method do not work properly.");
  557.             return;
  558.         }
  559.         accounts[2] = a1;
  560.         if (!b1.equals(b5)) {
  561.             System.out.println("Your bank equals method do not work properly.");
  562.             return;
  563.         }
  564.         long from_id = a2.getId();
  565.         long to_id = a3.getId();
  566.         Transaction t = new FlatAmountProvisionTransaction(from_id, to_id, "3.00$", "3.00$");
  567.         b1.makeTransaction(t);
  568.         if (b1.equals(b5)) {
  569.             System.out.println("Your bank equals method do not work properly.");
  570.             return;
  571.         }
  572.         b5.makeTransaction(t);
  573.         if (!b1.equals(b5)) {
  574.             System.out.println("Your bank equals method do not work properly.");
  575.             return;
  576.         }
  577.         System.out.println("All your equals methods work properly.");
  578.     }
  579.  
  580.     private static void testTypicalUsage(Scanner jin) {
  581.         String bank_name = jin.nextLine();
  582.         int num_accounts = jin.nextInt();
  583.         jin.nextLine();
  584.         Account accounts[] = new Account[num_accounts];
  585.         for (int i = 0; i < num_accounts; ++i)
  586.             accounts[i] = new Account(jin.nextLine(), jin.nextLine());
  587.         Bank bank = new Bank(bank_name, accounts);
  588.         while (true) {
  589.             String line = jin.nextLine();
  590.             switch (line) {
  591.                 case "stop":
  592.                     return;
  593.                 case "transaction":
  594.                     String descrption = jin.nextLine();
  595.                     String amount = jin.nextLine();
  596.                     String parameter = jin.nextLine();
  597.                     int from_idx = jin.nextInt();
  598.                     int to_idx = jin.nextInt();
  599.                     jin.nextLine();
  600.                     Transaction t = getTransaction(descrption, from_idx, to_idx, amount, parameter, bank);
  601.                     System.out.println("Transaction amount: " + t.getAmount());
  602.                     System.out.println("Transaction description: " + t.getDescription());
  603.                     System.out.println("Transaction successful? " + bank.makeTransaction(t));
  604.                     break;
  605.                 case "print":
  606.                     System.out.println(bank.toString());
  607.                     System.out.println("Total provisions: " + bank.totalProvision());
  608.                     System.out.println("Total transfers: " + bank.totalTransfers());
  609.                     System.out.println();
  610.                     break;
  611.             }
  612.         }
  613.     }
  614.  
  615.     private static Transaction getTransaction(String description, int from_idx, int to_idx, String amount, String o, Bank bank) {
  616.         switch (description) {
  617.             case "FlatAmount":
  618.                 return new FlatAmountProvisionTransaction(bank.getAccounts()[from_idx].getId(),
  619.                         bank.getAccounts()[to_idx].getId(), amount, o);
  620.             case "FlatPercent":
  621.                 return new FlatPercentProvisionTransaction(bank.getAccounts()[from_idx].getId(),
  622.                         bank.getAccounts()[to_idx].getId(), amount, Integer.parseInt(o));
  623.         }
  624.         return null;
  625.     }
  626. }
Add Comment
Please, Sign In to add comment