Contract 0xb1feD59cc80145bA05A0C248b55C0631A363F780 2

Contract Overview

Balance:
0.1 Ether
Txn Hash
Method
Block
From
To
Value
0xa4976881e4762e13e634cad1189d851a9182f3b4d6f1ea6bbfd64ebf2e22424cBuy113688382022-09-12 18:33:1975 days 23 hrs ago0xb6cd752d42921e9d0d17e4fe1fd75fbeac72685b IN  0xb1fed59cc80145ba05a0c248b55c0631a363f7800.01 Ether0.0000695 2.5
0x06f3083f76c58a05e57e9d73ac9adb43c42223576fbcccd7ce120c2b5b4c8928Withdraw Tokens113547762022-09-10 7:52:4678 days 10 hrs ago0x469ac0f185c11763dedc0e3fc52f77de39a46b9b IN  0xb1fed59cc80145ba05a0c248b55c0631a363f7800 Ether0.00015634 2.00000037
0xe7bb454f650f0da9f64e4058ffc83a87e534cb31ee038cfe33394fbf26b8ee26Buy113544322022-09-10 6:26:4078 days 11 hrs ago0x7943d0ed3bff7269d2327850cf2a0be17ec544f6 IN  0xb1fed59cc80145ba05a0c248b55c0631a363f7800.01 Ether0.0000695 2.5
0x1bfbd855a6e2095f4fa20a650538255d2df13116083a45752d05841cca7a4d3cBuy113544322022-09-10 6:26:4078 days 11 hrs ago0x469ac0f185c11763dedc0e3fc52f77de39a46b9b IN  0xb1fed59cc80145ba05a0c248b55c0631a363f7800.1 Ether0.00048719 2.5
0x11d0d24eb20d2633bb7ab1e990a037f5311d30918b6d4e5f8aa983b91c6798afSet Values106518702022-05-10 12:33:52201 days 5 hrs ago0xeba41eaa32841629b1d4f64852d0dadf70b0c665 IN  0xb1fed59cc80145ba05a0c248b55c0631a363f7800 Ether0.00304187 19.34001493
0x85aef29139fe62bec4c98b7d96f022cc46b4c7f20af26be7cbfa617f532b06a5Initialize106518632022-05-10 12:32:05201 days 5 hrs ago0xeba41eaa32841629b1d4f64852d0dadf70b0c665 IN  0xb1fed59cc80145ba05a0c248b55c0631a363f7800 Ether0.00521726 21.12749837
0x83dcd24fe762b8ed0a4fae4e340777373f4fd045a589205cd721cec842b921b70x60806040106518262022-05-10 12:22:49201 days 5 hrs ago0xeba41eaa32841629b1d4f64852d0dadf70b0c665 IN  Create: DOXACrowdsale0 Ether0.04656744 22.76697012
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x06f3083f76c58a05e57e9d73ac9adb43c42223576fbcccd7ce120c2b5b4c8928113547762022-09-10 7:52:4678 days 10 hrs ago 0xb1fed59cc80145ba05a0c248b55c0631a363f780 0xd99b4bb049a6dd490901cdfa33f15c4fac097ef00 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DOXACrowdsale

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-10
*/

/**
 *Submitted for verification at Etherscan.io on 2022-05-09
*/

// File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Upgradeable {
    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.0;


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
 * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() initializer {}
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
        // contract may have been reentered.
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} modifier, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !AddressUpgradeable.isContract(address(this));
    }
}

// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.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 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 ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;



/**
 * @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.
 */
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}

// File: CS_flat.sol

/**
 *Submitted for verification at Etherscan.io on 2022-01-05
*/

// File: https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol




// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

