From abf16ade315ba2626339713e798d87eba336c37f Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Wed, 01 Jun 2022 18:30:18 +0800
Subject: [PATCH] fix prd to test chain

---
 src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java          |    2 
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java  |   24 ++++++-
 src/main/java/cc/mrbird/febs/job/ChainListenerJob.java                    |   25 +++++++
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java  |   16 ++++
 src/main/java/cc/mrbird/febs/common/contants/AppContants.java             |    6 ++
 src/main/java/cc/mrbird/febs/job/SystemTradeJob.java                      |   18 ++++-
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java |   33 ++++++++--
 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java                    |   35 ++++++-----
 src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java            |    2 
 9 files changed, 123 insertions(+), 38 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
index 7c9381f..0d07cff 100644
--- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
+++ b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -137,12 +137,18 @@
      */
     public static final String REDIS_KEY_MINE_TRANSFER_POOL_TRADE_CNT = "MINE_TRANSFER_POOL_TRADE_CNT";
 
+    public static final String REDIS_KEY_BLOCK_COIN_NUM = "BLOCK_COIN_NUM";
+    public static final String REDIS_KEY_BLOCK_USDT_NUM = "BLOCK_USDT_NUM";
+
 
     public static final String DIC_TYPE_DISTRIBUTE_PROP = "DISTRIBUTE_PROP";
     public static final String DIC_TYPE_SYSTEM_SETTING = "SYSTEM_SETTING";
     public static final String DIC_TYPE_SLIP_POINT_SETTING = "SLIP_POINT_SETTING";
 
     public static final String DIC_VALUE_MINI_HOLD_COIN_LIMIT = "MINI_HOLD_COIN_LIMIT";
+    public static final String DIC_VALUE_SYSTEM_START_TARGET = "SYSTEM_START_TARGET";
+    public static final String DIC_VALUE_SYSTEM_SOURCE_POOL_VOL = "SYSTEM_SOURCE_POOL_VOL";
+    public static final String DIC_VALUE_SYSTEM_NODE_CNT_LIMIT = "SYSTEM_NODE_CNT_LIMIT";
 
     public static final String DESTROY_ADDRESS = "0x0000000000000000000000000000000000000000";
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
index 3e4500b..8a98bda 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -26,11 +26,12 @@
 
     /**
      * 币安 usdt合约
+     * 0x55d398326f99059fF775485246999027B3197955
      */
     BSC_USDT("BSC", "0x971c09aA9735EB98459B17EC8b48932D24CbB931",
             "0x5f38d0e63157f535fc21f89ea13ec3cd245691c20795c1d2cb60233b3ba7bb47",
-            "https://bsc-dataseed1.ninicoin.io",
-            "0x55d398326f99059fF775485246999027B3197955",
+            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "0x337610d27c682E347C9cD60BD4b3b107C9d34dDd",
             ""),
 
     /**
@@ -38,8 +39,8 @@
      */
     BSC_TFC("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
             "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
-            "https://bsc-dataseed1.ninicoin.io",
-            "0x6c6835e60e7dbad7a60112a6371271e8eb79ee68",
+            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             ""),
 
     /**
@@ -47,35 +48,35 @@
      */
     BSC_TFC_SOURCE("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
             "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
-            "https://bsc-dataseed1.ninicoin.io",
-            "0x6c6835e60e7dbad7a60112a6371271e8eb79ee68",
+            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             ""),
 
     /**
      * 源池U
      */
