ETH Price: $3,815.01 (-4.43%)

Contract

0x1766d076ae227443B98AA836Bd43895ADd6B0AB4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Any Leg...185339732023-11-09 11:04:59396 days ago1699527899IN
0x1766d076...ADd6B0AB4
0 ETH0.0022801833.01741203
Transfer Any ERC...185339542023-11-09 11:01:11396 days ago1699527671IN
0x1766d076...ADd6B0AB4
0 ETH0.0012330530.15308794
Withdraw All Tok...184709372023-10-31 15:15:11405 days ago1698765311IN
0x1766d076...ADd6B0AB4
0 ETH0.0016419944.55535166
Withdraw All Tok...184709342023-10-31 15:14:35405 days ago1698765275IN
0x1766d076...ADd6B0AB4
0 ETH0.002591545.02807384
Withdraw All Tok...183980162023-10-21 10:13:35415 days ago1697883215IN
0x1766d076...ADd6B0AB4
0 ETH0.0003826.63751196
Remove Votes183980122023-10-21 10:12:47415 days ago1697883167IN
0x1766d076...ADd6B0AB4
0 ETH0.000168256.85958126
Withdraw All Tok...183980072023-10-21 10:11:47415 days ago1697883107IN
0x1766d076...ADd6B0AB4
0 ETH0.000268646.90178221
Withdraw All Tok...183980052023-10-21 10:11:23415 days ago1697883083IN
0x1766d076...ADd6B0AB4
0 ETH0.0004346311.16619814
Withdraw All Tok...183980022023-10-21 10:10:47415 days ago1697883047IN
0x1766d076...ADd6B0AB4
0 ETH0.000268096.88771336
Withdraw All Tok...183979992023-10-21 10:10:11415 days ago1697883011IN
0x1766d076...ADd6B0AB4
0 ETH0.0004712112.10606428
Withdraw All Tok...183979952023-10-21 10:09:23415 days ago1697882963IN
0x1766d076...ADd6B0AB4
0 ETH0.0006920312.02426679
Withdraw All Tok...183979792023-10-21 10:06:11415 days ago1697882771IN
0x1766d076...ADd6B0AB4
0 ETH0.000302337.76720559
Withdraw All Tok...183979762023-10-21 10:05:35415 days ago1697882735IN
0x1766d076...ADd6B0AB4
0 ETH0.000260186.68446715
Withdraw All Tok...183979692023-10-21 10:04:11415 days ago1697882651IN
0x1766d076...ADd6B0AB4
0 ETH0.00027517.06781793
Withdraw All Tok...183979672023-10-21 10:03:47415 days ago1697882627IN
0x1766d076...ADd6B0AB4
0 ETH0.00027377.03173681
Withdraw All Tok...183979632023-10-21 10:02:59415 days ago1697882579IN
0x1766d076...ADd6B0AB4
0 ETH0.000359016.23793436
Withdraw All Tok...183979522023-10-21 10:00:47415 days ago1697882447IN
0x1766d076...ADd6B0AB4
0 ETH0.000398026.91581322
Withdraw All Tok...183979342023-10-21 9:57:11415 days ago1697882231IN
0x1766d076...ADd6B0AB4
0 ETH0.000431377.49534306
Withdraw All Tok...183979292023-10-21 9:56:11415 days ago1697882171IN
0x1766d076...ADd6B0AB4
0 ETH0.00026516.81076497
Withdraw All Tok...183979062023-10-21 9:51:35415 days ago1697881895IN
0x1766d076...ADd6B0AB4
0 ETH0.00026966.66469509
Add Votes183770962023-10-18 11:59:47418 days ago1697630387IN
0x1766d076...ADd6B0AB4
0 ETH0.00096328.41750283
Add Votes183770562023-10-18 11:51:47418 days ago1697629907IN
0x1766d076...ADd6B0AB4
0 ETH0.001083959.47176095
Add Votes183757102023-10-18 7:19:23418 days ago1697613563IN
0x1766d076...ADd6B0AB4
0 ETH0.000729846.37881903
Add Votes183756852023-10-18 7:14:23418 days ago1697613263IN
0x1766d076...ADd6B0AB4
0 ETH0.000918557.70567858
Add Votes183707162023-10-17 14:33:47419 days ago1697553227IN
0x1766d076...ADd6B0AB4
0 ETH0.0016446114.37087974
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Governance

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-23
*/

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity 0.6.11;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

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

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

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

interface Token {
    function approve(address, uint) external returns (bool);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address, address, uint) external returns (bool);
    function transfer(address, uint) external returns (bool);
}

interface LegacyToken {
    function transfer(address, uint) external;
}

