Contract 0x0000000000000000000000000000000000001004 8

 

Contract Overview

BSC: Token Hub
Balance:
154,429,678.625498072273230868 BNB

BNB Value:
$51,498,691,734.18 (@ $333.48/BNB)

Token:
My Name Tag:
Not Available, login to update

ContractCreator:
GENESIS at txn GENESIS_0000000000000000000000000000000000001004
Txn Hash
Block
From
To
Value [Txn Fee]
0xdd487edab15e11b409b5c44ef6eb972d3e8c028a8235b1c7c98c76836c25aabb97569862021-08-05 2:08:5613 secs ago0xb8daa5024943a80d77269e5ae1a0e22308c9abe6 IN  BSC: Token Hub0.002 BNB0.00052367
0x5eaa35954687c14d9d28d55b1d5bc485b72d9913e2a4f187ddb7b5329d5c072497569742021-08-05 2:08:2049 secs ago0x2ba51f351a4f72b1482d6e4304616851fa0f538c IN  BSC: Token Hub0.192 BNB0.00038131
0x78692b6cd129ef0bd3258df7708b8bf70f54567cf8504ba4d92192fdff922b6d97569732021-08-05 2:08:1752 secs ago0x11efc2bd1940a6a152622eebef8692fa5ce0dc7a IN  BSC: Token Hub18.002 BNB0.00038131
0x1226366a5ddd887257541387ca7ec7cd3275145e06bf86487b37c1be3d51530297569672021-08-05 2:07:581 min ago0x2bdcfc957528fb2f780385d1b6763aca18db170e IN  BSC: Token Hub0.06433946 BNB0.000381875
0x1385638d826d7cdc9b74cbd032d52cb4a1e5c563e9b40d09ccbfafeea7a96dce97569622021-08-05 2:07:411 min ago0x5dd156136b91d2de279defcf67c838a4ff3e7d14 IN  BSC: Token Hub0.01603615 BNB0.000381935
0x4d4b14d72b86745bdf23553786fcb97bcbd34707de42b482c1396daba00f2d5c97569562021-08-05 2:07:231 min ago0xa3121e49bd253ecd698f9a2ddc71162a4c9615ac IN  BSC: Token Hub0.302 BNB0.00040231
0x402043aefc4b08dd22a1258d6ac806077f45745ae217c6729dece5bfa2c3c8a597569512021-08-05 2:07:042 mins ago0x1bb8dc72dab7e04b23251f4db295f95c6f66241c IN  BSC: Token Hub0.05331168 BNB0.00035668
0x9af73a4f180238fed63ab4d985a23a684e50d5748a5e92b3287176b37a0b323a97569512021-08-05 2:07:042 mins ago0x2359a83c051c49044a7d1f5cf45a8b280a2668a4 IN  BSC: Token Hub0.00984977 BNB0.000381875
0xe15076a224da36529ae89b8e868db89f0e8c22eb0f8fde61cfbbe373f0199ec797569402021-08-05 2:06:312 mins ago0xd6247696c8ebe4a1941c545f5810db3d63cb722f IN  BSC: Token Hub0.01 BNB0.000381875
0xfd6437a77f9c3dd97b38a133865668fdf6fd6a4863039d34c367151a2d2c3ac897569372021-08-05 2:06:222 mins ago0xe193dab9955d6fde075fd94af28ac462770ca5e6 IN  BSC: Token Hub0.2265588 BNB0.00038137
0x195f423a535ce6c4267c470dc1eb0dade04b7149c6297439f245d17e4acf2c2697569362021-08-05 2:06:192 mins ago0x8036c81263dbdb88c8ae4f10d292a1c3c972414f IN  BSC: Token Hub0.01529985 BNB0.000381935
0xe201d1af446c3b769b29f5f972138626f6e5948aa4e7de488446dd8240f18bf797569122021-08-05 2:05:074 mins ago0x4fea5cafa3d0d87261159b5a3b9c36f5865d2cb1 IN  BSC: Token Hub1.40014028 BNB0.00038137
0xffbf3d4cc5f2b45fb49e202b7ba71aeeedbe38f15a33523ec28540548293c36197569092021-08-05 2:04:584 mins ago0x0ab2b478811b0905553c8c6cf6fc4d9524c1d1ee IN  BSC: Token Hub0.10480594 BNB0.000381995
0x8b82d9b23fc47bf388eaa9a5b6d9d6be77eb50e9b71e499f2de87eb7c6b9ca8997569082021-08-05 2:04:554 mins ago0x220133e89abd6d3071617c3b3b72e34a984502d3 IN  BSC: Token Hub0.11419147 BNB0.000381995
0xf844ff81749e02feb641319604cc60d98951b0b2cf590952a8fe0fae2f45963e97569072021-08-05 2:04:524 mins ago0xcfc79fee67b3d495978ef736267e39524886dfcb IN  BSC: Token Hub22.26804499 BNB0.00038137
0x2b94e22ff8f659c8515e024d5f14ea8d8e0f7c92a1926a3446bf0ab372f64d9697569062021-08-05 2:04:494 mins ago0xff9750a9e7966afce248dc5485918e2927af29b4 IN  BSC: Token Hub4.93198751 BNB0.00038137
0x7ca7865fc48ca16b7489d4cd89e027cb44a44a2f553b8e0cd38efd3d562a667297569052021-08-05 2:04:464 mins ago0x8e0de74d004b87936cbee48b4cf79a985e8f8ee1 IN  BSC: Token Hub0.00665588 BNB0.000381935
0x3bda4b0e8f1581a070c241890104ff6a66da56661ad8d06265c76e71a7cf983f97569022021-08-05 2:04:374 mins ago0xd21d4f896973fe487ec6071755cc0ad0acbc8bea IN  BSC: Token Hub1.17427693 BNB0.00040237
0xac1cf7c1bdfb738d7ffbb7dd901e86a4add5c8d7a41e42119ef850b00bed3bcd97568962021-08-05 2:04:194 mins ago0x986209dcb7feaffdcec789fefd4fea4e7970eed6 IN  BSC: Token Hub0.297 BNB0.000356115
0x8088b52a88eec2b06c6965998e8e67b818c861a5ffb29e7b06f965607522f0e697568962021-08-05 2:04:194 mins ago0x3d1e5f8b7b76474171f9b8bddf5f74157206e128 IN  BSC: Token Hub2.652 BNB0.00038131
0xfa46b88d479999b3c438d18599c03efef970eb55646bb7ee08e3bef6b2def83197568832021-08-05 2:03:405 mins ago0x4f2670d03c92b0a75b14ff0abe2ec8c449554a3f IN  BSC: Token Hub0.04545042 BNB0.000381935
0xfd7252cfe6c449a72164006947f6ddd195a0ce7b81265cd684d4057d9426cd4197568772021-08-05 2:03:225 mins ago0x5ed7c03727700613dbbb36648a80c9d1db719537 IN  BSC: Token Hub0.002 BNB0.000447735
0x807055487f3f5933196fff12da967759493864f2aa32aba0ecbb0f66602c3a9d97568762021-08-05 2:03:195 mins ago0xed0a842fc40736dbb8048b36840d2b534595ceb6 IN  BSC: Token Hub0.06208204 BNB0.000402935
0x286ac50c0dfefe3af52c1f09f5824f8d8decdb60b3ed4c0b1489f27f11877bd597568752021-08-05 2:03:165 mins ago0x6436b89bba09a6a351b1c4de12d2b6e3acf061de IN  BSC: Token Hub1.002 BNB0.000356055
0x81330d2c9a9c302df1a88f763a7f3262ff532fb67913451770aa9ad07029b75097568752021-08-05 2:03:165 mins ago0xf2335b0746f6d2cb4eb7c9ede45fa212d64f0c02 IN  BSC: Token Hub0.002 BNB0.000449965
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0f75d9f151ab250ef15ed7818602219b0e3e0c1944577926d1c27b2e1a0b2baf97569672021-08-05 2:07:581 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x0f75d9f151ab250ef15ed7818602219b0e3e0c1944577926d1c27b2e1a0b2baf97569672021-08-05 2:07:581 min ago BSC: Token Hub0xfe2e072ef1a25fe09e27635e0b7e9444fe39c8f20.03869133 BNB
0xdac9eeff04e7ae0e2fd65dcc6799a2edbfc399860f45c7e16901739ad5c8194497569672021-08-05 2:07:581 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xdac9eeff04e7ae0e2fd65dcc6799a2edbfc399860f45c7e16901739ad5c8194497569672021-08-05 2:07:581 min ago BSC: Token Hub0x4ba4466e1e2ae79aa49d40ac3b9fa6c19797324e0.00947499 BNB
0x3859c0e237b449df4e750eb04e90bc076c040210ad74f3ddde55b0f63190ec8097569672021-08-05 2:07:581 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x3859c0e237b449df4e750eb04e90bc076c040210ad74f3ddde55b0f63190ec8097569672021-08-05 2:07:581 min ago BSC: Token Hub0x4c469cad5c53ff3c2b0c333725806d5a6c47578f0.0898 BNB
0xd3dff4d4e41fb5db259b09fc637776e743048291778b573d5b9daf6f2f55846397569652021-08-05 2:07:521 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xd3dff4d4e41fb5db259b09fc637776e743048291778b573d5b9daf6f2f55846397569652021-08-05 2:07:521 min ago BSC: Token Hub0xa1d7b575aed83599198b36595419a0cf067428980.02995408 BNB
0x92a0dd1381ff95694fbe6f6f182444546ea2cf7e6d201f0e65d743116943bc9697569652021-08-05 2:07:521 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x92a0dd1381ff95694fbe6f6f182444546ea2cf7e6d201f0e65d743116943bc9697569652021-08-05 2:07:521 min ago BSC: Token Hub0x4c3f5fecf068498a2f029e2f5b8889ee1c4d8d9c0.686 BNB
0xf54cf84854d1ef2b3f142d60615e965be2478567ce403b3f5ffad3f683fcb23597569642021-08-05 2:07:491 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xf54cf84854d1ef2b3f142d60615e965be2478567ce403b3f5ffad3f683fcb23597569642021-08-05 2:07:491 min ago BSC: Token Hub0x33512fab77e55fd3e56fe32834ccafa4347e1ff53.91927497 BNB
0xcb6ef8bf2e9c7c7e79720b305af50d37ae69d4c3e8c7cbe7b4520ec9f65103bd97569592021-08-05 2:07:321 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xcb6ef8bf2e9c7c7e79720b305af50d37ae69d4c3e8c7cbe7b4520ec9f65103bd97569592021-08-05 2:07:321 min ago BSC: Token Hub0xce8a9107eb4435ee66a56f82784e9e05ecfd0ae31.4 BNB
0x78abe4268a3aacfb1a798d6ea6e6ba7d8e6acfddf15f29570eeb80c009520c1097569582021-08-05 2:07:291 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x78abe4268a3aacfb1a798d6ea6e6ba7d8e6acfddf15f29570eeb80c009520c1097569582021-08-05 2:07:291 min ago BSC: Token Hub0x527138529e4584f691e7aa326aad7a4a830647960.303775 BNB
0xaaf73b6cb5c843c687bef2fd5bc4e1a722ce0f69e9e989afe23f5236cd75bc6497569582021-08-05 2:07:291 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xaaf73b6cb5c843c687bef2fd5bc4e1a722ce0f69e9e989afe23f5236cd75bc6497569582021-08-05 2:07:291 min ago BSC: Token Hub0x599bf9eecd55c1b01e555b62919e45e047a4edfb0.2416 BNB
0x17723aad1e60e6f4f06b6575ad409711f013e786a17121ff45c933d44635e4ef97569572021-08-05 2:07:261 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x17723aad1e60e6f4f06b6575ad409711f013e786a17121ff45c933d44635e4ef97569572021-08-05 2:07:261 min ago BSC: Token Hub0xfd277c4be3bee8b1a3e54a36abb5df2c746fa4340.018 BNB
0xcea71b07359b729745bb002aef2dbf9d5b6aaa7764535b5270b13fd25196e03597569552021-08-05 2:07:191 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xcea71b07359b729745bb002aef2dbf9d5b6aaa7764535b5270b13fd25196e03597569552021-08-05 2:07:191 min ago BSC: Token Hub0xb43400c3f4aa1f80c96e32da8c8bad6eec43e65a0.032 BNB
0x1bbe075b2f627b93fe960a42e06aacd80cb1e42fdf427f30e0858ea5e4909f3397569552021-08-05 2:07:191 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x1bbe075b2f627b93fe960a42e06aacd80cb1e42fdf427f30e0858ea5e4909f3397569552021-08-05 2:07:191 min ago BSC: Token Hub0x3582ed53c3d53947efb8d18dd34485f2cd31aab70.049035 BNB
0x0a151092a84e5a1731d38e25599615804d27b3965833b15760f12a939bb411cf97569492021-08-05 2:06:582 mins ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenHub

Compiler Version
v0.6.4+commit.1dca32f3

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-03-01
*/

// File: contracts/interface/IBEP20.sol

pragma solidity 0.6.4;

interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address _owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/interface/ITokenHub.sol

pragma solidity 0.6.4;

interface ITokenHub {

  function getMiniRelayFee() external view returns(uint256);

  function getContractAddrByBEP2Symbol(bytes32 bep2Symbol) external view returns(address);

  function getBep2SymbolByContractAddr(address contractAddr) external view returns(bytes32);

  function bindToken(bytes32 bep2Symbol, address contractAddr, uint256 decimals) external;

  function unbindToken(bytes32 bep2Symbol, address contractAddr) external;

  function transferOut(address contractAddr, address recipient, uint256 amount, uint64 expireTime)
    external payable returns (bool);

  /* solium-disable-next-line */
  function batchTransferOutBNB(address[] calldata recipientAddrs, uint256[] calldata amounts, address[] calldata refundAddrs,
    uint64 expireTime) external payable returns (bool);

}

// File: contracts/interface/IParamSubscriber.sol

pragma solidity 0.6.4;

interface IParamSubscriber {
    function updateParam(string calldata key, bytes calldata value) external;
}

// File: contracts/interface/IApplication.sol

pragma solidity 0.6.4;

interface IApplication {
    /**
     * @dev Handle syn package
     */
    function handleSynPackage(uint8 channelId, bytes calldata msgBytes) external returns(bytes memory responsePayload);

    /**
     * @dev Handle ack package
     */
    function handleAckPackage(uint8 channelId, bytes calldata msgBytes) external;

    /**
     * @dev Handle fail ack package
     */
    function handleFailAckPackage(uint8 channelId, bytes calldata msgBytes) external;
}

// File: contracts/interface/ICrossChain.sol

pragma solidity 0.6.4;

interface ICrossChain {
    /**
     * @dev Send package to Binance Chain
     */
    function sendSynPackage(uint8 channelId, bytes calldata msgBytes, uint256 relayFee) external;
}

// File: contracts/interface/ISystemReward.sol

pragma solidity 0.6.4;

interface ISystemReward {
  function claimRewards(address payable to, uint256 amount) external returns(uint256 actualAmount);
}

// File: contracts/lib/SafeMath.sol

pragma solidity 0.6.4;

