ETH Price: $2,052.57 (-1.18%)

Contract

0x2F9bABB15e89b20700DD32707C0457865dfD63af
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set_BOOCOIN_Addr...170471942023-04-14 18:35:231062 days ago1681497323IN
0x2F9bABB1...65dfD63af
0 ETH0.0008692529.74035895
Set_BOOCOIN_Addr...170046442023-04-08 15:45:351069 days ago1680968735IN
0x2F9bABB1...65dfD63af
0 ETH0.0006159721.06618884
Batch_claim_and_...166822562023-02-22 6:37:591114 days ago1677047879IN
0x2F9bABB1...65dfD63af
0 ETH0.019232226.49590117
Batch_claim_and_...166761942023-02-21 10:11:111115 days ago1676974271IN
0x2F9bABB1...65dfD63af
0 ETH0.0047063929.74531092
Stake166184702023-02-13 7:53:231123 days ago1676274803IN
0x2F9bABB1...65dfD63af
0 ETH0.0540975113
Batch_claim_and_...165676242023-02-06 5:21:471130 days ago1675660907IN
0x2F9bABB1...65dfD63af
0 ETH0.0030570116.22238724
Stake164916072023-01-26 14:32:231141 days ago1674743543IN
0x2F9bABB1...65dfD63af
0 ETH0.0198422517.18969655
Stake164877742023-01-26 1:41:231141 days ago1674697283IN
0x2F9bABB1...65dfD63af
0 ETH0.0074046616.71843136
Stake164625932023-01-22 13:18:471145 days ago1674393527IN
0x2F9bABB1...65dfD63af
0 ETH0.0238976513.5
Stake164613452023-01-22 9:07:471145 days ago1674378467IN
0x2F9bABB1...65dfD63af
0 ETH0.0519211113
Transfer164329502023-01-18 9:59:471149 days ago1674035987IN
0x2F9bABB1...65dfD63af
0.0638 ETH0.0003050414.49491573
Stake163894372023-01-12 8:09:351155 days ago1673510975IN
0x2F9bABB1...65dfD63af
0 ETH0.0068759315.69886603
Stake163830492023-01-11 10:43:231156 days ago1673433803IN
0x2F9bABB1...65dfD63af
0 ETH0.0139326716.98822512
Stake163783452023-01-10 18:57:111156 days ago1673377031IN
0x2F9bABB1...65dfD63af
0 ETH0.0151859425.95413408
Stake163547792023-01-07 12:03:111160 days ago1673092991IN
0x2F9bABB1...65dfD63af
0 ETH0.023121214.42657216
Stake163492962023-01-06 17:41:111161 days ago1673026871IN
0x2F9bABB1...65dfD63af
0 ETH0.0074698127.49498907
Stake163462542023-01-06 7:28:471161 days ago1672990127IN
0x2F9bABB1...65dfD63af
0 ETH0.0123761116.33500643
Stake163354862023-01-04 19:22:231162 days ago1672860143IN
0x2F9bABB1...65dfD63af
0 ETH0.0190061623.55434326
Stake163354752023-01-04 19:20:111162 days ago1672860011IN
0x2F9bABB1...65dfD63af
0 ETH0.0153055826.60541477
Stake163332362023-01-04 11:50:231163 days ago1672833023IN
0x2F9bABB1...65dfD63af
0 ETH0.006529514.8154384
Stake163258672023-01-03 11:09:471164 days ago1672744187IN
0x2F9bABB1...65dfD63af
0 ETH0.2392679513.85294042
Stake163203042023-01-02 16:32:231165 days ago1672677143IN
0x2F9bABB1...65dfD63af
0 ETH0.0407196417.67800721
Stake163202882023-01-02 16:29:111165 days ago1672676951IN
0x2F9bABB1...65dfD63af
0 ETH0.0095045715.50182271
Stake163184632023-01-02 10:22:351165 days ago1672654955IN
0x2F9bABB1...65dfD63af
0 ETH0.0035984514.60666706
Stake163181922023-01-02 9:28:111165 days ago1672651691IN
0x2F9bABB1...65dfD63af
0 ETH0.0107938813.06477896
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Ghostlers_Staking

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-12-31
*/