/**
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
} 

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}



pragma solidity ^0.8.0;

contract DOXACrowdsale is OwnableUpgradeable{

    uint256 public tokenRate;
    IERC20Upgradeable public token;   
    uint public startDate;
    uint public endDate;
    uint public contractBalance ;
    address public signer;
    mapping(address=>mapping(uint=>bool)) public usedNonce;

  
    address public admin;

    AggregatorV3Interface internal priceFeedETHUSD;
    AggregatorV3Interface internal priceFeedETHDAI;
    IERC20Upgradeable public USDT = IERC20Upgradeable(address(0x608307CC588f09A01480861D9B817EAE1624D418));
    IERC20Upgradeable public DAI = IERC20Upgradeable(address(0x5eD8BD53B0c3fa3dEaBd345430B1A3a6A4e8BD7C));

    /* Structure to store Investor Details*/
    struct InvestorDetails{ 
        uint totalBalance;
        uint lastVestedTime;
        uint reminingUnitsToVest;
        uint tokensPerUnit;
        uint vestingBalance;
        uint totalPaid;
        bool isETH;
        bool purchased;
    }
    
    event Buy(address indexed buyer, uint indexed ethPaid, uint indexed tokenBought);
    event TokenWithdraw(address indexed buyer, uint value);
    event BNBUpdate(address indexed account);

    mapping(address => InvestorDetails) public Investors;

  
    
    modifier icoShouldBeStarted {
        require(block.timestamp >= startDate, 'ICO is not started yet!');
        _;
    }

    modifier icoShouldnotBeEnded {
        require(block.timestamp <= endDate, 'ICO is ended');
        _;
    }
   
    receive() external payable {
      buy();
    }
   
   

    uint public previousEthAmt;
    
    uint public vestingTime ; //14 Days
    uint public timeDuration ;
    uint minimumETH ;
    uint maximumETH;
    uint ethPrice ;

    function buy() public payable icoShouldBeStarted icoShouldnotBeEnded {
        require(msg.value >= minimumETH, "Value is less than the minium ETH");
        require(msg.value <= maximumETH, "Value is greater than maximum ETH");
        processPayment(msg.sender, msg.value);
    }

     function payUsingTokens(uint8 tokenType, uint amount) public {
        if(tokenType == 0) {
            require(USDT.balanceOf(msg.sender) >= amount, "Insufficient balance");
            USDT.transferFrom(msg.sender, address(this), amount);
            uint ethAmount = (amount *(10 ** 18))/(ethPrice);
            processPayment(msg.sender, ethAmount);
        }

        if(tokenType == 1) {
            require(DAI.balanceOf(msg.sender) >= amount, "Insufficient balance");
            DAI.transferFrom(msg.sender, address(this), amount);
            uint ethAmount = (amount *(10 ** 18))/(ethPrice);
            previousEthAmt = ethAmount;
            processPayment(msg.sender, ethAmount);
        }
    }

    function setSigner(address _signer) external onlyOwner{
        signer=_signer;
    }

    function processPayment(address account, uint amount) private {
        /* Each wallet is limited to do only one purchase */
        //require(Investors[msg.sender].purchased == false, 'Restricted to 1 purchase per wallet');
        /* Buy value should be within the range */
        
        if(!Investors[account].purchased) {
            uint tokensToBuy = (amount /(tokenRate)) * (10 ** 18);
            /* The number of tokens should be less than the balance of ICO contract*/
            require(tokensToBuy <= contractBalance, "Tokens sold out! Try giving minium ETH value");
            
            /* Set all the initial investor details */
            InvestorDetails memory investor;
    
            investor.isETH = true;
            investor.totalPaid = amount;
            investor.totalBalance = tokensToBuy; //Number of tokens investor bought
            investor.tokensPerUnit = (investor.totalBalance)/(10); // Number of Token to release for each vesting period
            investor.reminingUnitsToVest =  10; // Remining number of units to vest
            investor.lastVestedTime = block.timestamp; // Last vested time
            investor.vestingBalance = tokensToBuy;
            contractBalance -= tokensToBuy;
            investor.purchased = true;
            Investors[account] = investor; // Map the investor address to it's corresponding details
            emit Buy(account, amount, tokensToBuy);
        } else {
            //require(Investors[msg.sender].isETH, "Try purchase using BNB!");
            require((Investors[account].totalPaid)/(amount) <= maximumETH, "Already bought for maximum ETH");
            
            uint tokensToBuy = ((amount/tokenRate) *(10 ** 18));
            require(tokensToBuy <= contractBalance, "Tokens sold out! Try giving minium ETH value");
            Investors[account].totalPaid += amount;
            uint reminingUnitsToVest = Investors[account].reminingUnitsToVest;
            uint tokensPerUnit = tokensToBuy/(reminingUnitsToVest);
            Investors[account].tokensPerUnit += tokensPerUnit;   
            Investors[account].totalBalance += tokensToBuy;
            contractBalance -= tokensToBuy;
            Investors[account].vestingBalance += tokensToBuy;
            emit Buy(account, amount, tokensToBuy);
        }
    }
    
    function withdrawTokens() public {
        /* Time difference to calculate the interval between now and last vested time. */
        uint timeDifference = block.timestamp -(Investors[msg.sender].lastVestedTime);
        
        /* Number of units that can be vested between the time interval */
        uint numberOfUnitsCanBeVested = timeDifference/(timeDuration);
        
        /* Remining units to vest should be greater than 0 */
        require(Investors[msg.sender].reminingUnitsToVest > 0, 'All units vested!');
        
        /* Number of units can be vested should be more than 0 */
        require(numberOfUnitsCanBeVested > 0, 'Please wait till next vesting period!');

        if(numberOfUnitsCanBeVested >= Investors[msg.sender].reminingUnitsToVest) {
            numberOfUnitsCanBeVested = Investors[msg.sender].reminingUnitsToVest;
        }
        
        /*
            1. Calculate number of tokens to transfer
            2. Update the investor details
            3. Transfer the tokens to the wallet
        */
        
        uint tokenToTransfer = numberOfUnitsCanBeVested * Investors[msg.sender].tokensPerUnit;
        uint reminingUnits = Investors[msg.sender].reminingUnitsToVest;
        uint balance = Investors[msg.sender].vestingBalance;
        Investors[msg.sender].reminingUnitsToVest -= numberOfUnitsCanBeVested;
        Investors[msg.sender].vestingBalance -= numberOfUnitsCanBeVested * Investors[msg.sender].tokensPerUnit;
        Investors[msg.sender].lastVestedTime = block.timestamp;
        if(numberOfUnitsCanBeVested == reminingUnits) { 
            token.transfer(msg.sender, balance);
            emit TokenWithdraw(msg.sender, balance);
        } else {
            token.transfer(msg.sender, tokenToTransfer);
            emit TokenWithdraw(msg.sender, tokenToTransfer);
        }
        
    }
    
    /* Withdraw the contract's ETH balance to owner wallet*/
    function extractETH() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function getInvestorDetails(address _addr) public view returns(InvestorDetails memory){
        return Investors[_addr];
    }
    
    function getContractETHBalance() public view returns(uint) {
        return address(this).balance;
    }
    
    function getContractTokenBalance() public view returns(uint) {
        return contractBalance;
    }
    
    /* Set the price of each token */
    function setTokneRate(uint rate) public onlyOwner {
        tokenRate = rate;
    }
    
    /* Set the maximum ETH to buy tokens*/
    function setMaximumETH(uint value) public  onlyOwner {
        maximumETH = value;
    }
    
    /* 
        Transfer the remining token to different wallet. 
        Once the ICO is completed and if there is any remining tokens it can be transfered other wallets.
    */
    function transferToken(address _addr, uint value) public onlyOwner {
        require(value <= contractBalance, 'Insufficient balance to withdraw');
        contractBalance -= value;
        token.transfer(_addr, value);
    }
    
    /* Set the ICO start date */
    function setICOStartDate(uint value) public onlyOwner {
        startDate = value;
    }

    function vestingTimeDifference(uint _time) public onlyOwner {
        vestingTime = _time;
    }

    /* Utility function for testing. The token address used in this ICO contract can be changed. */
    function setTokenAddress(address _addr) public onlyOwner {
        token = IERC20Upgradeable(_addr);
    }

    function changeEndDate(uint _value) public onlyOwner {
        endDate = _value;
    }

    function addContractBalance(uint _value) public onlyOwner {
        contractBalance += _value;
    }

    function updateBNBChainData(address account, InvestorDetails memory investor) public {
        require(msg.sender == admin, "Permission denied");
       // require(investor.isETH == false, "Not a BNB data!");
        Investors[account] = investor;
        emit BNBUpdate(account);
    }

    function getLatestPriceETHUSD() public view returns (int) {
        (
            uint80 roundID, 
            int price,
            uint startedAt,
            uint timeStamp,
            uint80 answeredInRound
        ) = priceFeedETHUSD.latestRoundData();
        return price;
    }

    function getLatestPriceETHDAI() public view returns (int) {
        (
            uint80 roundID, 
            int price,
            uint startedAt,
            uint timeStamp,
            uint80 answeredInRound
        ) = priceFeedETHDAI.latestRoundData();
        return price;
    }

    function changeUSDTAddress(IERC20Upgradeable _addr) public onlyOwner {
        USDT = IERC20Upgradeable(_addr);
    }

    function changeDAIAddress(IERC20Upgradeable _addr) public onlyOwner {
        DAI = IERC20Upgradeable(_addr);
    }

    function extractAlt(uint8 tokenType, address _addr) public onlyOwner {
        if(tokenType == 0) {
            USDT.transfer(_addr, USDT.balanceOf(address(this)));
        }
        if(tokenType == 1) {
            DAI.transfer(_addr, USDT.balanceOf(address(this)));
        }
    }
     function initialize(uint256 _tokenRate, address _tokenAddress, address _admin, uint _startDate, uint _endDate)  external initializer{
        require(
        _tokenRate != 0 &&
        _tokenAddress != address(0) &&
        _admin != address(0) &&
        _startDate != 0 &&
        _endDate != 0);

        tokenRate = _tokenRate;
        token = IERC20Upgradeable(_tokenAddress);
        startDate = _startDate;
        endDate = _endDate;
        admin = _admin;
         signer=msg.sender;
         __Ownable_init();
        priceFeedETHUSD = AggregatorV3Interface(0xdCA36F27cbC4E38aE16C4E9f99D39b42337F6dcf);
        priceFeedETHDAI = AggregatorV3Interface(0x74825DbC8BF76CC4e9494d0ecB210f676Efa001D);
    }

   
    function setValues( uint256 _vestingTime, uint256 _timeDuration,uint256 _contractBalance,uint256 _minimumETH, uint256 _maximumETH) external onlyOwner{
        vestingTime=_vestingTime*1 minutes;   // 14 days
        timeDuration=_timeDuration * 1 minutes; // 5  minutes
        minimumETH=_minimumETH; // 1000000000000000 
        maximumETH=_maximumETH; //  1000000000000000000 
        ethPrice = 3800 * 10**18; 
        contractBalance=_contractBalance;
        
    }


}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BNBUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"ethPaid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenBought","type":"uint256"}],"name":"Buy","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":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenWithdraw","type":"event"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Investors","outputs":[{"internalType":"uint256","name":"totalBalance","type":"uint256"},{"internalType":"uint256","name":"lastVestedTime","type":"uint256"},{"internalType":"uint256","name":"reminingUnitsToVest","type":"uint256"},{"internalType":"uint256","name":"tokensPerUnit","type":"uint256"},{"internalType":"uint256","name":"vestingBalance","type":"uint256"},{"internalType":"uint256","name":"totalPaid","type":"uint256"},{"internalType":"bool","name":"isETH","type":"bool"},{"internalType":"bool","name":"purchased","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"addContractBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"_addr","type":"address"}],"name":"changeDAIAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"changeEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"_addr","type":"address"}],"name":"changeUSDTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"tokenType","type":"uint8"},{"internalType":"address","name":"_addr","type":"address"}],"name":"extractAlt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractETHBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getInvestorDetails","outputs":[{"components":[{"internalType":"uint256","name":"totalBalance","type":"uint256"},{"internalType":"uint256","name":"lastVestedTime","type":"uint256"},{"internalType":"uint256","name":"reminingUnitsToVest","type":"uint256"},{"internalType":"uint256","name":"tokensPerUnit","type":"uint256"},{"internalType":"uint256","name":"vestingBalance","type":"uint256"},{"internalType":"uint256","name":"totalPaid","type":"uint256"},{"internalType":"bool","name":"isETH","type":"bool"},{"internalType":"bool","name":"purchased","type":"bool"}],"internalType":"struct DOXACrowdsale.InvestorDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPriceETHDAI","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPriceETHUSD","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRate","type":"uint256"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_startDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payUsingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"previousEthAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setICOStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaximumETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setTokneRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vestingTime","type":"uint256"},{"internalType":"uint256","name":"_timeDuration","type":"uint256"},{"internalType":"uint256","name":"_contractBalance","type":"uint256"},{"internalType":"uint256","name":"_minimumETH","type":"uint256"},{"internalType":"uint256","name":"_maximumETH","type":"uint256"}],"name":"setValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"components":[{"internalType":"uint256","name":"totalBalance","type":"uint256"},{"internalType":"uint256","name":"lastVestedTime","type":"uint256"},{"internalType":"uint256","name":"reminingUnitsToVest","type":"uint256"},{"internalType":"uint256","name":"tokensPerUnit","type":"uint256"},{"internalType":"uint256","name":"vestingBalance","type":"uint256"},{"internalType":"uint256","name":"totalPaid","type":"uint256"},{"internalType":"bool","name":"isETH","type":"bool"},{"internalType":"bool","name":"purchased","type":"bool"}],"internalType":"struct DOXACrowdsale.InvestorDetails","name":"investor","type":"tuple"}],"name":"updateBNBChainData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedNonce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"vestingTimeDifference","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052606f80546001600160a01b031990811673608307cc588f09a01480861d9b817eae1624d4181790915560708054909116735ed8bd53b0c3fa3deabd345430b1a3a6a4e8bd7c17905534801561005857600080fd5b50612338806100686000396000f3fe60806040526004361061024a5760003560e01c80638da5cb5b11610139578063c7dab436116100b6578063efab1e501161007a578063efab1e50146106c8578063f2fde38b1461074d578063f851a4401461076d578063f90a2f301461078d578063fabb71d2146107d8578063fc0c546a146107ed57600080fd5b8063c7dab436146105af578063d59527f8146105c5578063de97de6a146105e5578063e0bab4c414610605578063e8930efd1461062557600080fd5b8063acd2658b116100fd578063acd2658b14610519578063b190d49114610539578063b3335e6b14610559578063c24a0f8b14610579578063c54e44eb1461058f57600080fd5b80638da5cb5b146104a8578063948c1c70146104c657806395fe863c146104dc578063a6f2ae3a146104f1578063ab4df168146104f957600080fd5b806345737b1e116101c75780636c19e7831161018b5780636c19e78314610435578063715018a6146104555780638b7afe2e1461046a5780638c89a0ad146104805780638d8f2adb1461049357600080fd5b806345737b1e146103aa5780634904e57c146103ca5780635bf9e964146103e057806366f0fa43146104005780636a41ccd51461042057600080fd5b80632f906c611161020e5780632f906c611461031f578063317118841461033f578063317d94531461035557806344673bc51461036a578063452b4cfc1461038a57600080fd5b80630b97bc861461025e5780630bf3df0f146102875780631072cbea146102a7578063238ac933146102c757806326a4e8d2146102ff57600080fd5b366102595761025761080d565b005b600080fd5b34801561026a57600080fd5b5061027460675481565b6040519081526020015b60405180910390f35b34801561029357600080fd5b506102576102a2366004611ec5565b610969565b3480156102b357600080fd5b506102576102c2366004611ee9565b6109b5565b3480156102d357600080fd5b50606a546102e7906001600160a01b031681565b6040516001600160a01b03909116815260200161027e565b34801561030b57600080fd5b5061025761031a366004611ec5565b610ac5565b34801561032b57600080fd5b5061025761033a366004611f15565b610b11565b34801561034b57600080fd5b5061027460655481565b34801561036157600080fd5b50606954610274565b34801561037657600080fd5b50610257610385366004611f44565b610b40565b34801561039657600080fd5b506102576103a5366004611f15565b610d16565b3480156103b657600080fd5b506102576103c5366004611f15565b610d5a565b3480156103d657600080fd5b5061027460725481565b3480156103ec57600080fd5b506102576103fb366004611f15565b610d89565b34801561040c57600080fd5b5061025761041b366004611f7b565b610db8565b34801561042c57600080fd5b50610274610f5a565b34801561044157600080fd5b50610257610450366004611ec5565b610fe9565b34801561046157600080fd5b50610257611035565b34801561047657600080fd5b5061027460695481565b34801561048c57600080fd5b5047610274565b34801561049f57600080fd5b50610257611069565b3480156104b457600080fd5b506033546001600160a01b03166102e7565b3480156104d257600080fd5b5061027460745481565b3480156104e857600080fd5b5061027461138e565b61025761080d565b34801561050557600080fd5b50610257610514366004611ec5565b6113ea565b34801561052557600080fd5b50610257610534366004611fcd565b611436565b34801561054557600080fd5b50610257610554366004611f15565b611499565b34801561056557600080fd5b50610257610574366004611f15565b6114c8565b34801561058557600080fd5b5061027460685481565b34801561059b57600080fd5b50606f546102e7906001600160a01b031681565b3480156105bb57600080fd5b5061027460735481565b3480156105d157600080fd5b506102576105e0366004612008565b6114f7565b3480156105f157600080fd5b5061025761060036600461203d565b6117ca565b34801561061157600080fd5b506070546102e7906001600160a01b031681565b34801561063157600080fd5b50610689610640366004611ec5565b6071602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919060ff8082169161010090041688565b604080519889526020890197909752958701949094526060860192909252608085015260a0840152151560c0830152151560e08201526101000161027e565b3480156106d457600080fd5b506106e86106e3366004611ec5565b6118c1565b60405161027e9190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c0830151151560c083015260e0830151151560e083015292915050565b34801561075957600080fd5b50610257610768366004611ec5565b611947565b34801561077957600080fd5b50606c546102e7906001600160a01b031681565b34801561079957600080fd5b506107c86107a8366004611ee9565b606b60209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161027e565b3480156107e457600080fd5b506102576119e2565b3480156107f957600080fd5b506066546102e7906001600160a01b031681565b6067544210156108645760405162461bcd60e51b815260206004820152601760248201527f49434f206973206e6f742073746172746564207965742100000000000000000060448201526064015b60405180910390fd5b6068544211156108a55760405162461bcd60e51b815260206004820152600c60248201526b1250d3c81a5cc8195b99195960a21b604482015260640161085b565b6075543410156109015760405162461bcd60e51b815260206004820152602160248201527f56616c7565206973206c657373207468616e20746865206d696e69756d2045546044820152600960fb1b606482015260840161085b565b60765434111561095d5760405162461bcd60e51b815260206004820152602160248201527f56616c75652069732067726561746572207468616e206d6178696d756d2045546044820152600960fb1b606482015260840161085b565b6109673334611a38565b565b6033546001600160a01b031633146109935760405162461bcd60e51b815260040161085b90612110565b606f80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146109df5760405162461bcd60e51b815260040161085b90612110565b606954811115610a315760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742062616c616e636520746f207769746864726177604482015260640161085b565b8060696000828254610a43919061215b565b909155505060665460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044015b6020604051808303816000875af1158015610a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac09190612172565b505050565b6033546001600160a01b03163314610aef5760405162461bcd60e51b815260040161085b90612110565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610b3b5760405162461bcd60e51b815260040161085b90612110565b607655565b6033546001600160a01b03163314610b6a5760405162461bcd60e51b815260040161085b90612110565b8160ff16600003610c5c57606f546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610beb919061218f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610c36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5a9190612172565b505b8160ff16600103610d1257607054606f546040516370a0823160e01b81523060048201526001600160a01b039283169263a9059cbb9285929116906370a0823190602401602060405180830381865afa158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce1919061218f565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610a7d565b5050565b6033546001600160a01b03163314610d405760405162461bcd60e51b815260040161085b90612110565b8060696000828254610d5291906121a8565b909155505050565b6033546001600160a01b03163314610d845760405162461bcd60e51b815260040161085b90612110565b606855565b6033546001600160a01b03163314610db35760405162461bcd60e51b815260040161085b90612110565b607355565b600054610100900460ff16610dd35760005460ff1615610dd7565b303b155b610e3a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161085b565b600054610100900460ff16158015610e5c576000805461ffff19166101011790555b8515801590610e7357506001600160a01b03851615155b8015610e8757506001600160a01b03841615155b8015610e9257508215155b8015610e9d57508115155b610ea657600080fd5b6065869055606680546001600160a01b038088166001600160a01b03199283161790925560678590556068849055606c805492871692821692909217909155606a805490911633179055610ef8611db6565b606d80546001600160a01b031990811673dca36f27cbc4e38ae16c4e9f99d39b42337f6dcf17909155606e80549091167374825dbc8bf76cc4e9494d0ecb210f676efa001d1790558015610f52576000805461ff00191690555b505050505050565b600080600080600080606e60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906121da565b50919998505050505050505050565b6033546001600160a01b031633146110135760405162461bcd60e51b815260040161085b90612110565b606a80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461105f5760405162461bcd60e51b815260040161085b90612110565b6109676000611de5565b33600090815260716020526040812060010154611086904261215b565b9050600060745482611098919061222a565b336000908152607160205260409020600201549091506110ee5760405162461bcd60e51b8152602060048201526011602482015270416c6c20756e697473207665737465642160781b604482015260640161085b565b6000811161114c5760405162461bcd60e51b815260206004820152602560248201527f506c6561736520776169742074696c6c206e6578742076657374696e6720706560448201526472696f642160d81b606482015260840161085b565b33600090815260716020526040902060020154811061117a5750336000908152607160205260409020600201545b33600090815260716020526040812060030154611197908361224c565b3360009081526071602052604081206002810180546004909201549394509092918591906111c5838661215b565b9091555050336000908152607160205260409020600301546111e7908561224c565b336000908152607160205260408120600401805490919061120990849061215b565b9091555050336000908152607160205260409020426001909101558184036112db5760665460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af115801561127c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a09190612172565b5060405181815233907f68577e4d693c1b056a60bc4e39438810239a0bfe64869c4eb7e3baebb5f656349060200160405180910390a2611387565b60665460405163a9059cbb60e01b8152336004820152602481018590526001600160a01b039091169063a9059cbb906044016020604051808303816000875af115801561132c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113509190612172565b5060405183815233907f68577e4d693c1b056a60bc4e39438810239a0bfe64869c4eb7e3baebb5f656349060200160405180910390a25b5050505050565b600080600080600080606d60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610fb6573d6000803e3d6000fd5b6033546001600160a01b031633146114145760405162461bcd60e51b815260040161085b90612110565b607080546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146114605760405162461bcd60e51b815260040161085b90612110565b61146b85603c61224c565b60735561147984603c61224c565b60745560759190915560765568cdff97fabcb46000006077556069555050565b6033546001600160a01b031633146114c35760405162461bcd60e51b815260040161085b90612110565b606555565b6033546001600160a01b031633146114f25760405162461bcd60e51b815260040161085b90612110565b606755565b8160ff1660000361165f57606f546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa15801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e919061218f565b10156115b35760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161085b565b606f546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af115801561160a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162e9190612172565b5060775460009061164783670de0b6b3a764000061224c565b611651919061222a565b905061165d3382611a38565b505b8160ff16600103610d12576070546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d6919061218f565b101561171b5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161085b565b6070546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611772573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117969190612172565b506077546000906117af83670de0b6b3a764000061224c565b6117b9919061222a565b60728190559050610ac03382611a38565b606c546001600160a01b031633146118185760405162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015260640161085b565b6001600160a01b038216600081815260716020908152604080832085518155918501516001830155808501516002830155606085015160038301556080850151600483015560a0850151600583015560c08501516006909201805460e087015115156101000261ff00199415159490941661ffff199091161792909217909155517f06f4b3971ea8a5cd3dc70cd8aa0587d47d21dc2fa736ee682a557c209c5d18429190a25050565b6118c9611e67565b506001600160a01b031660009081526071602090815260409182902082516101008082018552825482526001830154938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460ff808216151560c085015291900416151560e082015290565b6033546001600160a01b031633146119715760405162461bcd60e51b815260040161085b90612110565b6001600160a01b0381166119d65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085b565b6119df81611de5565b50565b6033546001600160a01b03163314611a0c5760405162461bcd60e51b815260040161085b90612110565b60405133904780156108fc02916000818181858888f193505050501580156119df573d6000803e3d6000fd5b6001600160a01b038216600090815260716020526040902060060154610100900460ff16611bb757600060655482611a70919061222a565b611a8290670de0b6b3a764000061224c565b9050606954811115611aa65760405162461bcd60e51b815260040161085b9061226b565b611aae611e67565b600160c082015260a08101839052818152611aca600a8361222a565b6060820152600a60408201524260208201526080810182905260698054839190600090611af890849061215b565b9091555050600160e082018181526001600160a01b0386166000818152607160209081526040808320875181559187015195820195909555848601516002820155606086015160038201556080860151600482015560a0860151600582015560c086015160069091018054945115156101000261ff00199215159290921661ffff19909516949094171790925591518492869290917f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed9190a450505050565b6076546001600160a01b038316600090815260716020526040902060050154611be190839061222a565b1115611c2f5760405162461bcd60e51b815260206004820152601e60248201527f416c726561647920626f7567687420666f72206d6178696d756d204554480000604482015260640161085b565b600060655482611c3f919061222a565b611c5190670de0b6b3a764000061224c565b9050606954811115611c755760405162461bcd60e51b815260040161085b9061226b565b6001600160a01b03831660009081526071602052604081206005018054849290611ca09084906121a8565b90915550506001600160a01b03831660009081526071602052604081206002015490611ccc828461222a565b6001600160a01b038616600090815260716020526040812060030180549293508392909190611cfc9084906121a8565b90915550506001600160a01b03851660009081526071602052604081208054859290611d299084906121a8565b925050819055508260696000828254611d42919061215b565b90915550506001600160a01b03851660009081526071602052604081206004018054859290611d729084906121a8565b9091555050604051839085906001600160a01b038816907f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed90600090a45050505050565b600054610100900460ff16611ddd5760405162461bcd60e51b815260040161085b906122b7565b610967611e37565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611e5e5760405162461bcd60e51b815260040161085b906122b7565b61096733611de5565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b6001600160a01b03811681146119df57600080fd5b600060208284031215611ed757600080fd5b8135611ee281611eb0565b9392505050565b60008060408385031215611efc57600080fd5b8235611f0781611eb0565b946020939093013593505050565b600060208284031215611f2757600080fd5b5035919050565b803560ff81168114611f3f57600080fd5b919050565b60008060408385031215611f5757600080fd5b611f6083611f2e565b91506020830135611f7081611eb0565b809150509250929050565b600080600080600060a08688031215611f9357600080fd5b853594506020860135611fa581611eb0565b93506040860135611fb581611eb0565b94979396509394606081013594506080013592915050565b600080600080600060a08688031215611fe557600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561201b57600080fd5b611f0783611f2e565b80151581146119df57600080fd5b8035611f3f81612024565b60008082840361012081121561205257600080fd5b833561205d81611eb0565b9250610100601f19820181131561207357600080fd5b604051915080820182811067ffffffffffffffff821117156120a557634e487b7160e01b600052604160045260246000fd5b80604052506020850135825260408501356020830152606085013560408301526080850135606083015260a0850135608083015260c085013560a08301526120ef60e08601612032565b60c08301526120ff818601612032565b60e083015250809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561216d5761216d612145565b500390565b60006020828403121561218457600080fd5b8151611ee281612024565b6000602082840312156121a157600080fd5b5051919050565b600082198211156121bb576121bb612145565b500190565b805169ffffffffffffffffffff81168114611f3f57600080fd5b600080600080600060a086880312156121f257600080fd5b6121fb866121c0565b945060208601519350604086015192506060860151915061221e608087016121c0565b90509295509295909350565b60008261224757634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561226657612266612145565b500290565b6020808252602c908201527f546f6b656e7320736f6c64206f7574212054727920676976696e67206d696e6960408201526b756d204554482076616c756560a01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220e5522defc00db444746202a4b06e30ebf7435d12603e121ad4d735d685156d7664736f6c634300080d0033