/**
 * Copyright (c) 2016-2019 zOS Global Limited
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts/lib/RLPEncode.sol

pragma solidity 0.6.4;

library RLPEncode {

    uint8 constant STRING_OFFSET = 0x80;
    uint8 constant LIST_OFFSET = 0xc0;

    /**
     * @notice Encode string item
     * @param self The string (ie. byte array) item to encode
     * @return The RLP encoded string in bytes
     */
    function encodeBytes(bytes memory self) internal pure returns (bytes memory) {
        if (self.length == 1 && self[0] <= 0x7f) {
            return self;
        }
        return mergeBytes(encodeLength(self.length, STRING_OFFSET), self);
    }

    /**
     * @notice Encode address
     * @param self The address to encode
     * @return The RLP encoded address in bytes
     */
    function encodeAddress(address self) internal pure returns (bytes memory) {
        bytes memory b;
        assembly {
            let m := mload(0x40)
            mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, self))
            mstore(0x40, add(m, 52))
            b := m
        }
        return encodeBytes(b);
    }

    /**
     * @notice Encode uint
     * @param self The uint to encode
     * @return The RLP encoded uint in bytes
     */
    function encodeUint(uint self) internal pure returns (bytes memory) {
        return encodeBytes(toBinary(self));
    }

    /**
     * @notice Encode int
     * @param self The int to encode
     * @return The RLP encoded int in bytes
     */
    function encodeInt(int self) internal pure returns (bytes memory) {
        return encodeUint(uint(self));
    }

    /**
     * @notice Encode bool
     * @param self The bool to encode
     * @return The RLP encoded bool in bytes
     */
    function encodeBool(bool self) internal pure returns (bytes memory) {
        bytes memory rs = new bytes(1);
        if (self) {
            rs[0] = bytes1(uint8(1));
        }
        return rs;
    }

    /**
     * @notice Encode list of items
     * @param self The list of items to encode, each item in list must be already encoded
     * @return The RLP encoded list of items in bytes
     */
    function encodeList(bytes[] memory self) internal pure returns (bytes memory) {
        if (self.length == 0) {
            return new bytes(0);
        }
        bytes memory payload = self[0];
        for (uint i = 1; i < self.length; i++) {
            payload = mergeBytes(payload, self[i]);
        }
        return mergeBytes(encodeLength(payload.length, LIST_OFFSET), payload);
    }

    /**
     * @notice Concat two bytes arrays
     * @param _preBytes The first bytes array
     * @param _postBytes The second bytes array
     * @return The merged bytes array
     */
    function mergeBytes(
        bytes memory _preBytes,
        bytes memory _postBytes
    )
    internal
    pure
    returns (bytes memory)
    {
        bytes memory tempBytes;

        assembly {
        // Get a location of some free memory and store it in tempBytes as
        // Solidity does for memory variables.
            tempBytes := mload(0x40)

        // Store the length of the first bytes array at the beginning of
        // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

        // Maintain a memory counter for the current write location in the
        // temp bytes array by adding the 32 bytes for the array length to
        // the starting location.
            let mc := add(tempBytes, 0x20)
        // Stop copying when the memory counter reaches the length of the
        // first bytes array.
            let end := add(mc, length)

            for {
            // Initialize a copy counter to the start of the _preBytes data,
            // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
            // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
            // Write the _preBytes data into the tempBytes memory 32 bytes
            // at a time.
                mstore(mc, mload(cc))
            }

        // Add the length of _postBytes to the current length of tempBytes
        // and store it as the new length in the first 32 bytes of the
        // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

        // Move the memory counter back from a multiple of 0x20 to the
        // actual end of the _preBytes data.
            mc := end
        // Stop copying when the memory counter reaches the new combined
        // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

        // Update the free-memory pointer by padding our last write location
        // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
        // next 32 byte block, then round down to the nearest multiple of
        // 32. If the sum of the length of the two arrays is zero then add
        // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(0x40, and(
            add(add(end, iszero(add(length, mload(_preBytes)))), 31),
            not(31) // Round down to the nearest 32 bytes.
            ))
        }

        return tempBytes;
    }

    /**
     * @notice Encode the first byte, followed by the `length` in binary form if `length` is more than 55.
     * @param length The length of the string or the payload
     * @param offset `STRING_OFFSET` if item is string, `LIST_OFFSET` if item is list
     * @return RLP encoded bytes
     */
    function encodeLength(uint length, uint offset) internal pure returns (bytes memory) {
        require(length < 256**8, "input too long");
        bytes memory rs = new bytes(1);
        if (length <= 55) {
            rs[0] = byte(uint8(length + offset));
            return rs;
        }
        bytes memory bl = toBinary(length);
        rs[0] = byte(uint8(bl.length + offset + 55));
        return mergeBytes(rs, bl);
    }

    /**
     * @notice Encode integer in big endian binary form with no leading zeroes
     * @param x The integer to encode
     * @return RLP encoded bytes
     */
    function toBinary(uint x) internal pure returns (bytes memory) {
        bytes memory b = new bytes(32);
        assembly {
            mstore(add(b, 32), x)
        }
        uint i;
        if (x & 0xffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 == 0) {
            i = 24;
        } else if (x & 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 == 0) {
            i = 16;
        } else {
            i = 0;
        }
        for (; i < 32; i++) {
            if (b[i] != 0) {
                break;
            }
        }
        uint length = 32 - i;
        bytes memory rs = new bytes(length);
        assembly {
            mstore(add(rs, length), x)
            mstore(rs, length)
        }
        return rs;
    }
}

// File: contracts/lib/RLPDecode.sol

pragma solidity 0.6.4;

library RLPDecode {
    uint8 constant STRING_SHORT_START = 0x80;
    uint8 constant STRING_LONG_START  = 0xb8;
    uint8 constant LIST_SHORT_START   = 0xc0;
    uint8 constant LIST_LONG_START    = 0xf8;

    uint8 constant WORD_SIZE = 32;

    struct RLPItem {
        uint len;
        uint memPtr;
    }

    struct Iterator {
        RLPItem item;   // Item that's being iterated over.
        uint nextPtr;   // Position of the next item in the list.
    }

    function next(Iterator memory self) internal pure returns (RLPItem memory) {
        require(hasNext(self));

        uint ptr = self.nextPtr;
        uint itemLength = _itemLength(ptr);
        self.nextPtr = ptr + itemLength;

        return RLPItem(itemLength, ptr);
    }

    function hasNext(Iterator memory self) internal pure returns (bool) {
        RLPItem memory item = self.item;
        return self.nextPtr < item.memPtr + item.len;
    }

    function toRLPItem(bytes memory self) internal pure returns (RLPItem memory) {
        uint memPtr;
        assembly {
            memPtr := add(self, 0x20)
        }

        return RLPItem(self.length, memPtr);
    }

    function iterator(RLPItem memory self) internal pure returns (Iterator memory) {
        require(isList(self));

        uint ptr = self.memPtr + _payloadOffset(self.memPtr);
        return Iterator(self, ptr);
    }

    function rlpLen(RLPItem memory item) internal pure returns (uint) {
        return item.len;
    }

    function payloadLen(RLPItem memory item) internal pure returns (uint) {
        return item.len - _payloadOffset(item.memPtr);
    }

    function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) {
        require(isList(item));

        uint items = numItems(item);
        RLPItem[] memory result = new RLPItem[](items);

        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint dataLen;
        for (uint i = 0; i < items; i++) {
            dataLen = _itemLength(memPtr);
            result[i] = RLPItem(dataLen, memPtr);
            memPtr = memPtr + dataLen;
        }

        return result;
    }

    function isList(RLPItem memory item) internal pure returns (bool) {
        if (item.len == 0) return false;

        uint8 byte0;
        uint memPtr = item.memPtr;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < LIST_SHORT_START)
            return false;
        return true;
    }

    function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) {
        bytes memory result = new bytes(item.len);
        if (result.length == 0) return result;

        uint ptr;
        assembly {
            ptr := add(0x20, result)
        }

        copy(item.memPtr, ptr, item.len);
        return result;
    }

    function toBoolean(RLPItem memory item) internal pure returns (bool) {
        require(item.len == 1);
        uint result;
        uint memPtr = item.memPtr;
        assembly {
            result := byte(0, mload(memPtr))
        }

        return result == 0 ? false : true;
    }

    function toAddress(RLPItem memory item) internal pure returns (address) {
        // 1 byte for the length prefix
        require(item.len == 21);

        return address(toUint(item));
    }

    function toUint(RLPItem memory item) internal pure returns (uint) {
        require(item.len > 0 && item.len <= 33);

        uint offset = _payloadOffset(item.memPtr);
        require(item.len >= offset, "length is less than offset");
        uint len = item.len - offset;

        uint result;
        uint memPtr = item.memPtr + offset;
        assembly {
            result := mload(memPtr)

        // shfit to the correct location if neccesary
            if lt(len, 32) {
                result := div(result, exp(256, sub(32, len)))
            }
        }

        return result;
    }

    // enforces 32 byte length
    function toUintStrict(RLPItem memory item) internal pure returns (uint) {
        // one byte prefix
        require(item.len == 33);

        uint result;
        uint memPtr = item.memPtr + 1;
        assembly {
            result := mload(memPtr)
        }

        return result;
    }

    function toBytes(RLPItem memory item) internal pure returns (bytes memory) {
        require(item.len > 0);

        uint offset = _payloadOffset(item.memPtr);
        uint len = item.len - offset; // data length
        bytes memory result = new bytes(len);

        uint destPtr;
        assembly {
            destPtr := add(0x20, result)
        }

        copy(item.memPtr + offset, destPtr, len);
        return result;
    }

    function numItems(RLPItem memory item) private pure returns (uint) {
        if (item.len == 0) return 0;

        uint count = 0;
        uint currPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint endPtr = item.memPtr + item.len;
        while (currPtr < endPtr) {
            currPtr = currPtr + _itemLength(currPtr); // skip over an item
            count++;
        }

        return count;
    }

    function _itemLength(uint memPtr) private pure returns (uint) {
        uint itemLen;
        uint byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START)
            itemLen = 1;

        else if (byte0 < STRING_LONG_START)
            itemLen = byte0 - STRING_SHORT_START + 1;

        else if (byte0 < LIST_SHORT_START) {
            uint dataLen;
            assembly {
                let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is
                memPtr := add(memPtr, 1) // skip over the first byte

                /* 32 byte word size */
                dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len
                itemLen := add(dataLen, add(byteLen, 1))
            }
            require(itemLen >= dataLen, "addition overflow");
        }

        else if (byte0 < LIST_LONG_START) {
            itemLen = byte0 - LIST_SHORT_START + 1;
        }

        else {
            uint dataLen;
            assembly {
                let byteLen := sub(byte0, 0xf7)
                memPtr := add(memPtr, 1)

                dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length
                itemLen := add(dataLen, add(byteLen, 1))
            }
            require(itemLen >= dataLen, "addition overflow");
        }

        return itemLen;
    }

    // @return number of bytes until the data
    function _payloadOffset(uint memPtr) private pure returns (uint) {
        uint byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START)
            return 0;
        else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START))
            return 1;
        else if (byte0 < LIST_SHORT_START)  // being explicit
            return byte0 - (STRING_LONG_START - 1) + 1;
        else
            return byte0 - (LIST_LONG_START - 1) + 1;
    }

    /*
    * @param src Pointer to source
    * @param dest Pointer to destination
    * @param len Amount of memory to copy from the source
    */
    function copy(uint src, uint dest, uint len) private pure {
        if (len == 0) return;

        // copy as many word sizes as possible
        for (; len >= WORD_SIZE; len -= WORD_SIZE) {
            assembly {
                mstore(dest, mload(src))
            }

            src += WORD_SIZE;
            dest += WORD_SIZE;
        }

        // left over bytes. Mask is used to remove unwanted bytes from the word
        uint mask = 256 ** (WORD_SIZE - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask)) // zero out src
            let destpart := and(mload(dest), mask) // retrieve the bytes
            mstore(dest, or(destpart, srcpart))
        }
    }
}

// File: contracts/interface/IRelayerHub.sol

pragma solidity 0.6.4;

interface IRelayerHub {
  function isRelayer(address sender) external view returns (bool);
}

// File: contracts/interface/ILightClient.sol

pragma solidity 0.6.4;

interface ILightClient {

  function isHeaderSynced(uint64 height) external view returns (bool);

  function getAppHash(uint64 height) external view returns (bytes32);

  function getSubmitter(uint64 height) external view returns (address payable);

}

// File: contracts/System.sol

pragma solidity 0.6.4;




contract System {

  bool public alreadyInit;

  uint32 public constant CODE_OK = 0;
  uint32 public constant ERROR_FAIL_DECODE = 100;

  uint8 constant public BIND_CHANNELID = 0x01;
  uint8 constant public TRANSFER_IN_CHANNELID = 0x02;
  uint8 constant public TRANSFER_OUT_CHANNELID = 0x03;
  uint8 constant public STAKING_CHANNELID = 0x08;
  uint8 constant public GOV_CHANNELID = 0x09;
  uint8 constant public SLASH_CHANNELID = 0x0b;
  uint16 constant public bscChainID = 0x0038;

  address public constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000;
  address public constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001;
  address public constant SYSTEM_REWARD_ADDR = 0x0000000000000000000000000000000000001002;
  address public constant LIGHT_CLIENT_ADDR = 0x0000000000000000000000000000000000001003;
  address public constant TOKEN_HUB_ADDR = 0x0000000000000000000000000000000000001004;
  address public constant INCENTIVIZE_ADDR=0x0000000000000000000000000000000000001005;
  address public constant RELAYERHUB_CONTRACT_ADDR = 0x0000000000000000000000000000000000001006;
  address public constant GOV_HUB_ADDR = 0x0000000000000000000000000000000000001007;
  address public constant TOKEN_MANAGER_ADDR = 0x0000000000000000000000000000000000001008;
  address public constant CROSS_CHAIN_CONTRACT_ADDR = 0x0000000000000000000000000000000000002000;


  modifier onlyCoinbase() {
    require(msg.sender == block.coinbase, "the message sender must be the block producer");
    _;
  }

  modifier onlyNotInit() {
    require(!alreadyInit, "the contract already init");
    _;
  }

  modifier onlyInit() {
    require(alreadyInit, "the contract not init yet");
    _;
  }

  modifier onlySlash() {
    require(msg.sender == SLASH_CONTRACT_ADDR, "the message sender must be slash contract");
    _;
  }

  modifier onlyTokenHub() {
    require(msg.sender == TOKEN_HUB_ADDR, "the message sender must be token hub contract");
    _;
  }

  modifier onlyGov() {
    require(msg.sender == GOV_HUB_ADDR, "the message sender must be governance contract");
    _;
  }

  modifier onlyValidatorContract() {
    require(msg.sender == VALIDATOR_CONTRACT_ADDR, "the message sender must be validatorSet contract");
    _;
  }

  modifier onlyCrossChainContract() {
    require(msg.sender == CROSS_CHAIN_CONTRACT_ADDR, "the message sender must be cross chain contract");
    _;
  }

  modifier onlyRelayerIncentivize() {
    require(msg.sender == INCENTIVIZE_ADDR, "the message sender must be incentivize contract");
    _;
  }

  modifier onlyRelayer() {
    require(IRelayerHub(RELAYERHUB_CONTRACT_ADDR).isRelayer(msg.sender), "the msg sender is not a relayer");
    _;
  }

  modifier onlyTokenManager() {
    require(msg.sender == TOKEN_MANAGER_ADDR, "the msg sender must be tokenManager");
    _;
  }

  // Not reliable, do not use when need strong verify
  function isContract(address addr) internal view returns (bool) {
    uint size;
    assembly { size := extcodesize(addr) }
    return size > 0;
  }
}

// File: contracts/TokenHub.sol

pragma solidity 0.6.4;











contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemReward {

  using SafeMath for uint256;

  using RLPEncode for *;
  using RLPDecode for *;

  using RLPDecode for RLPDecode.RLPItem;
  using RLPDecode for RLPDecode.Iterator;

  // BSC to BC
  struct TransferOutSynPackage {
    bytes32 bep2TokenSymbol;
    address contractAddr;
    uint256[] amounts;
    address[] recipients;
    address[] refundAddrs;
    uint64  expireTime;
  }

  // BC to BSC
  struct TransferOutAckPackage {
    address contractAddr;
    uint256[] refundAmounts;
    address[] refundAddrs;
    uint32 status;
  }

  // BC to BSC
  struct TransferInSynPackage {
    bytes32 bep2TokenSymbol;
    address contractAddr;
    uint256 amount;
    address recipient;
    address refundAddr;
    uint64  expireTime;
  }

  // BSC to BC
  struct TransferInRefundPackage {
    bytes32 bep2TokenSymbol;
    uint256 refundAmount;
    address refundAddr;
    uint32 status;
  }

  // transfer in channel
  uint8 constant public   TRANSFER_IN_SUCCESS = 0;
  uint8 constant public   TRANSFER_IN_FAILURE_TIMEOUT = 1;
  uint8 constant public   TRANSFER_IN_FAILURE_UNBOUND_TOKEN = 2;
  uint8 constant public   TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE = 3;
  uint8 constant public   TRANSFER_IN_FAILURE_NON_PAYABLE_RECIPIENT = 4;
  uint8 constant public   TRANSFER_IN_FAILURE_UNKNOWN = 5;

  uint256 constant public MAX_BEP2_TOTAL_SUPPLY = 9000000000000000000;
  uint8 constant public   MINIMUM_BEP20_SYMBOL_LEN = 2;
  uint8 constant public   MAXIMUM_BEP20_SYMBOL_LEN = 8;
  uint8 constant public   BEP2_TOKEN_DECIMALS = 8;
  bytes32 constant public BEP2_TOKEN_SYMBOL_FOR_BNB = 0x424E420000000000000000000000000000000000000000000000000000000000; // "BNB"
  uint256 constant public MAX_GAS_FOR_CALLING_BEP20=50000;
  uint256 constant public MAX_GAS_FOR_TRANSFER_BNB=10000;

  uint256 constant public INIT_MINIMUM_RELAY_FEE =2e15;
  uint256 constant public REWARD_UPPER_LIMIT =1e18;
  uint256 constant public TEN_DECIMALS = 1e10;

  uint256 public relayFee;

  mapping(address => uint256) public bep20ContractDecimals;
  mapping(address => bytes32) private contractAddrToBEP2Symbol;
  mapping(bytes32 => address) private bep2SymbolToContractAddr;

  event transferInSuccess(address bep20Addr, address refundAddr, uint256 amount);
  event transferOutSuccess(address bep20Addr, address senderAddr, uint256 amount, uint256 relayFee);
  event refundSuccess(address bep20Addr, address refundAddr, uint256 amount, uint32 status);
  event refundFailure(address bep20Addr, address refundAddr, uint256 amount, uint32 status);
  event rewardTo(address to, uint256 amount);
  event receiveDeposit(address from, uint256 amount);
  event unexpectedPackage(uint8 channelId, bytes msgBytes);
  event paramChange(string key, bytes value);

  constructor() public {}

  function init() onlyNotInit external {
    relayFee = INIT_MINIMUM_RELAY_FEE;
    bep20ContractDecimals[address(0x0)] = 18; // BNB decimals is 18
    alreadyInit=true;
  }

  receive() external payable{
    if (msg.value>0) {
      emit receiveDeposit(msg.sender, msg.value);
    }
  }

  function claimRewards(address payable to, uint256 amount) onlyInit onlyRelayerIncentivize external override returns(uint256) {
    uint256 actualAmount = amount < address(this).balance ? amount : address(this).balance;
    if (actualAmount > REWARD_UPPER_LIMIT) {
      return 0;
    }
    if (actualAmount>0) {
      to.transfer(actualAmount);
      emit rewardTo(to, actualAmount);
    }
    return actualAmount;
  }

  function getMiniRelayFee() external view override returns(uint256) {
    return relayFee;
  }

  function handleSynPackage(uint8 channelId, bytes calldata msgBytes) onlyInit onlyCrossChainContract external override returns(bytes memory) {
    if (channelId == TRANSFER_IN_CHANNELID) {
      return handleTransferInSynPackage(msgBytes);
    } else {
      // should not happen
      require(false, "unrecognized syn package");
      return new bytes(0);
    }
  }

  function handleAckPackage(uint8 channelId, bytes calldata msgBytes) onlyInit onlyCrossChainContract external override {
    if (channelId == TRANSFER_OUT_CHANNELID) {
      handleTransferOutAckPackage(msgBytes);
    } else {
      emit unexpectedPackage(channelId, msgBytes);
    }
  }

  function handleFailAckPackage(uint8 channelId, bytes calldata msgBytes) onlyInit onlyCrossChainContract external override {
    if (channelId == TRANSFER_OUT_CHANNELID) {
      handleTransferOutFailAckPackage(msgBytes);
    } else {
      emit unexpectedPackage(channelId, msgBytes);
    }
  }

  function decodeTransferInSynPackage(bytes memory msgBytes) internal pure returns (TransferInSynPackage memory, bool) {
    TransferInSynPackage memory transInSynPkg;

    RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator();
    bool success = false;
    uint256 idx=0;
    while (iter.hasNext()) {
      if (idx == 0) transInSynPkg.bep2TokenSymbol       = bytes32(iter.next().toUint());
      else if (idx == 1) transInSynPkg.contractAddr     = iter.next().toAddress();
      else if (idx == 2) transInSynPkg.amount           = iter.next().toUint();
      else if (idx == 3) transInSynPkg.recipient        = ((iter.next().toAddress()));
      else if (idx == 4) transInSynPkg.refundAddr       = iter.next().toAddress();
      else if (idx == 5) {
        transInSynPkg.expireTime       = uint64(iter.next().toUint());
        success = true;
      }
      else break;
      idx++;
    }
    return (transInSynPkg, success);
  }

  function encodeTransferInRefundPackage(TransferInRefundPackage memory transInAckPkg) internal pure returns (bytes memory) {
    bytes[] memory elements = new bytes[](4);
    elements[0] = uint256(transInAckPkg.bep2TokenSymbol).encodeUint();
    elements[1] = transInAckPkg.refundAmount.encodeUint();
    elements[2] = transInAckPkg.refundAddr.encodeAddress();
    elements[3] = uint256(transInAckPkg.status).encodeUint();
    return elements.encodeList();
  }

  function handleTransferInSynPackage(bytes memory msgBytes) internal returns(bytes memory) {
    (TransferInSynPackage memory transInSynPkg, bool success) = decodeTransferInSynPackage(msgBytes);
    require(success, "unrecognized transferIn package");
    uint32 resCode = doTransferIn(transInSynPkg);
    if (resCode != TRANSFER_IN_SUCCESS) {
      uint256 bep2Amount = convertToBep2Amount(transInSynPkg.amount, bep20ContractDecimals[transInSynPkg.contractAddr]);
      TransferInRefundPackage memory transInAckPkg = TransferInRefundPackage({
          bep2TokenSymbol: transInSynPkg.bep2TokenSymbol,
          refundAmount: bep2Amount,
          refundAddr: transInSynPkg.refundAddr,
          status: resCode
      });
      return encodeTransferInRefundPackage(transInAckPkg);
    } else {
      return new bytes(0);
    }
  }

  function doTransferIn(TransferInSynPackage memory transInSynPkg) internal returns (uint32) {
    if (transInSynPkg.contractAddr==address(0x0)) {
      if (block.timestamp > transInSynPkg.expireTime) {
        return TRANSFER_IN_FAILURE_TIMEOUT;
      }
      if (address(this).balance < transInSynPkg.amount) {
        return TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE;
      }
      (bool success, ) = transInSynPkg.recipient.call{gas: MAX_GAS_FOR_TRANSFER_BNB, value: transInSynPkg.amount}("");
      if (!success) {
        return TRANSFER_IN_FAILURE_NON_PAYABLE_RECIPIENT;
      }
      emit transferInSuccess(transInSynPkg.contractAddr, transInSynPkg.recipient, transInSynPkg.amount);
      return TRANSFER_IN_SUCCESS;
    } else {
      if (block.timestamp > transInSynPkg.expireTime) {
        return TRANSFER_IN_FAILURE_TIMEOUT;
      }
      if (contractAddrToBEP2Symbol[transInSynPkg.contractAddr]!= transInSynPkg.bep2TokenSymbol) {
        return TRANSFER_IN_FAILURE_UNBOUND_TOKEN;
      }
      uint256 actualBalance = IBEP20(transInSynPkg.contractAddr).balanceOf{gas: MAX_GAS_FOR_CALLING_BEP20}(address(this));
      if (actualBalance < transInSynPkg.amount) {
        return TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE;
      }
      bool success = IBEP20(transInSynPkg.contractAddr).transfer{gas: MAX_GAS_FOR_CALLING_BEP20}(transInSynPkg.recipient, transInSynPkg.amount);
      if (success) {
        emit transferInSuccess(transInSynPkg.contractAddr, transInSynPkg.recipient, transInSynPkg.amount);
        return TRANSFER_IN_SUCCESS;
      } else {
        return TRANSFER_IN_FAILURE_UNKNOWN;
      }
    }
  }

  function decodeTransferOutAckPackage(bytes memory msgBytes) internal pure returns(TransferOutAckPackage memory, bool) {
    TransferOutAckPackage memory transOutAckPkg;

    RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator();
    bool success = false;
    uint256 idx=0;
    while (iter.hasNext()) {
        if (idx == 0) {
          transOutAckPkg.contractAddr = iter.next().toAddress();
        }
        else if (idx == 1) {
          RLPDecode.RLPItem[] memory list = iter.next().toList();
          transOutAckPkg.refundAmounts = new uint256[](list.length);
          for (uint256 index=0; index<list.length; index++) {
            transOutAckPkg.refundAmounts[index] = list[index].toUint();
          }
        }
        else if (idx == 2) {
          RLPDecode.RLPItem[] memory list = iter.next().toList();
          transOutAckPkg.refundAddrs = new address[](list.length);
          for (uint256 index=0; index<list.length; index++) {
            transOutAckPkg.refundAddrs[index] = list[index].toAddress();
          }
        }
        else if (idx == 3) {
          transOutAckPkg.status = uint32(iter.next().toUint());
          success = true;
        }
        else {
          break;
        }
        idx++;
    }
    return (transOutAckPkg, success);
  }

  function handleTransferOutAckPackage(bytes memory msgBytes) internal {
    (TransferOutAckPackage memory transOutAckPkg, bool decodeSuccess) = decodeTransferOutAckPackage(msgBytes);
    require(decodeSuccess, "unrecognized transferOut ack package");
    doRefund(transOutAckPkg);
  }

  function doRefund(TransferOutAckPackage memory transOutAckPkg) internal {
    if (transOutAckPkg.contractAddr==address(0x0)) {
      for (uint256 index = 0; index<transOutAckPkg.refundAmounts.length; index++) {
        (bool success, ) = transOutAckPkg.refundAddrs[index].call{gas: MAX_GAS_FOR_TRANSFER_BNB, value: transOutAckPkg.refundAmounts[index]}("");
        if (!success) {
          emit refundFailure(transOutAckPkg.contractAddr, transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index], transOutAckPkg.status);
        } else {
          emit refundSuccess(transOutAckPkg.contractAddr, transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index], transOutAckPkg.status);
        }
      }
    } else {
      for (uint256 index = 0; index<transOutAckPkg.refundAmounts.length; index++) {
        bool success = IBEP20(transOutAckPkg.contractAddr).transfer{gas: MAX_GAS_FOR_CALLING_BEP20}(transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index]);
        if (success) {
          emit refundSuccess(transOutAckPkg.contractAddr, transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index], transOutAckPkg.status);
        } else {
          emit refundFailure(transOutAckPkg.contractAddr, transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index], transOutAckPkg.status);
        }
      }
    }
  }

  function decodeTransferOutSynPackage(bytes memory msgBytes) internal pure returns (TransferOutSynPackage memory, bool) {
    TransferOutSynPackage memory transOutSynPkg;

    RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator();
    bool success = false;
    uint256 idx=0;
    while (iter.hasNext()) {
      if (idx == 0) {
        transOutSynPkg.bep2TokenSymbol = bytes32(iter.next().toUint());
      } else if (idx == 1) {
        transOutSynPkg.contractAddr = iter.next().toAddress();
      } else if (idx == 2) {
        RLPDecode.RLPItem[] memory list = iter.next().toList();
        transOutSynPkg.amounts = new uint256[](list.length);
        for (uint256 index=0; index<list.length; index++) {
          transOutSynPkg.amounts[index] = list[index].toUint();
        }
      } else if (idx == 3) {
        RLPDecode.RLPItem[] memory list = iter.next().toList();
        transOutSynPkg.recipients = new address[](list.length);
        for (uint256 index=0; index<list.length; index++) {
          transOutSynPkg.recipients[index] = list[index].toAddress();
        }
      } else if (idx == 4) {
        RLPDecode.RLPItem[] memory list = iter.next().toList();
        transOutSynPkg.refundAddrs = new address[](list.length);
        for (uint256 index=0; index<list.length; index++) {
          transOutSynPkg.refundAddrs[index] = list[index].toAddress();
        }
      } else if (idx == 5) {
        transOutSynPkg.expireTime = uint64(iter.next().toUint());
        success = true;
      } else {
        break;
      }
      idx++;
    }
    return (transOutSynPkg, success);
  }

  function handleTransferOutFailAckPackage(bytes memory msgBytes) internal {
    (TransferOutSynPackage memory transOutSynPkg, bool decodeSuccess) = decodeTransferOutSynPackage(msgBytes);
    require(decodeSuccess, "unrecognized transferOut syn package");
    TransferOutAckPackage memory transOutAckPkg;
    transOutAckPkg.contractAddr = transOutSynPkg.contractAddr;
    transOutAckPkg.refundAmounts = transOutSynPkg.amounts;
    uint256 bep20TokenDecimals = bep20ContractDecimals[transOutSynPkg.contractAddr];
    for (uint idx=0;idx<transOutSynPkg.amounts.length;idx++) {
      transOutSynPkg.amounts[idx] = convertFromBep2Amount(transOutSynPkg.amounts[idx], bep20TokenDecimals);
    }
    transOutAckPkg.refundAddrs = transOutSynPkg.refundAddrs;
    transOutAckPkg.status = TRANSFER_IN_FAILURE_UNKNOWN;
    doRefund(transOutAckPkg);
  }

  function encodeTransferOutSynPackage(TransferOutSynPackage memory transOutSynPkg) internal pure returns (bytes memory) {
    bytes[] memory elements = new bytes[](6);

    elements[0] = uint256(transOutSynPkg.bep2TokenSymbol).encodeUint();
    elements[1] = transOutSynPkg.contractAddr.encodeAddress();

    uint256 batchLength = transOutSynPkg.amounts.length;

    bytes[] memory amountsElements = new bytes[](batchLength);
    for (uint256 index = 0; index< batchLength; index++) {
      amountsElements[index] = transOutSynPkg.amounts[index].encodeUint();
    }
    elements[2] = amountsElements.encodeList();

    bytes[] memory recipientsElements = new bytes[](batchLength);
    for (uint256 index = 0; index< batchLength; index++) {
       recipientsElements[index] = transOutSynPkg.recipients[index].encodeAddress();
    }
    elements[3] = recipientsElements.encodeList();

    bytes[] memory refundAddrsElements = new bytes[](batchLength);
    for (uint256 index = 0; index< batchLength; index++) {
       refundAddrsElements[index] = transOutSynPkg.refundAddrs[index].encodeAddress();
    }
    elements[4] = refundAddrsElements.encodeList();

    elements[5] = uint256(transOutSynPkg.expireTime).encodeUint();
    return elements.encodeList();
  }

  function transferOut(address contractAddr, address recipient, uint256 amount, uint64 expireTime) external override onlyInit payable returns (bool) {
    require(expireTime>=block.timestamp + 120, "expireTime must be two minutes later");
    require(msg.value%TEN_DECIMALS==0, "invalid received BNB amount: precision loss in amount conversion");
    bytes32 bep2TokenSymbol;
    uint256 convertedAmount;
    uint256 rewardForRelayer;
    if (contractAddr==address(0x0)) {
      require(msg.value>=amount.add(relayFee), "received BNB amount should be no less than the sum of transferOut BNB amount and minimum relayFee");
      require(amount%TEN_DECIMALS==0, "invalid transfer amount: precision loss in amount conversion");
      rewardForRelayer=msg.value.sub(amount);
      convertedAmount = amount.div(TEN_DECIMALS); // native bnb decimals is 8 on BBC, while the native bnb decimals on BSC is 18
      bep2TokenSymbol=BEP2_TOKEN_SYMBOL_FOR_BNB;
    } else {
      bep2TokenSymbol = contractAddrToBEP2Symbol[contractAddr];
      require(bep2TokenSymbol!=bytes32(0x00), "the contract has not been bound to any bep2 token");
      require(msg.value>=relayFee, "received BNB amount should be no less than the minimum relayFee");
      rewardForRelayer=msg.value;
      uint256 bep20TokenDecimals=bep20ContractDecimals[contractAddr];
      require(bep20TokenDecimals<=BEP2_TOKEN_DECIMALS || (bep20TokenDecimals>BEP2_TOKEN_DECIMALS && amount.mod(10**(bep20TokenDecimals-BEP2_TOKEN_DECIMALS))==0), "invalid transfer amount: precision loss in amount conversion");
      convertedAmount = convertToBep2Amount(amount, bep20TokenDecimals);// convert to bep2 amount
      if (isMiniBEP2Token(bep2TokenSymbol)) {
        require(convertedAmount >= 1e8 , "For miniToken, the transfer amount must not be less than 1");
      }
      require(bep20TokenDecimals>=BEP2_TOKEN_DECIMALS || (bep20TokenDecimals<BEP2_TOKEN_DECIMALS && convertedAmount>amount), "amount is too large, uint256 overflow");
      require(convertedAmount<=MAX_BEP2_TOTAL_SUPPLY, "amount is too large, exceed maximum bep2 token amount");
      require(IBEP20(contractAddr).transferFrom(msg.sender, address(this), amount));
    }
    TransferOutSynPackage memory transOutSynPkg = TransferOutSynPackage({
      bep2TokenSymbol: bep2TokenSymbol,
      contractAddr: contractAddr,
      amounts: new uint256[](1),
      recipients: new address[](1),
      refundAddrs: new address[](1),
      expireTime: expireTime
    });
    transOutSynPkg.amounts[0]=convertedAmount;
    transOutSynPkg.recipients[0]=recipient;
    transOutSynPkg.refundAddrs[0]=msg.sender;
    ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(TRANSFER_OUT_CHANNELID, encodeTransferOutSynPackage(transOutSynPkg), rewardForRelayer.div(TEN_DECIMALS));
    emit transferOutSuccess(contractAddr, msg.sender, amount, rewardForRelayer);
    return true;
  }

  function batchTransferOutBNB(address[] calldata recipientAddrs, uint256[] calldata amounts, address[] calldata refundAddrs, uint64 expireTime) external override onlyInit payable returns (bool) {
    require(recipientAddrs.length == amounts.length, "Length of recipientAddrs doesn't equal to length of amounts");
    require(recipientAddrs.length == refundAddrs.length, "Length of recipientAddrs doesn't equal to length of refundAddrs");
    require(expireTime>=block.timestamp + 120, "expireTime must be two minutes later");
    require(msg.value%TEN_DECIMALS==0, "invalid received BNB amount: precision loss in amount conversion");
    uint256 batchLength = amounts.length;
    uint256 totalAmount = 0;
    uint256 rewardForRelayer;
    uint256[] memory convertedAmounts = new uint256[](batchLength);
    for (uint i = 0; i < batchLength; i++) {
      require(amounts[i]%TEN_DECIMALS==0, "invalid transfer amount: precision loss in amount conversion");
      totalAmount = totalAmount.add(amounts[i]);
      convertedAmounts[i] = amounts[i].div(TEN_DECIMALS);
    }
    require(msg.value>=totalAmount.add(relayFee.mul(batchLength)), "received BNB amount should be no less than the sum of transfer BNB amount and relayFee");
    rewardForRelayer = msg.value.sub(totalAmount);

    TransferOutSynPackage memory transOutSynPkg = TransferOutSynPackage({
      bep2TokenSymbol: BEP2_TOKEN_SYMBOL_FOR_BNB,
      contractAddr: address(0x00),
      amounts: convertedAmounts,
      recipients: recipientAddrs,
      refundAddrs: refundAddrs,
      expireTime: expireTime
    });
    ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(TRANSFER_OUT_CHANNELID, encodeTransferOutSynPackage(transOutSynPkg), rewardForRelayer.div(TEN_DECIMALS));
    emit transferOutSuccess(address(0x0), msg.sender, totalAmount, rewardForRelayer);
    return true;
  }

  function updateParam(string calldata key, bytes calldata value) override external onlyGov{
    require(value.length == 32, "expected value length is 32");
    string memory localKey = key;
    bytes memory localValue = value;
    bytes32 bytes32Key;
    assembly {
      bytes32Key := mload(add(localKey, 32))
    }
    if (bytes32Key == bytes32(0x72656c6179466565000000000000000000000000000000000000000000000000)) { // relayFee
      uint256 newRelayFee;
      assembly {
        newRelayFee := mload(add(localValue, 32))
      }
      require(newRelayFee <= 1e18 && newRelayFee%(TEN_DECIMALS)==0, "the relayFee out of range");
      relayFee = newRelayFee;
    } else {
      require(false, "unknown param");
    }
    emit paramChange(key, value);
  }

  function getContractAddrByBEP2Symbol(bytes32 bep2Symbol) external view override returns(address) {
    return bep2SymbolToContractAddr[bep2Symbol];
  }

  function getBep2SymbolByContractAddr(address contractAddr) external view override returns(bytes32) {
    return contractAddrToBEP2Symbol[contractAddr];
  }

  function bindToken(bytes32 bep2Symbol, address contractAddr, uint256 decimals) external override onlyTokenManager {
    bep2SymbolToContractAddr[bep2Symbol] = contractAddr;
    contractAddrToBEP2Symbol[contractAddr] = bep2Symbol;
    bep20ContractDecimals[contractAddr] = decimals;
  }

  function unbindToken(bytes32 bep2Symbol, address contractAddr) external override onlyTokenManager {
    delete bep2SymbolToContractAddr[bep2Symbol];
    delete contractAddrToBEP2Symbol[contractAddr];
  }

  function isMiniBEP2Token(bytes32 symbol) internal pure returns(bool) {
     bytes memory symbolBytes = new bytes(32);
     assembly {
       mstore(add(symbolBytes, 32), symbol)
     }
     uint8 symbolLength = 0;
     for (uint8 j = 0; j < 32; j++) {
       if (symbolBytes[j] != 0) {
         symbolLength++;
       } else {
         break;
       }
     }
     if (symbolLength < MINIMUM_BEP20_SYMBOL_LEN + 5) {
       return false;
     }
     if (symbolBytes[symbolLength-5] != 0x2d) { // '-'
       return false;
     }
     if (symbolBytes[symbolLength-1] != 'M') { // ABC-XXXM
       return false;
     }
     return true;
  }

  function convertToBep2Amount(uint256 amount, uint256 bep20TokenDecimals) internal pure returns (uint256) {
    if (bep20TokenDecimals > BEP2_TOKEN_DECIMALS) {
      return amount.div(10**(bep20TokenDecimals-BEP2_TOKEN_DECIMALS));
    }
    return amount.mul(10**(BEP2_TOKEN_DECIMALS-bep20TokenDecimals));
  }

  function convertFromBep2Amount(uint256 amount, uint256 bep20TokenDecimals) internal pure returns (uint256) {
    if (bep20TokenDecimals > BEP2_TOKEN_DECIMALS) {
      return amount.mul(10**(bep20TokenDecimals-BEP2_TOKEN_DECIMALS));
    }
    return amount.div(10**(BEP2_TOKEN_DECIMALS-bep20TokenDecimals));
  }

  function getBoundContract(string memory bep2Symbol) public view returns (address) {
    bytes32 bep2TokenSymbol;
    assembly {
      bep2TokenSymbol := mload(add(bep2Symbol, 32))
    }
    return bep2SymbolToContractAddr[bep2TokenSymbol];
  }

  function getBoundBep2Symbol(address contractAddr) public view returns (string memory) {
    bytes32 bep2SymbolBytes32 = contractAddrToBEP2Symbol[contractAddr];
    bytes memory bep2SymbolBytes = new bytes(32);
    assembly {
      mstore(add(bep2SymbolBytes,32), bep2SymbolBytes32)
    }
    uint8 bep2SymbolLength = 0;
    for (uint8 j = 0; j < 32; j++) {
      if (bep2SymbolBytes[j] != 0) {
        bep2SymbolLength++;
      } else {
        break;
      }
    }
    bytes memory bep2Symbol = new bytes(bep2SymbolLength);
    for (uint8 j = 0; j < bep2SymbolLength; j++) {
        bep2Symbol[j] = bep2SymbolBytes[j];
    }
    return string(bep2Symbol);
  }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"bytes","name":"value","type":"bytes"}],"name":"paramChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"receiveDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":false,"internalType":"address","name":"refundAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"status","type":"uint32"}],"name":"refundFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":false,"internalType":"address","name":"refundAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"status","type":"uint32"}],"name":"refundSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rewardTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":false,"internalType":"address","name":"refundAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferInSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":false,"internalType":"address","name":"senderAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"relayFee","type":"uint256"}],"name":"transferOutSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"channelId","type":"uint8"},{"indexed":false,"internalType":"bytes","name":"msgBytes","type":"bytes"}],"name":"unexpectedPackage","type":"event"},{"inputs":[],"name":"BEP2_TOKEN_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BEP2_TOKEN_SYMBOL_FOR_BNB","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CODE_OK","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CROSS_CHAIN_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERROR_FAIL_DECODE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOV_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOV_HUB_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INCENTIVIZE_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INIT_MINIMUM_RELAY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIGHT_CLIENT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_BEP20_SYMBOL_LEN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BEP2_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GAS_FOR_CALLING_BEP20","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GAS_FOR_TRANSFER_BNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_BEP20_SYMBOL_LEN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYERHUB_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_UPPER_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLASH_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLASH_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM_REWARD_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEN_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_HUB_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_MANAGER_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_FAILURE_NON_PAYABLE_RECIPIENT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_FAILURE_TIMEOUT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_FAILURE_UNBOUND_TOKEN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_FAILURE_UNKNOWN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_SUCCESS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_OUT_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alreadyInit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipientAddrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"refundAddrs","type":"address[]"},{"internalType":"uint64","name":"expireTime","type":"uint64"}],"name":"batchTransferOutBNB","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bep20ContractDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"bep2Symbol","type":"bytes32"},{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"bindToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bscChainID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"getBep2SymbolByContractAddr","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"getBoundBep2Symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"bep2Symbol","type":"string"}],"name":"getBoundContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"bep2Symbol","type":"bytes32"}],"name":"getContractAddrByBEP2Symbol","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiniRelayFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"channelId","type":"uint8"},{"internalType":"bytes","name":"msgBytes","type":"bytes"}],"name":"handleAckPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"channelId","type":"uint8"},{"internalType":"bytes","name":"msgBytes","type":"bytes"}],"name":"handleFailAckPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"channelId","type":"uint8"},{"internalType":"bytes","name":"msgBytes","type":"bytes"}],"name":"handleSynPackage","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"relayFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"expireTime","type":"uint64"}],"name":"transferOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"bep2Symbol","type":"bytes32"},{"internalType":"address","name":"contractAddr","type":"address"}],"name":"unbindToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"updateParam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50614893806100206000396000f3fe60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e590814610996578063fd6a687914610ce6578063ff9c00271461068657610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063d9e6dae9116100d1578063d9e6dae914610608578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063aa7415f511610164578063b99328c51161013e578063b99328c514610ad2578063b9fd21e314610b0b578063ba35ead614610b20578063bbface1f14610b3557610366565b8063aa7415f5146109ab578063ab51bb96146109f2578063ac43175114610a0757610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a78abc1614610981578063a7c9f02d1461099657610366565b8063613684751161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105875780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b8063613684751461060857806366dea52a146106865780636e0565201461069b5780636e47b482146107c757806370fd5bad1461068657806371d30863146107dc57610366565b806343a368b9116102d757806350432d32116102b157806350432d321461061d57806351e806721461063257806359b92789146106475780635d499b1b1461067157610366565b806343a368b9146105c7578063493279b1146105dc5780634bf6c8821461060857610366565b80630bee7a671461036b5780631182b87514610399578063149d14d9146104935780633d713223146104ba5780633dffc3871461058757806343756e5c146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805163ffffffff9092168252519081900360200190f35b3480156103a557600080fd5b5061041e600480360360408110156103bc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460018302840111600160201b8311171561041357600080fd5b509092509050610d00565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610e2e565b60408051918252519081900360200190f35b3480156104c657600080fd5b5061056b600480360360208110156104dd57600080fd5b810190602081018135600160201b8111156104f757600080fd5b82018360208201111561050957600080fd5b803590602001918460018302840111600160201b8311171561052a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561059357600080fd5b5061059c610e58565b6040805160ff9092168252519081900360200190f35b3480156105be57600080fd5b5061056b610e5d565b3480156105d357600080fd5b506104a8610e63565b3480156105e857600080fd5b506105f1610e6f565b6040805161ffff9092168252519081900360200190f35b34801561061457600080fd5b5061059c610e74565b34801561062957600080fd5b506104a8610e79565b34801561063e57600080fd5b5061056b610e84565b34801561065357600080fd5b5061056b6004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104a8610ea5565b34801561069257600080fd5b5061059c610eae565b6107b3600480360360808110156106b157600080fd5b810190602081018135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b919390929091602081019035600160201b81111561071b57600080fd5b82018360208201111561072d57600080fd5b803590602001918460208302840111600160201b8311171561074e57600080fd5b919390929091602081019035600160201b81111561076b57600080fd5b82018360208201111561077d57600080fd5b803590602001918460208302840111600160201b8311171561079e57600080fd5b91935091503567ffffffffffffffff16610eb3565b604080519115158252519081900360200190f35b3480156107d357600080fd5b5061056b611388565b3480156107e857600080fd5b506104a861138e565b3480156107fd57600080fd5b5061056b611394565b34801561081257600080fd5b5061059c61139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061059c61156e565b34801561090057600080fd5b506104a8611573565b34801561091557600080fd5b506104a86004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b5061056b6116bd565b34801561096357600080fd5b5061056b6116c3565b34801561097857600080fd5b5061059c6116c9565b34801561098d57600080fd5b506107b36116ce565b3480156109a257600080fd5b5061059c6116d7565b6107b3600480360360808110156109c157600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116dc565b3480156109fe57600080fd5b506103806116c9565b348015610a1357600080fd5b5061036460048036036040811015610a2a57600080fd5b810190602081018135600160201b811115610a4457600080fd5b820183602082011115610a5657600080fd5b803590602001918460018302840111600160201b83111715610a7757600080fd5b919390929091602081019035600160201b811115610a9457600080fd5b820183602082011115610aa657600080fd5b803590602001918460018302840111600160201b83111715610ac757600080fd5b509092509050611d9d565b348015610ade57600080fd5b5061036460048036036040811015610af557600080fd5b50803590602001356001600160a01b031661200c565b348015610b1757600080fd5b506104a8612082565b348015610b2c57600080fd5b506104a861208c565b348015610b4157600080fd5b506104a860048036036020811015610b5857600080fd5b50356001600160a01b0316612092565b348015610b7457600080fd5b506104a860048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b5061056b6120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b5061056b612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061059c61223b565b348015610c8057600080fd5b5061059c612240565b348015610c9557600080fd5b5061056b612245565b348015610caa57600080fd5b506104a861224b565b348015610cbf57600080fd5b5061041e60048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b5061056b612378565b606481565b60005460609060ff16610d48576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b3361200014610d885760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff841660021415610dda57610dd383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e27565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b603881565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff16610ef9576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b868514610f375760405162461bcd60e51b815260040180806020018281038252603b81526020018061471b603b913960400191505060405180910390fd5b868314610f755760405162461bcd60e51b815260040180806020018281038252603f8152602001806145ee603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fc15760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156110055760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611038578160200160208202803683370190505b50905060005b84811015611113576402540be4008b8b8381811061105857fe5b905060200201358161106657fe5b06156110a35760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6110c88b8b838181106110b257fe5b90506020020135856124a290919063ffffffff16565b93506110f46402540be4008c8c848181106110df57fe5b905060200201356124fc90919063ffffffff16565b82828151811061110057fe5b602090810291909101015260010161103e565b506001546111389061112b908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111765760405162461bcd60e51b81526004018080602001828103825260568152602001806147c86056913960600191505060405180910390fd5b611186348463ffffffff61259716565b9150611190614337565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d76003611254846125d9565b611269876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c75781810151838201526020016112af565b50505050905090810190601f1680156112f45780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131557600080fd5b505af1158015611329573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614451602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff16611722576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff16101561176e5760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156117b25760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b600080806001600160a01b038816611891576001546117d890879063ffffffff6124a216565b3410156118165760405162461bcd60e51b81526004018080602001828103825260618152602001806145686061913960800191505060405180910390fd5b6402540be40086061561185a5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b61186a348763ffffffff61259716565b9050611881866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b34565b6001600160a01b0388166000908152600360205260409020549250826118e85760405162461bcd60e51b81526004018080602001828103825260318152602001806145376031913960400191505060405180910390fd5b6001543410156119295760405162461bcd60e51b815260040180806020018281038252603f81526020018061468a603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061197457506008811180156119745750611972876007198301600a0a63ffffffff6128f016565b155b6119af5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6119b98782612932565b92506119c484612972565b15611a0c576305f5e100831015611a0c5760405162461bcd60e51b815260040180806020018281038252603a815260200180614480603a913960400191505060405180910390fd5b600881101580611a265750600881108015611a2657508683115b611a615760405162461bcd60e51b81526004018080602001828103825260258152602001806145c96025913960400191505060405180910390fd5b677ce66c50e2840000831115611aa85760405162461bcd60e51b81526004018080602001828103825260358152602001806145026035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611afd57600080fd5b505af1158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051611b3257600080fd5b505b611b3c614337565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bea57fe5b602002602001018181525050878160600151600081518110611c0857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c3a57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c65846125d9565b611c7a866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cd8578181015183820152602001611cc0565b50505050905090810190601f168015611d055780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611ddd5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146c9602e913960400191505060405180910390fd5b60208114611e32576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f3a576020820151670de0b6b3a76400008111801590611ee157506402540be4008106155b611f32576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f77565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461204c5760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b6060612388614383565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143b8565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e53565b50506040805160008152602081019091529150610e539050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146696021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143df565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b81526004018080602001828103825260248152602001806146f76024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600760ff82161015612a0057600092505050610e53565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e53565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e53565b5060019392505050565b612a80614337565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144ba6024913960400191505060405180910390fd5b612ad36143df565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613baf565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e614383565b6000612b88614383565b612b90614416565b612ba1612b9c86613be8565b613c0d565b90506000805b612bb083613c57565b15612ca85780612bd257612bcb612bc684613c78565b613cc6565b8452612ca0565b8060011415612bff57612bec612be784613c78565b613d7d565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c78565b6040850152612ca0565b8060031415612c4657612c33612be784613c78565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c78565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c78565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e53565b8160400151471015612cfc57506003610e53565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e53565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e53565b8160a0015167ffffffffffffffff16421115612e0a57506001610e53565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e53565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e53565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e539050565b5060059150610e539050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2781613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613d97565b613e7d565b60408051600560a21b8318601482015260348101909152606090610e2781613e7d565b60608151600014156132315750604080516000815260208101909152610e53565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ecf565b9150600101613251565b50610e27613294825160c060ff16613f4c565b82613ecf565b6132a26143df565b60006132ac6143df565b6132b4614416565b6132c0612b9c86613be8565b90506000805b6132cf83613c57565b15612ca857806132f5576132e5612be784613c78565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c78565b614044565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cc6565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c78565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d7d565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c78565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b613953614337565b600061395d614337565b613965614416565b613971612b9c86613be8565b90506000805b61398083613c57565b15612ca8578061399d57613996612bc684613c78565b8452613ba7565b80600114156139c5576139b2612be784613c78565b6001600160a01b03166020850152613ba7565b8060021415613a545760606139dc61330c85613c78565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613ba7565b8060031415613ae9576060613a6b61330c85613c78565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c78565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415612c9b57613b93612bc684613c78565b67ffffffffffffffff1660a0850152600191505b600101613977565b60006008821115613bd157612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613bf0614436565b506040805180820190915281518152602082810190820152919050565b613c15614416565b613c1e82614115565b613c2757600080fd5b6000613c368360200151614145565b60208085015160408051808201909152868152920190820152915050919050565b6000613c61614436565b505080518051602091820151919092015191011190565b613c80614436565b613c8982613c57565b613c9257600080fd5b60208201516000613ca2826141a8565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cdb57508151602110155b613ce457600080fd5b6000613cf38360200151614145565b90508083600001511015613d4e576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d7457826020036101000a820491505b50949350505050565b8051600090601514613d8e57600080fd5b6116b782613cc6565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613ddb57506018613dff565b6fffffffffffffffffffffffffffffffff198416613dfb57506010613dff565b5060005b6020811015613e3557818181518110613e1457fe5b01602001516001600160f81b03191615613e2d57613e35565b600101613dff565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e6a576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613eaf5750607f60f81b82600081518110613e9d57fe5b01602001516001600160f81b03191611155b15613ebb575080610e53565b6116b7613ecd8351608060ff16613f4c565b835b6060806040519050835180825260208201818101602087015b81831015613f00578051835260209283019201613ee8565b50855184518101855292509050808201602086015b81831015613f2d578051835260209283019201613f15565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613f9c576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613ff65782840160f81b81600081518110613fd857fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061400185613d97565b90508381510160370160f81b8260008151811061401a57fe5b60200101906001600160f81b031916908160001a90535061403b8282613ecf565b95945050505050565b606061404f82614115565b61405857600080fd5b6000614063836142db565b90506060816040519080825280602002602001820160405280156140a157816020015b61408e614436565b8152602001906001900390816140865790505b50905060006140b38560200151614145565b60208601510190506000805b8481101561410a576140d0836141a8565b91506040518060400160405280838152602001848152508482815181106140f357fe5b6020908102919091010152918101916001016140bf565b509195945050505050565b805160009061412657506000610e53565b6020820151805160001a9060c0821015612a6e57600092505050610e53565b8051600090811a608081101561415f576000915050610e53565b60b881108061417a575060c0811080159061417a575060f881105b15614189576001915050610e53565b60c081101561419d5760b519019050610e53565b60f519019050610e53565b80516000908190811a60808110156141c357600191506142d4565b60b88110156141d857607e19810191506142d4565b60c081101561425257600060b78203600186019550806020036101000a86510491506001810182019350508083101561424c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142d4565b60f88110156142675760be19810191506142d4565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142d2576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80516000906142ec57506000610e53565b600080905060006143008460200151614145565b602085015185519181019250015b8082101561432e5761431f826141a8565b6001909301929091019061430e565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280614429614436565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220cf38311fc70c7842415f6e43694ca6a2795a904f0541302504db82e7675343ff64736f6c63430006040033

