ETH Price: $3,249.93 (-0.31%)
Gas: 1 Gwei

Contract

0xfc0Fd933D8ef5b7e552E67aCfc4c09711B413f30
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040142026912022-02-14 6:42:21894 days ago1644820941IN
 Create: KaliDAO
0 ETH0.1680782931.94897136

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KaliDAO

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 11111 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-14
*/

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.4;

/// @notice Modern and gas-optimized ERC-20 + EIP-2612 implementation with COMP-style governance and pausing.
/// @author Modified from Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/erc20/ERC20.sol)
/// License-Identifier: AGPL-3.0-only
abstract contract KaliDAOtoken {
    /*///////////////////////////////////////////////////////////////
                            EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    event PauseFlipped(bool paused);

    /*///////////////////////////////////////////////////////////////
                            ERRORS
    //////////////////////////////////////////////////////////////*/

    error NoArrayParity();

    error Paused();

    error SignatureExpired();

    error NullAddress();

    error InvalidNonce();

    error NotDetermined();

    error InvalidSignature();

    error Uint32max();

    error Uint96max();

    /*///////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public constant decimals = 18;

    /*///////////////////////////////////////////////////////////////
                            ERC-20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*///////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)');

    uint256 internal INITIAL_CHAIN_ID;

    bytes32 internal INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*///////////////////////////////////////////////////////////////
                            DAO STORAGE
    //////////////////////////////////////////////////////////////*/

    bool public paused;

    bytes32 public constant DELEGATION_TYPEHASH = 
        keccak256('Delegation(address delegatee,uint256 nonce,uint256 deadline)');

    mapping(address => address) internal _delegates;

    mapping(address => mapping(uint256 => Checkpoint)) public checkpoints;

    mapping(address => uint256) public numCheckpoints;

    struct Checkpoint {
        uint32 fromTimestamp;
        uint96 votes;
    }

    /*///////////////////////////////////////////////////////////////
                            CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    function _init(
        string memory name_,
        string memory symbol_,
        bool paused_,
        address[] memory voters_,
        uint256[] memory shares_
    ) internal virtual {
        if (voters_.length != shares_.length) revert NoArrayParity();

        name = name_;
        
        symbol = symbol_;
        
        paused = paused_;

        INITIAL_CHAIN_ID = block.chainid;
        
        INITIAL_DOMAIN_SEPARATOR = _computeDomainSeparator();
        
        // cannot realistically overflow on human timescales
        unchecked {
            for (uint256 i; i < voters_.length; i++) {
                _mint(voters_[i], shares_[i]);
            }
        }
    }

    /*///////////////////////////////////////////////////////////////
                            ERC-20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public payable virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public payable notPaused virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value
        unchecked {
            balanceOf[to] += amount;
        }
        
        _moveDelegates(delegates(msg.sender), delegates(to), amount);

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public payable notPaused virtual returns (bool) {
        if (allowance[from][msg.sender] != type(uint256).max) 
            allowance[from][msg.sender] -= amount;

        balanceOf[from] -= amount;

        // cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value
        unchecked {
            balanceOf[to] += amount;
        }
        
        _moveDelegates(delegates(from), delegates(to), amount);

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                            EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable virtual {
        if (block.timestamp > deadline) revert SignatureExpired();

        // cannot realistically overflow on human timescales
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    '\x19\x01',
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            if (recoveredAddress == address(0) || recoveredAddress != owner) revert InvalidSignature();

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : _computeDomainSeparator();
    }

    function _computeDomainSeparator() internal view virtual returns (bytes32) {
        return 
            keccak256(
                abi.encode(
                    keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                    keccak256(bytes(name)),
                    keccak256('1'),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*///////////////////////////////////////////////////////////////
                            DAO LOGIC
    //////////////////////////////////////////////////////////////*/

    modifier notPaused() {
        if (paused) revert Paused();

        _;
    }
    
    function delegates(address delegator) public view virtual returns (address) {
        address current = _delegates[delegator];
        
        return current == address(0) ? delegator : current;
    }

    function getCurrentVotes(address account) public view virtual returns (uint256) {
        // this is safe from underflow because decrement only occurs if `nCheckpoints` is positive
        unchecked {
            uint256 nCheckpoints = numCheckpoints[account];

            return nCheckpoints != 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
        }
    }

    function delegate(address delegatee) public payable virtual {
        _delegate(msg.sender, delegatee);
    }

    function delegateBySig(
        address delegatee, 
        uint256 nonce, 
        uint256 deadline, 
        uint8 v, 
        bytes32 r, 
        bytes32 s
    ) public payable virtual {
        if (block.timestamp > deadline) revert SignatureExpired();

        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, deadline));

        bytes32 digest = keccak256(abi.encodePacked('\x19\x01', DOMAIN_SEPARATOR(), structHash));

        address signatory = ecrecover(digest, v, r, s);

        if (signatory == address(0)) revert NullAddress();
        
        // cannot realistically overflow on human timescales
        unchecked {
            if (nonce != nonces[signatory]++) revert InvalidNonce();
        }

        _delegate(signatory, delegatee);
    }

    function getPriorVotes(address account, uint256 timestamp) public view virtual returns (uint96) {
        if (block.timestamp <= timestamp) revert NotDetermined();

        uint256 nCheckpoints = numCheckpoints[account];

        if (nCheckpoints == 0) return 0;
        
        // this is safe from underflow because decrement only occurs if `nCheckpoints` is positive
        unchecked {
            if (checkpoints[account][nCheckpoints - 1].fromTimestamp <= timestamp)
                return checkpoints[account][nCheckpoints - 1].votes;

            if (checkpoints[account][0].fromTimestamp > timestamp) return 0;

            uint256 lower;
            
            // this is safe from underflow because decrement only occurs if `nCheckpoints` is positive
            uint256 upper = nCheckpoints - 1;

            while (upper > lower) {
                // this is safe from underflow because `upper` ceiling is provided
                uint256 center = upper - (upper - lower) / 2;

                Checkpoint memory cp = checkpoints[account][center];

                if (cp.fromTimestamp == timestamp) {
                    return cp.votes;
                } else if (cp.fromTimestamp < timestamp) {
                    lower = center;
                } else {
                    upper = center - 1;
                }
            }

        return checkpoints[account][lower].votes;

        }
    }

    function _delegate(address delegator, address delegatee) internal virtual {
        address currentDelegate = delegates(delegator);

        _delegates[delegator] = delegatee;

        _moveDelegates(currentDelegate, delegatee, balanceOf[delegator]);

        emit DelegateChanged(delegator, currentDelegate, delegatee);
    }

    function _moveDelegates(
        address srcRep, 
        address dstRep, 
        uint256 amount
    ) internal virtual {
        if (srcRep != dstRep && amount != 0) 
            if (srcRep != address(0)) {
                uint256 srcRepNum = numCheckpoints[srcRep];
                
                uint256 srcRepOld = srcRepNum != 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;

                uint256 srcRepNew = srcRepOld - amount;

                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }
            
            if (dstRep != address(0)) {
                uint256 dstRepNum = numCheckpoints[dstRep];

                uint256 dstRepOld = dstRepNum != 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;

                uint256 dstRepNew = dstRepOld + amount;

                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
    }

    function _writeCheckpoint(
        address delegatee, 
        uint256 nCheckpoints, 
        uint256 oldVotes, 
        uint256 newVotes
    ) internal virtual {
        unchecked {
            // this is safe from underflow because decrement only occurs if `nCheckpoints` is positive
            if (nCheckpoints != 0 && checkpoints[delegatee][nCheckpoints - 1].fromTimestamp == block.timestamp) {
                checkpoints[delegatee][nCheckpoints - 1].votes = _safeCastTo96(newVotes);
            } else {
                checkpoints[delegatee][nCheckpoints] = Checkpoint(_safeCastTo32(block.timestamp), _safeCastTo96(newVotes));
                
                // cannot realistically overflow on human timescales
                numCheckpoints[delegatee] = nCheckpoints + 1;
            }
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    /*///////////////////////////////////////////////////////////////
                            MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value
        unchecked {
            balanceOf[to] += amount;
        }

        _moveDelegates(address(0), delegates(to), amount);

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // cannot underflow because a user's balance
        // will never be larger than the total supply
        unchecked {
            totalSupply -= amount;
        }

        _moveDelegates(delegates(from), address(0), amount);

        emit Transfer(from, address(0), amount);
    }
    
    function burn(uint256 amount) public payable virtual {
        _burn(msg.sender, amount);
    }

    function burnFrom(address from, uint256 amount) public payable virtual {
        if (allowance[from][msg.sender] != type(uint256).max) 
            allowance[from][msg.sender] -= amount;

        _burn(from, amount);
    }

    /*///////////////////////////////////////////////////////////////
                            PAUSE LOGIC
    //////////////////////////////////////////////////////////////*/

    function _flipPause() internal virtual {
        paused = !paused;

        emit PauseFlipped(paused);
    }
    
    /*///////////////////////////////////////////////////////////////
                            SAFECAST LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function _safeCastTo32(uint256 x) internal pure virtual returns (uint32) {
        if (x > type(uint32).max) revert Uint32max();

        return uint32(x);
    }
    
    function _safeCastTo96(uint256 x) internal pure virtual returns (uint96) {
        if (x > type(uint96).max) revert Uint96max();

        return uint96(x);
    }
}

/// @notice Helper utility that enables calling multiple local methods in a single call.
/// @author Modified from Uniswap (https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol)
abstract contract Multicall {
    function multicall(bytes[] calldata data) public payable virtual returns (bytes[] memory results) {
        results = new bytes[](data.length);
        
        // cannot realistically overflow on human timescales
        unchecked {
            for (uint256 i = 0; i < data.length; i++) {
                (bool success, bytes memory result) = address(this).delegatecall(data[i]);

                if (!success) {
                    if (result.length < 68) revert();
                    
                    assembly {
                        result := add(result, 0x04)
                    }
                    
                    revert(abi.decode(result, (string)));
                }
                results[i] = result;
            }
        }
    }
}

/// @notice Helper utility for NFT 'safe' transfers.
abstract contract NFThelper {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external pure returns (bytes4 sig) {
        sig = 0x150b7a02; // 'onERC721Received(address,address,uint256,bytes)'
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external pure returns (bytes4 sig) {
        sig = 0xf23a6e61; // 'onERC1155Received(address,address,uint256,uint256,bytes)'
    }
    
    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external pure returns (bytes4 sig) {
        sig = 0xbc197c81; // 'onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)'
    }
}

/// @notice Gas-optimized reentrancy protection.
/// @author Modified from OpenZeppelin 
/// (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)
/// License-Identifier: MIT
abstract contract ReentrancyGuard {
    error Reentrancy();

    uint256 private constant NOT_ENTERED = 1;

    uint256 private constant ENTERED = 2;

    uint256 private status = NOT_ENTERED;

    modifier nonReentrant() {
        if (status == ENTERED) revert Reentrancy();

        status = ENTERED;

        _;

        status = NOT_ENTERED;
    }
}

/// @notice Kali DAO membership extension interface.
interface IKaliDAOextension {
    function setExtension(bytes calldata extensionData) external;

    function callExtension(
        address account, 
        uint256 amount, 
        bytes calldata extensionData
    ) external payable returns (bool mint, uint256 amountOut);
}

/// @notice Simple gas-optimized Kali DAO core module.
contract KaliDAO is KaliDAOtoken, Multicall, NFThelper, ReentrancyGuard {
    /*///////////////////////////////////////////////////////////////
                            EVENTS
    //////////////////////////////////////////////////////////////*/

    event NewProposal(
        address indexed proposer, 
        uint256 indexed proposal, 
        ProposalType indexed proposalType, 
        string description, 
        address[] accounts, 
        uint256[] amounts, 
        bytes[] payloads
    );

    event ProposalCancelled(address indexed proposer, uint256 indexed proposal);

    event ProposalSponsored(address indexed sponsor, uint256 indexed proposal);
    
    event VoteCast(address indexed voter, uint256 indexed proposal, bool indexed approve);

    event ProposalProcessed(uint256 indexed proposal, bool indexed didProposalPass);

    /*///////////////////////////////////////////////////////////////
                            ERRORS
    //////////////////////////////////////////////////////////////*/

    error Initialized();

    error PeriodBounds();

    error QuorumMax();

    error SupermajorityBounds();

    error InitCallFail();

    error TypeBounds();

    error NotProposer();

    error Sponsored();

    error NotMember();

    error NotCurrentProposal();

    error AlreadyVoted();

    error NotVoteable();

    error VotingNotEnded();

    error PrevNotProcessed();

    error NotExtension();

    /*///////////////////////////////////////////////////////////////
                            DAO STORAGE
    //////////////////////////////////////////////////////////////*/

    string public docs;

    uint256 private currentSponsoredProposal;
    
    uint256 public proposalCount;

    uint32 public votingPeriod;

    uint32 public gracePeriod;

    uint32 public quorum; // 1-100

    uint32 public supermajority; // 1-100
    
    bytes32 public constant VOTE_HASH = 
        keccak256('SignVote(address signer,uint256 proposal,bool approve)');
    
    mapping(address => bool) public extensions;

    mapping(uint256 => Proposal) public proposals;

    mapping(uint256 => ProposalState) public proposalStates;

    mapping(ProposalType => VoteType) public proposalVoteTypes;
    
    mapping(uint256 => mapping(address => bool)) public voted;

    mapping(address => uint256) public lastYesVote;

    enum ProposalType {
        MINT, // add membership
        BURN, // revoke membership
        CALL, // call contracts
        VPERIOD, // set `votingPeriod`
        GPERIOD, // set `gracePeriod`
        QUORUM, // set `quorum`
        SUPERMAJORITY, // set `supermajority`
        TYPE, // set `VoteType` to `ProposalType`
        PAUSE, // flip membership transferability
        EXTENSION, // flip `extensions` whitelisting
        ESCAPE, // delete pending proposal in case of revert
        DOCS // amend org docs
    }

    enum VoteType {
        SIMPLE_MAJORITY,
        SIMPLE_MAJORITY_QUORUM_REQUIRED,
        SUPERMAJORITY,
        SUPERMAJORITY_QUORUM_REQUIRED
    }

    struct Proposal {
        ProposalType proposalType;
        string description;
        address[] accounts; // member(s) being added/kicked; account(s) receiving payload
        uint256[] amounts; // value(s) to be minted/burned/spent; gov setting [0]
        bytes[] payloads; // data for CALL proposals
        uint256 prevProposal;
        uint96 yesVotes;
        uint96 noVotes;
        uint32 creationTime;
        address proposer;
    }

    struct ProposalState {
        bool passed;
        bool processed;
    }

    /*///////////////////////////////////////////////////////////////
                            CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    function init(
        string memory name_,
        string memory symbol_,
        string memory docs_,
        bool paused_,
        address[] memory extensions_,
        bytes[] memory extensionsData_,
        address[] calldata voters_,
        uint256[] calldata shares_,
        uint32[16] memory govSettings_
    ) public payable nonReentrant virtual {
        if (extensions_.length != extensionsData_.length) revert NoArrayParity();

        if (votingPeriod != 0) revert Initialized();

        if (govSettings_[0] == 0 || govSettings_[0] > 365 days) revert PeriodBounds();

        if (govSettings_[1] > 365 days) revert PeriodBounds();

        if (govSettings_[2] > 100) revert QuorumMax();

        if (govSettings_[3] <= 51 || govSettings_[3] > 100) revert SupermajorityBounds();

        KaliDAOtoken._init(name_, symbol_, paused_, voters_, shares_);

        if (extensions_.length != 0) {
            // cannot realistically overflow on human timescales
            unchecked {
                for (uint256 i; i < extensions_.length; i++) {
                    extensions[extensions_[i]] = true;

                    if (extensionsData_[i].length > 3) {
                        (bool success, ) = extensions_[i].call(extensionsData_[i]);

                        if (!success) revert InitCallFail();
                    }
                }
            }
        }

        docs = docs_;
        
        votingPeriod = govSettings_[0];

        gracePeriod = govSettings_[1];
        
        quorum = govSettings_[2];
        
        supermajority = govSettings_[3];

        // set initial vote types
        proposalVoteTypes[ProposalType.MINT] = VoteType(govSettings_[4]);

        proposalVoteTypes[ProposalType.BURN] = VoteType(govSettings_[5]);

        proposalVoteTypes[ProposalType.CALL] = VoteType(govSettings_[6]);

        proposalVoteTypes[ProposalType.VPERIOD] = VoteType(govSettings_[7]);

        proposalVoteTypes[ProposalType.GPERIOD] = VoteType(govSettings_[8]);
        
        proposalVoteTypes[ProposalType.QUORUM] = VoteType(govSettings_[9]);
        
        proposalVoteTypes[ProposalType.SUPERMAJORITY] = VoteType(govSettings_[10]);

        proposalVoteTypes[ProposalType.TYPE] = VoteType(govSettings_[11]);
        
        proposalVoteTypes[ProposalType.PAUSE] = VoteType(govSettings_[12]);
        
        proposalVoteTypes[ProposalType.EXTENSION] = VoteType(govSettings_[13]);

        proposalVoteTypes[ProposalType.ESCAPE] = VoteType(govSettings_[14]);

        proposalVoteTypes[ProposalType.DOCS] = VoteType(govSettings_[15]);
    }

    /*///////////////////////////////////////////////////////////////
                            PROPOSAL LOGIC
    //////////////////////////////////////////////////////////////*/

    function getProposalArrays(uint256 proposal) public view virtual returns (
        address[] memory accounts, 
        uint256[] memory amounts, 
        bytes[] memory payloads
    ) {
        Proposal storage prop = proposals[proposal];
        
        (accounts, amounts, payloads) = (prop.accounts, prop.amounts, prop.payloads);
    }

    function propose(
        ProposalType proposalType,
        string calldata description,
        address[] calldata accounts,
        uint256[] calldata amounts,
        bytes[] calldata payloads
    ) public payable nonReentrant virtual returns (uint256 proposal) {
        if (accounts.length != amounts.length || amounts.length != payloads.length) revert NoArrayParity();
        
        if (proposalType == ProposalType.VPERIOD) if (amounts[0] == 0 || amounts[0] > 365 days) revert PeriodBounds();

        if (proposalType == ProposalType.GPERIOD) if (amounts[0] > 365 days) revert PeriodBounds();
        
        if (proposalType == ProposalType.QUORUM) if (amounts[0] > 100) revert QuorumMax();
        
        if (proposalType == ProposalType.SUPERMAJORITY) if (amounts[0] <= 51 || amounts[0] > 100) revert SupermajorityBounds();

        if (proposalType == ProposalType.TYPE) if (amounts[0] > 11 || amounts[1] > 3 || amounts.length != 2) revert TypeBounds();

        bool selfSponsor;

        // if member or extension is making proposal, include sponsorship
        if (balanceOf[msg.sender] != 0 || extensions[msg.sender]) selfSponsor = true;

        // cannot realistically overflow on human timescales
        unchecked {
            proposalCount++;
        }

        proposal = proposalCount;

        proposals[proposal] = Proposal({
            proposalType: proposalType,
            description: description,
            accounts: accounts,
            amounts: amounts,
            payloads: payloads,
            prevProposal: selfSponsor ? currentSponsoredProposal : 0,
            yesVotes: 0,
            noVotes: 0,
            creationTime: selfSponsor ? _safeCastTo32(block.timestamp) : 0,
            proposer: msg.sender
        });

        if (selfSponsor) currentSponsoredProposal = proposal;

        emit NewProposal(msg.sender, proposal, proposalType, description, accounts, amounts, payloads);
    }

    function cancelProposal(uint256 proposal) public payable nonReentrant virtual {
        Proposal storage prop = proposals[proposal];

        if (msg.sender != prop.proposer) revert NotProposer();

        if (prop.creationTime != 0) revert Sponsored();

        delete proposals[proposal];

        emit ProposalCancelled(msg.sender, proposal);
    }

    function sponsorProposal(uint256 proposal) public payable nonReentrant virtual {
        Proposal storage prop = proposals[proposal];

        if (balanceOf[msg.sender] == 0) revert NotMember();

        if (prop.proposer == address(0)) revert NotCurrentProposal();

        if (prop.creationTime != 0) revert Sponsored();

        prop.prevProposal = currentSponsoredProposal;

        currentSponsoredProposal = proposal;

        prop.creationTime = _safeCastTo32(block.timestamp);

        emit ProposalSponsored(msg.sender, proposal);
    } 

    function vote(uint256 proposal, bool approve) public payable nonReentrant virtual {
        _vote(msg.sender, proposal, approve);
    }
    
    function voteBySig(
        address signer, 
        uint256 proposal, 
        bool approve, 
        uint8 v, 
        bytes32 r, 
        bytes32 s
    ) public payable nonReentrant virtual {
        bytes32 digest =
            keccak256(
                abi.encodePacked(
                    '\x19\x01',
                    DOMAIN_SEPARATOR(),
                    keccak256(
                        abi.encode(
                            VOTE_HASH,
                            signer,
                            proposal,
                            approve
                        )
                    )
                )
            );
            
        address recoveredAddress = ecrecover(digest, v, r, s);

        if (recoveredAddress == address(0) || recoveredAddress != signer) revert InvalidSignature();
        
        _vote(signer, proposal, approve);
    }
    
    function _vote(
        address signer, 
        uint256 proposal, 
        bool approve
    ) internal virtual {
        Proposal storage prop = proposals[proposal];

        if (voted[proposal][signer]) revert AlreadyVoted();
        
        // this is safe from overflow because `votingPeriod` is capped so it will not combine
        // with unix time to exceed the max uint256 value
        unchecked {
            if (block.timestamp > prop.creationTime + votingPeriod) revert NotVoteable();
        }

        uint96 weight = getPriorVotes(signer, prop.creationTime);
        
        // this is safe from overflow because `yesVotes` and `noVotes` are capped by `totalSupply`
        // which is checked for overflow in `KaliDAOtoken` contract
        unchecked { 
            if (approve) {
                prop.yesVotes += weight;

                lastYesVote[signer] = proposal;
            } else {
                prop.noVotes += weight;
            }
        }
        
        voted[proposal][signer] = true;
        
        emit VoteCast(signer, proposal, approve);
    }

    function processProposal(uint256 proposal) public payable nonReentrant virtual returns (
        bool didProposalPass, bytes[] memory results
    ) {
        Proposal storage prop = proposals[proposal];

        VoteType voteType = proposalVoteTypes[prop.proposalType];

        if (prop.creationTime == 0) revert NotCurrentProposal();
        
        // this is safe from overflow because `votingPeriod` and `gracePeriod` are capped so they will not combine
        // with unix time to exceed the max uint256 value
        unchecked {
            if (block.timestamp <= prop.creationTime + votingPeriod + gracePeriod) revert VotingNotEnded();
        }

        // skip previous proposal processing requirement in case of escape hatch
        if (prop.proposalType != ProposalType.ESCAPE) 
            if (proposals[prop.prevProposal].creationTime != 0) revert PrevNotProcessed();

        didProposalPass = _countVotes(voteType, prop.yesVotes, prop.noVotes);
        
        if (didProposalPass) {
            // cannot realistically overflow on human timescales
            unchecked {
                if (prop.proposalType == ProposalType.MINT) 
                    for (uint256 i; i < prop.accounts.length; i++) {
                        _mint(prop.accounts[i], prop.amounts[i]);
                    }
                    
                if (prop.proposalType == ProposalType.BURN) 
                    for (uint256 i; i < prop.accounts.length; i++) {
                        _burn(prop.accounts[i], prop.amounts[i]);
                    }
                    
                if (prop.proposalType == ProposalType.CALL) 
                    for (uint256 i; i < prop.accounts.length; i++) {
                        results = new bytes[](prop.accounts.length);
                        
                        (, bytes memory result) = prop.accounts[i].call{value: prop.amounts[i]}
                            (prop.payloads[i]);
                        
                        results[i] = result;
                    }
                    
                // governance settings
                if (prop.proposalType == ProposalType.VPERIOD) 
                    if (prop.amounts[0] != 0) votingPeriod = uint32(prop.amounts[0]);
                
                if (prop.proposalType == ProposalType.GPERIOD) 
                    if (prop.amounts[0] != 0) gracePeriod = uint32(prop.amounts[0]);
                
                if (prop.proposalType == ProposalType.QUORUM) 
                    if (prop.amounts[0] != 0) quorum = uint32(prop.amounts[0]);
                
                if (prop.proposalType == ProposalType.SUPERMAJORITY) 
                    if (prop.amounts[0] != 0) supermajority = uint32(prop.amounts[0]);
                
                if (prop.proposalType == ProposalType.TYPE) 
                    proposalVoteTypes[ProposalType(prop.amounts[0])] = VoteType(prop.amounts[1]);
                
                if (prop.proposalType == ProposalType.PAUSE) 
                    _flipPause();
                
                if (prop.proposalType == ProposalType.EXTENSION) 
                    for (uint256 i; i < prop.accounts.length; i++) {
                        if (prop.amounts[i] != 0) 
                            extensions[prop.accounts[i]] = !extensions[prop.accounts[i]];
                    
                        if (prop.payloads[i].length > 3) IKaliDAOextension(prop.accounts[i])
                            .setExtension(prop.payloads[i]);
                    }
                
                if (prop.proposalType == ProposalType.ESCAPE)
                    delete proposals[prop.amounts[0]];

                if (prop.proposalType == ProposalType.DOCS)
                    docs = prop.description;
                
                proposalStates[proposal].passed = true;
            }
        }

        delete proposals[proposal];

        proposalStates[proposal].processed = true;

        emit ProposalProcessed(proposal, didProposalPass);
    }

    function _countVotes(
        VoteType voteType,
        uint256 yesVotes,
        uint256 noVotes
    ) internal view virtual returns (bool didProposalPass) {
        // fail proposal if no participation
        if (yesVotes == 0 && noVotes == 0) return false;

        // rule out any failed quorums
        if (voteType == VoteType.SIMPLE_MAJORITY_QUORUM_REQUIRED || voteType == VoteType.SUPERMAJORITY_QUORUM_REQUIRED) {
            uint256 minVotes = (totalSupply * quorum) / 100;
            
            // this is safe from overflow because `yesVotes` and `noVotes` 
            // supply are checked in `KaliDAOtoken` contract
            unchecked {
                uint256 votes = yesVotes + noVotes;

                if (votes < minVotes) return false;
            }
        }
        
        // simple majority check
        if (voteType == VoteType.SIMPLE_MAJORITY || voteType == VoteType.SIMPLE_MAJORITY_QUORUM_REQUIRED) {
            if (yesVotes > noVotes) return true;
        // supermajority check
        } else {
            // example: 7 yes, 2 no, supermajority = 66
            // ((7+2) * 66) / 100 = 5.94; 7 yes will pass
            uint256 minYes = ((yesVotes + noVotes) * supermajority) / 100;

            if (yesVotes >= minYes) return true;
        }
    }
    
    /*///////////////////////////////////////////////////////////////
                            EXTENSIONS 
    //////////////////////////////////////////////////////////////*/

    receive() external payable virtual {}

    modifier onlyExtension {
        if (!extensions[msg.sender]) revert NotExtension();

        _;
    }

    function callExtension(
        address extension, 
        uint256 amount, 
        bytes calldata extensionData
    ) public payable nonReentrant virtual returns (bool mint, uint256 amountOut) {
        if (!extensions[extension]) revert NotExtension();
        
        (mint, amountOut) = IKaliDAOextension(extension).callExtension{value: msg.value}
            (msg.sender, amount, extensionData);
        
        if (mint) {
            if (amountOut != 0) _mint(msg.sender, amountOut); 
        } else {
            if (amountOut != 0) _burn(msg.sender, amount);
        }
    }

    function mintShares(address to, uint256 amount) public payable onlyExtension virtual {
        _mint(to, amount);
    }

    function burnShares(address from, uint256 amount) public payable onlyExtension virtual {
        _burn(from, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"AlreadyVoted","type":"error"},{"inputs":[],"name":"InitCallFail","type":"error"},{"inputs":[],"name":"Initialized","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NoArrayParity","type":"error"},{"inputs":[],"name":"NotCurrentProposal","type":"error"},{"inputs":[],"name":"NotDetermined","type":"error"},{"inputs":[],"name":"NotExtension","type":"error"},{"inputs":[],"name":"NotMember","type":"error"},{"inputs":[],"name":"NotProposer","type":"error"},{"inputs":[],"name":"NotVoteable","type":"error"},{"inputs":[],"name":"NullAddress","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"PeriodBounds","type":"error"},{"inputs":[],"name":"PrevNotProcessed","type":"error"},{"inputs":[],"name":"QuorumMax","type":"error"},{"inputs":[],"name":"Reentrancy","type":"error"},{"inputs":[],"name":"SignatureExpired","type":"error"},{"inputs":[],"name":"Sponsored","type":"error"},{"inputs":[],"name":"SupermajorityBounds","type":"error"},{"inputs":[],"name":"TypeBounds","type":"error"},{"inputs":[],"name":"Uint32max","type":"error"},{"inputs":[],"name":"Uint96max","type":"error"},{"inputs":[],"name":"VotingNotEnded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proposer","type":"address"},{"indexed":true,"internalType":"uint256","name":"proposal","type":"uint256"},{"indexed":true,"internalType":"enum KaliDAO.ProposalType","name":"proposalType","type":"uint8"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"bytes[]","name":"payloads","type":"bytes[]"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"PauseFlipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proposer","type":"address"},{"indexed":true,"internalType":"uint256","name":"proposal","type":"uint256"}],"name":"ProposalCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposal","type":"uint256"},{"indexed":true,"internalType":"bool","name":"didProposalPass","type":"bool"}],"name":"ProposalProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"uint256","name":"proposal","type":"uint256"}],"name":"ProposalSponsored","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"uint256","name":"proposal","type":"uint256"},{"indexed":true,"internalType":"bool","name":"approve","type":"bool"}],"name":"VoteCast","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnShares","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"extensionData","type":"bytes"}],"name":"callExtension","outputs":[{"internalType":"bool","name":"mint","type":"bool"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposal","type":"uint256"}],"name":"cancelProposal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromTimestamp","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"docs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"extensions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposal","type":"uint256"}],"name":"getProposalArrays","outputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes[]","name":"payloads","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"docs_","type":"string"},{"internalType":"bool","name":"paused_","type":"bool"},{"internalType":"address[]","name":"extensions_","type":"address[]"},{"internalType":"bytes[]","name":"extensionsData_","type":"bytes[]"},{"internalType":"address[]","name":"voters_","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"},{"internalType":"uint32[16]","name":"govSettings_","type":"uint32[16]"}],"name":"init","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastYesVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintShares","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"sig","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"sig","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"sig","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposal","type":"uint256"}],"name":"processProposal","outputs":[{"internalType":"bool","name":"didProposalPass","type":"bool"},{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalStates","outputs":[{"internalType":"bool","name":"passed","type":"bool"},{"internalType":"bool","name":"processed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum KaliDAO.ProposalType","name":"","type":"uint8"}],"name":"proposalVoteTypes","outputs":[{"internalType":"enum KaliDAO.VoteType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"enum KaliDAO.ProposalType","name":"proposalType","type":"uint8"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"prevProposal","type":"uint256"},{"internalType":"uint96","name":"yesVotes","type":"uint96"},{"internalType":"uint96","name":"noVotes","type":"uint96"},{"internalType":"uint32","name":"creationTime","type":"uint32"},{"internalType":"address","name":"proposer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum KaliDAO.ProposalType","name":"proposalType","type":"uint8"},{"internalType":"string","name":"description","type":"string"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes[]","name":"payloads","type":"bytes[]"}],"name":"propose","outputs":[{"internalType":"uint256","name":"proposal","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposal","type":"uint256"}],"name":"sponsorProposal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"supermajority","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposal","type":"uint256"},{"internalType":"bool","name":"approve","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256","name":"proposal","type":"uint256"},{"internalType":"bool","name":"approve","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"voteBySig","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"voted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600c5534801561001557600080fd5b50615e5080620000266000396000f3fe6080604052600436106103435760003560e01c806370a08231116101b0578063b4b5ea57116100ec578063da35c66411610095578063e63bc62d1161006f578063e63bc62d14610ada578063e7a324dc14610afb578063ee7a7c0414610b2f578063f23a6e6114610b4257600080fd5b8063da35c66414610a79578063dd62ed3e14610a8f578063e0a8f6f514610ac757600080fd5b8063c3cda520116100c6578063c3cda52014610a40578063c9d27afe14610a53578063d505accf14610a6657600080fd5b8063b4b5ea57146109a8578063b9a08bd7146109c8578063bc197c81146109f857600080fd5b806395d89b41116101595780639b4a89ce116101335780639b4a89ce1461093d578063a06db7dc14610950578063a9059cbb14610975578063ac9650d81461098857600080fd5b806395d89b41146109025780639746d9401461091757806397b55f811461092a57600080fd5b80637867f7271161018a5780637867f7271461088e57806379cc6790146108c25780637ecebe00146108d557600080fd5b806370a08231146107e757806371cda63b14610814578063782d6fe11461085157600080fd5b80633644e5151161027f5780635b1d1c1f116102285780635c975abb116102025780635c975abb1461072157806366ee13b31461073b5780636a74effc1461078b5780636fcfff45146107ba57600080fd5b80635b1d1c1f146106cc5780635c19a95c146106e15780635c31f220146106f457600080fd5b80635277b4ae116102595780635277b4ae14610646578063528c198a14610681578063587cde1e1461069457600080fd5b80633644e515146105f457806336ceb11a1461060957806342966c681461063357600080fd5b80631703a018116102ec57806323b872dd116102c657806323b872dd14610559578063255c87bf1461056c57806330adf81f14610599578063313ce567146105cd57600080fd5b80631703a018146104f757806318160ddd146105205780631a9f05971461054457600080fd5b8063095ea7b31161031d578063095ea7b3146103df5780630cdfebfa14610402578063150b7a021461048157600080fd5b8063013cf08b1461034f57806302a251a31461038b57806306fdde03146103bd57600080fd5b3661034a57005b600080fd5b34801561035b57600080fd5b5061036f61036a366004614c59565b610b88565b6040516103829796959493929190614cfd565b60405180910390f35b34801561039757600080fd5b506010546103a89063ffffffff1681565b60405163ffffffff9091168152602001610382565b3480156103c957600080fd5b506103d2610c92565b6040516103829190614d6f565b6103f26103ed366004614d9e565b610d20565b6040519015158152602001610382565b34801561040e57600080fd5b5061045861041d366004614d9e565b600a60209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b6040805163ffffffff90931683526bffffffffffffffffffffffff909116602083015201610382565b34801561048d57600080fd5b506104c661049c366004614e11565b507f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610382565b34801561050357600080fd5b506010546103a89068010000000000000000900463ffffffff1681565b34801561052c57600080fd5b5061053660025481565b604051908152602001610382565b610557610552366004614eaa565b610d8d565b005b6103f2610567366004614f0b565b610f6f565b34801561057857600080fd5b50610536610587366004614f47565b60166020526000908152604090205481565b3480156105a557600080fd5b506105367f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156105d957600080fd5b506105e2601281565b60405160ff9091168152602001610382565b34801561060057600080fd5b506105366110d2565b61061c610617366004614f62565b6110f1565b604080519215158352602083019190915201610382565b610557610641366004614c59565b611257565b34801561065257600080fd5b506103f2610661366004614fbc565b601560209081526000928352604080842090915290825290205460ff1681565b61055761068f366004614d9e565b611264565b3480156106a057600080fd5b506106b46106af366004614f47565b6112bb565b6040516001600160a01b039091168152602001610382565b3480156106d857600080fd5b506103d26112eb565b6105576106ef366004614f47565b6112f8565b34801561070057600080fd5b506010546103a8906c01000000000000000000000000900463ffffffff1681565b34801561072d57600080fd5b506008546103f29060ff1681565b34801561074757600080fd5b50610774610756366004614c59565b60136020526000908152604090205460ff8082169161010090041682565b604080519215158352901515602083015201610382565b34801561079757600080fd5b506107ab6107a6366004614c59565b611302565b6040516103829392919061503d565b3480156107c657600080fd5b506105366107d5366004614f47565b600b6020526000908152604090205481565b3480156107f357600080fd5b50610536610802366004614f47565b60036020526000908152604090205481565b34801561082057600080fd5b5061084461082f3660046150e3565b60146020526000908152604090205460ff1681565b60405161038291906150fe565b34801561085d57600080fd5b5061087161086c366004614d9e565b6114b9565b6040516bffffffffffffffffffffffff9091168152602001610382565b34801561089a57600080fd5b506105367f39bf2cb78b4fee6e3427925ed40cf1f955458a02ac29c312c7be5fde74d0dd7a81565b6105576108d0366004614d9e565b6116c0565b3480156108e157600080fd5b506105366108f0366004614f47565b60076020526000908152604090205481565b34801561090e57600080fd5b506103d261172f565b610557610925366004614c59565b61173c565b6105576109383660046153fd565b611912565b61053661094b36600461554c565b6122a9565b34801561095c57600080fd5b506010546103a890640100000000900463ffffffff1681565b6103f2610983366004614d9e565b61295e565b61099b610996366004615623565b612a29565b6040516103829190615665565b3480156109b457600080fd5b506105366109c3366004614f47565b612b99565b3480156109d457600080fd5b506103f26109e3366004614f47565b60116020526000908152604090205460ff1681565b348015610a0457600080fd5b506104c6610a13366004615678565b507fbc197c8100000000000000000000000000000000000000000000000000000000979650505050505050565b610557610a4e366004615733565b612c12565b610557610a61366004615771565b612e1e565b610557610a743660046157a1565b612e74565b348015610a8557600080fd5b50610536600f5481565b348015610a9b57600080fd5b50610536610aaa36600461580b565b600460209081526000928352604080842090915290825290205481565b610557610ad5366004614c59565b6130c3565b610aed610ae8366004614c59565b613298565b604051610382929190615835565b348015610b0757600080fd5b506105367f76995fe87be88484696cfd6792aeb71e0b61f81dfa3b641e5adffa38a0d3b8e281565b610557610b3d366004614d9e565b613eb5565b348015610b4e57600080fd5b506104c6610b5d366004615858565b507ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6012602052600090815260409020805460018201805460ff9092169291610bae906158d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610bda906158d0565b8015610c275780601f10610bfc57610100808354040283529160200191610c27565b820191906000526020600020905b815481529060010190602001808311610c0a57829003601f168201915b5050505060058301546006840154600790940154929390926bffffffffffffffffffffffff80831693506c01000000000000000000000000830416917801000000000000000000000000000000000000000000000000900463ffffffff16906001600160a01b031687565b60008054610c9f906158d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccb906158d0565b8015610d185780601f10610ced57610100808354040283529160200191610d18565b820191906000526020600020905b815481529060010190602001808311610cfb57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d7b9086815260200190565b60405180910390a35060015b92915050565b6002600c541415610dca576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c556000610dd96110d2565b604080517f39bf2cb78b4fee6e3427925ed40cf1f955458a02ac29c312c7be5fde74d0dd7a60208201526001600160a01b038a169181019190915260608101889052861515608082015260a00160405160208183030381529060405280519060200120604051602001610e7e9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580610f1e5750876001600160a01b0316816001600160a01b031614155b15610f55576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f60888888613efe565b50506001600c55505050505050565b60085460009060ff1615610faf576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416600090815260046020908152604080832033845290915290205460001914611014576001600160a01b03841660009081526004602090815260408083203384529091528120805484929061100e908490615953565b90915550505b6001600160a01b0384166000908152600360205260408120805484929061103c908490615953565b90915550506001600160a01b038316600090815260036020526040902080548301905561107a61106b856112bb565b611074856112bb565b8461411f565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516110bf91815260200190565b60405180910390a35060015b9392505050565b600060055446146110ea576110e56142a8565b905090565b5060065490565b6000806002600c541415611131576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c556001600160a01b03861660009081526011602052604090205460ff16611188576040517fcb92848a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f36ceb11a0000000000000000000000000000000000000000000000000000000081526001600160a01b038716906336ceb11a9034906111d59033908a908a908a90600401615995565b604080518083038185885af11580156111f2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061121791906159c8565b90925090508115611237578015611232576112323382614342565b611247565b80156112475761124733866143d0565b6001600c55909590945092505050565b61126133826143d0565b50565b3360009081526011602052604090205460ff166112ad576040517fcb92848a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112b78282614342565b5050565b6001600160a01b0380821660009081526009602052604081205490911680156112e457806110cb565b5090919050565b600d8054610c9f906158d0565b6112613382614458565b606080606060006012600086815260200190815260200160002090508060020181600301826004018280548060200260200160405190810160405280929190818152602001828054801561137f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611361575b50505050509250818054806020026020016040519081016040528092919081815260200182805480156113d157602002820191906000526020600020905b8154815260200190600101908083116113bd575b5050505050915080805480602002602001604051908101604052809291908181526020016000905b828210156114a5578382906000526020600020018054611418906158d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611444906158d0565b80156114915780601f1061146657610100808354040283529160200191611491565b820191906000526020600020905b81548152906001019060200180831161147457829003601f168201915b5050505050815260200190600101906113f9565b50959b949a50919850929650505050505050565b60008142116114f4576040517fb1998e3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152600b60205260409020548061151c576000915050610d87565b6001600160a01b0384166000908152600a602090815260408083206000198501845290915290205463ffffffff168310611596576001600160a01b0384166000908152600a60209081526040808320600019909401835292905220546bffffffffffffffffffffffff640100000000909104169050610d87565b6001600160a01b0384166000908152600a6020908152604080832083805290915290205463ffffffff168310156115d1576000915050610d87565b600060001982015b8181111561167c576001600160a01b0386166000908152600a6020908152604080832060028686030485038085529083529281902081518083019092525463ffffffff81168083526401000000009091046bffffffffffffffffffffffff16928201929092529087141561165757602001519450610d879350505050565b805163ffffffff1687111561166e57819350611675565b6001820392505b50506115d9565b506001600160a01b0385166000908152600a6020908152604080832093835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b6001600160a01b038216600090815260046020908152604080832033845290915290205460001914611725576001600160a01b03821660009081526004602090815260408083203384529091528120805483929061171f908490615953565b90915550505b6112b782826143d0565b60018054610c9f906158d0565b6002600c541415611779576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c5560008181526012602090815260408083203384526003909252909120546117d1576040517f291fc44200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60078101546001600160a01b0316611815576040517fc3b4ca4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068101547801000000000000000000000000000000000000000000000000900463ffffffff1615611873576040517f68e83fd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e8054600583015582905561188842614512565b60068201805463ffffffff929092167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055604051829033907fb708f3e57d02b42c1c66c9219454b2e519739ad18a0566a9a71a1e537f1f6e5d90600090a350506001600c55565b6002600c54141561194f576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c55855187511461198f576040517f266c51bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60105463ffffffff16156119cf576040517f5daa87a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805163ffffffff1615806119ef575080516301e1338063ffffffff909116115b15611a26576040517fb03b646a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e13380816001602002015163ffffffff161115611a71576040517fb03b646a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6064816002602002015163ffffffff161115611ab9576040517ffff2d93300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6033816003602002015163ffffffff16111580611ae357506064816003602002015163ffffffff16115b15611b1a576040517f6ef10f9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b8a8b8b8a88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061455692505050565b865115611cec5760005b8751811015611cea576001601160008a8481518110611bb557611bb56159f6565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506003878281518110611c0857611c086159f6565b6020026020010151511115611ce2576000888281518110611c2b57611c2b6159f6565b60200260200101516001600160a01b0316888381518110611c4e57611c4e6159f6565b6020026020010151604051611c639190615a25565b6000604051808303816000865af19150503d8060008114611ca0576040519150601f19603f3d011682016040523d82523d6000602084013e611ca5565b606091505b5050905080611ce0576040517f6f39bd6000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b600101611b94565b505b8851611cff90600d9060208c01906149b6565b5080516010805460208401516040850151606086015163ffffffff9081166c0100000000000000000000000002928116640100000000029581167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941693909317949094177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1693821668010000000000000000027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16939093179290921790556080820151166003811115611dd857611dd8614c72565b6000805260146020527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c805460ff19166001836003811115611e1c57611e1c614c72565b021790555060a081015163ffffffff166003811115611e3d57611e3d614c72565b6001600081905260146020527fb6c61a840592cc84133e4b25bd509abf4659307c57b160799b38490a5aa48f2c8054909160ff1990911690836003811115611e8757611e87614c72565b021790555060c081015163ffffffff166003811115611ea857611ea8614c72565b600260005260146020527fa1930aa930426c54c34daad2b9ada7c5d0ef0c96078a3c5bb79f6fa6602c4a7a805460ff19166001836003811115611eed57611eed614c72565b021790555060e081015163ffffffff166003811115611f0e57611f0e614c72565b6003600081905260146020527f63d87a887046e0430be80fdeb014107d7198c879cbf2cddf39a6df195c86cb388054909160ff19909116906001908490811115611f5a57611f5a614c72565b021790555061010081015163ffffffff166003811115611f7c57611f7c614c72565b600460005260146020527f52102136546d97ed3f65ec1070a32935d3048ea12f310d29c378dc9d6555c0d6805460ff19166001836003811115611fc157611fc1614c72565b021790555061012081015163ffffffff166003811115611fe357611fe3614c72565b600560005260146020527f116126bec5aaa49b347e966c49378cf0c441de9121e306ea3d824584a9615aa2805460ff1916600183600381111561202857612028614c72565b021790555061014081015163ffffffff16600381111561204a5761204a614c72565b600660005260146020527fe1f6b6a5fb7e47dad87547d4b0671e7e995a1dae22fbe5b3b5d10e2a77ed7aff805460ff1916600183600381111561208f5761208f614c72565b021790555061016081015163ffffffff1660038111156120b1576120b1614c72565b600760005260146020527f904977a779b22381a36c6463d4166ef55ee8cb3392c83093cb1750f1a00c9d94805460ff191660018360038111156120f6576120f6614c72565b021790555061018081015163ffffffff16600381111561211857612118614c72565b600860005260146020527f125fdacc24f94fb724c0c32a4eab75d67204551eb2448dadf875d535a7449726805460ff1916600183600381111561215d5761215d614c72565b02179055506101a081015163ffffffff16600381111561217f5761217f614c72565b600960005260146020527ff517404d914a19d455440d961937db67771e4bfb0b4293ff6fd7c75855208c19805460ff191660018360038111156121c4576121c4614c72565b02179055506101c081015163ffffffff1660038111156121e6576121e6614c72565b600a60005260146020527f65f9512343925c57130fd77667cb42fc83560c400ede0c87f3de7c6c27cf09a6805460ff1916600183600381111561222b5761222b614c72565b02179055506101e081015163ffffffff16600381111561224d5761224d614c72565b600b60005260146020527fdabe84bb17a8774762b6726edd7eb728da1732e1ab123804fc9345b7300e0a2e805460ff1916600183600381111561229257612292614c72565b0217905550506001600c5550505050505050505050565b60006002600c5414156122e8576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c5585841415806122fc5750838214155b15612333576040517f266c51bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038a600b81111561234757612347614c72565b14156123c85784846000818110612360576123606159f6565b905060200201356000148061239157506301e1338085856000818110612388576123886159f6565b90506020020135115b156123c8576040517fb03b646a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048a600b8111156123dc576123dc614c72565b1415612439576301e13380858560008181106123fa576123fa6159f6565b905060200201351115612439576040517fb03b646a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058a600b81111561244d5761244d614c72565b14156124a757606485856000818110612468576124686159f6565b9050602002013511156124a7576040517ffff2d93300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068a600b8111156124bb576124bb614c72565b141561253a576033858560008181106124d6576124d66159f6565b9050602002013511158061250357506064858560008181106124fa576124fa6159f6565b90506020020135115b1561253a576040517f6ef10f9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60078a600b81111561254e5761254e614c72565b14156125d857600b85856000818110612569576125696159f6565b905060200201351180612595575060038585600181811061258c5761258c6159f6565b90506020020135115b806125a1575060028414155b156125d8576040517f93d8c8b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526003602052604081205415158061260457503360009081526011602052604090205460ff165b1561260d575060015b600f805460010190819055604080516101408101909152909250808c600b81111561263a5761263a614c72565b81526020018b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040805160208b810282810182019093528b82529283019290918c918c91829185019084908082843760009201919091525050509082525060408051602089810282810182019093528982529283019290918a918a9182918501908490808284376000920191909152505050908252506020016126f58587615a41565b81526020018261270657600061270a565b600e545b8152600060208201819052604082015260600182612729576000612732565b61273242614512565b63ffffffff16815233602091820152600084815260129091526040902081518154829060ff1916600183600b81111561276d5761276d614c72565b0217905550602082810151805161278a92600185019201906149b6565b50604082015180516127a6916002840191602090910190614a36565b50606082015180516127c2916003840191602090910190614aa3565b50608082015180516127de916004840191602090910190614add565b5060a0820151600582015560c082015160068201805460e085015161010086015163ffffffff167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff6bffffffffffffffffffffffff9283166c01000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009094169290951691909117919091179290921691909117905561012090910151600790910180546001600160a01b039092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905580156128e957600e8290555b8a600b8111156128fb576128fb614c72565b82336001600160a01b03167feaebeb60fa3c5b4aaac8452fe75b188beb61a499d379464587545ede83fbea3e8d8d8d8d8d8d8d8d604051612943989796959493929190615af0565b60405180910390a4506001600c559998505050505050505050565b60085460009060ff161561299e576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260036020526040812080548492906129bd908490615953565b90915550506001600160a01b03831660009081526003602052604090208054830190556129ec61106b336112bb565b6040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d7b565b60608167ffffffffffffffff811115612a4457612a44615118565b604051908082528060200260200182016040528015612a7757816020015b6060815260200190600190039081612a625790505b50905060005b82811015612b925760008030868685818110612a9b57612a9b6159f6565b9050602002810190612aad9190615bbc565b604051612abb929190615c21565b600060405180830381855af49150503d8060008114612af6576040519150601f19603f3d011682016040523d82523d6000602084013e612afb565b606091505b509150915081612b6a57604481511015612b1457600080fd5b60048101905080806020019051810190612b2e9190615c31565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b619190614d6f565b60405180910390fd5b80848481518110612b7d57612b7d6159f6565b60209081029190910101525050600101612a7d565b5092915050565b6001600160a01b0381166000908152600b602052604081205480612bbe576000612bfd565b6001600160a01b0383166000908152600a602090815260408083206000198501845290915290205464010000000090046bffffffffffffffffffffffff165b6bffffffffffffffffffffffff169392505050565b83421115612c4c576040517f0819bdcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517f76995fe87be88484696cfd6792aeb71e0b61f81dfa3b641e5adffa38a0d3b8e260208201526001600160a01b03881691810191909152606081018690526080810185905260009060a0016040516020818303038152906040528051906020012090506000612cbd6110d2565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015612d63573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612db0576040517fe99d5ac500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090208054600181019091558814612e09576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e13818a614458565b505050505050505050565b6002600c541415612e5b576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c55612e6b338383613efe565b50506001600c55565b83421115612eae576040517f0819bdcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612eb86110d2565b6001600160a01b0389811660008181526007602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e0830190915280519201919091207f19010000000000000000000000000000000000000000000000000000000000006101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612fec573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806130215750886001600160a01b0316816001600160a01b031614155b15613058576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0390811660009081526004602090815260408083208b8516808552908352928190208a905551898152919350918a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6002600c541415613100576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c55600081815260126020526040902060078101546001600160a01b03163314613159576040517f7d1b73b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068101547801000000000000000000000000000000000000000000000000900463ffffffff16156131b7576040517f68e83fd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152601260205260408120805460ff19168155906131db6001830182614b36565b6131e9600283016000614b70565b6131f7600383016000614b70565b613205600483016000614b8e565b506000600582018190556006820180547fffffffff00000000000000000000000000000000000000000000000000000000169055600790910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055604051839133917f5d423f6a55211a90b8438786aa7edfa40d3eef381b6aae048b52daf814c164629190a350506001600c55565b600060606002600c5414156132d9576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c5560008381526012602052604081208054909190601490829060ff16600b81111561330a5761330a614c72565b600b81111561331b5761331b614c72565b8152602081019190915260400160002054600683015460ff90911691507801000000000000000000000000000000000000000000000000900463ffffffff16613390576040517fc3b4ca4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60105460068301547801000000000000000000000000000000000000000000000000900463ffffffff90811681831601640100000000909204811691909101164211613408576040517f7f8617a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a825460ff16600b81111561342057613420614c72565b146134955760058201546000908152601260205260409020600601547801000000000000000000000000000000000000000000000000900463ffffffff1615613495576040517f8795d9c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068201546134c79082906bffffffffffffffffffffffff808216916c01000000000000000000000000900416614626565b93508315613d98576000825460ff16600b8111156134e7576134e7614c72565b141561355c5760005b600283015481101561355a57613552836002018281548110613514576135146159f6565b6000918252602090912001546003850180546001600160a01b039092169184908110613542576135426159f6565b9060005260206000200154614342565b6001016134f0565b505b6001825460ff16600b81111561357457613574614c72565b14156135e95760005b60028301548110156135e7576135df8360020182815481106135a1576135a16159f6565b6000918252602090912001546003850180546001600160a01b0390921691849081106135cf576135cf6159f6565b90600052602060002001546143d0565b60010161357d565b505b6002825460ff16600b81111561360157613601614c72565b14156137545760005b600283015481101561375257600283015467ffffffffffffffff81111561363357613633615118565b60405190808252806020026020018201604052801561366657816020015b60608152602001906001900390816136515790505b5093506000836002018281548110613680576136806159f6565b6000918252602090912001546003850180546001600160a01b0390921691849081106136ae576136ae6159f6565b90600052602060002001548560040184815481106136ce576136ce6159f6565b906000526020600020016040516136e59190615d17565b60006040518083038185875af1925050503d8060008114613722576040519150601f19603f3d011682016040523d82523d6000602084013e613727565b606091505b509150508085838151811061373e5761373e6159f6565b60209081029190910101525060010161360a565b505b6003825460ff16600b81111561376c5761376c614c72565b14156137f15781600301600081548110613788576137886159f6565b90600052602060002001546000146137f157816003016000815481106137b0576137b06159f6565b600091825260209091200154601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9092169190911790555b6004825460ff16600b81111561380957613809614c72565b14156138795781600301600081548110613825576138256159f6565b9060005260206000200154600014613879578160030160008154811061384d5761384d6159f6565b9060005260206000200154601060046101000a81548163ffffffff021916908363ffffffff1602179055505b6005825460ff16600b81111561389157613891614c72565b141561390157816003016000815481106138ad576138ad6159f6565b906000526020600020015460001461390157816003016000815481106138d5576138d56159f6565b9060005260206000200154601060086101000a81548163ffffffff021916908363ffffffff1602179055505b6006825460ff16600b81111561391957613919614c72565b14156139895781600301600081548110613935576139356159f6565b9060005260206000200154600014613989578160030160008154811061395d5761395d6159f6565b90600052602060002001546010600c6101000a81548163ffffffff021916908363ffffffff1602179055505b6007825460ff16600b8111156139a1576139a1614c72565b1415613a6157816003016001815481106139bd576139bd6159f6565b906000526020600020015460038111156139d9576139d9614c72565b60146000846003016000815481106139f3576139f36159f6565b9060005260206000200154600b811115613a0f57613a0f614c72565b600b811115613a2057613a20614c72565b600b811115613a3157613a31614c72565b81526020810191909152604001600020805460ff19166001836003811115613a5b57613a5b614c72565b02179055505b6008825460ff16600b811115613a7957613a79614c72565b1415613a8757613a87614767565b6009825460ff16600b811115613a9f57613a9f614c72565b1415613c525760005b6002830154811015613c5057826003018181548110613ac957613ac96159f6565b9060005260206000200154600014613b715760116000846002018381548110613af457613af46159f6565b60009182526020808320909101546001600160a01b0316835282019290925260400181205460028501805460ff909216159260119290919085908110613b3c57613b3c6159f6565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff19169115159190911790555b6003836004018281548110613b8857613b886159f6565b906000526020600020018054613b9d906158d0565b90501115613c4857826002018181548110613bba57613bba6159f6565b6000918252602090912001546004840180546001600160a01b039092169163fb0c4441919084908110613bef57613bef6159f6565b906000526020600020016040518263ffffffff1660e01b8152600401613c159190615d23565b600060405180830381600087803b158015613c2f57600080fd5b505af1158015613c43573d6000803e3d6000fd5b505050505b600101613aa8565b505b600a825460ff16600b811115613c6a57613c6a614c72565b1415613d41576012600083600301600081548110613c8a57613c8a6159f6565b600091825260208083209091015483528201929092526040018120805460ff1916815590613cbb6001830182614b36565b613cc9600283016000614b70565b613cd7600383016000614b70565b613ce5600483016000614b8e565b50600060058201556006810180547fffffffff0000000000000000000000000000000000000000000000000000000016905560070180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b600b825460ff16600b811115613d5957613d59614c72565b1415613d7e5781600101600d908054613d71906158d0565b613d7c929190614bac565b505b6000858152601360205260409020805460ff191660011790555b6000858152601260205260408120805460ff1916815590613dbc6001830182614b36565b613dca600283016000614b70565b613dd8600383016000614b70565b613de6600483016000614b8e565b506000600582018190556006820180547fffffffff00000000000000000000000000000000000000000000000000000000169055600790910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558581526013602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055518515159187917fcc8b74c10cae169918eab7cf3272b0a540854b8a4d12281590885d07fed34f6e9190a350506001600c559092909150565b3360009081526011602052604090205460ff16611725576040517fcb92848a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152601260209081526040808320601583528184206001600160a01b03881685529092529091205460ff1615613f63576040517f7c9a1cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601054600682015463ffffffff918216780100000000000000000000000000000000000000000000000090910482160116421115613fcd576040517f47c8137d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068101546000906140029086907801000000000000000000000000000000000000000000000000900463ffffffff166114b9565b9050821561406a576006820180546bffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009091161790556001600160a01b03851660009081526016602052604090208490556140be565b6006820180546bffffffffffffffffffffffff6c0100000000000000000000000080830482168501909116027fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff9091161790555b60008481526015602090815260408083206001600160a01b0389168085529252808320805460ff1916600117905551851515928792917fd356173ae8eeea8691aee4c1be712c314a975a3d43ebc48b08ca54d0dac912289190a45050505050565b816001600160a01b0316836001600160a01b03161415801561414057508015155b156141f4576001600160a01b038316156141f4576001600160a01b0383166000908152600b6020526040812054908161417a5760006141c6565b6001600160a01b0385166000908152600a602052604081209061419e600185615953565b815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b6bffffffffffffffffffffffff16905060006141e28483615953565b90506141f0868484846147b4565b5050505b6001600160a01b038216156142a3576001600160a01b0382166000908152600b60205260408120549081614229576000614275565b6001600160a01b0384166000908152600a602052604081209061424d600185615953565b815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b6bffffffffffffffffffffffff16905060006142918483615da8565b905061429f858484846147b4565b5050505b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516142da9190615d17565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b80600260008282546143549190615da8565b90915550506001600160a01b038216600090815260036020526040812080548301905561438a90614384846112bb565b8361411f565b6040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906143f8908490615953565b909155505060028054829003905561441a614412836112bb565b60008361411f565b6040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016143c4565b6000614463836112bb565b6001600160a01b03848116600090815260096020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948816949094179093556003905220549091506144c3908290849061411f565b816001600160a01b0316816001600160a01b0316846001600160a01b03167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4505050565b600063ffffffff821115614552576040517fec314e4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b8051825114614591576040517f266c51bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516145a49060009060208801906149b6565b5083516145b89060019060208701906149b6565b506008805460ff1916841515179055466005556145d36142a8565b60065560005b825181101561429f5761461e8382815181106145f7576145f76159f6565b6020026020010151838381518110614611576146116159f6565b6020026020010151614342565b6001016145d9565b600082158015614634575081155b15614641575060006110cb565b600184600381111561465557614655614c72565b14806146725750600384600381111561467057614670614c72565b145b156146c45760105460025460009160649161469f9168010000000000000000900463ffffffff1690615dc0565b6146a99190615ddf565b9050838301818110156146c1576000925050506110cb565b50505b60008460038111156146d8576146d8614c72565b14806146f5575060018460038111156146f3576146f3614c72565b145b1561470f578183111561470a575060016110cb565b6110cb565b6010546000906064906c01000000000000000000000000900463ffffffff166147388587615da8565b6147429190615dc0565b61474c9190615ddf565b905080841061475f5760019150506110cb565b509392505050565b6008805460ff8082161560ff1990921682179092556040519116151581527f28ef61d7a1c224006e6530d510be74c9c673f4a9896202105e3d4f60511779d19060200160405180910390a1565b82158015906147ef57506001600160a01b0384166000908152600a602090815260408083206000198701845290915290205463ffffffff1642145b1561486d576147fd8161496e565b6001600160a01b0385166000908152600a6020908152604080832060001988018452909152902080546bffffffffffffffffffffffff92909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff909216919091179055614924565b604051806040016040528061488142614512565b63ffffffff1681526020016148958361496e565b6bffffffffffffffffffffffff9081169091526001600160a01b0386166000818152600a6020908152604080832089845282528083208651815497840151909616640100000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090971663ffffffff9096169590951795909517909355908152600b909152206001840190555b60408051838152602081018390526001600160a01b038616917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a250505050565b60006bffffffffffffffffffffffff821115614552576040517f39a21c5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8280546149c2906158d0565b90600052602060002090601f0160209004810192826149e45760008555614a2a565b82601f106149fd57805160ff1916838001178555614a2a565b82800160010185558215614a2a579182015b82811115614a2a578251825591602001919060010190614a0f565b50614552929150614c27565b828054828255906000526020600020908101928215614a2a579160200282015b82811115614a2a57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190614a56565b828054828255906000526020600020908101928215614a2a5791602002820182811115614a2a578251825591602001919060010190614a0f565b828054828255906000526020600020908101928215614b2a579160200282015b82811115614b2a5782518051614b1a9184916020909101906149b6565b5091602001919060010190614afd565b50614552929150614c3c565b508054614b42906158d0565b6000825580601f10614b52575050565b601f0160209004906000526020600020908101906112619190614c27565b50805460008255906000526020600020908101906112619190614c27565b50805460008255906000526020600020908101906112619190614c3c565b828054614bb8906158d0565b90600052602060002090601f016020900481019282614bda5760008555614a2a565b82601f10614beb5780548555614a2a565b82800160010185558215614a2a57600052602060002091601f016020900482015b82811115614a2a578254825591600101919060010190614c0c565b5b808211156145525760008155600101614c28565b80821115614552576000614c508282614b36565b50600101614c3c565b600060208284031215614c6b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60005b83811015614cbc578181015183820152602001614ca4565b83811115614ccb576000848401525b50505050565b60008151808452614ce9816020860160208601614ca1565b601f01601f19169290920160200192915050565b6000600c8910614d0f57614d0f614c72565b88825260e06020830152614d2660e0830189614cd1565b6040830197909752506bffffffffffffffffffffffff948516606082015292909316608083015263ffffffff1660a08201526001600160a01b0390911660c09091015292915050565b6020815260006110cb6020830184614cd1565b80356001600160a01b0381168114614d9957600080fd5b919050565b60008060408385031215614db157600080fd5b614dba83614d82565b946020939093013593505050565b60008083601f840112614dda57600080fd5b50813567ffffffffffffffff811115614df257600080fd5b602083019150836020828501011115614e0a57600080fd5b9250929050565b600080600080600060808688031215614e2957600080fd5b614e3286614d82565b9450614e4060208701614d82565b935060408601359250606086013567ffffffffffffffff811115614e6357600080fd5b614e6f88828901614dc8565b969995985093965092949392505050565b801515811461126157600080fd5b8035614d9981614e80565b803560ff81168114614d9957600080fd5b60008060008060008060c08789031215614ec357600080fd5b614ecc87614d82565b9550602087013594506040870135614ee381614e80565b9350614ef160608801614e99565b92506080870135915060a087013590509295509295509295565b600080600060608486031215614f2057600080fd5b614f2984614d82565b9250614f3760208501614d82565b9150604084013590509250925092565b600060208284031215614f5957600080fd5b6110cb82614d82565b60008060008060608587031215614f7857600080fd5b614f8185614d82565b935060208501359250604085013567ffffffffffffffff811115614fa457600080fd5b614fb087828801614dc8565b95989497509550505050565b60008060408385031215614fcf57600080fd5b82359150614fdf60208401614d82565b90509250929050565b600081518084526020808501808196508360051b8101915082860160005b8581101561503057828403895261501e848351614cd1565b98850198935090840190600101615006565b5091979650505050505050565b606080825284519082018190526000906020906080840190828801845b8281101561507f5781516001600160a01b03168452928401929084019060010161505a565b5050508381038285015285518082528683019183019060005b818110156150b457835183529284019291840191600101615098565b505084810360408601526150c88187614fe8565b98975050505050505050565b8035600c8110614d9957600080fd5b6000602082840312156150f557600080fd5b6110cb826150d4565b602081016004831061511257615112614c72565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561517057615170615118565b604052919050565b600067ffffffffffffffff82111561519257615192615118565b50601f01601f191660200190565b60006151b36151ae84615178565b615147565b90508281528383830111156151c757600080fd5b828260208301376000602084830101529392505050565b600082601f8301126151ef57600080fd5b6110cb838335602085016151a0565b600067ffffffffffffffff82111561521857615218615118565b5060051b60200190565b600082601f83011261523357600080fd5b813560206152436151ae836151fe565b82815260059290921b8401810191818101908684111561526257600080fd5b8286015b848110156152845761527781614d82565b8352918301918301615266565b509695505050505050565b600061529d6151ae846151fe565b8381529050602080820190600585901b8401868111156152bc57600080fd5b845b8181101561530c57803567ffffffffffffffff8111156152de5760008081fd5b8601601f810189136152f05760008081fd5b6152fe8982358684016151a0565b8552509282019282016152be565b505050509392505050565b600082601f83011261532857600080fd5b6110cb8383356020850161528f565b60008083601f84011261534957600080fd5b50813567ffffffffffffffff81111561536157600080fd5b6020830191508360208260051b8501011115614e0a57600080fd5b600082601f83011261538d57600080fd5b60405161020080820182811067ffffffffffffffff821117156153b2576153b2615118565b604052830181858211156153c557600080fd5b845b828110156153f257803563ffffffff811681146153e45760008081fd5b8252602091820191016153c7565b509195945050505050565b60008060008060008060008060008060006103008c8e03121561541f57600080fd5b67ffffffffffffffff808d35111561543657600080fd5b6154438e8e358f016151de565b9b508060208e0135111561545657600080fd5b6154668e60208f01358f016151de565b9a508060408e0135111561547957600080fd5b6154898e60408f01358f016151de565b995061549760608e01614e8e565b98508060808e013511156154aa57600080fd5b6154ba8e60808f01358f01615222565b97508060a08e013511156154cd57600080fd5b6154dd8e60a08f01358f01615317565b96508060c08e013511156154f057600080fd5b6155008e60c08f01358f01615337565b909650945060e08d013581101561551657600080fd5b506155278d60e08e01358e01615337565b909350915061553a8d6101008e0161537c565b90509295989b509295989b9093969950565b600080600080600080600080600060a08a8c03121561556a57600080fd5b6155738a6150d4565b985060208a013567ffffffffffffffff8082111561559057600080fd5b61559c8d838e01614dc8565b909a50985060408c01359150808211156155b557600080fd5b6155c18d838e01615337565b909850965060608c01359150808211156155da57600080fd5b6155e68d838e01615337565b909650945060808c01359150808211156155ff57600080fd5b5061560c8c828d01615337565b915080935050809150509295985092959850929598565b6000806020838503121561563657600080fd5b823567ffffffffffffffff81111561564d57600080fd5b61565985828601615337565b90969095509350505050565b6020815260006110cb6020830184614fe8565b60008060008060008060008060a0898b03121561569457600080fd5b61569d89614d82565b97506156ab60208a01614d82565b9650604089013567ffffffffffffffff808211156156c857600080fd5b6156d48c838d01615337565b909850965060608b01359150808211156156ed57600080fd5b6156f98c838d01615337565b909650945060808b013591508082111561571257600080fd5b5061571f8b828c01614dc8565b999c989b5096995094979396929594505050565b60008060008060008060c0878903121561574c57600080fd5b61575587614d82565b95506020870135945060408701359350614ef160608801614e99565b6000806040838503121561578457600080fd5b82359150602083013561579681614e80565b809150509250929050565b600080600080600080600060e0888a0312156157bc57600080fd5b6157c588614d82565b96506157d360208901614d82565b955060408801359450606088013593506157ef60808901614e99565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561581e57600080fd5b61582783614d82565b9150614fdf60208401614d82565b82151581526040602082015260006158506040830184614fe8565b949350505050565b60008060008060008060a0878903121561587157600080fd5b61587a87614d82565b955061588860208801614d82565b94506040870135935060608701359250608087013567ffffffffffffffff8111156158b257600080fd5b6158be89828a01614dc8565b979a9699509497509295939492505050565b600181811c908216806158e457607f821691505b6020821081141561591e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561596557615965615924565b500390565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6001600160a01b03851681528360208201526060604082015260006159be60608301848661596a565b9695505050505050565b600080604083850312156159db57600080fd5b82516159e681614e80565b6020939093015192949293505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008251615a37818460208701614ca1565b9190910192915050565b60006110cb36848461528f565b81835260006020808501808196508560051b810191508460005b8781101561503057828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112615aa757600080fd5b8701803567ffffffffffffffff811115615ac057600080fd5b803603891315615acf57600080fd5b615adc868289850161596a565b9a87019a9550505090840190600101615a68565b608081526000615b04608083018a8c61596a565b8281036020848101919091528882528991810160005b8a811015615b46576001600160a01b03615b3385614d82565b1682529282019290820190600101615b1a565b5084810360408601528781527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff881115615b7f57600080fd5b8760051b9250828983830137600092018181019283528481038201606086015291615bab818789615a4e565b9d9c50505050505050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615bf157600080fd5b83018035915067ffffffffffffffff821115615c0c57600080fd5b602001915036819003821315614e0a57600080fd5b8183823760009101908152919050565b600060208284031215615c4357600080fd5b815167ffffffffffffffff811115615c5a57600080fd5b8201601f81018413615c6b57600080fd5b8051615c796151ae82615178565b818152856020838501011115615c8e57600080fd5b615c9f826020830160208601614ca1565b95945050505050565b60008154615cb5816158d0565b60018281168015615ccd5760018114615cde57615d0d565b60ff19841687528287019450615d0d565b8560005260208060002060005b85811015615d045781548a820152908401908201615ceb565b50505082870194505b5050505092915050565b60006110cb8284615ca8565b6000602080835260008454615d37816158d0565b80848701526040600180841660008114615d585760018114615d6c57615d9a565b60ff198516838a0152606089019550615d9a565b896000528660002060005b85811015615d925781548b8201860152908301908801615d77565b8a0184019650505b509398975050505050505050565b60008219821115615dbb57615dbb615924565b500190565b6000816000190483118215151615615dda57615dda615924565b500290565b600082615e15577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220c81d278a997ba3088d681de4d1f32e908bb47cb5aeecaac15659f0a5d8ed7f0c64736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106103435760003560e01c806370a08231116101b0578063b4b5ea57116100ec578063da35c66411610095578063e63bc62d1161006f578063e63bc62d14610ada578063e7a324dc14610afb578063ee7a7c0414610b2f578063f23a6e6114610b4257600080fd5b8063da35c66414610a79578063dd62ed3e14610a8f578063e0a8f6f514610ac757600080fd5b8063c3cda520116100c6578063c3cda52014610a40578063c9d27afe14610a53578063d505accf14610a6657600080fd5b8063b4b5ea57146109a8578063b9a08bd7146109c8578063bc197c81146109f857600080fd5b806395d89b41116101595780639b4a89ce116101335780639b4a89ce1461093d578063a06db7dc14610950578063a9059cbb14610975578063ac9650d81461098857600080fd5b806395d89b41146109025780639746d9401461091757806397b55f811461092a57600080fd5b80637867f7271161018a5780637867f7271461088e57806379cc6790146108c25780637ecebe00146108d557600080fd5b806370a08231146107e757806371cda63b14610814578063782d6fe11461085157600080fd5b80633644e5151161027f5780635b1d1c1f116102285780635c975abb116102025780635c975abb1461072157806366ee13b31461073b5780636a74effc1461078b5780636fcfff45146107ba57600080fd5b80635b1d1c1f146106cc5780635c19a95c146106e15780635c31f220146106f457600080fd5b80635277b4ae116102595780635277b4ae14610646578063528c198a14610681578063587cde1e1461069457600080fd5b80633644e515146105f457806336ceb11a1461060957806342966c681461063357600080fd5b80631703a018116102ec57806323b872dd116102c657806323b872dd14610559578063255c87bf1461056c57806330adf81f14610599578063313ce567146105cd57600080fd5b80631703a018146104f757806318160ddd146105205780631a9f05971461054457600080fd5b8063095ea7b31161031d578063095ea7b3146103df5780630cdfebfa14610402578063150b7a021461048157600080fd5b8063013cf08b1461034f57806302a251a31461038b57806306fdde03146103bd57600080fd5b3661034a57005b600080fd5b34801561035b57600080fd5b5061036f61036a366004614c59565b610b88565b6040516103829796959493929190614cfd565b60405180910390f35b34801561039757600080fd5b506010546103a89063ffffffff1681565b60405163ffffffff9091168152602001610382565b3480156103c957600080fd5b506103d2610c92565b6040516103829190614d6f565b6103f26103ed366004614d9e565b610d20565b6040519015158152602001610382565b34801561040e57600080fd5b5061045861041d366004614d9e565b600a60209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b6040805163ffffffff90931683526bffffffffffffffffffffffff909116602083015201610382565b34801561048d57600080fd5b506104c661049c366004614e11565b507f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610382565b34801561050357600080fd5b506010546103a89068010000000000000000900463ffffffff1681565b34801561052c57600080fd5b5061053660025481565b604051908152602001610382565b610557610552366004614eaa565b610d8d565b005b6103f2610567366004614f0b565b610f6f565b34801561057857600080fd5b50610536610587366004614f47565b60166020526000908152604090205481565b3480156105a557600080fd5b506105367f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156105d957600080fd5b506105e2601281565b60405160ff9091168152602001610382565b34801561060057600080fd5b506105366110d2565b61061c610617366004614f62565b6110f1565b604080519215158352602083019190915201610382565b610557610641366004614c59565b611257565b34801561065257600080fd5b506103f2610661366004614fbc565b601560209081526000928352604080842090915290825290205460ff1681565b61055761068f366004614d9e565b611264565b3480156106a057600080fd5b506106b46106af366004614f47565b6112bb565b6040516001600160a01b039091168152602001610382565b3480156106d857600080fd5b506103d26112eb565b6105576106ef366004614f47565b6112f8565b34801561070057600080fd5b506010546103a8906c01000000000000000000000000900463ffffffff1681565b34801561072d57600080fd5b506008546103f29060ff1681565b34801561074757600080fd5b50610774610756366004614c59565b60136020526000908152604090205460ff8082169161010090041682565b604080519215158352901515602083015201610382565b34801561079757600080fd5b506107ab6107a6366004614c59565b611302565b6040516103829392919061503d565b3480156107c657600080fd5b506105366107d5366004614f47565b600b6020526000908152604090205481565b3480156107f357600080fd5b50610536610802366004614f47565b60036020526000908152604090205481565b34801561082057600080fd5b5061084461082f3660046150e3565b60146020526000908152604090205460ff1681565b60405161038291906150fe565b34801561085d57600080fd5b5061087161086c366004614d9e565b6114b9565b6040516bffffffffffffffffffffffff9091168152602001610382565b34801561089a57600080fd5b506105367f39bf2cb78b4fee6e3427925ed40cf1f955458a02ac29c312c7be5fde74d0dd7a81565b6105576108d0366004614d9e565b6116c0565b3480156108e157600080fd5b506105366108f0366004614f47565b60076020526000908152604090205481565b34801561090e57600080fd5b506103d261172f565b610557610925366004614c59565b61173c565b6105576109383660046153fd565b611912565b61053661094b36600461554c565b6122a9565b34801561095c57600080fd5b506010546103a890640100000000900463ffffffff1681565b6103f2610983366004614d9e565b61295e565b61099b610996366004615623565b612a29565b6040516103829190615665565b3480156109b457600080fd5b506105366109c3366004614f47565b612b99565b3480156109d457600080fd5b506103f26109e3366004614f47565b60116020526000908152604090205460ff1681565b348015610a0457600080fd5b506104c6610a13366004615678565b507fbc197c8100000000000000000000000000000000000000000000000000000000979650505050505050565b610557610a4e366004615733565b612c12565b610557610a61366004615771565b612e1e565b610557610a743660046157a1565b612e74565b348015610a8557600080fd5b50610536600f5481565b348015610a9b57600080fd5b50610536610aaa36600461580b565b600460209081526000928352604080842090915290825290205481565b610557610ad5366004614c59565b6130c3565b610aed610ae8366004614c59565b613298565b604051610382929190615835565b348015610b0757600080fd5b506105367f76995fe87be88484696cfd6792aeb71e0b61f81dfa3b641e5adffa38a0d3b8e281565b610557610b3d366004614d9e565b613eb5565b348015610b4e57600080fd5b506104c6610b5d366004615858565b507ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6012602052600090815260409020805460018201805460ff9092169291610bae906158d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610bda906158d0565b8015610c275780601f10610bfc57610100808354040283529160200191610c27565b820191906000526020600020905b815481529060010190602001808311610c0a57829003601f168201915b5050505060058301546006840154600790940154929390926bffffffffffffffffffffffff80831693506c01000000000000000000000000830416917801000000000000000000000000000000000000000000000000900463ffffffff16906001600160a01b031687565b60008054610c9f906158d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccb906158d0565b8015610d185780601f10610ced57610100808354040283529160200191610d18565b820191906000526020600020905b815481529060010190602001808311610cfb57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d7b9086815260200190565b60405180910390a35060015b92915050565b6002600c541415610dca576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c556000610dd96110d2565b604080517f39bf2cb78b4fee6e3427925ed40cf1f955458a02ac29c312c7be5fde74d0dd7a60208201526001600160a01b038a169181019190915260608101889052861515608082015260a00160405160208183030381529060405280519060200120604051602001610e7e9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610ee9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580610f1e5750876001600160a01b0316816001600160a01b031614155b15610f55576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f60888888613efe565b50506001600c55505050505050565b60085460009060ff1615610faf576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416600090815260046020908152604080832033845290915290205460001914611014576001600160a01b03841660009081526004602090815260408083203384529091528120805484929061100e908490615953565b90915550505b6001600160a01b0384166000908152600360205260408120805484929061103c908490615953565b90915550506001600160a01b038316600090815260036020526040902080548301905561107a61106b856112bb565b611074856112bb565b8461411f565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516110bf91815260200190565b60405180910390a35060015b9392505050565b600060055446146110ea576110e56142a8565b905090565b5060065490565b6000806002600c541415611131576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c556001600160a01b03861660009081526011602052604090205460ff16611188576040517fcb92848a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f36ceb11a0000000000000000000000000000000000000000000000000000000081526001600160a01b038716906336ceb11a9034906111d59033908a908a908a90600401615995565b604080518083038185885af11580156111f2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061121791906159c8565b90925090508115611237578015611232576112323382614342565b611247565b80156112475761124733866143d0565b6001600c55909590945092505050565b61126133826143d0565b50565b3360009081526011602052604090205460ff166112ad576040517fcb92848a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112b78282614342565b5050565b6001600160a01b0380821660009081526009602052604081205490911680156112e457806110cb565b5090919050565b600d8054610c9f906158d0565b6112613382614458565b606080606060006012600086815260200190815260200160002090508060020181600301826004018280548060200260200160405190810160405280929190818152602001828054801561137f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611361575b50505050509250818054806020026020016040519081016040528092919081815260200182805480156113d157602002820191906000526020600020905b8154815260200190600101908083116113bd575b5050505050915080805480602002602001604051908101604052809291908181526020016000905b828210156114a5578382906000526020600020018054611418906158d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611444906158d0565b80156114915780601f1061146657610100808354040283529160200191611491565b820191906000526020600020905b81548152906001019060200180831161147457829003601f168201915b5050505050815260200190600101906113f9565b50959b949a50919850929650505050505050565b60008142116114f4576040517fb1998e3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152600b60205260409020548061151c576000915050610d87565b6001600160a01b0384166000908152600a602090815260408083206000198501845290915290205463ffffffff168310611596576001600160a01b0384166000908152600a60209081526040808320600019909401835292905220546bffffffffffffffffffffffff640100000000909104169050610d87565b6001600160a01b0384166000908152600a6020908152604080832083805290915290205463ffffffff168310156115d1576000915050610d87565b600060001982015b8181111561167c576001600160a01b0386166000908152600a6020908152604080832060028686030485038085529083529281902081518083019092525463ffffffff81168083526401000000009091046bffffffffffffffffffffffff16928201929092529087141561165757602001519450610d879350505050565b805163ffffffff1687111561166e57819350611675565b6001820392505b50506115d9565b506001600160a01b0385166000908152600a6020908152604080832093835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b6001600160a01b038216600090815260046020908152604080832033845290915290205460001914611725576001600160a01b03821660009081526004602090815260408083203384529091528120805483929061171f908490615953565b90915550505b6112b782826143d0565b60018054610c9f906158d0565b6002600c541415611779576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c5560008181526012602090815260408083203384526003909252909120546117d1576040517f291fc44200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60078101546001600160a01b0316611815576040517fc3b4ca4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068101547801000000000000000000000000000000000000000000000000900463ffffffff1615611873576040517f68e83fd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e8054600583015582905561188842614512565b60068201805463ffffffff929092167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055604051829033907fb708f3e57d02b42c1c66c9219454b2e519739ad18a0566a9a71a1e537f1f6e5d90600090a350506001600c55565b6002600c54141561194f576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c55855187511461198f576040517f266c51bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60105463ffffffff16156119cf576040517f5daa87a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805163ffffffff1615806119ef575080516301e1338063ffffffff909116115b15611a26576040517fb03b646a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e13380816001602002015163ffffffff161115611a71576040517fb03b646a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6064816002602002015163ffffffff161115611ab9576040517ffff2d93300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6033816003602002015163ffffffff16111580611ae357506064816003602002015163ffffffff16115b15611b1a576040517f6ef10f9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b8a8b8b8a88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061455692505050565b865115611cec5760005b8751811015611cea576001601160008a8481518110611bb557611bb56159f6565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506003878281518110611c0857611c086159f6565b6020026020010151511115611ce2576000888281518110611c2b57611c2b6159f6565b60200260200101516001600160a01b0316888381518110611c4e57611c4e6159f6565b6020026020010151604051611c639190615a25565b6000604051808303816000865af19150503d8060008114611ca0576040519150601f19603f3d011682016040523d82523d6000602084013e611ca5565b606091505b5050905080611ce0576040517f6f39bd6000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b600101611b94565b505b8851611cff90600d9060208c01906149b6565b5080516010805460208401516040850151606086015163ffffffff9081166c0100000000000000000000000002928116640100000000029581167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941693909317949094177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1693821668010000000000000000027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16939093179290921790556080820151166003811115611dd857611dd8614c72565b6000805260146020527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c805460ff19166001836003811115611e1c57611e1c614c72565b021790555060a081015163ffffffff166003811115611e3d57611e3d614c72565b6001600081905260146020527fb6c61a840592cc84133e4b25bd509abf4659307c57b160799b38490a5aa48f2c8054909160ff1990911690836003811115611e8757611e87614c72565b021790555060c081015163ffffffff166003811115611ea857611ea8614c72565b600260005260146020527fa1930aa930426c54c34daad2b9ada7c5d0ef0c96078a3c5bb79f6fa6602c4a7a805460ff19166001836003811115611eed57611eed614c72565b021790555060e081015163ffffffff166003811115611f0e57611f0e614c72565b6003600081905260146020527f63d87a887046e0430be80fdeb014107d7198c879cbf2cddf39a6df195c86cb388054909160ff19909116906001908490811115611f5a57611f5a614c72565b021790555061010081015163ffffffff166003811115611f7c57611f7c614c72565b600460005260146020527f52102136546d97ed3f65ec1070a32935d3048ea12f310d29c378dc9d6555c0d6805460ff19166001836003811115611fc157611fc1614c72565b021790555061012081015163ffffffff166003811115611fe357611fe3614c72565b600560005260146020527f116126bec5aaa49b347e966c49378cf0c441de9121e306ea3d824584a9615aa2805460ff1916600183600381111561202857612028614c72565b021790555061014081015163ffffffff16600381111561204a5761204a614c72565b600660005260146020527fe1f6b6a5fb7e47dad87547d4b0671e7e995a1dae22fbe5b3b5d10e2a77ed7aff805460ff1916600183600381111561208f5761208f614c72565b021790555061016081015163ffffffff1660038111156120b1576120b1614c72565b600760005260146020527f904977a779b22381a36c6463d4166ef55ee8cb3392c83093cb1750f1a00c9d94805460ff191660018360038111156120f6576120f6614c72565b021790555061018081015163ffffffff16600381111561211857612118614c72565b600860005260146020527f125fdacc24f94fb724c0c32a4eab75d67204551eb2448dadf875d535a7449726805460ff1916600183600381111561215d5761215d614c72565b02179055506101a081015163ffffffff16600381111561217f5761217f614c72565b600960005260146020527ff517404d914a19d455440d961937db67771e4bfb0b4293ff6fd7c75855208c19805460ff191660018360038111156121c4576121c4614c72565b02179055506101c081015163ffffffff1660038111156121e6576121e6614c72565b600a60005260146020527f65f9512343925c57130fd77667cb42fc83560c400ede0c87f3de7c6c27cf09a6805460ff1916600183600381111561222b5761222b614c72565b02179055506101e081015163ffffffff16600381111561224d5761224d614c72565b600b60005260146020527fdabe84bb17a8774762b6726edd7eb728da1732e1ab123804fc9345b7300e0a2e805460ff1916600183600381111561229257612292614c72565b0217905550506001600c5550505050505050505050565b60006002600c5414156122e8576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c5585841415806122fc5750838214155b15612333576040517f266c51bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038a600b81111561234757612347614c72565b14156123c85784846000818110612360576123606159f6565b905060200201356000148061239157506301e1338085856000818110612388576123886159f6565b90506020020135115b156123c8576040517fb03b646a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048a600b8111156123dc576123dc614c72565b1415612439576301e13380858560008181106123fa576123fa6159f6565b905060200201351115612439576040517fb03b646a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058a600b81111561244d5761244d614c72565b14156124a757606485856000818110612468576124686159f6565b9050602002013511156124a7576040517ffff2d93300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068a600b8111156124bb576124bb614c72565b141561253a576033858560008181106124d6576124d66159f6565b9050602002013511158061250357506064858560008181106124fa576124fa6159f6565b90506020020135115b1561253a576040517f6ef10f9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60078a600b81111561254e5761254e614c72565b14156125d857600b85856000818110612569576125696159f6565b905060200201351180612595575060038585600181811061258c5761258c6159f6565b90506020020135115b806125a1575060028414155b156125d8576040517f93d8c8b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526003602052604081205415158061260457503360009081526011602052604090205460ff165b1561260d575060015b600f805460010190819055604080516101408101909152909250808c600b81111561263a5761263a614c72565b81526020018b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040805160208b810282810182019093528b82529283019290918c918c91829185019084908082843760009201919091525050509082525060408051602089810282810182019093528982529283019290918a918a9182918501908490808284376000920191909152505050908252506020016126f58587615a41565b81526020018261270657600061270a565b600e545b8152600060208201819052604082015260600182612729576000612732565b61273242614512565b63ffffffff16815233602091820152600084815260129091526040902081518154829060ff1916600183600b81111561276d5761276d614c72565b0217905550602082810151805161278a92600185019201906149b6565b50604082015180516127a6916002840191602090910190614a36565b50606082015180516127c2916003840191602090910190614aa3565b50608082015180516127de916004840191602090910190614add565b5060a0820151600582015560c082015160068201805460e085015161010086015163ffffffff167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff6bffffffffffffffffffffffff9283166c01000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009094169290951691909117919091179290921691909117905561012090910151600790910180546001600160a01b039092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905580156128e957600e8290555b8a600b8111156128fb576128fb614c72565b82336001600160a01b03167feaebeb60fa3c5b4aaac8452fe75b188beb61a499d379464587545ede83fbea3e8d8d8d8d8d8d8d8d604051612943989796959493929190615af0565b60405180910390a4506001600c559998505050505050505050565b60085460009060ff161561299e576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260036020526040812080548492906129bd908490615953565b90915550506001600160a01b03831660009081526003602052604090208054830190556129ec61106b336112bb565b6040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d7b565b60608167ffffffffffffffff811115612a4457612a44615118565b604051908082528060200260200182016040528015612a7757816020015b6060815260200190600190039081612a625790505b50905060005b82811015612b925760008030868685818110612a9b57612a9b6159f6565b9050602002810190612aad9190615bbc565b604051612abb929190615c21565b600060405180830381855af49150503d8060008114612af6576040519150601f19603f3d011682016040523d82523d6000602084013e612afb565b606091505b509150915081612b6a57604481511015612b1457600080fd5b60048101905080806020019051810190612b2e9190615c31565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b619190614d6f565b60405180910390fd5b80848481518110612b7d57612b7d6159f6565b60209081029190910101525050600101612a7d565b5092915050565b6001600160a01b0381166000908152600b602052604081205480612bbe576000612bfd565b6001600160a01b0383166000908152600a602090815260408083206000198501845290915290205464010000000090046bffffffffffffffffffffffff165b6bffffffffffffffffffffffff169392505050565b83421115612c4c576040517f0819bdcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517f76995fe87be88484696cfd6792aeb71e0b61f81dfa3b641e5adffa38a0d3b8e260208201526001600160a01b03881691810191909152606081018690526080810185905260009060a0016040516020818303038152906040528051906020012090506000612cbd6110d2565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015612d63573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612db0576040517fe99d5ac500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090208054600181019091558814612e09576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e13818a614458565b505050505050505050565b6002600c541415612e5b576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c55612e6b338383613efe565b50506001600c55565b83421115612eae576040517f0819bdcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612eb86110d2565b6001600160a01b0389811660008181526007602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e0830190915280519201919091207f19010000000000000000000000000000000000000000000000000000000000006101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612fec573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806130215750886001600160a01b0316816001600160a01b031614155b15613058576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0390811660009081526004602090815260408083208b8516808552908352928190208a905551898152919350918a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6002600c541415613100576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c55600081815260126020526040902060078101546001600160a01b03163314613159576040517f7d1b73b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068101547801000000000000000000000000000000000000000000000000900463ffffffff16156131b7576040517f68e83fd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152601260205260408120805460ff19168155906131db6001830182614b36565b6131e9600283016000614b70565b6131f7600383016000614b70565b613205600483016000614b8e565b506000600582018190556006820180547fffffffff00000000000000000000000000000000000000000000000000000000169055600790910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055604051839133917f5d423f6a55211a90b8438786aa7edfa40d3eef381b6aae048b52daf814c164629190a350506001600c55565b600060606002600c5414156132d9576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c5560008381526012602052604081208054909190601490829060ff16600b81111561330a5761330a614c72565b600b81111561331b5761331b614c72565b8152602081019190915260400160002054600683015460ff90911691507801000000000000000000000000000000000000000000000000900463ffffffff16613390576040517fc3b4ca4300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60105460068301547801000000000000000000000000000000000000000000000000900463ffffffff90811681831601640100000000909204811691909101164211613408576040517f7f8617a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a825460ff16600b81111561342057613420614c72565b146134955760058201546000908152601260205260409020600601547801000000000000000000000000000000000000000000000000900463ffffffff1615613495576040517f8795d9c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068201546134c79082906bffffffffffffffffffffffff808216916c01000000000000000000000000900416614626565b93508315613d98576000825460ff16600b8111156134e7576134e7614c72565b141561355c5760005b600283015481101561355a57613552836002018281548110613514576135146159f6565b6000918252602090912001546003850180546001600160a01b039092169184908110613542576135426159f6565b9060005260206000200154614342565b6001016134f0565b505b6001825460ff16600b81111561357457613574614c72565b14156135e95760005b60028301548110156135e7576135df8360020182815481106135a1576135a16159f6565b6000918252602090912001546003850180546001600160a01b0390921691849081106135cf576135cf6159f6565b90600052602060002001546143d0565b60010161357d565b505b6002825460ff16600b81111561360157613601614c72565b14156137545760005b600283015481101561375257600283015467ffffffffffffffff81111561363357613633615118565b60405190808252806020026020018201604052801561366657816020015b60608152602001906001900390816136515790505b5093506000836002018281548110613680576136806159f6565b6000918252602090912001546003850180546001600160a01b0390921691849081106136ae576136ae6159f6565b90600052602060002001548560040184815481106136ce576136ce6159f6565b906000526020600020016040516136e59190615d17565b60006040518083038185875af1925050503d8060008114613722576040519150601f19603f3d011682016040523d82523d6000602084013e613727565b606091505b509150508085838151811061373e5761373e6159f6565b60209081029190910101525060010161360a565b505b6003825460ff16600b81111561376c5761376c614c72565b14156137f15781600301600081548110613788576137886159f6565b90600052602060002001546000146137f157816003016000815481106137b0576137b06159f6565b600091825260209091200154601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9092169190911790555b6004825460ff16600b81111561380957613809614c72565b14156138795781600301600081548110613825576138256159f6565b9060005260206000200154600014613879578160030160008154811061384d5761384d6159f6565b9060005260206000200154601060046101000a81548163ffffffff021916908363ffffffff1602179055505b6005825460ff16600b81111561389157613891614c72565b141561390157816003016000815481106138ad576138ad6159f6565b906000526020600020015460001461390157816003016000815481106138d5576138d56159f6565b9060005260206000200154601060086101000a81548163ffffffff021916908363ffffffff1602179055505b6006825460ff16600b81111561391957613919614c72565b14156139895781600301600081548110613935576139356159f6565b9060005260206000200154600014613989578160030160008154811061395d5761395d6159f6565b90600052602060002001546010600c6101000a81548163ffffffff021916908363ffffffff1602179055505b6007825460ff16600b8111156139a1576139a1614c72565b1415613a6157816003016001815481106139bd576139bd6159f6565b906000526020600020015460038111156139d9576139d9614c72565b60146000846003016000815481106139f3576139f36159f6565b9060005260206000200154600b811115613a0f57613a0f614c72565b600b811115613a2057613a20614c72565b600b811115613a3157613a31614c72565b81526020810191909152604001600020805460ff19166001836003811115613a5b57613a5b614c72565b02179055505b6008825460ff16600b811115613a7957613a79614c72565b1415613a8757613a87614767565b6009825460ff16600b811115613a9f57613a9f614c72565b1415613c525760005b6002830154811015613c5057826003018181548110613ac957613ac96159f6565b9060005260206000200154600014613b715760116000846002018381548110613af457613af46159f6565b60009182526020808320909101546001600160a01b0316835282019290925260400181205460028501805460ff909216159260119290919085908110613b3c57613b3c6159f6565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff19169115159190911790555b6003836004018281548110613b8857613b886159f6565b906000526020600020018054613b9d906158d0565b90501115613c4857826002018181548110613bba57613bba6159f6565b6000918252602090912001546004840180546001600160a01b039092169163fb0c4441919084908110613bef57613bef6159f6565b906000526020600020016040518263ffffffff1660e01b8152600401613c159190615d23565b600060405180830381600087803b158015613c2f57600080fd5b505af1158015613c43573d6000803e3d6000fd5b505050505b600101613aa8565b505b600a825460ff16600b811115613c6a57613c6a614c72565b1415613d41576012600083600301600081548110613c8a57613c8a6159f6565b600091825260208083209091015483528201929092526040018120805460ff1916815590613cbb6001830182614b36565b613cc9600283016000614b70565b613cd7600383016000614b70565b613ce5600483016000614b8e565b50600060058201556006810180547fffffffff0000000000000000000000000000000000000000000000000000000016905560070180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b600b825460ff16600b811115613d5957613d59614c72565b1415613d7e5781600101600d908054613d71906158d0565b613d7c929190614bac565b505b6000858152601360205260409020805460ff191660011790555b6000858152601260205260408120805460ff1916815590613dbc6001830182614b36565b613dca600283016000614b70565b613dd8600383016000614b70565b613de6600483016000614b8e565b506000600582018190556006820180547fffffffff00000000000000000000000000000000000000000000000000000000169055600790910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558581526013602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055518515159187917fcc8b74c10cae169918eab7cf3272b0a540854b8a4d12281590885d07fed34f6e9190a350506001600c559092909150565b3360009081526011602052604090205460ff16611725576040517fcb92848a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152601260209081526040808320601583528184206001600160a01b03881685529092529091205460ff1615613f63576040517f7c9a1cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601054600682015463ffffffff918216780100000000000000000000000000000000000000000000000090910482160116421115613fcd576040517f47c8137d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068101546000906140029086907801000000000000000000000000000000000000000000000000900463ffffffff166114b9565b9050821561406a576006820180546bffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009091161790556001600160a01b03851660009081526016602052604090208490556140be565b6006820180546bffffffffffffffffffffffff6c0100000000000000000000000080830482168501909116027fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff9091161790555b60008481526015602090815260408083206001600160a01b0389168085529252808320805460ff1916600117905551851515928792917fd356173ae8eeea8691aee4c1be712c314a975a3d43ebc48b08ca54d0dac912289190a45050505050565b816001600160a01b0316836001600160a01b03161415801561414057508015155b156141f4576001600160a01b038316156141f4576001600160a01b0383166000908152600b6020526040812054908161417a5760006141c6565b6001600160a01b0385166000908152600a602052604081209061419e600185615953565b815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b6bffffffffffffffffffffffff16905060006141e28483615953565b90506141f0868484846147b4565b5050505b6001600160a01b038216156142a3576001600160a01b0382166000908152600b60205260408120549081614229576000614275565b6001600160a01b0384166000908152600a602052604081209061424d600185615953565b815260208101919091526040016000205464010000000090046bffffffffffffffffffffffff165b6bffffffffffffffffffffffff16905060006142918483615da8565b905061429f858484846147b4565b5050505b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516142da9190615d17565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b80600260008282546143549190615da8565b90915550506001600160a01b038216600090815260036020526040812080548301905561438a90614384846112bb565b8361411f565b6040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6001600160a01b038216600090815260036020526040812080548392906143f8908490615953565b909155505060028054829003905561441a614412836112bb565b60008361411f565b6040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016143c4565b6000614463836112bb565b6001600160a01b03848116600090815260096020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948816949094179093556003905220549091506144c3908290849061411f565b816001600160a01b0316816001600160a01b0316846001600160a01b03167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4505050565b600063ffffffff821115614552576040517fec314e4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b8051825114614591576040517f266c51bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516145a49060009060208801906149b6565b5083516145b89060019060208701906149b6565b506008805460ff1916841515179055466005556145d36142a8565b60065560005b825181101561429f5761461e8382815181106145f7576145f76159f6565b6020026020010151838381518110614611576146116159f6565b6020026020010151614342565b6001016145d9565b600082158015614634575081155b15614641575060006110cb565b600184600381111561465557614655614c72565b14806146725750600384600381111561467057614670614c72565b145b156146c45760105460025460009160649161469f9168010000000000000000900463ffffffff1690615dc0565b6146a99190615ddf565b9050838301818110156146c1576000925050506110cb565b50505b60008460038111156146d8576146d8614c72565b14806146f5575060018460038111156146f3576146f3614c72565b145b1561470f578183111561470a575060016110cb565b6110cb565b6010546000906064906c01000000000000000000000000900463ffffffff166147388587615da8565b6147429190615dc0565b61474c9190615ddf565b905080841061475f5760019150506110cb565b509392505050565b6008805460ff8082161560ff1990921682179092556040519116151581527f28ef61d7a1c224006e6530d510be74c9c673f4a9896202105e3d4f60511779d19060200160405180910390a1565b82158015906147ef57506001600160a01b0384166000908152600a602090815260408083206000198701845290915290205463ffffffff1642145b1561486d576147fd8161496e565b6001600160a01b0385166000908152600a6020908152604080832060001988018452909152902080546bffffffffffffffffffffffff92909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff909216919091179055614924565b604051806040016040528061488142614512565b63ffffffff1681526020016148958361496e565b6bffffffffffffffffffffffff9081169091526001600160a01b0386166000818152600a6020908152604080832089845282528083208651815497840151909616640100000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090971663ffffffff9096169590951795909517909355908152600b909152206001840190555b60408051838152602081018390526001600160a01b038616917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a250505050565b60006bffffffffffffffffffffffff821115614552576040517f39a21c5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8280546149c2906158d0565b90600052602060002090601f0160209004810192826149e45760008555614a2a565b82601f106149fd57805160ff1916838001178555614a2a565b82800160010185558215614a2a579182015b82811115614a2a578251825591602001919060010190614a0f565b50614552929150614c27565b828054828255906000526020600020908101928215614a2a579160200282015b82811115614a2a57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190614a56565b828054828255906000526020600020908101928215614a2a5791602002820182811115614a2a578251825591602001919060010190614a0f565b828054828255906000526020600020908101928215614b2a579160200282015b82811115614b2a5782518051614b1a9184916020909101906149b6565b5091602001919060010190614afd565b50614552929150614c3c565b508054614b42906158d0565b6000825580601f10614b52575050565b601f0160209004906000526020600020908101906112619190614c27565b50805460008255906000526020600020908101906112619190614c27565b50805460008255906000526020600020908101906112619190614c3c565b828054614bb8906158d0565b90600052602060002090601f016020900481019282614bda5760008555614a2a565b82601f10614beb5780548555614a2a565b82800160010185558215614a2a57600052602060002091601f016020900482015b82811115614a2a578254825591600101919060010190614c0c565b5b808211156145525760008155600101614c28565b80821115614552576000614c508282614b36565b50600101614c3c565b600060208284031215614c6b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60005b83811015614cbc578181015183820152602001614ca4565b83811115614ccb576000848401525b50505050565b60008151808452614ce9816020860160208601614ca1565b601f01601f19169290920160200192915050565b6000600c8910614d0f57614d0f614c72565b88825260e06020830152614d2660e0830189614cd1565b6040830197909752506bffffffffffffffffffffffff948516606082015292909316608083015263ffffffff1660a08201526001600160a01b0390911660c09091015292915050565b6020815260006110cb6020830184614cd1565b80356001600160a01b0381168114614d9957600080fd5b919050565b60008060408385031215614db157600080fd5b614dba83614d82565b946020939093013593505050565b60008083601f840112614dda57600080fd5b50813567ffffffffffffffff811115614df257600080fd5b602083019150836020828501011115614e0a57600080fd5b9250929050565b600080600080600060808688031215614e2957600080fd5b614e3286614d82565b9450614e4060208701614d82565b935060408601359250606086013567ffffffffffffffff811115614e6357600080fd5b614e6f88828901614dc8565b969995985093965092949392505050565b801515811461126157600080fd5b8035614d9981614e80565b803560ff81168114614d9957600080fd5b60008060008060008060c08789031215614ec357600080fd5b614ecc87614d82565b9550602087013594506040870135614ee381614e80565b9350614ef160608801614e99565b92506080870135915060a087013590509295509295509295565b600080600060608486031215614f2057600080fd5b614f2984614d82565b9250614f3760208501614d82565b9150604084013590509250925092565b600060208284031215614f5957600080fd5b6110cb82614d82565b60008060008060608587031215614f7857600080fd5b614f8185614d82565b935060208501359250604085013567ffffffffffffffff811115614fa457600080fd5b614fb087828801614dc8565b95989497509550505050565b60008060408385031215614fcf57600080fd5b82359150614fdf60208401614d82565b90509250929050565b600081518084526020808501808196508360051b8101915082860160005b8581101561503057828403895261501e848351614cd1565b98850198935090840190600101615006565b5091979650505050505050565b606080825284519082018190526000906020906080840190828801845b8281101561507f5781516001600160a01b03168452928401929084019060010161505a565b5050508381038285015285518082528683019183019060005b818110156150b457835183529284019291840191600101615098565b505084810360408601526150c88187614fe8565b98975050505050505050565b8035600c8110614d9957600080fd5b6000602082840312156150f557600080fd5b6110cb826150d4565b602081016004831061511257615112614c72565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561517057615170615118565b604052919050565b600067ffffffffffffffff82111561519257615192615118565b50601f01601f191660200190565b60006151b36151ae84615178565b615147565b90508281528383830111156151c757600080fd5b828260208301376000602084830101529392505050565b600082601f8301126151ef57600080fd5b6110cb838335602085016151a0565b600067ffffffffffffffff82111561521857615218615118565b5060051b60200190565b600082601f83011261523357600080fd5b813560206152436151ae836151fe565b82815260059290921b8401810191818101908684111561526257600080fd5b8286015b848110156152845761527781614d82565b8352918301918301615266565b509695505050505050565b600061529d6151ae846151fe565b8381529050602080820190600585901b8401868111156152bc57600080fd5b845b8181101561530c57803567ffffffffffffffff8111156152de5760008081fd5b8601601f810189136152f05760008081fd5b6152fe8982358684016151a0565b8552509282019282016152be565b505050509392505050565b600082601f83011261532857600080fd5b6110cb8383356020850161528f565b60008083601f84011261534957600080fd5b50813567ffffffffffffffff81111561536157600080fd5b6020830191508360208260051b8501011115614e0a57600080fd5b600082601f83011261538d57600080fd5b60405161020080820182811067ffffffffffffffff821117156153b2576153b2615118565b604052830181858211156153c557600080fd5b845b828110156153f257803563ffffffff811681146153e45760008081fd5b8252602091820191016153c7565b509195945050505050565b60008060008060008060008060008060006103008c8e03121561541f57600080fd5b67ffffffffffffffff808d35111561543657600080fd5b6154438e8e358f016151de565b9b508060208e0135111561545657600080fd5b6154668e60208f01358f016151de565b9a508060408e0135111561547957600080fd5b6154898e60408f01358f016151de565b995061549760608e01614e8e565b98508060808e013511156154aa57600080fd5b6154ba8e60808f01358f01615222565b97508060a08e013511156154cd57600080fd5b6154dd8e60a08f01358f01615317565b96508060c08e013511156154f057600080fd5b6155008e60c08f01358f01615337565b909650945060e08d013581101561551657600080fd5b506155278d60e08e01358e01615337565b909350915061553a8d6101008e0161537c565b90509295989b509295989b9093969950565b600080600080600080600080600060a08a8c03121561556a57600080fd5b6155738a6150d4565b985060208a013567ffffffffffffffff8082111561559057600080fd5b61559c8d838e01614dc8565b909a50985060408c01359150808211156155b557600080fd5b6155c18d838e01615337565b909850965060608c01359150808211156155da57600080fd5b6155e68d838e01615337565b909650945060808c01359150808211156155ff57600080fd5b5061560c8c828d01615337565b915080935050809150509295985092959850929598565b6000806020838503121561563657600080fd5b823567ffffffffffffffff81111561564d57600080fd5b61565985828601615337565b90969095509350505050565b6020815260006110cb6020830184614fe8565b60008060008060008060008060a0898b03121561569457600080fd5b61569d89614d82565b97506156ab60208a01614d82565b9650604089013567ffffffffffffffff808211156156c857600080fd5b6156d48c838d01615337565b909850965060608b01359150808211156156ed57600080fd5b6156f98c838d01615337565b909650945060808b013591508082111561571257600080fd5b5061571f8b828c01614dc8565b999c989b5096995094979396929594505050565b60008060008060008060c0878903121561574c57600080fd5b61575587614d82565b95506020870135945060408701359350614ef160608801614e99565b6000806040838503121561578457600080fd5b82359150602083013561579681614e80565b809150509250929050565b600080600080600080600060e0888a0312156157bc57600080fd5b6157c588614d82565b96506157d360208901614d82565b955060408801359450606088013593506157ef60808901614e99565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561581e57600080fd5b61582783614d82565b9150614fdf60208401614d82565b82151581526040602082015260006158506040830184614fe8565b949350505050565b60008060008060008060a0878903121561587157600080fd5b61587a87614d82565b955061588860208801614d82565b94506040870135935060608701359250608087013567ffffffffffffffff8111156158b257600080fd5b6158be89828a01614dc8565b979a9699509497509295939492505050565b600181811c908216806158e457607f821691505b6020821081141561591e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561596557615965615924565b500390565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6001600160a01b03851681528360208201526060604082015260006159be60608301848661596a565b9695505050505050565b600080604083850312156159db57600080fd5b82516159e681614e80565b6020939093015192949293505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008251615a37818460208701614ca1565b9190910192915050565b60006110cb36848461528f565b81835260006020808501808196508560051b810191508460005b8781101561503057828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018112615aa757600080fd5b8701803567ffffffffffffffff811115615ac057600080fd5b803603891315615acf57600080fd5b615adc868289850161596a565b9a87019a9550505090840190600101615a68565b608081526000615b04608083018a8c61596a565b8281036020848101919091528882528991810160005b8a811015615b46576001600160a01b03615b3385614d82565b1682529282019290820190600101615b1a565b5084810360408601528781527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff881115615b7f57600080fd5b8760051b9250828983830137600092018181019283528481038201606086015291615bab818789615a4e565b9d9c50505050505050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615bf157600080fd5b83018035915067ffffffffffffffff821115615c0c57600080fd5b602001915036819003821315614e0a57600080fd5b8183823760009101908152919050565b600060208284031215615c4357600080fd5b815167ffffffffffffffff811115615c5a57600080fd5b8201601f81018413615c6b57600080fd5b8051615c796151ae82615178565b818152856020838501011115615c8e57600080fd5b615c9f826020830160208601614ca1565b95945050505050565b60008154615cb5816158d0565b60018281168015615ccd5760018114615cde57615d0d565b60ff19841687528287019450615d0d565b8560005260208060002060005b85811015615d045781548a820152908401908201615ceb565b50505082870194505b5050505092915050565b60006110cb8284615ca8565b6000602080835260008454615d37816158d0565b80848701526040600180841660008114615d585760018114615d6c57615d9a565b60ff198516838a0152606089019550615d9a565b896000528660002060005b85811015615d925781548b8201860152908301908801615d77565b8a0184019650505b509398975050505050505050565b60008219821115615dbb57615dbb615924565b500190565b6000816000190483118215151615615dda57615dda615924565b500290565b600082615e15577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220c81d278a997ba3088d681de4d1f32e908bb47cb5aeecaac15659f0a5d8ed7f0c64736f6c634300080b0033

Deployed Bytecode Sourcemap

18023:18873:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20153:45;;;;;;;;;;-1:-1:-1;20153:45:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;19820:26;;;;;;;;;;-1:-1:-1;19820:26:0;;;;;;;;;;;1998:10:1;1986:23;;;1968:42;;1956:2;1941:18;19820:26:0;1824:192:1;1605:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4258:225::-;;;;;;:::i;:::-;;:::i;:::-;;;2871:14:1;;2864:22;2846:41;;2834:2;2819:18;4258:225:0;2706:187:1;2944:69:0;;;;;;;;;;-1:-1:-1;2944:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3098:10:1;3086:23;;;3068:42;;3158:26;3146:39;;;3141:2;3126:18;;3119:67;3041:18;2944:69:0;2898:294:1;16192:235:0;;;;;;;;;;-1:-1:-1;16192:235:0;;;;;:::i;:::-;-1:-1:-1;16350:16:0;;16192:235;-1:-1:-1;;;;16192:235:0;;;;4354:66:1;4342:79;;;4324:98;;4312:2;4297:18;16192:235:0;4180:248:1;19889:20:0;;;;;;;;;;-1:-1:-1;19889:20:0;;;;;;;;;;;1892:26;;;;;;;;;;;;;;;;;;;4579:25:1;;;4567:2;4552:18;1892:26:0;4433:177:1;28200:909:0;;;;;;:::i;:::-;;:::i;:::-;;4982:635;;;;;;:::i;:::-;;:::i;20408:46::-;;;;;;;;;;-1:-1:-1;20408:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;2242:146;;;;;;;;;;;;2293:95;2242:146;;1661:35;;;;;;;;;;;;1694:2;1661:35;;;;;6507:4:1;6495:17;;;6477:36;;6465:2;6450:18;1661:35:0;6335:184:1;6783:180:0;;;;;;;;;;;;;:::i;36030:601::-;;;;;;:::i;:::-;;:::i;:::-;;;;7273:14:1;;7266:22;7248:41;;7320:2;7305:18;;7298:34;;;;7221:18;36030:601:0;7080:258:1;13890:97:0;;;;;;:::i;:::-;;:::i;20342:57::-;;;;;;;;;;-1:-1:-1;20342:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;36639:121;;;;;;:::i;:::-;;:::i;7713:205::-;;;;;;;;;;-1:-1:-1;7713:205:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7766:55:1;;;7748:74;;7736:2;7721:18;7713:205:0;7602:226:1;19703:18:0;;;;;;;;;;;;;:::i;8307:111::-;;;;;;:::i;:::-;;:::i;19927:27::-;;;;;;;;;;-1:-1:-1;19927:27:0;;;;;;;;;;;2723:18;;;;;;;;;;-1:-1:-1;2723:18:0;;;;;;;;20207:55;;;;;;;;;;-1:-1:-1;20207:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;8020:14:1;;8013:22;7995:41;;8079:14;;8072:22;8067:2;8052:18;;8045:50;7968:18;20207:55:0;7833:268:1;24758:347:0;;;;;;;;;;-1:-1:-1;24758:347:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;3022:49::-;;;;;;;;;;-1:-1:-1;3022:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;1927:44;;;;;;;;;;-1:-1:-1;1927:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;20271:58;;;;;;;;;;-1:-1:-1;20271:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;9249:1450::-;;;;;;;;;;-1:-1:-1;9249:1450:0;;;;;:::i;:::-;;:::i;:::-;;;10923:26:1;10911:39;;;10893:58;;10881:2;10866:18;9249:1450:0;10749:208:1;19976:113:0;;;;;;;;;;;;20022:67;19976:113;;13995:227;;;;;;:::i;:::-;;:::i;2489:41::-;;;;;;;;;;-1:-1:-1;2489:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;1632:20;;;;;;;;;;;;;:::i;27481:561::-;;;;;;:::i;:::-;;:::i;21901:2662::-;;;;;;:::i;:::-;;:::i;25113:1991::-;;;;;;:::i;:::-;;:::i;19855:25::-;;;;;;;;;;-1:-1:-1;19855:25:0;;;;;;;;;;;4491:483;;;;;;:::i;:::-;;:::i;15319:777::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7926:373::-;;;;;;;;;;-1:-1:-1;7926:373:0;;;;;:::i;:::-;;:::i;20102:42::-;;;;;;;;;;-1:-1:-1;20102:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;16710:299;;;;;;;;;;-1:-1:-1;16710:299:0;;;;;:::i;:::-;-1:-1:-1;16914:16:0;;16710:299;-1:-1:-1;;;;;;;16710:299:0;8426:815;;;;;;:::i;:::-;;:::i;28051:137::-;;;;;;:::i;:::-;;:::i;5816:959::-;;;;;;:::i;:::-;;:::i;19783:28::-;;;;;;;;;;;;;;;;1980:64;;;;;;;;;;-1:-1:-1;1980:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;27112:361;;;;;;:::i;:::-;;:::i;30249:4097::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2750:129::-;;;;;;;;;;;;2806:73;2750:129;;36768:125;;;;;;:::i;:::-;;:::i;16435:263::-;;;;;;;;;;-1:-1:-1;16435:263:0;;;;;:::i;:::-;-1:-1:-1;16612:16:0;;16435:263;-1:-1:-1;;;;;16435:263:0;20153:45;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;20153:45:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20153:45:0;;;;;;;;;;;-1:-1:-1;;;;;20153:45:0;;:::o;1605:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4258:225::-;4367:10;4340:4;4357:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;4357:30:0;;;;;;;;;;:39;;;4414:37;4340:4;;4357:30;;4414:37;;;;4390:6;4579:25:1;;4567:2;4552:18;;4433:177;4414:37:0;;;;;;;;-1:-1:-1;4471:4:0;4258:225;;;;;:::o;28200:909::-;17401:1;17495:6;;:17;17491:42;;;17521:12;;;;;;;;;;;;;;17491:42;17401:1;17546:6;:16;28411:14:::1;28541:18;:16;:18::i;:::-;28618:191;::::0;;20022:67:::1;28618:191;::::0;::::1;24480:25:1::0;-1:-1:-1;;;;;24541:55:1;;24521:18;;;24514:83;;;;24613:18;;;24606:34;;;24683:14;;24676:22;24656:18;;;24649:50;24452:19;;28618:191:0::1;;;;;;;;;;;;28582:250;;;;;;28469:382;;;;;;;;24980:66:1::0;24968:79;;25072:1;25063:11;;25056:27;;;;25108:2;25099:12;;25092:28;25145:2;25136:12;;24710:444;28469:382:0::1;;::::0;;-1:-1:-1;;28469:382:0;;::::1;::::0;;;;;;28441:425;;28469:382:::1;28441:425:::0;;::::1;::::0;28891:24:::1;28918:26:::0;;;;;::::1;::::0;;;25386:25:1;;;25459:4;25447:17;;25427:18;;;25420:45;;;;25481:18;;;25474:34;;;25524:18;;;25517:34;;;28441:425:0;;-1:-1:-1;28891:24:0;28918:26:::1;::::0;25358:19:1;;28918:26:0::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28918:26:0::1;::::0;-1:-1:-1;;28918:26:0;;;-1:-1:-1;;;;;;;28961:30:0;::::1;::::0;;:60:::1;;;29015:6;-1:-1:-1::0;;;;;28995:26:0::1;:16;-1:-1:-1::0;;;;;28995:26:0::1;;;28961:60;28957:91;;;29030:18;;;;;;;;;;;;;;28957:91;29069:32;29075:6;29083:8;29093:7;29069:5;:32::i;:::-;-1:-1:-1::0;;17356:1:0;17589:6;:20;-1:-1:-1;;;;;;28200:909:0:o;4982:635::-;7656:6;;5122:4;;7656:6;;7652:27;;;7671:8;;;;;;;;;;;;;;7652:27;-1:-1:-1;;;;;5143:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;5159:10:::1;5143:27:::0;;;;;;;;-1:-1:-1;;5143:48:0::1;5139:105;;-1:-1:-1::0;;;;;5207:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;5223:10:::1;5207:27:::0;;;;;;;:37;;5238:6;;5207:15;:37:::1;::::0;5238:6;;5207:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;5139:105:0::1;-1:-1:-1::0;;;;;5257:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;:25;;5276:6;;5257:15;:25:::1;::::0;5276:6;;5257:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;5432:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:23;;;::::1;::::0;;5487:54:::1;5502:15;5512:4:::0;5502:9:::1;:15::i;:::-;5519:13;5529:2;5519:9;:13::i;:::-;5534:6;5487:14;:54::i;:::-;5574:2;-1:-1:-1::0;;;;;5559:26:0::1;5568:4;-1:-1:-1::0;;;;;5559:26:0::1;;5578:6;5559:26;;;;4579:25:1::0;;4567:2;4552:18;;4433:177;5559:26:0::1;;;;;;;;-1:-1:-1::0;5605:4:0::1;7692:1;4982:635:::0;;;;;:::o;6783:180::-;6840:7;6884:16;;6867:13;:33;:88;;6930:25;:23;:25::i;:::-;6860:95;;6783:180;:::o;6867:88::-;-1:-1:-1;6903:24:0;;;6783:180::o;36030:601::-;36199:9;36210:17;17401:1;17495:6;;:17;17491:42;;;17521:12;;;;;;;;;;;;;;17491:42;17401:1;17546:6;:16;-1:-1:-1;;;;;36245:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;::::1;;36240:49;;36275:14;;;;;;;;;;;;;;36240:49;36330:109;::::0;;;;-1:-1:-1;;;;;36330:42:0;::::1;::::0;::::1;::::0;36380:9:::1;::::0;36330:109:::1;::::0;36405:10:::1;::::0;36417:6;;36425:13;;;;36330:109:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36310:129:::0;;-1:-1:-1;36310:129:0;-1:-1:-1;36460:164:0;::::1;;;36489:14:::0;;36485:48:::1;;36505:28;36511:10;36523:9;36505:5;:28::i;:::-;36460:164;;;36571:14:::0;;36567:45:::1;;36587:25;36593:10;36605:6;36587:5;:25::i;:::-;17356:1:::0;17589:6;:20;36030:601;;;;-1:-1:-1;36030:601:0;-1:-1:-1;;;36030:601:0:o;13890:97::-;13954:25;13960:10;13972:6;13954:5;:25::i;:::-;13890:97;:::o;36639:121::-;35966:10;35955:22;;;;:10;:22;;;;;;;;35950:50;;35986:14;;;;;;;;;;;;;;35950:50;36735:17:::1;36741:2;36745:6;36735:5;:17::i;:::-;36639:121:::0;;:::o;7713:205::-;-1:-1:-1;;;;;7818:21:0;;;7780:7;7818:21;;;:10;:21;;;;;;7780:7;;7818:21;7867;;:43;;7903:7;7867:43;;;-1:-1:-1;7891:9:0;;7860:50;-1:-1:-1;7713:205:0:o;19703:18::-;;;;;;;:::i;8307:111::-;8378:32;8388:10;8400:9;8378;:32::i;24758:347::-;24842:25;24879:24;24915:23;24957:21;24981:9;:19;24991:8;24981:19;;;;;;;;;;;24957:43;;25054:4;:13;;25069:4;:12;;25083:4;:13;;25021:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25021:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25021:76:0;;;;-1:-1:-1;25021:76:0;;-1:-1:-1;24758:347:0;;-1:-1:-1;;;;;;;24758:347:0:o;9249:1450::-;9337:6;9379:9;9360:15;:28;9356:56;;9397:15;;;;;;;;;;;;;;9356:56;-1:-1:-1;;;;;9448:23:0;;9425:20;9448:23;;;:14;:23;;;;;;9488:17;9484:31;;9514:1;9507:8;;;;;9484:31;-1:-1:-1;;;;;9665:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;9686:16:0;;9665:38;;;;;;;:52;;;:65;-1:-1:-1;9661:139:0;;-1:-1:-1;;;;;9756:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;9777:16:0;;;9756:38;;;;;;:44;;;;;;;;-1:-1:-1;9749:51:0;;9661:139;-1:-1:-1;;;;;9821:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:37;;;:49;-1:-1:-1;9817:63:0;;;9879:1;9872:8;;;;;9817:63;9897:13;-1:-1:-1;;10059:16:0;;10092:534;10107:5;10099;:13;10092:534;;;-1:-1:-1;;;;;10305:20:0;;10217:14;10305:20;;;:11;:20;;;;;;;;10260:1;10243:13;;;10242:19;10234:27;;10305:28;;;;;;;;;;10282:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10358:29;;10354:257;;;10419:8;;;;-1:-1:-1;10412:15:0;;-1:-1:-1;;;;10412:15:0;10354:257;10457:16;;:28;;;-1:-1:-1;10453:158:0;;;10518:6;10510:14;;10453:158;;;10590:1;10581:6;:10;10573:18;;10453:158;10114:512;;10092:534;;;-1:-1:-1;;;;;;10645:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;:33;;;;;;;;-1:-1:-1;;9249:1450:0;;;;:::o;13995:227::-;-1:-1:-1;;;;;14081:15:0;;;;;;:9;:15;;;;;;;;14097:10;14081:27;;;;;;;;-1:-1:-1;;14081:48:0;14077:105;;-1:-1:-1;;;;;14145:15:0;;;;;;:9;:15;;;;;;;;14161:10;14145:27;;;;;;;:37;;14176:6;;14145:15;:37;;14176:6;;14145:37;:::i;:::-;;;;-1:-1:-1;;14077:105:0;14195:19;14201:4;14207:6;14195:5;:19::i;1632:20::-;;;;;;;:::i;27481:561::-;17401:1;17495:6;;:17;17491:42;;;17521:12;;;;;;;;;;;;;;17491:42;17401:1;17546:6;:16;27571:21:::1;27595:19:::0;;;:9:::1;:19;::::0;;;;;;;27641:10:::1;27631:21:::0;;:9:::1;:21:::0;;;;;;;27627:50:::1;;27666:11;;;;;;;;;;;;;;27627:50;27694:13;::::0;::::1;::::0;-1:-1:-1;;;;;27694:13:0::1;27690:60;;27730:20;;;;;;;;;;;;;;27690:60;27767:17;::::0;::::1;::::0;;;::::1;;;:22:::0;27763:46:::1;;27798:11;;;;;;;;;;;;;;27763:46;27842:24;::::0;;27822:17:::1;::::0;::::1;:44:::0;27879:35;;;27947:30:::1;27961:15;27947:13;:30::i;:::-;27927:17;::::0;::::1;:50:::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;27995:39:::1;::::0;28025:8;;28013:10:::1;::::0;27995:39:::1;::::0;-1:-1:-1;;27995:39:0::1;-1:-1:-1::0;;17356:1:0;17589:6;:20;27481:561::o;21901:2662::-;17401:1;17495:6;;:17;17491:42;;;17521:12;;;;;;;;;;;;;;17491:42;17401:1;17546:6;:16;22305:22;;22283:18;;:44:::1;22279:72;;22336:15;;;;;;;;;;;;;;22279:72;22368:12;::::0;::::1;;:17:::0;22364:43:::1;;22394:13;;;;;;;;;;;;;;22364:43;22424:15:::0;;:20:::1;;::::0;;:50:::1;;-1:-1:-1::0;22448:15:0;;22466:8:::1;22448:26;::::0;;::::1;;22424:50;22420:77;;;22483:14;;;;;;;;;;;;;;22420:77;22532:8;22514:12:::0;22527:1:::1;22514:15;;;;:26;;;22510:53;;;22549:14;;;;;;;;;;;;;;22510:53;22598:3;22580:12:::0;22593:1:::1;22580:15;;;;:21;;;22576:45;;;22610:11;;;;;;;;;;;;;;22576:45;22657:2;22638:12:::0;22651:1:::1;22638:15;;;;:21;;;;:46;;;-1:-1:-1::0;22681:3:0::1;22663:12:::0;22676:1:::1;22663:15;;;;:21;;;22638:46;22634:80;;;22693:21;;;;;;;;;;;;;;22634:80;22727:61;22746:5;22753:7;22762;22771;;22727:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;22727:61:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;22780:7:0;;-1:-1:-1;22780:7:0;;;;22727:61;::::1;::::0;22780:7;;22727:61;22780:7;22727:61;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;22727:18:0::1;::::0;-1:-1:-1;;;22727:61:0:i:1;:::-;22805:18:::0;;:23;22801:518:::1;;22945:9;22940:353;22960:11;:18;22956:1;:22;22940:353;;;23037:4;23008:10;:26;23019:11;23031:1;23019:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;23008:26:0::1;-1:-1:-1::0;;;;;23008:26:0::1;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;23098:1;23070:15;23086:1;23070:18;;;;;;;;:::i;:::-;;;;;;;:25;:29;23066:208;;;23129:12;23147:11;23159:1;23147:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;23147:19:0::1;23167:15;23183:1;23167:18;;;;;;;;:::i;:::-;;;;;;;23147:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23128:58;;;23220:7;23215:35;;23236:14;;;;;;;;;;;;;;23215:35;23101:173;23066:208;22980:3;;22940:353;;;;22801:518;23331:12:::0;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;23379:15:0;;23364:12:::1;:30:::0;;23379:15:::1;23421::::0;::::1;::::0;23466;;::::1;::::0;23518;;::::1;::::0;23364:30:::1;23502:31:::0;;::::1;::::0;::::1;23407:29:::0;;::::1;::::0;::::1;23364:30:::0;;::::1;23407:29:::0;;;;;;;;;;;::::1;23502:31:::0;;23457:24;;::::1;::::0;::::1;23502:31:::0;;;;;;;;;::::1;::::0;;23629:15;;::::1;::::0;23620:25:::1;23531:1;23620:25:::0;::::1;;;;;;:::i;:::-;23581:36;::::0;;:17:::1;:36;::::0;;:64;;-1:-1:-1;;23581:64:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;23706:15:0;;::::1;::::0;23697:25:::1;;;::::0;::::1;;;;;;:::i;:::-;23676:17;23658:36;::::0;;;:17:::1;:36;::::0;;:64;;:36;;-1:-1:-1;;23658:64:0;;::::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;23783:15:0;;::::1;::::0;23774:25:::1;;;::::0;::::1;;;;;;:::i;:::-;23753:17;23735:36;::::0;:17:::1;:36;::::0;;:64;;-1:-1:-1;;23735:64:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;23863:15:0;;::::1;::::0;23854:25:::1;;;::::0;::::1;;;;;;:::i;:::-;23830:20;23812:39;::::0;;;:17:::1;:39;::::0;;:67;;:39;;-1:-1:-1;;23812:67:0;;::::1;::::0;;;;;;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;23943:15:0;;::::1;::::0;23934:25:::1;;;::::0;::::1;;;;;;:::i;:::-;23910:20;23892:39;::::0;:17:::1;:39;::::0;;:67;;-1:-1:-1;;23892:67:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;24030:15:0;;::::1;::::0;24021:25:::1;;;::::0;::::1;;;;;;:::i;:::-;23998:19;23980:38;::::0;:17:::1;:38;::::0;;:66;;-1:-1:-1;;23980:66:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;24124:16:0;;::::1;::::0;24115:26:::1;;;::::0;::::1;;;;;;:::i;:::-;24085;24067:45;::::0;:17:::1;:45;::::0;;:74;;-1:-1:-1;;24067:74:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;24202:16:0;;::::1;::::0;24193:26:::1;;;::::0;::::1;;;;;;:::i;:::-;24172:17;24154:36;::::0;:17:::1;:36;::::0;;:65;;-1:-1:-1;;24154:65:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;24289:16:0;;::::1;::::0;24280:26:::1;;;::::0;::::1;;;;;;:::i;:::-;24258:18;24240:37;::::0;:17:::1;:37;::::0;;:66;;-1:-1:-1;;24240:66:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;24380:16:0;;::::1;::::0;24371:26:::1;;;::::0;::::1;;;;;;:::i;:::-;24345:22;24327:41;::::0;:17:::1;:41;::::0;;:70;;-1:-1:-1;;24327:70:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;24460:16:0;;::::1;::::0;24451:26:::1;;;::::0;::::1;;;;;;:::i;:::-;24428:19;24410:38;::::0;:17:::1;:38;::::0;;:67;;-1:-1:-1;;24410:67:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;24538:16:0;;::::1;::::0;24529:26:::1;;;::::0;::::1;;;;;;:::i;:::-;24508:17;24490:36;::::0;:17:::1;:36;::::0;;:65;;-1:-1:-1;;24490:65:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;;17356:1:0;17589:6;:20;-1:-1:-1;;;;;;;;;;21901:2662:0:o;25113:1991::-;25367:16;17401:1;17495:6;;:17;17491:42;;;17521:12;;;;;;;;;;;;;;17491:42;17401:1;17546:6;:16;25400:33;;::::1;;::::0;:70:::1;;-1:-1:-1::0;25437:33:0;;::::1;;25400:70;25396:98;;;25479:15;;;;;;;;;;;;;;25396:98;25535:20;25519:12;:36;;;;;;;;:::i;:::-;;25515:109;;;25561:7;;25569:1;25561:10;;;;;;;:::i;:::-;;;;;;;25575:1;25561:15;:40;;;;25593:8;25580:7;;25588:1;25580:10;;;;;;;:::i;:::-;;;;;;;:21;25561:40;25557:67;;;25610:14;;;;;;;;;;;;;;25557:67;25657:20;25641:12;:36;;;;;;;;:::i;:::-;;25637:90;;;25696:8;25683:7;;25691:1;25683:10;;;;;;;:::i;:::-;;;;;;;:21;25679:48;;;25713:14;;;;;;;;;;;;;;25679:48;25768:19;25752:12;:35;;;;;;;;:::i;:::-;;25748:81;;;25806:3;25793:7;;25801:1;25793:10;;;;;;;:::i;:::-;;;;;;;:16;25789:40;;;25818:11;;;;;;;;;;;;;;25789:40;25870:26;25854:12;:42;;;;;;;;:::i;:::-;;25850:118;;;25916:2;25902:7;;25910:1;25902:10;;;;;;;:::i;:::-;;;;;;;:16;;:36;;;;25935:3;25922:7;;25930:1;25922:10;;;;;;;:::i;:::-;;;;;;;:16;25902:36;25898:70;;;25947:21;;;;;;;;;;;;;;25898:70;26001:17;25985:12;:33;;;;;;;;:::i;:::-;;25981:120;;;26037:2;26024:7;;26032:1;26024:10;;;;;;;:::i;:::-;;;;;;;:15;:33;;;;26056:1;26043:7;;26051:1;26043:10;;;;;;;:::i;:::-;;;;;;;:14;26024:33;:56;;;-1:-1:-1::0;26079:1:0::1;26061:19:::0;::::1;;26024:56;26020:81;;;26089:12;;;;;;;;;;;;;;26020:81;26232:10;26114:16;26222:21:::0;;;:9:::1;:21;::::0;;;;;:26;::::1;::::0;:52:::1;;-1:-1:-1::0;26263:10:0::1;26252:22;::::0;;;:10:::1;:22;::::0;;;;;::::1;;26222:52;26218:76;;;-1:-1:-1::0;26290:4:0::1;26218:76;26394:13;:15:::0;;::::1;;::::0;;;;26492:432:::1;::::0;;::::1;::::0;::::1;::::0;;;26394:15;;-1:-1:-1;26492:432:0;26530:12;26492:432:::1;::::0;::::1;;;;;;:::i;:::-;;;;;26570:11;;26492:432;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;26492:432:0;;;-1:-1:-1;26492:432:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;26606:8;;;;;;26492:432;::::1;::::0;26606:8;;26492:432;26606:8;26492:432;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;;26492:432:0;;;-1:-1:-1;26492:432:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;26638:7;;;;;;26492:432;::::1;::::0;26638:7;;26492:432;26638:7;26492:432;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;;26492:432:0;;;-1:-1:-1;26492:432:0::1;;;26670:8:::0;;26492:432:::1;:::i;:::-;;;;;26707:11;:42;;26748:1;26707:42;;;26721:24;;26707:42;26492:432:::0;;26774:1:::1;26492:432;::::0;::::1;::::0;;;;;;;;;26829:11;:48:::1;;26876:1;26829:48;;;26843:30;26857:15;26843:13;:30::i;:::-;26492:432;;::::0;;26902:10:::1;26492:432;::::0;;::::1;::::0;-1:-1:-1;26470:19:0;;;:9:::1;:19:::0;;;;;;:454;;;;:19;;-1:-1:-1;;26470:454:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;26470:454:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;26470:454:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;26470:454:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;26470:454:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;26470:454:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;26470:454:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;26937:52;::::1;;;26954:24;:35:::0;;;26937:52:::1;27041:12;27007:89;;;;;;;;:::i;:::-;27031:8;27019:10;-1:-1:-1::0;;;;;27007:89:0::1;;27055:11;;27068:8;;27078:7;;27087:8;;27007:89;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;17356:1:0;17589:6;:20;25113:1991;;-1:-1:-1;;;;;;;;;25113:1991:0:o;4491:483::-;7656:6;;4579:4;;7656:6;;7652:27;;;7671:8;;;;;;;;;;;;;;7652:27;4606:10:::1;4596:21;::::0;;;:9:::1;:21;::::0;;;;:31;;4621:6;;4596:21;:31:::1;::::0;4621:6;;4596:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;4777:13:0;::::1;;::::0;;;:9:::1;:13;::::0;;;;:23;;;::::1;::::0;;4832:60:::1;4847:21;4857:10;4847:9;:21::i;4832:60::-;4910:32;::::0;4579:25:1;;;-1:-1:-1;;;;;4910:32:0;::::1;::::0;4919:10:::1;::::0;4910:32:::1;::::0;4567:2:1;4552:18;4910:32:0::1;4433:177:1::0;15319:777:0;15393:22;15450:4;15438:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15428:34;;15575:9;15570:508;15590:15;;;15570:508;;;15632:12;;15677:4;15696;;15701:1;15696:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;15669:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15631:73;;;;15730:7;15725:300;;15782:2;15766:6;:13;:18;15762:32;;;15786:8;;;15762:32;15897:4;15889:6;15885:17;15875:27;;15987:6;15976:28;;;;;;;;;;;;:::i;:::-;15969:36;;;;;;;;;;;:::i;:::-;;;;;;;;15725:300;16056:6;16043:7;16051:1;16043:10;;;;;;;;:::i;:::-;;;;;;;;;;:19;-1:-1:-1;;15607:3:0;;15570:508;;;;15319:777;;;;:::o;7926:373::-;-1:-1:-1;;;;;8165:23:0;;7997:7;8165:23;;;:14;:23;;;;;;8212:17;:68;;8279:1;8212:68;;;-1:-1:-1;;;;;8232:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;8253:16:0;;8232:38;;;;;;;:44;;;;;;8212:68;8205:75;;;7926:373;-1:-1:-1;;;7926:373:0:o;8426:815::-;8654:8;8636:15;:26;8632:57;;;8671:18;;;;;;;;;;;;;;8632:57;8733:59;;;2806:73;8733:59;;;32214:25:1;-1:-1:-1;;;;;32275:55:1;;32255:18;;;32248:83;;;;32347:18;;;32340:34;;;32390:18;;;32383:34;;;8702:18:0;;32186:19:1;;8733:59:0;;;;;;;;;;;;8723:70;;;;;;8702:91;;8806:14;8862:18;:16;:18::i;:::-;8833:60;;24980:66:1;8833:60:0;;;24968:79:1;25063:11;;;25056:27;;;;25099:12;;;25092:28;;;25136:12;;8833:60:0;;;-1:-1:-1;;8833:60:0;;;;;;;;;8823:71;;8833:60;8823:71;;;;8907:17;8927:26;;;;;;;;;25386:25:1;;;25459:4;25447:17;;25427:18;;;25420:45;;;;25481:18;;;25474:34;;;25524:18;;;25517:34;;;8823:71:0;;-1:-1:-1;8907:17:0;8927:26;;25358:19:1;;8927:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8927:26:0;;-1:-1:-1;;8927:26:0;;;-1:-1:-1;;;;;;;8970:23:0;;8966:49;;9002:13;;;;;;;;;;;;;;8966:49;-1:-1:-1;;;;;9136:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;9127:28;;9123:55;;9164:14;;;;;;;;;;;;;;9123:55;9202:31;9212:9;9223;9202;:31::i;:::-;8621:620;;;8426:815;;;;;;:::o;28051:137::-;17401:1;17495:6;;:17;17491:42;;;17521:12;;;;;;;;;;;;;;17491:42;17401:1;17546:6;:16;28144:36:::1;28150:10;28162:8:::0;28172:7;28144:5:::1;:36::i;:::-;-1:-1:-1::0;;17356:1:0;17589:6;:20;28051:137::o;5816:959::-;6054:8;6036:15;:26;6032:57;;;6071:18;;;;;;;;;;;;;;6032:57;6189:14;6306:18;:16;:18::i;:::-;-1:-1:-1;;;;;6408:13:0;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;6357:77;;2293:95;6357:77;;;32715:25:1;32817:18;;;32810:43;;;;32889:15;;;32869:18;;;32862:43;32921:18;;;32914:34;;;32964:19;;;32957:35;;;;33008:19;;;;33001:35;;;6357:77:0;;;;;;;;;;32687:19:1;;;6357:77:0;;;6347:88;;;;;;;;24980:66:1;6234:220:0;;;24968:79:1;25063:11;;;25056:27;;;;25099:12;;;25092:28;;;;25136:12;;6234:220:0;;;-1:-1:-1;;6234:220:0;;;;;;;;;6206:263;;6234:220;6206:263;;;;6486:24;6513:26;;;;;;;;;25386:25:1;;;25459:4;25447:17;;25427:18;;;25420:45;;;;25481:18;;;25474:34;;;25524:18;;;25517:34;;;6206:263:0;;-1:-1:-1;6486:24:0;6513:26;;25358:19:1;;6513:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6513:26:0;;-1:-1:-1;;6513:26:0;;;-1:-1:-1;;;;;;;6560:30:0;;;;:59;;;6614:5;-1:-1:-1;;;;;6594:25:0;:16;-1:-1:-1;;;;;6594:25:0;;;6560:59;6556:90;;;6628:18;;;;;;;;;;;;;;6556:90;-1:-1:-1;;;;;6663:27:0;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;6736:31;4579:25:1;;;6663:36:0;;-1:-1:-1;6736:31:0;;;;;;4552:18:1;6736:31:0;;;;;;;5816:959;;;;;;;:::o;27112:361::-;17401:1;17495:6;;:17;17491:42;;;17521:12;;;;;;;;;;;;;;17491:42;17401:1;17546:6;:16;27201:21:::1;27225:19:::0;;;:9:::1;:19;::::0;;;;27275:13:::1;::::0;::::1;::::0;-1:-1:-1;;;;;27275:13:0::1;27261:10;:27;27257:53;;27297:13;;;;;;;;;;;;;;27257:53;27327:17;::::0;::::1;::::0;;;::::1;;;:22:::0;27323:46:::1;;27358:11;;;;;;;;;;;;;;27323:46;27389:19;::::0;;;:9:::1;:19;::::0;;;;27382:26;;-1:-1:-1;;27382:26:0::1;::::0;;27389:19;27382:26:::1;::::0;;::::1;27389:19:::0;27382:26:::1;:::i;:::-;;;::::0;::::1;;;:::i;:::-;;;::::0;::::1;;;:::i;:::-;;;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;27382:26:0::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;27426:39:::1;::::0;27456:8;;27444:10:::1;::::0;27426:39:::1;::::0;27382:26;27426:39:::1;-1:-1:-1::0;;17356:1:0;17589:6;:20;27112:361::o;30249:4097::-;30347:20;30369:22;17401:1;17495:6;;:17;17491:42;;;17521:12;;;;;;;;;;;;;;17491:42;17401:1;17546:6;:16;30410:21:::1;30434:19:::0;;;:9:::1;:19;::::0;;;;30504:17;;30434:19;;30410:21;30486:17:::1;::::0;30410:21;;30504:17:::1;;30486:36;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;30486:36:0;;30539:17:::1;::::0;::::1;::::0;30486:36:::1;::::0;;::::1;::::0;-1:-1:-1;30539:17:0;;::::1;;;30535:55;;30570:20;;;;;;;;;;;;;;30535:55;30869:11;::::0;30834:17:::1;::::0;::::1;::::0;;;::::1;30869:11;30834:17:::0;;::::1;30854:12:::0;;::::1;30834:32;30869:11:::0;;;::::1;::::0;::::1;30834:46:::0;;;::::1;30815:65;:15;:65;30811:94;;30889:16;;;;;;;;;;;;;;30811:94;31036:19;31015:17:::0;;::::1;;:40;::::0;::::1;;;;;;:::i;:::-;;31011:137;;31085:17;::::0;::::1;::::0;31075:28:::1;::::0;;;:9:::1;:28;::::0;;;;:41:::1;;::::0;;;::::1;;;:46:::0;31071:77:::1;;31130:18;;;;;;;;;;;;;;31071:77;31201:13;::::0;::::1;::::0;31179:50:::1;::::0;31191:8;;31201:13:::1;::::0;;::::1;::::0;31216:12;;::::1;;31179:11;:50::i;:::-;31161:68;;31254:15;31250:2934;;;31406:17;31385::::0;;::::1;;:38;::::0;::::1;;;;;;:::i;:::-;;31381:204;;;31452:9;31447:138;31467:13;::::0;::::1;:20:::0;31463:24;::::1;31447:138;;;31521:40;31527:4;:13;;31541:1;31527:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;31545:12:::1;::::0;::::1;:15:::0;;-1:-1:-1;;;;;31527:16:0;;::::1;::::0;31558:1;;31545:15;::::1;;;;;:::i;:::-;;;;;;;;;31521:5;:40::i;:::-;31489:3;;31447:138;;;;31381:204;31650:17;31629::::0;;::::1;;:38;::::0;::::1;;;;;;:::i;:::-;;31625:204;;;31696:9;31691:138;31711:13;::::0;::::1;:20:::0;31707:24;::::1;31691:138;;;31765:40;31771:4;:13;;31785:1;31771:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;31789:12:::1;::::0;::::1;:15:::0;;-1:-1:-1;;;;;31771:16:0;;::::1;::::0;31802:1;;31789:15;::::1;;;;;:::i;:::-;;;;;;;;;31765:5;:40::i;:::-;31733:3;;31691:138;;;;31625:204;31894:17;31873::::0;;::::1;;:38;::::0;::::1;;;;;;:::i;:::-;;31869:451;;;31940:9;31935:385;31955:13;::::0;::::1;:20:::0;31951:24;::::1;31935:385;;;32031:13;::::0;::::1;:20:::0;32019:33:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32009:43;;32108:19;32131:4;:13;;32145:1;32131:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;32160:12:::1;::::0;::::1;:15:::0;;-1:-1:-1;;;;;32131:16:0;;::::1;::::0;32173:1;;32160:15;::::1;;;;;:::i;:::-;;;;;;;;;32207:4;:13;;32221:1;32207:16;;;;;;;;:::i;:::-;;;;;;;;32131:93;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32105:119;;;32290:6;32277:7;32285:1;32277:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:19;-1:-1:-1;31977:3:0::1;;31935:385;;;;31869:451;32425:20;32404:17:::0;;::::1;;:41;::::0;::::1;;;;;;:::i;:::-;;32400:133;;;32473:4;:12;;32486:1;32473:15;;;;;;;;:::i;:::-;;;;;;;;;32492:1;32473:20;32469:64;;32517:4;:12;;32530:1;32517:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;32495:12:::1;:38:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;32469:64:::1;32595:20;32574:17:::0;;::::1;;:41;::::0;::::1;;;;;;:::i;:::-;;32570:132;;;32643:4;:12;;32656:1;32643:15;;;;;;;;:::i;:::-;;;;;;;;;32662:1;32643:20;32639:63;;32686:4;:12;;32699:1;32686:15;;;;;;;;:::i;:::-;;;;;;;;;32665:11;;:37;;;;;;;;;;;;;;;;;;32639:63;32764:19;32743:17:::0;;::::1;;:40;::::0;::::1;;;;;;:::i;:::-;;32739:126;;;32811:4;:12;;32824:1;32811:15;;;;;;;;:::i;:::-;;;;;;;;;32830:1;32811:20;32807:58;;32849:4;:12;;32862:1;32849:15;;;;;;;;:::i;:::-;;;;;;;;;32833:6;;:32;;;;;;;;;;;;;;;;;;32807:58;32927:26;32906:17:::0;;::::1;;:47;::::0;::::1;;;;;;:::i;:::-;;32902:140;;;32981:4;:12;;32994:1;32981:15;;;;;;;;:::i;:::-;;;;;;;;;33000:1;32981:20;32977:65;;33026:4;:12;;33039:1;33026:15;;;;;;;;:::i;:::-;;;;;;;;;33003:13;;:39;;;;;;;;;;;;;;;;;;32977:65;33104:17;33083::::0;;::::1;;:38;::::0;::::1;;;;;;:::i;:::-;;33079:142;;;33205:4;:12;;33218:1;33205:15;;;;;;;;:::i;:::-;;;;;;;;;33196:25;;;;;;;;:::i;:::-;33145:17;:48;33176:4;:12;;33189:1;33176:15;;;;;;;;:::i;:::-;;;;;;;;;33163:29;;;;;;;;:::i;:::-;33145:48;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;33145:48:0;:76;;-1:-1:-1;;33145:76:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;;;;33079:142;33283:18;33262:17:::0;;::::1;;:39;::::0;::::1;;;;;;:::i;:::-;;33258:79;;;33325:12;:10;:12::i;:::-;33399:22;33378:17:::0;;::::1;;:43;::::0;::::1;;;;;;:::i;:::-;;33374:463;;;33450:9;33445:392;33465:13;::::0;::::1;:20:::0;33461:24;::::1;33445:392;;;33523:4;:12;;33536:1;33523:15;;;;;;;;:::i;:::-;;;;;;;;;33542:1;33523:20;33519:116;;33607:10;:28;33618:4;:13;;33632:1;33618:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;33618:16:0::1;33607:28:::0;;;::::1;::::0;;;;;;;;;33586:13:::1;::::0;::::1;:16:::0;;33607:28:::1;::::0;;::::1;33606:29;::::0;33575:10:::1;::::0;33618:16;;33586:13;33600:1;;33586:16;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;33586:16:0::1;33575:28:::0;;;::::1;::::0;;;;;;;;:60;;-1:-1:-1;;33575:60:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33519:116:::1;33714:1;33688:4;:13;;33702:1;33688:16;;;;;;;;:::i;:::-;;;;;;;;:23;;;;;:::i;:::-;;;:27;33684:129;;;33735:4;:13;;33749:1;33735:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;33796:13:::1;::::0;::::1;:16:::0;;-1:-1:-1;;;;;33735:16:0;;::::1;::::0;33717:78:::1;::::0;33796:13;33810:1;;33796:16;::::1;;;;;:::i;:::-;;;;;;;;33717:96;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33684:129;33487:3;;33445:392;;;;33374:463;33898:19;33877:17:::0;;::::1;;:40;::::0;::::1;;;;;;:::i;:::-;;33873:100;;;33947:9;:26;33957:4;:12;;33970:1;33957:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;33947:26;;;::::1;::::0;;;;;;;;33940:33;;-1:-1:-1;;33940:33:0::1;::::0;;33947:26;33940:33:::1;::::0;;::::1;33957:15:::0;33940:33:::1;:::i;:::-;;;::::0;::::1;;;:::i;:::-;;;::::0;::::1;;;:::i;:::-;;;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;33940:33:0::1;;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;;::::0;;;::::1;::::0;;33873:100:::1;34019:17;33998::::0;;::::1;;:38;::::0;::::1;;;;;;:::i;:::-;;33994:88;;;34066:4;:16;;34059:4;:23;;;;;;:::i;:::-;;;;;;:::i;:::-;;33994:88;34119:24;::::0;;;:14:::1;:24;::::0;;;;:38;;-1:-1:-1;;34119:38:0::1;34153:4;34119:38;::::0;;31250:2934:::1;34203:19;::::0;;;:9:::1;:19;::::0;;;;34196:26;;-1:-1:-1;;34196:26:0::1;::::0;;34203:19;34196:26:::1;::::0;;::::1;34203:19:::0;34196:26:::1;:::i;:::-;;;::::0;::::1;;;:::i;:::-;;;::::0;::::1;;;:::i;:::-;;;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;34196:26:0::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;34235:24;;;:14:::1;:24;::::0;;;;;:41;;;::::1;34196:26;34235:41;::::0;;34294:44;;::::1;;::::0;34250:8;;34294:44:::1;::::0;34196:26;34294:44:::1;-1:-1:-1::0;;17356:1:0;17589:6;:20;30249:4097;;;;-1:-1:-1;30249:4097:0:o;36768:125::-;35966:10;35955:22;;;;:10;:22;;;;;;;;35950:50;;35986:14;;;;;;;;;;;;;;29121:1120;29248:21;29272:19;;;:9;:19;;;;;;;;29308:5;:15;;;;;-1:-1:-1;;;;;29308:23:0;;;;;;;;;;;;;29304:50;;;29340:14;;;;;;;;;;;;;;29304:50;29596:12;;29576:17;;;;29596:12;;;;29576:17;;;;;;:32;29558:50;:15;:50;29554:76;;;29617:13;;;;;;;;;;;;;;29554:76;29692:17;;;;29654:13;;29670:40;;29684:6;;29692:17;;;;;29670:13;:40::i;:::-;29654:56;;29930:7;29926:185;;;29958:13;;;:23;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30002:19:0;;29958:13;30002:19;;;:11;:19;;;;;:30;;;29926:185;;;30073:12;;;:22;;;;;;;;;;;;;;;;;;;;;;29926:185;30142:15;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;30142:23:0;;;;;;;;;;:30;;-1:-1:-1;;30142:30:0;30168:4;30142:30;;;30198:35;;;;;30148:8;;30142:23;30198:35;;30142:15;30198:35;29237:1004;;29121:1120;;;:::o;11049:922::-;11199:6;-1:-1:-1;;;;;11189:16:0;:6;-1:-1:-1;;;;;11189:16:0;;;:31;;;;-1:-1:-1;11209:11:0;;;11189:31;11185:409;;;-1:-1:-1;;;;;11240:20:0;;;11236:358;;-1:-1:-1;;;;;11301:22:0;;11281:17;11301:22;;;:14;:22;;;;;;;11380:14;:61;;11440:1;11380:61;;;-1:-1:-1;;;;;11397:19:0;;;;;;:11;:19;;;;;;11417:13;11429:1;11417:9;:13;:::i;:::-;11397:34;;;;;;;;;;;-1:-1:-1;11397:34:0;:40;;;;;;11380:61;11360:81;;;-1:-1:-1;11462:17:0;11482:18;11494:6;11360:81;11482:18;:::i;:::-;11462:38;;11521:57;11538:6;11546:9;11557;11568;11521:16;:57::i;:::-;11262:332;;;11236:358;-1:-1:-1;;;;;11626:20:0;;;11622:342;;-1:-1:-1;;;;;11687:22:0;;11667:17;11687:22;;;:14;:22;;;;;;;11750:14;:61;;11810:1;11750:61;;;-1:-1:-1;;;;;11767:19:0;;;;;;:11;:19;;;;;;11787:13;11799:1;11787:9;:13;:::i;:::-;11767:34;;;;;;;;;;;-1:-1:-1;11767:34:0;:40;;;;;;11750:61;11730:81;;;-1:-1:-1;11832:17:0;11852:18;11864:6;11730:81;11852:18;:::i;:::-;11832:38;;11891:57;11908:6;11916:9;11927;11938;11891:16;:57::i;:::-;11648:316;;;11622:342;11049:922;;;:::o;6971:459::-;7037:7;7139:95;7273:4;7257:22;;;;;;:::i;:::-;;;;;;;;;;7106:301;;;35583:25:1;;;;35624:18;;35617:34;;;;7302:14:0;35667:18:1;;;35660:34;7339:13:0;35710:18:1;;;35703:34;7383:4:0;35753:19:1;;;35746:84;35555:19;;7106:301:0;;;;;;;;;;;;7078:344;;;;;;7057:365;;6971:459;:::o;13073:396::-;13159:6;13144:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13315:13:0;;;;;;:9;:13;;;;;:23;;;;;;13362:49;;13389:13;13325:2;13389:9;:13::i;:::-;13404:6;13362:14;:49::i;:::-;13429:32;;4579:25:1;;;-1:-1:-1;;;;;13429:32:0;;;13446:1;;13429:32;;4567:2:1;4552:18;13429:32:0;;;;;;;;13073:396;;:::o;13477:401::-;-1:-1:-1;;;;;13550:15:0;;;;;;:9;:15;;;;;:25;;13569:6;;13550:15;:25;;13569:6;;13550:25;:::i;:::-;;;;-1:-1:-1;;13722:11:0;:21;;;;;;;13767:51;13782:15;13792:4;13782:9;:15::i;:::-;13807:1;13811:6;13767:14;:51::i;:::-;13836:34;;4579:25:1;;;13859:1:0;;-1:-1:-1;;;;;13836:34:0;;;;;4567:2:1;4552:18;13836:34:0;4433:177:1;10707:334:0;10792:23;10818:20;10828:9;10818;:20::i;:::-;-1:-1:-1;;;;;10851:21:0;;;;;;;:10;:21;;;;;;;;:33;;;;;;;;;;;;;;10940:9;:20;;;;10792:46;;-1:-1:-1;10897:64:0;;10792:46;;10851:33;;10897:14;:64::i;:::-;11023:9;-1:-1:-1;;;;;10979:54:0;11006:15;-1:-1:-1;;;;;10979:54:0;10995:9;-1:-1:-1;;;;;10979:54:0;;;;;;;;;;;10781:260;10707:334;;:::o;14729:165::-;14794:6;14821:16;14817:20;;14813:44;;;14846:11;;;;;;;;;;;;;;14813:44;-1:-1:-1;14884:1:0;14729:165::o;3352:713::-;3579:7;:14;3561:7;:14;:32;3557:60;;3602:15;;;;;;;;;;;;;;3557:60;3630:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;3663:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;3700:6:0;:16;;-1:-1:-1;;3700:16:0;;;;;;;3748:13;3729:16;:32;3809:25;:23;:25::i;:::-;3782:24;:52;3947:9;3942:105;3962:7;:14;3958:1;:18;3942:105;;;4002:29;4008:7;4016:1;4008:10;;;;;;;;:::i;:::-;;;;;;;4020:7;4028:1;4020:10;;;;;;;;:::i;:::-;;;;;;;4002:5;:29::i;:::-;3978:3;;3942:105;;34354:1321;34494:20;34577:13;;:29;;;;-1:-1:-1;34594:12:0;;34577:29;34573:47;;;-1:-1:-1;34615:5:0;34608:12;;34573:47;34689:40;34677:8;:52;;;;;;;;:::i;:::-;;:106;;;-1:-1:-1;34745:38:0;34733:8;:50;;;;;;;;:::i;:::-;;34677:106;34673:487;;;34834:6;;34820:11;;34800:16;;34844:3;;34820:20;;34834:6;;;;;;34820:20;:::i;:::-;34819:28;;;;:::i;:::-;34800:47;-1:-1:-1;35060:18:0;;;35103:16;;;35099:34;;;35128:5;35121:12;;;;;;35099:34;35015:134;34785:375;34673:487;35230:24;35218:8;:36;;;;;;;;:::i;:::-;;:92;;;-1:-1:-1;35270:40:0;35258:8;:52;;;;;;;;:::i;:::-;;35218:92;35214:454;;;35342:7;35331:8;:18;35327:35;;;-1:-1:-1;35358:4:0;35351:11;;35327:35;35214:454;;;35584:13;;35543:14;;35601:3;;35584:13;;;;;35562:18;35573:7;35562:8;:18;:::i;:::-;35561:36;;;;:::i;:::-;35560:44;;;;:::i;:::-;35543:61;;35637:6;35625:8;:18;35621:35;;35652:4;35645:11;;;;;35621:35;35412:256;34354:1321;;;;;:::o;14414:112::-;14474:6;;;;;;;14473:7;-1:-1:-1;;14464:16:0;;;;;;;;14498:20;;14511:6;;2871:14:1;2864:22;2846:41;;14498:20:0;;2834:2:1;2819:18;14498:20:0;;;;;;;14414:112::o;11979:898::-;12289:17;;;;;:94;;-1:-1:-1;;;;;;12310:22:0;;;;;;:11;:22;;;;;;;;-1:-1:-1;;12333:16:0;;12310:40;;;;;;;:54;;;12368:15;12310:73;12289:94;12285:505;;;12453:23;12467:8;12453:13;:23::i;:::-;-1:-1:-1;;;;;12404:22:0;;;;;;:11;:22;;;;;;;;-1:-1:-1;;12427:16:0;;12404:40;;;;;;;:72;;;;;;;;;;;;;;;;;;;12285:505;;;12556:67;;;;;;;;12567:30;12581:15;12567:13;:30::i;:::-;12556:67;;;;;;12599:23;12613:8;12599:13;:23::i;:::-;12556:67;;;;;;;-1:-1:-1;;;;;12517:22:0;;;;;;:11;:22;;;;;;;;:36;;;;;;;;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12730:25;;;:14;:25;;;;12517:106;12758:16;;12730:44;;12285:505;12818:51;;;36527:25:1;;;36583:2;36568:18;;36561:34;;;-1:-1:-1;;;;;12818:51:0;;;;;36500:18:1;12818:51:0;;;;;;;11979:898;;;;:::o;14906:165::-;14971:6;14998:16;14994:20;;14990:44;;;15023:11;;;;;;;;;;;;;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:184::-;251:77;248:1;241:88;348:4;345:1;338:15;372:4;369:1;362:15;388:258;460:1;470:113;484:6;481:1;478:13;470:113;;;560:11;;;554:18;541:11;;;534:39;506:2;499:10;470:113;;;601:6;598:1;595:13;592:48;;;636:1;627:6;622:3;618:16;611:27;592:48;;388:258;;;:::o;651:317::-;693:3;731:5;725:12;758:6;753:3;746:19;774:63;830:6;823:4;818:3;814:14;807:4;800:5;796:16;774:63;:::i;:::-;882:2;870:15;-1:-1:-1;;866:88:1;857:98;;;;957:4;853:109;;651:317;-1:-1:-1;;651:317:1:o;973:846::-;1262:4;1302:2;1294:6;1291:14;1281:48;;1309:18;;:::i;:::-;1356:6;1345:9;1338:25;1399:3;1394:2;1383:9;1379:18;1372:31;1420:46;1461:3;1450:9;1446:19;1438:6;1420:46;:::i;:::-;1497:2;1482:18;;1475:34;;;;-1:-1:-1;1528:26:1;1590:15;;;1585:2;1570:18;;1563:43;1643:15;;;;1637:3;1622:19;;1615:44;1708:10;1696:23;1690:3;1675:19;;1668:52;-1:-1:-1;;;;;1757:55:1;;;1751:3;1736:19;;;1729:84;1475:34;1412:54;-1:-1:-1;;973:846:1:o;2021:220::-;2170:2;2159:9;2152:21;2133:4;2190:45;2231:2;2220:9;2216:18;2208:6;2190:45;:::i;2246:196::-;2314:20;;-1:-1:-1;;;;;2363:54:1;;2353:65;;2343:93;;2432:1;2429;2422:12;2343:93;2246:196;;;:::o;2447:254::-;2515:6;2523;2576:2;2564:9;2555:7;2551:23;2547:32;2544:52;;;2592:1;2589;2582:12;2544:52;2615:29;2634:9;2615:29;:::i;:::-;2605:39;2691:2;2676:18;;;;2663:32;;-1:-1:-1;;;2447:254:1:o;3197:347::-;3248:8;3258:6;3312:3;3305:4;3297:6;3293:17;3289:27;3279:55;;3330:1;3327;3320:12;3279:55;-1:-1:-1;3353:20:1;;3396:18;3385:30;;3382:50;;;3428:1;3425;3418:12;3382:50;3465:4;3457:6;3453:17;3441:29;;3517:3;3510:4;3501:6;3493;3489:19;3485:30;3482:39;3479:59;;;3534:1;3531;3524:12;3479:59;3197:347;;;;;:::o;3549:626::-;3646:6;3654;3662;3670;3678;3731:3;3719:9;3710:7;3706:23;3702:33;3699:53;;;3748:1;3745;3738:12;3699:53;3771:29;3790:9;3771:29;:::i;:::-;3761:39;;3819:38;3853:2;3842:9;3838:18;3819:38;:::i;:::-;3809:48;;3904:2;3893:9;3889:18;3876:32;3866:42;;3959:2;3948:9;3944:18;3931:32;3986:18;3978:6;3975:30;3972:50;;;4018:1;4015;4008:12;3972:50;4057:58;4107:7;4098:6;4087:9;4083:22;4057:58;:::i;:::-;3549:626;;;;-1:-1:-1;3549:626:1;;-1:-1:-1;4134:8:1;;4031:84;3549:626;-1:-1:-1;;;3549:626:1:o;4615:118::-;4701:5;4694:13;4687:21;4680:5;4677:32;4667:60;;4723:1;4720;4713:12;4738:128;4803:20;;4832:28;4803:20;4832:28;:::i;4871:156::-;4937:20;;4997:4;4986:16;;4976:27;;4966:55;;5017:1;5014;5007:12;5032:592;5131:6;5139;5147;5155;5163;5171;5224:3;5212:9;5203:7;5199:23;5195:33;5192:53;;;5241:1;5238;5231:12;5192:53;5264:29;5283:9;5264:29;:::i;:::-;5254:39;;5340:2;5329:9;5325:18;5312:32;5302:42;;5394:2;5383:9;5379:18;5366:32;5407:28;5429:5;5407:28;:::i;:::-;5454:5;-1:-1:-1;5478:36:1;5510:2;5495:18;;5478:36;:::i;:::-;5468:46;;5561:3;5550:9;5546:19;5533:33;5523:43;;5613:3;5602:9;5598:19;5585:33;5575:43;;5032:592;;;;;;;;:::o;5629:328::-;5706:6;5714;5722;5775:2;5763:9;5754:7;5750:23;5746:32;5743:52;;;5791:1;5788;5781:12;5743:52;5814:29;5833:9;5814:29;:::i;:::-;5804:39;;5862:38;5896:2;5885:9;5881:18;5862:38;:::i;:::-;5852:48;;5947:2;5936:9;5932:18;5919:32;5909:42;;5629:328;;;;;:::o;5962:186::-;6021:6;6074:2;6062:9;6053:7;6049:23;6045:32;6042:52;;;6090:1;6087;6080:12;6042:52;6113:29;6132:9;6113:29;:::i;6524:551::-;6612:6;6620;6628;6636;6689:2;6677:9;6668:7;6664:23;6660:32;6657:52;;;6705:1;6702;6695:12;6657:52;6728:29;6747:9;6728:29;:::i;:::-;6718:39;;6804:2;6793:9;6789:18;6776:32;6766:42;;6859:2;6848:9;6844:18;6831:32;6886:18;6878:6;6875:30;6872:50;;;6918:1;6915;6908:12;6872:50;6957:58;7007:7;6998:6;6987:9;6983:22;6957:58;:::i;:::-;6524:551;;;;-1:-1:-1;7034:8:1;-1:-1:-1;;;;6524:551:1:o;7343:254::-;7411:6;7419;7472:2;7460:9;7451:7;7447:23;7443:32;7440:52;;;7488:1;7485;7478:12;7440:52;7524:9;7511:23;7501:33;;7553:38;7587:2;7576:9;7572:18;7553:38;:::i;:::-;7543:48;;7343:254;;;;;:::o;8106:615::-;8157:3;8195:5;8189:12;8222:6;8217:3;8210:19;8248:4;8289:2;8284:3;8280:12;8314:11;8341;8334:18;;8391:6;8388:1;8384:14;8377:5;8373:26;8361:38;;8433:2;8426:5;8422:14;8454:1;8464:231;8478:6;8475:1;8472:13;8464:231;;;8549:5;8543:4;8539:16;8534:3;8527:29;8577:38;8610:4;8601:6;8595:13;8577:38;:::i;:::-;8673:12;;;;8569:46;-1:-1:-1;8638:15:1;;;;8500:1;8493:9;8464:231;;;-1:-1:-1;8711:4:1;;8106:615;-1:-1:-1;;;;;;;8106:615:1:o;8726:1392::-;9090:2;9102:21;;;9172:13;;9075:18;;;9194:22;;;9042:4;;9270;;9247:3;9232:19;;;9297:15;;;9042:4;9340:218;9354:6;9351:1;9348:13;9340:218;;;9419:13;;-1:-1:-1;;;;;9415:62:1;9403:75;;9498:12;;;;9533:15;;;;9376:1;9369:9;9340:218;;;-1:-1:-1;;;9594:19:1;;;9574:18;;;9567:47;9664:13;;9686:21;;;9762:15;;;;9725:12;;;9797:1;9807:189;9823:8;9818:3;9815:17;9807:189;;;9892:15;;9878:30;;9969:17;;;;9930:14;;;;9851:1;9842:11;9807:189;;;9811:3;;10043:9;10036:5;10032:21;10027:2;10016:9;10012:18;10005:49;10071:41;10106:5;10098:6;10071:41;:::i;:::-;10063:49;8726:1392;-1:-1:-1;;;;;;;;8726:1392:1:o;10123:154::-;10201:20;;10250:2;10240:13;;10230:41;;10267:1;10264;10257:12;10282:213;10358:6;10411:2;10399:9;10390:7;10386:23;10382:32;10379:52;;;10427:1;10424;10417:12;10379:52;10450:39;10479:9;10450:39;:::i;10500:244::-;10645:2;10630:18;;10678:1;10667:13;;10657:47;;10684:18;;:::i;:::-;10713:25;;;10500:244;:::o;10962:184::-;11014:77;11011:1;11004:88;11111:4;11108:1;11101:15;11135:4;11132:1;11125:15;11151:334;11222:2;11216:9;11278:2;11268:13;;-1:-1:-1;;11264:86:1;11252:99;;11381:18;11366:34;;11402:22;;;11363:62;11360:88;;;11428:18;;:::i;:::-;11464:2;11457:22;11151:334;;-1:-1:-1;11151:334:1:o;11490:246::-;11539:4;11572:18;11564:6;11561:30;11558:56;;;11594:18;;:::i;:::-;-1:-1:-1;11651:2:1;11639:15;-1:-1:-1;;11635:88:1;11725:4;11631:99;;11490:246::o;11741:338::-;11806:5;11835:53;11851:36;11880:6;11851:36;:::i;:::-;11835:53;:::i;:::-;11826:62;;11911:6;11904:5;11897:21;11951:3;11942:6;11937:3;11933:16;11930:25;11927:45;;;11968:1;11965;11958:12;11927:45;12017:6;12012:3;12005:4;11998:5;11994:16;11981:43;12071:1;12064:4;12055:6;12048:5;12044:18;12040:29;12033:40;11741:338;;;;;:::o;12084:222::-;12127:5;12180:3;12173:4;12165:6;12161:17;12157:27;12147:55;;12198:1;12195;12188:12;12147:55;12220:80;12296:3;12287:6;12274:20;12267:4;12259:6;12255:17;12220:80;:::i;12311:183::-;12371:4;12404:18;12396:6;12393:30;12390:56;;;12426:18;;:::i;:::-;-1:-1:-1;12471:1:1;12467:14;12483:4;12463:25;;12311:183::o;12499:668::-;12553:5;12606:3;12599:4;12591:6;12587:17;12583:27;12573:55;;12624:1;12621;12614:12;12573:55;12660:6;12647:20;12686:4;12710:60;12726:43;12766:2;12726:43;:::i;12710:60::-;12804:15;;;12890:1;12886:10;;;;12874:23;;12870:32;;;12835:12;;;;12914:15;;;12911:35;;;12942:1;12939;12932:12;12911:35;12978:2;12970:6;12966:15;12990:148;13006:6;13001:3;12998:15;12990:148;;;13072:23;13091:3;13072:23;:::i;:::-;13060:36;;13116:12;;;;13023;;12990:148;;;-1:-1:-1;13156:5:1;12499:668;-1:-1:-1;;;;;;12499:668:1:o;13172:976::-;13249:5;13278:64;13294:47;13334:6;13294:47;:::i;13278:64::-;13376:21;;;13269:73;-1:-1:-1;13416:4:1;13436:14;;;;13489:1;13485:14;;;13473:27;;13512:15;;;13509:35;;;13540:1;13537;13530:12;13509:35;13564:6;13579:563;13595:6;13590:3;13587:15;13579:563;;;13681:3;13668:17;13717:18;13704:11;13701:35;13698:125;;;13777:1;13806:2;13802;13795:14;13698:125;13846:24;;13905:4;13897:13;;13893:23;-1:-1:-1;13883:121:1;;13958:1;13987:2;13983;13976:14;13883:121;14029:70;14095:3;14090:2;14077:16;14072:2;14068;14064:11;14029:70;:::i;:::-;14017:83;;-1:-1:-1;14120:12:1;;;;13612;;13579:563;;;13583:3;;;;13172:976;;;;;:::o;14153:240::-;14205:5;14258:3;14251:4;14243:6;14239:17;14235:27;14225:55;;14276:1;14273;14266:12;14225:55;14298:89;14383:3;14374:6;14361:20;14354:4;14346:6;14342:17;14298:89;:::i;14398:367::-;14461:8;14471:6;14525:3;14518:4;14510:6;14506:17;14502:27;14492:55;;14543:1;14540;14533:12;14492:55;-1:-1:-1;14566:20:1;;14609:18;14598:30;;14595:50;;;14641:1;14638;14631:12;14595:50;14678:4;14670:6;14666:17;14654:29;;14738:3;14731:4;14721:6;14718:1;14714:14;14706:6;14702:27;14698:38;14695:47;14692:67;;;14755:1;14752;14745:12;14770:842;14819:5;14872:3;14865:4;14857:6;14853:17;14849:27;14839:55;;14890:1;14887;14880:12;14839:55;14923:2;14917:9;14945:3;14987:2;14979:6;14975:15;15056:6;15044:10;15041:22;15020:18;15008:10;15005:34;15002:62;14999:88;;;15067:18;;:::i;:::-;15103:2;15096:22;15167:15;;15138:6;15194:15;;;15191:35;;;15222:1;15219;15212:12;15191:35;15246:6;15261:321;15277:6;15272:3;15269:15;15261:321;;;15359:3;15346:17;15407:10;15400:5;15396:22;15389:5;15386:33;15376:131;;15461:1;15490:2;15486;15479:14;15376:131;15520:18;;15567:4;15558:14;;;;15294;15261:321;;;-1:-1:-1;15600:6:1;;14770:842;-1:-1:-1;;;;;14770:842:1:o;15617:1957::-;15911:6;15919;15927;15935;15943;15951;15959;15967;15975;15983;15991:7;16045:3;16033:9;16024:7;16020:23;16016:33;16013:53;;;16062:1;16059;16052:12;16013:53;16085:18;16143:2;16131:9;16118:23;16115:31;16112:51;;;16159:1;16156;16149:12;16112:51;16182:67;16241:7;16228:9;16215:23;16204:9;16200:39;16182:67;:::i;:::-;16172:77;;16298:2;16292;16281:9;16277:18;16264:32;16261:40;16258:60;;;16314:1;16311;16304:12;16258:60;16337:76;16405:7;16398:2;16387:9;16383:18;16370:32;16359:9;16355:48;16337:76;:::i;:::-;16327:86;;16462:2;16456;16445:9;16441:18;16428:32;16425:40;16422:60;;;16478:1;16475;16468:12;16422:60;16501:76;16569:7;16562:2;16551:9;16547:18;16534:32;16523:9;16519:48;16501:76;:::i;:::-;16491:86;;16596:35;16627:2;16616:9;16612:18;16596:35;:::i;:::-;16586:45;;16681:2;16674:3;16663:9;16659:19;16646:33;16643:41;16640:61;;;16697:1;16694;16687:12;16640:61;16720:88;16800:7;16792:3;16781:9;16777:19;16764:33;16753:9;16749:49;16720:88;:::i;:::-;16710:98;;16858:2;16851:3;16840:9;16836:19;16823:33;16820:41;16817:61;;;16874:1;16871;16864:12;16817:61;16897:86;16975:7;16967:3;16956:9;16952:19;16939:33;16928:9;16924:49;16897:86;:::i;:::-;16887:96;;17033:2;17026:3;17015:9;17011:19;16998:33;16995:41;16992:61;;;17049:1;17046;17039:12;16992:61;17088:97;17177:7;17169:3;17158:9;17154:19;17141:33;17130:9;17126:49;17088:97;:::i;:::-;17204:8;;-1:-1:-1;17231:8:1;-1:-1:-1;17282:3:1;17267:19;;17254:33;17251:41;-1:-1:-1;17248:61:1;;;17305:1;17302;17295:12;17248:61;;17344:97;17433:7;17425:3;17414:9;17410:19;17397:33;17386:9;17382:49;17344:97;:::i;:::-;17460:8;;-1:-1:-1;17487:8:1;-1:-1:-1;17515:53:1;17560:7;17554:3;17539:19;;17515:53;:::i;:::-;17504:64;;15617:1957;;;;;;;;;;;;;;:::o;17579:1490::-;17795:6;17803;17811;17819;17827;17835;17843;17851;17859;17912:3;17900:9;17891:7;17887:23;17883:33;17880:53;;;17929:1;17926;17919:12;17880:53;17952:39;17981:9;17952:39;:::i;:::-;17942:49;;18042:2;18031:9;18027:18;18014:32;18065:18;18106:2;18098:6;18095:14;18092:34;;;18122:1;18119;18112:12;18092:34;18161:58;18211:7;18202:6;18191:9;18187:22;18161:58;:::i;:::-;18238:8;;-1:-1:-1;18135:84:1;-1:-1:-1;18326:2:1;18311:18;;18298:32;;-1:-1:-1;18342:16:1;;;18339:36;;;18371:1;18368;18361:12;18339:36;18410:72;18474:7;18463:8;18452:9;18448:24;18410:72;:::i;:::-;18501:8;;-1:-1:-1;18384:98:1;-1:-1:-1;18589:2:1;18574:18;;18561:32;;-1:-1:-1;18605:16:1;;;18602:36;;;18634:1;18631;18624:12;18602:36;18673:72;18737:7;18726:8;18715:9;18711:24;18673:72;:::i;:::-;18764:8;;-1:-1:-1;18647:98:1;-1:-1:-1;18852:3:1;18837:19;;18824:33;;-1:-1:-1;18869:16:1;;;18866:36;;;18898:1;18895;18888:12;18866:36;;18937:72;19001:7;18990:8;18979:9;18975:24;18937:72;:::i;:::-;18911:98;;19028:8;19018:18;;;19055:8;19045:18;;;17579:1490;;;;;;;;;;;:::o;19074:448::-;19171:6;19179;19232:2;19220:9;19211:7;19207:23;19203:32;19200:52;;;19248:1;19245;19238:12;19200:52;19288:9;19275:23;19321:18;19313:6;19310:30;19307:50;;;19353:1;19350;19343:12;19307:50;19392:70;19454:7;19445:6;19434:9;19430:22;19392:70;:::i;:::-;19481:8;;19366:96;;-1:-1:-1;19074:448:1;-1:-1:-1;;;;19074:448:1:o;19527:277::-;19724:2;19713:9;19706:21;19687:4;19744:54;19794:2;19783:9;19779:18;19771:6;19744:54;:::i;19809:1210::-;19969:6;19977;19985;19993;20001;20009;20017;20025;20078:3;20066:9;20057:7;20053:23;20049:33;20046:53;;;20095:1;20092;20085:12;20046:53;20118:29;20137:9;20118:29;:::i;:::-;20108:39;;20166:38;20200:2;20189:9;20185:18;20166:38;:::i;:::-;20156:48;;20255:2;20244:9;20240:18;20227:32;20278:18;20319:2;20311:6;20308:14;20305:34;;;20335:1;20332;20325:12;20305:34;20374:70;20436:7;20427:6;20416:9;20412:22;20374:70;:::i;:::-;20463:8;;-1:-1:-1;20348:96:1;-1:-1:-1;20551:2:1;20536:18;;20523:32;;-1:-1:-1;20567:16:1;;;20564:36;;;20596:1;20593;20586:12;20564:36;20635:72;20699:7;20688:8;20677:9;20673:24;20635:72;:::i;:::-;20726:8;;-1:-1:-1;20609:98:1;-1:-1:-1;20814:3:1;20799:19;;20786:33;;-1:-1:-1;20831:16:1;;;20828:36;;;20860:1;20857;20850:12;20828:36;;20899:60;20951:7;20940:8;20929:9;20925:24;20899:60;:::i;:::-;19809:1210;;;;-1:-1:-1;19809:1210:1;;-1:-1:-1;19809:1210:1;;;;;;20978:8;-1:-1:-1;;;19809:1210:1:o;21024:531::-;21126:6;21134;21142;21150;21158;21166;21219:3;21207:9;21198:7;21194:23;21190:33;21187:53;;;21236:1;21233;21226:12;21187:53;21259:29;21278:9;21259:29;:::i;:::-;21249:39;;21335:2;21324:9;21320:18;21307:32;21297:42;;21386:2;21375:9;21371:18;21358:32;21348:42;;21409:36;21441:2;21430:9;21426:18;21409:36;:::i;21560:309::-;21625:6;21633;21686:2;21674:9;21665:7;21661:23;21657:32;21654:52;;;21702:1;21699;21692:12;21654:52;21738:9;21725:23;21715:33;;21798:2;21787:9;21783:18;21770:32;21811:28;21833:5;21811:28;:::i;:::-;21858:5;21848:15;;;21560:309;;;;;:::o;21874:606::-;21985:6;21993;22001;22009;22017;22025;22033;22086:3;22074:9;22065:7;22061:23;22057:33;22054:53;;;22103:1;22100;22093:12;22054:53;22126:29;22145:9;22126:29;:::i;:::-;22116:39;;22174:38;22208:2;22197:9;22193:18;22174:38;:::i;:::-;22164:48;;22259:2;22248:9;22244:18;22231:32;22221:42;;22310:2;22299:9;22295:18;22282:32;22272:42;;22333:37;22365:3;22354:9;22350:19;22333:37;:::i;:::-;22323:47;;22417:3;22406:9;22402:19;22389:33;22379:43;;22469:3;22458:9;22454:19;22441:33;22431:43;;21874:606;;;;;;;;;;:::o;22485:260::-;22553:6;22561;22614:2;22602:9;22593:7;22589:23;22585:32;22582:52;;;22630:1;22627;22620:12;22582:52;22653:29;22672:9;22653:29;:::i;:::-;22643:39;;22701:38;22735:2;22724:9;22720:18;22701:38;:::i;22750:358::-;22983:6;22976:14;22969:22;22958:9;22951:41;23028:2;23023;23012:9;23008:18;23001:30;22932:4;23048:54;23098:2;23087:9;23083:18;23075:6;23048:54;:::i;:::-;23040:62;22750:358;-1:-1:-1;;;;22750:358:1:o;23113:695::-;23219:6;23227;23235;23243;23251;23259;23312:3;23300:9;23291:7;23287:23;23283:33;23280:53;;;23329:1;23326;23319:12;23280:53;23352:29;23371:9;23352:29;:::i;:::-;23342:39;;23400:38;23434:2;23423:9;23419:18;23400:38;:::i;:::-;23390:48;;23485:2;23474:9;23470:18;23457:32;23447:42;;23536:2;23525:9;23521:18;23508:32;23498:42;;23591:3;23580:9;23576:19;23563:33;23619:18;23611:6;23608:30;23605:50;;;23651:1;23648;23641:12;23605:50;23690:58;23740:7;23731:6;23720:9;23716:22;23690:58;:::i;:::-;23113:695;;;;-1:-1:-1;23113:695:1;;-1:-1:-1;23113:695:1;;23767:8;;23113:695;-1:-1:-1;;;23113:695:1:o;23813:437::-;23892:1;23888:12;;;;23935;;;23956:61;;24010:4;24002:6;23998:17;23988:27;;23956:61;24063:2;24055:6;24052:14;24032:18;24029:38;24026:218;;;24100:77;24097:1;24090:88;24201:4;24198:1;24191:15;24229:4;24226:1;24219:15;24026:218;;23813:437;;;:::o;25562:184::-;25614:77;25611:1;25604:88;25711:4;25708:1;25701:15;25735:4;25732:1;25725:15;25751:125;25791:4;25819:1;25816;25813:8;25810:34;;;25824:18;;:::i;:::-;-1:-1:-1;25861:9:1;;25751:125::o;25881:325::-;25969:6;25964:3;25957:19;26021:6;26014:5;26007:4;26002:3;25998:14;25985:43;;26073:1;26066:4;26057:6;26052:3;26048:16;26044:27;26037:38;25939:3;26195:4;-1:-1:-1;;26120:2:1;26112:6;26108:15;26104:88;26099:3;26095:98;26091:109;26084:116;;25881:325;;;;:::o;26211:435::-;-1:-1:-1;;;;;26428:6:1;26424:55;26413:9;26406:74;26516:6;26511:2;26500:9;26496:18;26489:34;26559:2;26554;26543:9;26539:18;26532:30;26387:4;26579:61;26636:2;26625:9;26621:18;26613:6;26605;26579:61;:::i;:::-;26571:69;26211:435;-1:-1:-1;;;;;;26211:435:1:o;26651:306::-;26727:6;26735;26788:2;26776:9;26767:7;26763:23;26759:32;26756:52;;;26804:1;26801;26794:12;26756:52;26836:9;26830:16;26855:28;26877:5;26855:28;:::i;:::-;26947:2;26932:18;;;;26926:25;26902:5;;26926:25;;-1:-1:-1;;;26651:306:1:o;27151:184::-;27203:77;27200:1;27193:88;27300:4;27297:1;27290:15;27324:4;27321:1;27314:15;27340:274;27469:3;27507:6;27501:13;27523:53;27569:6;27564:3;27557:4;27549:6;27545:17;27523:53;:::i;:::-;27592:16;;;;;27340:274;-1:-1:-1;;27340:274:1:o;27619:253::-;27755:9;27792:74;27851:14;27843:6;27836:5;27792:74;:::i;27877:1089::-;27984:6;27979:3;27972:19;27954:3;28010:4;28051:2;28046:3;28042:12;28076:11;28103;28096:18;;28153:6;28150:1;28146:14;28139:5;28135:26;28123:38;;28184:5;28207:1;28217:723;28231:6;28228:1;28225:13;28217:723;;;28302:5;28296:4;28292:16;28287:3;28280:29;28361:6;28348:20;28447:66;28439:5;28423:14;28419:26;28415:99;28395:18;28391:124;28381:152;;28529:1;28526;28519:12;28381:152;28561:30;;28620:21;;28670:18;28657:32;;28654:52;;;28702:1;28699;28692:12;28654:52;28753:8;28737:14;28733:29;28726:5;28722:41;28719:61;;;28776:1;28773;28766:12;28719:61;28801:59;28855:4;28845:8;28840:2;28831:7;28827:16;28801:59;:::i;:::-;28918:12;;;;28793:67;-1:-1:-1;;;28883:15:1;;;;28253:1;28246:9;28217:723;;28971:1505;29414:3;29403:9;29396:22;29377:4;29441:62;29498:3;29487:9;29483:19;29475:6;29467;29441:62;:::i;:::-;29560:22;;;29522:2;29540:18;;;29533:50;;;;29618:22;;;29694:6;;29656:15;;29718:1;29728:231;29742:6;29739:1;29736:13;29728:231;;;-1:-1:-1;;;;;29807:26:1;29826:6;29807:26;:::i;:::-;29803:75;29791:88;;29934:15;;;;29899:12;;;;29764:1;29757:9;29728:231;;;29732:3;30004:9;29999:3;29995:19;29990:2;29979:9;29975:18;29968:47;30036:6;30031:3;30024:19;30066:66;30058:6;30055:78;30052:98;;;30146:1;30143;30136:12;30052:98;30180:6;30177:1;30173:14;30159:28;;30231:6;30223;30218:2;30213:3;30209:12;30196:42;30323:1;30257:16;;30292:11;;;30312:13;;;30365:18;;;30361:27;;30356:2;30341:18;;30334:55;30257:16;30406:64;30292:11;30459:6;30451;30406:64;:::i;:::-;30398:72;28971:1505;-1:-1:-1;;;;;;;;;;;;;28971:1505:1:o;30481:580::-;30558:4;30564:6;30624:11;30611:25;30714:66;30703:8;30687:14;30683:29;30679:102;30659:18;30655:127;30645:155;;30796:1;30793;30786:12;30645:155;30823:33;;30875:20;;;-1:-1:-1;30918:18:1;30907:30;;30904:50;;;30950:1;30947;30940:12;30904:50;30983:4;30971:17;;-1:-1:-1;31014:14:1;31010:27;;;31000:38;;30997:58;;;31051:1;31048;31041:12;31066:271;31249:6;31241;31236:3;31223:33;31205:3;31275:16;;31300:13;;;31275:16;31066:271;-1:-1:-1;31066:271:1:o;31342:636::-;31422:6;31475:2;31463:9;31454:7;31450:23;31446:32;31443:52;;;31491:1;31488;31481:12;31443:52;31524:9;31518:16;31557:18;31549:6;31546:30;31543:50;;;31589:1;31586;31579:12;31543:50;31612:22;;31665:4;31657:13;;31653:27;-1:-1:-1;31643:55:1;;31694:1;31691;31684:12;31643:55;31723:2;31717:9;31748:49;31764:32;31793:2;31764:32;:::i;31748:49::-;31820:2;31813:5;31806:17;31860:7;31855:2;31850;31846;31842:11;31838:20;31835:33;31832:53;;;31881:1;31878;31871:12;31832:53;31894:54;31945:2;31940;31933:5;31929:14;31924:2;31920;31916:11;31894:54;:::i;:::-;31967:5;31342:636;-1:-1:-1;;;;;31342:636:1:o;33047:750::-;33096:3;33137:5;33131:12;33166:36;33192:9;33166:36;:::i;:::-;33221:1;33238:18;;;33265:162;;;;33441:1;33436:355;;;;33231:560;;33265:162;-1:-1:-1;;33302:9:1;33298:82;33293:3;33286:95;33410:6;33405:3;33401:16;33394:23;;33265:162;;33436:355;33467:5;33464:1;33457:16;33496:4;33541:2;33538:1;33528:16;33566:1;33580:165;33594:6;33591:1;33588:13;33580:165;;;33672:14;;33659:11;;;33652:35;33715:16;;;;33609:10;;33580:165;;;33584:3;;;33774:6;33769:3;33765:16;33758:23;;33231:560;;;;;33047:750;;;;:::o;33802:194::-;33928:3;33953:37;33986:3;33978:6;33953:37;:::i;34001:982::-;34108:4;34137:2;34166;34155:9;34148:21;34189:1;34222:6;34216:13;34252:36;34278:9;34252:36;:::i;:::-;34324:6;34319:2;34308:9;34304:18;34297:34;34350:2;34371:1;34403:2;34392:9;34388:18;34420:1;34415:179;;;;34608:1;34603:354;;;;34381:576;;34415:179;-1:-1:-1;;34467:9:1;34463:82;34458:2;34447:9;34443:18;34436:110;34581:2;34570:9;34566:18;34559:25;;34415:179;;34603:354;34634:6;34631:1;34624:17;34682:2;34679:1;34669:16;34707:1;34721:180;34735:6;34732:1;34729:13;34721:180;;;34828:14;;34804:17;;;34800:26;;34793:50;34871:16;;;;34750:10;;34721:180;;;34925:17;;34921:26;;;-1:-1:-1;;34381:576:1;-1:-1:-1;34974:3:1;;34001:982;-1:-1:-1;;;;;;;;34001:982:1:o;34988:128::-;35028:3;35059:1;35055:6;35052:1;35049:13;35046:39;;;35065:18;;:::i;:::-;-1:-1:-1;35101:9:1;;34988:128::o;35841:228::-;35881:7;36007:1;-1:-1:-1;;35935:74:1;35932:1;35929:81;35924:1;35917:9;35910:17;35906:105;35903:131;;;36014:18;;:::i;:::-;-1:-1:-1;36054:9:1;;35841:228::o;36074:274::-;36114:1;36140;36130:189;;36175:77;36172:1;36165:88;36276:4;36273:1;36266:15;36304:4;36301:1;36294:15;36130:189;-1:-1:-1;36333:9:1;;36074:274::o

Swarm Source

ipfs://c81d278a997ba3088d681de4d1f32e908bb47cb5aeecaac15659f0a5d8ed7f0c

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.