-    BSC_USDT_SOURCE("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
-            "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
-            "https://bsc-dataseed1.ninicoin.io",
-            "0x55d398326f99059fF775485246999027B3197955",
+    BSC_USDT_SOURCE("BSC", "0x4EbDCA102623b46a47042D580dddAdE2a53D057F",
+            "0x81c2c02d0c106c1e32ab060a37f6eb279c0649c30ea5cc1c4951e6a8dd4e963c",
+            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "0x337610d27c682E347C9cD60BD4b3b107C9d34dDd",
             ""),
 
     /**
      * 铸池币
      */
-    BSC_TFC_MAKE("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
-            "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
-            "https://bsc-dataseed1.ninicoin.io",
-            "0x6c6835e60e7dbad7a60112a6371271e8eb79ee68",
+    BSC_TFC_MAKE("BSC", "0xBae24dAa3aB94cfF8114a16A4267D769b3a651F8",
+            "0xc0cabaf5f1fce227e5f1b8a7f83a5dc28972389ffc59559d7852ce8d27c3bec4",
+            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             ""),
 
     /**
      * 技术池
      */
-    BSC_TFC_TECH("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
+    BSC_TFC_TECH("BSC", "0xD998DA7362360eFC6daDFEd6E9a32E70640d7600",
             "",
-            "https://bsc-dataseed1.ninicoin.io",
-            "0x6c6835e60e7dbad7a60112a6371271e8eb79ee68",
+            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             "");
 
     private String chain;
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
index 0d8af1b..e664354 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
@@ -60,4 +60,6 @@
      * 账号类型 admin normal
      */
     private String accountType;
+
+    private BigDecimal usdtBalance;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
index b29af8f..3f61eee 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
@@ -36,4 +36,6 @@
     void setNewestPrice(PriceSettingDto priceSettingDto);
 
     DappMemberEntity insertMember(String address, String refererId);
+
+    DappMemberEntity insertMember(String address, String refererId, String chainType, String accountType);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
index 355909e..32c165d 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
@@ -1,5 +1,7 @@
 package cc.mrbird.febs.dapp.service.impl;
 
+import cc.mrbird.febs.common.contants.AppContants;
+import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.ShareCodeUtil;
 import cc.mrbird.febs.dapp.chain.ChainEnum;
 import cc.mrbird.febs.dapp.chain.ChainService;
@@ -15,6 +17,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.web3j.utils.Numeric;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -33,18 +36,27 @@
     @Resource
     private DappFundFlowDao dappFundFlowDao;
 
+    @Resource
+    private RedisUtils redisUtils;
+
     private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25";
+
+    public static void main(String[] args) {
+        System.out.println(Numeric.toBigInt("0x12e4e85"));
+    }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void compile(EthUsdtContract.TransferEventResponse e) {
-        int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
         if (e.to != null) {
+            redisUtils.set(AppContants.REDIS_KEY_BLOCK_COIN_NUM, e.log.getBlockNumber());
+            int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
+
             // 合约创建时,同时创建地址
             if ("0x0000000000000000000000000000000000000000".equals(e.from)) {
                 DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null);
                 if (toMember == null) {
-                    toMember = dappMemberService.insertMember(e.to, "0");
+                    toMember = dappMemberService.insertMember(e.to, "0", "BSC", "admin");
                 }
                 return;
             }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
index 489d780..6e5ece7 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
@@ -7,9 +7,11 @@
 import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
 import cc.mrbird.febs.dapp.entity.DappMemberEntity;
 import cc.mrbird.febs.dapp.entity.DappOnlineTransferEntity;
+import cc.mrbird.febs.dapp.entity.DataDictionaryCustom;
 import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
 import cc.mrbird.febs.dapp.mapper.DappMemberDao;
 import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao;
+import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper;
 import cc.mrbird.febs.dapp.service.DappMemberService;
 import cc.mrbird.febs.rabbit.producer.ChainProducer;
 import cn.hutool.core.util.StrUtil;
@@ -44,16 +46,27 @@
 
     @Resource
     private DappOnlineTransferDao dappOnlineTransferDao;
+    @Resource
+    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
 
 
     @Override
     public void compile(EthUsdtContract.TransferEventResponse e) {
-        ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name());
-        int decimals = sourceUsdtInstance.decimals();
-        int tfcDecimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
+        if (e.to == null) {
+            return;
+        }
 
+        redisUtils.set(AppContants.REDIS_KEY_BLOCK_USDT_NUM, e.log.getBlockNumber());
         // 判断对方打款地址是否为源池地址
         if (ChainEnum.BSC_TFC_SOURCE.getAddress().equals(e.to)) {
+            ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name());
+            int decimals = sourceUsdtInstance.decimals();
+            int tfcDecimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
+
+            if (e.from.equals("0xaa25aa7a19f9c426e07dee59b12f944f4d9f1dd3")) {
+                return;
+            }
+
             DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null);
             // 如果此时fromMember为null,则说明该用户未经过转账绑定关系,而是直接注册并购买币,则将关系绑定到顶级账户
             if (fromMember == null) {
@@ -88,9 +101,12 @@
                 chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
             }
 
+            DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_SYSTEM_START_TARGET);
+            BigDecimal target = new BigDecimal(dic.getValue());
+
             // 若源池中的USDT达到或超过8万U,则启动整个系统
             BigDecimal balance = sourceUsdtInstance.balanceOf(ChainEnum.BSC_USDT_SOURCE.getAddress());
-            if (BigDecimal.valueOf(80000).compareTo(balance) < 1) {
+            if (target.compareTo(balance) < 1) {
                 redisUtils.set(AppContants.SYSTEM_START_FLAG, "start");
             }
         }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
index 7e41717..9e447f9 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -7,19 +7,14 @@
 import cc.mrbird.febs.common.utils.LoginUserUtil;
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.ShareCodeUtil;
+import cc.mrbird.febs.dapp.chain.ChainEnum;
 import cc.mrbird.febs.dapp.chain.ChainService;
 import cc.mrbird.febs.dapp.chain.ContractChainService;
 import cc.mrbird.febs.dapp.dto.ApproveDto;
 import cc.mrbird.febs.dapp.dto.ConnectDto;
 import cc.mrbird.febs.dapp.dto.PriceSettingDto;
-import cc.mrbird.febs.dapp.entity.DappMemberEntity;
-import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity;
-import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity;
-import cc.mrbird.febs.dapp.entity.DappWalletMineEntity;
-import cc.mrbird.febs.dapp.mapper.DappMemberDao;
-import cc.mrbird.febs.dapp.mapper.DappTransferRecordDao;
-import cc.mrbird.febs.dapp.mapper.DappWalletCoinDao;
-import cc.mrbird.febs.dapp.mapper.DappWalletMineDao;
+import cc.mrbird.febs.dapp.entity.*;
+import cc.mrbird.febs.dapp.mapper.*;
 import cc.mrbird.febs.dapp.service.DappMemberService;
 import cc.mrbird.febs.system.entity.User;
 import cn.hutool.core.collection.CollUtil;
@@ -34,6 +29,7 @@
 
 import java.math.BigDecimal;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -49,6 +45,7 @@
     private final DappWalletMineDao dappWalletMineDao;
     private final DappTransferRecordDao dappTransferRecordDao;
     private final RedisUtils redisUtils;
+    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -258,8 +255,28 @@
 
     @Override
     public DappMemberEntity insertMember(String address, String refererId) {
+
+        return insertMember(address, refererId, "BSC", "normal");
+    }
+
+    @Override
+    public DappMemberEntity insertMember(String address, String refererId, String chainType, String accountType) {
         DappMemberEntity member = new DappMemberEntity();
         member.setAddress(address);
+        member.setChainType(chainType);
+        member.setAccountType(accountType);
+        member.setBalance(ChainService.getInstance(ChainEnum.BSC_TFC.name()).balanceOf(address));
+        member.setUsdtBalance(ChainService.getInstance(ChainEnum.BSC_USDT.name()).balanceOf(address));
+
+        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_SYSTEM_NODE_CNT_LIMIT);
+        int nodeCntLimit = Integer.parseInt(dic.getValue());
+
+        List<DappMemberEntity> memberCount = dappMemberDao.selectList(null);
+        if (memberCount.size() <= (nodeCntLimit + 4)) {
+            member.setNodeType(1);
+        } else {
+            member.setNodeType(2);
+        }
 
         dappMemberDao.insert(member);
 
diff --git a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
index 6c64330..04c0bbb 100644
--- a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
+++ b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
@@ -1,5 +1,7 @@
 package cc.mrbird.febs.job;
 
+import cc.mrbird.febs.common.contants.AppContants;
+import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.dapp.chain.ChainEnum;
 import cc.mrbird.febs.dapp.chain.ChainService;
 import cc.mrbird.febs.dapp.chain.ContractEventService;
@@ -20,10 +22,29 @@
     @Autowired
     private ContractEventService bscUsdtContractEvent;
 
+    @Autowired
+    private RedisUtils redisUtils;
+
     @PostConstruct
     public void chainListenerJob() {
         log.info("监听打开");
-//        ChainService.contractEventListener(new BigInteger("18097238"), bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
-//        ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name());
+        BigInteger usdtBlock;
+        BigInteger coinBlock;
+        Object usdt = redisUtils.get(AppContants.REDIS_KEY_BLOCK_USDT_NUM);
+        if (usdt == null) {
+            usdtBlock = new BigInteger("19811973");
+        } else {
+            usdtBlock = (BigInteger) usdt;
+        }
+
+        Object coin = redisUtils.get(AppContants.REDIS_KEY_BLOCK_COIN_NUM);
+        if (coin == null) {
+            coinBlock = new BigInteger("19811973");
+        } else {
+            coinBlock = (BigInteger) coin;
+        }
+
+        ChainService.contractEventListener(usdtBlock, bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
+        ChainService.contractEventListener(coinBlock, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java b/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
index d1b5ec2..95ec77f 100644
--- a/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
+++ b/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
@@ -4,6 +4,8 @@
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.dapp.chain.ChainEnum;
 import cc.mrbird.febs.dapp.chain.ChainService;
+import cc.mrbird.febs.dapp.entity.DataDictionaryCustom;
+import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper;
 import cc.mrbird.febs.dapp.service.DappSystemService;
 import cc.mrbird.febs.dapp.vo.RedisTransferPoolVo;
 import lombok.extern.slf4j.Slf4j;
@@ -11,6 +13,7 @@
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 
@@ -26,11 +29,11 @@
     private RedisUtils redisUtils;
     @Autowired
     private DappSystemService systemService;
+    @Resource
+    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
 
     // 最低容量(百分比)
     private final BigDecimal volProp = new BigDecimal("0.5");
-
-    private final BigDecimal basic_vol = BigDecimal.valueOf(1200000);
 
     /**
      * 中转池容量计算
@@ -44,10 +47,15 @@
     @Scheduled(cron = "0 0 0 * * ?")
     public void transferPoolVol() {
         log.info("中转池容量");
+
+        // 源池初始化容量
+        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_SYSTEM_SOURCE_POOL_VOL);
+        BigDecimal basicVol = new BigDecimal(dic.getValue());
+
         Object o = redisUtils.get(AppContants.REDIS_KEY_TRANSFER_POOL_VOL);
         if (o == null) {
             RedisTransferPoolVo transferPool= new RedisTransferPoolVo();
-            BigDecimal total = basic_vol.multiply(volProp.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP));
+            BigDecimal total = basicVol.multiply(volProp.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP));
             transferPool.setTodayVol(total);
             transferPool.setTodayProp(volProp);
             transferPool.setFinishCnt(0);
@@ -77,7 +85,7 @@
                 transferPool.setFinishCnt(finishCnt);
             }
 
-            BigDecimal total = basic_vol.multiply(targetProp.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP));
+            BigDecimal total = basicVol.multiply(targetProp.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP));
             transferPool.setTodayVol(total);
             transferPool.setUnFinishCnt(0);
             redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN, total);
@@ -93,7 +101,7 @@
                 transferPool.setUnFinishCnt(unFinishCnt);
             }
             BigDecimal aa = targetProp.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP);
-            BigDecimal total = basic_vol.multiply(aa);
+            BigDecimal total = basicVol.multiply(aa);
             transferPool.setTodayVol(total);
             redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN, total);
         }

--
Gitblit v1.9.1