Deployed ByteCode Sourcemap

30181:24140:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33316:9;:11;33312:76;;33343:37;;;33358:10;33343:37;;33370:9;33343:37;;;;;;;;;;;;;;;;;33312:76;30181:24140;;12:1:-1;9;2:12;27058:46:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27058:46:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33934:373;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33934:373:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33934:373:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33934:373:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33934:373:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;33934:373:0;;-1:-1:-1;33934:373:0;-1:-1:-1;33934:373:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33934:373:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33833:95;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33833:95:0;;;:::i;:::-;;;;;;;;;;;;;;;;53384:249;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53384:249:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;53384:249:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;53384:249:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;53384:249:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;53384:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;53384:249:0;;-1:-1:-1;53384:249:0;;-1:-1:-1;;;;;53384:249:0:i;:::-;;;;-1:-1:-1;;;;;53384:249:0;;;;;;;;;;;;;;27111:43;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27111:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27563:88;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27563:88:0;;;:::i;32158:48::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32158:48:0;;;:::i;27417:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27417:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27270:46;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27270:46:0;;;:::i;32101:52::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32101:52:0;;;:::i;28291:94::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28291:94:0;;;:::i;51252:153::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51252:153:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51252:153:0;;:::i;32211:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32211:43:0;;;:::i;31682:52::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31682:52:0;;;:::i;48597:1870::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;48597:1870:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;48597:1870:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;48597:1870:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48597:1870:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;48597:1870:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;48597:1870:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48597:1870:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;48597:1870:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;48597:1870:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48597:1870:0;;-1:-1:-1;48597:1870:0;-1:-1:-1;48597:1870:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27927:83;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27927:83:0;;;:::i;32261:23::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32261:23:0;;;:::i;28199:87::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28199:87:0;;;:::i;27368:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27368:44:0;;;:::i;34313:291::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34313:291:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34313:291:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34313:291:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34313:291:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;34313:291:0;;-1:-1:-1;34313:291:0;-1:-1:-1;34313:291:0;:::i;51574:289::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51574:289:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51574:289:0;;;-1:-1:-1;;;;;51574:289:0;;;;;;;;;;:::i;27321:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27321:42:0;;;:::i;31610:67::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31610:67:0;;;:::i;33399:428::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33399:428:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;33399:428:0;;;;;;;;:::i;28113:81::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28113:81:0;;;:::i;28015:93::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28015:93:0;;;:::i;31223:47::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31223:47:0;;;:::i;26989:23::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26989:23:0;;;:::i;31401:68::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31401:68:0;;;:::i;45673:2918::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;45673:2918:0;;-1:-1:-1;;;;;45673:2918:0;;;;;;;;;;;;;;;;;;;;;;;:::i;27019:34::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27019:34:0;;;:::i;50473:773::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50473:773:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;50473:773:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;50473:773:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;50473:773:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;50473:773:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;50473:773:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;50473:773:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;50473:773:0;;-1:-1:-1;50473:773:0;-1:-1:-1;50473:773:0;:::i;51869:206::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51869:206:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51869:206:0;;;;;;-1:-1:-1;;;;;51869:206:0;;:::i;31848:118::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31848:118:0;;;:::i;31980:55::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31980:55:0;;;:::i;32291:56::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32291:56:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32291:56:0;-1:-1:-1;;;;;32291:56:0;;:::i;51411:157::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51411:157:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51411:157:0;-1:-1:-1;;;;;51411:157:0;;:::i;27656:87::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27656:87:0;;;:::i;34610:299::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34610:299:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34610:299:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34610:299:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34610:299:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;34610:299:0;;-1:-1:-1;34610:299:0;-1:-1:-1;34610:299:0;:::i;27748:86::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27748:86:0;;;:::i;33098:175::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33098:175:0;;;:::i;31474:69::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31474:69:0;;;:::i;31548:55::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31548:55:0;;;:::i;27466:92::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27466:92:0;;;:::i;32040:54::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32040:54:0;;;:::i;53639:679::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53639:679:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53639:679:0;-1:-1:-1;;;;;53639:679:0;;:::i;27839:83::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27839:83:0;;;:::i;27058:46::-;27101:3;27058:46;:::o;33934:373::-;28666:11;;34060:12;;28666:11;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;29337:10:::1;28343:42;29337:39;29329:99;;;;-1:-1:-1::0;;;29329:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34085:34:::2;::::0;::::2;27205:4;34085:34;34081:221;;;34137:36;34164:8;;34137:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;34137:26:0::2;::::0;-1:-1:-1;;;34137:36:0:i:2;:::-;34130:43;;;;34081:221;34224:42;::::0;;-1:-1:-1;;;34224:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;34081:221;33934:373:::0;;;;;:::o;33833:95::-;33914:8;;33833:95;:::o;53384:249::-;53562:2;53546:19;;;53540:26;53457:7;53586:41;;;:24;:41;;;;;;;-1:-1:-1;;;;;53586:41:0;53384:249;;;;:::o;27111:43::-;27150:4;27111:43;:::o;27563:88::-;27609:42;27563:88;:::o;32158:48::-;32202:4;32158:48;:::o;27417:42::-;27453:6;27417:42;:::o;27270:46::-;27312:4;27270:46;:::o;32101:52::-;32149:4;32101:52;:::o;28291:94::-;28343:42;28291:94;:::o;51252:153::-;51340:7;51363:36;;;:24;:36;;;;;;-1:-1:-1;;;;;51363:36:0;;51252:153::o;32211:43::-;32250:4;32211:43;:::o;31682:52::-;31733:1;31682:52;:::o;48597:1870::-;48784:4;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;48805:39;;::::1;48797:111;;;;-1:-1:-1::0;;;48797:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48923:43:::0;;::::1;48915:119;;;;-1:-1:-1::0;;;48915:119:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49061:15;49079:3;49061:21;49049:10;:33;;;;49041:82;;;;-1:-1:-1::0;;;49041:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32250:4;49138:9;:22;:25:::0;49130:102:::1;;;;-1:-1:-1::0;;;49130:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49379:26;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;49261:7;;49239:19:::1;::::0;;;49343:33:::1;::::0;49261:7;49379:26;::::1;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;::::0;-1:-1;49379:26:0::1;-1:-1:-1::0;49343:62:0;-1:-1:-1;49417:6:0::1;49412:264;49433:11;49429:1;:15;49412:264;;;32250:4;49468:7;;49476:1;49468:10;;;;;;;;;;;;;:23;;;;;;:26:::0;49460:99:::1;;;;-1:-1:-1::0;;;49460:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49582:27;49598:7;;49606:1;49598:10;;;;;;;;;;;;;49582:11;:15;;:27;;;;:::i;:::-;49568:41;;49640:28;32250:4;49640:7;;49648:1;49640:10;;;;;;;;;;;;;:14;;:28;;;;:::i;:::-;49618:16;49635:1;49618:19;;;;;;;;;::::0;;::::1;::::0;;;;;:50;49446:3:::1;;49412:264;;;-1:-1:-1::0;49717:8:0::1;::::0;49701:42:::1;::::0;49717:25:::1;::::0;49730:11;49717:25:::1;:12;:25;:::i;:::-;49701:11:::0;;:42:::1;:15;:42;:::i;:::-;49690:9;:53;;49682:152;;;;-1:-1:-1::0;;;49682:152:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49860:26;:9;49874:11:::0;49860:26:::1;:13;:26;:::i;:::-;49841:45;;49895:43;;:::i;:::-;49941:250;;;;;;;;-1:-1:-1::0;;;49989:25:0::1;;49941:250;;;;50045:4;-1:-1:-1::0;;;;;49941:250:0::1;;;;;50068:16;49941:250;;;;50105:14;;49941:250;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;;49941:250:0;;;-1:-1:-1;49941:250:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;50141:11;;;;;;49941:250;::::1;::::0;50141:11;;49941:250;50141:11;49941:250;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;;49941:250:0;;;-1:-1:-1;49941:250:0::1;::::0;::::1;;::::0;;::::1;::::0;49895:296;-1:-1:-1;28343:42:0::1;50198:53;27261:4;50276:43;49895:296:::0;50276:27:::1;:43::i;:::-;50321:34;:16:::0;32250:4:::1;50321:34;:20;:34;:::i;:::-;50198:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;50198:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;50198:158:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;50368:75:0::1;::::0;;50395:3:::1;50368:75:::0;;50401:10:::1;50368:75;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;-1:-1:-1;50368:75:0;;;;;;;-1:-1:-1;50368:75:0::1;-1:-1:-1::0;50457:4:0::1;::::0;48597:1870;-1:-1:-1;;;;;;;;;;;;48597:1870:0:o;27927:83::-;27968:42;27927:83;:::o;32261:23::-;;;;:::o;28199:87::-;28244:42;28199:87;:::o;27368:44::-;27408:4;27368:44;:::o;34313:291::-;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;29337:10:::1;28343:42;29337:39;29329:99;;;;-1:-1:-1::0;;;29329:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34442:35:::2;::::0;::::2;27261:4;34442:35;34438:161;;;34488:37;34516:8;;34488:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;34488:27:0::2;::::0;-1:-1:-1;;;34488:37:0:i:2;:::-;34438:161;;;34553:38;34571:9;34582:8;;34553:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::2;74:27:::0;34553:38:0::2;::::0;137:4:-1::2;117:14:::0;;::::2;-1:-1:::0;;113:30:::2;157:16:::0;;::::2;34553:38:0::0;;::::2;::::0;-1:-1:-1;34553:38:0;;-1:-1:-1;;;;;34553:38:0::2;34438:161;34313:291:::0;;;:::o;51574:289::-;29795:10;28244:42;29795:32;29787:80;;;;-1:-1:-1;;;29787:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51695:36:::1;::::0;;;:24:::1;:36;::::0;;;;;;;:51;;-1:-1:-1;;;;;51695:51:0;;::::1;-1:-1:-1::0;;;;;;51695:51:0;;::::1;::::0;::::1;::::0;;51753:38;;;:24:::1;:38:::0;;;;;:51;;;;51811:21:::1;:35:::0;;;;;:46;51574:289::o;27321:42::-;27359:4;27321:42;:::o;31610:67::-;31658:19;31610:67;:::o;33399:428::-;33515:7;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;29497:10:::1;27968:42;29497:30;29489:90;;;;-1:-1:-1::0;;;29489:90:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33531:20:::2;33563:21;33554:6;:30;:63;;33596:21;33554:63;;;33587:6;33554:63;33531:86;;32202:4;33628:12;:33;33624:64;;;33679:1;33672:8;;;;;33624:64;33698:14:::0;;33694:102:::2;;33723:25;::::0;-1:-1:-1;;;;;33723:11:0;::::2;::::0;:25;::::2;;;::::0;33735:12;;33723:25:::2;::::0;;;33735:12;33723:11;:25;::::2;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;33762:26:0::2;::::0;;-1:-1:-1;;;;;33762:26:0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;;;;;;;;::::2;33694:102;33809:12:::0;-1:-1:-1;29586:1:0::2;33399:428:::0;;;;:::o;28113:81::-;28152:42;28113:81;:::o;28015:93::-;28066:42;28015:93;:::o;31223:47::-;31269:1;31223:47;:::o;26989:23::-;;;;;;:::o;31401:68::-;31468:1;31401:68;:::o;45673:2918::-;45814:4;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;45847:15:::1;45865:3;45847:21;45835:10;:33;;;;45827:82;;;;-1:-1:-1::0;;;45827:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32250:4;45924:9;:22;:25:::0;45916:102:::1;;;;-1:-1:-1::0;;;45916:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46025:23;::::0;;-1:-1:-1;;;;;46120:26:0;::::1;46116:1766;;46187:8;::::0;46176:20:::1;::::0;:6;;:20:::1;:10;:20;:::i;:::-;46165:9;:31;;46157:141;;;;-1:-1:-1::0;;;46157:141:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32250:4;46315:6:::0;:19:::1;:22:::0;46307:95:::1;;;;-1:-1:-1::0;;;46307:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46428:21;:9;46442:6:::0;46428:21:::1;:13;:21;:::i;:::-;46411:38:::0;-1:-1:-1;46476:24:0::1;:6:::0;32250:4:::1;46476:24;:10;:24;:::i;:::-;-1:-1:-1::0;;;31900:66:0;-1:-1:-1;46458:42:0;-1:-1:-1;46116:1766:0::1;;;-1:-1:-1::0;;;;;46670:38:0;::::1;;::::0;;;:24:::1;:38;::::0;;;;;;-1:-1:-1;46725:30:0;46717:92:::1;;;;-1:-1:-1::0;;;46717:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46837:8;;46826:9;:19;;46818:95;;;;-1:-1:-1::0;;;46818:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;46984:35:0;::::1;46957:26;46984:35:::0;;;:21:::1;:35;::::0;;;;;46939:9:::1;::::0;31842:1:::1;47036:39:::0;::::1;;::::0;:146:::1;;-1:-1:-1::0;31842:1:0::1;47080:38:::0;::::1;:101:::0;::::1;;;-1:-1:-1::0;47122:56:0::1;:6:::0;-1:-1:-1;;47138:38:0;;47133:2:::1;:44;47122:56;:10;:56;:::i;:::-;:59:::0;47080:101:::1;47028:219;;;;-1:-1:-1::0;;;47028:219:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47274:47;47294:6;47302:18;47274:19;:47::i;:::-;47256:65;;47359:32;47375:15;47359;:32::i;:::-;47355:153;;;47431:3;47412:15;:22;;47404:94;;;;-1:-1:-1::0;;;47404:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31842:1;47524:39:::0;::::1;;::::0;:109:::1;;-1:-1:-1::0;31842:1:0::1;47568:38:::0;::::1;:64:::0;::::1;;;;47626:6;47610:15;:22;47568:64;47516:159;;;;-1:-1:-1::0;;;47516:159:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31658:19;47692:15;:38;;47684:104;;;;-1:-1:-1::0;;;47684:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47805:68;::::0;;-1:-1:-1;;;47805:68:0;;47839:10:::1;47805:68;::::0;::::1;::::0;47859:4:::1;47805:68:::0;;;;;;;;;;;;-1:-1:-1;;;;;47805:33:0;::::1;::::0;::::1;::::0;:68;;;;;::::1;::::0;;;;;;;;-1:-1:-1;47805:33:0;:68;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;47805:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;47805:68:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;47805:68:0;47797:77:::1;;12:1:-1;9::::0;2:12:::1;47797:77:0;46116:1766;;47888:43;;:::i;:::-;47934:246;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;47934:246:0;::::1;;::::0;::::1;::::0;48050:16;;48064:1:::1;48050:16:::0;;;;;::::1;::::0;;47934:246;;;;;48050:16:::1;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1:::0;;;47934:246:0;;48087:16:::1;::::0;;48101:1:::1;48087:16:::0;;;;;::::1;::::0;;;47934:246:::1;::::0;;::::1;::::0;48087:16;;48101:1;48087:16;;::::1;::::0;47934:246;109:14:-1::1;48087:16:0::0;88:42:-1::1;-1:-1:::0;;;47934:246:0;;48125:16:::1;::::0;;48139:1:::1;48125:16:::0;;;;;::::1;::::0;;;47934:246:::1;::::0;;::::1;::::0;48125:16;;48139:1;48125:16;;::::1;::::0;47934:246;109:14:-1::1;48125:16:0::0;88:42:-1::1;144:17;::::0;-1:-1;48125:16:0::1;47934:246;;;;48162:10;47934:246;;;;::::0;47888:292:::1;;48213:15;48187:14;:22;;;48210:1;48187:25;;;;;;;;;;;;;:41;;;::::0;::::1;48264:9;48235:14;:25;;;48261:1;48235:28;;;;;;;;;;;;;:38;-1:-1:-1::0;;;;;48235:38:0::1;;;-1:-1:-1::0;;;;;48235:38:0::1;;;::::0;::::1;48310:10;48280:14;:26;;;48307:1;48280:29;;;;;;;;-1:-1:-1::0;;;;;48280:40:0;;::::1;:29;::::0;;::::1;::::0;;;;;;;:40;28343:42:::1;48327:53;27261:4;48405:43;48433:14:::0;48405:27:::1;:43::i;:::-;48450:34;:16:::0;32250:4:::1;48450:34;:20;:34;:::i;:::-;48327:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;48327:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;48327:158:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;48497:70:0::1;::::0;;-1:-1:-1;;;;;48497:70:0;::::1;::::0;;48530:10:::1;48497:70;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;-1:-1:-1;48497:70:0;;;;;;;-1:-1:-1;48497:70:0::1;-1:-1:-1::0;48581:4:0::1;::::0;45673:2918;-1:-1:-1;;;;;;;;45673:2918:0:o;50473:773::-;29033:10;28152:42;29033:26;29025:85;;;;-1:-1:-1;;;29025:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50593:2:::1;50577:18:::0;::::1;50569:58;;;::::0;;-1:-1:-1;;;50569:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50634:22;50659:3;;50634:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;50669:31:0::1;::::0;;::::1;137:4:-1;50669:31:0::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;50634:28;;-1:-1:-1;50669:23:0::1;::::0;:31;-1:-1:-1;50695:5:0;;-1:-1:-1;50695:5:0;;;;50669:31;::::1;50695:5:::0;;;;50669:31;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;;;50784:2:0::1;50770:17:::0;::::1;50764:24:::0;50669:31;;-1:-1:-1;;;;50805:89:0;::::1;50801:405;;;51002:2;50986:19:::0;::::1;50980:26:::0;51046:4:::1;51031:19:::0;::::1;::::0;::::1;::::0;:52:::1;;-1:-1:-1::0;32250:4:0::1;51054:11:::0;:26:::1;:29:::0;51031:52:::1;51023:90;;;::::0;;-1:-1:-1;;;51023:90:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51122:8;:22:::0;50801:405:::1;;;51167:31;::::0;;-1:-1:-1;;;51167:31:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51167:31:0;;;;;;;;;;;;;::::1;;51217:23;51229:3;;51234:5;;51217:23;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::1;74:27:::0;137:4:::1;117:14;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;51217:23:0::0;;::::1;::::0;;;;;::::1;;::::0;-1:-1:-1;51217:23:0;;;;;1:33:-1::1;99:1;81:16:::0;;::::1;74:27:::0;51217:23:0::1;::::0;137:4:-1::1;117:14:::0;;::::1;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;51217:23:0::0;;::::1;::::0;-1:-1:-1;51217:23:0;;-1:-1:-1;;;;;;;51217:23:0::1;29117:1;;;50473:773:::0;;;;:::o;51869:206::-;29795:10;28244:42;29795:32;29787:80;;;;-1:-1:-1;;;29787:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51981:36:::1;::::0;;;:24:::1;:36;::::0;;;;;;;51974:43;;-1:-1:-1;;;;;;51974:43:0::1;::::0;;-1:-1:-1;;;;;52031:38:0;;;::::1;::::0;;:24:::1;:38:::0;;;;52024:45;51869:206::o;31848:118::-;-1:-1:-1;;;31848:118:0;:::o;31980:55::-;32030:5;31980:55;:::o;32291:56::-;;;;;;;;;;;;;:::o;51411:157::-;-1:-1:-1;;;;;51524:38:0;51501:7;51524:38;;;:24;:38;;;;;;;51411:157::o;27656:87::-;27701:42;27656:87;:::o;34610:299::-;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;29337:10:::1;28343:42;29337:39;29329:99;;;;-1:-1:-1::0;;;29329:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34743:35:::2;::::0;::::2;27261:4;34743:35;34739:165;;;34789:41;34821:8;;34789:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;34789:31:0::2;::::0;-1:-1:-1;;;34789:41:0:i:2;27748:86::-:0;27792:42;27748:86;:::o;33098:175::-;28570:11;;;;28569:12;28561:50;;;;;-1:-1:-1;;;28561:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32149:4:::1;33142:8;:33:::0;;;33182:35:::1;::::0;;;:21:::1;:35;::::0;33220:2:::1;33182:35:::0;:40;33251:16;;-1:-1:-1;;33251:16:0::1;::::0;;::::1;::::0;;33098:175::o;31474:69::-;31542:1;31474:69;:::o;31548:55::-;31602:1;31548:55;:::o;27466:92::-;27516:42;27466:92;:::o;32040:54::-;32089:5;32040:54;:::o;53639:679::-;-1:-1:-1;;;;;53760:38:0;;53732:25;53760:38;;;:24;:38;;;;;;;;;;53836:13;;;;;;;;;;;53710;;53760:38;;53710:13;;53836;;;;21:6:-1;;108:14;53836:13:0;87:42:-1;-1:-1;;;53901:2:0;53881:23;;53874:50;;;53881:23;-1:-1:-1;53937:22:0;;53970:147;53992:2;53988:1;:6;;;53970:147;;;54014:15;54030:1;54014:18;;;;;;;;;;;;;;-1:-1:-1;;;;;;54014:18:0;:23;54010:100;;54050:18;;;;;54010:100;;;54095:5;;54010:100;53996:3;;53970:147;;;;54123:23;54159:16;54149:27;;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;54149:27:0;87:42:-1;143:17;;-1:-1;54149:27:0;-1:-1:-1;54123:53:0;-1:-1:-1;54188:7:0;54183:98;54205:16;54201:20;;:1;:20;;;54183:98;;;54255:15;54271:1;54255:18;;;;;;;;;;;;;;;;;;54239:10;54250:1;54239:13;;;;;;;;;;;;;:34;-1:-1:-1;;;;;54239:34:0;;;;;;;;-1:-1:-1;54223:3:0;;54183:98;;;-1:-1:-1;54301:10:0;53639:679;-1:-1:-1;;;;;53639:679:0:o;27839:83::-;27880:42;27839:83;:::o;36353:845::-;36429:12;36451:41;;:::i;:::-;36494:12;36510:36;36537:8;36510:26;:36::i;:::-;36450:96;;;;36561:7;36553:51;;;;;-1:-1:-1;;;36553:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36611:14;36628:27;36641:13;36628:12;:27::i;:::-;36611:44;-1:-1:-1;36666:30:0;;;;36662:531;;36748:20;;;;;36792:26;;;;;-1:-1:-1;;;;;36770:49:0;36707:18;36770:49;;;:21;:49;;;;;;;36728:92;;36748:20;36728:19;:92::i;:::-;36707:113;;36829:44;;:::i;:::-;36876:207;;;;;;;;36930:13;:29;;;36876:207;;;;36986:10;36876:207;;;;37021:13;:24;;;-1:-1:-1;;;;;36876:207:0;;;;;37066:7;36876:207;;;;;36829:254;;37099:44;37129:13;37099:29;:44::i;:::-;37092:51;;;;;;;;;36662:531;-1:-1:-1;;37173:12:0;;;37183:1;37173:12;;;;;;;;;-1:-1:-1;37166:19:0;;-1:-1:-1;37166:19:0;6238:181;6296:7;6328:5;;;6352:6;;;;6344:46;;;;;-1:-1:-1;;;6344:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8507:132;8565:7;8592:39;8596:1;8599;8592:39;;;;;;;;;;;;;;;;;:3;:39::i;7568:471::-;7626:7;7871:6;7867:47;;-1:-1:-1;7901:1:0;7894:8;;7867:47;7938:5;;;7942:1;7938;:5;:1;7962:5;;;;;:10;7954:56;;;;-1:-1:-1;;;7954:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6694:136;6752:7;6779:43;6783:1;6786;6779:43;;;;;;;;;;;;;;;;;:3;:43::i;44381:1286::-;44533:14;;;44545:1;44533:14;;;;;;;;;44486:12;;;;44533:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;44578:30:0;;44507:40;;-1:-1:-1;44570:52:0;;:50;:52::i;:::-;44556:8;44565:1;44556:11;;;;;;;;;;;;;:66;;;;44643:43;:14;:27;;;-1:-1:-1;;;;;44643:41:0;;:43::i;:::-;44629:8;44638:1;44629:11;;;;;;;;;;;;;:57;;;;44695:19;44717:14;:22;;;:29;44695:51;;44755:30;44800:11;44788:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44755:57:0;-1:-1:-1;44824:13:0;44819:137;44850:11;44843:5;:18;44819:137;;;44906:42;:14;:22;;;44929:5;44906:29;;;;;;;;;;;;;;:40;:42::i;:::-;44881:15;44897:5;44881:22;;;;;;;;;;;;;;;;;:67;44863:7;;44819:137;;;;44976:28;:15;:26;:28::i;:::-;44962:8;44971:1;44962:11;;;;;;;;;;;;;:42;;;;45013:33;45061:11;45049:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45013:60:0;-1:-1:-1;45085:13:0;45080:147;45111:11;45104:5;:18;45080:147;;;45171:48;:14;:25;;;45197:5;45171:32;;;;;;;;;;;;;;-1:-1:-1;;;;;45171:46:0;;:48::i;:::-;45143:18;45162:5;45143:25;;;;;;;;;;;;;;;;;:76;45124:7;;45080:147;;;;45247:31;:18;:29;:31::i;:::-;45233:8;45242:1;45233:11;;;;;;;;;;;;;:45;;;;45287:34;45336:11;45324:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45287:61:0;-1:-1:-1;45360:13:0;45355:149;45386:11;45379:5;:18;45355:149;;;45447:49;:14;:26;;;45474:5;45447:33;;;;;;;:49;45418:19;45438:5;45418:26;;;;;;;;;;;;;;;;;:78;45399:7;;45355:149;;;;45524:32;:19;:30;:32::i;:::-;45510:8;45519:1;45510:11;;;;;;;;;;;;;:46;;;;45579:47;45587:14;:25;;;45579:34;;:45;:47::i;:::-;45565:8;45574:1;45565:11;;;;;;;;;;;;;:61;;;;45640:21;:8;:19;:21::i;:::-;45633:28;44381:1286;-1:-1:-1;;;;;;;44381:1286:0:o;40190:287::-;40267:43;;:::i;:::-;40312:18;40334:37;40362:8;40334:27;:37::i;:::-;40266:105;;;;40386:13;40378:62;;;;-1:-1:-1;;;40378:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40447:24;40456:14;40447:8;:24::i;9929:130::-;9987:7;10014:37;10018:1;10021;10014:37;;;;;;;;;;;;;;;;;:3;:37::i;52744:313::-;52840:7;31842:1;52860:40;;52856:126;;;52918:56;:6;-1:-1:-1;;52934:38:0;;52929:2;:44;52918:56;:10;:56;:::i;:::-;52911:63;;;;52856:126;52995:56;:6;31842:1;53011:38;;;53006:2;:44;52995:56;:10;:56;:::i;52081:657::-;52185:13;;;52195:2;52185:13;;;;;;;;;52144:4;;52158:24;;52185:13;;;;21:6:-1;;108:14;52185:13:0;87:42:-1;-1:-1;;;52249:2:0;52232:20;;52225:36;;;52232:20;-1:-1:-1;52276:18:0;;52306:145;52328:2;52324:1;:6;;;52306:145;;;52351:11;52363:1;52351:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;52351:14:0;:19;52347:96;;52384:14;;;;;52347:96;;;52427:5;;52347:96;52332:3;;52306:145;;;-1:-1:-1;52477:28:0;52462:43;;;;52458:80;;;52524:5;52517:12;;;;;;52458:80;52549:11;52574:1;52561:12;:14;52549:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52549:27:0;-1:-1:-1;;;52549:35:0;52545:79;;52610:5;52603:12;;;;;;52545:79;52635:11;52660:1;52647:12;:14;52635:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52635:27:0;-1:-1:-1;;;52635:34:0;52631:83;;52700:5;52693:12;;;;;;52631:83;-1:-1:-1;52728:4:0;;52081:657;-1:-1:-1;;;52081:657:0:o;43524:851::-;43605:43;;:::i;:::-;43650:18;43672:37;43700:8;43672:27;:37::i;:::-;43604:105;;;;43724:13;43716:62;;;;-1:-1:-1;;;43716:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43785:43;;:::i;:::-;43865:27;;;;;;-1:-1:-1;;;;;43835:57:0;;;;;43930:22;;;;;43899:28;;;:53;44010:27;;43988:50;43835:27;43988:50;;;:21;:50;;;;;;;44045:174;44065:14;:22;;;:29;44061:3;:33;44045:174;;;44141:70;44163:14;:22;;;44186:3;44163:27;;;;;;;;;;;;;;44192:18;44141:21;:70::i;:::-;44111:14;:22;;;44134:3;44111:27;;;;;;;;;;;;;;;;;:100;44095:5;;44045:174;;;-1:-1:-1;44254:26:0;;;;44225;;;:55;31602:1;44287:21;;;:51;44345:24;44225:14;44345:8;:24::i;:::-;43524:851;;;;;:::o;34915:960::-;34997:27;;:::i;:::-;35026:4;35039:41;;:::i;:::-;35089:30;;:::i;:::-;35122:31;:20;:8;:18;:20::i;:::-;:29;:31::i;:::-;35089:64;-1:-1:-1;35160:12:0;;35207:625;35214:14;:4;:12;:14::i;:::-;35207:625;;;35243:8;35239:571;;35299:20;:11;:4;:9;:11::i;:::-;:18;:20::i;:::-;35253:67;;35239:571;;;35338:3;35345:1;35338:8;35334:476;;;35381:23;:11;:4;:9;:11::i;:::-;:21;:23::i;:::-;-1:-1:-1;;;;;35348:56:0;:26;;;:56;35334:476;;;35422:3;35429:1;35422:8;35418:392;;;35465:20;:11;:4;:9;:11::i;:20::-;35432;;;:53;35418:392;;;35503:3;35510:1;35503:8;35499:311;;;35548:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;35513:60:0;:23;;;:60;35499:311;;;35591:3;35598:1;35591:8;35587:223;;;35634:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;35601:56:0;:24;;;:56;35587:223;;;35675:3;35682:1;35675:8;35671:139;;;35736:20;:11;:4;:9;:11::i;:20::-;35696:61;;:24;;;:61;35778:4;;-1:-1:-1;35671:139:0;;;35805:5;;35671:139;35819:5;;35207:625;;;-1:-1:-1;35846:13:0;;-1:-1:-1;35861:7:0;;-1:-1:-1;;34915:960:0;;;:::o;37204:1655::-;37306:26;;;;37287:6;;-1:-1:-1;;;;;37306:40:0;37302:1552;;37379:13;:24;;;37361:42;;:15;:42;37357:103;;;-1:-1:-1;31329:1:0;37416:34;;37357:103;37496:13;:20;;;37472:21;:44;37468:118;;;-1:-1:-1;31468:1:0;37529:47;;37468:118;37613:23;;;;37680:20;;;;;37613:92;;37595:12;;-1:-1:-1;;;;;37613:28:0;;32089:5;;37595:12;37613:92;37595:12;37613:92;37680:20;37613:28;32089:5;37613:92;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;37594:111:0;;;37719:7;37714:83;;-1:-1:-1;31542:1:0;;-1:-1:-1;37739:48:0;;37714:83;37810:92;37828:13;:26;;;37856:13;:23;;;37881:13;:20;;;37810:92;;;;-1:-1:-1;;;;;37810:92:0;-1:-1:-1;;;;;37810:92:0;;;;;;-1:-1:-1;;;;;37810:92:0;-1:-1:-1;;;;;37810:92:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31269:1:0;;-1:-1:-1;37911:26:0;;37302:1552;37982:13;:24;;;37964:42;;:15;:42;37960:103;;;-1:-1:-1;31329:1:0;38019:34;;37960:103;38130:29;;38100:26;;;;;-1:-1:-1;;;;;38075:52:0;38130:29;38075:52;;;:24;:52;;;;;;;:84;38071:151;;-1:-1:-1;31395:1:0;38172:40;;38071:151;38261:26;;;;;38254:91;;;-1:-1:-1;;;38254:91:0;;38339:4;38254:91;;;;;;38230:21;;-1:-1:-1;;;;;38254:44:0;;;;;;32030:5;;38254:91;;;;;38261:26;38254:91;;;;;:44;:91;;;2:2:-1;;;;27:1;24;17:12;2:2;38254:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38254:91:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38254:91:0;38374:20;;;;38254:91;;-1:-1:-1;38358:36:0;;38354:110;;;-1:-1:-1;31468:1:0;;-1:-1:-1;38407:47:0;;38354:110;38472:12;38494:13;:26;;;-1:-1:-1;;;;;38487:43:0;;32030:5;38563:13;:23;;;38588:13;:20;;;38487:122;;;;;;;;;;;;;-1:-1:-1;;;;;38487:122:0;-1:-1:-1;;;;;38487:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38487:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38487:122:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38487:122:0;;-1:-1:-1;38618:229:0;;;;38647:92;38665:13;:26;;;38693:13;:23;;;38718:13;:20;;;38647:92;;;;-1:-1:-1;;;;;38647:92:0;-1:-1:-1;;;;;38647:92:0;;;;;;-1:-1:-1;;;;;38647:92:0;-1:-1:-1;;;;;38647:92:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31269:1:0;;-1:-1:-1;38750:26:0;;-1:-1:-1;38750:26:0;38618:229;-1:-1:-1;31602:1:0;;-1:-1:-1;38803:34:0;;-1:-1:-1;38803:34:0;35881:466;36036:14;;;36048:1;36036:14;;;;;;;;;35989:12;;;;36036:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;36079:29:0;;36010:40;;-1:-1:-1;36071:51:0;;:49;:51::i;:::-;36057:8;36066:1;36057:11;;;;;;;;;;;;;:65;;;;36143:39;:13;:26;;;:37;:39::i;:::-;36129:8;36138:1;36129:11;;;;;;;;;;;;;:53;;;;36203:40;:13;:24;;;-1:-1:-1;;;;;36203:38:0;;:40::i;:::-;36189:8;36198:1;36189:11;;;;;;;;;;;;;:54;;;;36264:42;36272:13;:20;;;36264:29;;:40;:42::i;:::-;36250:8;36259:1;36250:11;;;;;;;;;;;;;:56;;;;36320:21;:8;:19;:21::i;9127:345::-;9213:7;9315:12;9308:5;9300:28;;;;-1:-1:-1;;;9300:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9300:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9339:9;9355:1;9351;:5;;;;;;;9127:345;-1:-1:-1;;;;;9127:345:0:o;7125:192::-;7211:7;7247:12;7239:6;;;;7231:29;;;;-1:-1:-1;;;7231:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7231:29:0;-1:-1:-1;;;7283:5:0;;;7125:192::o;11938:121::-;11992:12;12024:27;12036:14;12045:4;12036:8;:14::i;:::-;12024:11;:27::i;11448:351::-;11597:4;11591:11;;-1:-1:-1;;;11635:55:0;;11630:2;11623:10;;11616:75;11725:2;11718:10;;11705:24;;;11508:12;;11777:14;11591:11;11777;:14::i;12865:399::-;12929:12;12958:4;:11;12973:1;12958:16;12954:68;;;-1:-1:-1;12998:12:0;;;13008:1;12998:12;;;;;;;;12991:19;;12954:68;13032:20;13055:4;13060:1;13055:7;;;;;;;;;;;;;;13032:30;;13078:6;13087:1;13078:10;;13073:104;13094:4;:11;13090:1;:15;13073:104;;;13137:28;13148:7;13157:4;13162:1;13157:7;;;;;;;;;;;;;;13137:10;:28::i;:::-;13127:38;-1:-1:-1;13107:3:0;;13073:104;;;;13194:62;13205:41;13218:7;:14;10873:4;13205:41;;:12;:41::i;:::-;13248:7;13194:10;:62::i;38865:1319::-;38947:28;;:::i;:::-;38977:4;38990:43;;:::i;:::-;39042:30;;:::i;:::-;39075:31;:20;:8;:18;:20::i;:31::-;39042:64;-1:-1:-1;39113:12:0;;39160:980;39167:14;:4;:12;:14::i;:::-;39160:980;;;39198:8;39194:923;;39251:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;39221:53:0;;;39194:923;;;39305:3;39312:1;39305:8;39301:816;;;39328:31;39362:20;:11;:4;:9;:11::i;:::-;:18;:20::i;:::-;39328:54;;39440:4;:11;39426:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;39426:26:0;-1:-1:-1;39395:28:0;;;:57;39470:13;39465:137;39493:4;:11;39487:5;:17;39465:137;;;39568:20;:4;39573:5;39568:11;;;;;;;;;;;;;;:18;:20::i;:::-;39530:14;:28;;;39559:5;39530:35;;;;;;;;;;;;;;;;;:58;39506:7;;39465:137;;;;39301:816;;;;39632:3;39639:1;39632:8;39628:489;;;39655:31;39689:20;:11;:4;:9;:11::i;:20::-;39655:54;;39765:4;:11;39751:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;39751:26:0;-1:-1:-1;39722:26:0;;;:55;39795:13;39790:138;39818:4;:11;39812:5;:17;39790:138;;;39891:23;:4;39896:5;39891:11;;;;;;;;;;;;;;:21;:23::i;:::-;39855:14;:26;;;39882:5;39855:33;;;;;;;;-1:-1:-1;;;;;39855:59:0;;;:33;;;;;;;;;;;:59;39831:7;;39790:138;;39628:489;39958:3;39965:1;39958:8;39954:163;;;40012:20;:11;:4;:9;:11::i;:20::-;39981:52;;:21;;;:52;40056:4;;-1:-1:-1;39954:163:0;40127:5;;39160:980;;40483:1389;40566:27;;-1:-1:-1;;;;;40566:41:0;40562:1305;;40623:13;40618:597;40648:14;:28;;;:35;40642:5;:41;40618:597;;;40706:12;40724:14;:26;;;40751:5;40724:33;;;;;;;;;;;;;;-1:-1:-1;;;;;40724:38:0;32089:5;40801:14;:28;;;40830:5;40801:35;;;;;;;;;;;;;;;;;;40724:117;;;;;;40801:35;40724:117;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;40705:136:0;;;40857:7;40852:354;;40884:137;40898:14;:27;;;40927:14;:26;;;40954:5;40927:33;;;;;;;;;;;;;;40962:14;:28;;;40991:5;40962:35;;;;;;;;;;;;;;40999:14;:21;;;40884:137;;;;-1:-1:-1;;;;;40884:137:0;-1:-1:-1;;;;;40884:137:0;;;;;;-1:-1:-1;;;;;40884:137:0;-1:-1:-1;;;;;40884:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40852:354;;;41057:137;41071:14;:27;;;41100:14;:26;;;41127:5;41100:33;;;;;;;;;;;;;;41135:14;:28;;;41164:5;41135:35;;;;;;;;;;;;;;41172:14;:21;;;41057:137;;;;-1:-1:-1;;;;;41057:137:0;-1:-1:-1;;;;;41057:137:0;;;;;;-1:-1:-1;;;;;41057:137:0;-1:-1:-1;;;;;41057:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40852:354;-1:-1:-1;40685:7:0;;40618:597;;;;40562:1305;;;41242:13;41237:623;41267:14;:28;;;:35;41261:5;:41;41237:623;;;41324:12;41346:14;:27;;;-1:-1:-1;;;;;41339:44:0;;32030:5;41416:14;:26;;;41443:5;41416:33;;;;;;;;;;;;;;41451:14;:28;;;41480:5;41451:35;;;;;;;;;;;;;;41339:148;;;;;;;;;;;;;-1:-1:-1;;;;;41339:148:0;-1:-1:-1;;;;;41339:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41339:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41339:148:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41339:148:0;;-1:-1:-1;41498:353:0;;;;41529:137;41543:14;:27;;;41572:14;:26;;;41599:5;41572:33;;;;;;;;;;;;;;41607:14;:28;;;41636:5;41607:35;;;;;;;;;;;;;;41644:14;:21;;;41529:137;;;;-1:-1:-1;;;;;41529:137:0;-1:-1:-1;;;;;41529:137:0;;;;;;-1:-1:-1;;;;;41529:137:0;-1:-1:-1;;;;;41529:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41498:353;;;41702:137;41716:14;:27;;;41745:14;:26;;;41772:5;41745:33;;;;;;;;;;;;;;41780:14;:28;;;41809:5;41780:35;;;;;;;;;;;;;;41817:14;:21;;;41702:137;;;;-1:-1:-1;;;;;41702:137:0;-1:-1:-1;;;;;41702:137:0;;;;;;-1:-1:-1;;;;;41702:137:0;-1:-1:-1;;;;;41702:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41498:353;-1:-1:-1;41304:7:0;;41237:623;;;;40562:1305;40483:1389;:::o;10536:166::-;10622:7;10658:12;10650:6;10642:29;;;;-1:-1:-1;;;10642:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;10642:29:0;;10693:1;10689;:5;;;;;;;10536:166;-1:-1:-1;;;;10536:166:0:o;41878:1640::-;41961:28;;:::i;:::-;41991:4;42004:43;;:::i;:::-;42056:30;;:::i;:::-;42089:31;:20;:8;:18;:20::i;:31::-;42056:64;-1:-1:-1;42127:12:0;;42174:1300;42181:14;:4;:12;:14::i;:::-;42174:1300;;;42210:8;42206:1247;;42272:20;:11;:4;:9;:11::i;:20::-;42231:62;;42206:1247;;;42313:3;42320:1;42313:8;42309:1144;;;42364:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;42334:53:0;:27;;;:53;42309:1144;;;42407:3;42414:1;42407:8;42403:1050;;;42428:31;42462:20;:11;:4;:9;:11::i;:20::-;42428:54;;42532:4;:11;42518:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;42518:26:0;-1:-1:-1;42493:22:0;;;:51;42560:13;42555:127;42583:4;:11;42577:5;:17;42555:127;;;42650:20;:4;42655:5;42650:11;;;;;;;:20;42618:14;:22;;;42641:5;42618:29;;;;;;;;;;;;;;;;;:52;42596:7;;42555:127;;;;42403:1050;;;;42701:3;42708:1;42701:8;42697:756;;;42722:31;42756:20;:11;:4;:9;:11::i;:20::-;42722:54;;42829:4;:11;42815:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;42815:26:0;-1:-1:-1;42787:25:0;;;:54;42857:13;42852:133;42880:4;:11;42874:5;:17;42852:133;;;42950:23;:4;42955:5;42950:11;;;;;;;:23;42915:14;:25;;;42941:5;42915:32;;;;;;;;-1:-1:-1;;;;;42915:58:0;;;:32;;;;;;;;;;;:58;42893:7;;42852:133;;42697:756;43004:3;43011:1;43004:8;43000:453;;;43025:31;43059:20;:11;:4;:9;:11::i;:20::-;43025:54;;43133:4;:11;43119:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;43119:26:0;-1:-1:-1;43090:26:0;;;:55;43161:13;43156:134;43184:4;:11;43178:5;:17;43156:134;;;43255:23;:4;43260:5;43255:11;;;;;;;:23;43219:14;:26;;;43246:5;43219:33;;;;;;;;-1:-1:-1;;;;;43219:59:0;;;:33;;;;;;;;;;;:59;43197:7;;43156:134;;43000:453;43309:3;43316:1;43309:8;43305:148;;;43365:20;:11;:4;:9;:11::i;:20::-;43330:56;;:25;;;:56;43407:4;;-1:-1:-1;43305:148:0;43461:5;;42174:1300;;53063:315;53161:7;31842:1;53181:40;;53177:126;;;53239:56;:6;-1:-1:-1;;53255:38:0;;53250:2;:44;53239:56;:10;:56;:::i;53177:126::-;53316:56;:6;31842:1;53332:38;;;53327:2;:44;53316:56;:10;:56;:::i;19132:225::-;19193:14;;:::i;:::-;-1:-1:-1;19321:28:0;;;;;;;;;19329:11;;19321:28;;19286:4;19276:15;;;19321:28;;;;19132:225;;;:::o;19365:221::-;19427:15;;:::i;:::-;19463:12;19470:4;19463:6;:12::i;:::-;19455:21;;12:1:-1;9;2:12;19455:21:0;19489:8;19514:27;19529:4;:11;;;19514:14;:27::i;:::-;19500:11;;;;;19559:19;;;;;;;;;;;;19500:41;;19559:19;;;;;-1:-1:-1;;19365:221:0;;;:::o;18951:173::-;19013:4;19030:19;;:::i;:::-;-1:-1:-1;;19052:9:0;;19108:8;;19094:11;;;;;19079:12;;;;;19094:22;;-1:-1:-1;;18951:173:0:o;18660:283::-;18719:14;;:::i;:::-;18754:13;18762:4;18754:7;:13::i;:::-;18746:22;;12:1:-1;9;2:12;18746:22:0;18792:12;;;;18781:8;18833:16;18792:12;18833:11;:16::i;:::-;18875;;;18860:12;;;;:31;18911:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;18911:24:0;;18660:283;-1:-1:-1;18660:283:0:o;21580:613::-;21665:8;;21640:4;;21665:12;;;;:30;;-1:-1:-1;21681:8:0;;21693:2;-1:-1:-1;21681:14:0;21665:30;21657:39;;12:1:-1;9;2:12;21657:39:0;21709:11;21723:27;21738:4;:11;;;21723:14;:27::i;:::-;21709:41;;21781:6;21769:4;:8;;;:18;;21761:57;;;;;-1:-1:-1;;;21761:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21840:8;;21906:11;;;;;:20;;21971:13;;21840:17;;;;;21971:13;22058:11;;22055:2;;;22128:3;22124:2;22120:12;22115:3;22111:22;22103:6;22099:35;22089:45;;22055:2;-1:-1:-1;22179:6:0;21580:613;-1:-1:-1;;;;21580:613:0:o;21376:196::-;21508:8;;21439:7;;21520:2;21508:14;21500:23;;12:1:-1;9;2:12;21500:23:0;21551:12;21558:4;21551:6;:12::i;17314:788::-;17405:13;;;17415:2;17405:13;;;;;;;;;17363:12;;;;17405:13;;;;21:6:-1;;108:14;17405:13:0;87:42:-1;-1:-1;;;17467:2:0;17460:10;;17453:21;;;17388:30;-1:-1:-1;17495:6:0;-1:-1:-1;;17516:70:0;;17512:272;;-1:-1:-1;17612:2:0;17512:272;;;-1:-1:-1;;17636:70:0;;17632:152;;-1:-1:-1;17732:2:0;17632:152;;;-1:-1:-1;17771:1:0;17632:152;17805:2;17801:1;:6;17794:101;;;17833:1;17835;17833:4;;;;;;;;;;;;-1:-1:-1;;;;;;17833:4:0;:9;17829:55;;17863:5;;17829:55;17809:3;;17794:101;;;17905:11;17924:1;17919:2;:6;17905:20;;17936:15;17964:6;17954:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;17954:17:0;87:42:-1;143:17;;-1:-1;17954:17:0;-1:-1:-1;18013:15:0;;;18006:26;;;;-1:-1:-1;18046:18:0;;-1:-1:-1;18013:15:0;;17314:788;-1:-1:-1;;17314:788:0:o;11050:250::-;11113:12;11142:4;:11;11157:1;11142:16;:35;;;;;11173:4;11162:15;;:4;11167:1;11162:7;;;;;;;;;;;;-1:-1:-1;;;;;;11162:7:0;:15;;11142:35;11138:79;;;-1:-1:-1;11201:4:0;11194:11;;11138:79;11234:58;11245:40;11258:4;:11;10833:4;11245:40;;:12;:40::i;:::-;11287:4;13465:2915;13597:12;13627:22;13829:4;13823:11;13810:24;;13982:9;13976:16;14024:6;14013:9;14006:25;14259:4;14248:9;14244:20;14403:6;14399:2;14395:15;14594:4;14583:9;14579:20;14426:517;14622:3;14618:2;14615:11;14426:517;;;14918:9;;14907:21;;14727:4;14719:13;;;;14756;14426:517;;;-1:-1:-1;15147:17:0;;15208:16;;15196:29;;15178:48;;15147:17;-1:-1:-1;15366:3:0;-1:-1:-1;15498:15:0;;;15578:4;15562:21;;15529:228;15606:3;15602:2;15599:11;15529:228;;;15732:9;;15721:21;;15644:4;15636:13;;;;15673;15529:228;;;-1:-1:-1;16232:16:0;;16220:29;;;;16213:37;16204:47;;;;16275:2;16200:56;-1:-1:-1;;16182:150:0;16176:4;16169:164;-1:-1:-1;16363:9:0;-1:-1:-1;13465:2915:0;;;;:::o;16697:438::-;16768:12;16810:6;16801;:15;16793:42;;;;;-1:-1:-1;;;16793:42:0;;;;;;;;;;;;-1:-1:-1;;;16793:42:0;;;;;;;;;;;;;;;16864:12;;;16874:1;16864:12;;;;;;;;;16846:15;;16864:12;;;21:6:-1;;108:14;16864:12:0;87:42:-1;143:17;;-1:-1;16864:12:0;16846:30;;16901:2;16891:6;:12;16887:105;;16948:6;16939;:15;16928:28;;16920:2;16923:1;16920:5;;;;;;;;;;;:36;-1:-1:-1;;;;;16920:36:0;;;;;;;;-1:-1:-1;16978:2:0;-1:-1:-1;16971:9:0;;16887:105;17002:15;17020:16;17029:6;17020:8;:16::i;:::-;17002:34;;17078:6;17066:2;:9;:18;17087:2;17066:23;17055:36;;17047:2;17050:1;17047:5;;;;;;;;;;;:44;-1:-1:-1;;;;;17047:44:0;;;;;;;;;17109:18;17120:2;17124;17109:10;:18::i;:::-;17102:25;16697:438;-1:-1:-1;;;;;16697:438:0:o;19844:522::-;19904:16;19941:12;19948:4;19941:6;:12::i;:::-;19933:21;;12:1:-1;9;2:12;19933:21:0;19967:10;19980:14;19989:4;19980:8;:14::i;:::-;19967:27;;20005:23;20045:5;20031:20;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20005:46;;20064:11;20092:27;20107:4;:11;;;20092:14;:27::i;:::-;20078:11;;;;:41;;-1:-1:-1;20130:12:0;;20153:180;20174:5;20170:1;:9;20153:180;;;20211:19;20223:6;20211:11;:19::i;:::-;20201:29;;20257:24;;;;;;;;20265:7;20257:24;;;;20274:6;20257:24;;;20245:6;20252:1;20245:9;;;;;;;;;;;;;;;;;:36;20305:16;;;;20181:3;;20153:180;;;-1:-1:-1;20352:6:0;;19844:522;-1:-1:-1;;;;;19844:522:0:o;20374:342::-;20455:8;;20434:4;;20451:31;;-1:-1:-1;20477:5:0;20470:12;;20451:31;20531:11;;;;20594:13;;20495:11;20586:22;;18330:4;20635:24;;20631:55;;;20681:5;20674:12;;;;;;24955:551;25093:13;;25014:4;;25085:22;;18236:4;25134:26;;25130:368;;;25182:1;25175:8;;;;;25130:368;18283:4;25203:25;;;:83;;-1:-1:-1;18330:4:0;25233:25;;;;;:52;;-1:-1:-1;18377:4:0;25262:23;;25233:52;25199:299;;;25308:1;25301:8;;;;;25199:299;18330:4;25329:24;;25325:173;;;-1:-1:-1;;25394:35:0;;-1:-1:-1;25387:42:0;;25325:173;-1:-1:-1;;25465:33:0;;-1:-1:-1;25458:40:0;;23426:1474;23584:13;;23482:4;;;;23576:22;;18236:4;23625:26;;23621:1245;;;23676:1;23666:11;;23621:1245;;;18283:4;23699:25;;23695:1171;;;-1:-1:-1;;23749:30:0;;;-1:-1:-1;23695:1171:0;;;18330:4;23801:24;;23797:1069;;;23842:12;23923:4;23916:5;23912:16;24003:1;23995:6;23991:14;23981:24;;24141:7;24137:2;24133:16;24128:3;24124:26;24115:6;24109:13;24105:46;24094:57;;24239:1;24230:7;24226:15;24217:7;24213:29;24202:40;;;24290:7;24279;:18;;24271:48;;;;;-1:-1:-1;;;24271:48:0;;;;;;;;;;;;-1:-1:-1;;;24271:48:0;;;;;;;;;;;;;;;23797:1069;;;;18377:4;24352:23;;24348:518;;;-1:-1:-1;;24402:28:0;;;-1:-1:-1;24348:518:0;;;24474:12;24555:4;24548:5;24544:16;24600:1;24592:6;24588:14;24578:24;;24669:7;24665:2;24661:16;24656:3;24652:26;24643:6;24637:13;24633:46;24622:57;;24774:1;24765:7;24761:15;24752:7;24748:29;24737:40;;;24825:7;24814;:18;;24806:48;;;;;-1:-1:-1;;;24806:48:0;;;;;;;;;;;;-1:-1:-1;;;24806:48:0;;;;;;;;;;;;;;;24348:518;;-1:-1:-1;24885:7:0;23426:1474;-1:-1:-1;;23426:1474:0:o;22994:424::-;23076:8;;23055:4;;23072:27;;-1:-1:-1;23098:1:0;23091:8;;23072:27;23112:10;23125:1;23112:14;;23137:12;23166:27;23181:4;:11;;;23166:14;:27::i;:::-;23152:11;;;;23232:8;;23152:41;;;;-1:-1:-1;23218:22:0;23251:135;23268:6;23258:7;:16;23251:135;;;23311:20;23323:7;23311:11;:20::i;:::-;23367:7;;;;;23301:30;;;;23251:135;;;-1:-1:-1;23405:5:0;;22994:424;-1:-1:-1;;;22994:424:0:o;30181:24140::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30181:24140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;30181:24140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;30181:24140:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;30181:24140:0;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://cf38311fc70c7842415f6e43694ca6a2795a904f0541302504db82e7675343ff
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.