Token Franklin

 

Overview [ERC-20]

Price
$0.00 @ 0.000003 Eth (+54.48%)
Fully Diluted Market Cap
Max Total Supply:
1,675,697,249 FLy

Holders:
6,211

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

The FLy token was designed to provide customers with an opportunity of getting discounts and additional benefits from VRM and the eco-system of VRM. The token should support a company's development via building a strong society of institutional and retail partners around the company.

Market

Volume (24H):$2,477,428.00
Market Capitalization:$2,213,713.00
Circulating Supply:519,477,846.00 FLy
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
Gate.io
FLY-USDT$0.0038
0.0000029 Eth
$14,610,831.00
5,177,281,918.022 FLY
855.4935%
2
KuCoin
FLY-USDT$0.0043
0.0000033 Eth
$2,439,387.00
561,311,141.906 FLY
92.7510%
3
MEXC Global
FLY-USDT$0.0038
0.0000029 Eth
$131,226.00
34,533,586.390 FLY
5.7063%
4
Uniswap (v2)
0X85F6EB2BD5A062F5F8560BE93FB7147E16C81472-0XDAC17F958D2EE523A2206206994597C13D831EC7$0.0041
0.0000031 Eth
$38,109.00
9,264,284.177 0X85F6EB2BD5A062F5F8560BE93FB7147E16C81472
1.5308%
5
ProBit Global
FLY-USDT$0.0042
0.0000032 Eth
$300.88
71,744.428 FLY
0.0119%
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
FLyToken

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
No with 200 runs

Other Settings:
istanbul EvmVersion, MIT license
File 1 of 10 : ERC1132.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;
/**
 * @title ERC1132 interface
 * @dev see https://github.com/ethereum/EIPs/issues/1132
 */

abstract contract ERC1132 {
    /**
     * @dev Reasons why a user's tokens have been locked
     */
    mapping(address => bytes32[]) public lockReason;

    /**
     * @dev locked token structure
     */
    struct lockToken {
        uint256 amount;
        uint256 validity;
        bool claimed;
    }

    /**
     * @dev Holds number & validity of tokens locked for a given reason for
     *      a specified address
     */
    mapping(address => mapping(bytes32 => lockToken)) public locked;

    /**
     * @dev Records data of all the tokens Locked
     */
    event Locked(
        address indexed _of,
        bytes32 indexed _reason,
        uint256 _amount,
        uint256 _validity
    );

    /**
     * @dev Records data of all the tokens unlocked
     */
    event Unlocked(
        address indexed _of,
        bytes32 indexed _reason,
        uint256 _amount
    );
    
    /**
     * @dev Locks a specified amount of tokens against an address,
     *      for a specified reason and time
     * @param _reason The reason to lock tokens
     * @param _amount Number of tokens to be locked
     * @param _time Lock time in seconds
     */
    function lock(bytes32 _reason, uint256 _amount, uint256 _time) virtual
        public returns (bool);
  
    /**
     * @dev Returns tokens locked for a specified address for a
     *      specified reason
     *
     * @param _of The address whose tokens are locked
     * @param _reason The reason to query the lock tokens for
     */
    function tokensLocked(address _of, bytes32 _reason) virtual
        public view returns (uint256 amount);
    
    /**
     * @dev Returns tokens locked for a specified address for a
     *      specified reason at a specific time
     *
     * @param _of The address whose tokens are locked
     * @param _reason The reason to query the lock tokens for
     * @param _time The timestamp to query the lock tokens for
     */
    function tokensLockedAtTime(address _of, bytes32 _reason, uint256 _time) virtual
        public view returns (uint256 amount);
    
    /**
     * @dev Returns total tokens held by an address (locked + transferable)
     * @param _of The address to query the total balance of
     */
    function totalBalanceOf(address _of) virtual
        public view returns (uint256 amount);
    
    /**
     * @dev Extends lock for a specified reason and time
     * @param _reason The reason to lock tokens
     * @param _time Lock extension time in seconds
     */
    function extendLock(bytes32 _reason, uint256 _time) virtual
        public returns (bool);
    
    /**
     * @dev Increase number of tokens locked for a specified reason
     * @param _reason The reason to lock tokens
     * @param _amount Number of tokens to be increased
     */
    function increaseLockAmount(bytes32 _reason, uint256 _amount) virtual
        public returns (bool);

    /**
     * @dev Returns unlockable tokens for a specified address for a specified reason
     * @param _of The address to query the the unlockable token count of
     * @param _reason The reason to query the unlockable tokens for
     */
    function tokensUnlockable(address _of, bytes32 _reason) virtual
        public view returns (uint256 amount);
 
    /**
     * @dev Unlocks the unlockable tokens of a specified address
     * @param _of Address of user, claiming back unlockable tokens
     */
    function unlock(address _of) virtual
        public returns (uint256 unlockableTokens);

    /**
     * @dev Gets the unlockable tokens of a specified address
     * @param _of The address to query the the unlockable token count of
     */
    function getUnlockableTokens(address _of) virtual
        public view returns (uint256 unlockableTokens);

}

File 2 of 10 : FLyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;
import "../contracts/LockableToken.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract FLyToken is LockableToken, Ownable {

    /**
     * @dev Indicates that the contract has been initialized with locked tokens for round 1.
     */
    bool private _initializedRound1;

    /**
     * @dev Indicates that the contract is in the process of being initialized for round 1.
     */
    bool private _initializingRound1;

    /**
     * @dev Indicates that the contract has been initialized with locked tokens for round 2.
     */
    bool private _initializedRound2;

    /**
     * @dev Indicates that the contract is in the process of being initialized for round 2.
     */
    bool private _initializingRound2;

    constructor() public LockableToken(17011706000000, "Franklin", "FLy", 4) {
    }

    function initializeRound1() public initializerR1 onlyOwner  {
        _initRound1();
    }

    function initializeRound2() public initializerR2 onlyOwner  {
        _initRound2();
    }

    function _initRound1() internal   {
        uint256 vestingRound1Seconds = 1617235200 - now;
        uint256 vrAmount = 63964014560;
        uint256 days30 = 2592000;
        //round 1
        _lock('v1_1', vrAmount, vestingRound1Seconds);
        _lock('v1_2', vrAmount, vestingRound1Seconds.add(days30));
        _lock('v1_3', vrAmount, vestingRound1Seconds.add(days30.mul(2)));
        _lock('v1_4', vrAmount, vestingRound1Seconds.add(days30.mul(3)));
        _lock('v1_5', vrAmount, vestingRound1Seconds.add(days30.mul(4)));
        _lock('v1_6', vrAmount, vestingRound1Seconds.add(days30.mul(5)));
        _lock('v1_7', vrAmount, vestingRound1Seconds.add(days30.mul(6)));
        _lock('v1_8', vrAmount, vestingRound1Seconds.add(days30.mul(7)));
        _lock('v1_9', vrAmount, vestingRound1Seconds.add(days30.mul(8)));
        _lock('v1_10', vrAmount, vestingRound1Seconds.add(days30.mul(9)));
        _lock('v1_11', vrAmount, vestingRound1Seconds.add(days30.mul(10)));
        _lock('v1_12', vrAmount, vestingRound1Seconds.add(days30.mul(11)));
        _lock('v1_13', vrAmount, vestingRound1Seconds.add(days30.mul(12)));
        _lock('v1_14', vrAmount, vestingRound1Seconds.add(days30.mul(13)));
        _lock('v1_15', vrAmount, vestingRound1Seconds.add(days30.mul(14)));
        _lock('v1_16', vrAmount, vestingRound1Seconds.add(days30.mul(15)));
        _lock('v1_17', vrAmount, vestingRound1Seconds.add(days30.mul(16)));
        _lock('v1_18', vrAmount, vestingRound1Seconds.add(days30.mul(17)));
        _lock('v1_19', vrAmount, vestingRound1Seconds.add(days30.mul(18)));
        _lock('v1_20', vrAmount, vestingRound1Seconds.add(days30.mul(19)));
        _lock('v1_21', vrAmount, vestingRound1Seconds.add(days30.mul(20)));
        _lock('v1_22', vrAmount, vestingRound1Seconds.add(days30.mul(21)));
        _lock('v1_23', vrAmount, vestingRound1Seconds.add(days30.mul(22)));
        _lock('v1_24', vrAmount, vestingRound1Seconds.add(days30.mul(23)));
        _lock('v1_25', vrAmount, vestingRound1Seconds.add(days30.mul(24)));
        _lock('v1_26', vrAmount, vestingRound1Seconds.add(days30.mul(25)));
        _lock('v1_27', vrAmount, vestingRound1Seconds.add(days30.mul(26)));
        _lock('v1_28', vrAmount, vestingRound1Seconds.add(days30.mul(27)));
        _lock('v1_29', vrAmount, vestingRound1Seconds.add(days30.mul(28)));
        _lock('v1_30', vrAmount, vestingRound1Seconds.add(days30.mul(29)));
        _lock('v1_31', vrAmount, vestingRound1Seconds.add(days30.mul(30)));
        _lock('v1_32', vrAmount, vestingRound1Seconds.add(days30.mul(31)));
        _lock('v1_33', vrAmount, vestingRound1Seconds.add(days30.mul(32)));
        _lock('v1_34', vrAmount, vestingRound1Seconds.add(days30.mul(33)));
        _lock('v1_35', vrAmount, vestingRound1Seconds.add(days30.mul(34)));
        _lock('v1_36', vrAmount, vestingRound1Seconds.add(days30.mul(35)));
        _lock('v1_37', vrAmount, vestingRound1Seconds.add(days30.mul(36)));
        _lock('v1_38', vrAmount, vestingRound1Seconds.add(days30.mul(37)));
        _lock('v1_39', vrAmount, vestingRound1Seconds.add(days30.mul(38)));
        _lock('v1_40', vrAmount, vestingRound1Seconds.add(days30.mul(39)));
        _lock('v1_41', vrAmount, vestingRound1Seconds.add(days30.mul(40)));
        _lock('v1_42', vrAmount, vestingRound1Seconds.add(days30.mul(41)));
        _lock('v1_43', vrAmount, vestingRound1Seconds.add(days30.mul(42)));
        _lock('v1_44', vrAmount, vestingRound1Seconds.add(days30.mul(43)));
        _lock('v1_45', vrAmount, vestingRound1Seconds.add(days30.mul(44)));
        _lock('v1_46', vrAmount, vestingRound1Seconds.add(days30.mul(45)));
        _lock('v1_47', vrAmount, vestingRound1Seconds.add(days30.mul(46)));
        _lock('v1_48', vrAmount, vestingRound1Seconds.add(days30.mul(47)));
        _lock('v1_49', vrAmount, vestingRound1Seconds.add(days30.mul(48)));
        _lock('v1_50', vrAmount, vestingRound1Seconds.add(days30.mul(49)));
        //round 1: transfer locked total 
        transfer(address(this), 3198200728000);
    }

    function _initRound2() internal   {
        uint256 vestingRound2Seconds = 1625097600 - now;
        uint256 days30 = 2592000;
        // round 2 - starting from 01.07.2021 - autogenerated from excel output
        _lock('v2_1', 29770485500, vestingRound2Seconds);
        _lock('v2_2', 30365895210, vestingRound2Seconds.add(days30));
        _lock('v2_3', 30978316626, vestingRound2Seconds.add(days30.mul(2)));
        _lock('v2_4', 31590738042, vestingRound2Seconds.add(days30.mul(3)));
        _lock('v2_5', 32220171164, vestingRound2Seconds.add(days30.mul(4)));
        _lock('v2_6', 32866615992, vestingRound2Seconds.add(days30.mul(5)));
        _lock('v2_7', 33530072526, vestingRound2Seconds.add(days30.mul(6)));
        _lock('v2_8', 34193529060, vestingRound2Seconds.add(days30.mul(7)));
        _lock('v2_9', 34873997300, vestingRound2Seconds.add(days30.mul(8)));
        _lock('v2_10', 35571477246, vestingRound2Seconds.add(days30.mul(9)));
        _lock('v2_11', 36285968898, vestingRound2Seconds.add(days30.mul(10)));
        _lock('v2_12', 37017472256, vestingRound2Seconds.add(days30.mul(11)));
        _lock('v2_13', 37748975614, vestingRound2Seconds.add(days30.mul(12)));
        _lock('v2_14', 38514502384, vestingRound2Seconds.add(days30.mul(13)));
        _lock('v2_15', 39280029154, vestingRound2Seconds.add(days30.mul(14)));
        _lock('v2_16', 40062567630, vestingRound2Seconds.add(days30.mul(15)));
        _lock('v2_17', 40862117812, vestingRound2Seconds.add(days30.mul(16)));
        _lock('v2_18', 41678679700, vestingRound2Seconds.add(days30.mul(17)));
        _lock('v2_19', 42512253294, vestingRound2Seconds.add(days30.mul(18)));
        _lock('v2_20', 43362838594, vestingRound2Seconds.add(days30.mul(19)));
        _lock('v2_21', 44230435600, vestingRound2Seconds.add(days30.mul(20)));
        _lock('v2_22', 45115044312, vestingRound2Seconds.add(days30.mul(21)));
        _lock('v2_23', 46016664730, vestingRound2Seconds.add(days30.mul(22)));
        _lock('v2_24', 46952308560, vestingRound2Seconds.add(days30.mul(23)));
        _lock('v2_25', 47887952390, vestingRound2Seconds.add(days30.mul(24)));
        _lock('v2_26', 48840607926, vestingRound2Seconds.add(days30.mul(25)));
        _lock('v2_27', 49810275168, vestingRound2Seconds.add(days30.mul(26)));
        _lock('v2_28', 50813965822, vestingRound2Seconds.add(days30.mul(27)));
        _lock('v2_29', 51834668182, vestingRound2Seconds.add(days30.mul(28)));
        _lock('v2_30', 52872382248, vestingRound2Seconds.add(days30.mul(29)));
        _lock('v2_31', 53927108020, vestingRound2Seconds.add(days30.mul(30)));
        _lock('v2_32', 54998845498, vestingRound2Seconds.add(days30.mul(31)));
        _lock('v2_33', 56104606388, vestingRound2Seconds.add(days30.mul(32)));
        _lock('v2_34', 57227378984, vestingRound2Seconds.add(days30.mul(33)));
        _lock('v2_35', 58367163286, vestingRound2Seconds.add(days30.mul(34)));
        _lock('v2_36', 59540971000, vestingRound2Seconds.add(days30.mul(35)));
        _lock('v2_37', 60731790420, vestingRound2Seconds.add(days30.mul(36)));
        _lock('v2_38', 61939621546, vestingRound2Seconds.add(days30.mul(37)));
        _lock('v2_39', 63181476084, vestingRound2Seconds.add(days30.mul(38)));
        _lock('v2_40', 64440342328, vestingRound2Seconds.add(days30.mul(39)));
        _lock('v2_41', 65733231984, vestingRound2Seconds.add(days30.mul(40)));
        _lock('v2_42', 67043133346, vestingRound2Seconds.add(days30.mul(41)));
        _lock('v2_43', 68387058120, vestingRound2Seconds.add(days30.mul(42)));
        _lock('v2_44', 69765006306, vestingRound2Seconds.add(days30.mul(43)));
        _lock('v2_45', 71159966198, vestingRound2Seconds.add(days30.mul(44)));
        _lock('v2_46', 72571937796, vestingRound2Seconds.add(days30.mul(45)));
        _lock('v2_47', 74034944512, vestingRound2Seconds.add(days30.mul(46)));
        _lock('v2_48', 94823249244, vestingRound2Seconds.add(days30.mul(47)));
        //round 2: transfer locked total 
        transfer(address(this), 2381638840000);
    }

    function _lock(
        bytes32 _reason,
        uint256 _amount,
        uint256 _time
    ) internal returns (bool) {
        uint256 validUntil = now.add(_time); //solhint-disable-line
        if (locked[_msgSender()][_reason].amount == 0)
            lockReason[_msgSender()].push(_reason);
        locked[_msgSender()][_reason] = lockToken(_amount, validUntil, false);
        return true;
    }


    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);
        unlock(from);
    }

    /**
    * @dev Modifier to protect an initializer function from being invoked twice.
    */
    modifier initializerR1() {
        require(_initializingRound1 || !_initializedRound1, "InitializerR1: contract is already initialized");

        bool isTopLevelCall = !_initializingRound1;
        if (isTopLevelCall) {
            _initializingRound1 = true;
            _initializedRound1 = true;
        }

        _;

        if (isTopLevelCall) {
            _initializingRound1 = false;
        }
    }

    /**
    * @dev Modifier to protect an initializer function from being invoked twice.
    */
    modifier initializerR2() {
        require(_initializingRound2 || !_initializedRound2, "InitializerR2: contract is already initialized");

        bool isTopLevelCall = !_initializingRound2;
        if (isTopLevelCall) {
            _initializingRound2 = true;
            _initializedRound2 = true;
        }

        _;

        if (isTopLevelCall) {
            _initializingRound2 = false;
        }
    }
}