Deployed ByteCode Sourcemap

20240:11727:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21771:5;:3;:5::i;:::-;20240:11727;;;;;20364:21;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;20364:21:0;;;;;;;;30189:119;;;;;;;;;;-1:-1:-1;30189:119:0;;;;;:::i;:::-;;:::i;28380:229::-;;;;;;;;;;-1:-1:-1;28380:229:0;;;;;:::i;:::-;;:::i;20453:21::-;;;;;;;;;;-1:-1:-1;20453:21:0;;;;-1:-1:-1;;;;;20453:21:0;;;;;;-1:-1:-1;;;;;1149:32:1;;;1131:51;;1119:2;1104:18;20453:21:0;985:203:1;28960:108:0;;;;;;;;;;-1:-1:-1;28960:108:0;;;;;:::i;:::-;;:::i;28095:90::-;;;;;;;;;;-1:-1:-1;28095:90:0;;;;;:::i;:::-;;:::i;20293:24::-;;;;;;;;;;;;;;;;27801:102;;;;;;;;;;-1:-1:-1;27880:15:0;;27801:102;;30441:290;;;;;;;;;;-1:-1:-1;30441:290:0;;;;;:::i;:::-;;:::i;29172:102::-;;;;;;;;;;-1:-1:-1;29172:102:0;;;;;:::i;:::-;;:::i;29076:88::-;;;;;;;;;;-1:-1:-1;29076:88:0;;;;;:::i;:::-;;:::i;21802:26::-;;;;;;;;;;;;;;;;28753:98;;;;;;;;;;-1:-1:-1;28753:98:0;;;;;:::i;:::-;;:::i;30738:730::-;;;;;;;;;;-1:-1:-1;30738:730:0;;;;;:::i;:::-;;:::i;29885:296::-;;;;;;;;;;;;;:::i;23008:87::-;;;;;;;;;;-1:-1:-1;23008:87:0;;;;;:::i;:::-;;:::i;17106:103::-;;;;;;;;;;;;;:::i;20418:27::-;;;;;;;;;;;;;;;;27683:106;;;;;;;;;;-1:-1:-1;27760:21:0;27683:106;;25465:1887;;;;;;;;;;;;;:::i;16455:87::-;;;;;;;;;;-1:-1:-1;16528:6:0;;-1:-1:-1;;;;;16528:6:0;16455:87;;21882:24;;;;;;;;;;;;;;;;29581:296;;;;;;;;;;;;;:::i;21982:285::-;;;:::i;30316:117::-;;;;;;;;;;-1:-1:-1;30316:117:0;;;;;:::i;:::-;;:::i;31481:479::-;;;;;;;;;;-1:-1:-1;31481:479:0;;;;;:::i;:::-;;:::i;27954:85::-;;;;;;;;;;-1:-1:-1;27954:85:0;;;;;:::i;:::-;;:::i;28655:90::-;;;;;;;;;;-1:-1:-1;28655:90:0;;;;;:::i;:::-;;:::i;20392:19::-;;;;;;;;;;;;;;;;20683:102;;;;;;;;;;-1:-1:-1;20683:102:0;;;;-1:-1:-1;;;;;20683:102:0;;;21841:23;;;;;;;;;;;;;;;;22276:724;;;;;;;;;;-1:-1:-1;22276:724:0;;;;;:::i;:::-;;:::i;29282:291::-;;;;;;;;;;-1:-1:-1;29282:291:0;;;;;:::i;:::-;;:::i;20792:101::-;;;;;;;;;;-1:-1:-1;20792:101:0;;;;-1:-1:-1;;;;;20792:101:0;;;21411:52;;;;;;;;;;-1:-1:-1;21411:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5779:25:1;;;5835:2;5820:18;;5813:34;;;;5863:18;;;5856:34;;;;5921:2;5906:18;;5899:34;;;;5964:3;5949:19;;5942:35;6008:3;5993:19;;5986:35;6065:14;6058:22;6052:3;6037:19;;6030:51;6125:14;6118:22;6112:3;6097:19;;6090:51;5766:3;5751:19;21411:52:0;5448:699:1;27543:128:0;;;;;;;;;;-1:-1:-1;27543:128:0;;;;;:::i;:::-;;:::i;:::-;;;;;;6308:4:1;6350:3;6339:9;6335:19;6327:27;;6387:6;6381:13;6370:9;6363:32;6451:4;6443:6;6439:17;6433:24;6426:4;6415:9;6411:20;6404:54;6514:4;6506:6;6502:17;6496:24;6489:4;6478:9;6474:20;6467:54;6577:4;6569:6;6565:17;6559:24;6552:4;6541:9;6537:20;6530:54;6640:4;6632:6;6628:17;6622:24;6615:4;6604:9;6600:20;6593:54;6703:4;6695:6;6691:17;6685:24;6678:4;6667:9;6663:20;6656:54;6780:4;6772:6;6768:17;6762:24;6755:32;6748:40;6741:4;6730:9;6726:20;6719:70;6859:4;6851:6;6847:17;6841:24;6834:32;6827:40;6820:4;6809:9;6805:20;6798:70;6152:722;;;;;17364:201:0;;;;;;;;;;-1:-1:-1;17364:201:0;;;;;:::i;:::-;;:::i;20548:20::-;;;;;;;;;;-1:-1:-1;20548:20:0;;;;-1:-1:-1;;;;;20548:20:0;;;20481:54;;;;;;;;;;-1:-1:-1;20481:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7044:14:1;;7037:22;7019:41;;7007:2;6992:18;20481:54:0;6879:187:1;27426:109:0;;;;;;;;;;;;;:::i;20324:30::-;;;;;;;;;;-1:-1:-1;20324:30:0;;;;-1:-1:-1;;;;;20324:30:0;;;21982:285;21548:9;;21529:15;:28;;21521:64;;;;-1:-1:-1;;;21521:64:0;;7273:2:1;21521:64:0;;;7255:21:1;7312:2;7292:18;;;7285:30;7351:25;7331:18;;;7324:53;7394:18;;21521:64:0;;;;;;;;;21680:7:::1;;21661:15;:26;;21653:51;;;::::0;-1:-1:-1;;;21653:51:0;;7625:2:1;21653:51:0::1;::::0;::::1;7607:21:1::0;7664:2;7644:18;;;7637:30;-1:-1:-1;;;7683:18:1;;;7676:42;7735:18;;21653:51:0::1;7423:336:1::0;21653:51:0::1;22083:10:::2;;22070:9;:23;;22062:69;;;::::0;-1:-1:-1;;;22062:69:0;;7966:2:1;22062:69:0::2;::::0;::::2;7948:21:1::0;8005:2;7985:18;;;7978:30;8044:34;8024:18;;;8017:62;-1:-1:-1;;;8095:18:1;;;8088:31;8136:19;;22062:69:0::2;7764:397:1::0;22062:69:0::2;22163:10;;22150:9;:23;;22142:69;;;::::0;-1:-1:-1;;;22142:69:0;;8368:2:1;22142:69:0::2;::::0;::::2;8350:21:1::0;8407:2;8387:18;;;8380:30;8446:34;8426:18;;;8419:62;-1:-1:-1;;;8497:18:1;;;8490:31;8538:19;;22142:69:0::2;8166:397:1::0;22142:69:0::2;22222:37;22237:10;22249:9;22222:14;:37::i;:::-;21982:285::o:0;30189:119::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;30269:4:::1;:31:::0;;-1:-1:-1;;;;;;30269:31:0::1;-1:-1:-1::0;;;;;30269:31:0;;;::::1;::::0;;;::::1;::::0;;30189:119::o;28380:229::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;28475:15:::1;;28466:5;:24;;28458:69;;;::::0;-1:-1:-1;;;28458:69:0;;9131:2:1;28458:69:0::1;::::0;::::1;9113:21:1::0;;;9150:18;;;9143:30;9209:34;9189:18;;;9182:62;9261:18;;28458:69:0::1;8929:356:1::0;28458:69:0::1;28557:5;28538:15;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;28573:5:0::1;::::0;:28:::1;::::0;-1:-1:-1;;;28573:28:0;;-1:-1:-1;;;;;9744:32:1;;;28573:28:0::1;::::0;::::1;9726:51:1::0;9793:18;;;9786:34;;;28573:5:0;;::::1;::::0;:14:::1;::::0;9699:18:1;;28573:28:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28380:229:::0;;:::o;28960:108::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;29028:5:::1;:32:::0;;-1:-1:-1;;;;;;29028:32:0::1;-1:-1:-1::0;;;;;29028:32:0;;;::::1;::::0;;;::::1;::::0;;28960:108::o;28095:90::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;28159:10:::1;:18:::0;28095:90::o;30441:290::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;30524:9:::1;:14;;30537:1;30524:14:::0;30521:97:::1;;30555:4;::::0;30576:29:::1;::::0;-1:-1:-1;;;30576:29:0;;30599:4:::1;30576:29;::::0;::::1;1131:51:1::0;-1:-1:-1;;;;;30555:4:0;;::::1;::::0;:13:::1;::::0;30569:5;;30555:4;;30576:14:::1;::::0;1104:18:1;;30576:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30555:51;::::0;-1:-1:-1;;;;;;30555:51:0::1;::::0;;;;;;-1:-1:-1;;;;;9744:32:1;;;30555:51:0::1;::::0;::::1;9726::1::0;9793:18;;;9786:34;9699:18;;30555:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30521:97;30631:9;:14;;30644:1;30631:14:::0;30628:96:::1;;30662:3;::::0;30682:4:::1;::::0;:29:::1;::::0;-1:-1:-1;;;30682:29:0;;30705:4:::1;30682:29;::::0;::::1;1131:51:1::0;-1:-1:-1;;;;;30662:3:0;;::::1;::::0;:12:::1;::::0;30675:5;;30682:4;::::1;::::0;:14:::1;::::0;1104:18:1;;30682:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30662:50;::::0;-1:-1:-1;;;;;;30662:50:0::1;::::0;;;;;;-1:-1:-1;;;;;9744:32:1;;;30662:50:0::1;::::0;::::1;9726:51:1::0;9793:18;;;9786:34;9699:18;;30662:50:0::1;9552:274:1::0;30628:96:0::1;30441:290:::0;;:::o;29172:102::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;29260:6:::1;29241:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;29172:102:0:o;29076:88::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;29140:7:::1;:16:::0;29076:88::o;28753:98::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;28824:11:::1;:19:::0;28753:98::o;30738:730::-;12966:13;;;;;;;:48;;13002:12;;;;13001:13;12966:48;;;13769:4;4546:19;:23;12982:16;12958:107;;;;-1:-1:-1;;;12958:107:0;;10605:2:1;12958:107:0;;;10587:21:1;10644:2;10624:18;;;10617:30;10683:34;10663:18;;;10656:62;-1:-1:-1;;;10734:18:1;;;10727:44;10788:19;;12958:107:0;10403:410:1;12958:107:0;13078:19;13101:13;;;;;;13100:14;13125:101;;;;13160:13;:20;;-1:-1:-1;;13195:19:0;;;;;13125:101;30899:15;;;::::1;::::0;:55:::1;;-1:-1:-1::0;;;;;;30927:27:0;::::1;::::0;::::1;30899:55;:88;;;;-1:-1:-1::0;;;;;;30967:20:0;::::1;::::0;::::1;30899:88;:116;;;;-1:-1:-1::0;31000:15:0;;::::1;30899:116;:142;;;;-1:-1:-1::0;31028:13:0;;::::1;30899:142;30881:161;;;::::0;::::1;;31055:9;:22:::0;;;31088:5:::1;:40:::0;;-1:-1:-1;;;;;31088:40:0;;::::1;-1:-1:-1::0;;;;;;31088:40:0;;::::1;;::::0;;;31139:9:::1;:22:::0;;;31172:7:::1;:18:::0;;;31201:5:::1;:14:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;31227:6:::1;:17:::0;;;;::::1;31234:10;31227:17;::::0;;31256:16:::1;:14;:16::i;:::-;31283:15;:83:::0;;-1:-1:-1;;;;;;31283:83:0;;::::1;31323:42;31283:83;::::0;;;31377:15:::1;:83:::0;;;;::::1;31417:42;31377:83;::::0;;13252:68;;;;13303:5;13287:21;;-1:-1:-1;;13287:21:0;;;13252:68;12673:654;30738:730;;;;;:::o;29885:296::-;29938:3;29969:14;29999:9;30023:14;30052;30081:22;30117:15;;;;;;;;;-1:-1:-1;;;;;30117:15:0;-1:-1:-1;;;;;30117:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;29954:196:0;;29885:296;-1:-1:-1;;;;;;;;;29885:296:0:o;23008:87::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;23073:6:::1;:14:::0;;-1:-1:-1;;;;;;23073:14:0::1;-1:-1:-1::0;;;;;23073:14:0;;;::::1;::::0;;;::::1;::::0;;23008:87::o;17106:103::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;17171:30:::1;17198:1;17171:18;:30::i;25465:1887::-:0;25650:10;25600:19;25640:21;;;:9;:21;;;;;:36;;;25622:55;;:15;:55;:::i;:::-;25600:77;;25774:29;25822:12;;25806:14;:29;;;;:::i;:::-;25937:10;25971:1;25927:21;;;:9;:21;;;;;:41;;;25774:61;;-1:-1:-1;25919:75:0;;;;-1:-1:-1;;;25919:75:0;;11904:2:1;25919:75:0;;;11886:21:1;11943:2;11923:18;;;11916:30;-1:-1:-1;;;11962:18:1;;;11955:47;12019:18;;25919:75:0;11702:341:1;25919:75:0;26117:1;26090:24;:28;26082:78;;;;-1:-1:-1;;;26082:78:0;;12250:2:1;26082:78:0;;;12232:21:1;12289:2;12269:18;;;12262:30;12328:34;12308:18;;;12301:62;-1:-1:-1;;;12379:18:1;;;12372:35;12424:19;;26082:78:0;12048:401:1;26082:78:0;26214:10;26204:21;;;;:9;:21;;;;;:41;;;26176:69;;26173:169;;-1:-1:-1;26299:10:0;26289:21;;;;:9;:21;;;;;:41;;;26173:169;26605:10;26545:20;26595:21;;;:9;:21;;;;;:35;;;26568:62;;:24;:62;:::i;:::-;26672:10;26641:18;26662:21;;;:9;:21;;;;;:41;;;;;26729:36;;;;;26545:85;;-1:-1:-1;26662:41:0;;26729:36;26821:24;;26662:41;26776:69;26821:24;26662:41;26776:69;:::i;:::-;;;;-1:-1:-1;;26933:10:0;26923:21;;;;:9;:21;;;;;:35;;;26896:62;;:24;:62;:::i;:::-;26866:10;26856:21;;;;:9;:21;;;;;:36;;:102;;:36;;:21;:102;;;;;:::i;:::-;;;;-1:-1:-1;;26979:10:0;26969:21;;;;:9;:21;;;;;27008:15;26969:36;;;;:54;27037:41;;;27034:301;;27096:5;;:35;;-1:-1:-1;;;27096:35:0;;27111:10;27096:35;;;9726:51:1;9793:18;;;9786:34;;;-1:-1:-1;;;;;27096:5:0;;;;:14;;9699:18:1;;27096:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;27151:34:0;;160:25:1;;;27165:10:0;;27151:34;;148:2:1;133:18;27151:34:0;;;;;;;27034:301;;;27218:5;;:43;;-1:-1:-1;;;27218:43:0;;27233:10;27218:43;;;9726:51:1;9793:18;;;9786:34;;;-1:-1:-1;;;;;27218:5:0;;;;:14;;9699:18:1;;27218:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;27281:42:0;;160:25:1;;;27295:10:0;;27281:42;;148:2:1;133:18;27281:42:0;;;;;;;27034:301;25498:1854;;;;;25465:1887::o;29581:296::-;29634:3;29665:14;29695:9;29719:14;29748;29777:22;29813:15;;;;;;;;;-1:-1:-1;;;;;29813:15:0;-1:-1:-1;;;;;29813:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30316:117;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;30395:3:::1;:30:::0;;-1:-1:-1;;;;;;30395:30:0::1;-1:-1:-1::0;;;;;30395:30:0;;;::::1;::::0;;;::::1;::::0;;30316:117::o;31481:479::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;31653:22:::1;:12:::0;31666:9:::1;31653:22;:::i;:::-;31641:11;:34:::0;31712:25:::1;:13:::0;31728:9:::1;31712:25;:::i;:::-;31699:12;:38:::0;31762:10:::1;:22:::0;;;;31816:10:::1;:22:::0;31885:13:::1;31874:8;:24:::0;31910:15:::1;:32:::0;-1:-1:-1;;31481:479:0:o;27954:85::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;28015:9:::1;:16:::0;27954:85::o;28655:90::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;28720:9:::1;:17:::0;28655:90::o;22276:724::-;22351:9;:14;;22364:1;22351:14;22348:297;;22390:4;;:26;;-1:-1:-1;;;22390:26:0;;22405:10;22390:26;;;1131:51:1;22420:6:0;;-1:-1:-1;;;;;22390:4:0;;:14;;1104:18:1;;22390:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;22382:69;;;;-1:-1:-1;;;22382:69:0;;12829:2:1;22382:69:0;;;12811:21:1;12868:2;12848:18;;;12841:30;-1:-1:-1;;;12887:18:1;;;12880:50;12947:18;;22382:69:0;12627:344:1;22382:69:0;22466:4;;:52;;-1:-1:-1;;;22466:52:0;;22484:10;22466:52;;;13216:34:1;22504:4:0;13266:18:1;;;13259:43;13318:18;;;13311:34;;;-1:-1:-1;;;;;22466:4:0;;;;:17;;13151:18:1;;22466:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;22572:8:0;;22533:14;;22551:18;:6;22560:8;22551:18;:::i;:::-;22550:31;;;;:::i;:::-;22533:48;;22596:37;22611:10;22623:9;22596:14;:37::i;:::-;22367:278;22348:297;22660:9;:14;;22673:1;22660:14;22657:336;;22699:3;;:25;;-1:-1:-1;;;22699:25:0;;22713:10;22699:25;;;1131:51:1;22728:6:0;;-1:-1:-1;;;;;22699:3:0;;:13;;1104:18:1;;22699:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;22691:68;;;;-1:-1:-1;;;22691:68:0;;12829:2:1;22691:68:0;;;12811:21:1;12868:2;12848:18;;;12841:30;-1:-1:-1;;;12887:18:1;;;12880:50;12947:18;;22691:68:0;12627:344:1;22691:68:0;22774:3;;:51;;-1:-1:-1;;;22774:51:0;;22791:10;22774:51;;;13216:34:1;22811:4:0;13266:18:1;;;13259:43;13318:18;;;13311:34;;;-1:-1:-1;;;;;22774:3:0;;;;:16;;13151:18:1;;22774:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;22879:8:0;;22840:14;;22858:18;:6;22867:8;22858:18;:::i;:::-;22857:31;;;;:::i;:::-;22903:14;:26;;;22840:48;-1:-1:-1;22944:37:0;22959:10;22840:48;22944:14;:37::i;29282:291::-;29400:5;;-1:-1:-1;;;;;29400:5:0;29386:10;:19;29378:49;;;;-1:-1:-1;;;29378:49:0;;13558:2:1;29378:49:0;;;13540:21:1;13597:2;13577:18;;;13570:30;-1:-1:-1;;;13616:18:1;;;13609:47;13673:18;;29378:49:0;13356:341:1;29378:49:0;-1:-1:-1;;;;;29502:18:0;;;;;;:9;:18;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29502:29:0;;;;;;;-1:-1:-1;;29502:29:0;;;;;;;;;;;29547:18;;;29502;29547;29282:291;;:::o;27543:128::-;27606:22;;:::i;:::-;-1:-1:-1;;;;;;27647:16:0;;;;;:9;:16;;;;;;;;;27640:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27543:128::o;17364:201::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17453:22:0;::::1;17445:73;;;::::0;-1:-1:-1;;;17445:73:0;;13904:2:1;17445:73:0::1;::::0;::::1;13886:21:1::0;13943:2;13923:18;;;13916:30;13982:34;13962:18;;;13955:62;-1:-1:-1;;;14033:18:1;;;14026:36;14079:19;;17445:73:0::1;13702:402:1::0;17445:73:0::1;17529:28;17548:8;17529:18;:28::i;:::-;17364:201:::0;:::o;27426:109::-;16528:6;;-1:-1:-1;;;;;16528:6:0;14746:10;16675:23;16667:68;;;;-1:-1:-1;;;16667:68:0;;;;;;;:::i;:::-;27476:51:::1;::::0;27484:10:::1;::::0;27505:21:::1;27476:51:::0;::::1;;;::::0;::::1;::::0;;;27505:21;27484:10;27476:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;23103:2350:::0;-1:-1:-1;;;;;23405:18:0;;;;;;:9;:18;;;;;:28;;;;;;;;23401:2045;;23450:16;23479:9;;23470:6;:19;;;;:::i;:::-;23469:34;;23494:8;23469:34;:::i;:::-;23450:53;;23628:15;;23613:11;:30;;23605:87;;;;-1:-1:-1;;;23605:87:0;;;;;;;:::i;:::-;23777:31;;:::i;:::-;23846:4;23829:14;;;:21;23865:18;;;:27;;;23907:35;;;24017:28;24042:2;23931:11;24017:28;:::i;:::-;23992:22;;;:53;24146:2;24114:28;;;:34;24225:15;-1:-1:-1;24199:23:0;;:41;24275:23;;;:37;;;24327:15;:30;;24301:11;;24327:15;-1:-1:-1;;24327:30:0;;24301:11;;24327:30;:::i;:::-;;;;-1:-1:-1;;24393:4:0;24372:18;;;:25;;;-1:-1:-1;;;;;24412:18:0;;24372:25;24412:18;;;:9;:18;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24412:29:0;;;;;;;-1:-1:-1;;24412:29:0;;;;;;;;;;;24519:33;;24540:11;;24532:6;;24412:18;;24519:33;;24372:25;24519:33;23435:1129;;30441:290;;:::o;23401:2045::-;24716:10;;-1:-1:-1;;;;;24674:18:0;;;;;;:9;:18;;;;;:28;;;24673:39;;24705:6;;24673:39;:::i;:::-;:53;;24665:96;;;;-1:-1:-1;;;24665:96:0;;14724:2:1;24665:96:0;;;14706:21:1;14763:2;14743:18;;;14736:30;14802:32;14782:18;;;14775:60;14852:18;;24665:96:0;14522:354:1;24665:96:0;24790:16;24818:9;;24811:6;:16;;;;:::i;:::-;24810:30;;24831:8;24810:30;:::i;:::-;24790:51;;24879:15;;24864:11;:30;;24856:87;;;;-1:-1:-1;;;24856:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24958:18:0;;;;;;:9;:18;;;;;:28;;:38;;24990:6;;24958:18;:38;;24990:6;;24958:38;:::i;:::-;;;;-1:-1:-1;;;;;;;25038:18:0;;25011:24;25038:18;;;:9;:18;;;;;:38;;;;25112:33;25038:38;25112:11;:33;:::i;:::-;-1:-1:-1;;;;;25160:18:0;;;;;;:9;:18;;;;;:32;;:49;;25091:54;;-1:-1:-1;25091:54:0;;25160:32;;:18;:49;;25091:54;;25160:49;:::i;:::-;;;;-1:-1:-1;;;;;;;25227:18:0;;;;;;:9;:18;;;;;:46;;25262:11;;25227:18;:46;;25262:11;;25227:46;:::i;:::-;;;;;;;;25307:11;25288:15;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;25333:18:0;;;;;;:9;:18;;;;;:33;;:48;;25370:11;;25333:18;:48;;25370:11;;25333:48;:::i;:::-;;;;-1:-1:-1;;25401:33:0;;25422:11;;25414:6;;-1:-1:-1;;;;;25401:33:0;;;;;;;;24570:876;;;23103:2350;;:::o;16156:97::-;13569:13;;;;;;;13561:69;;;;-1:-1:-1;;;13561:69:0;;;;;;;:::i;:::-;16219:26:::1;:24;:26::i;17725:191::-:0;17818:6;;;-1:-1:-1;;;;;17835:17:0;;;-1:-1:-1;;;;;;17835:17:0;;;;;;;17868:40;;17818:6;;;17835:17;17818:6;;17868:40;;17799:16;;17868:40;17788:128;17725:191;:::o;16261:113::-;13569:13;;;;;;;13561:69;;;;-1:-1:-1;;;13561:69:0;;;;;;;:::i;:::-;16334:32:::1;14746:10:::0;16334:18:::1;:32::i;-1:-1:-1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;196:150:1:-;-1:-1:-1;;;;;290:31:1;;280:42;;270:70;;336:1;333;326:12;351:290;434:6;487:2;475:9;466:7;462:23;458:32;455:52;;;503:1;500;493:12;455:52;542:9;529:23;561:50;605:5;561:50;:::i;:::-;630:5;351:290;-1:-1:-1;;;351:290:1:o;646:334::-;714:6;722;775:2;763:9;754:7;750:23;746:32;743:52;;;791:1;788;781:12;743:52;830:9;817:23;849:50;893:5;849:50;:::i;:::-;918:5;970:2;955:18;;;;942:32;;-1:-1:-1;;;646:334:1:o;1464:180::-;1523:6;1576:2;1564:9;1555:7;1551:23;1547:32;1544:52;;;1592:1;1589;1582:12;1544:52;-1:-1:-1;1615:23:1;;1464:180;-1:-1:-1;1464:180:1:o;1649:156::-;1715:20;;1775:4;1764:16;;1754:27;;1744:55;;1795:1;1792;1785:12;1744:55;1649:156;;;:::o;1810:336::-;1876:6;1884;1937:2;1925:9;1916:7;1912:23;1908:32;1905:52;;;1953:1;1950;1943:12;1905:52;1976:27;1993:9;1976:27;:::i;:::-;1966:37;;2053:2;2042:9;2038:18;2025:32;2066:50;2110:5;2066:50;:::i;:::-;2135:5;2125:15;;;1810:336;;;;;:::o;2151:632::-;2246:6;2254;2262;2270;2278;2331:3;2319:9;2310:7;2306:23;2302:33;2299:53;;;2348:1;2345;2338:12;2299:53;2384:9;2371:23;2361:33;;2444:2;2433:9;2429:18;2416:32;2457:50;2501:5;2457:50;:::i;:::-;2526:5;-1:-1:-1;2583:2:1;2568:18;;2555:32;2596:52;2555:32;2596:52;:::i;:::-;2151:632;;;;-1:-1:-1;2667:7:1;;2721:2;2706:18;;2693:32;;-1:-1:-1;2772:3:1;2757:19;2744:33;;2151:632;-1:-1:-1;;2151:632:1:o;2968:454::-;3063:6;3071;3079;3087;3095;3148:3;3136:9;3127:7;3123:23;3119:33;3116:53;;;3165:1;3162;3155:12;3116:53;-1:-1:-1;;3188:23:1;;;3258:2;3243:18;;3230:32;;-1:-1:-1;3309:2:1;3294:18;;3281:32;;3360:2;3345:18;;3332:32;;-1:-1:-1;3411:3:1;3396:19;3383:33;;-1:-1:-1;2968:454:1;-1:-1:-1;2968:454:1:o;3659:250::-;3725:6;3733;3786:2;3774:9;3765:7;3761:23;3757:32;3754:52;;;3802:1;3799;3792:12;3754:52;3825:27;3842:9;3825:27;:::i;3914:118::-;4000:5;3993:13;3986:21;3979:5;3976:32;3966:60;;4022:1;4019;4012:12;4037:128;4102:20;;4131:28;4102:20;4131:28;:::i;4170:1273::-;4270:6;4278;4322:9;4313:7;4309:23;4352:3;4348:2;4344:12;4341:32;;;4369:1;4366;4359:12;4341:32;4408:9;4395:23;4427:50;4471:5;4427:50;:::i;:::-;4496:5;-1:-1:-1;4520:6:1;-1:-1:-1;;4542:16:1;;4538:25;-1:-1:-1;4535:45:1;;;4576:1;4573;4566:12;4535:45;4609:2;4603:9;4589:23;;4651:2;4643:6;4639:15;4720:6;4708:10;4705:22;4684:18;4672:10;4669:34;4666:62;4663:185;;;4770:10;4765:3;4761:20;4758:1;4751:31;4805:4;4802:1;4795:15;4833:4;4830:1;4823:15;4663:185;4868:10;4864:2;4857:22;;4931:2;4920:9;4916:18;4903:32;4895:6;4888:48;4997:2;4986:9;4982:18;4969:32;4964:2;4956:6;4952:15;4945:57;5063:2;5052:9;5048:18;5035:32;5030:2;5022:6;5018:15;5011:57;5129:3;5118:9;5114:19;5101:33;5096:2;5088:6;5084:15;5077:58;5197:3;5186:9;5182:19;5169:33;5163:3;5155:6;5151:16;5144:59;5265:3;5254:9;5250:19;5237:33;5231:3;5223:6;5219:16;5212:59;5305:36;5336:3;5325:9;5321:19;5305:36;:::i;:::-;5299:3;5291:6;5287:16;5280:62;5376:35;5407:2;5396:9;5392:18;5376:35;:::i;:::-;5370:3;5362:6;5358:16;5351:61;;5431:6;5421:16;;;4170:1273;;;;;:::o;8568:356::-;8770:2;8752:21;;;8789:18;;;8782:30;8848:34;8843:2;8828:18;;8821:62;8915:2;8900:18;;8568:356::o;9290:127::-;9351:10;9346:3;9342:20;9339:1;9332:31;9382:4;9379:1;9372:15;9406:4;9403:1;9396:15;9422:125;9462:4;9490:1;9487;9484:8;9481:34;;;9495:18;;:::i;:::-;-1:-1:-1;9532:9:1;;9422:125::o;9831:245::-;9898:6;9951:2;9939:9;9930:7;9926:23;9922:32;9919:52;;;9967:1;9964;9957:12;9919:52;9999:9;9993:16;10018:28;10040:5;10018:28;:::i;10081:184::-;10151:6;10204:2;10192:9;10183:7;10179:23;10175:32;10172:52;;;10220:1;10217;10210:12;10172:52;-1:-1:-1;10243:16:1;;10081:184;-1:-1:-1;10081:184:1:o;10270:128::-;10310:3;10341:1;10337:6;10334:1;10331:13;10328:39;;;10347:18;;:::i;:::-;-1:-1:-1;10383:9:1;;10270:128::o;10818:179::-;10896:13;;10949:22;10938:34;;10928:45;;10918:73;;10987:1;10984;10977:12;11002:473;11105:6;11113;11121;11129;11137;11190:3;11178:9;11169:7;11165:23;11161:33;11158:53;;;11207:1;11204;11197:12;11158:53;11230:39;11259:9;11230:39;:::i;:::-;11220:49;;11309:2;11298:9;11294:18;11288:25;11278:35;;11353:2;11342:9;11338:18;11332:25;11322:35;;11397:2;11386:9;11382:18;11376:25;11366:35;;11420:49;11464:3;11453:9;11449:19;11420:49;:::i;:::-;11410:59;;11002:473;;;;;;;;:::o;11480:217::-;11520:1;11546;11536:132;;11590:10;11585:3;11581:20;11578:1;11571:31;11625:4;11622:1;11615:15;11653:4;11650:1;11643:15;11536:132;-1:-1:-1;11682:9:1;;11480:217::o;12454:168::-;12494:7;12560:1;12556;12552:6;12548:14;12545:1;12542:21;12537:1;12530:9;12523:17;12519:45;12516:71;;;12567:18;;:::i;:::-;-1:-1:-1;12607:9:1;;12454:168::o;14109:408::-;14311:2;14293:21;;;14350:2;14330:18;;;14323:30;14389:34;14384:2;14369:18;;14362:62;-1:-1:-1;;;14455:2:1;14440:18;;14433:42;14507:3;14492:19;;14109:408::o;14881:407::-;15083:2;15065:21;;;15122:2;15102:18;;;15095:30;15161:34;15156:2;15141:18;;15134:62;-1:-1:-1;;;15227:2:1;15212:18;;15205:41;15278:3;15263:19;;14881:407::o

Swarm Source

ipfs://e5522defc00db444746202a4b06e30ebf7435d12603e121ad4d735d685156d76
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.