interface StakingPool {
    function disburseRewardTokens() external;
    function burnRewardTokens() external;
    function transferOwnership(address) external;
    function transferAnyERC20Token(address, address, uint) external;
    function transferAnyOldERC20Token(address, address, uint) external;
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;
    address public pendingOwner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }
    
    /**
   * @dev Throws if called by any account other than the owner.
   */
    modifier onlyPendingOwner() {
        assert(msg.sender != address(0));
        require(msg.sender == pendingOwner);
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
    * @dev Allows the current owner to transfer control of the contract to a newOwner.
    * @param _newOwner The address to transfer ownership to.
    */
    function transferOwnership(address _newOwner) public onlyOwner {
        require(_newOwner != address(0));
        pendingOwner = _newOwner;
    }
  
    /**
    * @dev Allows the pendingOwner address to finalize the transfer.
    */
    function claimOwnership() onlyPendingOwner public {
        _transferOwnership(pendingOwner);
        pendingOwner = address(0);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


/**
 * @title Governance
 * @dev Governance smart contract for staking pools
 * Takes in DYP as votes
 * Allows addition and removal of votes during a proposal is open
 * Allows withdrawal of all dyp once the latest voted proposal of a user is closed
 * Has a QUORUM requirement for proposals to be executed
 * CONTRACT VARIABLES must be changed to appropriate values before live deployment
 */
contract Governance is Ownable {
    using SafeMath for uint;
    using Address for address;
    // Contracts are not allowed to deposit, claim or withdraw
    modifier noContractsAllowed() {
        require(!(address(msg.sender).isContract()) && tx.origin == msg.sender, "No Contracts Allowed!");
        _;
    }
    
    // ============== CONTRACT VARIABLES ==============
    
    // voting token contract address
    address public constant TRUSTED_TOKEN_ADDRESS = 0x961C8c0B1aaD0c0b10a51FeF6a867E3091BCef17;
    
    // minimum number of votes required for a result to be valid
    // 1 token = 1 vote
    uint public QUORUM = 25000e18;
    
    uint public constant ADMIN_FEATURES_EXPIRE_AFTER = 180 days;
    
    // Admin can transfer out Governance Tokens from this contract ADMIN_CAN_CLAIM_AFTER
    // duration since creation
    uint public constant ADMIN_CAN_CLAIM_AFTER = 395 days;
    
    // minimum number of tokens required to initialize a proposal
    uint public MIN_BALANCE_TO_INIT_PROPOSAL = 5000e18;
    
    // duration since proposal creation till users can vote
    uint public constant VOTE_DURATION = 3 days;
    
    // duration after voting, since a proposal has passed
    // during which the proposed action may be executed
    uint public constant RESULT_EXECUTION_ALLOWANCE_PERIOD = 3 days;
    
    // ============ END CONTRACT VARIABLES ============
    
    uint public immutable contractStartTime;
    
    event PoolCallSucceeded(StakingPool);
    event PoolCallReverted(StakingPool, string);
    event PoolCallReverted(StakingPool, bytes);
    
    enum PoolGroupName {
        WETH,
        WBTC,
        USDT,
        USDC
    }
    
    enum Action {
        DISBURSE_OR_BURN,
        UPGRADE_GOVERNANCE,
        CHANGE_QUORUM,
        TEXT_PROPOSAL,
        CHANGE_MIN_BALANCE_TO_INIT_PROPOSAL
    }
    
    enum Option {
        ONE, // disburse | yes
        TWO // burn | no
    }
    
    mapping (PoolGroupName => StakingPool[4]) public hardcodedStakingPools;
    
    constructor() public {
        contractStartTime = now;
        
        hardcodedStakingPools[PoolGroupName.WETH][0] = StakingPool(0xa7d6F5fa9b0be0e98b3b40E6aC884e53F2F9460e);
        hardcodedStakingPools[PoolGroupName.WETH][1] = StakingPool(0x0b0A544AE6131801522E3aC1FBAc6D311094c94c);
        hardcodedStakingPools[PoolGroupName.WETH][2] = StakingPool(0x16cAaD63BDFC3Ec4A2850336B28efE17e802b896);
        hardcodedStakingPools[PoolGroupName.WETH][3] = StakingPool(0x512FF8739d39e55d75d80046921E7dE20c3e9BFf);
        
        hardcodedStakingPools[PoolGroupName.WBTC][0] = StakingPool(0xeF71DE5Cb40f7985FEb92AA49D8e3E84063Af3BB);
        hardcodedStakingPools[PoolGroupName.WBTC][1] = StakingPool(0x8B0e324EEdE360CaB670a6AD12940736d74f701e);
        hardcodedStakingPools[PoolGroupName.WBTC][2] = StakingPool(0x78e2dA2eda6dF49BaE46E3B51528BAF5c106e654);
        hardcodedStakingPools[PoolGroupName.WBTC][3] = StakingPool(0x350F3fE979bfad4766298713c83b387C2D2D7a7a);
        
        hardcodedStakingPools[PoolGroupName.USDT][0] = StakingPool(0x4a76Fc15D3fbf3855127eC5DA8AAf02DE7ca06b3);
        hardcodedStakingPools[PoolGroupName.USDT][1] = StakingPool(0xF4abc60a08B546fA879508F4261eb4400B55099D);
        hardcodedStakingPools[PoolGroupName.USDT][2] = StakingPool(0x13F421Aa823f7D90730812a33F8Cac8656E47dfa);
        hardcodedStakingPools[PoolGroupName.USDT][3] = StakingPool(0x86690BbE7a9683A8bAd4812C2e816fd17bC9715C);
        
        hardcodedStakingPools[PoolGroupName.USDC][0] = StakingPool(0x2b5D7a865A3888836d15d69dCCBad682663DCDbb);
        hardcodedStakingPools[PoolGroupName.USDC][1] = StakingPool(0xa52250f98293c17C894d58cf4f78c925dC8955d0);
        hardcodedStakingPools[PoolGroupName.USDC][2] = StakingPool(0x924BECC8F4059987E4bc4B741B7C354FF52c25e4);
        hardcodedStakingPools[PoolGroupName.USDC][3] = StakingPool(0xbE528593781988974D83C2655CBA4c45FC75c033);
    }
    
    
    
    // proposal id => action
    mapping (uint => Action) public actions;
    
    // proposal id => option one votes
    mapping (uint => uint) public optionOneVotes;
    
    // proposal id => option two votes
    mapping (uint => uint) public optionTwoVotes;
    
    // proposal id => staking pool
    mapping (uint => StakingPool[]) public stakingPools;
    
    // proposal id => newGovernance
    mapping (uint => address) public newGovernances;
    
    // proposal id => unix time for proposal start
    mapping (uint => uint) public proposalStartTime;
    
    // proposal id => bool
    mapping (uint => bool) public isProposalExecuted;
    
    mapping (uint => uint) public newQuorums;
    mapping (uint => uint) public newMinBalances;
    mapping (uint => string) public proposalTexts;
    
    // address user => total deposited DYP
    mapping (address => uint) public totalDepositedTokens;
    
    // address user => uint proposal id => uint vote amounts
    mapping (address => mapping (uint => uint)) public votesForProposalByAddress;
    
    // address user => uint proposal id => Option voted for option
    mapping (address => mapping (uint => Option)) public votedForOption;
    
    // address user => start time for the latest proposal the user voted on
    mapping (address => uint) public lastVotedProposalStartTime;
    
    // uint last proposal id
    // proposal ids start at 1
    uint public lastIndex = 0;
    
    // view function to get proposal details
    function getProposal(uint proposalId) external view returns (
        uint _proposalId, 
        Action _proposalAction,
        uint _optionOneVotes,
        uint _optionTwoVotes,
        StakingPool[] memory _stakingPool,
        address _newGovernance,
        uint _proposalStartTime,
        bool _isProposalExecuted,
        uint _newQuorum,
        string memory _proposalText,
        uint _newMinBalance
        ) {
        _proposalId = proposalId;
        _proposalAction = actions[proposalId];
        _optionOneVotes = optionOneVotes[proposalId];
        _optionTwoVotes = optionTwoVotes[proposalId];
        _stakingPool = stakingPools[proposalId];
        _newGovernance = newGovernances[proposalId];
        _proposalStartTime = proposalStartTime[proposalId];
        _isProposalExecuted = isProposalExecuted[proposalId];
        _newQuorum = newQuorums[proposalId];
        _proposalText = proposalTexts[proposalId];
        _newMinBalance = newMinBalances[proposalId];
    }
    
    function changeQuorum(uint newQuorum) external onlyOwner {
        require(now < contractStartTime.add(ADMIN_FEATURES_EXPIRE_AFTER), "Change quorum feature expired!");
        QUORUM = newQuorum;
    }
    
    function changeMinBalanceToInitProposal(uint newMinBalanceToInitProposal) external onlyOwner {
        require(now < contractStartTime.add(ADMIN_FEATURES_EXPIRE_AFTER), "This admin feature has expired!");
        MIN_BALANCE_TO_INIT_PROPOSAL = newMinBalanceToInitProposal;
    }
    
    // Any DYP holder with a minimum required DYP balance may initiate a proposal
    // with the TEXT_PROPOSAL action for a given staking pool
    function proposeText(string memory text) external noContractsAllowed {
        require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance");
        lastIndex = lastIndex.add(1);
        proposalStartTime[lastIndex] = now;
        actions[lastIndex] = Action.TEXT_PROPOSAL;
        proposalTexts[lastIndex] = text;
    }
    
    // Any DYP holder with a minimum required DYP balance may initiate a proposal
    // with the DISBURSE_OR_BURN action for a given staking pool
    function proposeDisburseOrBurn(PoolGroupName poolGroupName) external noContractsAllowed {
        require(poolGroupName == PoolGroupName.WETH ||
                poolGroupName == PoolGroupName.WBTC ||
                poolGroupName == PoolGroupName.USDT ||
                poolGroupName == PoolGroupName.USDC, "Invalid Pool Group Name!");
        require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance");
        lastIndex = lastIndex.add(1);
        
        stakingPools[lastIndex] = hardcodedStakingPools[poolGroupName];
        
        proposalStartTime[lastIndex] = now;
        actions[lastIndex] = Action.DISBURSE_OR_BURN;
    }
    
    // Admin may initiate a proposal
    // with the UPGRADE_GOVERNANCE action for a given staking pool
    function proposeUpgradeGovernance(PoolGroupName poolGroupName, address newGovernance) external noContractsAllowed onlyOwner {
        require(poolGroupName == PoolGroupName.WETH ||
                poolGroupName == PoolGroupName.WBTC ||
                poolGroupName == PoolGroupName.USDT ||
                poolGroupName == PoolGroupName.USDC, "Invalid Pool Group Name!");
                
        require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance");
        lastIndex = lastIndex.add(1);
        
        stakingPools[lastIndex] = hardcodedStakingPools[poolGroupName];
        
        newGovernances[lastIndex] = newGovernance;
        proposalStartTime[lastIndex] = now;
        actions[lastIndex] = Action.UPGRADE_GOVERNANCE;
    }
    
    // Admin may initiate a proposal
    // with the CHANGE_QUORUM action for the Governance
    function proposeNewQuorum(uint newQuorum) external noContractsAllowed onlyOwner {
        require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance");
        lastIndex = lastIndex.add(1);
        newQuorums[lastIndex] = newQuorum;
        proposalStartTime[lastIndex] = now;
        actions[lastIndex] = Action.CHANGE_QUORUM;
    }
    
    // Admin may initiate a proposal
    // with the CHANGE_MIN_BALANCE_TO_INIT_PROPOSAL action for the Governance
    function proposeNewMinBalanceToInitProposal(uint newMinBalance) external noContractsAllowed onlyOwner {
        require(Token(TRUSTED_TOKEN_ADDRESS).balanceOf(msg.sender) >= MIN_BALANCE_TO_INIT_PROPOSAL, "Insufficient Governance Token Balance");
        lastIndex = lastIndex.add(1);
        newMinBalances[lastIndex] = newMinBalance;
        proposalStartTime[lastIndex] = now;
        actions[lastIndex] = Action.CHANGE_MIN_BALANCE_TO_INIT_PROPOSAL;
    }
    
    // Any DYP holder may add votes for a particular open proposal, 
    // with options YES / NO | DISBURSE / BURN | ONE / TWO
    // with `amount` DYP, each DYP unit corresponds to one vote unit
    
    // If user has already voted for a proposal with an option,
    // user may not add votes with another option, 
    // they will need to add votes for the same option
    function addVotes(uint proposalId, Option option, uint amount) external noContractsAllowed {
        require(amount > 0, "Cannot add 0 votes!");
        require(isProposalOpen(proposalId), "Proposal is closed!");
        
        require(Token(TRUSTED_TOKEN_ADDRESS).transferFrom(msg.sender, address(this), amount), "transferFrom failed!");
        
        // if user is voting for this proposal first time
        if (votesForProposalByAddress[msg.sender][proposalId] == 0) {
            votedForOption[msg.sender][proposalId] = option;
        } else {
            if (votedForOption[msg.sender][proposalId] != option) {
                revert("Cannot vote for both options!");
            }
        }
        
        if (option == Option.ONE) {
            optionOneVotes[proposalId] = optionOneVotes[proposalId].add(amount);
        } else {
            optionTwoVotes[proposalId] = optionTwoVotes[proposalId].add(amount);
        }
        totalDepositedTokens[msg.sender] = totalDepositedTokens[msg.sender].add(amount);
        votesForProposalByAddress[msg.sender][proposalId] = votesForProposalByAddress[msg.sender][proposalId].add(amount);
        
        if (lastVotedProposalStartTime[msg.sender] < proposalStartTime[proposalId]) {
            lastVotedProposalStartTime[msg.sender] = proposalStartTime[proposalId];
        }
    }
    
    // Any voter may remove their votes (DYP) from any proposal they voted for 
    // only when the proposal is open - removing votes refund DYP to user and deduct their votes
    function removeVotes(uint proposalId, uint amount) external noContractsAllowed {
        require(amount > 0, "Cannot remove 0 votes!");
        require(isProposalOpen(proposalId), "Proposal is closed!");
        
        require(amount <= votesForProposalByAddress[msg.sender][proposalId], "Cannot remove more tokens than deposited!");
        
        votesForProposalByAddress[msg.sender][proposalId] = votesForProposalByAddress[msg.sender][proposalId].sub(amount);
        totalDepositedTokens[msg.sender] = totalDepositedTokens[msg.sender].sub(amount);
        
        if (votedForOption[msg.sender][proposalId] == Option.ONE) {
            optionOneVotes[proposalId] = optionOneVotes[proposalId].sub(amount);
        } else {
            optionTwoVotes[proposalId] = optionTwoVotes[proposalId].sub(amount);
        }
        
        require(Token(TRUSTED_TOKEN_ADDRESS).transfer(msg.sender, amount), "transfer failed");
    }

    // After the latest proposal the user voted for, is closed for voting,
    // The user may remove all DYP they added to this contract
    function withdrawAllTokens() external noContractsAllowed {
        require(now > lastVotedProposalStartTime[msg.sender].add(VOTE_DURATION), "Tokens are still in voting!");
        require(Token(TRUSTED_TOKEN_ADDRESS).transfer(msg.sender, totalDepositedTokens[msg.sender]), "transfer failed!");
        totalDepositedTokens[msg.sender] = 0;
    }
    
    // After votes for a proposal are closed, the proposal may be executed by anyone
    // If QUORUM is not reached, transaction must revert
    // If winning option has more votes than losing option, winning action is executed
    // Else losing action is executed
    // Each proposal may be executed only once
    function executeProposal(uint proposalId) external noContractsAllowed {
        require (actions[proposalId] != Action.TEXT_PROPOSAL, "Cannot programmatically execute text proposals");
        require (optionOneVotes[proposalId] != optionTwoVotes[proposalId], "This is a TIE! Cannot execute!");
        require (isProposalExecutible(proposalId), "Proposal Expired!");
        
        isProposalExecuted[proposalId] = true;
    
        Option winningOption;
        uint winningOptionVotes;
        
        if (optionOneVotes[proposalId] > optionTwoVotes[proposalId]) {
            winningOption = Option.ONE;
            winningOptionVotes = optionOneVotes[proposalId];
        } else {
            winningOption = Option.TWO;
            winningOptionVotes = optionTwoVotes[proposalId];
        }
        
        // no action will be taken if winningOptionVotes are less than QUORUM
        if (winningOptionVotes < QUORUM) {
            revert("QUORUM not reached!");
        }
        
        if (actions[proposalId] == Action.DISBURSE_OR_BURN) {
            if (winningOption == Option.ONE) {
                for (uint8 i = 0; i < 4; i++) {
                    StakingPool pool = stakingPools[proposalId][i];
                    try pool.disburseRewardTokens() {
                        emit PoolCallSucceeded(pool);
                    } catch Error(string memory reason) {
                        emit PoolCallReverted(pool, reason);
                    } catch (bytes memory lowLevelData) {
                        emit PoolCallReverted(pool, lowLevelData);
                    }
                }
            } else {
                for (uint8 i = 0; i < 4; i++) {
                    StakingPool pool = stakingPools[proposalId][i];
                    try pool.burnRewardTokens() {
                        emit PoolCallSucceeded(pool);
                    } catch Error(string memory reason) {
                        emit PoolCallReverted(pool, reason);
                    } catch (bytes memory lowLevelData) {
                        emit PoolCallReverted(pool, lowLevelData);
                    }
                }
            }
        } else if (actions[proposalId] == Action.UPGRADE_GOVERNANCE) {
            if (winningOption == Option.ONE) {
                for (uint8 i = 0; i < 4; i++) {
                    StakingPool pool = stakingPools[proposalId][i];
                    try pool.transferOwnership(newGovernances[proposalId]) {
                        emit PoolCallSucceeded(pool);
                    } catch Error(string memory reason) {
                        emit PoolCallReverted(pool, reason);
                    } catch (bytes memory lowLevelData) {
                        emit PoolCallReverted(pool, lowLevelData);
                    }
                }
            }
        } else if (actions[proposalId] == Action.CHANGE_QUORUM) {
            if (winningOption == Option.ONE) {
                QUORUM = newQuorums[proposalId];
            }
        } else if (actions[proposalId] == Action.CHANGE_MIN_BALANCE_TO_INIT_PROPOSAL) {
            if (winningOption == Option.ONE) {
                MIN_BALANCE_TO_INIT_PROPOSAL = newMinBalances[proposalId];
            }
        }
    }
    
    // view function to know whether voting for a particular proposal is open
    function isProposalOpen(uint proposalId) public view returns (bool) {
        if (now < proposalStartTime[proposalId].add(VOTE_DURATION)) {
            return true;
        }
        return false;
    }
    
    // View function to know whether voting for a proposal is closed AND 
    // The proposal is within the RESULT_EXECUTION_ALLOWANCE_PERIOD AND
    // Has not been executed yet
    function isProposalExecutible(uint proposalId) public view returns (bool) {
        if ((!isProposalOpen(proposalId)) && 
            (now < proposalStartTime[proposalId].add(VOTE_DURATION).add(RESULT_EXECUTION_ALLOWANCE_PERIOD)) &&
            !isProposalExecuted[proposalId] &&
            optionOneVotes[proposalId] != optionTwoVotes[proposalId]) {
                return true;
            }
        return false;
    }
    
    // function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake)
    // Admin cannot transfer out reward tokens from this smart contract
    function transferAnyERC20Token(address tokenAddress, address recipient, uint amount) external onlyOwner {
        require (tokenAddress != TRUSTED_TOKEN_ADDRESS || now > contractStartTime.add(ADMIN_CAN_CLAIM_AFTER), "Cannot Transfer Out main tokens!");
        require (Token(tokenAddress).transfer(recipient, amount), "Transfer failed!");
    }
    
    // function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake)
    // Admin cannot transfer out reward tokens from this smart contract
    function transferAnyLegacyERC20Token(address tokenAddress, address recipient, uint amount) external onlyOwner {
        require (tokenAddress != TRUSTED_TOKEN_ADDRESS || now > contractStartTime.add(ADMIN_CAN_CLAIM_AFTER), "Cannot Transfer Out main tokens!");
        LegacyToken(tokenAddress).transfer(recipient, amount);
    }
    
    // function to allow admin to claim *other* ERC20 tokens sent to pool contract (by mistake)
    // Admin cannot transfer out reward tokens from this smart contract
    function transferAnyERC20TokenFromPool(address pool, address tokenAddress, address recipient, uint amount) external onlyOwner {
        StakingPool(pool).transferAnyERC20Token(tokenAddress, recipient, amount);
    }
    
    // function to allow admin to claim *other* ERC20 tokens sent to pool contract (by mistake)
    // Admin cannot transfer out reward tokens from this smart contract
    function transferAnyLegacyERC20TokenFromPool(address pool, address tokenAddress, address recipient, uint amount) external onlyOwner {
        StakingPool(pool).transferAnyOldERC20Token(tokenAddress, recipient, amount);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"contract StakingPool","name":"","type":"address"},{"indexed":false,"internalType":"string","name":"","type":"string"}],"name":"PoolCallReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract StakingPool","name":"","type":"address"},{"indexed":false,"internalType":"bytes","name":"","type":"bytes"}],"name":"PoolCallReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract StakingPool","name":"","type":"address"}],"name":"PoolCallSucceeded","type":"event"},{"inputs":[],"name":"ADMIN_CAN_CLAIM_AFTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADMIN_FEATURES_EXPIRE_AFTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BALANCE_TO_INIT_PROPOSAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUORUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESULT_EXECUTION_ALLOWANCE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRUSTED_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"actions","outputs":[{"internalType":"enum Governance.Action","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"enum Governance.Option","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinBalanceToInitProposal","type":"uint256"}],"name":"changeMinBalanceToInitProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"changeQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"executeProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposal","outputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"enum Governance.Action","name":"_proposalAction","type":"uint8"},{"internalType":"uint256","name":"_optionOneVotes","type":"uint256"},{"internalType":"uint256","name":"_optionTwoVotes","type":"uint256"},{"internalType":"contract StakingPool[]","name":"_stakingPool","type":"address[]"},{"internalType":"address","name":"_newGovernance","type":"address"},{"internalType":"uint256","name":"_proposalStartTime","type":"uint256"},{"internalType":"bool","name":"_isProposalExecuted","type":"bool"},{"internalType":"uint256","name":"_newQuorum","type":"uint256"},{"internalType":"string","name":"_proposalText","type":"string"},{"internalType":"uint256","name":"_newMinBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Governance.PoolGroupName","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"hardcodedStakingPools","outputs":[{"internalType":"contract StakingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isProposalExecuted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"isProposalExecutible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"isProposalOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastVotedProposalStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"newGovernances","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"newMinBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"newQuorums","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optionOneVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optionTwoVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalTexts","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Governance.PoolGroupName","name":"poolGroupName","type":"uint8"}],"name":"proposeDisburseOrBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinBalance","type":"uint256"}],"name":"proposeNewMinBalanceToInitProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"proposeNewQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"text","type":"string"}],"name":"proposeText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Governance.PoolGroupName","name":"poolGroupName","type":"uint8"},{"internalType":"address","name":"newGovernance","type":"address"}],"name":"proposeUpgradeGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"removeVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingPools","outputs":[{"internalType":"contract StakingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalDepositedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyERC20TokenFromPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyLegacyERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyLegacyERC20TokenFromPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"votedForOption","outputs":[{"internalType":"enum Governance.Option","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"votesForProposalByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAllTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405269054b40b1f852bda0000060025569010f0cf064dd5920000060035560006013553480156200003257600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3426080818152505073a7d6f5fa9b0be0e98b3b40e6ac884e53f2f9460e600460008060038111156200011d57fe5b60038111156200012957fe5b81526020019081526020016000206000600481106200014457fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730b0a544ae6131801522e3ac1fbac6d311094c94c60046000806003811115620001a957fe5b6003811115620001b557fe5b8152602001908152602001600020600160048110620001d057fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507316caad63bdfc3ec4a2850336b28efe17e802b896600460008060038111156200023557fe5b60038111156200024157fe5b81526020019081526020016000206002600481106200025c57fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073512ff8739d39e55d75d80046921e7de20c3e9bff60046000806003811115620002c157fe5b6003811115620002cd57fe5b8152602001908152602001600020600360048110620002e857fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ef71de5cb40f7985feb92aa49d8e3e84063af3bb60046000600160038111156200034e57fe5b60038111156200035a57fe5b81526020019081526020016000206000600481106200037557fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738b0e324eede360cab670a6ad12940736d74f701e6004600060016003811115620003db57fe5b6003811115620003e757fe5b81526020019081526020016000206001600481106200040257fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507378e2da2eda6df49bae46e3b51528baf5c106e65460046000600160038111156200046857fe5b60038111156200047457fe5b81526020019081526020016000206002600481106200048f57fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073350f3fe979bfad4766298713c83b387c2d2d7a7a6004600060016003811115620004f557fe5b60038111156200050157fe5b81526020019081526020016000206003600481106200051c57fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734a76fc15d3fbf3855127ec5da8aaf02de7ca06b360046000600260038111156200058257fe5b60038111156200058e57fe5b8152602001908152602001600020600060048110620005a957fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f4abc60a08b546fa879508f4261eb4400b55099d60046000600260038111156200060f57fe5b60038111156200061b57fe5b81526020019081526020016000206001600481106200063657fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507313f421aa823f7d90730812a33f8cac8656e47dfa60046000600260038111156200069c57fe5b6003811115620006a857fe5b8152602001908152602001600020600260048110620006c357fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507386690bbe7a9683a8bad4812c2e816fd17bc9715c60046000600260038111156200072957fe5b60038111156200073557fe5b81526020019081526020016000206003600481106200075057fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732b5d7a865a3888836d15d69dccbad682663dcdbb60046000600380811115620007b557fe5b6003811115620007c157fe5b8152602001908152602001600020600060048110620007dc57fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a52250f98293c17c894d58cf4f78c925dc8955d0600460006003808111156200084157fe5b60038111156200084d57fe5b81526020019081526020016000206001600481106200086857fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073924becc8f4059987e4bc4b741b7c354ff52c25e460046000600380811115620008cd57fe5b6003811115620008d957fe5b8152602001908152602001600020600260048110620008f457fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073be528593781988974d83c2655cba4c45fc75c033600460006003808111156200095957fe5b60038111156200096557fe5b81526020019081526020016000206003600481106200098057fe5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550608051615408620009ee600039806118af52806138da52806143bf52806144cf52806149e452506154086000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c80638da5cb5b11610167578063d493b9ac116100ce578063f25b836411610087578063f25b836414610f24578063f2fde38b14610f92578063f3f5de8714610fd6578063f3f6f0d714611027578063f6af4dff14611045578063feb14c221461106357610294565b8063d493b9ac14610daa578063dd63a1bf14610e18578063de14b23e14610e36578063deca1c2a14610e54578063e30c397814610e82578063eb1a7cd714610ecc57610294565b8063b74316db11610120578063b74316db14610a53578063be08129214610afa578063c7f758a814610b88578063d00c1aec14610cf4578063d17af45314610d3a578063d2cd96bd14610d7c57610294565b80638da5cb5b1461090f5780638f32d59b14610959578063946164511461097b578063a25e84cd146109bd578063a35f7c7b146109db578063b38672b314610a2557610294565b80634e71e0c81161020b57806369adf796116101c457806369adf7961461070f578063701b1e8114610751578063780e19c1146107df5780637be0eeb91461082557806382d389531461086757806383240f83146108bf57610294565b80634e71e0c814610506578063570809c11461051057806359a28311146105cb57806359e61ef8146105f95780635e7e77921461065b578063664b937d146106c957610294565b806328707ff21161025d57806328707ff2146103af57806329b43563146103f15780632e80d9b614610422578063428786cc1461044057806344dfef34146104785780634654ff05146104e857610294565b80624d0d521461029957806303634a9a146102de5780630c3d5157146103595780630d61b51914610377578063280da6fa146103a5575b600080fd5b6102dc600480360360608110156102af57600080fd5b8101908080359060200190929190803560ff169060200190929190803590602001909291905050506110db565b005b610317600480360360408110156102f457600080fd5b81019080803560ff1690602001909291908035906020019092919050505061186b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103616118ad565b6040518082815260200191505060405180910390f35b6103a36004803603602081101561038d57600080fd5b81019080803590602001909291905050506118d1565b005b6103ad6127f2565b005b6103db600480360360208110156103c557600080fd5b8101908080359060200190929190505050612b52565b6040518082815260200191505060405180910390f35b6104206004803603602081101561040757600080fd5b81019080803560ff169060200190929190505050612b6a565b005b61042a612f04565b6040518082815260200191505060405180910390f35b6104766004803603604081101561045657600080fd5b810190808035906020019092919080359060200190929190505050612f0a565b005b6104c46004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613501565b604051808260018111156104d457fe5b60ff16815260200191505060405180910390f35b6104f0613530565b6040518082815260200191505060405180910390f35b61050e613537565b005b6105c96004803603602081101561052657600080fd5b810190808035906020019064010000000081111561054357600080fd5b82018360208201111561055557600080fd5b8035906020019184600183028401116401000000008311171561057757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613637565b005b6105f7600480360360208110156105e157600080fd5b81019080803590602001909291905050506138c0565b005b6106456004803603604081101561060f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613985565b6040518082815260200191505060405180910390f35b6106876004803603602081101561067157600080fd5b81019080803590602001909291905050506139aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f5600480360360208110156106df57600080fd5b81019080803590602001909291905050506139dd565b604051808215151515815260200191505060405180910390f35b61073b6004803603602081101561072557600080fd5b8101908080359060200190929190505050613aa5565b6040518082815260200191505060405180910390f35b6107dd6004803603608081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613abd565b005b61080b600480360360208110156107f557600080fd5b8101908080359060200190929190505050613ba7565b604051808215151515815260200191505060405180910390f35b6108516004803603602081101561083b57600080fd5b8101908080359060200190929190505050613bec565b6040518082815260200191505060405180910390f35b6108a96004803603602081101561087d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c04565b6040518082815260200191505060405180910390f35b6108eb600480360360208110156108d557600080fd5b8101908080359060200190929190505050613c1c565b604051808260048111156108fb57fe5b60ff16815260200191505060405180910390f35b610917613c3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610961613c65565b604051808215151515815260200191505060405180910390f35b6109a76004803603602081101561099157600080fd5b8101908080359060200190929190505050613cbc565b6040518082815260200191505060405180910390f35b6109c5613cd4565b6040518082815260200191505060405180910390f35b6109e3613cdb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5160048036036020811015610a3b57600080fd5b8101908080359060200190929190505050613cf3565b005b610a7f60048036036020811015610a6957600080fd5b8101908080359060200190929190505050613f7d565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610abf578082015181840152602081019050610aa4565b50505050905090810190601f168015610aec5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b8660048036036080811015610b1057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061402d565b005b610bb460048036036020811015610b9e57600080fd5b8101908080359060200190929190505050614117565b604051808c81526020018b6004811115610bca57fe5b60ff1681526020018a8152602001898152602001806020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001861515151581526020018581526020018060200184815260200183810383528a818151815260200191508051906020019060200280838360005b83811015610c6f578082015181840152602081019050610c54565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015610cae578082015181840152602081019050610c93565b50505050905090810190601f168015610cdb5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390f35b610d2060048036036020811015610d0a57600080fd5b810190808035906020019092919050505061436d565b604051808215151515815260200191505060405180910390f35b610d6660048036036020811015610d5057600080fd5b810190808035906020019092919050505061438d565b6040518082815260200191505060405180910390f35b610da860048036036020811015610d9257600080fd5b81019080803590602001909291905050506143a5565b005b610e1660048036036060811015610dc057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061446a565b005b610e206146aa565b6040518082815260200191505060405180910390f35b610e3e6146b0565b6040518082815260200191505060405180910390f35b610e8060048036036020811015610e6a57600080fd5b81019080803590602001909291905050506146b7565b005b610e8a614941565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f0e60048036036020811015610ee257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614967565b6040518082815260200191505060405180910390f35b610f9060048036036060811015610f3a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061497f565b005b610fd460048036036020811015610fa857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614b2a565b005b61102560048036036040811015610fec57600080fd5b81019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614bb9565b005b61102f614fb9565b6040518082815260200191505060405180910390f35b61104d614fbf565b6040518082815260200191505060405180910390f35b6110996004803603604081101561107957600080fd5b810190808035906020019092919080359060200190929190505050614fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110fa3373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561113257503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6111a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6000811161121a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e6e6f7420616464203020766f746573210000000000000000000000000081525060200191505060405180910390fd5b61122383613ba7565b611295576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50726f706f73616c20697320636c6f736564210000000000000000000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506040513d602081101561138e57600080fd5b8101908080519060200190929190505050611411576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e7366657246726f6d206661696c65642100000000000000000000000081525060200191505060405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205414156114e05781601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff021916908360018111156114d657fe5b02179055506115c9565b8160018111156114ec57fe5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060009054906101000a900460ff16600181111561155557fe5b146115c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420766f746520666f7220626f7468206f7074696f6e732100000081525060200191505060405180910390fd5b5b600060018111156115d657fe5b8260018111156115e257fe5b141561162a5761160e81600660008681526020019081526020016000205461502590919063ffffffff16565b6006600085815260200190815260200160002081905550611668565b61165081600760008681526020019081526020016000205461502590919063ffffffff16565b60076000858152602001908152602001600020819055505b6116ba81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461502590919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061176081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000205461502590919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002081905550600a600084815260200190815260200160002054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561186657600a600084815260200190815260200160002054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b6004602052816000526040600020816004811061188457fe5b016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6118f03373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561192857503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b61199a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b600360048111156119a757fe5b6005600083815260200190815260200160002060009054906101000a900460ff1660048111156119d357fe5b1415611a2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615380602e913960400191505060405180910390fd5b600760008281526020019081526020016000205460066000838152602001908152602001600020541415611ac6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54686973206973206120544945212043616e6e6f74206578656375746521000081525060200191505060405180910390fd5b611acf816139dd565b611b41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f50726f706f73616c20457870697265642100000000000000000000000000000081525060200191505060405180910390fd5b6001600b600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600080600760008481526020019081526020016000205460066000858152602001908152602001600020541115611bbd576000915060066000848152602001908152602001600020549050611bd8565b60019150600760008481526020019081526020016000205490505b600254811015611c50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f51554f52554d206e6f742072656163686564210000000000000000000000000081525060200191505060405180910390fd5b60006004811115611c5d57fe5b6005600085815260200190815260200160002060009054906101000a900460ff166004811115611c8957fe5b14156123015760006001811115611c9c57fe5b826001811115611ca857fe5b1415611fd75760008090505b60048160ff161015611fd1576000600860008681526020019081526020016000208260ff1681548110611ce357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663aabcad826040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d5857600080fd5b505af1925050508015611d69575060015b611f5f57611d756152a0565b80611d805750611e56565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e15578082015181840152602081019050611dfa565b50505050905090810190601f168015611e425780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150611f5a565b3d8060008114611e82576040519150601f19603f3d011682016040523d82523d6000602084013e611e87565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f1d578082015181840152602081019050611f02565b50505050905090810190601f168015611f4a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b611fc3565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050611cb4565b506122fc565b60008090505b60048160ff1610156122fa576000600860008681526020019081526020016000208260ff168154811061200c57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e3956a956040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561208157600080fd5b505af1925050508015612092575060015b6122885761209e6152a0565b806120a9575061217f565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561213e578082015181840152602081019050612123565b50505050905090810190601f16801561216b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150612283565b3d80600081146121ab576040519150601f19603f3d011682016040523d82523d6000602084013e6121b0565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561224657808201518184015260208101905061222b565b50505050905090810190601f1680156122735780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b6122ec565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050611fdd565b505b6127ed565b6001600481111561230e57fe5b6005600085815260200190815260200160002060009054906101000a900460ff16600481111561233a57fe5b14156126f3576000600181111561234d57fe5b82600181111561235957fe5b14156126ee5760008090505b60048160ff1610156126ec576000600860008681526020019081526020016000208260ff168154811061239457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6009600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561247357600080fd5b505af1925050508015612484575060015b61267a576124906152a0565b8061249b5750612571565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612530578082015181840152602081019050612515565b50505050905090810190601f16801561255d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150612675565b3d806000811461259d576040519150601f19603f3d011682016040523d82523d6000602084013e6125a2565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561263857808201518184015260208101905061261d565b50505050905090810190601f1680156126655780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b6126de565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050612365565b505b6127ec565b6002600481111561270057fe5b6005600085815260200190815260200160002060009054906101000a900460ff16600481111561272c57fe5b1415612771576000600181111561273f57fe5b82600181111561274b57fe5b141561276c57600c6000848152602001908152602001600020546002819055505b6127eb565b60048081111561277d57fe5b6005600085815260200190815260200160002060009054906101000a900460ff1660048111156127a957fe5b14156127ea57600060018111156127bc57fe5b8260018111156127c857fe5b14156127e957600d6000848152602001908152602001600020546003819055505b5b5b5b5b505050565b6128113373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561284957503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6129106203f480601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461502590919063ffffffff16565b4211612984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f6b656e7320617265207374696c6c20696e20766f74696e6721000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b505050506040513d6020811015612a8857600080fd5b8101908080519060200190929190505050612b0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f7472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b600d6020528060005260406000206000915090505481565b612b893373ffffffffffffffffffffffffffffffffffffffff16615012565b158015612bc157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612c33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60006003811115612c4057fe5b816003811115612c4c57fe5b1480612c6e575060016003811115612c6057fe5b816003811115612c6c57fe5b145b80612c8f575060026003811115612c8157fe5b816003811115612c8d57fe5b145b80612caf5750600380811115612ca157fe5b816003811115612cad57fe5b145b612d21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420506f6f6c2047726f7570204e616d6521000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612db557600080fd5b505afa158015612dc9573d6000803e3d6000fd5b505050506040513d6020811015612ddf57600080fd5b81019080805190602001909291905050501015612e47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b612e5d600160135461502590919063ffffffff16565b60138190555060046000826003811115612e7357fe5b6003811115612e7e57fe5b8152602001908152602001600020600860006013548152602001908152602001600020906004612eaf929190615150565b5042600a6000601354815260200190815260200160002081905550600060056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115612efc57fe5b021790555050565b60025481565b612f293373ffffffffffffffffffffffffffffffffffffffff16615012565b158015612f6157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612fd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60008111613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616e6e6f742072656d6f7665203020766f746573210000000000000000000081525060200191505060405180910390fd5b61305282613ba7565b6130c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50726f706f73616c20697320636c6f736564210000000000000000000000000081525060200191505060405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205481111561316d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153576029913960400191505060405180910390fd5b6131d081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461504190919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555061327681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461504190919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060018111156132c657fe5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16600181111561332f57fe5b14156133775761335b81600660008581526020019081526020016000205461504190919063ffffffff16565b60066000848152602001908152602001600020819055506133b5565b61339d81600760008581526020019081526020016000205461504190919063ffffffff16565b60076000848152602001908152602001600020819055505b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561345057600080fd5b505af1158015613464573d6000803e3d6000fd5b505050506040513d602081101561347a57600080fd5b81019080805190602001909291905050506134fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f7472616e73666572206661696c6564000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b60116020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6203f48081565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561356e57fe5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146135c857600080fd5b6135f3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16615058565b6000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6136563373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561368e57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b613700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d60208110156137be57600080fd5b81019080805190602001909291905050501015613826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b61383c600160135461502590919063ffffffff16565b60138190555042600a6000601354815260200190815260200160002081905550600360056000601354815260200190815260200160002060006101000a81548160ff0219169083600481111561388e57fe5b021790555080600e6000601354815260200190815260200160002090805190602001906138bc92919061519a565b5050565b6138c8613c65565b6138d157600080fd5b61390762ed4e007f000000000000000000000000000000000000000000000000000000000000000061502590919063ffffffff16565b421061397b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f546869732061646d696e2066656174757265206861732065787069726564210081525060200191505060405180910390fd5b8060038190555050565b6010602052816000526040600020602052806000526040600020600091509150505481565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006139e882613ba7565b158015613a315750613a2e6203f480613a206203f480600a60008781526020019081526020016000205461502590919063ffffffff16565b61502590919063ffffffff16565b42105b8015613a5b5750600b600083815260200190815260200160002060009054906101000a900460ff16155b8015613a8d57506007600083815260200190815260200160002054600660008481526020019081526020016000205414155b15613a9b5760019050613aa0565b600090505b919050565b60066020528060005260406000206000915090505481565b613ac5613c65565b613ace57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1663d493b9ac8484846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015613b8957600080fd5b505af1158015613b9d573d6000803e3d6000fd5b5050505050505050565b6000613bd26203f480600a60008581526020019081526020016000205461502590919063ffffffff16565b421015613be25760019050613be7565b600090505b919050565b60076020528060005260406000206000915090505481565b600f6020528060005260406000206000915090505481565b60056020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600a6020528060005260406000206000915090505481565b6203f48081565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b613d123373ffffffffffffffffffffffffffffffffffffffff16615012565b158015613d4a57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b613dbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b613dc4613c65565b613dcd57600080fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e6157600080fd5b505afa158015613e75573d6000803e3d6000fd5b505050506040513d6020811015613e8b57600080fd5b81019080805190602001909291905050501015613ef3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b613f09600160135461502590919063ffffffff16565b60138190555080600c600060135481526020019081526020016000208190555042600a6000601354815260200190815260200160002081905550600260056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115613f7557fe5b021790555050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156140255780601f10613ffa57610100808354040283529160200191614025565b820191906000526020600020905b81548152906001019060200180831161400857829003601f168201915b505050505081565b614035613c65565b61403e57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1663ed3e91748484846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156140f957600080fd5b505af115801561410d573d6000803e3d6000fd5b5050505050505050565b6000806000806060600080600080606060008b9a50600560008d815260200190815260200160002060009054906101000a900460ff169950600660008d8152602001908152602001600020549850600760008d8152602001908152602001600020549750600860008d815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561420e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116141c4575b50505050509650600960008d815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169550600a60008d8152602001908152602001600020549450600b60008d815260200190815260200160002060009054906101000a900460ff169350600c60008d8152602001908152602001600020549250600e60008d81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143415780601f1061431657610100808354040283529160200191614341565b820191906000526020600020905b81548152906001019060200180831161432457829003601f168201915b50505050509150600d60008d815260200190815260200160002054905091939597999b90929496989a50565b600b6020528060005260406000206000915054906101000a900460ff1681565b600c6020528060005260406000206000915090505481565b6143ad613c65565b6143b657600080fd5b6143ec62ed4e007f000000000000000000000000000000000000000000000000000000000000000061502590919063ffffffff16565b4210614460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4368616e67652071756f72756d2066656174757265206578706972656421000081525060200191505060405180910390fd5b8060028190555050565b614472613c65565b61447b57600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415806144ff57506144fc630208c0807f000000000000000000000000000000000000000000000000000000000000000061502590919063ffffffff16565b42115b614571576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156145f857600080fd5b505af115801561460c573d6000803e3d6000fd5b505050506040513d602081101561462257600080fd5b81019080805190602001909291905050506146a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b505050565b60035481565b62ed4e0081565b6146d63373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561470e57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b614780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b614788613c65565b61479157600080fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561482557600080fd5b505afa158015614839573d6000803e3d6000fd5b505050506040513d602081101561484f57600080fd5b810190808051906020019092919050505010156148b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b6148cd600160135461502590919063ffffffff16565b60138190555080600d600060135481526020019081526020016000208190555042600a6000601354815260200190815260200160002081905550600460056000601354815260200190815260200160002060006101000a81548160ff0219169083600481111561493957fe5b021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915090505481565b614987613c65565b61499057600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580614a145750614a11630208c0807f000000000000000000000000000000000000000000000000000000000000000061502590919063ffffffff16565b42115b614a86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015614b0d57600080fd5b505af1158015614b21573d6000803e3d6000fd5b50505050505050565b614b32613c65565b614b3b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614b7557600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b614bd83373ffffffffffffffffffffffffffffffffffffffff16615012565b158015614c1057503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b614c82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b614c8a613c65565b614c9357600080fd5b60006003811115614ca057fe5b826003811115614cac57fe5b1480614cce575060016003811115614cc057fe5b826003811115614ccc57fe5b145b80614cef575060026003811115614ce157fe5b826003811115614ced57fe5b145b80614d0f5750600380811115614d0157fe5b826003811115614d0d57fe5b145b614d81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420506f6f6c2047726f7570204e616d6521000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e1557600080fd5b505afa158015614e29573d6000803e3d6000fd5b505050506040513d6020811015614e3f57600080fd5b81019080805190602001909291905050501015614ea7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b614ebd600160135461502590919063ffffffff16565b60138190555060046000836003811115614ed357fe5b6003811115614ede57fe5b8152602001908152602001600020600860006013548152602001908152602001600020906004614f0f929190615150565b508060096000601354815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600a6000601354815260200190815260200160002081905550600160056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115614fb057fe5b02179055505050565b60135481565b630208c08081565b60086020528160005260406000208181548110614fe057fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080823b905060008111915050919050565b60008082840190508381101561503757fe5b8091505092915050565b60008282111561504d57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561509257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828054828255906000526020600020908101928215615189579182015b8281111561518857825482559160010191906001019061516d565b5b509050615196919061521a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106151db57805160ff1916838001178555615209565b82800160010185558215615209579182015b828111156152085782518255916020019190600101906151ed565b5b509050615216919061525d565b5090565b61525a91905b8082111561525657600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101615220565b5090565b90565b61527f91905b8082111561527b576000816000905550600101615263565b5090565b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d10156152b057615353565b60046000803e6152c1600051615293565b6308c379a081146152d25750615353565b60405160043d036004823e80513d602482011167ffffffffffffffff821117156152fe57505050615353565b808201805167ffffffffffffffff81111561531d575050505050615353565b8060208301013d850181111561533857505050505050615353565b61534182615282565b60208401016040528296505050505050505b9056fe43616e6e6f742072656d6f7665206d6f726520746f6b656e73207468616e206465706f73697465642143616e6e6f742070726f6772616d6d61746963616c6c79206578656375746520746578742070726f706f73616c73496e73756666696369656e7420476f7665726e616e636520546f6b656e2042616c616e6365a2646970667358221220ca0a6ace76e2fba50d8dc98ea05bed9b965f65485955705e0a0b0edac736c09764736f6c634300060b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102945760003560e01c80638da5cb5b11610167578063d493b9ac116100ce578063f25b836411610087578063f25b836414610f24578063f2fde38b14610f92578063f3f5de8714610fd6578063f3f6f0d714611027578063f6af4dff14611045578063feb14c221461106357610294565b8063d493b9ac14610daa578063dd63a1bf14610e18578063de14b23e14610e36578063deca1c2a14610e54578063e30c397814610e82578063eb1a7cd714610ecc57610294565b8063b74316db11610120578063b74316db14610a53578063be08129214610afa578063c7f758a814610b88578063d00c1aec14610cf4578063d17af45314610d3a578063d2cd96bd14610d7c57610294565b80638da5cb5b1461090f5780638f32d59b14610959578063946164511461097b578063a25e84cd146109bd578063a35f7c7b146109db578063b38672b314610a2557610294565b80634e71e0c81161020b57806369adf796116101c457806369adf7961461070f578063701b1e8114610751578063780e19c1146107df5780637be0eeb91461082557806382d389531461086757806383240f83146108bf57610294565b80634e71e0c814610506578063570809c11461051057806359a28311146105cb57806359e61ef8146105f95780635e7e77921461065b578063664b937d146106c957610294565b806328707ff21161025d57806328707ff2146103af57806329b43563146103f15780632e80d9b614610422578063428786cc1461044057806344dfef34146104785780634654ff05146104e857610294565b80624d0d521461029957806303634a9a146102de5780630c3d5157146103595780630d61b51914610377578063280da6fa146103a5575b600080fd5b6102dc600480360360608110156102af57600080fd5b8101908080359060200190929190803560ff169060200190929190803590602001909291905050506110db565b005b610317600480360360408110156102f457600080fd5b81019080803560ff1690602001909291908035906020019092919050505061186b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103616118ad565b6040518082815260200191505060405180910390f35b6103a36004803603602081101561038d57600080fd5b81019080803590602001909291905050506118d1565b005b6103ad6127f2565b005b6103db600480360360208110156103c557600080fd5b8101908080359060200190929190505050612b52565b6040518082815260200191505060405180910390f35b6104206004803603602081101561040757600080fd5b81019080803560ff169060200190929190505050612b6a565b005b61042a612f04565b6040518082815260200191505060405180910390f35b6104766004803603604081101561045657600080fd5b810190808035906020019092919080359060200190929190505050612f0a565b005b6104c46004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613501565b604051808260018111156104d457fe5b60ff16815260200191505060405180910390f35b6104f0613530565b6040518082815260200191505060405180910390f35b61050e613537565b005b6105c96004803603602081101561052657600080fd5b810190808035906020019064010000000081111561054357600080fd5b82018360208201111561055557600080fd5b8035906020019184600183028401116401000000008311171561057757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613637565b005b6105f7600480360360208110156105e157600080fd5b81019080803590602001909291905050506138c0565b005b6106456004803603604081101561060f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613985565b6040518082815260200191505060405180910390f35b6106876004803603602081101561067157600080fd5b81019080803590602001909291905050506139aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f5600480360360208110156106df57600080fd5b81019080803590602001909291905050506139dd565b604051808215151515815260200191505060405180910390f35b61073b6004803603602081101561072557600080fd5b8101908080359060200190929190505050613aa5565b6040518082815260200191505060405180910390f35b6107dd6004803603608081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613abd565b005b61080b600480360360208110156107f557600080fd5b8101908080359060200190929190505050613ba7565b604051808215151515815260200191505060405180910390f35b6108516004803603602081101561083b57600080fd5b8101908080359060200190929190505050613bec565b6040518082815260200191505060405180910390f35b6108a96004803603602081101561087d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c04565b6040518082815260200191505060405180910390f35b6108eb600480360360208110156108d557600080fd5b8101908080359060200190929190505050613c1c565b604051808260048111156108fb57fe5b60ff16815260200191505060405180910390f35b610917613c3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610961613c65565b604051808215151515815260200191505060405180910390f35b6109a76004803603602081101561099157600080fd5b8101908080359060200190929190505050613cbc565b6040518082815260200191505060405180910390f35b6109c5613cd4565b6040518082815260200191505060405180910390f35b6109e3613cdb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5160048036036020811015610a3b57600080fd5b8101908080359060200190929190505050613cf3565b005b610a7f60048036036020811015610a6957600080fd5b8101908080359060200190929190505050613f7d565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610abf578082015181840152602081019050610aa4565b50505050905090810190601f168015610aec5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b8660048036036080811015610b1057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061402d565b005b610bb460048036036020811015610b9e57600080fd5b8101908080359060200190929190505050614117565b604051808c81526020018b6004811115610bca57fe5b60ff1681526020018a8152602001898152602001806020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001861515151581526020018581526020018060200184815260200183810383528a818151815260200191508051906020019060200280838360005b83811015610c6f578082015181840152602081019050610c54565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015610cae578082015181840152602081019050610c93565b50505050905090810190601f168015610cdb5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390f35b610d2060048036036020811015610d0a57600080fd5b810190808035906020019092919050505061436d565b604051808215151515815260200191505060405180910390f35b610d6660048036036020811015610d5057600080fd5b810190808035906020019092919050505061438d565b6040518082815260200191505060405180910390f35b610da860048036036020811015610d9257600080fd5b81019080803590602001909291905050506143a5565b005b610e1660048036036060811015610dc057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061446a565b005b610e206146aa565b6040518082815260200191505060405180910390f35b610e3e6146b0565b6040518082815260200191505060405180910390f35b610e8060048036036020811015610e6a57600080fd5b81019080803590602001909291905050506146b7565b005b610e8a614941565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f0e60048036036020811015610ee257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614967565b6040518082815260200191505060405180910390f35b610f9060048036036060811015610f3a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061497f565b005b610fd460048036036020811015610fa857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614b2a565b005b61102560048036036040811015610fec57600080fd5b81019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614bb9565b005b61102f614fb9565b6040518082815260200191505060405180910390f35b61104d614fbf565b6040518082815260200191505060405180910390f35b6110996004803603604081101561107957600080fd5b810190808035906020019092919080359060200190929190505050614fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110fa3373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561113257503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6111a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6000811161121a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e6e6f7420616464203020766f746573210000000000000000000000000081525060200191505060405180910390fd5b61122383613ba7565b611295576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50726f706f73616c20697320636c6f736564210000000000000000000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506040513d602081101561138e57600080fd5b8101908080519060200190929190505050611411576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e7366657246726f6d206661696c65642100000000000000000000000081525060200191505060405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205414156114e05781601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff021916908360018111156114d657fe5b02179055506115c9565b8160018111156114ec57fe5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060009054906101000a900460ff16600181111561155557fe5b146115c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420766f746520666f7220626f7468206f7074696f6e732100000081525060200191505060405180910390fd5b5b600060018111156115d657fe5b8260018111156115e257fe5b141561162a5761160e81600660008681526020019081526020016000205461502590919063ffffffff16565b6006600085815260200190815260200160002081905550611668565b61165081600760008681526020019081526020016000205461502590919063ffffffff16565b60076000858152602001908152602001600020819055505b6116ba81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461502590919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061176081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000205461502590919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002081905550600a600084815260200190815260200160002054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561186657600a600084815260200190815260200160002054601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b6004602052816000526040600020816004811061188457fe5b016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000000000000000000000000000000000000600c0d7781565b6118f03373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561192857503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b61199a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b600360048111156119a757fe5b6005600083815260200190815260200160002060009054906101000a900460ff1660048111156119d357fe5b1415611a2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615380602e913960400191505060405180910390fd5b600760008281526020019081526020016000205460066000838152602001908152602001600020541415611ac6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54686973206973206120544945212043616e6e6f74206578656375746521000081525060200191505060405180910390fd5b611acf816139dd565b611b41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f50726f706f73616c20457870697265642100000000000000000000000000000081525060200191505060405180910390fd5b6001600b600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600080600760008481526020019081526020016000205460066000858152602001908152602001600020541115611bbd576000915060066000848152602001908152602001600020549050611bd8565b60019150600760008481526020019081526020016000205490505b600254811015611c50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f51554f52554d206e6f742072656163686564210000000000000000000000000081525060200191505060405180910390fd5b60006004811115611c5d57fe5b6005600085815260200190815260200160002060009054906101000a900460ff166004811115611c8957fe5b14156123015760006001811115611c9c57fe5b826001811115611ca857fe5b1415611fd75760008090505b60048160ff161015611fd1576000600860008681526020019081526020016000208260ff1681548110611ce357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663aabcad826040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611d5857600080fd5b505af1925050508015611d69575060015b611f5f57611d756152a0565b80611d805750611e56565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e15578082015181840152602081019050611dfa565b50505050905090810190601f168015611e425780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150611f5a565b3d8060008114611e82576040519150601f19603f3d011682016040523d82523d6000602084013e611e87565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f1d578082015181840152602081019050611f02565b50505050905090810190601f168015611f4a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b611fc3565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050611cb4565b506122fc565b60008090505b60048160ff1610156122fa576000600860008681526020019081526020016000208260ff168154811061200c57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e3956a956040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561208157600080fd5b505af1925050508015612092575060015b6122885761209e6152a0565b806120a9575061217f565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561213e578082015181840152602081019050612123565b50505050905090810190601f16801561216b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150612283565b3d80600081146121ab576040519150601f19603f3d011682016040523d82523d6000602084013e6121b0565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561224657808201518184015260208101905061222b565b50505050905090810190601f1680156122735780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b6122ec565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050611fdd565b505b6127ed565b6001600481111561230e57fe5b6005600085815260200190815260200160002060009054906101000a900460ff16600481111561233a57fe5b14156126f3576000600181111561234d57fe5b82600181111561235957fe5b14156126ee5760008090505b60048160ff1610156126ec576000600860008681526020019081526020016000208260ff168154811061239457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6009600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561247357600080fd5b505af1925050508015612484575060015b61267a576124906152a0565b8061249b5750612571565b7f18ebaa21ec0ffd473423d603c62f44820061770fab2ec3e53019069c1e9fc86c8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612530578082015181840152602081019050612515565b50505050905090810190601f16801561255d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150612675565b3d806000811461259d576040519150601f19603f3d011682016040523d82523d6000602084013e6125a2565b606091505b507f9b952a19df98629b6d2b9207388cbf7b8a80e5c53e74f633fd23ff0da0e912328282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561263857808201518184015260208101905061261d565b50505050905090810190601f1680156126655780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505b6126de565b7f5aca19a9d0e90b2fb5cbc3cf422cd492303dc0b612352deff075278ed7bba40b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b508080600101915050612365565b505b6127ec565b6002600481111561270057fe5b6005600085815260200190815260200160002060009054906101000a900460ff16600481111561272c57fe5b1415612771576000600181111561273f57fe5b82600181111561274b57fe5b141561276c57600c6000848152602001908152602001600020546002819055505b6127eb565b60048081111561277d57fe5b6005600085815260200190815260200160002060009054906101000a900460ff1660048111156127a957fe5b14156127ea57600060018111156127bc57fe5b8260018111156127c857fe5b14156127e957600d6000848152602001908152602001600020546003819055505b5b5b5b5b505050565b6128113373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561284957503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b6128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b6129106203f480601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461502590919063ffffffff16565b4211612984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f6b656e7320617265207374696c6c20696e20766f74696e6721000000000081525060200191505060405180910390fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b505050506040513d6020811015612a8857600080fd5b8101908080519060200190929190505050612b0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f7472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b600d6020528060005260406000206000915090505481565b612b893373ffffffffffffffffffffffffffffffffffffffff16615012565b158015612bc157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612c33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60006003811115612c4057fe5b816003811115612c4c57fe5b1480612c6e575060016003811115612c6057fe5b816003811115612c6c57fe5b145b80612c8f575060026003811115612c8157fe5b816003811115612c8d57fe5b145b80612caf5750600380811115612ca157fe5b816003811115612cad57fe5b145b612d21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420506f6f6c2047726f7570204e616d6521000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612db557600080fd5b505afa158015612dc9573d6000803e3d6000fd5b505050506040513d6020811015612ddf57600080fd5b81019080805190602001909291905050501015612e47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b612e5d600160135461502590919063ffffffff16565b60138190555060046000826003811115612e7357fe5b6003811115612e7e57fe5b8152602001908152602001600020600860006013548152602001908152602001600020906004612eaf929190615150565b5042600a6000601354815260200190815260200160002081905550600060056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115612efc57fe5b021790555050565b60025481565b612f293373ffffffffffffffffffffffffffffffffffffffff16615012565b158015612f6157503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b612fd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60008111613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616e6e6f742072656d6f7665203020766f746573210000000000000000000081525060200191505060405180910390fd5b61305282613ba7565b6130c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f50726f706f73616c20697320636c6f736564210000000000000000000000000081525060200191505060405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205481111561316d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153576029913960400191505060405180910390fd5b6131d081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461504190919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555061327681600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461504190919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060018111156132c657fe5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16600181111561332f57fe5b14156133775761335b81600660008581526020019081526020016000205461504190919063ffffffff16565b60066000848152602001908152602001600020819055506133b5565b61339d81600760008581526020019081526020016000205461504190919063ffffffff16565b60076000848152602001908152602001600020819055505b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561345057600080fd5b505af1158015613464573d6000803e3d6000fd5b505050506040513d602081101561347a57600080fd5b81019080805190602001909291905050506134fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f7472616e73666572206661696c6564000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b60116020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6203f48081565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561356e57fe5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146135c857600080fd5b6135f3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16615058565b6000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6136563373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561368e57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b613700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d60208110156137be57600080fd5b81019080805190602001909291905050501015613826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b61383c600160135461502590919063ffffffff16565b60138190555042600a6000601354815260200190815260200160002081905550600360056000601354815260200190815260200160002060006101000a81548160ff0219169083600481111561388e57fe5b021790555080600e6000601354815260200190815260200160002090805190602001906138bc92919061519a565b5050565b6138c8613c65565b6138d157600080fd5b61390762ed4e007f00000000000000000000000000000000000000000000000000000000600c0d7761502590919063ffffffff16565b421061397b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f546869732061646d696e2066656174757265206861732065787069726564210081525060200191505060405180910390fd5b8060038190555050565b6010602052816000526040600020602052806000526040600020600091509150505481565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006139e882613ba7565b158015613a315750613a2e6203f480613a206203f480600a60008781526020019081526020016000205461502590919063ffffffff16565b61502590919063ffffffff16565b42105b8015613a5b5750600b600083815260200190815260200160002060009054906101000a900460ff16155b8015613a8d57506007600083815260200190815260200160002054600660008481526020019081526020016000205414155b15613a9b5760019050613aa0565b600090505b919050565b60066020528060005260406000206000915090505481565b613ac5613c65565b613ace57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1663d493b9ac8484846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015613b8957600080fd5b505af1158015613b9d573d6000803e3d6000fd5b5050505050505050565b6000613bd26203f480600a60008581526020019081526020016000205461502590919063ffffffff16565b421015613be25760019050613be7565b600090505b919050565b60076020528060005260406000206000915090505481565b600f6020528060005260406000206000915090505481565b60056020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600a6020528060005260406000206000915090505481565b6203f48081565b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1781565b613d123373ffffffffffffffffffffffffffffffffffffffff16615012565b158015613d4a57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b613dbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b613dc4613c65565b613dcd57600080fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e6157600080fd5b505afa158015613e75573d6000803e3d6000fd5b505050506040513d6020811015613e8b57600080fd5b81019080805190602001909291905050501015613ef3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b613f09600160135461502590919063ffffffff16565b60138190555080600c600060135481526020019081526020016000208190555042600a6000601354815260200190815260200160002081905550600260056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115613f7557fe5b021790555050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156140255780601f10613ffa57610100808354040283529160200191614025565b820191906000526020600020905b81548152906001019060200180831161400857829003601f168201915b505050505081565b614035613c65565b61403e57600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1663ed3e91748484846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156140f957600080fd5b505af115801561410d573d6000803e3d6000fd5b5050505050505050565b6000806000806060600080600080606060008b9a50600560008d815260200190815260200160002060009054906101000a900460ff169950600660008d8152602001908152602001600020549850600760008d8152602001908152602001600020549750600860008d815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561420e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116141c4575b50505050509650600960008d815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169550600a60008d8152602001908152602001600020549450600b60008d815260200190815260200160002060009054906101000a900460ff169350600c60008d8152602001908152602001600020549250600e60008d81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143415780601f1061431657610100808354040283529160200191614341565b820191906000526020600020905b81548152906001019060200180831161432457829003601f168201915b50505050509150600d60008d815260200190815260200160002054905091939597999b90929496989a50565b600b6020528060005260406000206000915054906101000a900460ff1681565b600c6020528060005260406000206000915090505481565b6143ad613c65565b6143b657600080fd5b6143ec62ed4e007f00000000000000000000000000000000000000000000000000000000600c0d7761502590919063ffffffff16565b4210614460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4368616e67652071756f72756d2066656174757265206578706972656421000081525060200191505060405180910390fd5b8060028190555050565b614472613c65565b61447b57600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415806144ff57506144fc630208c0807f00000000000000000000000000000000000000000000000000000000600c0d7761502590919063ffffffff16565b42115b614571576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156145f857600080fd5b505af115801561460c573d6000803e3d6000fd5b505050506040513d602081101561462257600080fd5b81019080805190602001909291905050506146a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5472616e73666572206661696c6564210000000000000000000000000000000081525060200191505060405180910390fd5b505050565b60035481565b62ed4e0081565b6146d63373ffffffffffffffffffffffffffffffffffffffff16615012565b15801561470e57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b614780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b614788613c65565b61479157600080fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561482557600080fd5b505afa158015614839573d6000803e3d6000fd5b505050506040513d602081101561484f57600080fd5b810190808051906020019092919050505010156148b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b6148cd600160135461502590919063ffffffff16565b60138190555080600d600060135481526020019081526020016000208190555042600a6000601354815260200190815260200160002081905550600460056000601354815260200190815260200160002060006101000a81548160ff0219169083600481111561493957fe5b021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915090505481565b614987613c65565b61499057600080fd5b73961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580614a145750614a11630208c0807f00000000000000000000000000000000000000000000000000000000600c0d7761502590919063ffffffff16565b42115b614a86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74205472616e73666572204f7574206d61696e20746f6b656e732181525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015614b0d57600080fd5b505af1158015614b21573d6000803e3d6000fd5b50505050505050565b614b32613c65565b614b3b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614b7557600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b614bd83373ffffffffffffffffffffffffffffffffffffffff16615012565b158015614c1057503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b614c82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20436f6e74726163747320416c6c6f77656421000000000000000000000081525060200191505060405180910390fd5b614c8a613c65565b614c9357600080fd5b60006003811115614ca057fe5b826003811115614cac57fe5b1480614cce575060016003811115614cc057fe5b826003811115614ccc57fe5b145b80614cef575060026003811115614ce157fe5b826003811115614ced57fe5b145b80614d0f5750600380811115614d0157fe5b826003811115614d0d57fe5b145b614d81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f496e76616c696420506f6f6c2047726f7570204e616d6521000000000000000081525060200191505060405180910390fd5b60035473961c8c0b1aad0c0b10a51fef6a867e3091bcef1773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e1557600080fd5b505afa158015614e29573d6000803e3d6000fd5b505050506040513d6020811015614e3f57600080fd5b81019080805190602001909291905050501015614ea7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b614ebd600160135461502590919063ffffffff16565b60138190555060046000836003811115614ed357fe5b6003811115614ede57fe5b8152602001908152602001600020600860006013548152602001908152602001600020906004614f0f929190615150565b508060096000601354815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600a6000601354815260200190815260200160002081905550600160056000601354815260200190815260200160002060006101000a81548160ff02191690836004811115614fb057fe5b02179055505050565b60135481565b630208c08081565b60086020528160005260406000208181548110614fe057fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080823b905060008111915050919050565b60008082840190508381101561503757fe5b8091505092915050565b60008282111561504d57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561509257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828054828255906000526020600020908101928215615189579182015b8281111561518857825482559160010191906001019061516d565b5b509050615196919061521a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106151db57805160ff1916838001178555615209565b82800160010185558215615209579182015b828111156152085782518255916020019190600101906151ed565b5b509050615216919061525d565b5090565b61525a91905b8082111561525657600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101615220565b5090565b90565b61527f91905b8082111561527b576000816000905550600101615263565b5090565b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d10156152b057615353565b60046000803e6152c1600051615293565b6308c379a081146152d25750615353565b60405160043d036004823e80513d602482011167ffffffffffffffff821117156152fe57505050615353565b808201805167ffffffffffffffff81111561531d575050505050615353565b8060208301013d850181111561533857505050505050615353565b61534182615282565b60208401016040528296505050505050505b9056fe43616e6e6f742072656d6f7665206d6f726520746f6b656e73207468616e206465706f73697465642143616e6e6f742070726f6772616d6d61746963616c6c79206578656375746520746578742070726f706f73616c73496e73756666696369656e7420476f7665726e616e636520546f6b656e2042616c616e6365a2646970667358221220ca0a6ace76e2fba50d8dc98ea05bed9b965f65485955705e0a0b0edac736c09764736f6c634300060b0033

Deployed Bytecode Sourcemap

12148:20381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23115:1371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14149:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13580:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26453:3296;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25773:349;;;:::i;:::-;;16888:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19943:722;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12776:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24677:948;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17326:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13269:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11261:137;;;:::i;:::-;;19384:398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18945:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17169:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16580:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30241:430;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16289:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31895:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29840:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16386:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17041:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16197:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10183:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10748:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16692:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13441:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12582:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21720:411;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16939:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32294:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17701:1016;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16780:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16841:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18729:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30853:348;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13145:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12818:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22260:463;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9741:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17483:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31383:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11015:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20783:830;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17617:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13012:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16479:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23115:1371;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23234:1:::1;23225:6;:10;23217:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23278:26;23293:10;23278:14;:26::i;:::-;23270:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;12630:42;23357:41;;;23399:10;23419:4;23426:6;23357:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;23349:109;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23595:1;23542:25;:37;23568:10;23542:37;;;;;;;;;;;;;;;:49;23580:10;23542:49;;;;;;;;;;;;:54;23538:294;;;23654:6;23613:14;:26;23628:10;23613:26;;;;;;;;;;;;;;;:38;23640:10;23613:38;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;;;;;;;23538:294;;;23739:6;23697:48;;;;;;;;:14;:26;23712:10;23697:26;;;;;;;;;;;;;;;:38;23724:10;23697:38;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;23693:128;;23766:39;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;23693:128;23538:294;23866:10;23856:20;;;;;;;;:6;:20;;;;;;;;;23852:220;;;23922:38;23953:6;23922:14;:26;23937:10;23922:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;23893:14;:26;23908:10;23893:26;;;;;;;;;;;:67;;;;23852:220;;;24022:38;24053:6;24022:14;:26;24037:10;24022:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;23993:14;:26;24008:10;23993:26;;;;;;;;;;;:67;;;;23852:220;24117:44;24154:6;24117:20;:32;24138:10;24117:32;;;;;;;;;;;;;;;;:36;;:44;;;;:::i;:::-;24082:20;:32;24103:10;24082:32;;;;;;;;;;;;;;;:79;;;;24224:61;24278:6;24224:25;:37;24250:10;24224:37;;;;;;;;;;;;;;;:49;24262:10;24224:49;;;;;;;;;;;;:53;;:61;;;;:::i;:::-;24172:25;:37;24198:10;24172:37;;;;;;;;;;;;;;;:49;24210:10;24172:49;;;;;;;;;;;:113;;;;24351:17;:29;24369:10;24351:29;;;;;;;;;;;;24310:26;:38;24337:10;24310:38;;;;;;;;;;;;;;;;:70;24306:173;;;24438:17;:29;24456:10;24438:29;;;;;;;;;;;;24397:26;:38;24424:10;24397:38;;;;;;;;;;;;;;;:70;;;;24306:173;23115:1371:::0;;;:::o;14149:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13580:39::-;;;:::o;26453:3296::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26566:20:::1;26543:43;;;;;;;;:7;:19;26551:10;26543:19;;;;;;;;;;;;;;;;;;;;;:43;;;;;;;;;;26534:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26687:14;:26;26702:10;26687:26;;;;;;;;;;;;26657:14;:26;26672:10;26657:26;;;;;;;;;;;;:56;;26648:100;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26768:32;26789:10;26768:20;:32::i;:::-;26759:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26876:4;26843:18;:30;26862:10;26843:30;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;26897:20;26928:23:::0;27005:14:::1;:26;27020:10;27005:26;;;;;;;;;;;;26976:14;:26;26991:10;26976:26;;;;;;;;;;;;:55;26972:297;;;27064:10;27048:26;;27110:14;:26;27125:10;27110:26;;;;;;;;;;;;27089:47;;26972:297;;;27185:10;27169:26;;27231:14;:26;27246:10;27231:26;;;;;;;;;;;;27210:47;;26972:297;27393:6;;27372:18;:27;27368:89;;;27416:29;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;27368:89;27504:23;27481:46;;;;;;;;:7;:19;27489:10;27481:19;;;;;;;;;;;;;;;;;;;;;:46;;;;;;;;;27477:2265;;;27565:10;27548:27;;;;;;;;:13;:27;;;;;;;;;27544:1103;;;27601:7;27611:1:::0;27601:11:::1;;27596:500;27618:1;27614;:5;;;27596:500;;;27649:16;27668:12;:24;27681:10;27668:24;;;;;;;;;;;27693:1;27668:27;;;;;;;;;;;;;;;;;;;;;;;;;;;27649:46;;27722:4;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;27718:359;;;;:::i;:::-;;;;;;;;27896:30;27913:4;27919:6;27896:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27830:120;27718:359;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28017:36;28034:4;28040:12;28017:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27951:126;27718:359;;;;27782:23;27800:4;27782:23;;;;;;;;;;;;;;;;;;;;;;27718:359;27596:500;27621:3;;;;;;;27596:500;;;;27544:1103;;;28141:7;28151:1:::0;28141:11:::1;;28136:496;28158:1;28154;:5;;;28136:496;;;28189:16;28208:12;:24;28221:10;28208:24;;;;;;;;;;;28233:1;28208:27;;;;;;;;;;;;;;;;;;;;;;;;;;;28189:46;;28262:4;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;28258:355;;;;:::i;:::-;;;;;;;;28432:30;28449:4;28455:6;28432:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28366:120;28258:355;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28553:36;28570:4;28576:12;28553:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28487:126;28258:355;;;;28318:23;28336:4;28318:23;;;;;;;;;;;;;;;;;;;;;;28258:355;28136:496;28161:3;;;;;;;28136:496;;;;27544:1103;27477:2265;;;28691:25;28668:48;;;;;;;;:7;:19;28676:10;28668:19;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;28664:1078;;;28754:10;28737:27;;;;;;;;:13;:27;;;;;;;;;28733:590;;;28790:7;28800:1:::0;28790:11:::1;;28785:523;28807:1;28803;:5;;;28785:523;;;28838:16;28857:12;:24;28870:10;28857:24;;;;;;;;;;;28882:1;28857:27;;;;;;;;;;;;;;;;;;;;;;;;;;;28838:46;;28911:4;:22;;;28934:14;:26;28949:10;28934:26;;;;;;;;;;;;;;;;;;;;;28911:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;28907:382;;;;:::i;:::-;;;;;;;;29108:30;29125:4;29131:6;29108:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29042:120;28907:382;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29229:36;29246:4;29252:12;29229:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29163:126;28907:382;;;;28994:23;29012:4;28994:23;;;;;;;;;;;;;;;;;;;;;;28907:382;28785:523;28810:3;;;;;;;28785:523;;;;28733:590;28664:1078;;;29367:20;29344:43;;;;;;;;:7;:19;29352:10;29344:19;;;;;;;;;;;;;;;;;;;;;:43;;;;;;;;;29340:402;;;29425:10;29408:27;;;;;;;;:13;:27;;;;;;;;;29404:99;;;29465:10;:22;29476:10;29465:22;;;;;;;;;;;;29456:6;:31;;;;29404:99;29340:402;;;29547:42;29524:65:::0;::::1;;;;;;;:7;:19;29532:10;29524:19;;;;;;;;;;;;;;;;;;;;;:65;;;;;;;;;29520:222;;;29627:10;29610:27;;;;;;;;:13;:27;;;;;;;;;29606:125;;;29689:14;:26;29704:10;29689:26;;;;;;;;;;;;29658:28;:57;;;;29606:125;29520:222;29340:402;28664:1078;27477:2265;12460:1;;26453:3296:::0;:::o;25773:349::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25855:57:::1;13306:6;25855:26;:38;25882:10;25855:38;;;;;;;;;;;;;;;;:42;;:57;;;;:::i;:::-;25849:3;:63;25841:103;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;12630:42;25963:37;;;26001:10;26013:20;:32;26034:10;26013:32;;;;;;;;;;;;;;;;25963:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;25955:112;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26113:1;26078:20;:32;26099:10;26078:32;;;;;;;;;;;;;;;:36;;;;25773:349::o:0;16888:44::-;;;;;;;;;;;;;;;;;:::o;19943:722::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20067:18:::1;20050:35;;;;;;;;:13;:35;;;;;;;;;:91;;;;20123:18;20106:35;;;;;;;;:13;:35;;;;;;;;;20050:91;:147;;;;20179:18;20162:35;;;;;;;;:13;:35;;;;;;;;;20050:147;:203;;;;20235:18;20218:35:::0;::::1;;;;;;;:13;:35;;;;;;;;;20050:203;20042:240;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;20355:28;;12630:42;20301:38;;;20340:10;20301:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:82;;20293:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20448:16;20462:1;20448:9;;:13;;:16;;;;:::i;:::-;20436:9;:28;;;;20511:21;:36;20533:13;20511:36;;;;;;;;;;;;;;;;;;;;;;;;;;;20485:12;:23;20498:9;;20485:23;;;;;;;;;;;:62;;;;;;;:::i;:::-;;20599:3;20568:17;:28;20586:9;;20568:28;;;;;;;;;;;:34;;;;20634:23;20613:7;:18;20621:9;;20613:18;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;;;;;;;19943:722:::0;:::o;12776:29::-;;;;:::o;24677:948::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24784:1:::1;24775:6;:10;24767:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24831:26;24846:10;24831:14;:26::i;:::-;24823:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24920:25;:37;24946:10;24920:37;;;;;;;;;;;;;;;:49;24958:10;24920:49;;;;;;;;;;;;24910:6;:59;;24902:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25088:61;25142:6;25088:25;:37;25114:10;25088:37;;;;;;;;;;;;;;;:49;25126:10;25088:49;;;;;;;;;;;;:53;;:61;;;;:::i;:::-;25036:25;:37;25062:10;25036:37;;;;;;;;;;;;;;;:49;25074:10;25036:49;;;;;;;;;;;:113;;;;25195:44;25232:6;25195:20;:32;25216:10;25195:32;;;;;;;;;;;;;;;;:36;;:44;;;;:::i;:::-;25160:20;:32;25181:10;25160:32;;;;;;;;;;;;;;;:79;;;;25306:10;25264:52;;;;;;;;:14;:26;25279:10;25264:26;;;;;;;;;;;;;;;:38;25291:10;25264:38;;;;;;;;;;;;;;;;;;;;;:52;;;;;;;;;25260:252;;;25362:38;25393:6;25362:14;:26;25377:10;25362:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;25333:14;:26;25348:10;25333:26;;;;;;;;;;;:67;;;;25260:252;;;25462:38;25493:6;25462:14;:26;25477:10;25462:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;25433:14;:26;25448:10;25433:26;;;;;;;;;;;:67;;;;25260:252;12630:42;25540:37;;;25578:10;25590:6;25540:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;25532:85;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24677:948:::0;;:::o;17326:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13269:43::-;13306:6;13269:43;:::o;11261:137::-;10586:1;10564:24;;:10;:24;;;;10557:32;;;;10622:12;;;;;;;;;;;10608:26;;:10;:26;;;10600:35;;;;;;11322:32:::1;11341:12;;;;;;;;;;;11322:18;:32::i;:::-;11388:1;11365:12;;:25;;;;;;;;;;;;;;;;;;11261:137::o:0;19384:398::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19526:28:::1;;12630:42;19472:38;;;19511:10;19472:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:82;;19464:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19619:16;19633:1;19619:9;;:13;;:16;;;;:::i;:::-;19607:9;:28;;;;19677:3;19646:17;:28;19664:9;;19646:28;;;;;;;;;;;:34;;;;19712:20;19691:7;:18;19699:9;;19691:18;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;19770:4;19743:13;:24;19757:9;;19743:24;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;19384:398:::0;:::o;18945:281::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;19063:50:::1;12869:8;19063:17;:21;;:50;;;;:::i;:::-;19057:3;:56;19049:100;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;19191:27;19160:28;:58;;;;18945:281:::0;:::o;17169:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16580:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;30241:430::-;30309:4;30332:26;30347:10;30332:14;:26::i;:::-;30331:27;30330:142;;;;;30384:87;13498:6;30384:48;13306:6;30384:17;:29;30402:10;30384:29;;;;;;;;;;;;:33;;:48;;;;:::i;:::-;:52;;:87;;;;:::i;:::-;30378:3;:93;30330:142;:190;;;;;30490:18;:30;30509:10;30490:30;;;;;;;;;;;;;;;;;;;;;30489:31;30330:190;:263;;;;;30567:14;:26;30582:10;30567:26;;;;;;;;;;;;30537:14;:26;30552:10;30537:26;;;;;;;;;;;;:56;;30330:263;30326:315;;;30621:4;30614:11;;;;30326:315;30658:5;30651:12;;30241:430;;;;:::o;16289:44::-;;;;;;;;;;;;;;;;;:::o;31895:217::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;32044:4:::1;32032:39;;;32072:12;32086:9;32097:6;32032:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31895:217:::0;;;;:::o;29840:207::-;29902:4;29929:48;13306:6;29929:17;:29;29947:10;29929:29;;;;;;;;;;;;:33;;:48;;;;:::i;:::-;29923:3;:54;29919:98;;;30001:4;29994:11;;;;29919:98;30034:5;30027:12;;29840:207;;;;:::o;16386:44::-;;;;;;;;;;;;;;;;;:::o;17041:53::-;;;;;;;;;;;;;;;;;:::o;16197:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;10183:79::-;10221:7;10248:6;;;;;;;;;;;10241:13;;10183:79;:::o;10748:92::-;10788:4;10826:6;;;;;;;;;;;10812:20;;:10;:20;;;10805:27;;10748:92;:::o;16692:47::-;;;;;;;;;;;;;;;;;:::o;13441:63::-;13498:6;13441:63;:::o;12582:90::-;12630:42;12582:90;:::o;21720:411::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10395:9:::1;:7;:9::i;:::-;10387:18;;;::::0;::::1;;21873:28:::2;;12630:42;21819:38;;;21858:10;21819:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;:82;;21811:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21966:16;21980:1;21966:9;;:13;;:16;;;;:::i;:::-;21954:9;:28;;;;22017:9;21993:10;:21;22004:9;;21993:21;;;;;;;;;;;:33;;;;22068:3;22037:17;:28;22055:9;;22037:28;;;;;;;;;;;:34;;;;22103:20;22082:7;:18;22090:9;;22082:18;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;21720:411:::0;:::o;16939:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32294:226::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;32449:4:::1;32437:42;;;32480:12;32494:9;32505:6;32437:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32294:226:::0;;;;:::o;17701:1016::-;17772:16;17800:22;17833:20;17864;17895:33;17939:22;17972:23;18006:24;18041:15;18067:27;18105:19;18161:10;18147:24;;18200:7;:19;18208:10;18200:19;;;;;;;;;;;;;;;;;;;;;18182:37;;18248:14;:26;18263:10;18248:26;;;;;;;;;;;;18230:44;;18303:14;:26;18318:10;18303:26;;;;;;;;;;;;18285:44;;18355:12;:24;18368:10;18355:24;;;;;;;;;;;18340:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18407:14;:26;18422:10;18407:26;;;;;;;;;;;;;;;;;;;;;18390:43;;18465:17;:29;18483:10;18465:29;;;;;;;;;;;;18444:50;;18527:18;:30;18546:10;18527:30;;;;;;;;;;;;;;;;;;;;;18505:52;;18581:10;:22;18592:10;18581:22;;;;;;;;;;;;18568:35;;18630:13;:25;18644:10;18630:25;;;;;;;;;;;18614:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18683:14;:26;18698:10;18683:26;;;;;;;;;;;;18666:43;;17701:1016;;;;;;;;;;;;;:::o;16780:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;16841:40::-;;;;;;;;;;;;;;;;;:::o;18729:204::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;18811:50:::1;12869:8;18811:17;:21;;:50;;;;:::i;:::-;18805:3;:56;18797:99;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;18916:9;18907:6;:18;;;;18729:204:::0;:::o;30853:348::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;12630:42:::1;30977:37;;:12;:37;;;;:91;;;;31024:44;13057:8;31024:17;:21;;:44;;;;:::i;:::-;31018:3;:50;30977:91;30968:137;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31131:12;31125:28;;;31154:9;31165:6;31125:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;31116:77;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30853:348:::0;;;:::o;13145:50::-;;;;:::o;12818:59::-;12869:8;12818:59;:::o;22260:463::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10395:9:::1;:7;:9::i;:::-;10387:18;;;::::0;::::1;;22435:28:::2;;12630:42;22381:38;;;22420:10;22381:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;:82;;22373:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22528:16;22542:1;22528:9;;:13;;:16;;;;:::i;:::-;22516:9;:28;;;;22583:13;22555:14;:25;22570:9;;22555:25;;;;;;;;;;;:41;;;;22638:3;22607:17;:28;22625:9;;22607:28;;;;;;;;;;;:34;;;;22673:42;22652:7;:18;22660:9;;22652:18;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;;;;;;;22260:463:::0;:::o;9741:27::-;;;;;;;;;;;;;:::o;17483:59::-;;;;;;;;;;;;;;;;;:::o;31383:330::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;12630:42:::1;31513:37;;:12;:37;;;;:91;;;;31560:44;13057:8;31560:17;:21;;:44;;;;:::i;:::-;31554:3;:50;31513:91;31504:137;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31664:12;31652:34;;;31687:9;31698:6;31652:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31383:330:::0;;;:::o;11015:149::-;10395:9;:7;:9::i;:::-;10387:18;;;;;;11118:1:::1;11097:23;;:9;:23;;;;11089:32;;;::::0;::::1;;11147:9;11132:12;;:24;;;;;;;;;;;;;;;;;;11015:149:::0;:::o;20783:830::-;12363:32;12371:10;12363:30;;;:32::i;:::-;12361:35;:62;;;;;12413:10;12400:23;;:9;:23;;;12361:62;12353:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10395:9:::1;:7;:9::i;:::-;10387:18;;;::::0;::::1;;20943::::2;20926:35;;;;;;;;:13;:35;;;;;;;;;:91;;;;20999:18;20982:35;;;;;;;;:13;:35;;;;;;;;;20926:91;:147;;;;21055:18;21038:35;;;;;;;;:13;:35;;;;;;;;;20926:147;:203;;;;21111:18;21094:35:::0;::::2;;;;;;;:13;:35;;;;;;;;;20926:203;20918:240;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;21249:28;;12630:42;21195:38;;;21234:10;21195:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;:82;;21187:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21342:16;21356:1;21342:9;;:13;;:16;;;;:::i;:::-;21330:9;:28;;;;21405:21;:36;21427:13;21405:36;;;;;;;;;;;;;;;;;;;;;;;;;;;21379:12;:23;21392:9;;21379:23;;;;;;;;;;;:62;;;;;;;:::i;:::-;;21490:13;21462:14;:25;21477:9;;21462:25;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;21545:3;21514:17;:28;21532:9;;21514:28;;;;;;;;;;;:34;;;;21580:25;21559:7;:18;21567:9;;21559:18;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;;;;;;;20783:830:::0;;:::o;17617:25::-;;;;:::o;13012:53::-;13057:8;13012:53;:::o;16479:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1554:422::-;1614:4;1822:12;1933:7;1921:20;1913:28;;1967:1;1960:4;:8;1953:15;;;1554:422;;;:::o;733:133::-;791:7;807:9;823:1;819;:5;807:17;;843:1;838;:6;;831:14;;;;859:1;852:8;;;733:133;;;;:::o;614:113::-;672:7;700:1;695;:6;;688:14;;;;720:1;716;:5;709:12;;614:113;;;;:::o;11548:187::-;11642:1;11622:22;;:8;:22;;;;11614:31;;;;;;11690:8;11661:38;;11682:6;;;;;;;;;;;11661:38;;;;;;;;;;;;11719:8;11710:6;;:17;;;;;;;;;;;;;;;;;;11548:187;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:97::-;;93:2;89:7;84:2;77:5;73:14;69:28;59:38;;53:49;;;:::o;110:106::-;;200:5;195:3;191:15;169:37;;163:53;;;:::o;224:739::-;;297:4;279:16;276:26;273:2;;;305:5;;273:2;339:1;336;333;318:23;357:34;388:1;382:8;357:34;:::i;:::-;414:10;409:3;406:19;396:2;;429:5;;;396:2;460;454:9;514:1;496:16;492:24;489:1;483:4;468:49;543:4;537:11;624:16;617:4;609:6;605:17;602:39;576:18;568:6;565:30;556:91;553:2;;;655:5;;;;;553:2;693:6;687:4;683:17;725:3;719:10;748:18;740:6;737:30;734:2;;;770:5;;;;;;;734:2;814:6;807:4;802:3;798:14;794:27;847:16;841:4;837:27;832:3;829:36;826:2;;;868:5;;;;;;;;826:2;912:29;934:6;912:29;:::i;:::-;905:4;900:3;896:14;892:50;888:2;881:62;955:3;948:10;;267:696;;;;;;;;:::o

Swarm Source

ipfs://ca0a6ace76e2fba50d8dc98ea05bed9b965f65485955705e0a0b0edac736c097

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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.