File 3 of 10 : LockableToken.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;
import "../contracts/ERC1132.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Burnable.sol";

contract LockableToken is ERC1132, ERC20Burnable {
    /**
     * @dev Error messages for require statements
     */
    string internal constant ALREADY_LOCKED = "Tokens already locked";
    string internal constant NOT_LOCKED = "No tokens locked";
    string internal constant AMOUNT_ZERO = "Amount can not be 0";

    /**
     * @dev constructor to mint initial tokens
     * Shall update to _mint once openzepplin updates their npm package.
     */
    constructor(
        uint256 _supply,
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) public ERC20(_name, _symbol) {
        _setupDecimals(_decimals);
        _mint(_msgSender(), _supply);
    }

    /**
     * @dev Locks a specified amount of tokens against an address,
     *      for a specified reason and time
     * @param _reason The reason to lock tokens
     * @param _amount Number of tokens to be locked
     * @param _time Lock time in seconds
     */
    function lock(
        bytes32 _reason,
        uint256 _amount,
        uint256 _time
    ) public override returns (bool) {
        uint256 validUntil = now.add(_time); //solhint-disable-line

        // If tokens are already locked, then functions extendLock or
        // increaseLockAmount should be used to make any changes
        require(tokensLocked(_msgSender(), _reason) == 0, ALREADY_LOCKED);
        require(_amount != 0, AMOUNT_ZERO);

        if (locked[_msgSender()][_reason].amount == 0)
            lockReason[_msgSender()].push(_reason);

        transfer(address(this), _amount);

        locked[_msgSender()][_reason] = lockToken(_amount, validUntil, false);

        emit Locked(_msgSender(), _reason, _amount, validUntil);
        return true;
    }

    /**
     * @dev Transfers and Locks a specified amount of tokens,
     *      for a specified reason and time
     * @param _to adress to which tokens are to be transfered
     * @param _reason The reason to lock tokens
     * @param _amount Number of tokens to be transfered and locked
     * @param _time Lock time in seconds
     */
    function transferWithLock(
        address _to,
        bytes32 _reason,
        uint256 _amount,
        uint256 _time
    ) public returns (bool) {
        uint256 validUntil = now.add(_time); //solhint-disable-line

        require(tokensLocked(_to, _reason) == 0, ALREADY_LOCKED);
        require(_amount != 0, AMOUNT_ZERO);

        if (locked[_to][_reason].amount == 0) lockReason[_to].push(_reason);

        transfer(address(this), _amount);

        locked[_to][_reason] = lockToken(_amount, validUntil, false);

        emit Locked(_to, _reason, _amount, validUntil);
        return true;
    }

    /**
     * @dev Returns tokens locked for a specified address for a
     *      specified reason
     *
     * @param _of The address whose tokens are locked
     * @param _reason The reason to query the lock tokens for
     */
    function tokensLocked(address _of, bytes32 _reason)
        public
        view
        override
        returns (uint256 amount)
    {
        if (!locked[_of][_reason].claimed) amount = locked[_of][_reason].amount;
    }

    /**
     * @dev Returns tokens locked for a specified address for a
     *      specified reason at a specific time
     *
     * @param _of The address whose tokens are locked
     * @param _reason The reason to query the lock tokens for
     * @param _time The timestamp to query the lock tokens for
     */
    function tokensLockedAtTime(
        address _of,
        bytes32 _reason,
        uint256 _time
    ) public view override returns (uint256 amount) {
        if (locked[_of][_reason].validity > _time)
            amount = locked[_of][_reason].amount;
    }

    /**
     * @dev Returns total tokens held by an address (locked + transferable)
     * @param _of The address to query the total balance of
     */
    function totalBalanceOf(address _of)
        public
        view
        override
        returns (uint256 amount)
    {
        amount = balanceOf(_of);

        for (uint256 i = 0; i < lockReason[_of].length; i++) {
            amount = amount.add(tokensLocked(_of, lockReason[_of][i]));
        }
    }

    /**
     * @dev Extends lock for a specified reason and time
     * @param _reason The reason to lock tokens
     * @param _time Lock extension time in seconds
     */
    function extendLock(bytes32 _reason, uint256 _time)
        public
        override
        returns (bool)
    {
        require(tokensLocked(_msgSender(), _reason) > 0, NOT_LOCKED);

        locked[_msgSender()][_reason].validity = locked[_msgSender()][_reason]
            .validity
            .add(_time);

        emit Locked(
            _msgSender(),
            _reason,
            locked[_msgSender()][_reason].amount,
            locked[_msgSender()][_reason].validity
        );
        return true;
    }

    /**
     * @dev Increase number of tokens locked for a specified reason
     * @param _reason The reason to lock tokens
     * @param _amount Number of tokens to be increased
     */
    function increaseLockAmount(bytes32 _reason, uint256 _amount)
        public
        override
        returns (bool)
    {
        require(tokensLocked(_msgSender(), _reason) > 0, NOT_LOCKED);
        transfer(address(this), _amount);

        locked[_msgSender()][_reason].amount = locked[_msgSender()][_reason]
            .amount
            .add(_amount);

        emit Locked(
            _msgSender(),
            _reason,
            locked[_msgSender()][_reason].amount,
            locked[_msgSender()][_reason].validity
        );
        return true;
    }

    /**
     * @dev Returns unlockable tokens for a specified address for a specified reason
     * @param _of The address to query the the unlockable token count of
     * @param _reason The reason to query the unlockable tokens for
     */
    function tokensUnlockable(address _of, bytes32 _reason)
        public
        view
        override
        returns (uint256 amount)
    {
        if (
            locked[_of][_reason].validity <= now &&
            !locked[_of][_reason].claimed
        )
            //solhint-disable-line
            amount = locked[_of][_reason].amount;
    }

    /**
     * @dev Unlocks the unlockable tokens of a specified address
     * @param _of Address of user, claiming back unlockable tokens
     */
    function unlock(address _of)
        public
        override
        returns (uint256 unlockableTokens)
    {
        uint256 lockedTokens;

        for (uint256 i = 0; i < lockReason[_of].length; i++) {
            lockedTokens = tokensUnlockable(_of, lockReason[_of][i]);
            if (lockedTokens > 0) {
                unlockableTokens = unlockableTokens.add(lockedTokens);
                locked[_of][lockReason[_of][i]].claimed = true;
                emit Unlocked(_of, lockReason[_of][i], lockedTokens);
            }
        }

        if (unlockableTokens > 0) this.transfer(_of, unlockableTokens);
    }

    /**
     * @dev Gets the unlockable tokens of a specified address
     * @param _of The address to query the the unlockable token count of
     */
    function getUnlockableTokens(address _of)
        public
        view
        override
        returns (uint256 unlockableTokens)
    {
        for (uint256 i = 0; i < lockReason[_of].length; i++) {
            unlockableTokens = unlockableTokens.add(
                tokensUnlockable(_of, lockReason[_of][i])
            );
        }
    }
}