/**
 *Submitted for verification at Etherscan.io on 2022-12-31
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;  
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
   function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

    function stakeReward(address to, uint256 amount) external;
}
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external payable;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}
contract Ghostlers_Staking is Ownable{
    
    mapping(uint => mapping(string => uint)) public reward;
    function setReward(uint locking_months, string memory level, uint BOOCOINS_in_wei) public onlyOwner{
        require(locking_months == 1 || locking_months == 3 || locking_months == 6 || locking_months == 12, "Invalid months given.");
        reward[locking_months][level] = BOOCOINS_in_wei;
    }

    mapping(string => bytes32) public merkleRoot;
    function setMerkleRoot(string memory level, bytes32 m) public onlyOwner{
        require(keccak256(bytes(level)) == keccak256(bytes("Basic")) || 
                keccak256(bytes(level)) == keccak256(bytes("Ordinary")) || 
                keccak256(bytes(level)) == keccak256(bytes("ExtraOrdinary")) || 
                keccak256(bytes(level)) == keccak256(bytes("Legendary")) || 
                keccak256(bytes(level)) == keccak256(bytes("Rare")) || 
                keccak256(bytes(level)) == keccak256(bytes("SuperRare")), "Invalid level given.");
        merkleRoot[level] = m;
    }

    address public BOOCOIN_Address = 0xcA252612baE035b6D49c8FD8908B87723084fbC0;
    function set_BOOCOIN_Address(address a) public onlyOwner{
        BOOCOIN_Address = a;
    }
    
    address public GHOSTLERS_NFT = 0xdbE15A1DA3A58f96dE9C64233744F58F19adA1cE;
    function setGHOSTLERS_NFT(address a) public onlyOwner{
        GHOSTLERS_NFT = a;
    }

    uint public thirty_day_constant = 2592000;
    function set_thirty_day_constant(uint t) public onlyOwner {
        thirty_day_constant = t;
    }

    struct Stake {
        uint id;
        address address_;
        uint staked_time;
        uint locking_months;
        string level;
        bool staked;
    }
    
    mapping(uint => Stake) public STAKES;
    mapping(address => uint) public _stakeBalanceOfUser;

////////////////////////////////////////////////////////////////////////////////////////

    function stake(uint256[] memory ids, bytes32[][] calldata merkleproof, uint[] memory locking_months, string[] memory levels) public {
                
        for(uint i=0 ; i<ids.length; i++) {
            require(locking_months[i] == 1 || locking_months[i] == 3 || locking_months[i] == 6 || locking_months[i] == 12, "Invalid months given.");
            require(keccak256(bytes(levels[i])) == keccak256(bytes("Basic")) || 
                    keccak256(bytes(levels[i])) == keccak256(bytes("Ordinary")) || 
                    keccak256(bytes(levels[i])) == keccak256(bytes("ExtraOrdinary")) || 
                    keccak256(bytes(levels[i])) == keccak256(bytes("Legendary")) || 
                    keccak256(bytes(levels[i])) == keccak256(bytes("Rare")) || 
                    keccak256(bytes(levels[i])) == keccak256(bytes("SuperRare")), "Invalid level given.");

            string memory indexNum = Strings.toString(ids[i]);
            require(MerkleProof.verify( merkleproof[i], merkleRoot[levels[i]], keccak256(abi.encodePacked(indexNum))), "Invalid level for Id!!");
            require(IERC721A(GHOSTLERS_NFT).ownerOf(ids[i]) == msg.sender, "Invalid! id not found in user wallet!");
            require(STAKES[ids[i]].staked == false, "ID is alrady Staked!");
        
            IERC721A(GHOSTLERS_NFT).transferFrom(msg.sender, address(this), ids[i]);
        
            STAKES[ids[i]].id = ids[i];
            STAKES[ids[i]].address_ = msg.sender;
            STAKES[ids[i]].staked_time = block.timestamp;
            STAKES[ids[i]].locking_months = locking_months[i];
            STAKES[ids[i]].level = levels[i];
            STAKES[ids[i]].staked = true;

            _stakeBalanceOfUser[msg.sender] += 1;
        }
    }

    function claim_and_unstake(uint id) public {
        Stake memory s = STAKES[id];
        
        require(s.address_ == msg.sender, "Invalid! address does not match user!");
        require(s.staked == true, "ID is not Staked!");
        require(block.timestamp >= s.staked_time + (s.locking_months * thirty_day_constant), "Staking duration incomplete!");

        IERC20(BOOCOIN_Address).stakeReward(msg.sender, reward[s.locking_months][s.level]);
        IERC721A(GHOSTLERS_NFT).transferFrom(address(this), msg.sender, id);

        _stakeBalanceOfUser[msg.sender] -= 1;
        delete STAKES[id];

        _total_reward += reward[s.locking_months][s.level];
        _total_earnings_of_owner[msg.sender] += reward[s.locking_months][s.level];
    }

    function batch_claim_and_unstake(uint[] memory ids) public {
        uint total = 0;

        for(uint i=0 ; i<ids.length ; i++) {        
            require(STAKES[ids[i]].address_ == msg.sender, "Invalid! address does not match user!");
            require(STAKES[ids[i]].staked == true, "ID is not Staked!");
            require(block.timestamp >= STAKES[ids[i]].staked_time + (STAKES[ids[i]].locking_months * thirty_day_constant), "Staking duration incomplete!");

            IERC721A(GHOSTLERS_NFT).transferFrom(address(this), msg.sender, STAKES[ids[i]].id);

            total += reward[STAKES[ids[i]].locking_months][STAKES[ids[i]].level];
            
            STAKES[ids[i]].staked = false;
            delete STAKES[ids[i]];
        }
        IERC20(BOOCOIN_Address).stakeReward(msg.sender, total);
        _stakeBalanceOfUser[msg.sender] -= ids.length;

        _total_reward += total;
        _total_earnings_of_owner[msg.sender] += total;
    }

    function emergency_unstake(uint[]memory ids) public {
        uint total = 0;
        
        for(uint i=0 ; i<ids.length ; i++) {        
            require(STAKES[ids[i]].address_ == msg.sender, "Invalid! address does not match user!");
            require(STAKES[ids[i]].staked == true, "ID is not Staked!");

            IERC721A(GHOSTLERS_NFT).transferFrom(address(this), msg.sender, STAKES[ids[i]].id);

            total += get_available_reward(STAKES[ids[i]].id);
            
            STAKES[ids[i]].staked = false;
            delete STAKES[ids[i]];
        }
        IERC20(BOOCOIN_Address).stakeReward(msg.sender, total / 2);
        _stakeBalanceOfUser[msg.sender] -= ids.length;

        _total_reward += total/2;
        _total_earnings_of_owner[msg.sender] += total/2;
    }
////////////////////////////////////////////////////////////////////////////////////////

    function stakesOfOwner(address a) public view returns(Stake[] memory){
        Stake[] memory s = new Stake[](_stakeBalanceOfUser[a]);
        uint tokenIndex=0;
        for(uint i=1 ; tokenIndex!=_stakeBalanceOfUser[a] ; i++) {
            if(STAKES[i].address_ == a)
                s[tokenIndex++] = STAKES[i];
        }
        return s;
    }

    function get_available_reward(uint id) public view returns(uint){
        Stake memory s = STAKES[id];
        require(s.staked, "Token not staked");
        uint r = reward[s.locking_months][s.level] / (s.locking_months * thirty_day_constant);
        uint currentTime = block.timestamp < s.staked_time + (s.locking_months * thirty_day_constant) ? block.timestamp : s.staked_time + (s.locking_months * thirty_day_constant);
        
        return r * (currentTime - s.staked_time);
    }

    function stakeIdsOfOwner(address a) public view returns(uint[] memory){
        uint[] memory s = new uint[](_stakeBalanceOfUser[a]);
        uint tokenIndex=0;
        for(uint i=1 ; tokenIndex!=_stakeBalanceOfUser[a] ; i++) {
            if(STAKES[i].address_ == a)
                s[tokenIndex++] = i;
        }
        return s;
    }

    function _totalStakes() public view returns(uint){
        return IERC721A(GHOSTLERS_NFT).balanceOf(address(this));
    }

    function _getAllStakeIds() public view returns(uint[] memory){
        return IERC721AQueryable(GHOSTLERS_NFT).tokensOfOwner(address(this));
    }

    uint public _total_reward = 0;
    mapping(address => uint) public _total_earnings_of_owner;

    constructor() {
        merkleRoot["Basic"] = 0x7bb81aa88595be0ff2df96e4a29faa2c541aaaaeed60e8a15e1ad5406e2d6c6c;
        merkleRoot["Ordinary"] = 0x84f82b17adbfac8c3b2a0a51276b637652e228c77678383dbf99828c421d735b;
        merkleRoot["ExtraOrdinary"] = 0xab0b230421c8f3fae8713f76c6281b72e276b3d6a791ac8326efa7514e42d44b;
        merkleRoot["Legendary"] = 0x91ea53917b70190d3fa658e0f8fa0d13d92473a33f3f23bdb3ae654772bc8ae1;
        merkleRoot["Rare"] = 0xa328d2c1384b0c3eff25881a408e984ec137a38318a78b4804ef87f5ddcd4570;
        merkleRoot["SuperRare"] = 0x69a688ee4a19248399a1ed719b7b7809e003857f1292f1ad6f2513d6f67341a1;

        setReward(1, "Basic", 150000000000000000000);
        setReward(1, "Ordinary", 270000000000000000000);
        setReward(1, "ExtraOrdinary", 360000000000000000000);
        setReward(1, "Legendary", 450000000000000000000);
        setReward(1, "Rare", 660000000000000000000);
        setReward(1, "SuperRare", 990000000000000000000);

        setReward(3, "Basic", 720000000000000000000);
        setReward(3, "Ordinary", 1080000000000000000000);
        setReward(3, "ExtraOrdinary", 1350000000000000000000);
        setReward(3, "Legendary", 1620000000000000000000);
        setReward(3, "Rare", 2250000000000000000000);
        setReward(3, "SuperRare", 3240000000000000000000);

        setReward(6, "Basic", 1980000000000000000000);
        setReward(6, "Ordinary", 2700000000000000000000);
        setReward(6, "ExtraOrdinary", 3240000000000000000000);
        setReward(6, "Legendary", 3780000000000000000000);
        setReward(6, "Rare", 5040000000000000000000);
        setReward(6, "SuperRare", 7020000000000000000000);

        setReward(12, "Basic", 5040000000000000000000);
        setReward(12, "Ordinary", 6480000000000000000000);
        setReward(12, "ExtraOrdinary", 7560000000000000000000);
        setReward(12, "Legendary", 8640000000000000000000);
        setReward(12, "Rare", 11160000000000000000000);
        setReward(12, "SuperRare", 15120000000000000000000);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"BOOCOIN_Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GHOSTLERS_NFT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"STAKES","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"staked_time","type":"uint256"},{"internalType":"uint256","name":"locking_months","type":"uint256"},{"internalType":"string","name":"level","type":"string"},{"internalType":"bool","name":"staked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getAllStakeIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_stakeBalanceOfUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_total_earnings_of_owner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_total_reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"batch_claim_and_unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claim_and_unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"emergency_unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"get_available_reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setGHOSTLERS_NFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"level","type":"string"},{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"locking_months","type":"uint256"},{"internalType":"string","name":"level","type":"string"},{"internalType":"uint256","name":"BOOCOINS_in_wei","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"set_BOOCOIN_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"t","type":"uint256"}],"name":"set_thirty_day_constant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"bytes32[][]","name":"merkleproof","type":"bytes32[][]"},{"internalType":"uint256[]","name":"locking_months","type":"uint256[]"},{"internalType":"string[]","name":"levels","type":"string[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"stakeIdsOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"stakesOfOwner","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"staked_time","type":"uint256"},{"internalType":"uint256","name":"locking_months","type":"uint256"},{"internalType":"string","name":"level","type":"string"},{"internalType":"bool","name":"staked","type":"bool"}],"internalType":"struct Ghostlers_Staking.Stake[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thirty_day_constant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273ca252612bae035b6d49c8fd8908b87723084fbc0600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dbe15a1da3a58f96de9c64233744f58f19ada1ce600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062278d006005556000600855348015620000c757600080fd5b50620000e8620000dc62000a4a60201b60201c565b62000a5260201b60201c565b7f7bb81aa88595be0ff2df96e4a29faa2c541aaaaeed60e8a15e1ad5406e2d6c6c60001b60026040516200011c9062000cce565b9081526020016040518091039020819055507f84f82b17adbfac8c3b2a0a51276b637652e228c77678383dbf99828c421d735b60001b6002604051620001629062000d35565b9081526020016040518091039020819055507fab0b230421c8f3fae8713f76c6281b72e276b3d6a791ac8326efa7514e42d44b60001b6002604051620001a89062000d9c565b9081526020016040518091039020819055507f91ea53917b70190d3fa658e0f8fa0d13d92473a33f3f23bdb3ae654772bc8ae160001b6002604051620001ee9062000e03565b9081526020016040518091039020819055507fa328d2c1384b0c3eff25881a408e984ec137a38318a78b4804ef87f5ddcd457060001b6002604051620002349062000e6a565b9081526020016040518091039020819055507f69a688ee4a19248399a1ed719b7b7809e003857f1292f1ad6f2513d6f67341a160001b60026040516200027a9062000ed1565b908152602001604051809103902081905550620002de60016040518060400160405280600581526020017f4261736963000000000000000000000000000000000000000000000000000000815250680821ab0d441498000062000b1660201b60201c565b6200033060016040518060400160405280600881526020017f4f7264696e617279000000000000000000000000000000000000000000000000815250680ea300b17a8b78000062000b1660201b60201c565b6200038260016040518060400160405280600d81526020017f45787472614f7264696e6172790000000000000000000000000000000000000081525068138400eca364a0000062000b1660201b60201c565b620003d460016040518060400160405280600981526020017f4c6567656e6461727900000000000000000000000000000000000000000000008152506818650127cc3dc8000062000b1660201b60201c565b6200042660016040518060400160405280600481526020017f52617265000000000000000000000000000000000000000000000000000000008152506823c757072b8dd0000062000b1660201b60201c565b6200047860016040518060400160405280600981526020017f53757065725261726500000000000000000000000000000000000000000000008152506835ab028ac154b8000062000b1660201b60201c565b620004ca60036040518060400160405280600581526020017f426173696300000000000000000000000000000000000000000000000000000081525068270801d946c940000062000b1660201b60201c565b6200051c60036040518060400160405280600881526020017f4f7264696e617279000000000000000000000000000000000000000000000000815250683a8c02c5ea2de0000062000b1660201b60201c565b6200056e60036040518060400160405280600d81526020017f45787472614f7264696e6172790000000000000000000000000000000000000081525068492f037764b958000062000b1660201b60201c565b620005c060036040518060400160405280600981526020017f4c6567656e6461727900000000000000000000000000000000000000000000008152506857d20428df44d0000062000b1660201b60201c565b6200061260036040518060400160405280600481526020017f52617265000000000000000000000000000000000000000000000000000000008152506879f905c6fd34e8000062000b1660201b60201c565b6200066460036040518060400160405280600981526020017f537570657252617265000000000000000000000000000000000000000000000081525068afa40851be89a0000062000b1660201b60201c565b620006b660066040518060400160405280600581526020017f4261736963000000000000000000000000000000000000000000000000000000815250686b56051582a970000062000b1660201b60201c565b6200070860066040518060400160405280600881526020017f4f7264696e61727900000000000000000000000000000000000000000000000081525068925e06eec972b0000062000b1660201b60201c565b6200075a60066040518060400160405280600d81526020017f45787472614f7264696e6172790000000000000000000000000000000000000081525068afa40851be89a0000062000b1660201b60201c565b620007ac60066040518060400160405280600981526020017f4c6567656e64617279000000000000000000000000000000000000000000000081525068ccea09b4b3a090000062000b1660201b60201c565b620007ff60066040518060400160405280600481526020017f5261726500000000000000000000000000000000000000000000000000000000815250690111380cf0ef80c0000062000b1660201b60201c565b6200085260066040518060400160405280600981526020017f537570657252617265000000000000000000000000000000000000000000000081525069017c8e1206722a30000062000b1660201b60201c565b620008a5600c6040518060400160405280600581526020017f4261736963000000000000000000000000000000000000000000000000000000815250690111380cf0ef80c0000062000b1660201b60201c565b620008f8600c6040518060400160405280600881526020017f4f7264696e61727900000000000000000000000000000000000000000000000081525069015f4810a37d1340000062000b1660201b60201c565b6200094b600c6040518060400160405280600d81526020017f45787472614f7264696e61727900000000000000000000000000000000000000815250690199d41369674120000062000b1660201b60201c565b6200099e600c6040518060400160405280600981526020017f4c6567656e6461727900000000000000000000000000000000000000000000008152506901d460162f516f00000062000b1660201b60201c565b620009f1600c6040518060400160405280600481526020017f526172650000000000000000000000000000000000000000000000000000000081525069025cfc1ca7c92f60000062000b1660201b60201c565b62000a44600c6040518060400160405280600981526020017f5375706572526172650000000000000000000000000000000000000000000000815250690333a826d2ce8240000062000b1660201b60201c565b62001064565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000b2662000a4a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000b4c62000c4a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000ba5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b9c9062000f49565b60405180910390fd5b600183148062000bb55750600383145b8062000bc15750600683145b8062000bcd5750600c83145b62000c0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c069062000fbb565b60405180910390fd5b80600160008581526020019081526020016000208360405162000c3391906200104b565b908152602001604051809103902081905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081905092915050565b7f4261736963000000000000000000000000000000000000000000000000000000600082015250565b600062000cb660058362000c73565b915062000cc38262000c7e565b600582019050919050565b600062000cdb8262000ca7565b9150819050919050565b7f4f7264696e617279000000000000000000000000000000000000000000000000600082015250565b600062000d1d60088362000c73565b915062000d2a8262000ce5565b600882019050919050565b600062000d428262000d0e565b9150819050919050565b7f45787472614f7264696e61727900000000000000000000000000000000000000600082015250565b600062000d84600d8362000c73565b915062000d918262000d4c565b600d82019050919050565b600062000da98262000d75565b9150819050919050565b7f4c6567656e646172790000000000000000000000000000000000000000000000600082015250565b600062000deb60098362000c73565b915062000df88262000db3565b600982019050919050565b600062000e108262000ddc565b9150819050919050565b7f5261726500000000000000000000000000000000000000000000000000000000600082015250565b600062000e5260048362000c73565b915062000e5f8262000e1a565b600482019050919050565b600062000e778262000e43565b9150819050919050565b7f5375706572526172650000000000000000000000000000000000000000000000600082015250565b600062000eb960098362000c73565b915062000ec68262000e81565b600982019050919050565b600062000ede8262000eaa565b9150819050919050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000f3160208362000ee8565b915062000f3e8262000ef9565b602082019050919050565b6000602082019050818103600083015262000f648162000f22565b9050919050565b7f496e76616c6964206d6f6e74687320676976656e2e0000000000000000000000600082015250565b600062000fa360158362000ee8565b915062000fb08262000f6b565b602082019050919050565b6000602082019050818103600083015262000fd68162000f94565b9050919050565b600081519050919050565b60005b838110156200100857808201518184015260208101905062000feb565b60008484015250505050565b6000620010218262000fdd565b6200102d818562000c73565b93506200103f81856020860162000fe8565b80840191505092915050565b600062001059828462001014565b915081905092915050565b614b9080620010746000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80638abb76fd116100de578063a1f910ee11610097578063e8f9c1e011610071578063e8f9c1e014610486578063f2fde38b146104a2578063f4333e5c146104be578063ff72d7cc146104ee5761018e565b8063a1f910ee1461041e578063b7aafa871461044e578063bdeb07491461046a5761018e565b80638abb76fd146103435780638b9ad0c41461035f5780638da5cb5b1461039457806392504bfa146103b2578063932e8b0d146103d057806398b1f636146103ee5761018e565b80634210cd891161014b57806361d3df1c1161012557806361d3df1c146102e35780636291202a146102ff578063715018a61461031b578063721d3b24146103255761018e565b80634210cd891461027b57806354bc7a13146102975780635e3a4f45146102b35761018e565b806306f9a197146101935780630c6f815d146101c357806310ce3e68146101df578063163f8533146101fd5780631c7baa2b1461022d57806332dacda01461024b575b600080fd5b6101ad60048036038101906101a89190613388565b61050c565b6040516101ba91906133ce565b60405180910390f35b6101dd60048036038101906101d89190613415565b610524565b005b6101e76105aa565b6040516101f49190613451565b60405180910390f35b61021760048036038101906102129190613388565b6105d0565b60405161022491906133ce565b60405180910390f35b6102356105e8565b60405161024291906133ce565b60405180910390f35b61026560048036038101906102609190613415565b6105ee565b60405161027291906133ce565b60405180910390f35b61029560048036038101906102909190613388565b610846565b005b6102b160048036038101906102ac91906135c5565b610906565b005b6102cd60048036038101906102c891906136c3565b610eb6565b6040516102da9190613725565b60405180910390f35b6102fd60048036038101906102f891906135c5565b610ee4565b005b61031960048036038101906103149190613740565b6113a7565b005b6103236114c0565b005b61032d611548565b60405161033a91906133ce565b60405180910390f35b61035d60048036038101906103589190613415565b61154e565b005b61037960048036038101906103749190613415565b611ab9565b60405161038b96959493929190613849565b60405180910390f35b61039c611baa565b6040516103a99190613451565b60405180910390f35b6103ba611bd3565b6040516103c791906133ce565b60405180910390f35b6103d8611c76565b6040516103e5919061396f565b60405180910390f35b61040860048036038101906104039190613388565b611d1e565b604051610415919061396f565b60405180910390f35b61043860048036038101906104339190613991565b611eae565b60405161044591906133ce565b60405180910390f35b61046860048036038101906104639190613a19565b611ee9565b005b610484600480360381019061047f9190613bb1565b612192565b005b6104a0600480360381019061049b9190613388565b612ae7565b005b6104bc60048036038101906104b79190613388565b612ba7565b005b6104d860048036038101906104d39190613388565b612c9e565b6040516104e59190613e40565b60405180910390f35b6104f6612f76565b6040516105039190613451565b60405180910390f35b60096020528060005260406000206000915090505481565b61052c612f9c565b73ffffffffffffffffffffffffffffffffffffffff1661054a611baa565b73ffffffffffffffffffffffffffffffffffffffff16146105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790613eae565b60405180910390fd5b8060058190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090505481565b60085481565b600080600660008481526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201805461069390613efd565b80601f01602080910402602001604051908101604052809291908181526020018280546106bf90613efd565b801561070c5780601f106106e15761010080835404028352916020019161070c565b820191906000526020600020905b8154815290600101906020018083116106ef57829003601f168201915b505050505081526020016005820160009054906101000a900460ff16151515158152505090508060a00151610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076d90613f7a565b60405180910390fd5b6000600554826060015161078a9190613fc9565b600160008460600151815260200190815260200160002083608001516040516107b39190614047565b9081526020016040518091039020546107cc919061408d565b9050600060055483606001516107e29190613fc9565b83604001516107f191906140be565b421061081d5760055483606001516108099190613fc9565b836040015161081891906140be565b61081f565b425b905082604001518161083191906140f2565b8261083c9190613fc9565b9350505050919050565b61084e612f9c565b73ffffffffffffffffffffffffffffffffffffffff1661086c611baa565b73ffffffffffffffffffffffffffffffffffffffff16146108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b990613eae565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000805b8251811015610d5c573373ffffffffffffffffffffffffffffffffffffffff166006600085848151811061094157610940614126565b5b6020026020010151815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906141c7565b60405180910390fd5b60011515600660008584815181106109ec576109eb614126565b5b6020026020010151815260200190815260200160002060050160009054906101000a900460ff16151514610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90614233565b60405180910390fd5b60055460066000858481518110610a6f57610a6e614126565b5b6020026020010151815260200190815260200160002060030154610a939190613fc9565b60066000858481518110610aaa57610aa9614126565b5b6020026020010151815260200190815260200160002060020154610ace91906140be565b421015610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b079061429f565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd303360066000888781518110610b6757610b66614126565b5b60200260200101518152602001908152602001600020600001546040518463ffffffff1660e01b8152600401610b9f939291906142bf565b600060405180830381600087803b158015610bb957600080fd5b505af1158015610bcd573d6000803e3d6000fd5b505050506001600060066000868581518110610bec57610beb614126565b5b6020026020010151815260200190815260200160002060030154815260200190815260200160002060066000858481518110610c2b57610c2a614126565b5b60200260200101518152602001908152602001600020600401604051610c51919061438e565b90815260200160405180910390205482610c6b91906140be565b9150600060066000858481518110610c8657610c85614126565b5b6020026020010151815260200190815260200160002060050160006101000a81548160ff02191690831515021790555060066000848381518110610ccd57610ccc614126565b5b602002602001015181526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055600482016000610d33919061326b565b6005820160006101000a81549060ff021916905550508080610d54906143a5565b91505061090a565b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630325e7ca33836040518363ffffffff1660e01b8152600401610dba9291906143ed565b600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b505050508151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e3c91906140f2565b925050819055508060086000828254610e5591906140be565b9250508190555080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eab91906140be565b925050819055505050565b6002818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000805b8251811015611229573373ffffffffffffffffffffffffffffffffffffffff1660066000858481518110610f1f57610f1e614126565b5b6020026020010151815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa6906141c7565b60405180910390fd5b6001151560066000858481518110610fca57610fc9614126565b5b6020026020010151815260200190815260200160002060050160009054906101000a900460ff16151514611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a90614233565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30336006600088878151811061108a57611089614126565b5b60200260200101518152602001908152602001600020600001546040518463ffffffff1660e01b81526004016110c2939291906142bf565b600060405180830381600087803b1580156110dc57600080fd5b505af11580156110f0573d6000803e3d6000fd5b5050505061112d6006600085848151811061110e5761110d614126565b5b60200260200101518152602001908152602001600020600001546105ee565b8261113891906140be565b915060006006600085848151811061115357611152614126565b5b6020026020010151815260200190815260200160002060050160006101000a81548160ff0219169083151502179055506006600084838151811061119a57611199614126565b5b602002602001015181526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055600482016000611200919061326b565b6005820160006101000a81549060ff021916905550508080611221906143a5565b915050610ee8565b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630325e7ca33600284611276919061408d565b6040518363ffffffff1660e01b81526004016112939291906143ed565b600060405180830381600087803b1580156112ad57600080fd5b505af11580156112c1573d6000803e3d6000fd5b505050508151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461131591906140f2565b92505081905550600281611329919061408d565b6008600082825461133a91906140be565b9250508190555060028161134e919061408d565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139c91906140be565b925050819055505050565b6113af612f9c565b73ffffffffffffffffffffffffffffffffffffffff166113cd611baa565b73ffffffffffffffffffffffffffffffffffffffff1614611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a90613eae565b60405180910390fd5b60018314806114325750600383145b8061143d5750600683145b806114485750600c83145b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e90614462565b60405180910390fd5b8060016000858152602001908152602001600020836040516114a99190614047565b908152602001604051809103902081905550505050565b6114c8612f9c565b73ffffffffffffffffffffffffffffffffffffffff166114e6611baa565b73ffffffffffffffffffffffffffffffffffffffff161461153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390613eae565b60405180910390fd5b6115466000612fa4565b565b60055481565b6000600660008381526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820180546115f290613efd565b80601f016020809104026020016040519081016040528092919081815260200182805461161e90613efd565b801561166b5780601f106116405761010080835404028352916020019161166b565b820191906000526020600020905b81548152906001019060200180831161164e57829003601f168201915b505050505081526020016005820160009054906101000a900460ff16151515158152505090503373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906141c7565b60405180910390fd5b600115158160a0015115151461174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590614233565b60405180910390fd5b60055481606001516117609190613fc9565b816040015161176f91906140be565b4210156117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a89061429f565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630325e7ca33600160008560600151815260200190815260200160002084608001516040516118199190614047565b9081526020016040518091039020546040518363ffffffff1660e01b81526004016118459291906143ed565b600060405180830381600087803b15801561185f57600080fd5b505af1158015611873573d6000803e3d6000fd5b50505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b81526004016118d6939291906142bf565b600060405180830381600087803b1580156118f057600080fd5b505af1158015611904573d6000803e3d6000fd5b505050506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461195891906140f2565b92505081905550600660008381526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905560038201600090556004820160006119c2919061326b565b6005820160006101000a81549060ff0219169055505060016000826060015181526020019081526020016000208160800151604051611a019190614047565b90815260200160405180910390205460086000828254611a2191906140be565b9250508190555060016000826060015181526020019081526020016000208160800151604051611a519190614047565b908152602001604051809103902054600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aae91906140be565b925050819055505050565b60066020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002015490806003015490806004018054611b1490613efd565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4090613efd565b8015611b8d5780601f10611b6257610100808354040283529160200191611b8d565b820191906000526020600020905b815481529060010190602001808311611b7057829003601f168201915b5050505050908060050160009054906101000a900460ff16905086565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c309190613451565b602060405180830381865afa158015611c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c719190614497565b905090565b6060600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c306040518263ffffffff1660e01b8152600401611cd39190613451565b600060405180830381865afa158015611cf0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611d19919061455b565b905090565b60606000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205467ffffffffffffffff811115611d7b57611d7a613482565b5b604051908082528060200260200182016040528015611da95781602001602082028036833780820191505090505b509050600080600190505b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214611ea3578473ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611e905780838380611e70906143a5565b945081518110611e8357611e82614126565b5b6020026020010181815250505b8080611e9b906143a5565b915050611db4565b508192505050919050565b600160205281600052604060002081805160208101820180518482526020830160208501208183528095505050505050600091509150505481565b611ef1612f9c565b73ffffffffffffffffffffffffffffffffffffffff16611f0f611baa565b73ffffffffffffffffffffffffffffffffffffffff1614611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90613eae565b60405180910390fd5b6040518060400160405280600581526020017f42617369630000000000000000000000000000000000000000000000000000008152508051906020012082805190602001201480611ff857506040518060400160405280600881526020017f4f7264696e617279000000000000000000000000000000000000000000000000815250805190602001208280519060200120145b8061204557506040518060400160405280600d81526020017f45787472614f7264696e61727900000000000000000000000000000000000000815250805190602001208280519060200120145b8061209257506040518060400160405280600981526020017f4c6567656e646172790000000000000000000000000000000000000000000000815250805190602001208280519060200120145b806120df57506040518060400160405280600481526020017f5261726500000000000000000000000000000000000000000000000000000000815250805190602001208280519060200120145b8061212c57506040518060400160405280600981526020017f5375706572526172650000000000000000000000000000000000000000000000815250805190602001208280519060200120145b61216b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612162906145f0565b60405180910390fd5b8060028360405161217c9190614047565b9081526020016040518091039020819055505050565b60005b8551811015612adf5760018382815181106121b3576121b2614126565b5b602002602001015114806121e1575060038382815181106121d7576121d6614126565b5b6020026020010151145b80612206575060068382815181106121fc576121fb614126565b5b6020026020010151145b8061222b5750600c83828151811061222157612220614126565b5b6020026020010151145b61226a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226190614462565b60405180910390fd5b6040518060400160405280600581526020017f4261736963000000000000000000000000000000000000000000000000000000815250805190602001208282815181106122ba576122b9614126565b5b602002602001015180519060200120148061233157506040518060400160405280600881526020017f4f7264696e617279000000000000000000000000000000000000000000000000815250805190602001208282815181106123205761231f614126565b5b602002602001015180519060200120145b8061239857506040518060400160405280600d81526020017f45787472614f7264696e617279000000000000000000000000000000000000008152508051906020012082828151811061238757612386614126565b5b602002602001015180519060200120145b806123ff57506040518060400160405280600981526020017f4c6567656e646172790000000000000000000000000000000000000000000000815250805190602001208282815181106123ee576123ed614126565b5b602002602001015180519060200120145b8061246657506040518060400160405280600481526020017f52617265000000000000000000000000000000000000000000000000000000008152508051906020012082828151811061245557612454614126565b5b602002602001015180519060200120145b806124cd57506040518060400160405280600981526020017f5375706572526172650000000000000000000000000000000000000000000000815250805190602001208282815181106124bc576124bb614126565b5b602002602001015180519060200120145b61250c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612503906145f0565b60405180910390fd5b600061253187838151811061252457612523614126565b5b6020026020010151613068565b905061260086868481811061254957612548614126565b5b905060200281019061255b919061461f565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060028585815181106125b0576125af614126565b5b60200260200101516040516125c59190614047565b908152602001604051809103902054836040516020016125e59190614047565b604051602081830303815290604052805190602001206131c8565b61263f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612636906146ce565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8985815181106126a7576126a6614126565b5b60200260200101516040518263ffffffff1660e01b81526004016126cb91906133ce565b602060405180830381865afa1580156126e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270c9190614703565b73ffffffffffffffffffffffffffffffffffffffff1614612762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612759906147a2565b60405180910390fd5b600015156006600089858151811061277d5761277c614126565b5b6020026020010151815260200190815260200160002060050160009054906101000a900460ff161515146127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd9061480e565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a868151811061283957612838614126565b5b60200260200101516040518463ffffffff1660e01b815260040161285f939291906142bf565b600060405180830381600087803b15801561287957600080fd5b505af115801561288d573d6000803e3d6000fd5b505050508682815181106128a4576128a3614126565b5b6020026020010151600660008985815181106128c3576128c2614126565b5b602002602001015181526020019081526020016000206000018190555033600660008985815181106128f8576128f7614126565b5b6020026020010151815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600089858151811061296757612966614126565b5b602002602001015181526020019081526020016000206002018190555083828151811061299757612996614126565b5b6020026020010151600660008985815181106129b6576129b5614126565b5b60200260200101518152602001908152602001600020600301819055508282815181106129e6576129e5614126565b5b602002602001015160066000898581518110612a0557612a04614126565b5b602002602001015181526020019081526020016000206004019081612a2a91906149c5565b50600160066000898581518110612a4457612a43614126565b5b6020026020010151815260200190815260200160002060050160006101000a81548160ff0219169083151502179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac491906140be565b92505081905550508080612ad7906143a5565b915050612195565b505050505050565b612aef612f9c565b73ffffffffffffffffffffffffffffffffffffffff16612b0d611baa565b73ffffffffffffffffffffffffffffffffffffffff1614612b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5a90613eae565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612baf612f9c565b73ffffffffffffffffffffffffffffffffffffffff16612bcd611baa565b73ffffffffffffffffffffffffffffffffffffffff1614612c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1a90613eae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8990614b09565b60405180910390fd5b612c9b81612fa4565b50565b60606000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205467ffffffffffffffff811115612cfb57612cfa613482565b5b604051908082528060200260200182016040528015612d3457816020015b612d216132ab565b815260200190600190039081612d195790505b509050600080600190505b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214612f6b578473ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612f5857600660008281526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482018054612e9090613efd565b80601f0160208091040260200160405190810160405280929190818152602001828054612ebc90613efd565b8015612f095780601f10612ede57610100808354040283529160200191612f09565b820191906000526020600020905b815481529060010190602001808311612eec57829003601f168201915b505050505081526020016005820160009054906101000a900460ff161515151581525050838380612f39906143a5565b945081518110612f4c57612f4b614126565b5b60200260200101819052505b8080612f63906143a5565b915050612d3f565b508192505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600082036130af576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131c3565b600082905060005b600082146130e15780806130ca906143a5565b915050600a826130da919061408d565b91506130b7565b60008167ffffffffffffffff8111156130fd576130fc613482565b5b6040519080825280601f01601f19166020018201604052801561312f5781602001600182028036833780820191505090505b5090505b600085146131bc5760018261314891906140f2565b9150600a856131579190614b29565b603061316391906140be565b60f81b81838151811061317957613178614126565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131b5919061408d565b9450613133565b8093505050505b919050565b6000826131d585846131df565b1490509392505050565b60008082905060005b845181101561324957600085828151811061320657613205614126565b5b60200260200101519050808311613228576132218382613254565b9250613235565b6132328184613254565b92505b508080613241906143a5565b9150506131e8565b508091505092915050565b600082600052816020526040600020905092915050565b50805461327790613efd565b6000825580601f1061328957506132a8565b601f0160209004906000526020600020908101906132a791906132f9565b5b50565b6040518060c0016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081526020016000151581525090565b5b808211156133125760008160009055506001016132fa565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133558261332a565b9050919050565b6133658161334a565b811461337057600080fd5b50565b6000813590506133828161335c565b92915050565b60006020828403121561339e5761339d613320565b5b60006133ac84828501613373565b91505092915050565b6000819050919050565b6133c8816133b5565b82525050565b60006020820190506133e360008301846133bf565b92915050565b6133f2816133b5565b81146133fd57600080fd5b50565b60008135905061340f816133e9565b92915050565b60006020828403121561342b5761342a613320565b5b600061343984828501613400565b91505092915050565b61344b8161334a565b82525050565b60006020820190506134666000830184613442565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134ba82613471565b810181811067ffffffffffffffff821117156134d9576134d8613482565b5b80604052505050565b60006134ec613316565b90506134f882826134b1565b919050565b600067ffffffffffffffff82111561351857613517613482565b5b602082029050602081019050919050565b600080fd5b600061354161353c846134fd565b6134e2565b9050808382526020820190506020840283018581111561356457613563613529565b5b835b8181101561358d57806135798882613400565b845260208401935050602081019050613566565b5050509392505050565b600082601f8301126135ac576135ab61346c565b5b81356135bc84826020860161352e565b91505092915050565b6000602082840312156135db576135da613320565b5b600082013567ffffffffffffffff8111156135f9576135f8613325565b5b61360584828501613597565b91505092915050565b600080fd5b600067ffffffffffffffff82111561362e5761362d613482565b5b61363782613471565b9050602081019050919050565b82818337600083830152505050565b600061366661366184613613565b6134e2565b9050828152602081018484840111156136825761368161360e565b5b61368d848285613644565b509392505050565b600082601f8301126136aa576136a961346c565b5b81356136ba848260208601613653565b91505092915050565b6000602082840312156136d9576136d8613320565b5b600082013567ffffffffffffffff8111156136f7576136f6613325565b5b61370384828501613695565b91505092915050565b6000819050919050565b61371f8161370c565b82525050565b600060208201905061373a6000830184613716565b92915050565b60008060006060848603121561375957613758613320565b5b600061376786828701613400565b935050602084013567ffffffffffffffff81111561378857613787613325565b5b61379486828701613695565b92505060406137a586828701613400565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b838110156137e95780820151818401526020810190506137ce565b60008484015250505050565b6000613800826137af565b61380a81856137ba565b935061381a8185602086016137cb565b61382381613471565b840191505092915050565b60008115159050919050565b6138438161382e565b82525050565b600060c08201905061385e60008301896133bf565b61386b6020830188613442565b61387860408301876133bf565b61388560608301866133bf565b818103608083015261389781856137f5565b90506138a660a083018461383a565b979650505050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138e6816133b5565b82525050565b60006138f883836138dd565b60208301905092915050565b6000602082019050919050565b600061391c826138b1565b61392681856138bc565b9350613931836138cd565b8060005b8381101561396257815161394988826138ec565b975061395483613904565b925050600181019050613935565b5085935050505092915050565b600060208201905081810360008301526139898184613911565b905092915050565b600080604083850312156139a8576139a7613320565b5b60006139b685828601613400565b925050602083013567ffffffffffffffff8111156139d7576139d6613325565b5b6139e385828601613695565b9150509250929050565b6139f68161370c565b8114613a0157600080fd5b50565b600081359050613a13816139ed565b92915050565b60008060408385031215613a3057613a2f613320565b5b600083013567ffffffffffffffff811115613a4e57613a4d613325565b5b613a5a85828601613695565b9250506020613a6b85828601613a04565b9150509250929050565b600080fd5b60008083601f840112613a9057613a8f61346c565b5b8235905067ffffffffffffffff811115613aad57613aac613a75565b5b602083019150836020820283011115613ac957613ac8613529565b5b9250929050565b600067ffffffffffffffff821115613aeb57613aea613482565b5b602082029050602081019050919050565b6000613b0f613b0a84613ad0565b6134e2565b90508083825260208201905060208402830185811115613b3257613b31613529565b5b835b81811015613b7957803567ffffffffffffffff811115613b5757613b5661346c565b5b808601613b648982613695565b85526020850194505050602081019050613b34565b5050509392505050565b600082601f830112613b9857613b9761346c565b5b8135613ba8848260208601613afc565b91505092915050565b600080600080600060808688031215613bcd57613bcc613320565b5b600086013567ffffffffffffffff811115613beb57613bea613325565b5b613bf788828901613597565b955050602086013567ffffffffffffffff811115613c1857613c17613325565b5b613c2488828901613a7a565b9450945050604086013567ffffffffffffffff811115613c4757613c46613325565b5b613c5388828901613597565b925050606086013567ffffffffffffffff811115613c7457613c73613325565b5b613c8088828901613b83565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613cc28161334a565b82525050565b600082825260208201905092915050565b6000613ce4826137af565b613cee8185613cc8565b9350613cfe8185602086016137cb565b613d0781613471565b840191505092915050565b613d1b8161382e565b82525050565b600060c083016000830151613d3960008601826138dd565b506020830151613d4c6020860182613cb9565b506040830151613d5f60408601826138dd565b506060830151613d7260608601826138dd565b5060808301518482036080860152613d8a8282613cd9565b91505060a0830151613d9f60a0860182613d12565b508091505092915050565b6000613db68383613d21565b905092915050565b6000602082019050919050565b6000613dd682613c8d565b613de08185613c98565b935083602082028501613df285613ca9565b8060005b85811015613e2e5784840389528151613e0f8582613daa565b9450613e1a83613dbe565b925060208a01995050600181019050613df6565b50829750879550505050505092915050565b60006020820190508181036000830152613e5a8184613dcb565b905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e986020836137ba565b9150613ea382613e62565b602082019050919050565b60006020820190508181036000830152613ec781613e8b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f1557607f821691505b602082108103613f2857613f27613ece565b5b50919050565b7f546f6b656e206e6f74207374616b656400000000000000000000000000000000600082015250565b6000613f646010836137ba565b9150613f6f82613f2e565b602082019050919050565b60006020820190508181036000830152613f9381613f57565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fd4826133b5565b9150613fdf836133b5565b9250828202613fed816133b5565b9150828204841483151761400457614003613f9a565b5b5092915050565b600081905092915050565b6000614021826137af565b61402b818561400b565b935061403b8185602086016137cb565b80840191505092915050565b60006140538284614016565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614098826133b5565b91506140a3836133b5565b9250826140b3576140b261405e565b5b828204905092915050565b60006140c9826133b5565b91506140d4836133b5565b92508282019050808211156140ec576140eb613f9a565b5b92915050565b60006140fd826133b5565b9150614108836133b5565b92508282039050818111156141205761411f613f9a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c696421206164647265737320646f6573206e6f74206d617463682060008201527f7573657221000000000000000000000000000000000000000000000000000000602082015250565b60006141b16025836137ba565b91506141bc82614155565b604082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f4944206973206e6f74205374616b656421000000000000000000000000000000600082015250565b600061421d6011836137ba565b9150614228826141e7565b602082019050919050565b6000602082019050818103600083015261424c81614210565b9050919050565b7f5374616b696e67206475726174696f6e20696e636f6d706c6574652100000000600082015250565b6000614289601c836137ba565b915061429482614253565b602082019050919050565b600060208201905081810360008301526142b88161427c565b9050919050565b60006060820190506142d46000830186613442565b6142e16020830185613442565b6142ee60408301846133bf565b949350505050565b60008190508160005260206000209050919050565b6000815461431881613efd565b614322818661400b565b9450600182166000811461433d576001811461435257614385565b60ff1983168652811515820286019350614385565b61435b856142f6565b60005b8381101561437d5781548189015260018201915060208101905061435e565b838801955050505b50505092915050565b600061439a828461430b565b915081905092915050565b60006143b0826133b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143e2576143e1613f9a565b5b600182019050919050565b60006040820190506144026000830185613442565b61440f60208301846133bf565b9392505050565b7f496e76616c6964206d6f6e74687320676976656e2e0000000000000000000000600082015250565b600061444c6015836137ba565b915061445782614416565b602082019050919050565b6000602082019050818103600083015261447b8161443f565b9050919050565b600081519050614491816133e9565b92915050565b6000602082840312156144ad576144ac613320565b5b60006144bb84828501614482565b91505092915050565b60006144d76144d2846134fd565b6134e2565b905080838252602082019050602084028301858111156144fa576144f9613529565b5b835b81811015614523578061450f8882614482565b8452602084019350506020810190506144fc565b5050509392505050565b600082601f8301126145425761454161346c565b5b81516145528482602086016144c4565b91505092915050565b60006020828403121561457157614570613320565b5b600082015167ffffffffffffffff81111561458f5761458e613325565b5b61459b8482850161452d565b91505092915050565b7f496e76616c6964206c6576656c20676976656e2e000000000000000000000000600082015250565b60006145da6014836137ba565b91506145e5826145a4565b602082019050919050565b60006020820190508181036000830152614609816145cd565b9050919050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261463c5761463b614610565b5b80840192508235915067ffffffffffffffff82111561465e5761465d614615565b5b60208301925060208202360383131561467a5761467961461a565b5b509250929050565b7f496e76616c6964206c6576656c20666f72204964212100000000000000000000600082015250565b60006146b86016836137ba565b91506146c382614682565b602082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b6000815190506146fd8161335c565b92915050565b60006020828403121561471957614718613320565b5b6000614727848285016146ee565b91505092915050565b7f496e76616c696421206964206e6f7420666f756e6420696e207573657220776160008201527f6c6c657421000000000000000000000000000000000000000000000000000000602082015250565b600061478c6025836137ba565b915061479782614730565b604082019050919050565b600060208201905081810360008301526147bb8161477f565b9050919050565b7f494420697320616c72616479205374616b656421000000000000000000000000600082015250565b60006147f86014836137ba565b9150614803826147c2565b602082019050919050565b60006020820190508181036000830152614827816147eb565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261487b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261483e565b614885868361483e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006148c26148bd6148b8846133b5565b61489d565b6133b5565b9050919050565b6000819050919050565b6148dc836148a7565b6148f06148e8826148c9565b84845461484b565b825550505050565b600090565b6149056148f8565b6149108184846148d3565b505050565b5b81811015614934576149296000826148fd565b600181019050614916565b5050565b601f8211156149795761494a816142f6565b6149538461482e565b81016020851015614962578190505b61497661496e8561482e565b830182614915565b50505b505050565b600082821c905092915050565b600061499c6000198460080261497e565b1980831691505092915050565b60006149b5838361498b565b9150826002028217905092915050565b6149ce826137af565b67ffffffffffffffff8111156149e7576149e6613482565b5b6149f18254613efd565b6149fc828285614938565b600060209050601f831160018114614a2f5760008415614a1d578287015190505b614a2785826149a9565b865550614a8f565b601f198416614a3d866142f6565b60005b82811015614a6557848901518255600182019150602085019450602081019050614a40565b86831015614a825784890151614a7e601f89168261498b565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614af36026836137ba565b9150614afe82614a97565b604082019050919050565b60006020820190508181036000830152614b2281614ae6565b9050919050565b6000614b34826133b5565b9150614b3f836133b5565b925082614b4f57614b4e61405e565b5b82820690509291505056fea2646970667358221220aa31b668d959e39e84b757982ee7822af8af2648ea32df11f25b99c9453ee45164736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80638abb76fd116100de578063a1f910ee11610097578063e8f9c1e011610071578063e8f9c1e014610486578063f2fde38b146104a2578063f4333e5c146104be578063ff72d7cc146104ee5761018e565b8063a1f910ee1461041e578063b7aafa871461044e578063bdeb07491461046a5761018e565b80638abb76fd146103435780638b9ad0c41461035f5780638da5cb5b1461039457806392504bfa146103b2578063932e8b0d146103d057806398b1f636146103ee5761018e565b80634210cd891161014b57806361d3df1c1161012557806361d3df1c146102e35780636291202a146102ff578063715018a61461031b578063721d3b24146103255761018e565b80634210cd891461027b57806354bc7a13146102975780635e3a4f45146102b35761018e565b806306f9a197146101935780630c6f815d146101c357806310ce3e68146101df578063163f8533146101fd5780631c7baa2b1461022d57806332dacda01461024b575b600080fd5b6101ad60048036038101906101a89190613388565b61050c565b6040516101ba91906133ce565b60405180910390f35b6101dd60048036038101906101d89190613415565b610524565b005b6101e76105aa565b6040516101f49190613451565b60405180910390f35b61021760048036038101906102129190613388565b6105d0565b60405161022491906133ce565b60405180910390f35b6102356105e8565b60405161024291906133ce565b60405180910390f35b61026560048036038101906102609190613415565b6105ee565b60405161027291906133ce565b60405180910390f35b61029560048036038101906102909190613388565b610846565b005b6102b160048036038101906102ac91906135c5565b610906565b005b6102cd60048036038101906102c891906136c3565b610eb6565b6040516102da9190613725565b60405180910390f35b6102fd60048036038101906102f891906135c5565b610ee4565b005b61031960048036038101906103149190613740565b6113a7565b005b6103236114c0565b005b61032d611548565b60405161033a91906133ce565b60405180910390f35b61035d60048036038101906103589190613415565b61154e565b005b61037960048036038101906103749190613415565b611ab9565b60405161038b96959493929190613849565b60405180910390f35b61039c611baa565b6040516103a99190613451565b60405180910390f35b6103ba611bd3565b6040516103c791906133ce565b60405180910390f35b6103d8611c76565b6040516103e5919061396f565b60405180910390f35b61040860048036038101906104039190613388565b611d1e565b604051610415919061396f565b60405180910390f35b61043860048036038101906104339190613991565b611eae565b60405161044591906133ce565b60405180910390f35b61046860048036038101906104639190613a19565b611ee9565b005b610484600480360381019061047f9190613bb1565b612192565b005b6104a0600480360381019061049b9190613388565b612ae7565b005b6104bc60048036038101906104b79190613388565b612ba7565b005b6104d860048036038101906104d39190613388565b612c9e565b6040516104e59190613e40565b60405180910390f35b6104f6612f76565b6040516105039190613451565b60405180910390f35b60096020528060005260406000206000915090505481565b61052c612f9c565b73ffffffffffffffffffffffffffffffffffffffff1661054a611baa565b73ffffffffffffffffffffffffffffffffffffffff16146105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790613eae565b60405180910390fd5b8060058190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090505481565b60085481565b600080600660008481526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201805461069390613efd565b80601f01602080910402602001604051908101604052809291908181526020018280546106bf90613efd565b801561070c5780601f106106e15761010080835404028352916020019161070c565b820191906000526020600020905b8154815290600101906020018083116106ef57829003601f168201915b505050505081526020016005820160009054906101000a900460ff16151515158152505090508060a00151610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076d90613f7a565b60405180910390fd5b6000600554826060015161078a9190613fc9565b600160008460600151815260200190815260200160002083608001516040516107b39190614047565b9081526020016040518091039020546107cc919061408d565b9050600060055483606001516107e29190613fc9565b83604001516107f191906140be565b421061081d5760055483606001516108099190613fc9565b836040015161081891906140be565b61081f565b425b905082604001518161083191906140f2565b8261083c9190613fc9565b9350505050919050565b61084e612f9c565b73ffffffffffffffffffffffffffffffffffffffff1661086c611baa565b73ffffffffffffffffffffffffffffffffffffffff16146108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b990613eae565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000805b8251811015610d5c573373ffffffffffffffffffffffffffffffffffffffff166006600085848151811061094157610940614126565b5b6020026020010151815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906141c7565b60405180910390fd5b60011515600660008584815181106109ec576109eb614126565b5b6020026020010151815260200190815260200160002060050160009054906101000a900460ff16151514610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90614233565b60405180910390fd5b60055460066000858481518110610a6f57610a6e614126565b5b6020026020010151815260200190815260200160002060030154610a939190613fc9565b60066000858481518110610aaa57610aa9614126565b5b6020026020010151815260200190815260200160002060020154610ace91906140be565b421015610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b079061429f565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd303360066000888781518110610b6757610b66614126565b5b60200260200101518152602001908152602001600020600001546040518463ffffffff1660e01b8152600401610b9f939291906142bf565b600060405180830381600087803b158015610bb957600080fd5b505af1158015610bcd573d6000803e3d6000fd5b505050506001600060066000868581518110610bec57610beb614126565b5b6020026020010151815260200190815260200160002060030154815260200190815260200160002060066000858481518110610c2b57610c2a614126565b5b60200260200101518152602001908152602001600020600401604051610c51919061438e565b90815260200160405180910390205482610c6b91906140be565b9150600060066000858481518110610c8657610c85614126565b5b6020026020010151815260200190815260200160002060050160006101000a81548160ff02191690831515021790555060066000848381518110610ccd57610ccc614126565b5b602002602001015181526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055600482016000610d33919061326b565b6005820160006101000a81549060ff021916905550508080610d54906143a5565b91505061090a565b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630325e7ca33836040518363ffffffff1660e01b8152600401610dba9291906143ed565b600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b505050508151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e3c91906140f2565b925050819055508060086000828254610e5591906140be565b9250508190555080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eab91906140be565b925050819055505050565b6002818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000805b8251811015611229573373ffffffffffffffffffffffffffffffffffffffff1660066000858481518110610f1f57610f1e614126565b5b6020026020010151815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa6906141c7565b60405180910390fd5b6001151560066000858481518110610fca57610fc9614126565b5b6020026020010151815260200190815260200160002060050160009054906101000a900460ff16151514611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a90614233565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30336006600088878151811061108a57611089614126565b5b60200260200101518152602001908152602001600020600001546040518463ffffffff1660e01b81526004016110c2939291906142bf565b600060405180830381600087803b1580156110dc57600080fd5b505af11580156110f0573d6000803e3d6000fd5b5050505061112d6006600085848151811061110e5761110d614126565b5b60200260200101518152602001908152602001600020600001546105ee565b8261113891906140be565b915060006006600085848151811061115357611152614126565b5b6020026020010151815260200190815260200160002060050160006101000a81548160ff0219169083151502179055506006600084838151811061119a57611199614126565b5b602002602001015181526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160009055600482016000611200919061326b565b6005820160006101000a81549060ff021916905550508080611221906143a5565b915050610ee8565b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630325e7ca33600284611276919061408d565b6040518363ffffffff1660e01b81526004016112939291906143ed565b600060405180830381600087803b1580156112ad57600080fd5b505af11580156112c1573d6000803e3d6000fd5b505050508151600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461131591906140f2565b92505081905550600281611329919061408d565b6008600082825461133a91906140be565b9250508190555060028161134e919061408d565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139c91906140be565b925050819055505050565b6113af612f9c565b73ffffffffffffffffffffffffffffffffffffffff166113cd611baa565b73ffffffffffffffffffffffffffffffffffffffff1614611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a90613eae565b60405180910390fd5b60018314806114325750600383145b8061143d5750600683145b806114485750600c83145b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e90614462565b60405180910390fd5b8060016000858152602001908152602001600020836040516114a99190614047565b908152602001604051809103902081905550505050565b6114c8612f9c565b73ffffffffffffffffffffffffffffffffffffffff166114e6611baa565b73ffffffffffffffffffffffffffffffffffffffff161461153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390613eae565b60405180910390fd5b6115466000612fa4565b565b60055481565b6000600660008381526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820180546115f290613efd565b80601f016020809104026020016040519081016040528092919081815260200182805461161e90613efd565b801561166b5780601f106116405761010080835404028352916020019161166b565b820191906000526020600020905b81548152906001019060200180831161164e57829003601f168201915b505050505081526020016005820160009054906101000a900460ff16151515158152505090503373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906141c7565b60405180910390fd5b600115158160a0015115151461174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590614233565b60405180910390fd5b60055481606001516117609190613fc9565b816040015161176f91906140be565b4210156117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a89061429f565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630325e7ca33600160008560600151815260200190815260200160002084608001516040516118199190614047565b9081526020016040518091039020546040518363ffffffff1660e01b81526004016118459291906143ed565b600060405180830381600087803b15801561185f57600080fd5b505af1158015611873573d6000803e3d6000fd5b50505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b81526004016118d6939291906142bf565b600060405180830381600087803b1580156118f057600080fd5b505af1158015611904573d6000803e3d6000fd5b505050506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461195891906140f2565b92505081905550600660008381526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282016000905560038201600090556004820160006119c2919061326b565b6005820160006101000a81549060ff0219169055505060016000826060015181526020019081526020016000208160800151604051611a019190614047565b90815260200160405180910390205460086000828254611a2191906140be565b9250508190555060016000826060015181526020019081526020016000208160800151604051611a519190614047565b908152602001604051809103902054600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aae91906140be565b925050819055505050565b60066020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002015490806003015490806004018054611b1490613efd565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4090613efd565b8015611b8d5780601f10611b6257610100808354040283529160200191611b8d565b820191906000526020600020905b815481529060010190602001808311611b7057829003601f168201915b5050505050908060050160009054906101000a900460ff16905086565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c309190613451565b602060405180830381865afa158015611c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c719190614497565b905090565b6060600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638462151c306040518263ffffffff1660e01b8152600401611cd39190613451565b600060405180830381865afa158015611cf0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611d19919061455b565b905090565b60606000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205467ffffffffffffffff811115611d7b57611d7a613482565b5b604051908082528060200260200182016040528015611da95781602001602082028036833780820191505090505b509050600080600190505b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214611ea3578473ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611e905780838380611e70906143a5565b945081518110611e8357611e82614126565b5b6020026020010181815250505b8080611e9b906143a5565b915050611db4565b508192505050919050565b600160205281600052604060002081805160208101820180518482526020830160208501208183528095505050505050600091509150505481565b611ef1612f9c565b73ffffffffffffffffffffffffffffffffffffffff16611f0f611baa565b73ffffffffffffffffffffffffffffffffffffffff1614611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90613eae565b60405180910390fd5b6040518060400160405280600581526020017f42617369630000000000000000000000000000000000000000000000000000008152508051906020012082805190602001201480611ff857506040518060400160405280600881526020017f4f7264696e617279000000000000000000000000000000000000000000000000815250805190602001208280519060200120145b8061204557506040518060400160405280600d81526020017f45787472614f7264696e61727900000000000000000000000000000000000000815250805190602001208280519060200120145b8061209257506040518060400160405280600981526020017f4c6567656e646172790000000000000000000000000000000000000000000000815250805190602001208280519060200120145b806120df57506040518060400160405280600481526020017f5261726500000000000000000000000000000000000000000000000000000000815250805190602001208280519060200120145b8061212c57506040518060400160405280600981526020017f5375706572526172650000000000000000000000000000000000000000000000815250805190602001208280519060200120145b61216b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612162906145f0565b60405180910390fd5b8060028360405161217c9190614047565b9081526020016040518091039020819055505050565b60005b8551811015612adf5760018382815181106121b3576121b2614126565b5b602002602001015114806121e1575060038382815181106121d7576121d6614126565b5b6020026020010151145b80612206575060068382815181106121fc576121fb614126565b5b6020026020010151145b8061222b5750600c83828151811061222157612220614126565b5b6020026020010151145b61226a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226190614462565b60405180910390fd5b6040518060400160405280600581526020017f4261736963000000000000000000000000000000000000000000000000000000815250805190602001208282815181106122ba576122b9614126565b5b602002602001015180519060200120148061233157506040518060400160405280600881526020017f4f7264696e617279000000000000000000000000000000000000000000000000815250805190602001208282815181106123205761231f614126565b5b602002602001015180519060200120145b8061239857506040518060400160405280600d81526020017f45787472614f7264696e617279000000000000000000000000000000000000008152508051906020012082828151811061238757612386614126565b5b602002602001015180519060200120145b806123ff57506040518060400160405280600981526020017f4c6567656e646172790000000000000000000000000000000000000000000000815250805190602001208282815181106123ee576123ed614126565b5b602002602001015180519060200120145b8061246657506040518060400160405280600481526020017f52617265000000000000000000000000000000000000000000000000000000008152508051906020012082828151811061245557612454614126565b5b602002602001015180519060200120145b806124cd57506040518060400160405280600981526020017f5375706572526172650000000000000000000000000000000000000000000000815250805190602001208282815181106124bc576124bb614126565b5b602002602001015180519060200120145b61250c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612503906145f0565b60405180910390fd5b600061253187838151811061252457612523614126565b5b6020026020010151613068565b905061260086868481811061254957612548614126565b5b905060200281019061255b919061461f565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060028585815181106125b0576125af614126565b5b60200260200101516040516125c59190614047565b908152602001604051809103902054836040516020016125e59190614047565b604051602081830303815290604052805190602001206131c8565b61263f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612636906146ce565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8985815181106126a7576126a6614126565b5b60200260200101516040518263ffffffff1660e01b81526004016126cb91906133ce565b602060405180830381865afa1580156126e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270c9190614703565b73ffffffffffffffffffffffffffffffffffffffff1614612762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612759906147a2565b60405180910390fd5b600015156006600089858151811061277d5761277c614126565b5b6020026020010151815260200190815260200160002060050160009054906101000a900460ff161515146127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd9061480e565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a868151811061283957612838614126565b5b60200260200101516040518463ffffffff1660e01b815260040161285f939291906142bf565b600060405180830381600087803b15801561287957600080fd5b505af115801561288d573d6000803e3d6000fd5b505050508682815181106128a4576128a3614126565b5b6020026020010151600660008985815181106128c3576128c2614126565b5b602002602001015181526020019081526020016000206000018190555033600660008985815181106128f8576128f7614126565b5b6020026020010151815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600089858151811061296757612966614126565b5b602002602001015181526020019081526020016000206002018190555083828151811061299757612996614126565b5b6020026020010151600660008985815181106129b6576129b5614126565b5b60200260200101518152602001908152602001600020600301819055508282815181106129e6576129e5614126565b5b602002602001015160066000898581518110612a0557612a04614126565b5b602002602001015181526020019081526020016000206004019081612a2a91906149c5565b50600160066000898581518110612a4457612a43614126565b5b6020026020010151815260200190815260200160002060050160006101000a81548160ff0219169083151502179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac491906140be565b92505081905550508080612ad7906143a5565b915050612195565b505050505050565b612aef612f9c565b73ffffffffffffffffffffffffffffffffffffffff16612b0d611baa565b73ffffffffffffffffffffffffffffffffffffffff1614612b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5a90613eae565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612baf612f9c565b73ffffffffffffffffffffffffffffffffffffffff16612bcd611baa565b73ffffffffffffffffffffffffffffffffffffffff1614612c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1a90613eae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8990614b09565b60405180910390fd5b612c9b81612fa4565b50565b60606000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205467ffffffffffffffff811115612cfb57612cfa613482565b5b604051908082528060200260200182016040528015612d3457816020015b612d216132ab565b815260200190600190039081612d195790505b509050600080600190505b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214612f6b578473ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612f5857600660008281526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482018054612e9090613efd565b80601f0160208091040260200160405190810160405280929190818152602001828054612ebc90613efd565b8015612f095780601f10612ede57610100808354040283529160200191612f09565b820191906000526020600020905b815481529060010190602001808311612eec57829003601f168201915b505050505081526020016005820160009054906101000a900460ff161515151581525050838380612f39906143a5565b945081518110612f4c57612f4b614126565b5b60200260200101819052505b8080612f63906143a5565b915050612d3f565b508192505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600082036130af576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131c3565b600082905060005b600082146130e15780806130ca906143a5565b915050600a826130da919061408d565b91506130b7565b60008167ffffffffffffffff8111156130fd576130fc613482565b5b6040519080825280601f01601f19166020018201604052801561312f5781602001600182028036833780820191505090505b5090505b600085146131bc5760018261314891906140f2565b9150600a856131579190614b29565b603061316391906140be565b60f81b81838151811061317957613178614126565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131b5919061408d565b9450613133565b8093505050505b919050565b6000826131d585846131df565b1490509392505050565b60008082905060005b845181101561324957600085828151811061320657613205614126565b5b60200260200101519050808311613228576132218382613254565b9250613235565b6132328184613254565b92505b508080613241906143a5565b9150506131e8565b508091505092915050565b600082600052816020526040600020905092915050565b50805461327790613efd565b6000825580601f1061328957506132a8565b601f0160209004906000526020600020908101906132a791906132f9565b5b50565b6040518060c0016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081526020016000151581525090565b5b808211156133125760008160009055506001016132fa565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133558261332a565b9050919050565b6133658161334a565b811461337057600080fd5b50565b6000813590506133828161335c565b92915050565b60006020828403121561339e5761339d613320565b5b60006133ac84828501613373565b91505092915050565b6000819050919050565b6133c8816133b5565b82525050565b60006020820190506133e360008301846133bf565b92915050565b6133f2816133b5565b81146133fd57600080fd5b50565b60008135905061340f816133e9565b92915050565b60006020828403121561342b5761342a613320565b5b600061343984828501613400565b91505092915050565b61344b8161334a565b82525050565b60006020820190506134666000830184613442565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134ba82613471565b810181811067ffffffffffffffff821117156134d9576134d8613482565b5b80604052505050565b60006134ec613316565b90506134f882826134b1565b919050565b600067ffffffffffffffff82111561351857613517613482565b5b602082029050602081019050919050565b600080fd5b600061354161353c846134fd565b6134e2565b9050808382526020820190506020840283018581111561356457613563613529565b5b835b8181101561358d57806135798882613400565b845260208401935050602081019050613566565b5050509392505050565b600082601f8301126135ac576135ab61346c565b5b81356135bc84826020860161352e565b91505092915050565b6000602082840312156135db576135da613320565b5b600082013567ffffffffffffffff8111156135f9576135f8613325565b5b61360584828501613597565b91505092915050565b600080fd5b600067ffffffffffffffff82111561362e5761362d613482565b5b61363782613471565b9050602081019050919050565b82818337600083830152505050565b600061366661366184613613565b6134e2565b9050828152602081018484840111156136825761368161360e565b5b61368d848285613644565b509392505050565b600082601f8301126136aa576136a961346c565b5b81356136ba848260208601613653565b91505092915050565b6000602082840312156136d9576136d8613320565b5b600082013567ffffffffffffffff8111156136f7576136f6613325565b5b61370384828501613695565b91505092915050565b6000819050919050565b61371f8161370c565b82525050565b600060208201905061373a6000830184613716565b92915050565b60008060006060848603121561375957613758613320565b5b600061376786828701613400565b935050602084013567ffffffffffffffff81111561378857613787613325565b5b61379486828701613695565b92505060406137a586828701613400565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b838110156137e95780820151818401526020810190506137ce565b60008484015250505050565b6000613800826137af565b61380a81856137ba565b935061381a8185602086016137cb565b61382381613471565b840191505092915050565b60008115159050919050565b6138438161382e565b82525050565b600060c08201905061385e60008301896133bf565b61386b6020830188613442565b61387860408301876133bf565b61388560608301866133bf565b818103608083015261389781856137f5565b90506138a660a083018461383a565b979650505050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138e6816133b5565b82525050565b60006138f883836138dd565b60208301905092915050565b6000602082019050919050565b600061391c826138b1565b61392681856138bc565b9350613931836138cd565b8060005b8381101561396257815161394988826138ec565b975061395483613904565b925050600181019050613935565b5085935050505092915050565b600060208201905081810360008301526139898184613911565b905092915050565b600080604083850312156139a8576139a7613320565b5b60006139b685828601613400565b925050602083013567ffffffffffffffff8111156139d7576139d6613325565b5b6139e385828601613695565b9150509250929050565b6139f68161370c565b8114613a0157600080fd5b50565b600081359050613a13816139ed565b92915050565b60008060408385031215613a3057613a2f613320565b5b600083013567ffffffffffffffff811115613a4e57613a4d613325565b5b613a5a85828601613695565b9250506020613a6b85828601613a04565b9150509250929050565b600080fd5b60008083601f840112613a9057613a8f61346c565b5b8235905067ffffffffffffffff811115613aad57613aac613a75565b5b602083019150836020820283011115613ac957613ac8613529565b5b9250929050565b600067ffffffffffffffff821115613aeb57613aea613482565b5b602082029050602081019050919050565b6000613b0f613b0a84613ad0565b6134e2565b90508083825260208201905060208402830185811115613b3257613b31613529565b5b835b81811015613b7957803567ffffffffffffffff811115613b5757613b5661346c565b5b808601613b648982613695565b85526020850194505050602081019050613b34565b5050509392505050565b600082601f830112613b9857613b9761346c565b5b8135613ba8848260208601613afc565b91505092915050565b600080600080600060808688031215613bcd57613bcc613320565b5b600086013567ffffffffffffffff811115613beb57613bea613325565b5b613bf788828901613597565b955050602086013567ffffffffffffffff811115613c1857613c17613325565b5b613c2488828901613a7a565b9450945050604086013567ffffffffffffffff811115613c4757613c46613325565b5b613c5388828901613597565b925050606086013567ffffffffffffffff811115613c7457613c73613325565b5b613c8088828901613b83565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613cc28161334a565b82525050565b600082825260208201905092915050565b6000613ce4826137af565b613cee8185613cc8565b9350613cfe8185602086016137cb565b613d0781613471565b840191505092915050565b613d1b8161382e565b82525050565b600060c083016000830151613d3960008601826138dd565b506020830151613d4c6020860182613cb9565b506040830151613d5f60408601826138dd565b506060830151613d7260608601826138dd565b5060808301518482036080860152613d8a8282613cd9565b91505060a0830151613d9f60a0860182613d12565b508091505092915050565b6000613db68383613d21565b905092915050565b6000602082019050919050565b6000613dd682613c8d565b613de08185613c98565b935083602082028501613df285613ca9565b8060005b85811015613e2e5784840389528151613e0f8582613daa565b9450613e1a83613dbe565b925060208a01995050600181019050613df6565b50829750879550505050505092915050565b60006020820190508181036000830152613e5a8184613dcb565b905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e986020836137ba565b9150613ea382613e62565b602082019050919050565b60006020820190508181036000830152613ec781613e8b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f1557607f821691505b602082108103613f2857613f27613ece565b5b50919050565b7f546f6b656e206e6f74207374616b656400000000000000000000000000000000600082015250565b6000613f646010836137ba565b9150613f6f82613f2e565b602082019050919050565b60006020820190508181036000830152613f9381613f57565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fd4826133b5565b9150613fdf836133b5565b9250828202613fed816133b5565b9150828204841483151761400457614003613f9a565b5b5092915050565b600081905092915050565b6000614021826137af565b61402b818561400b565b935061403b8185602086016137cb565b80840191505092915050565b60006140538284614016565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614098826133b5565b91506140a3836133b5565b9250826140b3576140b261405e565b5b828204905092915050565b60006140c9826133b5565b91506140d4836133b5565b92508282019050808211156140ec576140eb613f9a565b5b92915050565b60006140fd826133b5565b9150614108836133b5565b92508282039050818111156141205761411f613f9a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c696421206164647265737320646f6573206e6f74206d617463682060008201527f7573657221000000000000000000000000000000000000000000000000000000602082015250565b60006141b16025836137ba565b91506141bc82614155565b604082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f4944206973206e6f74205374616b656421000000000000000000000000000000600082015250565b600061421d6011836137ba565b9150614228826141e7565b602082019050919050565b6000602082019050818103600083015261424c81614210565b9050919050565b7f5374616b696e67206475726174696f6e20696e636f6d706c6574652100000000600082015250565b6000614289601c836137ba565b915061429482614253565b602082019050919050565b600060208201905081810360008301526142b88161427c565b9050919050565b60006060820190506142d46000830186613442565b6142e16020830185613442565b6142ee60408301846133bf565b949350505050565b60008190508160005260206000209050919050565b6000815461431881613efd565b614322818661400b565b9450600182166000811461433d576001811461435257614385565b60ff1983168652811515820286019350614385565b61435b856142f6565b60005b8381101561437d5781548189015260018201915060208101905061435e565b838801955050505b50505092915050565b600061439a828461430b565b915081905092915050565b60006143b0826133b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143e2576143e1613f9a565b5b600182019050919050565b60006040820190506144026000830185613442565b61440f60208301846133bf565b9392505050565b7f496e76616c6964206d6f6e74687320676976656e2e0000000000000000000000600082015250565b600061444c6015836137ba565b915061445782614416565b602082019050919050565b6000602082019050818103600083015261447b8161443f565b9050919050565b600081519050614491816133e9565b92915050565b6000602082840312156144ad576144ac613320565b5b60006144bb84828501614482565b91505092915050565b60006144d76144d2846134fd565b6134e2565b905080838252602082019050602084028301858111156144fa576144f9613529565b5b835b81811015614523578061450f8882614482565b8452602084019350506020810190506144fc565b5050509392505050565b600082601f8301126145425761454161346c565b5b81516145528482602086016144c4565b91505092915050565b60006020828403121561457157614570613320565b5b600082015167ffffffffffffffff81111561458f5761458e613325565b5b61459b8482850161452d565b91505092915050565b7f496e76616c6964206c6576656c20676976656e2e000000000000000000000000600082015250565b60006145da6014836137ba565b91506145e5826145a4565b602082019050919050565b60006020820190508181036000830152614609816145cd565b9050919050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261463c5761463b614610565b5b80840192508235915067ffffffffffffffff82111561465e5761465d614615565b5b60208301925060208202360383131561467a5761467961461a565b5b509250929050565b7f496e76616c6964206c6576656c20666f72204964212100000000000000000000600082015250565b60006146b86016836137ba565b91506146c382614682565b602082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b6000815190506146fd8161335c565b92915050565b60006020828403121561471957614718613320565b5b6000614727848285016146ee565b91505092915050565b7f496e76616c696421206964206e6f7420666f756e6420696e207573657220776160008201527f6c6c657421000000000000000000000000000000000000000000000000000000602082015250565b600061478c6025836137ba565b915061479782614730565b604082019050919050565b600060208201905081810360008301526147bb8161477f565b9050919050565b7f494420697320616c72616479205374616b656421000000000000000000000000600082015250565b60006147f86014836137ba565b9150614803826147c2565b602082019050919050565b60006020820190508181036000830152614827816147eb565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261487b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261483e565b614885868361483e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006148c26148bd6148b8846133b5565b61489d565b6133b5565b9050919050565b6000819050919050565b6148dc836148a7565b6148f06148e8826148c9565b84845461484b565b825550505050565b600090565b6149056148f8565b6149108184846148d3565b505050565b5b81811015614934576149296000826148fd565b600181019050614916565b5050565b601f8211156149795761494a816142f6565b6149538461482e565b81016020851015614962578190505b61497661496e8561482e565b830182614915565b50505b505050565b600082821c905092915050565b600061499c6000198460080261497e565b1980831691505092915050565b60006149b5838361498b565b9150826002028217905092915050565b6149ce826137af565b67ffffffffffffffff8111156149e7576149e6613482565b5b6149f18254613efd565b6149fc828285614938565b600060209050601f831160018114614a2f5760008415614a1d578287015190505b614a2785826149a9565b865550614a8f565b601f198416614a3d866142f6565b60005b82811015614a6557848901518255600182019150602085019450602081019050614a40565b86831015614a825784890151614a7e601f89168261498b565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614af36026836137ba565b9150614afe82614a97565b604082019050919050565b60006020820190508181036000830152614b2281614ae6565b9050919050565b6000614b34826133b5565b9150614b3f836133b5565b925082614b4f57614b4e61405e565b5b82820690509291505056fea2646970667358221220aa31b668d959e39e84b757982ee7822af8af2648ea32df11f25b99c9453ee45164736f6c63430008110033

Deployed Bytecode Sourcemap

18147:10091:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26111:56;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19632:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19219:75;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19963:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26075:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24930:496;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19301:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22665:982;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18565:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23655:814;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18258:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2786:103;;;:::i;:::-;;19584:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21892:765;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19920:36;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;2563:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25788:123;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25919:148;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25434:346;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18197:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18616:595;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20115:1769;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19487:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2898:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24567:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19407:73;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26111:56;;;;;;;;;;;;;;;;;:::o;19632:100::-;2708:12;:10;:12::i;:::-;2697:23;;:7;:5;:7::i;:::-;:23;;;2689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19723:1:::1;19701:19;:23;;;;19632:100:::0;:::o;19219:75::-;;;;;;;;;;;;;:::o;19963:51::-;;;;;;;;;;;;;;;;;:::o;26075:29::-;;;;:::o;24930:496::-;24989:4;25005:14;25022:6;:10;25029:2;25022:10;;;;;;;;;;;25005:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25051:1;:8;;;25043:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;25091:6;25156:19;;25137:1;:16;;;:38;;;;:::i;:::-;25100:6;:24;25107:1;:16;;;25100:24;;;;;;;;;;;25125:1;:7;;;25100:33;;;;;;:::i;:::-;;;;;;;;;;;;;;:76;;;;:::i;:::-;25091:85;;25187:16;25260:19;;25241:1;:16;;;:38;;;;:::i;:::-;25224:1;:13;;;:56;;;;:::i;:::-;25206:15;:74;:151;;25337:19;;25318:1;:16;;;:38;;;;:::i;:::-;25301:1;:13;;;:56;;;;:::i;:::-;25206:151;;;25283:15;25206:151;25187:170;;25404:1;:13;;;25390:11;:27;;;;:::i;:::-;25385:1;:33;;;;:::i;:::-;25378:40;;;;;24930:496;;;:::o;19301:94::-;2708:12;:10;:12::i;:::-;2697:23;;:7;:5;:7::i;:::-;:23;;;2689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19386:1:::1;19368:15;;:19;;;;;;;;;;;;;;;;;;19301:94:::0;:::o;22665:982::-;22735:10;22766:6;22762:666;22779:3;:10;22777:1;:12;22762:666;;;22855:10;22828:37;;:6;:14;22835:3;22839:1;22835:6;;;;;;;;:::i;:::-;;;;;;;;22828:14;;;;;;;;;;;:23;;;;;;;;;;;;:37;;;22820:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;22955:4;22930:29;;:6;:14;22937:3;22941:1;22937:6;;;;;;;;:::i;:::-;;;;;;;;22930:14;;;;;;;;;;;:21;;;;;;;;;;;;:29;;;22922:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;23085:19;;23053:6;:14;23060:3;23064:1;23060:6;;;;;;;;:::i;:::-;;;;;;;;23053:14;;;;;;;;;;;:29;;;:51;;;;:::i;:::-;23023:6;:14;23030:3;23034:1;23030:6;;;;;;;;:::i;:::-;;;;;;;;23023:14;;;;;;;;;;;:26;;;:82;;;;:::i;:::-;23004:15;:101;;22996:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;23164:13;;;;;;;;;;;23155:36;;;23200:4;23207:10;23219:6;:14;23226:3;23230:1;23226:6;;;;;;;;:::i;:::-;;;;;;;;23219:14;;;;;;;;;;;:17;;;23155:82;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23263:6;:37;23270:6;:14;23277:3;23281:1;23277:6;;;;;;;;:::i;:::-;;;;;;;;23270:14;;;;;;;;;;;:29;;;23263:37;;;;;;;;;;;23301:6;:14;23308:3;23312:1;23308:6;;;;;;;;:::i;:::-;;;;;;;;23301:14;;;;;;;;;;;:20;;23263:59;;;;;;:::i;:::-;;;;;;;;;;;;;;23254:68;;;;;:::i;:::-;;;23375:5;23351:6;:14;23358:3;23362:1;23358:6;;;;;;;;:::i;:::-;;;;;;;;23351:14;;;;;;;;;;;:21;;;:29;;;;;;;;;;;;;;;;;;23402:6;:14;23409:3;23413:1;23409:6;;;;;;;;:::i;:::-;;;;;;;;23402:14;;;;;;;;;;;;23395:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;22792:3;;;;;:::i;:::-;;;;22762:666;;;;23445:15;;;;;;;;;;;23438:35;;;23474:10;23486:5;23438:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23538:3;:10;23503:19;:31;23523:10;23503:31;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;23578:5;23561:13;;:22;;;;;;;:::i;:::-;;;;;;;;23634:5;23594:24;:36;23619:10;23594:36;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;22724:923;22665:982;:::o;18565:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23655:814::-;23718:10;23757:6;23753:489;23770:3;:10;23768:1;:12;23753:489;;;23846:10;23819:37;;:6;:14;23826:3;23830:1;23826:6;;;;;;;;:::i;:::-;;;;;;;;23819:14;;;;;;;;;;;:23;;;;;;;;;;;;:37;;;23811:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;23946:4;23921:29;;:6;:14;23928:3;23932:1;23928:6;;;;;;;;:::i;:::-;;;;;;;;23921:14;;;;;;;;;;;:21;;;;;;;;;;;;:29;;;23913:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;23998:13;;;;;;;;;;;23989:36;;;24034:4;24041:10;24053:6;:14;24060:3;24064:1;24060:6;;;;;;;;:::i;:::-;;;;;;;;24053:14;;;;;;;;;;;:17;;;23989:82;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24097:39;24118:6;:14;24125:3;24129:1;24125:6;;;;;;;;:::i;:::-;;;;;;;;24118:14;;;;;;;;;;;:17;;;24097:20;:39::i;:::-;24088:48;;;;;:::i;:::-;;;24189:5;24165:6;:14;24172:3;24176:1;24172:6;;;;;;;;:::i;:::-;;;;;;;;24165:14;;;;;;;;;;;:21;;;:29;;;;;;;;;;;;;;;;;;24216:6;:14;24223:3;24227:1;24223:6;;;;;;;;:::i;:::-;;;;;;;;24216:14;;;;;;;;;;;;24209:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23783:3;;;;;:::i;:::-;;;;23753:489;;;;24259:15;;;;;;;;;;;24252:35;;;24288:10;24308:1;24300:5;:9;;;;:::i;:::-;24252:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24356:3;:10;24321:19;:31;24341:10;24321:31;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;24402:1;24396:5;:7;;;;:::i;:::-;24379:13;;:24;;;;;;;:::i;:::-;;;;;;;;24460:1;24454:5;:7;;;;:::i;:::-;24414:24;:36;24439:10;24414:36;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;23707:762;23655:814;:::o;18258:299::-;2708:12;:10;:12::i;:::-;2697:23;;:7;:5;:7::i;:::-;:23;;;2689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18394:1:::1;18376:14;:19;:42;;;;18417:1;18399:14;:19;18376:42;:65;;;;18440:1;18422:14;:19;18376:65;:89;;;;18463:2;18445:14;:20;18376:89;18368:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;18534:15;18502:6;:22;18509:14;18502:22;;;;;;;;;;;18525:5;18502:29;;;;;;:::i;:::-;;;;;;;;;;;;;:47;;;;18258:299:::0;;;:::o;2786:103::-;2708:12;:10;:12::i;:::-;2697:23;;:7;:5;:7::i;:::-;:23;;;2689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2851:30:::1;2878:1;2851:18;:30::i;:::-;2786:103::o:0;19584:41::-;;;;:::o;21892:765::-;21946:14;21963:6;:10;21970:2;21963:10;;;;;;;;;;;21946:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22016:10;22002:24;;:1;:10;;;:24;;;21994:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22099:4;22087:16;;:1;:8;;;:16;;;22079:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;22199:19;;22180:1;:16;;;:38;;;;:::i;:::-;22163:1;:13;;;:56;;;;:::i;:::-;22144:15;:75;;22136:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;22272:15;;;;;;;;;;;22265:35;;;22301:10;22313:6;:24;22320:1;:16;;;22313:24;;;;;;;;;;;22338:1;:7;;;22313:33;;;;;;:::i;:::-;;;;;;;;;;;;;;22265:82;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22367:13;;;;;;;;;;;22358:36;;;22403:4;22410:10;22422:2;22358:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22473:1;22438:19;:31;22458:10;22438:31;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;22492:6;:10;22499:2;22492:10;;;;;;;;;;;;22485:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;22532:6;:24;22539:1;:16;;;22532:24;;;;;;;;;;;22557:1;:7;;;22532:33;;;;;;:::i;:::-;;;;;;;;;;;;;;22515:13;;:50;;;;;;;:::i;:::-;;;;;;;;22616:6;:24;22623:1;:16;;;22616:24;;;;;;;;;;;22641:1;:7;;;22616:33;;;;;;:::i;:::-;;;;;;;;;;;;;;22576:24;:36;22601:10;22576:36;;;;;;;;;;;;;;;;:73;;;;;;;:::i;:::-;;;;;;;;21935:722;21892:765;:::o;19920:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2563:87::-;2609:7;2636:6;;;;;;;;;;;2629:13;;2563:87;:::o;25788:123::-;25832:4;25864:13;;;;;;;;;;;25855:33;;;25897:4;25855:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25848:55;;25788:123;:::o;25919:148::-;25966:13;26016;;;;;;;;;;;25998:46;;;26053:4;25998:61;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25991:68;;25919:148;:::o;25434:346::-;25490:13;25515:15;25544:19;:22;25564:1;25544:22;;;;;;;;;;;;;;;;25533:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25515:52;;25578:15;25610:6;25617:1;25610:8;;25606:148;25633:19;:22;25653:1;25633:22;;;;;;;;;;;;;;;;25621:10;:34;25606:148;;25703:1;25681:23;;:6;:9;25688:1;25681:9;;;;;;;;;;;:18;;;;;;;;;;;;:23;;;25678:64;;25741:1;25723;25725:12;;;;;:::i;:::-;;;25723:15;;;;;;;;:::i;:::-;;;;;;;:19;;;;;25678:64;25658:3;;;;;:::i;:::-;;;;25606:148;;;;25771:1;25764:8;;;;25434:346;;;:::o;18197:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18616:595::-;2708:12;:10;:12::i;:::-;2697:23;;:7;:5;:7::i;:::-;:23;;;2689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18743:14:::1;;;;;;;;;;;;;;;;::::0;18733:25:::1;;;;;;18722:5;18706:23;;;;;;:52;:129;;;;18817:17;;;;;;;;;;;;;;;;::::0;18807:28:::1;;;;;;18796:5;18780:23;;;;;;:55;18706:129;:211;;;;18894:22;;;;;;;;;;;;;;;;::::0;18884:33:::1;;;;;;18873:5;18857:23;;;;;;:60;18706:211;:289;;;;18976:18;;;;;;;;;;;;;;;;::::0;18966:29:::1;;;;;;18955:5;18939:23;;;;;;:56;18706:289;:362;;;;19054:13;;;;;;;;;;;;;;;;::::0;19044:24:::1;;;;;;19033:5;19017:23;;;;;;:51;18706:362;:440;;;;19127:18;;;;;;;;;;;;;;;;::::0;19117:29:::1;;;;;;19106:5;19090:23;;;;;;:56;18706:440;18698:473;;;;;;;;;;;;:::i;:::-;;;;;;;;;19202:1;19182:10;19193:5;19182:17;;;;;;:::i;:::-;;;;;;;;;;;;;:21;;;;18616:595:::0;;:::o;20115:1769::-;20280:6;20276:1601;20293:3;:10;20291:1;:12;20276:1601;;;20354:1;20333:14;20348:1;20333:17;;;;;;;;:::i;:::-;;;;;;;;:22;:48;;;;20380:1;20359:14;20374:1;20359:17;;;;;;;;:::i;:::-;;;;;;;;:22;20333:48;:74;;;;20406:1;20385:14;20400:1;20385:17;;;;;;;;:::i;:::-;;;;;;;;:22;20333:74;:101;;;;20432:2;20411:14;20426:1;20411:17;;;;;;;;:::i;:::-;;;;;;;;:23;20333:101;20325:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;20524:14;;;;;;;;;;;;;;;;;20514:25;;;;;;20499:6;20506:1;20499:9;;;;;;;;:::i;:::-;;;;;;;;20483:27;;;;;;:56;:141;;;;20606:17;;;;;;;;;;;;;;;;;20596:28;;;;;;20581:6;20588:1;20581:9;;;;;;;;:::i;:::-;;;;;;;;20565:27;;;;;;:59;20483:141;:231;;;;20691:22;;;;;;;;;;;;;;;;;20681:33;;;;;;20666:6;20673:1;20666:9;;;;;;;;:::i;:::-;;;;;;;;20650:27;;;;;;:64;20483:231;:317;;;;20781:18;;;;;;;;;;;;;;;;;20771:29;;;;;;20756:6;20763:1;20756:9;;;;;;;;:::i;:::-;;;;;;;;20740:27;;;;;;:60;20483:317;:398;;;;20867:13;;;;;;;;;;;;;;;;;20857:24;;;;;;20842:6;20849:1;20842:9;;;;;;;;:::i;:::-;;;;;;;;20826:27;;;;;;:55;20483:398;:484;;;;20948:18;;;;;;;;;;;;;;;;;20938:29;;;;;;20923:6;20930:1;20923:9;;;;;;;;:::i;:::-;;;;;;;;20907:27;;;;;;:60;20483:484;20475:517;;;;;;;;;;;;:::i;:::-;;;;;;;;;21009:22;21034:24;21051:3;21055:1;21051:6;;;;;;;;:::i;:::-;;;;;;;;21034:16;:24::i;:::-;21009:49;;21081:97;21101:11;;21113:1;21101:14;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;21081:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21117:10;21128:6;21135:1;21128:9;;;;;;;;:::i;:::-;;;;;;;;21117:21;;;;;;:::i;:::-;;;;;;;;;;;;;;21167:8;21150:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;21140:37;;;;;;21081:18;:97::i;:::-;21073:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;21271:10;21228:53;;21237:13;;;;;;;;;;;21228:31;;;21260:3;21264:1;21260:6;;;;;;;;:::i;:::-;;;;;;;;21228:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;21220:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;21371:5;21346:30;;:6;:14;21353:3;21357:1;21353:6;;;;;;;;:::i;:::-;;;;;;;;21346:14;;;;;;;;;;;:21;;;;;;;;;;;;:30;;;21338:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;21435:13;;;;;;;;;;;21426:36;;;21463:10;21483:4;21490:3;21494:1;21490:6;;;;;;;;:::i;:::-;;;;;;;;21426:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21542:3;21546:1;21542:6;;;;;;;;:::i;:::-;;;;;;;;21522;:14;21529:3;21533:1;21529:6;;;;;;;;:::i;:::-;;;;;;;;21522:14;;;;;;;;;;;:17;;:26;;;;21589:10;21563:6;:14;21570:3;21574:1;21570:6;;;;;;;;:::i;:::-;;;;;;;;21563:14;;;;;;;;;;;:23;;;:36;;;;;;;;;;;;;;;;;;21643:15;21614:6;:14;21621:3;21625:1;21621:6;;;;;;;;:::i;:::-;;;;;;;;21614:14;;;;;;;;;;;:26;;:44;;;;21705:14;21720:1;21705:17;;;;;;;;:::i;:::-;;;;;;;;21673:6;:14;21680:3;21684:1;21680:6;;;;;;;;:::i;:::-;;;;;;;;21673:14;;;;;;;;;;;:29;;:49;;;;21760:6;21767:1;21760:9;;;;;;;;:::i;:::-;;;;;;;;21737:6;:14;21744:3;21748:1;21744:6;;;;;;;;:::i;:::-;;;;;;;;21737:14;;;;;;;;;;;:20;;:32;;;;;;:::i;:::-;;21808:4;21784:6;:14;21791:3;21795:1;21791:6;;;;;;;;:::i;:::-;;;;;;;;21784:14;;;;;;;;;;;:21;;;:28;;;;;;;;;;;;;;;;;;21864:1;21829:19;:31;21849:10;21829:31;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;20310:1567;20305:3;;;;;:::i;:::-;;;;20276:1601;;;;20115:1769;;;;;:::o;19487:89::-;2708:12;:10;:12::i;:::-;2697:23;;:7;:5;:7::i;:::-;:23;;;2689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19567:1:::1;19551:13;;:17;;;;;;;;;;;;;;;;;;19487:89:::0;:::o;2898:201::-;2708:12;:10;:12::i;:::-;2697:23;;:7;:5;:7::i;:::-;:23;;;2689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3007:1:::1;2987:22;;:8;:22;;::::0;2979:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3063:28;3082:8;3063:18;:28::i;:::-;2898:201:::0;:::o;24567:355::-;24621:14;24647:16;24678:19;:22;24698:1;24678:22;;;;;;;;;;;;;;;;24666:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;24647:54;;24712:15;24744:6;24751:1;24744:8;;24740:156;24767:19;:22;24787:1;24767:22;;;;;;;;;;;;;;;;24755:10;:34;24740:156;;24837:1;24815:23;;:6;:9;24822:1;24815:9;;;;;;;;;;;:18;;;;;;;;;;;;:23;;;24812:72;;24875:6;:9;24882:1;24875:9;;;;;;;;;;;24857:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:1;24859:12;;;;;:::i;:::-;;;24857:15;;;;;;;;:::i;:::-;;;;;;;:27;;;;24812:72;24792:3;;;;;:::i;:::-;;;;24740:156;;;;24913:1;24906:8;;;;24567:355;;;:::o;19407:73::-;;;;;;;;;;;;;:::o;2109:98::-;2162:7;2189:10;2182:17;;2109:98;:::o;3108:191::-;3182:16;3201:6;;;;;;;;;;;3182:25;;3227:8;3218:6;;:17;;;;;;;;;;;;;;;;;;3282:8;3251:40;;3272:8;3251:40;;;;;;;;;;;;3171:128;3108:191;:::o;319:723::-;375:13;605:1;596:5;:10;592:53;;623:10;;;;;;;;;;;;;;;;;;;;;592:53;655:12;670:5;655:20;;686:14;711:78;726:1;718:4;:9;711:78;;744:8;;;;;:::i;:::-;;;;775:2;767:10;;;;;:::i;:::-;;;711:78;;;799:19;831:6;821:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;799:39;;849:154;865:1;856:5;:10;849:154;;893:1;883:11;;;;;:::i;:::-;;;960:2;952:5;:10;;;;:::i;:::-;939:2;:24;;;;:::i;:::-;926:39;;909:6;916;909:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;989:2;980:11;;;;;:::i;:::-;;;849:154;;;1027:6;1013:21;;;;;319:723;;;;:::o;3331:190::-;3456:4;3509;3480:25;3493:5;3500:4;3480:12;:25::i;:::-;:33;3473:40;;3331:190;;;;;:::o;3526:517::-;3609:7;3629:20;3652:4;3629:27;;3672:9;3667:339;3691:5;:12;3687:1;:16;3667:339;;;3725:20;3748:5;3754:1;3748:8;;;;;;;;:::i;:::-;;;;;;;;3725:31;;3791:12;3775;:28;3771:224;;3839:42;3854:12;3868;3839:14;:42::i;:::-;3824:57;;3771:224;;;3937:42;3952:12;3966;3937:14;:42::i;:::-;3922:57;;3771:224;3710:296;3705:3;;;;;:::i;:::-;;;;3667:339;;;;4023:12;4016:19;;;3526:517;;;;:::o;4051:224::-;4119:13;4182:1;4176:4;4169:15;4211:1;4205:4;4198:15;4252:4;4246;4236:21;4227:30;;4051:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:118::-;2306:24;2324:5;2306:24;:::i;:::-;2301:3;2294:37;2219:118;;:::o;2343:222::-;2436:4;2474:2;2463:9;2459:18;2451:26;;2487:71;2555:1;2544:9;2540:17;2531:6;2487:71;:::i;:::-;2343:222;;;;:::o;2571:117::-;2680:1;2677;2670:12;2694:102;2735:6;2786:2;2782:7;2777:2;2770:5;2766:14;2762:28;2752:38;;2694:102;;;:::o;2802:180::-;2850:77;2847:1;2840:88;2947:4;2944:1;2937:15;2971:4;2968:1;2961:15;2988:281;3071:27;3093:4;3071:27;:::i;:::-;3063:6;3059:40;3201:6;3189:10;3186:22;3165:18;3153:10;3150:34;3147:62;3144:88;;;3212:18;;:::i;:::-;3144:88;3252:10;3248:2;3241:22;3031:238;2988:281;;:::o;3275:129::-;3309:6;3336:20;;:::i;:::-;3326:30;;3365:33;3393:4;3385:6;3365:33;:::i;:::-;3275:129;;;:::o;3410:311::-;3487:4;3577:18;3569:6;3566:30;3563:56;;;3599:18;;:::i;:::-;3563:56;3649:4;3641:6;3637:17;3629:25;;3709:4;3703;3699:15;3691:23;;3410:311;;;:::o;3727:117::-;3836:1;3833;3826:12;3867:710;3963:5;3988:81;4004:64;4061:6;4004:64;:::i;:::-;3988:81;:::i;:::-;3979:90;;4089:5;4118:6;4111:5;4104:21;4152:4;4145:5;4141:16;4134:23;;4205:4;4197:6;4193:17;4185:6;4181:30;4234:3;4226:6;4223:15;4220:122;;;4253:79;;:::i;:::-;4220:122;4368:6;4351:220;4385:6;4380:3;4377:15;4351:220;;;4460:3;4489:37;4522:3;4510:10;4489:37;:::i;:::-;4484:3;4477:50;4556:4;4551:3;4547:14;4540:21;;4427:144;4411:4;4406:3;4402:14;4395:21;;4351:220;;;4355:21;3969:608;;3867:710;;;;;:::o;4600:370::-;4671:5;4720:3;4713:4;4705:6;4701:17;4697:27;4687:122;;4728:79;;:::i;:::-;4687:122;4845:6;4832:20;4870:94;4960:3;4952:6;4945:4;4937:6;4933:17;4870:94;:::i;:::-;4861:103;;4677:293;4600:370;;;;:::o;4976:539::-;5060:6;5109:2;5097:9;5088:7;5084:23;5080:32;5077:119;;;5115:79;;:::i;:::-;5077:119;5263:1;5252:9;5248:17;5235:31;5293:18;5285:6;5282:30;5279:117;;;5315:79;;:::i;:::-;5279:117;5420:78;5490:7;5481:6;5470:9;5466:22;5420:78;:::i;:::-;5410:88;;5206:302;4976:539;;;;:::o;5521:117::-;5630:1;5627;5620:12;5644:308;5706:4;5796:18;5788:6;5785:30;5782:56;;;5818:18;;:::i;:::-;5782:56;5856:29;5878:6;5856:29;:::i;:::-;5848:37;;5940:4;5934;5930:15;5922:23;;5644:308;;;:::o;5958:146::-;6055:6;6050:3;6045;6032:30;6096:1;6087:6;6082:3;6078:16;6071:27;5958:146;;;:::o;6110:425::-;6188:5;6213:66;6229:49;6271:6;6229:49;:::i;:::-;6213:66;:::i;:::-;6204:75;;6302:6;6295:5;6288:21;6340:4;6333:5;6329:16;6378:3;6369:6;6364:3;6360:16;6357:25;6354:112;;;6385:79;;:::i;:::-;6354:112;6475:54;6522:6;6517:3;6512;6475:54;:::i;:::-;6194:341;6110:425;;;;;:::o;6555:340::-;6611:5;6660:3;6653:4;6645:6;6641:17;6637:27;6627:122;;6668:79;;:::i;:::-;6627:122;6785:6;6772:20;6810:79;6885:3;6877:6;6870:4;6862:6;6858:17;6810:79;:::i;:::-;6801:88;;6617:278;6555:340;;;;:::o;6901:509::-;6970:6;7019:2;7007:9;6998:7;6994:23;6990:32;6987:119;;;7025:79;;:::i;:::-;6987:119;7173:1;7162:9;7158:17;7145:31;7203:18;7195:6;7192:30;7189:117;;;7225:79;;:::i;:::-;7189:117;7330:63;7385:7;7376:6;7365:9;7361:22;7330:63;:::i;:::-;7320:73;;7116:287;6901:509;;;;:::o;7416:77::-;7453:7;7482:5;7471:16;;7416:77;;;:::o;7499:118::-;7586:24;7604:5;7586:24;:::i;:::-;7581:3;7574:37;7499:118;;:::o;7623:222::-;7716:4;7754:2;7743:9;7739:18;7731:26;;7767:71;7835:1;7824:9;7820:17;7811:6;7767:71;:::i;:::-;7623:222;;;;:::o;7851:799::-;7938:6;7946;7954;8003:2;7991:9;7982:7;7978:23;7974:32;7971:119;;;8009:79;;:::i;:::-;7971:119;8129:1;8154:53;8199:7;8190:6;8179:9;8175:22;8154:53;:::i;:::-;8144:63;;8100:117;8284:2;8273:9;8269:18;8256:32;8315:18;8307:6;8304:30;8301:117;;;8337:79;;:::i;:::-;8301:117;8442:63;8497:7;8488:6;8477:9;8473:22;8442:63;:::i;:::-;8432:73;;8227:288;8554:2;8580:53;8625:7;8616:6;8605:9;8601:22;8580:53;:::i;:::-;8570:63;;8525:118;7851:799;;;;;:::o;8656:99::-;8708:6;8742:5;8736:12;8726:22;;8656:99;;;:::o;8761:169::-;8845:11;8879:6;8874:3;8867:19;8919:4;8914:3;8910:14;8895:29;;8761:169;;;;:::o;8936:246::-;9017:1;9027:113;9041:6;9038:1;9035:13;9027:113;;;9126:1;9121:3;9117:11;9111:18;9107:1;9102:3;9098:11;9091:39;9063:2;9060:1;9056:10;9051:15;;9027:113;;;9174:1;9165:6;9160:3;9156:16;9149:27;8998:184;8936:246;;;:::o;9188:377::-;9276:3;9304:39;9337:5;9304:39;:::i;:::-;9359:71;9423:6;9418:3;9359:71;:::i;:::-;9352:78;;9439:65;9497:6;9492:3;9485:4;9478:5;9474:16;9439:65;:::i;:::-;9529:29;9551:6;9529:29;:::i;:::-;9524:3;9520:39;9513:46;;9280:285;9188:377;;;;:::o;9571:90::-;9605:7;9648:5;9641:13;9634:21;9623:32;;9571:90;;;:::o;9667:109::-;9748:21;9763:5;9748:21;:::i;:::-;9743:3;9736:34;9667:109;;:::o;9782:854::-;10029:4;10067:3;10056:9;10052:19;10044:27;;10081:71;10149:1;10138:9;10134:17;10125:6;10081:71;:::i;:::-;10162:72;10230:2;10219:9;10215:18;10206:6;10162:72;:::i;:::-;10244;10312:2;10301:9;10297:18;10288:6;10244:72;:::i;:::-;10326;10394:2;10383:9;10379:18;10370:6;10326:72;:::i;:::-;10446:9;10440:4;10436:20;10430:3;10419:9;10415:19;10408:49;10474:78;10547:4;10538:6;10474:78;:::i;:::-;10466:86;;10562:67;10624:3;10613:9;10609:19;10600:6;10562:67;:::i;:::-;9782:854;;;;;;;;;:::o;10642:114::-;10709:6;10743:5;10737:12;10727:22;;10642:114;;;:::o;10762:184::-;10861:11;10895:6;10890:3;10883:19;10935:4;10930:3;10926:14;10911:29;;10762:184;;;;:::o;10952:132::-;11019:4;11042:3;11034:11;;11072:4;11067:3;11063:14;11055:22;;10952:132;;;:::o;11090:108::-;11167:24;11185:5;11167:24;:::i;:::-;11162:3;11155:37;11090:108;;:::o;11204:179::-;11273:10;11294:46;11336:3;11328:6;11294:46;:::i;:::-;11372:4;11367:3;11363:14;11349:28;;11204:179;;;;:::o;11389:113::-;11459:4;11491;11486:3;11482:14;11474:22;;11389:113;;;:::o;11538:732::-;11657:3;11686:54;11734:5;11686:54;:::i;:::-;11756:86;11835:6;11830:3;11756:86;:::i;:::-;11749:93;;11866:56;11916:5;11866:56;:::i;:::-;11945:7;11976:1;11961:284;11986:6;11983:1;11980:13;11961:284;;;12062:6;12056:13;12089:63;12148:3;12133:13;12089:63;:::i;:::-;12082:70;;12175:60;12228:6;12175:60;:::i;:::-;12165:70;;12021:224;12008:1;12005;12001:9;11996:14;;11961:284;;;11965:14;12261:3;12254:10;;11662:608;;;11538:732;;;;:::o;12276:373::-;12419:4;12457:2;12446:9;12442:18;12434:26;;12506:9;12500:4;12496:20;12492:1;12481:9;12477:17;12470:47;12534:108;12637:4;12628:6;12534:108;:::i;:::-;12526:116;;12276:373;;;;:::o;12655:654::-;12733:6;12741;12790:2;12778:9;12769:7;12765:23;12761:32;12758:119;;;12796:79;;:::i;:::-;12758:119;12916:1;12941:53;12986:7;12977:6;12966:9;12962:22;12941:53;:::i;:::-;12931:63;;12887:117;13071:2;13060:9;13056:18;13043:32;13102:18;13094:6;13091:30;13088:117;;;13124:79;;:::i;:::-;13088:117;13229:63;13284:7;13275:6;13264:9;13260:22;13229:63;:::i;:::-;13219:73;;13014:288;12655:654;;;;;:::o;13315:122::-;13388:24;13406:5;13388:24;:::i;:::-;13381:5;13378:35;13368:63;;13427:1;13424;13417:12;13368:63;13315:122;:::o;13443:139::-;13489:5;13527:6;13514:20;13505:29;;13543:33;13570:5;13543:33;:::i;:::-;13443:139;;;;:::o;13588:654::-;13666:6;13674;13723:2;13711:9;13702:7;13698:23;13694:32;13691:119;;;13729:79;;:::i;:::-;13691:119;13877:1;13866:9;13862:17;13849:31;13907:18;13899:6;13896:30;13893:117;;;13929:79;;:::i;:::-;13893:117;14034:63;14089:7;14080:6;14069:9;14065:22;14034:63;:::i;:::-;14024:73;;13820:287;14146:2;14172:53;14217:7;14208:6;14197:9;14193:22;14172:53;:::i;:::-;14162:63;;14117:118;13588:654;;;;;:::o;14248:117::-;14357:1;14354;14347:12;14390:595;14490:8;14500:6;14550:3;14543:4;14535:6;14531:17;14527:27;14517:122;;14558:79;;:::i;:::-;14517:122;14671:6;14658:20;14648:30;;14701:18;14693:6;14690:30;14687:117;;;14723:79;;:::i;:::-;14687:117;14837:4;14829:6;14825:17;14813:29;;14891:3;14883:4;14875:6;14871:17;14861:8;14857:32;14854:41;14851:128;;;14898:79;;:::i;:::-;14851:128;14390:595;;;;;:::o;14991:321::-;15078:4;15168:18;15160:6;15157:30;15154:56;;;15190:18;;:::i;:::-;15154:56;15240:4;15232:6;15228:17;15220:25;;15300:4;15294;15290:15;15282:23;;14991:321;;;:::o;15334:945::-;15440:5;15465:91;15481:74;15548:6;15481:74;:::i;:::-;15465:91;:::i;:::-;15456:100;;15576:5;15605:6;15598:5;15591:21;15639:4;15632:5;15628:16;15621:23;;15692:4;15684:6;15680:17;15672:6;15668:30;15721:3;15713:6;15710:15;15707:122;;;15740:79;;:::i;:::-;15707:122;15855:6;15838:435;15872:6;15867:3;15864:15;15838:435;;;15961:3;15948:17;15997:18;15984:11;15981:35;15978:122;;;16019:79;;:::i;:::-;15978:122;16143:11;16135:6;16131:24;16181:47;16224:3;16212:10;16181:47;:::i;:::-;16176:3;16169:60;16258:4;16253:3;16249:14;16242:21;;15914:359;;15898:4;15893:3;15889:14;15882:21;;15838:435;;;15842:21;15446:833;;15334:945;;;;;:::o;16301:390::-;16382:5;16431:3;16424:4;16416:6;16412:17;16408:27;16398:122;;16439:79;;:::i;:::-;16398:122;16556:6;16543:20;16581:104;16681:3;16673:6;16666:4;16658:6;16654:17;16581:104;:::i;:::-;16572:113;;16388:303;16301:390;;;;:::o;16697:1699::-;16922:6;16930;16938;16946;16954;17003:3;16991:9;16982:7;16978:23;16974:33;16971:120;;;17010:79;;:::i;:::-;16971:120;17158:1;17147:9;17143:17;17130:31;17188:18;17180:6;17177:30;17174:117;;;17210:79;;:::i;:::-;17174:117;17315:78;17385:7;17376:6;17365:9;17361:22;17315:78;:::i;:::-;17305:88;;17101:302;17470:2;17459:9;17455:18;17442:32;17501:18;17493:6;17490:30;17487:117;;;17523:79;;:::i;:::-;17487:117;17636:107;17735:7;17726:6;17715:9;17711:22;17636:107;:::i;:::-;17618:125;;;;17413:340;17820:2;17809:9;17805:18;17792:32;17851:18;17843:6;17840:30;17837:117;;;17873:79;;:::i;:::-;17837:117;17978:78;18048:7;18039:6;18028:9;18024:22;17978:78;:::i;:::-;17968:88;;17763:303;18133:2;18122:9;18118:18;18105:32;18164:18;18156:6;18153:30;18150:117;;;18186:79;;:::i;:::-;18150:117;18291:88;18371:7;18362:6;18351:9;18347:22;18291:88;:::i;:::-;18281:98;;18076:313;16697:1699;;;;;;;;:::o;18402:136::-;18491:6;18525:5;18519:12;18509:22;;18402:136;;;:::o;18544:206::-;18665:11;18699:6;18694:3;18687:19;18739:4;18734:3;18730:14;18715:29;;18544:206;;;;:::o;18756:154::-;18845:4;18868:3;18860:11;;18898:4;18893:3;18889:14;18881:22;;18756:154;;;:::o;18916:108::-;18993:24;19011:5;18993:24;:::i;:::-;18988:3;18981:37;18916:108;;:::o;19030:159::-;19104:11;19138:6;19133:3;19126:19;19178:4;19173:3;19169:14;19154:29;;19030:159;;;;:::o;19195:357::-;19273:3;19301:39;19334:5;19301:39;:::i;:::-;19356:61;19410:6;19405:3;19356:61;:::i;:::-;19349:68;;19426:65;19484:6;19479:3;19472:4;19465:5;19461:16;19426:65;:::i;:::-;19516:29;19538:6;19516:29;:::i;:::-;19511:3;19507:39;19500:46;;19277:275;19195:357;;;;:::o;19558:99::-;19629:21;19644:5;19629:21;:::i;:::-;19624:3;19617:34;19558:99;;:::o;19735:1302::-;19838:3;19874:4;19869:3;19865:14;19959:4;19952:5;19948:16;19942:23;19978:63;20035:4;20030:3;20026:14;20012:12;19978:63;:::i;:::-;19889:162;20137:4;20130:5;20126:16;20120:23;20156:63;20213:4;20208:3;20204:14;20190:12;20156:63;:::i;:::-;20061:168;20318:4;20311:5;20307:16;20301:23;20337:63;20394:4;20389:3;20385:14;20371:12;20337:63;:::i;:::-;20239:171;20502:4;20495:5;20491:16;20485:23;20521:63;20578:4;20573:3;20569:14;20555:12;20521:63;:::i;:::-;20420:174;20677:4;20670:5;20666:16;20660:23;20730:3;20724:4;20720:14;20713:4;20708:3;20704:14;20697:38;20756:73;20824:4;20810:12;20756:73;:::i;:::-;20748:81;;20604:236;20924:4;20917:5;20913:16;20907:23;20943:57;20994:4;20989:3;20985:14;20971:12;20943:57;:::i;:::-;20850:160;21027:4;21020:11;;19843:1194;19735:1302;;;;:::o;21043:244::-;21156:10;21191:90;21277:3;21269:6;21191:90;:::i;:::-;21177:104;;21043:244;;;;:::o;21293:135::-;21385:4;21417;21412:3;21408:14;21400:22;;21293:135;;;:::o;21510:1087::-;21673:3;21702:76;21772:5;21702:76;:::i;:::-;21794:108;21895:6;21890:3;21794:108;:::i;:::-;21787:115;;21928:3;21973:4;21965:6;21961:17;21956:3;21952:27;22003:78;22075:5;22003:78;:::i;:::-;22104:7;22135:1;22120:432;22145:6;22142:1;22139:13;22120:432;;;22216:9;22210:4;22206:20;22201:3;22194:33;22267:6;22261:13;22295:108;22398:4;22383:13;22295:108;:::i;:::-;22287:116;;22426:82;22501:6;22426:82;:::i;:::-;22416:92;;22537:4;22532:3;22528:14;22521:21;;22180:372;22167:1;22164;22160:9;22155:14;;22120:432;;;22124:14;22568:4;22561:11;;22588:3;22581:10;;21678:919;;;;;21510:1087;;;;:::o;22603:461::-;22790:4;22828:2;22817:9;22813:18;22805:26;;22877:9;22871:4;22867:20;22863:1;22852:9;22848:17;22841:47;22905:152;23052:4;23043:6;22905:152;:::i;:::-;22897:160;;22603:461;;;;:::o;23070:182::-;23210:34;23206:1;23198:6;23194:14;23187:58;23070:182;:::o;23258:366::-;23400:3;23421:67;23485:2;23480:3;23421:67;:::i;:::-;23414:74;;23497:93;23586:3;23497:93;:::i;:::-;23615:2;23610:3;23606:12;23599:19;;23258:366;;;:::o;23630:419::-;23796:4;23834:2;23823:9;23819:18;23811:26;;23883:9;23877:4;23873:20;23869:1;23858:9;23854:17;23847:47;23911:131;24037:4;23911:131;:::i;:::-;23903:139;;23630:419;;;:::o;24055:180::-;24103:77;24100:1;24093:88;24200:4;24197:1;24190:15;24224:4;24221:1;24214:15;24241:320;24285:6;24322:1;24316:4;24312:12;24302:22;;24369:1;24363:4;24359:12;24390:18;24380:81;;24446:4;24438:6;24434:17;24424:27;;24380:81;24508:2;24500:6;24497:14;24477:18;24474:38;24471:84;;24527:18;;:::i;:::-;24471:84;24292:269;24241:320;;;:::o;24567:166::-;24707:18;24703:1;24695:6;24691:14;24684:42;24567:166;:::o;24739:366::-;24881:3;24902:67;24966:2;24961:3;24902:67;:::i;:::-;24895:74;;24978:93;25067:3;24978:93;:::i;:::-;25096:2;25091:3;25087:12;25080:19;;24739:366;;;:::o;25111:419::-;25277:4;25315:2;25304:9;25300:18;25292:26;;25364:9;25358:4;25354:20;25350:1;25339:9;25335:17;25328:47;25392:131;25518:4;25392:131;:::i;:::-;25384:139;;25111:419;;;:::o;25536:180::-;25584:77;25581:1;25574:88;25681:4;25678:1;25671:15;25705:4;25702:1;25695:15;25722:410;25762:7;25785:20;25803:1;25785:20;:::i;:::-;25780:25;;25819:20;25837:1;25819:20;:::i;:::-;25814:25;;25874:1;25871;25867:9;25896:30;25914:11;25896:30;:::i;:::-;25885:41;;26075:1;26066:7;26062:15;26059:1;26056:22;26036:1;26029:9;26009:83;25986:139;;26105:18;;:::i;:::-;25986:139;25770:362;25722:410;;;;:::o;26138:148::-;26240:11;26277:3;26262:18;;26138:148;;;;:::o;26292:390::-;26398:3;26426:39;26459:5;26426:39;:::i;:::-;26481:89;26563:6;26558:3;26481:89;:::i;:::-;26474:96;;26579:65;26637:6;26632:3;26625:4;26618:5;26614:16;26579:65;:::i;:::-;26669:6;26664:3;26660:16;26653:23;;26402:280;26292:390;;;;:::o;26688:275::-;26820:3;26842:95;26933:3;26924:6;26842:95;:::i;:::-;26835:102;;26954:3;26947:10;;26688:275;;;;:::o;26969:180::-;27017:77;27014:1;27007:88;27114:4;27111:1;27104:15;27138:4;27135:1;27128:15;27155:185;27195:1;27212:20;27230:1;27212:20;:::i;:::-;27207:25;;27246:20;27264:1;27246:20;:::i;:::-;27241:25;;27285:1;27275:35;;27290:18;;:::i;:::-;27275:35;27332:1;27329;27325:9;27320:14;;27155:185;;;;:::o;27346:191::-;27386:3;27405:20;27423:1;27405:20;:::i;:::-;27400:25;;27439:20;27457:1;27439:20;:::i;:::-;27434:25;;27482:1;27479;27475:9;27468:16;;27503:3;27500:1;27497:10;27494:36;;;27510:18;;:::i;:::-;27494:36;27346:191;;;;:::o;27543:194::-;27583:4;27603:20;27621:1;27603:20;:::i;:::-;27598:25;;27637:20;27655:1;27637:20;:::i;:::-;27632:25;;27681:1;27678;27674:9;27666:17;;27705:1;27699:4;27696:11;27693:37;;;27710:18;;:::i;:::-;27693:37;27543:194;;;;:::o;27743:180::-;27791:77;27788:1;27781:88;27888:4;27885:1;27878:15;27912:4;27909:1;27902:15;27929:224;28069:34;28065:1;28057:6;28053:14;28046:58;28138:7;28133:2;28125:6;28121:15;28114:32;27929:224;:::o;28159:366::-;28301:3;28322:67;28386:2;28381:3;28322:67;:::i;:::-;28315:74;;28398:93;28487:3;28398:93;:::i;:::-;28516:2;28511:3;28507:12;28500:19;;28159:366;;;:::o;28531:419::-;28697:4;28735:2;28724:9;28720:18;28712:26;;28784:9;28778:4;28774:20;28770:1;28759:9;28755:17;28748:47;28812:131;28938:4;28812:131;:::i;:::-;28804:139;;28531:419;;;:::o;28956:167::-;29096:19;29092:1;29084:6;29080:14;29073:43;28956:167;:::o;29129:366::-;29271:3;29292:67;29356:2;29351:3;29292:67;:::i;:::-;29285:74;;29368:93;29457:3;29368:93;:::i;:::-;29486:2;29481:3;29477:12;29470:19;;29129:366;;;:::o;29501:419::-;29667:4;29705:2;29694:9;29690:18;29682:26;;29754:9;29748:4;29744:20;29740:1;29729:9;29725:17;29718:47;29782:131;29908:4;29782:131;:::i;:::-;29774:139;;29501:419;;;:::o;29926:178::-;30066:30;30062:1;30054:6;30050:14;30043:54;29926:178;:::o;30110:366::-;30252:3;30273:67;30337:2;30332:3;30273:67;:::i;:::-;30266:74;;30349:93;30438:3;30349:93;:::i;:::-;30467:2;30462:3;30458:12;30451:19;;30110:366;;;:::o;30482:419::-;30648:4;30686:2;30675:9;30671:18;30663:26;;30735:9;30729:4;30725:20;30721:1;30710:9;30706:17;30699:47;30763:131;30889:4;30763:131;:::i;:::-;30755:139;;30482:419;;;:::o;30907:442::-;31056:4;31094:2;31083:9;31079:18;31071:26;;31107:71;31175:1;31164:9;31160:17;31151:6;31107:71;:::i;:::-;31188:72;31256:2;31245:9;31241:18;31232:6;31188:72;:::i;:::-;31270;31338:2;31327:9;31323:18;31314:6;31270:72;:::i;:::-;30907:442;;;;;;:::o;31355:141::-;31404:4;31427:3;31419:11;;31450:3;31447:1;31440:14;31484:4;31481:1;31471:18;31463:26;;31355:141;;;:::o;31526:874::-;31629:3;31666:5;31660:12;31695:36;31721:9;31695:36;:::i;:::-;31747:89;31829:6;31824:3;31747:89;:::i;:::-;31740:96;;31867:1;31856:9;31852:17;31883:1;31878:166;;;;32058:1;32053:341;;;;31845:549;;31878:166;31962:4;31958:9;31947;31943:25;31938:3;31931:38;32024:6;32017:14;32010:22;32002:6;31998:35;31993:3;31989:45;31982:52;;31878:166;;32053:341;32120:38;32152:5;32120:38;:::i;:::-;32180:1;32194:154;32208:6;32205:1;32202:13;32194:154;;;32282:7;32276:14;32272:1;32267:3;32263:11;32256:35;32332:1;32323:7;32319:15;32308:26;;32230:4;32227:1;32223:12;32218:17;;32194:154;;;32377:6;32372:3;32368:16;32361:23;;32060:334;;31845:549;;31633:767;;31526:874;;;;:::o;32406:269::-;32535:3;32557:92;32645:3;32636:6;32557:92;:::i;:::-;32550:99;;32666:3;32659:10;;32406:269;;;;:::o;32681:233::-;32720:3;32743:24;32761:5;32743:24;:::i;:::-;32734:33;;32789:66;32782:5;32779:77;32776:103;;32859:18;;:::i;:::-;32776:103;32906:1;32899:5;32895:13;32888:20;;32681:233;;;:::o;32920:332::-;33041:4;33079:2;33068:9;33064:18;33056:26;;33092:71;33160:1;33149:9;33145:17;33136:6;33092:71;:::i;:::-;33173:72;33241:2;33230:9;33226:18;33217:6;33173:72;:::i;:::-;32920:332;;;;;:::o;33258:171::-;33398:23;33394:1;33386:6;33382:14;33375:47;33258:171;:::o;33435:366::-;33577:3;33598:67;33662:2;33657:3;33598:67;:::i;:::-;33591:74;;33674:93;33763:3;33674:93;:::i;:::-;33792:2;33787:3;33783:12;33776:19;;33435:366;;;:::o;33807:419::-;33973:4;34011:2;34000:9;33996:18;33988:26;;34060:9;34054:4;34050:20;34046:1;34035:9;34031:17;34024:47;34088:131;34214:4;34088:131;:::i;:::-;34080:139;;33807:419;;;:::o;34232:143::-;34289:5;34320:6;34314:13;34305:22;;34336:33;34363:5;34336:33;:::i;:::-;34232:143;;;;:::o;34381:351::-;34451:6;34500:2;34488:9;34479:7;34475:23;34471:32;34468:119;;;34506:79;;:::i;:::-;34468:119;34626:1;34651:64;34707:7;34698:6;34687:9;34683:22;34651:64;:::i;:::-;34641:74;;34597:128;34381:351;;;;:::o;34755:732::-;34862:5;34887:81;34903:64;34960:6;34903:64;:::i;:::-;34887:81;:::i;:::-;34878:90;;34988:5;35017:6;35010:5;35003:21;35051:4;35044:5;35040:16;35033:23;;35104:4;35096:6;35092:17;35084:6;35080:30;35133:3;35125:6;35122:15;35119:122;;;35152:79;;:::i;:::-;35119:122;35267:6;35250:231;35284:6;35279:3;35276:15;35250:231;;;35359:3;35388:48;35432:3;35420:10;35388:48;:::i;:::-;35383:3;35376:61;35466:4;35461:3;35457:14;35450:21;;35326:155;35310:4;35305:3;35301:14;35294:21;;35250:231;;;35254:21;34868:619;;34755:732;;;;;:::o;35510:385::-;35592:5;35641:3;35634:4;35626:6;35622:17;35618:27;35608:122;;35649:79;;:::i;:::-;35608:122;35759:6;35753:13;35784:105;35885:3;35877:6;35870:4;35862:6;35858:17;35784:105;:::i;:::-;35775:114;;35598:297;35510:385;;;;:::o;35901:554::-;35996:6;36045:2;36033:9;36024:7;36020:23;36016:32;36013:119;;;36051:79;;:::i;:::-;36013:119;36192:1;36181:9;36177:17;36171:24;36222:18;36214:6;36211:30;36208:117;;;36244:79;;:::i;:::-;36208:117;36349:89;36430:7;36421:6;36410:9;36406:22;36349:89;:::i;:::-;36339:99;;36142:306;35901:554;;;;:::o;36461:170::-;36601:22;36597:1;36589:6;36585:14;36578:46;36461:170;:::o;36637:366::-;36779:3;36800:67;36864:2;36859:3;36800:67;:::i;:::-;36793:74;;36876:93;36965:3;36876:93;:::i;:::-;36994:2;36989:3;36985:12;36978:19;;36637:366;;;:::o;37009:419::-;37175:4;37213:2;37202:9;37198:18;37190:26;;37262:9;37256:4;37252:20;37248:1;37237:9;37233:17;37226:47;37290:131;37416:4;37290:131;:::i;:::-;37282:139;;37009:419;;;:::o;37434:117::-;37543:1;37540;37533:12;37557:117;37666:1;37663;37656:12;37680:117;37789:1;37786;37779:12;37803:740;37896:4;37902:6;37958:11;37945:25;38058:1;38052:4;38048:12;38037:8;38021:14;38017:29;38013:48;37993:18;37989:73;37979:168;;38066:79;;:::i;:::-;37979:168;38178:18;38168:8;38164:33;38156:41;;38230:4;38217:18;38207:28;;38258:18;38250:6;38247:30;38244:117;;;38280:79;;:::i;:::-;38244:117;38388:2;38382:4;38378:13;38370:21;;38445:4;38437:6;38433:17;38417:14;38413:38;38407:4;38403:49;38400:136;;;38455:79;;:::i;:::-;38400:136;37909:634;37803:740;;;;;:::o;38549:172::-;38689:24;38685:1;38677:6;38673:14;38666:48;38549:172;:::o;38727:366::-;38869:3;38890:67;38954:2;38949:3;38890:67;:::i;:::-;38883:74;;38966:93;39055:3;38966:93;:::i;:::-;39084:2;39079:3;39075:12;39068:19;;38727:366;;;:::o;39099:419::-;39265:4;39303:2;39292:9;39288:18;39280:26;;39352:9;39346:4;39342:20;39338:1;39327:9;39323:17;39316:47;39380:131;39506:4;39380:131;:::i;:::-;39372:139;;39099:419;;;:::o;39524:143::-;39581:5;39612:6;39606:13;39597:22;;39628:33;39655:5;39628:33;:::i;:::-;39524:143;;;;:::o;39673:351::-;39743:6;39792:2;39780:9;39771:7;39767:23;39763:32;39760:119;;;39798:79;;:::i;:::-;39760:119;39918:1;39943:64;39999:7;39990:6;39979:9;39975:22;39943:64;:::i;:::-;39933:74;;39889:128;39673:351;;;;:::o;40030:224::-;40170:34;40166:1;40158:6;40154:14;40147:58;40239:7;40234:2;40226:6;40222:15;40215:32;40030:224;:::o;40260:366::-;40402:3;40423:67;40487:2;40482:3;40423:67;:::i;:::-;40416:74;;40499:93;40588:3;40499:93;:::i;:::-;40617:2;40612:3;40608:12;40601:19;;40260:366;;;:::o;40632:419::-;40798:4;40836:2;40825:9;40821:18;40813:26;;40885:9;40879:4;40875:20;40871:1;40860:9;40856:17;40849:47;40913:131;41039:4;40913:131;:::i;:::-;40905:139;;40632:419;;;:::o;41057:170::-;41197:22;41193:1;41185:6;41181:14;41174:46;41057:170;:::o;41233:366::-;41375:3;41396:67;41460:2;41455:3;41396:67;:::i;:::-;41389:74;;41472:93;41561:3;41472:93;:::i;:::-;41590:2;41585:3;41581:12;41574:19;;41233:366;;;:::o;41605:419::-;41771:4;41809:2;41798:9;41794:18;41786:26;;41858:9;41852:4;41848:20;41844:1;41833:9;41829:17;41822:47;41886:131;42012:4;41886:131;:::i;:::-;41878:139;;41605:419;;;:::o;42030:93::-;42067:6;42114:2;42109;42102:5;42098:14;42094:23;42084:33;;42030:93;;;:::o;42129:107::-;42173:8;42223:5;42217:4;42213:16;42192:37;;42129:107;;;;:::o;42242:393::-;42311:6;42361:1;42349:10;42345:18;42384:97;42414:66;42403:9;42384:97;:::i;:::-;42502:39;42532:8;42521:9;42502:39;:::i;:::-;42490:51;;42574:4;42570:9;42563:5;42559:21;42550:30;;42623:4;42613:8;42609:19;42602:5;42599:30;42589:40;;42318:317;;42242:393;;;;;:::o;42641:60::-;42669:3;42690:5;42683:12;;42641:60;;;:::o;42707:142::-;42757:9;42790:53;42808:34;42817:24;42835:5;42817:24;:::i;:::-;42808:34;:::i;:::-;42790:53;:::i;:::-;42777:66;;42707:142;;;:::o;42855:75::-;42898:3;42919:5;42912:12;;42855:75;;;:::o;42936:269::-;43046:39;43077:7;43046:39;:::i;:::-;43107:91;43156:41;43180:16;43156:41;:::i;:::-;43148:6;43141:4;43135:11;43107:91;:::i;:::-;43101:4;43094:105;43012:193;42936:269;;;:::o;43211:73::-;43256:3;43211:73;:::o;43290:189::-;43367:32;;:::i;:::-;43408:65;43466:6;43458;43452:4;43408:65;:::i;:::-;43343:136;43290:189;;:::o;43485:186::-;43545:120;43562:3;43555:5;43552:14;43545:120;;;43616:39;43653:1;43646:5;43616:39;:::i;:::-;43589:1;43582:5;43578:13;43569:22;;43545:120;;;43485:186;;:::o;43677:543::-;43778:2;43773:3;43770:11;43767:446;;;43812:38;43844:5;43812:38;:::i;:::-;43896:29;43914:10;43896:29;:::i;:::-;43886:8;43882:44;44079:2;44067:10;44064:18;44061:49;;;44100:8;44085:23;;44061:49;44123:80;44179:22;44197:3;44179:22;:::i;:::-;44169:8;44165:37;44152:11;44123:80;:::i;:::-;43782:431;;43767:446;43677:543;;;:::o;44226:117::-;44280:8;44330:5;44324:4;44320:16;44299:37;;44226:117;;;;:::o;44349:169::-;44393:6;44426:51;44474:1;44470:6;44462:5;44459:1;44455:13;44426:51;:::i;:::-;44422:56;44507:4;44501;44497:15;44487:25;;44400:118;44349:169;;;;:::o;44523:295::-;44599:4;44745:29;44770:3;44764:4;44745:29;:::i;:::-;44737:37;;44807:3;44804:1;44800:11;44794:4;44791:21;44783:29;;44523:295;;;;:::o;44823:1395::-;44940:37;44973:3;44940:37;:::i;:::-;45042:18;45034:6;45031:30;45028:56;;;45064:18;;:::i;:::-;45028:56;45108:38;45140:4;45134:11;45108:38;:::i;:::-;45193:67;45253:6;45245;45239:4;45193:67;:::i;:::-;45287:1;45311:4;45298:17;;45343:2;45335:6;45332:14;45360:1;45355:618;;;;46017:1;46034:6;46031:77;;;46083:9;46078:3;46074:19;46068:26;46059:35;;46031:77;46134:67;46194:6;46187:5;46134:67;:::i;:::-;46128:4;46121:81;45990:222;45325:887;;45355:618;45407:4;45403:9;45395:6;45391:22;45441:37;45473:4;45441:37;:::i;:::-;45500:1;45514:208;45528:7;45525:1;45522:14;45514:208;;;45607:9;45602:3;45598:19;45592:26;45584:6;45577:42;45658:1;45650:6;45646:14;45636:24;;45705:2;45694:9;45690:18;45677:31;;45551:4;45548:1;45544:12;45539:17;;45514:208;;;45750:6;45741:7;45738:19;45735:179;;;45808:9;45803:3;45799:19;45793:26;45851:48;45893:4;45885:6;45881:17;45870:9;45851:48;:::i;:::-;45843:6;45836:64;45758:156;45735:179;45960:1;45956;45948:6;45944:14;45940:22;45934:4;45927:36;45362:611;;;45325:887;;44915:1303;;;44823:1395;;:::o;46224:225::-;46364:34;46360:1;46352:6;46348:14;46341:58;46433:8;46428:2;46420:6;46416:15;46409:33;46224:225;:::o;46455:366::-;46597:3;46618:67;46682:2;46677:3;46618:67;:::i;:::-;46611:74;;46694:93;46783:3;46694:93;:::i;:::-;46812:2;46807:3;46803:12;46796:19;;46455:366;;;:::o;46827:419::-;46993:4;47031:2;47020:9;47016:18;47008:26;;47080:9;47074:4;47070:20;47066:1;47055:9;47051:17;47044:47;47108:131;47234:4;47108:131;:::i;:::-;47100:139;;46827:419;;;:::o;47252:176::-;47284:1;47301:20;47319:1;47301:20;:::i;:::-;47296:25;;47335:20;47353:1;47335:20;:::i;:::-;47330:25;;47374:1;47364:35;;47379:18;;:::i;:::-;47364:35;47420:1;47417;47413:9;47408:14;;47252:176;;;;:::o

Swarm Source

ipfs://aa31b668d959e39e84b757982ee7822af8af2648ea32df11f25b99c9453ee451

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.