File 4 of 10 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 5 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "../GSN/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 6 of 10 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @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) {
        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 7 of 10 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "../../GSN/Context.sol";
import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

File 8 of 10 : ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "../../GSN/Context.sol";
import "./ERC20.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

File 9 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @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 10 of 10 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {
    "": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_of","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_reason","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_validity","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_of","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_reason","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_reason","type":"bytes32"},{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"extendLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"}],"name":"getUnlockableTokens","outputs":[{"internalType":"uint256","name":"unlockableTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_reason","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseLockAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeRound1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeRound2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_reason","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"lock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockReason","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"locked","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validity","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"},{"internalType":"bytes32","name":"_reason","type":"bytes32"}],"name":"tokensLocked","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"},{"internalType":"bytes32","name":"_reason","type":"bytes32"},{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"tokensLockedAtTime","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"},{"internalType":"bytes32","name":"_reason","type":"bytes32"}],"name":"tokensUnlockable","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_reason","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"transferWithLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"}],"name":"unlock","outputs":[{"internalType":"uint256","name":"unlockableTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50650f78d8b172806040518060400160405280600881526020017f4672616e6b6c696e0000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f464c790000000000000000000000000000000000000000000000000000000000815250600482828160059080519060200190620000a1929190620008da565b508060069080519060200190620000ba929190620008da565b506012600760006101000a81548160ff021916908360ff1602179055505050620000ea81620001c660201b60201c565b6200010b620000fe620001e460201b60201c565b85620001ec60201b60201c565b50505050600062000121620001e460201b60201c565b905080600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000989565b80600760006101000a81548160ff021916908360ff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620002a460008383620003cc60201b60201c565b620002c081600454620003fb60201b620043131790919060201c565b6004819055506200031f81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620003fb60201b620043131790919060201c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b620003e48383836200048460201b620057b81760201c565b620003f5836200048960201b60201c565b50505050565b6000808284019050838110156200047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b505050565b60008060008090505b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015620006db5762000542846000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106200052b57fe5b9060005260206000200154620007b360201b60201c565b91506000821115620006cd57620005688284620003fb60201b620043131790919060201c565b925060018060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110620005f657fe5b9060005260206000200154815260200190815260200160002060020160006101000a81548160ff0219169083151502179055506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106200067357fe5b90600052602060002001548473ffffffffffffffffffffffffffffffffffffffff167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a4846040518082815260200191505060405180910390a35b808060010191505062000492565b506000821115620007ad573073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156200076e57600080fd5b505af115801562000783573d6000803e3d6000fd5b505050506040513d60208110156200079a57600080fd5b8101908080519060200190929190505050505b50919050565b600042600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206001015411158015620008775750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020160009054906101000a900460ff16155b15620008d457600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000015490505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200091d57805160ff19168380011785556200094e565b828001600101855582156200094e579182015b828111156200094d57825182559160200191906001019062000930565b5b5090506200095d919062000961565b5090565b6200098691905b808211156200098257600081600090555060010162000968565b5090565b90565b6159fe80620009996000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80635ca48d8c1161010457806395d89b41116100a2578063ab4a2eb311610071578063ab4a2eb314610a37578063d71be8db14610a8f578063dd62ed3e14610b03578063f2fde38b14610b7b576101da565b806395d89b4114610898578063a457c2d71461091b578063a9059cbb14610981578063a9dab167146109e7576101da565b806371d66f00116100de57806371d66f001461074e57806379cc6790146107b057806381fc4d90146107fe5780638da5cb5b1461084e576101da565b80635ca48d8c1461068a57806370a08231146106ec578063715018a614610744576101da565b80632f6c493c1161017c5780634b0ee02a1161014b5780634b0ee02a1461054c5780634cb5465f146105a457806351a788ff1461061e5780635294d0e814610628576101da565b80632f6c493c1461043c578063313ce5671461049457806339509351146104b857806342966c681461051e576101da565b8063179e91f1116101b8578063179e91f1146102d257806318160ddd1461033e57806323b872dd1461035c5780632e82aaf2146103e2576101da565b80630424d150146101df57806306fdde03146101e9578063095ea7b31461026c575b600080fd5b6101e7610bbf565b005b6101f1610d85565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610231578082015181840152602081019050610216565b50505050905090810190601f16801561025e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102b86004803603604081101561028257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e27565b604051808215151515815260200191505060405180910390f35b610328600480360360608110156102e857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610e45565b6040518082815260200191505060405180910390f35b610346610f00565b6040518082815260200191505060405180910390f35b6103c86004803603606081101561037257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f0a565b604051808215151515815260200191505060405180910390f35b610422600480360360608110156103f857600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610fe3565b604051808215151515815260200191505060405180910390f35b61047e6004803603602081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113bf565b6040518082815260200191505060405180910390f35b61049c6116d0565b604051808260ff1660ff16815260200191505060405180910390f35b610504600480360360408110156104ce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116e7565b604051808215151515815260200191505060405180910390f35b61054a6004803603602081101561053457600080fd5b810190808035906020019092919050505061179a565b005b61058e6004803603602081101561056257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ae565b6040518082815260200191505060405180910390f35b610604600480360360808110156105ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061188e565b604051808215151515815260200191505060405180910390f35b610626611c48565b005b6106746004803603604081101561063e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e0e565b6040518082815260200191505060405180910390f35b6106d6600480360360408110156106a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f33565b6040518082815260200191505060405180910390f35b61072e6004803603602081101561070257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff7565b6040518082815260200191505060405180910390f35b61074c612040565b005b61079a6004803603604081101561076457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506121cb565b6040518082815260200191505060405180910390f35b6107fc600480360360408110156107c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506121f9565b005b6108346004803603604081101561081457600080fd5b81019080803590602001909291908035906020019092919050505061225b565b604051808215151515815260200191505060405180910390f35b61085661253f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108a0612569565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e05780820151818401526020810190506108c5565b50505050905090810190601f16801561090d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109676004803603604081101561093157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061260b565b604051808215151515815260200191505060405180910390f35b6109cd6004803603604081101561099757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506126d8565b604051808215151515815260200191505060405180910390f35b610a1d600480360360408110156109fd57600080fd5b8101908080359060200190929190803590602001909291905050506126f6565b604051808215151515815260200191505060405180910390f35b610a7960048036036020811015610a4d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129cf565b6040518082815260200191505060405180910390f35b610adb60048036036040811015610aa557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612aa4565b6040518084815260200183815260200182151515158152602001935050505060405180910390f35b610b6560048036036040811015610b1957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ae8565b6040518082815260200191505060405180910390f35b610bbd60048036036020811015610b9157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b6f565b005b600760189054906101000a900460ff1680610be75750600760179054906101000a900460ff16155b610c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615976602e913960400191505060405180910390fd5b6000600760189054906101000a900460ff161590508015610c8e576001600760186101000a81548160ff0219169083151502179055506001600760176101000a81548160ff0219169083151502179055505b610c96612d7f565b73ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610d60612d87565b8015610d82576000600760186101000a81548160ff0219169083151502179055505b50565b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e1d5780601f10610df257610100808354040283529160200191610e1d565b820191906000526020600020905b815481529060010190602001808311610e0057829003601f168201915b5050505050905090565b6000610e3b610e34612d7f565b8484613d97565b6001905092915050565b600081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600101541115610ef957600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206000015490505b9392505050565b6000600454905090565b6000610f17848484613f8e565b610fd884610f23612d7f565b610fd3856040518060600160405280602881526020016158c060289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f89612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546142539092919063ffffffff16565b613d97565b600190509392505050565b600080610ff9834261431390919063ffffffff16565b9050600061100e611008612d7f565b87611f33565b146040518060400160405280601581526020017f546f6b656e7320616c7265616479206c6f636b65640000000000000000000000815250906110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156110b0578082015181840152602081019050611095565b50505050905090810190601f1680156110dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008414156040518060400160405280601381526020017f416d6f756e742063616e206e6f74206265203000000000000000000000000000815250906111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611192578082015181840152602081019050611177565b50505050905090810190601f1680156111bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000600160006111dc612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060000154141561129e5760008061123c612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208590806001815401808255809150506001900390600052602060002001600090919091909150555b6112a830856126d8565b50604051806060016040528085815260200182815260200160001515815250600160006112d3612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055509050508461135e612d7f565b73ffffffffffffffffffffffffffffffffffffffff167fea90ef40963535482537f0689e05cb8d259e459ebd21530e826702294d0eafdd8684604051808381526020018281526020019250505060405180910390a360019150509392505050565b60008060008090505b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156115fc5761146e846000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061145e57fe5b9060005260206000200154611e0e565b915060008211156115ef5761148c828461431390919063ffffffff16565b925060018060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061151957fe5b9060005260206000200154815260200190815260200160002060020160006101000a81548160ff0219169083151502179055506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061159557fe5b90600052602060002001548473ffffffffffffffffffffffffffffffffffffffff167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a4846040518082815260200191505060405180910390a35b80806001019150506113c8565b5060008211156116ca573073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561168d57600080fd5b505af11580156116a1573d6000803e3d6000fd5b505050506040513d60208110156116b757600080fd5b8101908080519060200190929190505050505b50919050565b6000600760009054906101000a900460ff16905090565b60006117906116f4612d7f565b8461178b8560036000611705612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461431390919063ffffffff16565b613d97565b6001905092915050565b6117ab6117a5612d7f565b8261439b565b50565b60006117b982611ff7565b905060008090505b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156118885761187961186a846000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061185a57fe5b9060005260206000200154611f33565b8361431390919063ffffffff16565b915080806001019150506117c1565b50919050565b6000806118a4834261431390919063ffffffff16565b905060006118b28787611f33565b146040518060400160405280601581526020017f546f6b656e7320616c7265616479206c6f636b656400000000000000000000008152509061198f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611954578082015181840152602081019050611939565b50505050905090810190601f1680156119815780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008414156040518060400160405280601381526020017f416d6f756e742063616e206e6f7420626520300000000000000000000000000081525090611a71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a36578082015181840152602081019050611a1b565b50505050905090810190601f168015611a635780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600001541415611b34576000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208590806001815401808255809150506001900390600052602060002001600090919091909150555b611b3e30856126d8565b50604051806060016040528085815260200182815260200160001515815250600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050848673ffffffffffffffffffffffffffffffffffffffff167fea90ef40963535482537f0689e05cb8d259e459ebd21530e826702294d0eafdd8684604051808381526020018281526020019250505060405180910390a36001915050949350505050565b600760169054906101000a900460ff1680611c705750600760159054906101000a900460ff16155b611cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615803602e913960400191505060405180910390fd5b6000600760169054906101000a900460ff161590508015611d17576001600760166101000a81548160ff0219169083151502179055506001600760156101000a81548160ff0219169083151502179055505b611d1f612d7f565b73ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611de1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611de9614561565b8015611e0b576000600760166101000a81548160ff0219169083151502179055505b50565b600042600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206001015411158015611ed15750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020160009054906101000a900460ff16155b15611f2d57600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000015490505b92915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020160009054906101000a900460ff16611ff157600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000015490505b92915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612048612d7f565b73ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461210a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600060205281600052604060002081815481106121e457fe5b90600052602060002001600091509150505481565b6000612238826040518060600160405280602481526020016158e86024913961222986612224612d7f565b612ae8565b6142539092919063ffffffff16565b905061224c83612246612d7f565b83613d97565b612256838361439b565b505050565b60008061226f612269612d7f565b85611f33565b116040518060400160405280601081526020017f4e6f20746f6b656e73206c6f636b6564000000000000000000000000000000008152509061234c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156123115780820151818401526020810190506122f6565b50505050905090810190601f16801561233e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061235730836126d8565b506123c58260016000612368612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206000015461431390919063ffffffff16565b600160006123d1612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600001819055508261242c612d7f565b73ffffffffffffffffffffffffffffffffffffffff167fea90ef40963535482537f0689e05cb8d259e459ebd21530e826702294d0eafdd6001600061246f612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060000154600160006124ca612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060010154604051808381526020018281526020019250505060405180910390a36001905092915050565b6000600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126015780601f106125d657610100808354040283529160200191612601565b820191906000526020600020905b8154815290600101906020018083116125e457829003601f168201915b5050505050905090565b60006126ce612618612d7f565b846126c9856040518060600160405280602581526020016159a46025913960036000612642612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546142539092919063ffffffff16565b613d97565b6001905092915050565b60006126ec6126e5612d7f565b8484613f8e565b6001905092915050565b60008061270a612704612d7f565b85611f33565b116040518060400160405280601081526020017f4e6f20746f6b656e73206c6f636b656400000000000000000000000000000000815250906127e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061285582600160006127f8612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206001015461431390919063ffffffff16565b60016000612861612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060010181905550826128bc612d7f565b73ffffffffffffffffffffffffffffffffffffffff167fea90ef40963535482537f0689e05cb8d259e459ebd21530e826702294d0eafdd600160006128ff612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600001546001600061295a612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060010154604051808381526020018281526020019250505060405180910390a36001905092915050565b600080600090505b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015612a9e57612a8f612a80846000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110612a7057fe5b9060005260206000200154611e0e565b8361431390919063ffffffff16565b915080806001019150506129d7565b50919050565b6001602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020160009054906101000a900460ff16905083565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612b77612d7f565b73ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c39576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612cbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158316026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000426360dd0580039050600062278d009050612dca7f76325f31000000000000000000000000000000000000000000000000000000006406ee758efc8461552e565b50612e0d7f76325f3200000000000000000000000000000000000000000000000000000000640711f2ca2a612e08848661431390919063ffffffff16565b61552e565b50612e637f76325f3300000000000000000000000000000000000000000000000000000000640736739952612e5e612e4f6002866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50612eb97f76325f340000000000000000000000000000000000000000000000000000000064075af4687a612eb4612ea56003866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50612f0f7f76325f350000000000000000000000000000000000000000000000000000000064078078cb9c612f0a612efb6004866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50612f657f76325f36000000000000000000000000000000000000000000000000000000006407a700c2b8612f60612f516005866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50612fbb7f76325f37000000000000000000000000000000000000000000000000000000006407ce8c4dce612fb6612fa76006866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506130117f76325f38000000000000000000000000000000000000000000000000000000006407f617d8e461300c612ffd6007866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506130677f76325f390000000000000000000000000000000000000000000000000000000064081ea6f7f46130626130536008866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506130bd7f76325f313000000000000000000000000000000000000000000000000000000064084839aafe6130b86130a96009866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506131137f76325f3131000000000000000000000000000000000000000000000000000000640872cff20261310e6130ff600a866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506131697f76325f313200000000000000000000000000000000000000000000000000000064089e69cd00613164613155600b866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506131bf7f76325f31330000000000000000000000000000000000000000000000000000006408ca03a7fe6131ba6131ab600c866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506132157f76325f31340000000000000000000000000000000000000000000000000000006408f7a4aaf0613210613201600d866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b5061326b7f76325f313500000000000000000000000000000000000000000000000000000064092545ade2613266613257600e866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506132c17f76325f3136000000000000000000000000000000000000000000000000000000640953ea44ce6132bc6132ad600f866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506133177f76325f3137000000000000000000000000000000000000000000000000000000640983926fb46133126133036010866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b5061336d7f76325f31380000000000000000000000000000000000000000000000000000006409b43e2e946133686133596011866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506133c37f76325f31390000000000000000000000000000000000000000000000000000006409e5ed816e6133be6133af6012866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506134197f76325f3230000000000000000000000000000000000000000000000000000000640a18a068426134146134056013866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b5061346f7f76325f3231000000000000000000000000000000000000000000000000000000640a4c56e31061346a61345b6014866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506134c57f76325f3232000000000000000000000000000000000000000000000000000000640a8110f1d86134c06134b16015866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b5061351b7f76325f3233000000000000000000000000000000000000000000000000000000640ab6ce949a6135166135076016866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506135717f76325f3234000000000000000000000000000000000000000000000000000000640aee935f5061356c61355d6017866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506135c77f76325f3235000000000000000000000000000000000000000000000000000000640b26582a066135c26135b36018866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b5061361d7f76325f3236000000000000000000000000000000000000000000000000000000640b5f2088b66136186136096019866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506136737f76325f3237000000000000000000000000000000000000000000000000000000640b98ec7b6061366e61365f601a866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506136c97f76325f3238000000000000000000000000000000000000000000000000000000640bd4bf95fe6136c46136b5601b866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b5061371f7f76325f3239000000000000000000000000000000000000000000000000000000640c1196449661371a61370b601c866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506137757f76325f3330000000000000000000000000000000000000000000000000000000640c4f708728613770613761601d866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506137cb7f76325f3331000000000000000000000000000000000000000000000000000000640c8e4e5db46137c66137b7601e866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506138217f76325f3332000000000000000000000000000000000000000000000000000000640cce2fc83a61381c61380d601f866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506138777f76325f3333000000000000000000000000000000000000000000000000000000640d10185ab46138726138636020866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506138cd7f76325f3334000000000000000000000000000000000000000000000000000000640d530481286138c86138b96021866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506139237f76325f3335000000000000000000000000000000000000000000000000000000640d96f43b9661391e61390f6022866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506139797f76325f3336000000000000000000000000000000000000000000000000000000640ddceb1df86139746139656023866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b506139cf7f76325f3337000000000000000000000000000000000000000000000000000000640e23e594546139ca6139bb6024866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613a257f76325f3338000000000000000000000000000000000000000000000000000000640e6be39eaa613a20613a116025866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613a7b7f76325f3339000000000000000000000000000000000000000000000000000000640eb5e8d0f4613a76613a676026866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613ad17f76325f3430000000000000000000000000000000000000000000000000000000640f00f19738613acc613abd6027866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613b277f76325f3431000000000000000000000000000000000000000000000000000000640f4e018570613b22613b136028866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613b7d7f76325f3432000000000000000000000000000000000000000000000000000000640f9c1507a2613b78613b696029866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613bd37f76325f3433000000000000000000000000000000000000000000000000000000640fec2fb1c8613bce613bbf602a866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613c297f76325f343400000000000000000000000000000000000000000000000000000064103e5183e2613c24613c15602b866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613c7f7f76325f343500000000000000000000000000000000000000000000000000000064109176e9f6613c7a613c6b602c866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613cd57f76325f34360000000000000000000000000000000000000000000000000000006410e59fe404613cd0613cc1602d866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613d2b7f76325f343700000000000000000000000000000000000000000000000000000064113cd39a00613d26613d17602e866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613d817f76325f3438000000000000000000000000000000000000000000000000000000641613e7f55c613d7c613d6d602f866156ce90919063ffffffff16565b8661431390919063ffffffff16565b61552e565b50613d923065022a84bcaec06126d8565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613e1d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806159526024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ea3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158576022913960400191505060405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061592d6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561409a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806157be6023913960400191505060405180910390fd5b6140a5838383615754565b6141118160405180606001604052806026815260200161587960269139600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546142539092919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141a681600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461431390919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290614300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156142c55780820151818401526020810190506142aa565b50505050905090810190601f1680156142f25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015614391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061590c6021913960400191505060405180910390fd5b61442d82600083615754565b614499816040518060600160405280602281526020016157e160229139600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546142539092919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506144f18160045461576e90919063ffffffff16565b600481905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000426360650d000390506000640ee48d67e09050600062278d0090506145a97f76315f3100000000000000000000000000000000000000000000000000000000838561552e565b506145e77f76315f3200000000000000000000000000000000000000000000000000000000836145e2848761431390919063ffffffff16565b61552e565b506146387f76315f3300000000000000000000000000000000000000000000000000000000836146336146246002866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506146897f76315f3400000000000000000000000000000000000000000000000000000000836146846146756003866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506146da7f76315f3500000000000000000000000000000000000000000000000000000000836146d56146c66004866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b5061472b7f76315f3600000000000000000000000000000000000000000000000000000000836147266147176005866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b5061477c7f76315f3700000000000000000000000000000000000000000000000000000000836147776147686006866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506147cd7f76315f3800000000000000000000000000000000000000000000000000000000836147c86147b96007866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b5061481e7f76315f39000000000000000000000000000000000000000000000000000000008361481961480a6008866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b5061486f7f76315f31300000000000000000000000000000000000000000000000000000008361486a61485b6009866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506148c07f76315f3131000000000000000000000000000000000000000000000000000000836148bb6148ac600a866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506149117f76315f31320000000000000000000000000000000000000000000000000000008361490c6148fd600b866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506149627f76315f31330000000000000000000000000000000000000000000000000000008361495d61494e600c866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506149b37f76315f3134000000000000000000000000000000000000000000000000000000836149ae61499f600d866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614a047f76315f3135000000000000000000000000000000000000000000000000000000836149ff6149f0600e866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614a557f76315f313600000000000000000000000000000000000000000000000000000083614a50614a41600f866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614aa67f76315f313700000000000000000000000000000000000000000000000000000083614aa1614a926010866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614af77f76315f313800000000000000000000000000000000000000000000000000000083614af2614ae36011866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614b487f76315f313900000000000000000000000000000000000000000000000000000083614b43614b346012866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614b997f76315f323000000000000000000000000000000000000000000000000000000083614b94614b856013866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614bea7f76315f323100000000000000000000000000000000000000000000000000000083614be5614bd66014866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614c3b7f76315f323200000000000000000000000000000000000000000000000000000083614c36614c276015866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614c8c7f76315f323300000000000000000000000000000000000000000000000000000083614c87614c786016866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614cdd7f76315f323400000000000000000000000000000000000000000000000000000083614cd8614cc96017866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614d2e7f76315f323500000000000000000000000000000000000000000000000000000083614d29614d1a6018866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614d7f7f76315f323600000000000000000000000000000000000000000000000000000083614d7a614d6b6019866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614dd07f76315f323700000000000000000000000000000000000000000000000000000083614dcb614dbc601a866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614e217f76315f323800000000000000000000000000000000000000000000000000000083614e1c614e0d601b866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614e727f76315f323900000000000000000000000000000000000000000000000000000083614e6d614e5e601c866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614ec37f76315f333000000000000000000000000000000000000000000000000000000083614ebe614eaf601d866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614f147f76315f333100000000000000000000000000000000000000000000000000000083614f0f614f00601e866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614f657f76315f333200000000000000000000000000000000000000000000000000000083614f60614f51601f866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50614fb67f76315f333300000000000000000000000000000000000000000000000000000083614fb1614fa26020866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506150077f76315f333400000000000000000000000000000000000000000000000000000083615002614ff36021866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506150587f76315f3335000000000000000000000000000000000000000000000000000000836150536150446022866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506150a97f76315f3336000000000000000000000000000000000000000000000000000000836150a46150956023866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506150fa7f76315f3337000000000000000000000000000000000000000000000000000000836150f56150e66024866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b5061514b7f76315f3338000000000000000000000000000000000000000000000000000000836151466151376025866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b5061519c7f76315f3339000000000000000000000000000000000000000000000000000000836151976151886026866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506151ed7f76315f3430000000000000000000000000000000000000000000000000000000836151e86151d96027866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b5061523e7f76315f34310000000000000000000000000000000000000000000000000000008361523961522a6028866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b5061528f7f76315f34320000000000000000000000000000000000000000000000000000008361528a61527b6029866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506152e07f76315f3433000000000000000000000000000000000000000000000000000000836152db6152cc602a866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506153317f76315f34340000000000000000000000000000000000000000000000000000008361532c61531d602b866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506153827f76315f34350000000000000000000000000000000000000000000000000000008361537d61536e602c866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506153d37f76315f3436000000000000000000000000000000000000000000000000000000836153ce6153bf602d866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506154247f76315f34370000000000000000000000000000000000000000000000000000008361541f615410602e866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506154757f76315f343800000000000000000000000000000000000000000000000000000083615470615461602f866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506154c67f76315f3439000000000000000000000000000000000000000000000000000000836154c16154b26030866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b506155177f76315f3530000000000000000000000000000000000000000000000000000000836155126155036031866156ce90919063ffffffff16565b8761431390919063ffffffff16565b61552e565b50615528306502e8a39e49c06126d8565b50505050565b600080615544834261431390919063ffffffff16565b9050600060016000615554612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600001541415615616576000806155b4612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208590806001815401808255809150506001900390600052602060002001600090919091909150555b60405180606001604052808581526020018281526020016000151581525060016000615640612d7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555090505060019150509392505050565b6000808314156156e1576000905061574e565b60008284029050828482816156f257fe5b0414615749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061589f6021913960400191505060405180910390fd5b809150505b92915050565b61575f8383836157b8565b615768836113bf565b50505050565b60006157b083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614253565b905092915050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365496e697469616c697a657252313a20636f6e747261637420697320616c726561647920696e697469616c697a65644f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e697469616c697a657252323a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122050a23a278bcee925f731e51464ad33cefa17a57c118cb30daf19b68634022aae64736f6c63430006020033

Deployed ByteCode Sourcemap

218:10828:1:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;218:10828:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1068:92;;;:::i;:::-;;2219:81:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2219:81:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4255:166;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4255:166:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3745:264:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3745:264:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3262:98:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4881:317;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4881:317:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1167:793:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1167:793:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6769:634;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6769:634:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3121:81:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5593:215;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5593:215:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;481:89:7;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;481:89:7;;;;;;;;;;;;;;;;;:::i;:::-;;4173:316:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4173:316:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2316:623;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;2316:623:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;968:92:1;;;:::i;:::-;;6250:359:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6250:359:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3186:229;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3186:229:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3418:117:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3418:117:6;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1689:145:4;;;:::i;:::-;;275:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;275:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;876:290:7;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;876:290:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5409:586:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5409:586:2;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1066:77:4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2413:85:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2413:85:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6295:266;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6295:266:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3738:172;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3738:172:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4674:535:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4674:535:2;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7566:351;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7566:351:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;621:63:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;621:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3968:149:6;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3968:149:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1983:240:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1983:240:4;;;;;;;;;;;;;;;;;;;:::i;:::-;;1068:92:1;10664:19;;;;;;;;;;;:42;;;;10688:18;;;;;;;;;;;10687:19;10664:42;10656:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10770:19;10793;;;;;;;;;;;10792:20;10770:42;;10827:14;10823:113;;;10880:4;10858:19;;:26;;;;;;;;;;;;;;;;;;10920:4;10899:18;;:25;;;;;;;;;;;;;;;;;;10823:113;1280:12:4::1;:10;:12::i;:::-;1270:22;;:6;;;;;;;;;;;:22;;;1262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;1139:13:1::2;:11;:13::i;:::-;10966:14:::0;10962:74;;;11019:5;10997:19;;:27;;;;;;;;;;;;;;;;;;10962:74;1068:92;:::o;2219:81:6:-;2256:13;2288:5;2281:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2219:81;:::o;4255:166::-;4338:4;4354:39;4363:12;:10;:12::i;:::-;4377:7;4386:6;4354:8;:39::i;:::-;4410:4;4403:11;;4255:166;;;;:::o;3745:264:2:-;3882:14;3945:5;3913:6;:11;3920:3;3913:11;;;;;;;;;;;;;;;:20;3925:7;3913:20;;;;;;;;;;;:29;;;:37;3909:92;;;3974:6;:11;3981:3;3974:11;;;;;;;;;;;;;;;:20;3986:7;3974:20;;;;;;;;;;;:27;;;3965:36;;3909:92;3745:264;;;;;:::o;3262:98:6:-;3315:7;3341:12;;3334:19;;3262:98;:::o;4881:317::-;4987:4;5003:36;5013:6;5021:9;5032:6;5003:9;:36::i;:::-;5049:121;5058:6;5066:12;:10;:12::i;:::-;5080:89;5118:6;5080:89;;;;;;;;;;;;;;;;;:11;:19;5092:6;5080:19;;;;;;;;;;;;;;;:33;5100:12;:10;:12::i;:::-;5080:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;5049:8;:121::i;:::-;5187:4;5180:11;;4881:317;;;;;:::o;1167:793:2:-;1289:4;1306:18;1327:14;1335:5;1327:3;:7;;:14;;;;:::i;:::-;1306:35;;1561:1;1522:35;1535:12;:10;:12::i;:::-;1549:7;1522:12;:35::i;:::-;:40;1564:14;;;;;;;;;;;;;;;;;1514:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1514:65:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1609:1;1598:7;:12;;1612:11;;;;;;;;;;;;;;;;;1590:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1590:34:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1681:1;1641:6;:20;1648:12;:10;:12::i;:::-;1641:20;;;;;;;;;;;;;;;:29;1662:7;1641:29;;;;;;;;;;;:36;;;:41;1637:98;;;1697:10;:24;1708:12;:10;:12::i;:::-;1697:24;;;;;;;;;;;;;;;1727:7;1697:38;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1697:38:2;;;;;;;;;;;;;;;;;;;1637:98;1748:32;1765:4;1772:7;1748:8;:32::i;:::-;;1825:37;;;;;;;;1835:7;1825:37;;;;1844:10;1825:37;;;;1856:5;1825:37;;;;;1793:6;:20;1800:12;:10;:12::i;:::-;1793:20;;;;;;;;;;;;;;;:29;1814:7;1793:29;;;;;;;;;;;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1901:7;1887:12;:10;:12::i;:::-;1880:50;;;1910:7;1919:10;1880:50;;;;;;;;;;;;;;;;;;;;;;;;1948:4;1941:11;;;1167:793;;;;;:::o;6769:634::-;6850:24;6892:20;6930:9;6942:1;6930:13;;6925:396;6949:10;:15;6960:3;6949:15;;;;;;;;;;;;;;;:22;;;;6945:1;:26;6925:396;;;7008:41;7025:3;7030:10;:15;7041:3;7030:15;;;;;;;;;;;;;;;7046:1;7030:18;;;;;;;;;;;;;;;;7008:16;:41::i;:::-;6993:56;;7083:1;7068:12;:16;7064:246;;;7124:34;7145:12;7124:16;:20;;:34;;;;:::i;:::-;7105:53;;7219:4;7177:6;:11;7184:3;7177:11;;;;;;;;;;;;;;;:31;7189:10;:15;7200:3;7189:15;;;;;;;;;;;;;;;7205:1;7189:18;;;;;;;;;;;;;;;;7177:31;;;;;;;;;;;:39;;;:46;;;;;;;;;;;;;;;;;;7261:10;:15;7272:3;7261:15;;;;;;;;;;;;;;;7277:1;7261:18;;;;;;;;;;;;;;;;7256:3;7247:47;;;7281:12;7247:47;;;;;;;;;;;;;;;;;;7064:246;6973:3;;;;;;;6925:396;;;;7356:1;7337:16;:20;7333:62;;;7359:4;:13;;;7373:3;7378:16;7359:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7359:36:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7359:36:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7359:36:2;;;;;;;;;;;;;;;;;7333:62;6769:634;;;;:::o;3121:81:6:-;3162:5;3186:9;;;;;;;;;;;3179:16;;3121:81;:::o;5593:215::-;5681:4;5697:83;5706:12;:10;:12::i;:::-;5720:7;5729:50;5768:10;5729:11;:25;5741:12;:10;:12::i;:::-;5729:25;;;;;;;;;;;;;;;:34;5755:7;5729:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;5697:8;:83::i;:::-;5797:4;5790:11;;5593:215;;;;:::o;481:89:7:-;536:27;542:12;:10;:12::i;:::-;556:6;536:5;:27::i;:::-;481:89;:::o;4173:316:2:-;4276:14;4317;4327:3;4317:9;:14::i;:::-;4308:23;;4349:9;4361:1;4349:13;;4344:138;4368:10;:15;4379:3;4368:15;;;;;;;;;;;;;;;:22;;;;4364:1;:26;4344:138;;;4421:49;4432:37;4445:3;4450:10;:15;4461:3;4450:15;;;;;;;;;;;;;;;4466:1;4450:18;;;;;;;;;;;;;;;;4432:12;:37::i;:::-;4421:6;:10;;:49;;;;:::i;:::-;4412:58;;4392:3;;;;;;;4344:138;;;;4173:316;;;:::o;2316:623::-;2463:4;2480:18;2501:14;2509:5;2501:3;:7;;:14;;;;:::i;:::-;2480:35;;2589:1;2559:26;2572:3;2577:7;2559:12;:26::i;:::-;:31;2592:14;;;;;;;;;;;;;;;;;2551:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2551:56:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2637:1;2626:7;:12;;2640:11;;;;;;;;;;;;;;;;;2618:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2618:34:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2700:1;2669:6;:11;2676:3;2669:11;;;;;;;;;;;;;;;:20;2681:7;2669:20;;;;;;;;;;;:27;;;:32;2665:67;;;2703:10;:15;2714:3;2703:15;;;;;;;;;;;;;;;2724:7;2703:29;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;2703:29:2;;;;;;;;;;;;;;;;;;;2665:67;2745:32;2762:4;2769:7;2745:8;:32::i;:::-;;2813:37;;;;;;;;2823:7;2813:37;;;;2832:10;2813:37;;;;2844:5;2813:37;;;;;2790:6;:11;2797:3;2790:11;;;;;;;;;;;;;;;:20;2802:7;2790:20;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2880:7;2875:3;2868:41;;;2889:7;2898:10;2868:41;;;;;;;;;;;;;;;;;;;;;;;;2927:4;2920:11;;;2316:623;;;;;;:::o;968:92:1:-;10134:19;;;;;;;;;;;:42;;;;10158:18;;;;;;;;;;;10157:19;10134:42;10126:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10240:19;10263;;;;;;;;;;;10262:20;10240:42;;10297:14;10293:113;;;10350:4;10328:19;;:26;;;;;;;;;;;;;;;;;;10390:4;10369:18;;:25;;;;;;;;;;;;;;;;;;10293:113;1280:12:4::1;:10;:12::i;:::-;1270:22;;:6;;;;;;;;;;;:22;;;1262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;1039:13:1::2;:11;:13::i;:::-;10436:14:::0;10432:74;;;10489:5;10467:19;;:27;;;;;;;;;;;;;;;;;;10432:74;968:92;:::o;6250:359:2:-;6372:14;6455:3;6422:6;:11;6429:3;6422:11;;;;;;;;;;;;;;;:20;6434:7;6422:20;;;;;;;;;;;:29;;;:36;;:82;;;;;6476:6;:11;6483:3;6476:11;;;;;;;;;;;;;;;:20;6488:7;6476:20;;;;;;;;;;;:28;;;;;;;;;;;;6475:29;6422:82;6404:197;;;6574:6;:11;6581:3;6574:11;;;;;;;;;;;;;;;:20;6586:7;6574:20;;;;;;;;;;;:27;;;6565:36;;6404:197;6250:359;;;;:::o;3186:229::-;3304:14;3341:6;:11;3348:3;3341:11;;;;;;;;;;;;;;;:20;3353:7;3341:20;;;;;;;;;;;:28;;;;;;;;;;;;3336:71;;3380:6;:11;3387:3;3380:11;;;;;;;;;;;;;;;:20;3392:7;3380:20;;;;;;;;;;;:27;;;3371:36;;3336:71;3186:229;;;;:::o;3418:117:6:-;3484:7;3510:9;:18;3520:7;3510:18;;;;;;;;;;;;;;;;3503:25;;3418:117;;;:::o;1689:145:4:-;1280:12;:10;:12::i;:::-;1270:22;;:6;;;;;;;;;;;:22;;;1262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1795:1:::1;1758:40;;1779:6;;;;;;;;;;;1758:40;;;;;;;;;;;;1825:1;1808:6;;:19;;;;;;;;;;;;;;;;;;1689:145::o:0;275:47:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;876:290:7:-;952:26;981:84;1018:6;981:84;;;;;;;;;;;;;;;;;:32;991:7;1000:12;:10;:12::i;:::-;981:9;:32::i;:::-;:36;;:84;;;;;:::i;:::-;952:113;;1076:51;1085:7;1094:12;:10;:12::i;:::-;1108:18;1076:8;:51::i;:::-;1137:22;1143:7;1152:6;1137:5;:22::i;:::-;876:290;;;:::o;5409:586:2:-;5523:4;5591:1;5553:35;5566:12;:10;:12::i;:::-;5580:7;5553:12;:35::i;:::-;:39;5594:10;;;;;;;;;;;;;;;;;5545:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5545:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:32;5633:4;5640:7;5616:8;:32::i;:::-;;5700:77;5769:7;5700:6;:20;5707:12;:10;:12::i;:::-;5700:20;;;;;;;;;;;;;;;:29;5721:7;5700:29;;;;;;;;;;;:50;;;:68;;:77;;;;:::i;:::-;5661:6;:20;5668:12;:10;:12::i;:::-;5661:20;;;;;;;;;;;;;;;:29;5682:7;5661:29;;;;;;;;;;;:36;;:116;;;;5843:7;5816:12;:10;:12::i;:::-;5795:170;;;5865:6;:20;5872:12;:10;:12::i;:::-;5865:20;;;;;;;;;;;;;;;:29;5886:7;5865:29;;;;;;;;;;;:36;;;5916:6;:20;5923:12;:10;:12::i;:::-;5916:20;;;;;;;;;;;;;;;:29;5937:7;5916:29;;;;;;;;;;;:38;;;5795:170;;;;;;;;;;;;;;;;;;;;;;;;5983:4;5976:11;;5409:586;;;;:::o;1066:77:4:-;1104:7;1130:6;;;;;;;;;;;1123:13;;1066:77;:::o;2413:85:6:-;2452:13;2484:7;2477:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2413:85;:::o;6295:266::-;6388:4;6404:129;6413:12;:10;:12::i;:::-;6427:7;6436:96;6475:15;6436:96;;;;;;;;;;;;;;;;;:11;:25;6448:12;:10;:12::i;:::-;6436:25;;;;;;;;;;;;;;;:34;6462:7;6436:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;6404:8;:129::i;:::-;6550:4;6543:11;;6295:266;;;;:::o;3738:172::-;3824:4;3840:42;3850:12;:10;:12::i;:::-;3864:9;3875:6;3840:9;:42::i;:::-;3899:4;3892:11;;3738:172;;;;:::o;4674:535:2:-;4778:4;4846:1;4808:35;4821:12;:10;:12::i;:::-;4835:7;4808:12;:35::i;:::-;:39;4849:10;;;;;;;;;;;;;;;;;4800:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4800:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4914:77;4985:5;4914:6;:20;4921:12;:10;:12::i;:::-;4914:20;;;;;;;;;;;;;;;:29;4935:7;4914:29;;;;;;;;;;;:52;;;:70;;:77;;;;:::i;:::-;4873:6;:20;4880:12;:10;:12::i;:::-;4873:20;;;;;;;;;;;;;;;:29;4894:7;4873:29;;;;;;;;;;;:38;;:118;;;;5057:7;5030:12;:10;:12::i;:::-;5009:170;;;5079:6;:20;5086:12;:10;:12::i;:::-;5079:20;;;;;;;;;;;;;;;:29;5100:7;5079:29;;;;;;;;;;;:36;;;5130:6;:20;5137:12;:10;:12::i;:::-;5130:20;;;;;;;;;;;;;;;:29;5151:7;5130:29;;;;;;;;;;;:38;;;5009:170;;;;;;;;;;;;;;;;;;;;;;;;5197:4;5190:11;;4674:535;;;;:::o;7566:351::-;7674:24;7721:9;7733:1;7721:13;;7716:194;7740:10;:15;7751:3;7740:15;;;;;;;;;;;;;;;:22;;;;7736:1;:26;7716:194;;;7803:95;7842:41;7859:3;7864:10;:15;7875:3;7864:15;;;;;;;;;;;;;;;7880:1;7864:18;;;;;;;;;;;;;;;;7842:16;:41::i;:::-;7803:16;:20;;:95;;;;:::i;:::-;7784:114;;7764:3;;;;;;;7716:194;;;;7566:351;;;:::o;621:63:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3968:149:6:-;4057:7;4083:11;:18;4095:5;4083:18;;;;;;;;;;;;;;;:27;4102:7;4083:27;;;;;;;;;;;;;;;;4076:34;;3968:149;;;;:::o;1983:240:4:-;1280:12;:10;:12::i;:::-;1270:22;;:6;;;;;;;;;;;:22;;;1262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:1:::1;2071:22;;:8;:22;;;;2063:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2180:8;2151:38;;2172:6;;;;;;;;;;;2151:38;;;;;;;;;;;;2208:8;2199:6;;:17;;;;;;;;;;;;;;;;;;1983:240:::0;:::o;590:104:3:-;643:15;677:10;670:17;;590:104;:::o;5268:4103:1:-;5313:28;5357:3;5344:10;:16;5313:47;;5371:14;5388:7;5371:24;;5487:48;;5501:11;5514:20;5487:5;:48::i;:::-;;5546:60;;5560:11;5573:32;5598:6;5573:20;:24;;:32;;;;:::i;:::-;5546:5;:60::i;:::-;;5617:67;;5631:11;5644:39;5669:13;5680:1;5669:6;:10;;:13;;;;:::i;:::-;5644:20;:24;;:39;;;;:::i;:::-;5617:5;:67::i;:::-;;5695;;5709:11;5722:39;5747:13;5758:1;5747:6;:10;;:13;;;;:::i;:::-;5722:20;:24;;:39;;;;:::i;:::-;5695:5;:67::i;:::-;;5773;;5787:11;5800:39;5825:13;5836:1;5825:6;:10;;:13;;;;:::i;:::-;5800:20;:24;;:39;;;;:::i;:::-;5773:5;:67::i;:::-;;5851;;5865:11;5878:39;5903:13;5914:1;5903:6;:10;;:13;;;;:::i;:::-;5878:20;:24;;:39;;;;:::i;:::-;5851:5;:67::i;:::-;;5929;;5943:11;5956:39;5981:13;5992:1;5981:6;:10;;:13;;;;:::i;:::-;5956:20;:24;;:39;;;;:::i;:::-;5929:5;:67::i;:::-;;6007;;6021:11;6034:39;6059:13;6070:1;6059:6;:10;;:13;;;;:::i;:::-;6034:20;:24;;:39;;;;:::i;:::-;6007:5;:67::i;:::-;;6085;;6099:11;6112:39;6137:13;6148:1;6137:6;:10;;:13;;;;:::i;:::-;6112:20;:24;;:39;;;;:::i;:::-;6085:5;:67::i;:::-;;6163:68;;6178:11;6191:39;6216:13;6227:1;6216:6;:10;;:13;;;;:::i;:::-;6191:20;:24;;:39;;;;:::i;:::-;6163:5;:68::i;:::-;;6242:69;;6257:11;6270:40;6295:14;6306:2;6295:6;:10;;:14;;;;:::i;:::-;6270:20;:24;;:40;;;;:::i;:::-;6242:5;:69::i;:::-;;6322;;6337:11;6350:40;6375:14;6386:2;6375:6;:10;;:14;;;;:::i;:::-;6350:20;:24;;:40;;;;:::i;:::-;6322:5;:69::i;:::-;;6402;;6417:11;6430:40;6455:14;6466:2;6455:6;:10;;:14;;;;:::i;:::-;6430:20;:24;;:40;;;;:::i;:::-;6402:5;:69::i;:::-;;6482;;6497:11;6510:40;6535:14;6546:2;6535:6;:10;;:14;;;;:::i;:::-;6510:20;:24;;:40;;;;:::i;:::-;6482:5;:69::i;:::-;;6562;;6577:11;6590:40;6615:14;6626:2;6615:6;:10;;:14;;;;:::i;:::-;6590:20;:24;;:40;;;;:::i;:::-;6562:5;:69::i;:::-;;6642;;6657:11;6670:40;6695:14;6706:2;6695:6;:10;;:14;;;;:::i;:::-;6670:20;:24;;:40;;;;:::i;:::-;6642:5;:69::i;:::-;;6722;;6737:11;6750:40;6775:14;6786:2;6775:6;:10;;:14;;;;:::i;:::-;6750:20;:24;;:40;;;;:::i;:::-;6722:5;:69::i;:::-;;6802;;6817:11;6830:40;6855:14;6866:2;6855:6;:10;;:14;;;;:::i;:::-;6830:20;:24;;:40;;;;:::i;:::-;6802:5;:69::i;:::-;;6882;;6897:11;6910:40;6935:14;6946:2;6935:6;:10;;:14;;;;:::i;:::-;6910:20;:24;;:40;;;;:::i;:::-;6882:5;:69::i;:::-;;6962;;6977:11;6990:40;7015:14;7026:2;7015:6;:10;;:14;;;;:::i;:::-;6990:20;:24;;:40;;;;:::i;:::-;6962:5;:69::i;:::-;;7042;;7057:11;7070:40;7095:14;7106:2;7095:6;:10;;:14;;;;:::i;:::-;7070:20;:24;;:40;;;;:::i;:::-;7042:5;:69::i;:::-;;7122;;7137:11;7150:40;7175:14;7186:2;7175:6;:10;;:14;;;;:::i;:::-;7150:20;:24;;:40;;;;:::i;:::-;7122:5;:69::i;:::-;;7202;;7217:11;7230:40;7255:14;7266:2;7255:6;:10;;:14;;;;:::i;:::-;7230:20;:24;;:40;;;;:::i;:::-;7202:5;:69::i;:::-;;7282;;7297:11;7310:40;7335:14;7346:2;7335:6;:10;;:14;;;;:::i;:::-;7310:20;:24;;:40;;;;:::i;:::-;7282:5;:69::i;:::-;;7362;;7377:11;7390:40;7415:14;7426:2;7415:6;:10;;:14;;;;:::i;:::-;7390:20;:24;;:40;;;;:::i;:::-;7362:5;:69::i;:::-;;7442;;7457:11;7470:40;7495:14;7506:2;7495:6;:10;;:14;;;;:::i;:::-;7470:20;:24;;:40;;;;:::i;:::-;7442:5;:69::i;:::-;;7522;;7537:11;7550:40;7575:14;7586:2;7575:6;:10;;:14;;;;:::i;:::-;7550:20;:24;;:40;;;;:::i;:::-;7522:5;:69::i;:::-;;7602;;7617:11;7630:40;7655:14;7666:2;7655:6;:10;;:14;;;;:::i;:::-;7630:20;:24;;:40;;;;:::i;:::-;7602:5;:69::i;:::-;;7682;;7697:11;7710:40;7735:14;7746:2;7735:6;:10;;:14;;;;:::i;:::-;7710:20;:24;;:40;;;;:::i;:::-;7682:5;:69::i;:::-;;7762;;7777:11;7790:40;7815:14;7826:2;7815:6;:10;;:14;;;;:::i;:::-;7790:20;:24;;:40;;;;:::i;:::-;7762:5;:69::i;:::-;;7842;;7857:11;7870:40;7895:14;7906:2;7895:6;:10;;:14;;;;:::i;:::-;7870:20;:24;;:40;;;;:::i;:::-;7842:5;:69::i;:::-;;7922;;7937:11;7950:40;7975:14;7986:2;7975:6;:10;;:14;;;;:::i;:::-;7950:20;:24;;:40;;;;:::i;:::-;7922:5;:69::i;:::-;;8002;;8017:11;8030:40;8055:14;8066:2;8055:6;:10;;:14;;;;:::i;:::-;8030:20;:24;;:40;;;;:::i;:::-;8002:5;:69::i;:::-;;8082;;8097:11;8110:40;8135:14;8146:2;8135:6;:10;;:14;;;;:::i;:::-;8110:20;:24;;:40;;;;:::i;:::-;8082:5;:69::i;:::-;;8162;;8177:11;8190:40;8215:14;8226:2;8215:6;:10;;:14;;;;:::i;:::-;8190:20;:24;;:40;;;;:::i;:::-;8162:5;:69::i;:::-;;8242;;8257:11;8270:40;8295:14;8306:2;8295:6;:10;;:14;;;;:::i;:::-;8270:20;:24;;:40;;;;:::i;:::-;8242:5;:69::i;:::-;;8322;;8337:11;8350:40;8375:14;8386:2;8375:6;:10;;:14;;;;:::i;:::-;8350:20;:24;;:40;;;;:::i;:::-;8322:5;:69::i;:::-;;8402;;8417:11;8430:40;8455:14;8466:2;8455:6;:10;;:14;;;;:::i;:::-;8430:20;:24;;:40;;;;:::i;:::-;8402:5;:69::i;:::-;;8482;;8497:11;8510:40;8535:14;8546:2;8535:6;:10;;:14;;;;:::i;:::-;8510:20;:24;;:40;;;;:::i;:::-;8482:5;:69::i;:::-;;8562;;8577:11;8590:40;8615:14;8626:2;8615:6;:10;;:14;;;;:::i;:::-;8590:20;:24;;:40;;;;:::i;:::-;8562:5;:69::i;:::-;;8642;;8657:11;8670:40;8695:14;8706:2;8695:6;:10;;:14;;;;:::i;:::-;8670:20;:24;;:40;;;;:::i;:::-;8642:5;:69::i;:::-;;8722;;8737:11;8750:40;8775:14;8786:2;8775:6;:10;;:14;;;;:::i;:::-;8750:20;:24;;:40;;;;:::i;:::-;8722:5;:69::i;:::-;;8802;;8817:11;8830:40;8855:14;8866:2;8855:6;:10;;:14;;;;:::i;:::-;8830:20;:24;;:40;;;;:::i;:::-;8802:5;:69::i;:::-;;8882;;8897:11;8910:40;8935:14;8946:2;8935:6;:10;;:14;;;;:::i;:::-;8910:20;:24;;:40;;;;:::i;:::-;8882:5;:69::i;:::-;;8962;;8977:11;8990:40;9015:14;9026:2;9015:6;:10;;:14;;;;:::i;:::-;8990:20;:24;;:40;;;;:::i;:::-;8962:5;:69::i;:::-;;9042;;9057:11;9070:40;9095:14;9106:2;9095:6;:10;;:14;;;;:::i;:::-;9070:20;:24;;:40;;;;:::i;:::-;9042:5;:69::i;:::-;;9122;;9137:11;9150:40;9175:14;9186:2;9175:6;:10;;:14;;;;:::i;:::-;9150:20;:24;;:40;;;;:::i;:::-;9122:5;:69::i;:::-;;9202;;9217:11;9230:40;9255:14;9266:2;9255:6;:10;;:14;;;;:::i;:::-;9230:20;:24;;:40;;;;:::i;:::-;9202:5;:69::i;:::-;;9325:38;9342:4;9349:13;9325:8;:38::i;:::-;;5268:4103;;:::o;9357:340:6:-;9475:1;9458:19;;:5;:19;;;;9450:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9555:1;9536:21;;:7;:21;;;;9528:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9637:6;9607:11;:18;9619:5;9607:18;;;;;;;;;;;;;;;:27;9626:7;9607:27;;;;;;;;;;;;;;;:36;;;;9674:7;9658:32;;9667:5;9658:32;;;9683:6;9658:32;;;;;;;;;;;;;;;;;;9357:340;;;:::o;7035:530::-;7158:1;7140:20;;:6;:20;;;;7132:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7241:1;7220:23;;:9;:23;;;;7212:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7294:47;7315:6;7323:9;7334:6;7294:20;:47::i;:::-;7372:71;7394:6;7372:71;;;;;;;;;;;;;;;;;:9;:17;7382:6;7372:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;7352:9;:17;7362:6;7352:17;;;;;;;;;;;;;;;:91;;;;7476:32;7501:6;7476:9;:20;7486:9;7476:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;7453:9;:20;7463:9;7453:20;;;;;;;;;;;;;;;:55;;;;7540:9;7523:35;;7532:6;7523:35;;;7551:6;7523:35;;;;;;;;;;;;;;;;;;7035:530;;;:::o;1746:187:5:-;1832:7;1864:1;1859;:6;;1867:12;1851:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1851:29:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1890:9;1906:1;1902;:5;1890:17;;1925:1;1918:8;;;1746:187;;;;;:::o;874:176::-;932:7;951:9;967:1;963;:5;951:17;;991:1;986;:6;;978:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1042:1;1035:8;;;874:176;;;;:::o;8524:410:6:-;8626:1;8607:21;;:7;:21;;;;8599:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8677:49;8698:7;8715:1;8719:6;8677:20;:49::i;:::-;8758:68;8781:6;8758:68;;;;;;;;;;;;;;;;;:9;:18;8768:7;8758:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;8737:9;:18;8747:7;8737:18;;;;;;;;;;;;;;;:89;;;;8851:24;8868:6;8851:12;;:16;;:24;;;;:::i;:::-;8836:12;:39;;;;8916:1;8890:37;;8899:7;8890:37;;;8920:6;8890:37;;;;;;;;;;;;;;;;;;8524:410;;:::o;1168:4092:1:-;1213:28;1257:3;1244:10;:16;1213:47;;1271:16;1290:11;1271:30;;1312:14;1329:7;1312:24;;1366:45;;1380:8;1390:20;1366:5;:45::i;:::-;;1422:57;;1436:8;1446:32;1471:6;1446:20;:24;;:32;;;;:::i;:::-;1422:5;:57::i;:::-;;1490:64;;1504:8;1514:39;1539:13;1550:1;1539:6;:10;;:13;;;;:::i;:::-;1514:20;:24;;:39;;;;:::i;:::-;1490:5;:64::i;:::-;;1565;;1579:8;1589:39;1614:13;1625:1;1614:6;:10;;:13;;;;:::i;:::-;1589:20;:24;;:39;;;;:::i;:::-;1565:5;:64::i;:::-;;1640;;1654:8;1664:39;1689:13;1700:1;1689:6;:10;;:13;;;;:::i;:::-;1664:20;:24;;:39;;;;:::i;:::-;1640:5;:64::i;:::-;;1715;;1729:8;1739:39;1764:13;1775:1;1764:6;:10;;:13;;;;:::i;:::-;1739:20;:24;;:39;;;;:::i;:::-;1715:5;:64::i;:::-;;1790;;1804:8;1814:39;1839:13;1850:1;1839:6;:10;;:13;;;;:::i;:::-;1814:20;:24;;:39;;;;:::i;:::-;1790:5;:64::i;:::-;;1865;;1879:8;1889:39;1914:13;1925:1;1914:6;:10;;:13;;;;:::i;:::-;1889:20;:24;;:39;;;;:::i;:::-;1865:5;:64::i;:::-;;1940;;1954:8;1964:39;1989:13;2000:1;1989:6;:10;;:13;;;;:::i;:::-;1964:20;:24;;:39;;;;:::i;:::-;1940:5;:64::i;:::-;;2015:65;;2030:8;2040:39;2065:13;2076:1;2065:6;:10;;:13;;;;:::i;:::-;2040:20;:24;;:39;;;;:::i;:::-;2015:5;:65::i;:::-;;2091:66;;2106:8;2116:40;2141:14;2152:2;2141:6;:10;;:14;;;;:::i;:::-;2116:20;:24;;:40;;;;:::i;:::-;2091:5;:66::i;:::-;;2168;;2183:8;2193:40;2218:14;2229:2;2218:6;:10;;:14;;;;:::i;:::-;2193:20;:24;;:40;;;;:::i;:::-;2168:5;:66::i;:::-;;2245;;2260:8;2270:40;2295:14;2306:2;2295:6;:10;;:14;;;;:::i;:::-;2270:20;:24;;:40;;;;:::i;:::-;2245:5;:66::i;:::-;;2322;;2337:8;2347:40;2372:14;2383:2;2372:6;:10;;:14;;;;:::i;:::-;2347:20;:24;;:40;;;;:::i;:::-;2322:5;:66::i;:::-;;2399;;2414:8;2424:40;2449:14;2460:2;2449:6;:10;;:14;;;;:::i;:::-;2424:20;:24;;:40;;;;:::i;:::-;2399:5;:66::i;:::-;;2476;;2491:8;2501:40;2526:14;2537:2;2526:6;:10;;:14;;;;:::i;:::-;2501:20;:24;;:40;;;;:::i;:::-;2476:5;:66::i;:::-;;2553;;2568:8;2578:40;2603:14;2614:2;2603:6;:10;;:14;;;;:::i;:::-;2578:20;:24;;:40;;;;:::i;:::-;2553:5;:66::i;:::-;;2630;;2645:8;2655:40;2680:14;2691:2;2680:6;:10;;:14;;;;:::i;:::-;2655:20;:24;;:40;;;;:::i;:::-;2630:5;:66::i;:::-;;2707;;2722:8;2732:40;2757:14;2768:2;2757:6;:10;;:14;;;;:::i;:::-;2732:20;:24;;:40;;;;:::i;:::-;2707:5;:66::i;:::-;;2784;;2799:8;2809:40;2834:14;2845:2;2834:6;:10;;:14;;;;:::i;:::-;2809:20;:24;;:40;;;;:::i;:::-;2784:5;:66::i;:::-;;2861;;2876:8;2886:40;2911:14;2922:2;2911:6;:10;;:14;;;;:::i;:::-;2886:20;:24;;:40;;;;:::i;:::-;2861:5;:66::i;:::-;;2938;;2953:8;2963:40;2988:14;2999:2;2988:6;:10;;:14;;;;:::i;:::-;2963:20;:24;;:40;;;;:::i;:::-;2938:5;:66::i;:::-;;3015;;3030:8;3040:40;3065:14;3076:2;3065:6;:10;;:14;;;;:::i;:::-;3040:20;:24;;:40;;;;:::i;:::-;3015:5;:66::i;:::-;;3092;;3107:8;3117:40;3142:14;3153:2;3142:6;:10;;:14;;;;:::i;:::-;3117:20;:24;;:40;;;;:::i;:::-;3092:5;:66::i;:::-;;3169;;3184:8;3194:40;3219:14;3230:2;3219:6;:10;;:14;;;;:::i;:::-;3194:20;:24;;:40;;;;:::i;:::-;3169:5;:66::i;:::-;;3246;;3261:8;3271:40;3296:14;3307:2;3296:6;:10;;:14;;;;:::i;:::-;3271:20;:24;;:40;;;;:::i;:::-;3246:5;:66::i;:::-;;3323;;3338:8;3348:40;3373:14;3384:2;3373:6;:10;;:14;;;;:::i;:::-;3348:20;:24;;:40;;;;:::i;:::-;3323:5;:66::i;:::-;;3400;;3415:8;3425:40;3450:14;3461:2;3450:6;:10;;:14;;;;:::i;:::-;3425:20;:24;;:40;;;;:::i;:::-;3400:5;:66::i;:::-;;3477;;3492:8;3502:40;3527:14;3538:2;3527:6;:10;;:14;;;;:::i;:::-;3502:20;:24;;:40;;;;:::i;:::-;3477:5;:66::i;:::-;;3554;;3569:8;3579:40;3604:14;3615:2;3604:6;:10;;:14;;;;:::i;:::-;3579:20;:24;;:40;;;;:::i;:::-;3554:5;:66::i;:::-;;3631;;3646:8;3656:40;3681:14;3692:2;3681:6;:10;;:14;;;;:::i;:::-;3656:20;:24;;:40;;;;:::i;:::-;3631:5;:66::i;:::-;;3708;;3723:8;3733:40;3758:14;3769:2;3758:6;:10;;:14;;;;:::i;:::-;3733:20;:24;;:40;;;;:::i;:::-;3708:5;:66::i;:::-;;3785;;3800:8;3810:40;3835:14;3846:2;3835:6;:10;;:14;;;;:::i;:::-;3810:20;:24;;:40;;;;:::i;:::-;3785:5;:66::i;:::-;;3862;;3877:8;3887:40;3912:14;3923:2;3912:6;:10;;:14;;;;:::i;:::-;3887:20;:24;;:40;;;;:::i;:::-;3862:5;:66::i;:::-;;3939;;3954:8;3964:40;3989:14;4000:2;3989:6;:10;;:14;;;;:::i;:::-;3964:20;:24;;:40;;;;:::i;:::-;3939:5;:66::i;:::-;;4016;;4031:8;4041:40;4066:14;4077:2;4066:6;:10;;:14;;;;:::i;:::-;4041:20;:24;;:40;;;;:::i;:::-;4016:5;:66::i;:::-;;4093;;4108:8;4118:40;4143:14;4154:2;4143:6;:10;;:14;;;;:::i;:::-;4118:20;:24;;:40;;;;:::i;:::-;4093:5;:66::i;:::-;;4170;;4185:8;4195:40;4220:14;4231:2;4220:6;:10;;:14;;;;:::i;:::-;4195:20;:24;;:40;;;;:::i;:::-;4170:5;:66::i;:::-;;4247;;4262:8;4272:40;4297:14;4308:2;4297:6;:10;;:14;;;;:::i;:::-;4272:20;:24;;:40;;;;:::i;:::-;4247:5;:66::i;:::-;;4324;;4339:8;4349:40;4374:14;4385:2;4374:6;:10;;:14;;;;:::i;:::-;4349:20;:24;;:40;;;;:::i;:::-;4324:5;:66::i;:::-;;4401;;4416:8;4426:40;4451:14;4462:2;4451:6;:10;;:14;;;;:::i;:::-;4426:20;:24;;:40;;;;:::i;:::-;4401:5;:66::i;:::-;;4478;;4493:8;4503:40;4528:14;4539:2;4528:6;:10;;:14;;;;:::i;:::-;4503:20;:24;;:40;;;;:::i;:::-;4478:5;:66::i;:::-;;4555;;4570:8;4580:40;4605:14;4616:2;4605:6;:10;;:14;;;;:::i;:::-;4580:20;:24;;:40;;;;:::i;:::-;4555:5;:66::i;:::-;;4632;;4647:8;4657:40;4682:14;4693:2;4682:6;:10;;:14;;;;:::i;:::-;4657:20;:24;;:40;;;;:::i;:::-;4632:5;:66::i;:::-;;4709;;4724:8;4734:40;4759:14;4770:2;4759:6;:10;;:14;;;;:::i;:::-;4734:20;:24;;:40;;;;:::i;:::-;4709:5;:66::i;:::-;;4786;;4801:8;4811:40;4836:14;4847:2;4836:6;:10;;:14;;;;:::i;:::-;4811:20;:24;;:40;;;;:::i;:::-;4786:5;:66::i;:::-;;4863;;4878:8;4888:40;4913:14;4924:2;4913:6;:10;;:14;;;;:::i;:::-;4888:20;:24;;:40;;;;:::i;:::-;4863:5;:66::i;:::-;;4940;;4955:8;4965:40;4990:14;5001:2;4990:6;:10;;:14;;;;:::i;:::-;4965:20;:24;;:40;;;;:::i;:::-;4940:5;:66::i;:::-;;5017;;5032:8;5042:40;5067:14;5078:2;5067:6;:10;;:14;;;;:::i;:::-;5042:20;:24;;:40;;;;:::i;:::-;5017:5;:66::i;:::-;;5094;;5109:8;5119:40;5144:14;5155:2;5144:6;:10;;:14;;;;:::i;:::-;5119:20;:24;;:40;;;;:::i;:::-;5094:5;:66::i;:::-;;5214:38;5231:4;5238:13;5214:8;:38::i;:::-;;1168:4092;;;:::o;9379:410::-;9495:4;9512:18;9533:14;9541:5;9533:3;:7;;:14;;;;:::i;:::-;9512:35;;9625:1;9585:6;:20;9592:12;:10;:12::i;:::-;9585:20;;;;;;;;;;;;;;;:29;9606:7;9585:29;;;;;;;;;;;:36;;;:41;9581:98;;;9641:10;:24;9652:12;:10;:12::i;:::-;9641:24;;;;;;;;;;;;;;;9671:7;9641:38;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;9641:38:1;;;;;;;;;;;;;;;;;;;9581:98;9722:37;;;;;;;;9732:7;9722:37;;;;9741:10;9722:37;;;;9753:5;9722:37;;;;;9690:6;:20;9697:12;:10;:12::i;:::-;9690:20;;;;;;;;;;;;;;;:29;9711:7;9690:29;;;;;;;;;;;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9777:4;9770:11;;;9379:410;;;;;:::o;2180:459:5:-;2238:7;2484:1;2479;:6;2475:45;;;2508:1;2501:8;;;;2475:45;2530:9;2546:1;2542;:5;2530:17;;2574:1;2569;2565;:5;;;;;;:10;2557:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2631:1;2624:8;;;2180:459;;;;;:::o;9799:184:1:-;9908:44;9935:4;9941:2;9945:6;9908:26;:44::i;:::-;9963:12;9970:4;9963:6;:12::i;:::-;;9799:184;;;:::o;1321:134:5:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;;1321:134;;;;:::o;10695:92:6:-;;;;:::o

Swarm Source

ipfs://50a23a278bcee925f731e51464ad33cefa17a57c118cb30daf19b68634022aae

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.