ETH Price: $3,130.51 (-4.40%)

Token

Jungle (JUNGLE)
 

Overview

Max Total Supply

123,100,533.242650462962952695 JUNGLE

Holders

2,906

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
barnt.eth
Balance
940.622337962962962962 JUNGLE

Value
$0.00
0x036F2DACf33EA6FB436257b1DF4670dE25e4a8CF
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Jungle

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
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);
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/utils/ERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;



/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

// File: @openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: contracts/JUNGLE.sol


pragma solidity ^0.8.0;









interface IJungleFreaksNFT {
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}

contract Jungle is ERC1155Holder, Context, IERC20, IERC20Metadata, Ownable, ReentrancyGuard {
    using Strings for uint256;

    uint256 private _totalSupply;
    string private _name = "Jungle";
    string private _symbol = "JUNGLE";
    uint256 public EMISSION_END = 1801717200;
    uint256 public constant EMISSION_RATE = 10 ether;
    uint256 public constant EMISSION_RATE_COTF = 35 ether;
    uint256 public constant EMISSION_RATE_MTFM = 15 ether;
    address public constant JUNGLE_FREAKS_ADDRESS = 0x7E6Bc952d4b4bD814853301bEe48E99891424de0;
    address public constant LEGENDARY_VAULT_ADDRESS = 0x495f947276749Ce646f68AC8c248420045cb7b5e;
    uint256 public constant LEGENDARY_COTF = 64396628092031731206525383750081342765665389133291640817070595755125256486927;
    uint256 public constant LEGENDARY_MTFM = 64396628092031731206525383750081342765665389133291640817070595754025744859163;
    bool public live = false;

    struct LegendariesStaked {
        uint32 cotfAccumulatedTime;
        uint32 mtfmAccumulatedTime;
        uint32 cotfLastStaked;
        uint32 mtfmLastStaked;
        uint8 cotfStaked;
        uint8 mtfmStaked;
    }

    mapping(uint256 => uint256) internal timeStaked;
    mapping(uint256 => address) internal tokenStaker;
    mapping(address => uint256[]) internal stakerTokens;
    mapping(address => LegendariesStaked) public legendariesStaked;

    // ERC20 mappings
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private authorizedAddresses;
    mapping(address => bool) public controllers;

    IJungleFreaksNFT private constant _freaksContract = IJungleFreaksNFT(JUNGLE_FREAKS_ADDRESS);
    IERC1155 private constant _vaultContract = IERC1155(LEGENDARY_VAULT_ADDRESS);

    constructor() {}

    modifier stakingEnabled {
        require(live && block.timestamp < EMISSION_END, "NOT_LIVE");
        _;
    }

    modifier onlyTokenController {
        require(controllers[msg.sender], "NOT_CONTROLLER");
        _;
    }

    function getStakedTokens(address staker) public view returns (uint256[] memory) {
        return stakerTokens[staker];
    }
    
    function getStakedAmount(address staker) public view returns (uint256) {
        return stakerTokens[staker].length;
    }

    function getStaker(uint256 tokenId) public view returns (address) {
        return tokenStaker[tokenId];
    }

    function getAllRewards(address staker) public view returns (uint256) {
        uint256 totalRewards = 0;

        uint256[] memory tokens = stakerTokens[staker];
        for (uint256 i = 0; i < tokens.length; i++) {
            totalRewards += (getStakingTimestamp() - timeStaked[tokens[i]]) * EMISSION_RATE / 86400;
        }

        return totalRewards;
    }

    function getLegendariesRewards(address staker) public view returns (uint256) {
        LegendariesStaked storage stakingState = legendariesStaked[staker];
        uint256 totalRewards;

        uint256 timestamp = getStakingTimestamp();
        totalRewards += (((timestamp - stakingState.cotfLastStaked) * stakingState.cotfStaked) + stakingState.cotfAccumulatedTime) * EMISSION_RATE_COTF / 86400;
        totalRewards += (((timestamp - stakingState.mtfmLastStaked) * stakingState.mtfmStaked) + stakingState.mtfmAccumulatedTime) * EMISSION_RATE_MTFM / 86400;

        return totalRewards;
    }

    function stakeById(uint256[] calldata tokenIds) external stakingEnabled {
        require(stakerTokens[msg.sender].length + tokenIds.length <= 100, "MAX_TOKENS_STAKED");
        uint256 timestamp = getStakingTimestamp();

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            _freaksContract.transferFrom(msg.sender, address(this), id);

            stakerTokens[msg.sender].push(id);
            timeStaked[id] = timestamp;
            tokenStaker[id] = msg.sender;
        }
    }

    function stakeLegendaries(uint8 cotf, uint8 mtfm) external stakingEnabled nonReentrant {
        LegendariesStaked storage stakingState = legendariesStaked[msg.sender];
        uint256 timestamp = getStakingTimestamp();

        if (cotf > 0) {
            stakingState.cotfAccumulatedTime += (uint32(timestamp) - stakingState.cotfLastStaked) * stakingState.cotfStaked;
            stakingState.cotfLastStaked = uint32(timestamp);
            stakingState.cotfStaked += cotf;

            _vaultContract.safeTransferFrom(msg.sender, address(this), LEGENDARY_COTF, cotf, "");
        }

        if (mtfm > 0) {
            stakingState.mtfmAccumulatedTime += (uint32(timestamp) - stakingState.mtfmLastStaked) * stakingState.mtfmStaked;
            stakingState.mtfmLastStaked = uint32(timestamp);
            stakingState.mtfmStaked += mtfm;
            
            _vaultContract.safeTransferFrom(msg.sender, address(this), LEGENDARY_MTFM, mtfm, "");
        }
    }

    function unstakeLegendaries(uint8 cotf, uint8 mtfm) external nonReentrant {
        require(cotf > 0 || mtfm > 0, "No tokens to unstake");

        LegendariesStaked storage stakingState = legendariesStaked[msg.sender];
        uint256 totalRewards;
        uint256 timestamp = getStakingTimestamp();

        if (cotf > 0) {
            totalRewards += (((timestamp - stakingState.cotfLastStaked) * stakingState.cotfStaked) + stakingState.cotfAccumulatedTime) * EMISSION_RATE_COTF / 86400;

            stakingState.cotfAccumulatedTime = 0;
            stakingState.cotfLastStaked = uint32(timestamp);
            stakingState.cotfStaked -= cotf; // Relying on underflow check.

            _vaultContract.safeTransferFrom(address(this), msg.sender, LEGENDARY_COTF, cotf, "");
        }

        if (mtfm > 0) {
            totalRewards += (((timestamp - stakingState.mtfmLastStaked) * stakingState.mtfmStaked) + stakingState.mtfmAccumulatedTime) * EMISSION_RATE_MTFM / 86400;

            stakingState.mtfmAccumulatedTime = 0;
            stakingState.mtfmLastStaked = uint32(timestamp);
            stakingState.mtfmStaked -= mtfm; // Relying on underflow check.

            _vaultContract.safeTransferFrom(address(this), msg.sender, LEGENDARY_MTFM, mtfm, "");
        }

        _mint(msg.sender, totalRewards);
    }

    function claimLegendaries() external nonReentrant {
        LegendariesStaked storage stakingState = legendariesStaked[msg.sender];
        uint256 totalRewards;
        uint256 timestamp = getStakingTimestamp();

        if (stakingState.cotfStaked > 0) {
            totalRewards += (((timestamp - stakingState.cotfLastStaked) * stakingState.cotfStaked) + stakingState.cotfAccumulatedTime) * EMISSION_RATE_COTF / 86400;

            stakingState.cotfAccumulatedTime = 0;
            stakingState.cotfLastStaked = uint32(timestamp);
        }

        if (stakingState.mtfmStaked > 0) {
            totalRewards += (((timestamp - stakingState.mtfmLastStaked) * stakingState.mtfmStaked) + stakingState.mtfmAccumulatedTime) * EMISSION_RATE_MTFM / 86400;

            stakingState.mtfmAccumulatedTime = 0;
            stakingState.mtfmLastStaked = uint32(timestamp);
        }

        _mint(msg.sender, totalRewards);
    }

    function unstakeByIds(uint256[] calldata tokenIds) external {
        uint256 totalRewards = 0;
        uint256 timestamp = getStakingTimestamp();

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(tokenStaker[id] == msg.sender, "NEEDS_TO_BE_OWNER");

            _freaksContract.transferFrom(address(this), msg.sender, id);
            totalRewards += (timestamp - timeStaked[id]) * EMISSION_RATE / 86400;

            removeTokenIdFromArray(stakerTokens[msg.sender], id);
            tokenStaker[id] = address(0);
        }

        _mint(msg.sender, totalRewards);
    }

    function unstakeAll() external {
        require(getStakedAmount(msg.sender) > 0, "NONE_STAKED");
        uint256 totalRewards = 0;
        uint256 timestamp = getStakingTimestamp();

        for (uint256 i = stakerTokens[msg.sender].length; i > 0; i--) {
            uint256 id = stakerTokens[msg.sender][i - 1];

            _freaksContract.transferFrom(address(this), msg.sender, id);
            totalRewards += (timestamp - timeStaked[id]) * EMISSION_RATE / 86400;

            stakerTokens[msg.sender].pop();
            tokenStaker[id] = address(0);
        }

        _mint(msg.sender, totalRewards);
    }

    function claimAll() external {
        uint256 totalRewards = 0;
        uint256 timestamp = getStakingTimestamp();

        uint256[] memory tokens = stakerTokens[msg.sender];
        for (uint256 i = 0; i < tokens.length; i++) {
            uint256 id = tokens[i];

            totalRewards += (timestamp - timeStaked[id]) * EMISSION_RATE / 86400;
            timeStaked[id] = timestamp;
        }

        _mint(msg.sender, totalRewards);
    }

    function rescueERC1155(address token, uint256[] calldata ids, uint256[] calldata amounts, address to) external onlyOwner {
        IERC1155(token).safeBatchTransferFrom(address(this), to, ids, amounts, "");
    }
    
    function toggle() external onlyOwner {
        live = !live;
    }

    function updateEmissionEnd(uint256 newTime) external onlyOwner {
        EMISSION_END = newTime;
    }

    function getStakingTimestamp() view internal returns (uint256) {
        return block.timestamp < EMISSION_END ? block.timestamp : EMISSION_END;
    }

    function removeTokenIdFromArray(uint256[] storage array, uint256 tokenId) internal {
        uint256 length = array.length;
        for (uint256 i = 0; i < length; i++) {
            if (array[i] == tokenId) {
                length--;
                if (i < length) {
                    array[i] = array[length];
                }
                array.pop();
                break;
            }
        }
    }

    // Token functions
    // --------------------------------------------------------------
    function mint(address to, uint256 amount) external onlyTokenController {
        _mint(to, amount);
    }

    function burn(address from, uint256 amount) external onlyTokenController {
        _burn(from, amount);
    }

    function setController(address controller, bool authorized) public onlyOwner {
        controllers[controller] = authorized;
    }

    function setAuthorizedAddress(address authorizedAddress, bool authorized) public onlyOwner {
        authorizedAddresses[authorizedAddress] = authorized;
    }

    // ERC20 functions
    // --------------------------------------------------------------    
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
    
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }
    
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
    
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
    
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        if (!authorizedAddresses[msg.sender]) {
            uint256 currentAllowance = _allowances[sender][_msgSender()];
            require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
            unchecked {
                _approve(sender, _msgSender(), currentAllowance - amount);
            }
        }

        return true;
    }
    
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }
    
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }
    
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }
    
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }
    
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }
    
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EMISSION_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_RATE_COTF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_RATE_MTFM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JUNGLE_FREAKS_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGENDARY_COTF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGENDARY_MTFM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGENDARY_VAULT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimLegendaries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"controllers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getLegendariesRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"legendariesStaked","outputs":[{"internalType":"uint32","name":"cotfAccumulatedTime","type":"uint32"},{"internalType":"uint32","name":"mtfmAccumulatedTime","type":"uint32"},{"internalType":"uint32","name":"cotfLastStaked","type":"uint32"},{"internalType":"uint32","name":"mtfmLastStaked","type":"uint32"},{"internalType":"uint8","name":"cotfStaked","type":"uint8"},{"internalType":"uint8","name":"mtfmStaked","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"live","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizedAddress","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"setAuthorizedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"cotf","type":"uint8"},{"internalType":"uint8","name":"mtfm","type":"uint8"}],"name":"stakeLegendaries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"cotf","type":"uint8"},{"internalType":"uint8","name":"mtfm","type":"uint8"}],"name":"unstakeLegendaries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"updateEmissionEnd","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600681526020017f4a756e676c6500000000000000000000000000000000000000000000000000008152506003908051906020019062000051929190620001ca565b506040518060400160405280600681526020017f4a554e474c450000000000000000000000000000000000000000000000000000815250600490805190602001906200009f929190620001ca565b50636b6405d06005556000600660006101000a81548160ff021916908315150217905550348015620000d057600080fd5b50620000f1620000e5620000fe60201b60201c565b6200010660201b60201c565b60018081905550620002df565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001d8906200027a565b90600052602060002090601f016020900481019282620001fc576000855562000248565b82601f106200021757805160ff191683800117855562000248565b8280016001018555821562000248579182015b82811115620002475782518255916020019190600101906200022a565b5b5090506200025791906200025b565b5090565b5b80821115620002765760008160009055506001016200025c565b5090565b600060028204905060018216806200029357607f821691505b60208210811415620002aa57620002a9620002b0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6152e580620002ef6000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c806363c28db111610167578063a9059cbb116100ce578063dd62ed3e11610087578063dd62ed3e146107f3578063e0dba60f14610823578063e3c998fe1461083f578063ef37d3b11461086f578063f23a6e611461088d578063f2fde38b146108bd57610295565b8063a9059cbb14610721578063b25d9f3a14610751578063b7ce33a21461076d578063bc197c8114610789578063d1058e59146107b9578063da8c229e146107c357610295565b80638da5cb5b116101205780638da5cb5b1461065d578063957aa58c1461067b57806395d89b411461069957806399605b74146106b75780639dc29fac146106d5578063a457c2d7146106f157610295565b806363c28db11461059b57806369d73619146105cb57806370a08231146105e957806371217a1914610619578063715018a61461063557806389442c5d1461063f57610295565b80632b179d941161020b57806340a3d246116101c457806340a3d2461461050157806340c10f191461050b57806348aa1936146105275780634da6a556146105435780634f29808a1461057357806350d8c84b1461057d57610295565b80632b179d9414610414578063313ce5671461044457806335322f3714610462578063362a3fad1461046c578063395093511461049c5780633cc94138146104cc57610295565b80630fe3633c1161025d5780630fe3633c146103545780631351cf511461037257806316170b7c1461038e57806318160ddd146103aa5780631a1b742d146103c857806323b872dd146103e457610295565b806301b8199a1461029a57806301ffc9a7146102b857806306fdde03146102e8578063095ea7b3146103065780630d32728e14610336575b600080fd5b6102a26108d9565b6040516102af91906146fe565b60405180910390f35b6102d260048036038101906102cd9190613e37565b6108e5565b6040516102df9190614446565b60405180910390f35b6102f061095f565b6040516102fd919061447c565b60405180910390f35b610320600480360381019061031b9190613daa565b6109f1565b60405161032d9190614446565b60405180910390f35b61033e610a0f565b60405161034b91906146fe565b60405180910390f35b61035c610a1c565b60405161036991906146fe565b60405180910390f35b61038c60048036038101906103879190613d6a565b610a22565b005b6103a860048036038101906103a39190613e64565b610af9565b005b6103b2610b7f565b6040516103bf91906146fe565b60405180910390f35b6103e260048036038101906103dd9190613e91565b610b89565b005b6103fe60048036038101906103f99190613bd9565b610fa7565b60405161040b9190614446565b60405180910390f35b61042e60048036038101906104299190613a9d565b6110f1565b60405161043b91906146fe565b60405180910390f35b61044c61127e565b604051610459919061477a565b60405180910390f35b61046a611287565b005b61048660048036038101906104819190613a9d565b611547565b60405161049391906146fe565b60405180910390f35b6104b660048036038101906104b19190613daa565b611678565b6040516104c39190614446565b60405180910390f35b6104e660048036038101906104e19190613a9d565b611724565b6040516104f896959493929190614719565b60405180910390f35b6105096117ba565b005b61052560048036038101906105209190613daa565b611862565b005b610541600480360381019061053c9190613dea565b6118fc565b005b61055d60048036038101906105589190613a9d565b611b66565b60405161056a91906146fe565b60405180910390f35b61057b611bb2565b005b610585611e61565b60405161059291906146fe565b60405180910390f35b6105b560048036038101906105b09190613a9d565b611e85565b6040516105c29190614424565b60405180910390f35b6105d3611f1c565b6040516105e09190614310565b60405180910390f35b61060360048036038101906105fe9190613a9d565b611f34565b60405161061091906146fe565b60405180910390f35b610633600480360381019061062e9190613e91565b611f7d565b005b61063d61241a565b005b6106476124a2565b6040516106549190614310565b60405180910390f35b6106656124ba565b6040516106729190614310565b60405180910390f35b6106836124e3565b6040516106909190614446565b60405180910390f35b6106a16124f6565b6040516106ae919061447c565b60405180910390f35b6106bf612588565b6040516106cc91906146fe565b60405180910390f35b6106ef60048036038101906106ea9190613daa565b612594565b005b61070b60048036038101906107069190613daa565b61262e565b6040516107189190614446565b60405180910390f35b61073b60048036038101906107369190613daa565b612719565b6040516107489190614446565b60405180910390f35b61076b60048036038101906107669190613dea565b612737565b005b61078760048036038101906107829190613cc3565b6129cc565b005b6107a3600480360381019061079e9190613b0a565b612ac5565b6040516107b09190614461565b60405180910390f35b6107c1612ada565b005b6107dd60048036038101906107d89190613a9d565b612c2d565b6040516107ea9190614446565b60405180910390f35b61080d60048036038101906108089190613aca565b612c4d565b60405161081a91906146fe565b60405180910390f35b61083d60048036038101906108389190613d6a565b612cd4565b005b61085960048036038101906108549190613e64565b612dab565b6040516108669190614310565b60405180910390f35b610877612de8565b60405161088491906146fe565b60405180910390f35b6108a760048036038101906108a29190613c2c565b612e0c565b6040516108b49190614461565b60405180910390f35b6108d760048036038101906108d29190613a9d565b612e21565b005b678ac7230489e8000081565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610958575061095782612f19565b5b9050919050565b60606003805461096e90614bb8565b80601f016020809104026020016040519081016040528092919081815260200182805461099a90614bb8565b80156109e75780601f106109bc576101008083540402835291602001916109e7565b820191906000526020600020905b8154815290600101906020018083116109ca57829003601f168201915b5050505050905090565b6000610a056109fe612f83565b8484612f8b565b6001905092915050565b6801e5b8fa8fe2ac000081565b60055481565b610a2a612f83565b73ffffffffffffffffffffffffffffffffffffffff16610a486124ba565b73ffffffffffffffffffffffffffffffffffffffff1614610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a959061459e565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610b01612f83565b73ffffffffffffffffffffffffffffffffffffffff16610b1f6124ba565b73ffffffffffffffffffffffffffffffffffffffff1614610b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6c9061459e565b60405180910390fd5b8060058190555050565b6000600254905090565b600660009054906101000a900460ff168015610ba6575060055442105b610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc9061469e565b60405180910390fd5b60026001541415610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c229061467e565b60405180910390fd5b60026001819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610c80613156565b905060008460ff161115610e0e578160000160109054906101000a900460ff1660ff168260000160089054906101000a900463ffffffff1682610cc39190614a41565b610ccd91906149cf565b8260000160008282829054906101000a900463ffffffff16610cef91906148d3565b92506101000a81548163ffffffff021916908363ffffffff160217905550808260000160086101000a81548163ffffffff021916908363ffffffff160217905550838260000160108282829054906101000a900460ff16610d50919061490d565b92506101000a81548160ff021916908360ff16021790555073495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a33307f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000003000000000f886040518563ffffffff1660e01b8152600401610ddb94939291906143cc565b600060405180830381600087803b158015610df557600080fd5b505af1158015610e09573d6000803e3d6000fd5b505050505b60008360ff161115610f9a578160000160119054906101000a900460ff1660ff1682600001600c9054906101000a900463ffffffff1682610e4f9190614a41565b610e5991906149cf565b8260000160048282829054906101000a900463ffffffff16610e7b91906148d3565b92506101000a81548163ffffffff021916908363ffffffff1602179055508082600001600c6101000a81548163ffffffff021916908363ffffffff160217905550828260000160118282829054906101000a900460ff16610edc919061490d565b92506101000a81548160ff021916908360ff16021790555073495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a33307f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000002000000001b876040518563ffffffff1660e01b8152600401610f6794939291906143cc565b600060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b505050505b5050600180819055505050565b6000610fb4848484613170565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110e6576000600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611050612f83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c79061457e565b60405180910390fd5b6110e4856110dc612f83565b858403612f8b565b505b600190509392505050565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080611140613156565b9050620151806801e5b8fa8fe2ac00008460000160009054906101000a900463ffffffff1663ffffffff168560000160109054906101000a900460ff1660ff168660000160089054906101000a900463ffffffff1663ffffffff16856111a69190614a0d565b6111b09190614975565b6111ba919061487d565b6111c49190614975565b6111ce9190614944565b826111d9919061487d565b91506201518067d02ab486cedc00008460000160049054906101000a900463ffffffff1663ffffffff168560000160119054906101000a900460ff1660ff1686600001600c9054906101000a900463ffffffff1663ffffffff168561123e9190614a0d565b6112489190614975565b611252919061487d565b61125c9190614975565b6112669190614944565b82611271919061487d565b9150819350505050919050565b60006012905090565b600061129233611b66565b116112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c99061463e565b60405180910390fd5b6000806112dd613156565b90506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b6000811115611538576000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018361137e9190614a0d565b8154811061138f5761138e614d20565b5b90600052602060002001549050737e6bc952d4b4bd814853301bee48e99891424de073ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b81526004016113ed93929190614395565b600060405180830381600087803b15801561140757600080fd5b505af115801561141b573d6000803e3d6000fd5b5050505062015180678ac7230489e8000060076000848152602001908152602001600020548561144b9190614a0d565b6114559190614975565b61145f9190614944565b8461146a919061487d565b9350600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806114bb576114ba614cf1565b5b6001900381819060005260206000200160009055905560006008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050808061153090614b8e565b915050611327565b5061154333836133f4565b5050565b600080600090506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156115d957602002820191906000526020600020905b8154815260200190600101908083116115c5575b5050505050905060005b815181101561166d5762015180678ac7230489e80000600760008585815181106116105761160f614d20565b5b602002602001015181526020019081526020016000205461162f613156565b6116399190614a0d565b6116439190614975565b61164d9190614944565b83611658919061487d565b9250808061166590614c1b565b9150506115e3565b508192505050919050565b600061171a611685612f83565b8484600c6000611693612f83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611715919061487d565b612f8b565b6001905092915050565b600a6020528060005260406000206000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16908060000160089054906101000a900463ffffffff169080600001600c9054906101000a900463ffffffff16908060000160109054906101000a900460ff16908060000160119054906101000a900460ff16905086565b6117c2612f83565b73ffffffffffffffffffffffffffffffffffffffff166117e06124ba565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d9061459e565b60405180910390fd5b600660009054906101000a900460ff1615600660006101000a81548160ff021916908315150217905550565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906145de565b60405180910390fd5b6118f882826133f4565b5050565b600080611907613156565b905060005b84849050811015611b5557600085858381811061192c5761192b614d20565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd9061455e565b60405180910390fd5b737e6bc952d4b4bd814853301bee48e99891424de073ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611a2793929190614395565b600060405180830381600087803b158015611a4157600080fd5b505af1158015611a55573d6000803e3d6000fd5b5050505062015180678ac7230489e80000600760008481526020019081526020016000205485611a859190614a0d565b611a8f9190614975565b611a999190614944565b84611aa4919061487d565b9350611aee600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082613555565b60006008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080611b4d90614c1b565b91505061190c565b50611b6033836133f4565b50505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60026001541415611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef9061467e565b60405180910390fd5b60026001819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080611c4e613156565b905060008360000160109054906101000a900460ff1660ff161115611d4e57620151806801e5b8fa8fe2ac00008460000160009054906101000a900463ffffffff1663ffffffff168560000160109054906101000a900460ff1660ff168660000160089054906101000a900463ffffffff1663ffffffff1685611cd19190614a0d565b611cdb9190614975565b611ce5919061487d565b611cef9190614975565b611cf99190614944565b82611d04919061487d565b915060008360000160006101000a81548163ffffffff021916908363ffffffff160217905550808360000160086101000a81548163ffffffff021916908363ffffffff1602179055505b60008360000160119054906101000a900460ff1660ff161115611e4b576201518067d02ab486cedc00008460000160049054906101000a900463ffffffff1663ffffffff168560000160119054906101000a900460ff1660ff1686600001600c9054906101000a900463ffffffff1663ffffffff1685611dce9190614a0d565b611dd89190614975565b611de2919061487d565b611dec9190614975565b611df69190614944565b82611e01919061487d565b915060008360000160046101000a81548163ffffffff021916908363ffffffff1602179055508083600001600c6101000a81548163ffffffff021916908363ffffffff1602179055505b611e5533836133f4565b50505060018081905550565b7f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000002000000001b81565b6060600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611f1057602002820191906000526020600020905b815481526020019060010190808311611efc575b50505050509050919050565b737e6bc952d4b4bd814853301bee48e99891424de081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60026001541415611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba9061467e565b60405180910390fd5b600260018190555060008260ff161180611fe0575060008160ff16115b61201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120169061465e565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008061206d613156565b905060008560ff16111561223957620151806801e5b8fa8fe2ac00008460000160009054906101000a900463ffffffff1663ffffffff168560000160109054906101000a900460ff1660ff168660000160089054906101000a900463ffffffff1663ffffffff16856120df9190614a0d565b6120e99190614975565b6120f3919061487d565b6120fd9190614975565b6121079190614944565b82612112919061487d565b915060008360000160006101000a81548163ffffffff021916908363ffffffff160217905550808360000160086101000a81548163ffffffff021916908363ffffffff160217905550848360000160108282829054906101000a900460ff1661217b9190614a75565b92506101000a81548160ff021916908360ff16021790555073495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a30337f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000003000000000f896040518563ffffffff1660e01b815260040161220694939291906143cc565b600060405180830381600087803b15801561222057600080fd5b505af1158015612234573d6000803e3d6000fd5b505050505b60008460ff161115612402576201518067d02ab486cedc00008460000160049054906101000a900463ffffffff1663ffffffff168560000160119054906101000a900460ff1660ff1686600001600c9054906101000a900463ffffffff1663ffffffff16856122a89190614a0d565b6122b29190614975565b6122bc919061487d565b6122c69190614975565b6122d09190614944565b826122db919061487d565b915060008360000160046101000a81548163ffffffff021916908363ffffffff1602179055508083600001600c6101000a81548163ffffffff021916908363ffffffff160217905550838360000160118282829054906101000a900460ff166123449190614a75565b92506101000a81548160ff021916908360ff16021790555073495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a30337f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000002000000001b886040518563ffffffff1660e01b81526004016123cf94939291906143cc565b600060405180830381600087803b1580156123e957600080fd5b505af11580156123fd573d6000803e3d6000fd5b505050505b61240c33836133f4565b505050600180819055505050565b612422612f83565b73ffffffffffffffffffffffffffffffffffffffff166124406124ba565b73ffffffffffffffffffffffffffffffffffffffff1614612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d9061459e565b60405180910390fd5b6124a06000613629565b565b73495f947276749ce646f68ac8c248420045cb7b5e81565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600660009054906101000a900460ff1681565b60606004805461250590614bb8565b80601f016020809104026020016040519081016040528092919081815260200182805461253190614bb8565b801561257e5780601f106125535761010080835404028352916020019161257e565b820191906000526020600020905b81548152906001019060200180831161256157829003601f168201915b5050505050905090565b67d02ab486cedc000081565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612620576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612617906145de565b60405180910390fd5b61262a82826136ed565b5050565b600080600c600061263d612f83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156126fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f1906146be565b60405180910390fd5b61270e612705612f83565b85858403612f8b565b600191505092915050565b600061272d612726612f83565b8484613170565b6001905092915050565b600660009054906101000a900460ff168015612754575060055442105b612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a9061469e565b60405180910390fd5b606482829050600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506127e6919061487d565b1115612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061451e565b60405180910390fd5b6000612831613156565b905060005b838390508110156129c657600084848381811061285657612855614d20565b5b905060200201359050737e6bc952d4b4bd814853301bee48e99891424de073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016128b093929190614395565b600060405180830381600087803b1580156128ca57600080fd5b505af11580156128de573d6000803e3d6000fd5b50505050600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055826007600083815260200190815260200160002081905550336008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080806129be90614c1b565b915050612836565b50505050565b6129d4612f83565b73ffffffffffffffffffffffffffffffffffffffff166129f26124ba565b73ffffffffffffffffffffffffffffffffffffffff1614612a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3f9061459e565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63083888888886040518763ffffffff1660e01b8152600401612a8b9695949392919061432b565b600060405180830381600087803b158015612aa557600080fd5b505af1158015612ab9573d6000803e3d6000fd5b50505050505050505050565b600063bc197c8160e01b905095945050505050565b600080612ae5613156565b90506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612b7257602002820191906000526020600020905b815481526020019060010190808311612b5e575b5050505050905060005b8151811015612c1d576000828281518110612b9a57612b99614d20565b5b6020026020010151905062015180678ac7230489e80000600760008481526020019081526020016000205486612bd09190614a0d565b612bda9190614975565b612be49190614944565b85612bef919061487d565b9450836007600083815260200190815260200160002081905550508080612c1590614c1b565b915050612b7c565b50612c2833846133f4565b505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612cdc612f83565b73ffffffffffffffffffffffffffffffffffffffff16612cfa6124ba565b73ffffffffffffffffffffffffffffffffffffffff1614612d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d479061459e565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b7f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000003000000000f81565b600063f23a6e6160e01b905095945050505050565b612e29612f83565b73ffffffffffffffffffffffffffffffffffffffff16612e476124ba565b73ffffffffffffffffffffffffffffffffffffffff1614612e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e949061459e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f04906144de565b60405180910390fd5b612f1681613629565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff29061461e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561306b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613062906144fe565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161314991906146fe565b60405180910390a3505050565b600060055442106131695760055461316b565b425b905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d7906145fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132479061449e565b60405180910390fd5b61325b8383836138c6565b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156132e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d99061453e565b60405180910390fd5b818103600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613377919061487d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516133db91906146fe565b60405180910390a36133ee8484846138cb565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345b906146de565b60405180910390fd5b613470600083836138c6565b8060026000828254613482919061487d565b9250508190555080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134d8919061487d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161353d91906146fe565b60405180910390a3613551600083836138cb565b5050565b60008280549050905060005b81811015613623578284828154811061357d5761357c614d20565b5b9060005260206000200154141561361057818061359990614b8e565b925050818110156135e4578382815481106135b7576135b6614d20565b5b90600052602060002001548482815481106135d5576135d4614d20565b5b90600052602060002001819055505b838054806135f5576135f4614cf1565b5b60019003818190600052602060002001600090559055613623565b808061361b90614c1b565b915050613561565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561375d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613754906145be565b60405180910390fd5b613769826000836138c6565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156137f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e7906144be565b60405180910390fd5b818103600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546138489190614a0d565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516138ad91906146fe565b60405180910390a36138c1836000846138cb565b505050565b505050565b505050565b60006138e36138de846147ba565b614795565b9050808382526020820190508285602086028201111561390657613905614d88565b5b60005b85811015613936578161391c8882613a73565b845260208401935060208301925050600181019050613909565b5050509392505050565b600061395361394e846147e6565b614795565b90508281526020810184848401111561396f5761396e614d8d565b5b61397a848285614b4c565b509392505050565b6000813590506139918161523c565b92915050565b60008083601f8401126139ad576139ac614d83565b5b8235905067ffffffffffffffff8111156139ca576139c9614d7e565b5b6020830191508360208202830111156139e6576139e5614d88565b5b9250929050565b600082601f830112613a0257613a01614d83565b5b8135613a128482602086016138d0565b91505092915050565b600081359050613a2a81615253565b92915050565b600081359050613a3f8161526a565b92915050565b600082601f830112613a5a57613a59614d83565b5b8135613a6a848260208601613940565b91505092915050565b600081359050613a8281615281565b92915050565b600081359050613a9781615298565b92915050565b600060208284031215613ab357613ab2614d9c565b5b6000613ac184828501613982565b91505092915050565b60008060408385031215613ae157613ae0614d9c565b5b6000613aef85828601613982565b9250506020613b0085828601613982565b9150509250929050565b600080600080600060a08688031215613b2657613b25614d9c565b5b6000613b3488828901613982565b9550506020613b4588828901613982565b945050604086013567ffffffffffffffff811115613b6657613b65614d92565b5b613b72888289016139ed565b935050606086013567ffffffffffffffff811115613b9357613b92614d92565b5b613b9f888289016139ed565b925050608086013567ffffffffffffffff811115613bc057613bbf614d92565b5b613bcc88828901613a45565b9150509295509295909350565b600080600060608486031215613bf257613bf1614d9c565b5b6000613c0086828701613982565b9350506020613c1186828701613982565b9250506040613c2286828701613a73565b9150509250925092565b600080600080600060a08688031215613c4857613c47614d9c565b5b6000613c5688828901613982565b9550506020613c6788828901613982565b9450506040613c7888828901613a73565b9350506060613c8988828901613a73565b925050608086013567ffffffffffffffff811115613caa57613ca9614d92565b5b613cb688828901613a45565b9150509295509295909350565b60008060008060008060808789031215613ce057613cdf614d9c565b5b6000613cee89828a01613982565b965050602087013567ffffffffffffffff811115613d0f57613d0e614d92565b5b613d1b89828a01613997565b9550955050604087013567ffffffffffffffff811115613d3e57613d3d614d92565b5b613d4a89828a01613997565b93509350506060613d5d89828a01613982565b9150509295509295509295565b60008060408385031215613d8157613d80614d9c565b5b6000613d8f85828601613982565b9250506020613da085828601613a1b565b9150509250929050565b60008060408385031215613dc157613dc0614d9c565b5b6000613dcf85828601613982565b9250506020613de085828601613a73565b9150509250929050565b60008060208385031215613e0157613e00614d9c565b5b600083013567ffffffffffffffff811115613e1f57613e1e614d92565b5b613e2b85828601613997565b92509250509250929050565b600060208284031215613e4d57613e4c614d9c565b5b6000613e5b84828501613a30565b91505092915050565b600060208284031215613e7a57613e79614d9c565b5b6000613e8884828501613a73565b91505092915050565b60008060408385031215613ea857613ea7614d9c565b5b6000613eb685828601613a88565b9250506020613ec785828601613a88565b9150509250929050565b6000613edd83836142c5565b60208301905092915050565b613ef281614aa9565b82525050565b6000613f04838561484a565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613f3757613f36614d97565b5b602083029250613f48838584614b4c565b82840190509392505050565b6000613f5f82614827565b613f69818561484a565b9350613f7483614817565b8060005b83811015613fa5578151613f8c8882613ed1565b9750613f978361483d565b925050600181019050613f78565b5085935050505092915050565b613fbb81614abb565b82525050565b613fca81614ac7565b82525050565b6000613fdb82614832565b613fe5818561486c565b9350613ff5818560208601614b5b565b613ffe81614da1565b840191505092915050565b600061401660238361486c565b915061402182614db2565b604082019050919050565b600061403960228361486c565b915061404482614e01565b604082019050919050565b600061405c60268361486c565b915061406782614e50565b604082019050919050565b600061407f60228361486c565b915061408a82614e9f565b604082019050919050565b60006140a260118361486c565b91506140ad82614eee565b602082019050919050565b60006140c560268361486c565b91506140d082614f17565b604082019050919050565b60006140e860118361486c565b91506140f382614f66565b602082019050919050565b600061410b60288361486c565b915061411682614f8f565b604082019050919050565b600061412e60208361486c565b915061413982614fde565b602082019050919050565b600061415160218361486c565b915061415c82615007565b604082019050919050565b6000614174600e8361486c565b915061417f82615056565b602082019050919050565b600061419760258361486c565b91506141a28261507f565b604082019050919050565b60006141ba60008361485b565b91506141c5826150ce565b600082019050919050565b60006141dd60248361486c565b91506141e8826150d1565b604082019050919050565b6000614200600b8361486c565b915061420b82615120565b602082019050919050565b600061422360148361486c565b915061422e82615149565b602082019050919050565b6000614246601f8361486c565b915061425182615172565b602082019050919050565b600061426960088361486c565b91506142748261519b565b602082019050919050565b600061428c60258361486c565b9150614297826151c4565b604082019050919050565b60006142af601f8361486c565b91506142ba82615213565b602082019050919050565b6142ce81614b13565b82525050565b6142dd81614b13565b82525050565b6142ec81614b1d565b82525050565b6142fb81614b3a565b82525050565b61430a81614b2d565b82525050565b60006020820190506143256000830184613ee9565b92915050565b600060a0820190506143406000830189613ee9565b61434d6020830188613ee9565b8181036040830152614360818688613ef8565b90508181036060830152614375818486613ef8565b90508181036080830152614388816141ad565b9050979650505050505050565b60006060820190506143aa6000830186613ee9565b6143b76020830185613ee9565b6143c460408301846142d4565b949350505050565b600060a0820190506143e16000830187613ee9565b6143ee6020830186613ee9565b6143fb60408301856142d4565b61440860608301846142f2565b8181036080830152614419816141ad565b905095945050505050565b6000602082019050818103600083015261443e8184613f54565b905092915050565b600060208201905061445b6000830184613fb2565b92915050565b60006020820190506144766000830184613fc1565b92915050565b600060208201905081810360008301526144968184613fd0565b905092915050565b600060208201905081810360008301526144b781614009565b9050919050565b600060208201905081810360008301526144d78161402c565b9050919050565b600060208201905081810360008301526144f78161404f565b9050919050565b6000602082019050818103600083015261451781614072565b9050919050565b6000602082019050818103600083015261453781614095565b9050919050565b60006020820190508181036000830152614557816140b8565b9050919050565b60006020820190508181036000830152614577816140db565b9050919050565b60006020820190508181036000830152614597816140fe565b9050919050565b600060208201905081810360008301526145b781614121565b9050919050565b600060208201905081810360008301526145d781614144565b9050919050565b600060208201905081810360008301526145f781614167565b9050919050565b600060208201905081810360008301526146178161418a565b9050919050565b60006020820190508181036000830152614637816141d0565b9050919050565b60006020820190508181036000830152614657816141f3565b9050919050565b6000602082019050818103600083015261467781614216565b9050919050565b6000602082019050818103600083015261469781614239565b9050919050565b600060208201905081810360008301526146b78161425c565b9050919050565b600060208201905081810360008301526146d78161427f565b9050919050565b600060208201905081810360008301526146f7816142a2565b9050919050565b600060208201905061471360008301846142d4565b92915050565b600060c08201905061472e60008301896142e3565b61473b60208301886142e3565b61474860408301876142e3565b61475560608301866142e3565b6147626080830185614301565b61476f60a0830184614301565b979650505050505050565b600060208201905061478f6000830184614301565b92915050565b600061479f6147b0565b90506147ab8282614bea565b919050565b6000604051905090565b600067ffffffffffffffff8211156147d5576147d4614d4f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561480157614800614d4f565b5b61480a82614da1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061488882614b13565b915061489383614b13565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148c8576148c7614c64565b5b828201905092915050565b60006148de82614b1d565b91506148e983614b1d565b92508263ffffffff0382111561490257614901614c64565b5b828201905092915050565b600061491882614b2d565b915061492383614b2d565b92508260ff0382111561493957614938614c64565b5b828201905092915050565b600061494f82614b13565b915061495a83614b13565b92508261496a57614969614c93565b5b828204905092915050565b600061498082614b13565b915061498b83614b13565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149c4576149c3614c64565b5b828202905092915050565b60006149da82614b1d565b91506149e583614b1d565b92508163ffffffff0483118215151615614a0257614a01614c64565b5b828202905092915050565b6000614a1882614b13565b9150614a2383614b13565b925082821015614a3657614a35614c64565b5b828203905092915050565b6000614a4c82614b1d565b9150614a5783614b1d565b925082821015614a6a57614a69614c64565b5b828203905092915050565b6000614a8082614b2d565b9150614a8b83614b2d565b925082821015614a9e57614a9d614c64565b5b828203905092915050565b6000614ab482614af3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b6000614b4582614b2d565b9050919050565b82818337600083830152505050565b60005b83811015614b79578082015181840152602081019050614b5e565b83811115614b88576000848401525b50505050565b6000614b9982614b13565b91506000821415614bad57614bac614c64565b5b600182039050919050565b60006002820490506001821680614bd057607f821691505b60208210811415614be457614be3614cc2565b5b50919050565b614bf382614da1565b810181811067ffffffffffffffff82111715614c1257614c11614d4f565b5b80604052505050565b6000614c2682614b13565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c5957614c58614c64565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d41585f544f4b454e535f5354414b4544000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4e454544535f544f5f42455f4f574e4552000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f545f434f4e54524f4c4c4552000000000000000000000000000000000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f4e455f5354414b4544000000000000000000000000000000000000000000600082015250565b7f4e6f20746f6b656e7320746f20756e7374616b65000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e4f545f4c495645000000000000000000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61524581614aa9565b811461525057600080fd5b50565b61525c81614abb565b811461526757600080fd5b50565b61527381614ac7565b811461527e57600080fd5b50565b61528a81614b13565b811461529557600080fd5b50565b6152a181614b2d565b81146152ac57600080fd5b5056fea2646970667358221220b1e86d8845da0ae5c9f2f91afc133b257da56d3163d4c8ad536a9499b398962164736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c806363c28db111610167578063a9059cbb116100ce578063dd62ed3e11610087578063dd62ed3e146107f3578063e0dba60f14610823578063e3c998fe1461083f578063ef37d3b11461086f578063f23a6e611461088d578063f2fde38b146108bd57610295565b8063a9059cbb14610721578063b25d9f3a14610751578063b7ce33a21461076d578063bc197c8114610789578063d1058e59146107b9578063da8c229e146107c357610295565b80638da5cb5b116101205780638da5cb5b1461065d578063957aa58c1461067b57806395d89b411461069957806399605b74146106b75780639dc29fac146106d5578063a457c2d7146106f157610295565b806363c28db11461059b57806369d73619146105cb57806370a08231146105e957806371217a1914610619578063715018a61461063557806389442c5d1461063f57610295565b80632b179d941161020b57806340a3d246116101c457806340a3d2461461050157806340c10f191461050b57806348aa1936146105275780634da6a556146105435780634f29808a1461057357806350d8c84b1461057d57610295565b80632b179d9414610414578063313ce5671461044457806335322f3714610462578063362a3fad1461046c578063395093511461049c5780633cc94138146104cc57610295565b80630fe3633c1161025d5780630fe3633c146103545780631351cf511461037257806316170b7c1461038e57806318160ddd146103aa5780631a1b742d146103c857806323b872dd146103e457610295565b806301b8199a1461029a57806301ffc9a7146102b857806306fdde03146102e8578063095ea7b3146103065780630d32728e14610336575b600080fd5b6102a26108d9565b6040516102af91906146fe565b60405180910390f35b6102d260048036038101906102cd9190613e37565b6108e5565b6040516102df9190614446565b60405180910390f35b6102f061095f565b6040516102fd919061447c565b60405180910390f35b610320600480360381019061031b9190613daa565b6109f1565b60405161032d9190614446565b60405180910390f35b61033e610a0f565b60405161034b91906146fe565b60405180910390f35b61035c610a1c565b60405161036991906146fe565b60405180910390f35b61038c60048036038101906103879190613d6a565b610a22565b005b6103a860048036038101906103a39190613e64565b610af9565b005b6103b2610b7f565b6040516103bf91906146fe565b60405180910390f35b6103e260048036038101906103dd9190613e91565b610b89565b005b6103fe60048036038101906103f99190613bd9565b610fa7565b60405161040b9190614446565b60405180910390f35b61042e60048036038101906104299190613a9d565b6110f1565b60405161043b91906146fe565b60405180910390f35b61044c61127e565b604051610459919061477a565b60405180910390f35b61046a611287565b005b61048660048036038101906104819190613a9d565b611547565b60405161049391906146fe565b60405180910390f35b6104b660048036038101906104b19190613daa565b611678565b6040516104c39190614446565b60405180910390f35b6104e660048036038101906104e19190613a9d565b611724565b6040516104f896959493929190614719565b60405180910390f35b6105096117ba565b005b61052560048036038101906105209190613daa565b611862565b005b610541600480360381019061053c9190613dea565b6118fc565b005b61055d60048036038101906105589190613a9d565b611b66565b60405161056a91906146fe565b60405180910390f35b61057b611bb2565b005b610585611e61565b60405161059291906146fe565b60405180910390f35b6105b560048036038101906105b09190613a9d565b611e85565b6040516105c29190614424565b60405180910390f35b6105d3611f1c565b6040516105e09190614310565b60405180910390f35b61060360048036038101906105fe9190613a9d565b611f34565b60405161061091906146fe565b60405180910390f35b610633600480360381019061062e9190613e91565b611f7d565b005b61063d61241a565b005b6106476124a2565b6040516106549190614310565b60405180910390f35b6106656124ba565b6040516106729190614310565b60405180910390f35b6106836124e3565b6040516106909190614446565b60405180910390f35b6106a16124f6565b6040516106ae919061447c565b60405180910390f35b6106bf612588565b6040516106cc91906146fe565b60405180910390f35b6106ef60048036038101906106ea9190613daa565b612594565b005b61070b60048036038101906107069190613daa565b61262e565b6040516107189190614446565b60405180910390f35b61073b60048036038101906107369190613daa565b612719565b6040516107489190614446565b60405180910390f35b61076b60048036038101906107669190613dea565b612737565b005b61078760048036038101906107829190613cc3565b6129cc565b005b6107a3600480360381019061079e9190613b0a565b612ac5565b6040516107b09190614461565b60405180910390f35b6107c1612ada565b005b6107dd60048036038101906107d89190613a9d565b612c2d565b6040516107ea9190614446565b60405180910390f35b61080d60048036038101906108089190613aca565b612c4d565b60405161081a91906146fe565b60405180910390f35b61083d60048036038101906108389190613d6a565b612cd4565b005b61085960048036038101906108549190613e64565b612dab565b6040516108669190614310565b60405180910390f35b610877612de8565b60405161088491906146fe565b60405180910390f35b6108a760048036038101906108a29190613c2c565b612e0c565b6040516108b49190614461565b60405180910390f35b6108d760048036038101906108d29190613a9d565b612e21565b005b678ac7230489e8000081565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610958575061095782612f19565b5b9050919050565b60606003805461096e90614bb8565b80601f016020809104026020016040519081016040528092919081815260200182805461099a90614bb8565b80156109e75780601f106109bc576101008083540402835291602001916109e7565b820191906000526020600020905b8154815290600101906020018083116109ca57829003601f168201915b5050505050905090565b6000610a056109fe612f83565b8484612f8b565b6001905092915050565b6801e5b8fa8fe2ac000081565b60055481565b610a2a612f83565b73ffffffffffffffffffffffffffffffffffffffff16610a486124ba565b73ffffffffffffffffffffffffffffffffffffffff1614610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a959061459e565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610b01612f83565b73ffffffffffffffffffffffffffffffffffffffff16610b1f6124ba565b73ffffffffffffffffffffffffffffffffffffffff1614610b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6c9061459e565b60405180910390fd5b8060058190555050565b6000600254905090565b600660009054906101000a900460ff168015610ba6575060055442105b610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc9061469e565b60405180910390fd5b60026001541415610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c229061467e565b60405180910390fd5b60026001819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610c80613156565b905060008460ff161115610e0e578160000160109054906101000a900460ff1660ff168260000160089054906101000a900463ffffffff1682610cc39190614a41565b610ccd91906149cf565b8260000160008282829054906101000a900463ffffffff16610cef91906148d3565b92506101000a81548163ffffffff021916908363ffffffff160217905550808260000160086101000a81548163ffffffff021916908363ffffffff160217905550838260000160108282829054906101000a900460ff16610d50919061490d565b92506101000a81548160ff021916908360ff16021790555073495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a33307f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000003000000000f886040518563ffffffff1660e01b8152600401610ddb94939291906143cc565b600060405180830381600087803b158015610df557600080fd5b505af1158015610e09573d6000803e3d6000fd5b505050505b60008360ff161115610f9a578160000160119054906101000a900460ff1660ff1682600001600c9054906101000a900463ffffffff1682610e4f9190614a41565b610e5991906149cf565b8260000160048282829054906101000a900463ffffffff16610e7b91906148d3565b92506101000a81548163ffffffff021916908363ffffffff1602179055508082600001600c6101000a81548163ffffffff021916908363ffffffff160217905550828260000160118282829054906101000a900460ff16610edc919061490d565b92506101000a81548160ff021916908360ff16021790555073495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a33307f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000002000000001b876040518563ffffffff1660e01b8152600401610f6794939291906143cc565b600060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b505050505b5050600180819055505050565b6000610fb4848484613170565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110e6576000600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611050612f83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c79061457e565b60405180910390fd5b6110e4856110dc612f83565b858403612f8b565b505b600190509392505050565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080611140613156565b9050620151806801e5b8fa8fe2ac00008460000160009054906101000a900463ffffffff1663ffffffff168560000160109054906101000a900460ff1660ff168660000160089054906101000a900463ffffffff1663ffffffff16856111a69190614a0d565b6111b09190614975565b6111ba919061487d565b6111c49190614975565b6111ce9190614944565b826111d9919061487d565b91506201518067d02ab486cedc00008460000160049054906101000a900463ffffffff1663ffffffff168560000160119054906101000a900460ff1660ff1686600001600c9054906101000a900463ffffffff1663ffffffff168561123e9190614a0d565b6112489190614975565b611252919061487d565b61125c9190614975565b6112669190614944565b82611271919061487d565b9150819350505050919050565b60006012905090565b600061129233611b66565b116112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c99061463e565b60405180910390fd5b6000806112dd613156565b90506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b6000811115611538576000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018361137e9190614a0d565b8154811061138f5761138e614d20565b5b90600052602060002001549050737e6bc952d4b4bd814853301bee48e99891424de073ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b81526004016113ed93929190614395565b600060405180830381600087803b15801561140757600080fd5b505af115801561141b573d6000803e3d6000fd5b5050505062015180678ac7230489e8000060076000848152602001908152602001600020548561144b9190614a0d565b6114559190614975565b61145f9190614944565b8461146a919061487d565b9350600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806114bb576114ba614cf1565b5b6001900381819060005260206000200160009055905560006008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050808061153090614b8e565b915050611327565b5061154333836133f4565b5050565b600080600090506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156115d957602002820191906000526020600020905b8154815260200190600101908083116115c5575b5050505050905060005b815181101561166d5762015180678ac7230489e80000600760008585815181106116105761160f614d20565b5b602002602001015181526020019081526020016000205461162f613156565b6116399190614a0d565b6116439190614975565b61164d9190614944565b83611658919061487d565b9250808061166590614c1b565b9150506115e3565b508192505050919050565b600061171a611685612f83565b8484600c6000611693612f83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611715919061487d565b612f8b565b6001905092915050565b600a6020528060005260406000206000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16908060000160089054906101000a900463ffffffff169080600001600c9054906101000a900463ffffffff16908060000160109054906101000a900460ff16908060000160119054906101000a900460ff16905086565b6117c2612f83565b73ffffffffffffffffffffffffffffffffffffffff166117e06124ba565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d9061459e565b60405180910390fd5b600660009054906101000a900460ff1615600660006101000a81548160ff021916908315150217905550565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906145de565b60405180910390fd5b6118f882826133f4565b5050565b600080611907613156565b905060005b84849050811015611b5557600085858381811061192c5761192b614d20565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd9061455e565b60405180910390fd5b737e6bc952d4b4bd814853301bee48e99891424de073ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611a2793929190614395565b600060405180830381600087803b158015611a4157600080fd5b505af1158015611a55573d6000803e3d6000fd5b5050505062015180678ac7230489e80000600760008481526020019081526020016000205485611a859190614a0d565b611a8f9190614975565b611a999190614944565b84611aa4919061487d565b9350611aee600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082613555565b60006008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080611b4d90614c1b565b91505061190c565b50611b6033836133f4565b50505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60026001541415611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef9061467e565b60405180910390fd5b60026001819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080611c4e613156565b905060008360000160109054906101000a900460ff1660ff161115611d4e57620151806801e5b8fa8fe2ac00008460000160009054906101000a900463ffffffff1663ffffffff168560000160109054906101000a900460ff1660ff168660000160089054906101000a900463ffffffff1663ffffffff1685611cd19190614a0d565b611cdb9190614975565b611ce5919061487d565b611cef9190614975565b611cf99190614944565b82611d04919061487d565b915060008360000160006101000a81548163ffffffff021916908363ffffffff160217905550808360000160086101000a81548163ffffffff021916908363ffffffff1602179055505b60008360000160119054906101000a900460ff1660ff161115611e4b576201518067d02ab486cedc00008460000160049054906101000a900463ffffffff1663ffffffff168560000160119054906101000a900460ff1660ff1686600001600c9054906101000a900463ffffffff1663ffffffff1685611dce9190614a0d565b611dd89190614975565b611de2919061487d565b611dec9190614975565b611df69190614944565b82611e01919061487d565b915060008360000160046101000a81548163ffffffff021916908363ffffffff1602179055508083600001600c6101000a81548163ffffffff021916908363ffffffff1602179055505b611e5533836133f4565b50505060018081905550565b7f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000002000000001b81565b6060600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611f1057602002820191906000526020600020905b815481526020019060010190808311611efc575b50505050509050919050565b737e6bc952d4b4bd814853301bee48e99891424de081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60026001541415611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba9061467e565b60405180910390fd5b600260018190555060008260ff161180611fe0575060008160ff16115b61201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120169061465e565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008061206d613156565b905060008560ff16111561223957620151806801e5b8fa8fe2ac00008460000160009054906101000a900463ffffffff1663ffffffff168560000160109054906101000a900460ff1660ff168660000160089054906101000a900463ffffffff1663ffffffff16856120df9190614a0d565b6120e99190614975565b6120f3919061487d565b6120fd9190614975565b6121079190614944565b82612112919061487d565b915060008360000160006101000a81548163ffffffff021916908363ffffffff160217905550808360000160086101000a81548163ffffffff021916908363ffffffff160217905550848360000160108282829054906101000a900460ff1661217b9190614a75565b92506101000a81548160ff021916908360ff16021790555073495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a30337f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000003000000000f896040518563ffffffff1660e01b815260040161220694939291906143cc565b600060405180830381600087803b15801561222057600080fd5b505af1158015612234573d6000803e3d6000fd5b505050505b60008460ff161115612402576201518067d02ab486cedc00008460000160049054906101000a900463ffffffff1663ffffffff168560000160119054906101000a900460ff1660ff1686600001600c9054906101000a900463ffffffff1663ffffffff16856122a89190614a0d565b6122b29190614975565b6122bc919061487d565b6122c69190614975565b6122d09190614944565b826122db919061487d565b915060008360000160046101000a81548163ffffffff021916908363ffffffff1602179055508083600001600c6101000a81548163ffffffff021916908363ffffffff160217905550838360000160118282829054906101000a900460ff166123449190614a75565b92506101000a81548160ff021916908360ff16021790555073495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a30337f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000002000000001b886040518563ffffffff1660e01b81526004016123cf94939291906143cc565b600060405180830381600087803b1580156123e957600080fd5b505af11580156123fd573d6000803e3d6000fd5b505050505b61240c33836133f4565b505050600180819055505050565b612422612f83565b73ffffffffffffffffffffffffffffffffffffffff166124406124ba565b73ffffffffffffffffffffffffffffffffffffffff1614612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d9061459e565b60405180910390fd5b6124a06000613629565b565b73495f947276749ce646f68ac8c248420045cb7b5e81565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600660009054906101000a900460ff1681565b60606004805461250590614bb8565b80601f016020809104026020016040519081016040528092919081815260200182805461253190614bb8565b801561257e5780601f106125535761010080835404028352916020019161257e565b820191906000526020600020905b81548152906001019060200180831161256157829003601f168201915b5050505050905090565b67d02ab486cedc000081565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612620576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612617906145de565b60405180910390fd5b61262a82826136ed565b5050565b600080600c600061263d612f83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156126fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f1906146be565b60405180910390fd5b61270e612705612f83565b85858403612f8b565b600191505092915050565b600061272d612726612f83565b8484613170565b6001905092915050565b600660009054906101000a900460ff168015612754575060055442105b612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a9061469e565b60405180910390fd5b606482829050600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506127e6919061487d565b1115612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061451e565b60405180910390fd5b6000612831613156565b905060005b838390508110156129c657600084848381811061285657612855614d20565b5b905060200201359050737e6bc952d4b4bd814853301bee48e99891424de073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016128b093929190614395565b600060405180830381600087803b1580156128ca57600080fd5b505af11580156128de573d6000803e3d6000fd5b50505050600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055826007600083815260200190815260200160002081905550336008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080806129be90614c1b565b915050612836565b50505050565b6129d4612f83565b73ffffffffffffffffffffffffffffffffffffffff166129f26124ba565b73ffffffffffffffffffffffffffffffffffffffff1614612a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3f9061459e565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63083888888886040518763ffffffff1660e01b8152600401612a8b9695949392919061432b565b600060405180830381600087803b158015612aa557600080fd5b505af1158015612ab9573d6000803e3d6000fd5b50505050505050505050565b600063bc197c8160e01b905095945050505050565b600080612ae5613156565b90506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612b7257602002820191906000526020600020905b815481526020019060010190808311612b5e575b5050505050905060005b8151811015612c1d576000828281518110612b9a57612b99614d20565b5b6020026020010151905062015180678ac7230489e80000600760008481526020019081526020016000205486612bd09190614a0d565b612bda9190614975565b612be49190614944565b85612bef919061487d565b9450836007600083815260200190815260200160002081905550508080612c1590614c1b565b915050612b7c565b50612c2833846133f4565b505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612cdc612f83565b73ffffffffffffffffffffffffffffffffffffffff16612cfa6124ba565b73ffffffffffffffffffffffffffffffffffffffff1614612d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d479061459e565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b7f8e5f332a0662c8c06bdd1eed105ba1c4800d4c2f00000000000003000000000f81565b600063f23a6e6160e01b905095945050505050565b612e29612f83565b73ffffffffffffffffffffffffffffffffffffffff16612e476124ba565b73ffffffffffffffffffffffffffffffffffffffff1614612e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e949061459e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f04906144de565b60405180910390fd5b612f1681613629565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff29061461e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561306b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613062906144fe565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161314991906146fe565b60405180910390a3505050565b600060055442106131695760055461316b565b425b905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d7906145fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613250576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132479061449e565b60405180910390fd5b61325b8383836138c6565b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156132e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d99061453e565b60405180910390fd5b818103600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613377919061487d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516133db91906146fe565b60405180910390a36133ee8484846138cb565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345b906146de565b60405180910390fd5b613470600083836138c6565b8060026000828254613482919061487d565b9250508190555080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134d8919061487d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161353d91906146fe565b60405180910390a3613551600083836138cb565b5050565b60008280549050905060005b81811015613623578284828154811061357d5761357c614d20565b5b9060005260206000200154141561361057818061359990614b8e565b925050818110156135e4578382815481106135b7576135b6614d20565b5b90600052602060002001548482815481106135d5576135d4614d20565b5b90600052602060002001819055505b838054806135f5576135f4614cf1565b5b60019003818190600052602060002001600090559055613623565b808061361b90614c1b565b915050613561565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561375d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613754906145be565b60405180910390fd5b613769826000836138c6565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156137f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e7906144be565b60405180910390fd5b818103600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546138489190614a0d565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516138ad91906146fe565b60405180910390a36138c1836000846138cb565b505050565b505050565b505050565b60006138e36138de846147ba565b614795565b9050808382526020820190508285602086028201111561390657613905614d88565b5b60005b85811015613936578161391c8882613a73565b845260208401935060208301925050600181019050613909565b5050509392505050565b600061395361394e846147e6565b614795565b90508281526020810184848401111561396f5761396e614d8d565b5b61397a848285614b4c565b509392505050565b6000813590506139918161523c565b92915050565b60008083601f8401126139ad576139ac614d83565b5b8235905067ffffffffffffffff8111156139ca576139c9614d7e565b5b6020830191508360208202830111156139e6576139e5614d88565b5b9250929050565b600082601f830112613a0257613a01614d83565b5b8135613a128482602086016138d0565b91505092915050565b600081359050613a2a81615253565b92915050565b600081359050613a3f8161526a565b92915050565b600082601f830112613a5a57613a59614d83565b5b8135613a6a848260208601613940565b91505092915050565b600081359050613a8281615281565b92915050565b600081359050613a9781615298565b92915050565b600060208284031215613ab357613ab2614d9c565b5b6000613ac184828501613982565b91505092915050565b60008060408385031215613ae157613ae0614d9c565b5b6000613aef85828601613982565b9250506020613b0085828601613982565b9150509250929050565b600080600080600060a08688031215613b2657613b25614d9c565b5b6000613b3488828901613982565b9550506020613b4588828901613982565b945050604086013567ffffffffffffffff811115613b6657613b65614d92565b5b613b72888289016139ed565b935050606086013567ffffffffffffffff811115613b9357613b92614d92565b5b613b9f888289016139ed565b925050608086013567ffffffffffffffff811115613bc057613bbf614d92565b5b613bcc88828901613a45565b9150509295509295909350565b600080600060608486031215613bf257613bf1614d9c565b5b6000613c0086828701613982565b9350506020613c1186828701613982565b9250506040613c2286828701613a73565b9150509250925092565b600080600080600060a08688031215613c4857613c47614d9c565b5b6000613c5688828901613982565b9550506020613c6788828901613982565b9450506040613c7888828901613a73565b9350506060613c8988828901613a73565b925050608086013567ffffffffffffffff811115613caa57613ca9614d92565b5b613cb688828901613a45565b9150509295509295909350565b60008060008060008060808789031215613ce057613cdf614d9c565b5b6000613cee89828a01613982565b965050602087013567ffffffffffffffff811115613d0f57613d0e614d92565b5b613d1b89828a01613997565b9550955050604087013567ffffffffffffffff811115613d3e57613d3d614d92565b5b613d4a89828a01613997565b93509350506060613d5d89828a01613982565b9150509295509295509295565b60008060408385031215613d8157613d80614d9c565b5b6000613d8f85828601613982565b9250506020613da085828601613a1b565b9150509250929050565b60008060408385031215613dc157613dc0614d9c565b5b6000613dcf85828601613982565b9250506020613de085828601613a73565b9150509250929050565b60008060208385031215613e0157613e00614d9c565b5b600083013567ffffffffffffffff811115613e1f57613e1e614d92565b5b613e2b85828601613997565b92509250509250929050565b600060208284031215613e4d57613e4c614d9c565b5b6000613e5b84828501613a30565b91505092915050565b600060208284031215613e7a57613e79614d9c565b5b6000613e8884828501613a73565b91505092915050565b60008060408385031215613ea857613ea7614d9c565b5b6000613eb685828601613a88565b9250506020613ec785828601613a88565b9150509250929050565b6000613edd83836142c5565b60208301905092915050565b613ef281614aa9565b82525050565b6000613f04838561484a565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613f3757613f36614d97565b5b602083029250613f48838584614b4c565b82840190509392505050565b6000613f5f82614827565b613f69818561484a565b9350613f7483614817565b8060005b83811015613fa5578151613f8c8882613ed1565b9750613f978361483d565b925050600181019050613f78565b5085935050505092915050565b613fbb81614abb565b82525050565b613fca81614ac7565b82525050565b6000613fdb82614832565b613fe5818561486c565b9350613ff5818560208601614b5b565b613ffe81614da1565b840191505092915050565b600061401660238361486c565b915061402182614db2565b604082019050919050565b600061403960228361486c565b915061404482614e01565b604082019050919050565b600061405c60268361486c565b915061406782614e50565b604082019050919050565b600061407f60228361486c565b915061408a82614e9f565b604082019050919050565b60006140a260118361486c565b91506140ad82614eee565b602082019050919050565b60006140c560268361486c565b91506140d082614f17565b604082019050919050565b60006140e860118361486c565b91506140f382614f66565b602082019050919050565b600061410b60288361486c565b915061411682614f8f565b604082019050919050565b600061412e60208361486c565b915061413982614fde565b602082019050919050565b600061415160218361486c565b915061415c82615007565b604082019050919050565b6000614174600e8361486c565b915061417f82615056565b602082019050919050565b600061419760258361486c565b91506141a28261507f565b604082019050919050565b60006141ba60008361485b565b91506141c5826150ce565b600082019050919050565b60006141dd60248361486c565b91506141e8826150d1565b604082019050919050565b6000614200600b8361486c565b915061420b82615120565b602082019050919050565b600061422360148361486c565b915061422e82615149565b602082019050919050565b6000614246601f8361486c565b915061425182615172565b602082019050919050565b600061426960088361486c565b91506142748261519b565b602082019050919050565b600061428c60258361486c565b9150614297826151c4565b604082019050919050565b60006142af601f8361486c565b91506142ba82615213565b602082019050919050565b6142ce81614b13565b82525050565b6142dd81614b13565b82525050565b6142ec81614b1d565b82525050565b6142fb81614b3a565b82525050565b61430a81614b2d565b82525050565b60006020820190506143256000830184613ee9565b92915050565b600060a0820190506143406000830189613ee9565b61434d6020830188613ee9565b8181036040830152614360818688613ef8565b90508181036060830152614375818486613ef8565b90508181036080830152614388816141ad565b9050979650505050505050565b60006060820190506143aa6000830186613ee9565b6143b76020830185613ee9565b6143c460408301846142d4565b949350505050565b600060a0820190506143e16000830187613ee9565b6143ee6020830186613ee9565b6143fb60408301856142d4565b61440860608301846142f2565b8181036080830152614419816141ad565b905095945050505050565b6000602082019050818103600083015261443e8184613f54565b905092915050565b600060208201905061445b6000830184613fb2565b92915050565b60006020820190506144766000830184613fc1565b92915050565b600060208201905081810360008301526144968184613fd0565b905092915050565b600060208201905081810360008301526144b781614009565b9050919050565b600060208201905081810360008301526144d78161402c565b9050919050565b600060208201905081810360008301526144f78161404f565b9050919050565b6000602082019050818103600083015261451781614072565b9050919050565b6000602082019050818103600083015261453781614095565b9050919050565b60006020820190508181036000830152614557816140b8565b9050919050565b60006020820190508181036000830152614577816140db565b9050919050565b60006020820190508181036000830152614597816140fe565b9050919050565b600060208201905081810360008301526145b781614121565b9050919050565b600060208201905081810360008301526145d781614144565b9050919050565b600060208201905081810360008301526145f781614167565b9050919050565b600060208201905081810360008301526146178161418a565b9050919050565b60006020820190508181036000830152614637816141d0565b9050919050565b60006020820190508181036000830152614657816141f3565b9050919050565b6000602082019050818103600083015261467781614216565b9050919050565b6000602082019050818103600083015261469781614239565b9050919050565b600060208201905081810360008301526146b78161425c565b9050919050565b600060208201905081810360008301526146d78161427f565b9050919050565b600060208201905081810360008301526146f7816142a2565b9050919050565b600060208201905061471360008301846142d4565b92915050565b600060c08201905061472e60008301896142e3565b61473b60208301886142e3565b61474860408301876142e3565b61475560608301866142e3565b6147626080830185614301565b61476f60a0830184614301565b979650505050505050565b600060208201905061478f6000830184614301565b92915050565b600061479f6147b0565b90506147ab8282614bea565b919050565b6000604051905090565b600067ffffffffffffffff8211156147d5576147d4614d4f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561480157614800614d4f565b5b61480a82614da1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061488882614b13565b915061489383614b13565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148c8576148c7614c64565b5b828201905092915050565b60006148de82614b1d565b91506148e983614b1d565b92508263ffffffff0382111561490257614901614c64565b5b828201905092915050565b600061491882614b2d565b915061492383614b2d565b92508260ff0382111561493957614938614c64565b5b828201905092915050565b600061494f82614b13565b915061495a83614b13565b92508261496a57614969614c93565b5b828204905092915050565b600061498082614b13565b915061498b83614b13565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149c4576149c3614c64565b5b828202905092915050565b60006149da82614b1d565b91506149e583614b1d565b92508163ffffffff0483118215151615614a0257614a01614c64565b5b828202905092915050565b6000614a1882614b13565b9150614a2383614b13565b925082821015614a3657614a35614c64565b5b828203905092915050565b6000614a4c82614b1d565b9150614a5783614b1d565b925082821015614a6a57614a69614c64565b5b828203905092915050565b6000614a8082614b2d565b9150614a8b83614b2d565b925082821015614a9e57614a9d614c64565b5b828203905092915050565b6000614ab482614af3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b6000614b4582614b2d565b9050919050565b82818337600083830152505050565b60005b83811015614b79578082015181840152602081019050614b5e565b83811115614b88576000848401525b50505050565b6000614b9982614b13565b91506000821415614bad57614bac614c64565b5b600182039050919050565b60006002820490506001821680614bd057607f821691505b60208210811415614be457614be3614cc2565b5b50919050565b614bf382614da1565b810181811067ffffffffffffffff82111715614c1257614c11614d4f565b5b80604052505050565b6000614c2682614b13565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c5957614c58614c64565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d41585f544f4b454e535f5354414b4544000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4e454544535f544f5f42455f4f574e4552000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f545f434f4e54524f4c4c4552000000000000000000000000000000000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f4e455f5354414b4544000000000000000000000000000000000000000000600082015250565b7f4e6f20746f6b656e7320746f20756e7374616b65000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e4f545f4c495645000000000000000000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61524581614aa9565b811461525057600080fd5b50565b61525c81614abb565b811461526757600080fd5b50565b61527381614ac7565b811461527e57600080fd5b50565b61528a81614b13565b811461529557600080fd5b50565b6152a181614b2d565b81146152ac57600080fd5b5056fea2646970667358221220b1e86d8845da0ae5c9f2f91afc133b257da56d3163d4c8ad536a9499b398962164736f6c63430008070033

Deployed Bytecode Sourcemap

22120:15572:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22413:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13121:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32994:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33936:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22468:53;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22366:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32726:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31550:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33327:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26179:986;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34117:572;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25014:603;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33222:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30142:630;;;:::i;:::-;;24635:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34701:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23467:62;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;31474:68;;;:::i;:::-;;32352:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29481:653;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24383:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28531:942;;;:::i;:::-;;22909:118;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24245:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22588:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33447:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27173:1350;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7489:103;;;:::i;:::-;;22685:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6838:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23034:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33106:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22528:53;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32467:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34928:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33586:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25625:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31248:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13859:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30780:460;;;:::i;:::-;;23746:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33773:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32586:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24515:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22784:118;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13624:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22413:48;22453:8;22413:48;:::o;13121:223::-;13223:4;13262:34;13247:49;;;:11;:49;;;;:89;;;;13300:36;13324:11;13300:23;:36::i;:::-;13247:89;13240:96;;13121:223;;;:::o;32994:100::-;33048:13;33081:5;33074:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32994:100;:::o;33936:169::-;34019:4;34036:39;34045:12;:10;:12::i;:::-;34059:7;34068:6;34036:8;:39::i;:::-;34093:4;34086:11;;33936:169;;;;:::o;22468:53::-;22513:8;22468:53;:::o;22366:40::-;;;;:::o;32726:161::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32869:10:::1;32828:19;:38;32848:17;32828:38;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;32726:161:::0;;:::o;31550:104::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31639:7:::1;31624:12;:22;;;;31550:104:::0;:::o;33327:108::-;33388:7;33415:12;;33408:19;;33327:108;:::o;26179:986::-;24048:4;;;;;;;;;;;:38;;;;;24074:12;;24056:15;:30;24048:38;24040:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3936:1:::1;4534:7;;:19;;4526:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3936:1;4667:7;:18;;;;26277:38:::2;26318:17;:29;26336:10;26318:29;;;;;;;;;;;;;;;26277:70;;26358:17;26378:21;:19;:21::i;:::-;26358:41;;26423:1;26416:4;:8;;;26412:361;;;26529:12;:23;;;;;;;;;;;;26477:75;;26498:12;:27;;;;;;;;;;;;26485:9;26478:47;;;;:::i;:::-;26477:75;;;;:::i;:::-;26441:12;:32;;;:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26604:9;26567:12;:27;;;:47;;;;;;;;;;;;;;;;;;26656:4;26629:12;:23;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22735:42;26677:31;;;26709:10;26729:4;22825:77;26752:4;26677:84;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;26412:361;26796:1;26789:4;:8;;;26785:373;;;26902:12;:23;;;;;;;;;;;;26850:75;;26871:12;:27;;;;;;;;;;;;26858:9;26851:47;;;;:::i;:::-;26850:75;;;;:::i;:::-;26814:12;:32;;;:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26977:9;26940:12;:27;;;:47;;;;;;;;;;;;;;;;;;27029:4;27002:12;:23;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22735:42;27062:31;;;27094:10;27114:4;22950:77;27137:4;27062:84;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;26785:373;26266:899;;3892:1:::1;4846:7:::0;:22:::1;;;;26179:986:::0;;:::o;34117:572::-;34257:4;34274:36;34284:6;34292:9;34303:6;34274:9;:36::i;:::-;34328:19;:31;34348:10;34328:31;;;;;;;;;;;;;;;;;;;;;;;;;34323:335;;34376:24;34403:11;:19;34415:6;34403:19;;;;;;;;;;;;;;;:33;34423:12;:10;:12::i;:::-;34403:33;;;;;;;;;;;;;;;;34376:60;;34479:6;34459:16;:26;;34451:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;34574:57;34583:6;34591:12;:10;:12::i;:::-;34624:6;34605:16;:25;34574:8;:57::i;:::-;34361:297;34323:335;34677:4;34670:11;;34117:572;;;;;:::o;25014:603::-;25082:7;25102:38;25143:17;:25;25161:6;25143:25;;;;;;;;;;;;;;;25102:66;;25179:20;25212:17;25232:21;:19;:21::i;:::-;25212:41;;25410:5;22513:8;25353:12;:32;;;;;;;;;;;;25281:104;;25326:12;:23;;;;;;;;;;;;25282:67;;25295:12;:27;;;;;;;;;;;;25283:39;;:9;:39;;;;:::i;:::-;25282:67;;;;:::i;:::-;25281:104;;;;:::i;:::-;25280:127;;;;:::i;:::-;:135;;;;:::i;:::-;25264:151;;;;;:::i;:::-;;;25572:5;22573:8;25515:12;:32;;;;;;;;;;;;25443:104;;25488:12;:23;;;;;;;;;;;;25444:67;;25457:12;:27;;;;;;;;;;;;25445:39;;:9;:39;;;;:::i;:::-;25444:67;;;;:::i;:::-;25443:104;;;;:::i;:::-;25442:127;;;;:::i;:::-;:135;;;;:::i;:::-;25426:151;;;;;:::i;:::-;;;25597:12;25590:19;;;;;25014:603;;;:::o;33222:93::-;33280:5;33305:2;33298:9;;33222:93;:::o;30142:630::-;30222:1;30192:27;30208:10;30192:15;:27::i;:::-;:31;30184:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30250:20;30285:17;30305:21;:19;:21::i;:::-;30285:41;;30344:9;30356:12;:24;30369:10;30356:24;;;;;;;;;;;;;;;:31;;;;30344:43;;30339:382;30393:1;30389;:5;30339:382;;;30416:10;30429:12;:24;30442:10;30429:24;;;;;;;;;;;;;;;30458:1;30454;:5;;;;:::i;:::-;30429:31;;;;;;;;:::i;:::-;;;;;;;;;;30416:44;;22636:42;30477:28;;;30514:4;30521:10;30533:2;30477:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30614:5;22453:8;30580:10;:14;30591:2;30580:14;;;;;;;;;;;;30568:9;:26;;;;:::i;:::-;30567:44;;;;:::i;:::-;:52;;;;:::i;:::-;30551:68;;;;;:::i;:::-;;;30636:12;:24;30649:10;30636:24;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30707:1;30681:11;:15;30693:2;30681:15;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;30401:320;30396:3;;;;;:::i;:::-;;;;30339:382;;;;30733:31;30739:10;30751:12;30733:5;:31::i;:::-;30173:599;;30142:630::o;24635:371::-;24695:7;24715:20;24738:1;24715:24;;24752:23;24778:12;:20;24791:6;24778:20;;;;;;;;;;;;;;;24752:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24814:9;24809:158;24833:6;:13;24829:1;:17;24809:158;;;24950:5;22453:8;24909:10;:21;24920:6;24927:1;24920:9;;;;;;;;:::i;:::-;;;;;;;;24909:21;;;;;;;;;;;;24885;:19;:21::i;:::-;:45;;;;:::i;:::-;24884:63;;;;:::i;:::-;:71;;;;:::i;:::-;24868:87;;;;;:::i;:::-;;;24848:3;;;;;:::i;:::-;;;;24809:158;;;;24986:12;24979:19;;;;24635:371;;;:::o;34701:215::-;34789:4;34806:80;34815:12;:10;:12::i;:::-;34829:7;34875:10;34838:11;:25;34850:12;:10;:12::i;:::-;34838:25;;;;;;;;;;;;;;;:34;34864:7;34838:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;34806:8;:80::i;:::-;34904:4;34897:11;;34701:215;;;;:::o;23467:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31474:68::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31530:4:::1;;;;;;;;;;;31529:5;31522:4;;:12;;;;;;;;;;;;;;;;;;31474:68::o:0;32352:107::-;24175:11;:23;24187:10;24175:23;;;;;;;;;;;;;;;;;;;;;;;;;24167:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;32434:17:::1;32440:2;32444:6;32434:5;:17::i;:::-;32352:107:::0;;:::o;29481:653::-;29552:20;29587:17;29607:21;:19;:21::i;:::-;29587:41;;29646:9;29641:442;29665:8;;:15;;29661:1;:19;29641:442;;;29702:10;29715:8;;29724:1;29715:11;;;;;;;:::i;:::-;;;;;;;;29702:24;;29768:10;29749:29;;:11;:15;29761:2;29749:15;;;;;;;;;;;;;;;;;;;;;:29;;;29741:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;22636:42;29817:28;;;29854:4;29861:10;29873:2;29817:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29954:5;22453:8;29920:10;:14;29931:2;29920:14;;;;;;;;;;;;29908:9;:26;;;;:::i;:::-;29907:44;;;;:::i;:::-;:52;;;;:::i;:::-;29891:68;;;;;:::i;:::-;;;29976:52;29999:12;:24;30012:10;29999:24;;;;;;;;;;;;;;;30025:2;29976:22;:52::i;:::-;30069:1;30043:11;:15;30055:2;30043:15;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;29687:396;29682:3;;;;;:::i;:::-;;;;29641:442;;;;30095:31;30101:10;30113:12;30095:5;:31::i;:::-;29541:593;;29481:653;;:::o;24383:124::-;24445:7;24472:12;:20;24485:6;24472:20;;;;;;;;;;;;;;;:27;;;;24465:34;;24383:124;;;:::o;28531:942::-;3936:1;4534:7;;:19;;4526:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3936:1;4667:7;:18;;;;28592:38:::1;28633:17;:29;28651:10;28633:29;;;;;;;;;;;;;;;28592:70;;28673:20;28704:17:::0;28724:21:::1;:19;:21::i;:::-;28704:41;;28788:1;28762:12;:23;;;;;;;;;;;;:27;;;28758:326;;;28952:5;22513:8;28895:12;:32;;;;;;;;;;;;28823:104;;28868:12;:23;;;;;;;;;;;;28824:67;;28837:12;:27;;;;;;;;;;;;28825:39;;:9;:39;;;;:::i;:::-;28824:67;;;;:::i;:::-;28823:104;;;;:::i;:::-;28822:127;;;;:::i;:::-;:135;;;;:::i;:::-;28806:151;;;;;:::i;:::-;;;29009:1;28974:12;:32;;;:36;;;;;;;;;;;;;;;;;;29062:9;29025:12;:27;;;:47;;;;;;;;;;;;;;;;;;28758:326;29126:1;29100:12;:23;;;;;;;;;;;;:27;;;29096:326;;;29290:5;22573:8;29233:12;:32;;;;;;;;;;;;29161:104;;29206:12;:23;;;;;;;;;;;;29162:67;;29175:12;:27;;;;;;;;;;;;29163:39;;:9;:39;;;;:::i;:::-;29162:67;;;;:::i;:::-;29161:104;;;;:::i;:::-;29160:127;;;;:::i;:::-;:135;;;;:::i;:::-;29144:151;;;;;:::i;:::-;;;29347:1;29312:12;:32;;;:36;;;;;;;;;;;;;;;;;;29400:9;29363:12;:27;;;:47;;;;;;;;;;;;;;;;;;29096:326;29434:31;29440:10;29452:12;29434:5;:31::i;:::-;28581:892;;;3892:1:::0;4846:7;:22;;;;28531:942::o;22909:118::-;22950:77;22909:118;:::o;24245:126::-;24307:16;24343:12;:20;24356:6;24343:20;;;;;;;;;;;;;;;24336:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24245:126;;;:::o;22588:90::-;22636:42;22588:90;:::o;33447:127::-;33521:7;33548:9;:18;33558:7;33548:18;;;;;;;;;;;;;;;;33541:25;;33447:127;;;:::o;27173:1350::-;3936:1;4534:7;;:19;;4526:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3936:1;4667:7;:18;;;;27273:1:::1;27266:4;:8;;;:20;;;;27285:1;27278:4;:8;;;27266:20;27258:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;27324:38;27365:17;:29;27383:10;27365:29;;;;;;;;;;;;;;;27324:70;;27405:20;27436:17:::0;27456:21:::1;:19;:21::i;:::-;27436:41;;27501:1;27494:4;:8;;;27490:485;;;27665:5;22513:8;27608:12;:32;;;;;;;;;;;;27536:104;;27581:12;:23;;;;;;;;;;;;27537:67;;27550:12;:27;;;;;;;;;;;;27538:39;;:9;:39;;;;:::i;:::-;27537:67;;;;:::i;:::-;27536:104;;;;:::i;:::-;27535:127;;;;:::i;:::-;:135;;;;:::i;:::-;27519:151;;;;;:::i;:::-;;;27722:1;27687:12;:32;;;:36;;;;;;;;;;;;;;;;;;27775:9;27738:12;:27;;;:47;;;;;;;;;;;;;;;;;;27827:4;27800:12;:23;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22735:42;27879:31;;;27919:4;27926:10;22825:77;27954:4;27879:84;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27490:485;27998:1;27991:4;:8;;;27987:485;;;28162:5;22573:8;28105:12;:32;;;;;;;;;;;;28033:104;;28078:12;:23;;;;;;;;;;;;28034:67;;28047:12;:27;;;;;;;;;;;;28035:39;;:9;:39;;;;:::i;:::-;28034:67;;;;:::i;:::-;28033:104;;;;:::i;:::-;28032:127;;;;:::i;:::-;:135;;;;:::i;:::-;28016:151;;;;;:::i;:::-;;;28219:1;28184:12;:32;;;:36;;;;;;;;;;;;;;;;;;28272:9;28235:12;:27;;;:47;;;;;;;;;;;;;;;;;;28324:4;28297:12;:23;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22735:42;28376:31;;;28416:4;28423:10;22950:77;28451:4;28376:84;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27987:485;28484:31;28490:10;28502:12;28484:5;:31::i;:::-;27247:1276;;;3892:1:::0;4846:7;:22;;;;27173:1350;;:::o;7489:103::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:30:::1;7581:1;7554:18;:30::i;:::-;7489:103::o:0;22685:92::-;22735:42;22685:92;:::o;6838:87::-;6884:7;6911:6;;;;;;;;;;;6904:13;;6838:87;:::o;23034:24::-;;;;;;;;;;;;;:::o;33106:104::-;33162:13;33195:7;33188:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33106:104;:::o;22528:53::-;22573:8;22528:53;:::o;32467:111::-;24175:11;:23;24187:10;24175:23;;;;;;;;;;;;;;;;;;;;;;;;;24167:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;32551:19:::1;32557:4;32563:6;32551:5;:19::i;:::-;32467:111:::0;;:::o;34928:413::-;35021:4;35038:24;35065:11;:25;35077:12;:10;:12::i;:::-;35065:25;;;;;;;;;;;;;;;:34;35091:7;35065:34;;;;;;;;;;;;;;;;35038:61;;35138:15;35118:16;:35;;35110:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35231:67;35240:12;:10;:12::i;:::-;35254:7;35282:15;35263:16;:34;35231:8;:67::i;:::-;35329:4;35322:11;;;34928:413;;;;:::o;33586:175::-;33672:4;33689:42;33699:12;:10;:12::i;:::-;33713:9;33724:6;33689:9;:42::i;:::-;33749:4;33742:11;;33586:175;;;;:::o;25625:546::-;24048:4;;;;;;;;;;;:38;;;;;24074:12;;24056:15;:30;24048:38;24040:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;25769:3:::1;25750:8;;:15;;25716:12;:24;25729:10;25716:24;;;;;;;;;;;;;;;:31;;;;:49;;;;:::i;:::-;:56;;25708:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;25805:17;25825:21;:19;:21::i;:::-;25805:41;;25864:9;25859:305;25883:8;;:15;;25879:1;:19;25859:305;;;25920:10;25933:8;;25942:1;25933:11;;;;;;;:::i;:::-;;;;;;;;25920:24;;22636:42;25959:28;;;25988:10;26008:4;26015:2;25959:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26035:12;:24;26048:10;26035:24;;;;;;;;;;;;;;;26065:2;26035:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26100:9;26083:10;:14;26094:2;26083:14;;;;;;;;;;;:26;;;;26142:10;26124:11;:15;26136:2;26124:15;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;25905:259;25900:3;;;;;:::i;:::-;;;;25859:305;;;;25697:474;25625:546:::0;;:::o;31248:214::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31389:5:::1;31380:37;;;31426:4;31433:2;31437:3;;31442:7;;31380:74;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31248:214:::0;;;;;;:::o;13859:255::-;14044:6;14070:36;;;14063:43;;13859:255;;;;;;;:::o;30780:460::-;30820:20;30855:17;30875:21;:19;:21::i;:::-;30855:41;;30909:23;30935:12;:24;30948:10;30935:24;;;;;;;;;;;;;;;30909:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30975:9;30970:219;30994:6;:13;30990:1;:17;30970:219;;;31029:10;31042:6;31049:1;31042:9;;;;;;;;:::i;:::-;;;;;;;;31029:22;;31131:5;22453:8;31097:10;:14;31108:2;31097:14;;;;;;;;;;;;31085:9;:26;;;;:::i;:::-;31084:44;;;;:::i;:::-;:52;;;;:::i;:::-;31068:68;;;;;:::i;:::-;;;31168:9;31151:10;:14;31162:2;31151:14;;;;;;;;;;;:26;;;;31014:175;31009:3;;;;;:::i;:::-;;;;30970:219;;;;31201:31;31207:10;31219:12;31201:5;:31::i;:::-;30809:431;;;30780:460::o;23746:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;33773:151::-;33862:7;33889:11;:18;33901:5;33889:18;;;;;;;;;;;;;;;:27;33908:7;33889:27;;;;;;;;;;;;;;;;33882:34;;33773:151;;;;:::o;32586:132::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32700:10:::1;32674:11;:23;32686:10;32674:23;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;32586:132:::0;;:::o;24515:112::-;24572:7;24599:11;:20;24611:7;24599:20;;;;;;;;;;;;;;;;;;;;;24592:27;;24515:112;;;:::o;22784:118::-;22825:77;22784:118;:::o;13624:227::-;13786:6;13812:31;;;13805:38;;13624:227;;;;;;;:::o;7747:201::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7856:1:::1;7836:22;;:8;:22;;;;7828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7912:28;7931:8;7912:18;:28::i;:::-;7747:201:::0;:::o;10088:157::-;10173:4;10212:25;10197:40;;;:11;:40;;;;10190:47;;10088:157;;;:::o;5562:98::-;5615:7;5642:10;5635:17;;5562:98;:::o;37112:380::-;37265:1;37248:19;;:5;:19;;;;37240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37346:1;37327:21;;:7;:21;;;;37319:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37430:6;37400:11;:18;37412:5;37400:18;;;;;;;;;;;;;;;:27;37419:7;37400:27;;;;;;;;;;;;;;;:36;;;;37468:7;37452:32;;37461:5;37452:32;;;37477:6;37452:32;;;;;;:::i;:::-;;;;;;;;37112:380;;;:::o;31662:152::-;31716:7;31761:12;;31743:15;:30;:63;;31794:12;;31743:63;;;31776:15;31743:63;31736:70;;31662:152;:::o;35353:733::-;35511:1;35493:20;;:6;:20;;;;35485:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;35595:1;35574:23;;:9;:23;;;;35566:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35650:47;35671:6;35679:9;35690:6;35650:20;:47::i;:::-;35710:21;35734:9;:17;35744:6;35734:17;;;;;;;;;;;;;;;;35710:41;;35787:6;35770:13;:23;;35762:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35908:6;35892:13;:22;35872:9;:17;35882:6;35872:17;;;;;;;;;;;;;;;:42;;;;35960:6;35936:9;:20;35946:9;35936:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;36001:9;35984:35;;35993:6;35984:35;;;36012:6;35984:35;;;;;;:::i;:::-;;;;;;;;36032:46;36052:6;36060:9;36071:6;36032:19;:46::i;:::-;35474:612;35353:733;;;:::o;36098:399::-;36201:1;36182:21;;:7;:21;;;;36174:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36252:49;36281:1;36285:7;36294:6;36252:20;:49::i;:::-;36330:6;36314:12;;:22;;;;;;;:::i;:::-;;;;;;;;36369:6;36347:9;:18;36357:7;36347:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;36412:7;36391:37;;36408:1;36391:37;;;36421:6;36391:37;;;;;;:::i;:::-;;;;;;;;36441:48;36469:1;36473:7;36482:6;36441:19;:48::i;:::-;36098:399;;:::o;31822:427::-;31916:14;31933:5;:12;;;;31916:29;;31961:9;31956:286;31980:6;31976:1;:10;31956:286;;;32024:7;32012:5;32018:1;32012:8;;;;;;;;:::i;:::-;;;;;;;;;;:19;32008:223;;;32052:8;;;;;:::i;:::-;;;;32087:6;32083:1;:10;32079:83;;;32129:5;32135:6;32129:13;;;;;;;;:::i;:::-;;;;;;;;;;32118:5;32124:1;32118:8;;;;;;;;:::i;:::-;;;;;;;;;:24;;;;32079:83;32180:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32210:5;;32008:223;31988:3;;;;;:::i;:::-;;;;31956:286;;;;31905:344;31822:427;;:::o;8108:191::-;8182:16;8201:6;;;;;;;;;;;8182:25;;8227:8;8218:6;;:17;;;;;;;;;;;;;;;;;;8282:8;8251:40;;8272:8;8251:40;;;;;;;;;;;;8171:128;8108:191;:::o;36509:591::-;36612:1;36593:21;;:7;:21;;;;36585:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36665:49;36686:7;36703:1;36707:6;36665:20;:49::i;:::-;36727:22;36752:9;:18;36762:7;36752:18;;;;;;;;;;;;;;;;36727:43;;36807:6;36789:14;:24;;36781:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36926:6;36909:14;:23;36888:9;:18;36898:7;36888:18;;;;;;;;;;;;;;;:44;;;;36970:6;36954:12;;:22;;;;;;;:::i;:::-;;;;;;;;37020:1;36994:37;;37003:7;36994:37;;;37024:6;36994:37;;;;;;:::i;:::-;;;;;;;;37044:48;37064:7;37081:1;37085:6;37044:19;:48::i;:::-;36574:526;36509:591;;:::o;37500:91::-;;;;:::o;37599:90::-;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:568::-;1403:8;1413:6;1463:3;1456:4;1448:6;1444:17;1440:27;1430:122;;1471:79;;:::i;:::-;1430:122;1584:6;1571:20;1561:30;;1614:18;1606:6;1603:30;1600:117;;;1636:79;;:::i;:::-;1600:117;1750:4;1742:6;1738:17;1726:29;;1804:3;1796:4;1788:6;1784:17;1774:8;1770:32;1767:41;1764:128;;;1811:79;;:::i;:::-;1764:128;1330:568;;;;;:::o;1921:370::-;1992:5;2041:3;2034:4;2026:6;2022:17;2018:27;2008:122;;2049:79;;:::i;:::-;2008:122;2166:6;2153:20;2191:94;2281:3;2273:6;2266:4;2258:6;2254:17;2191:94;:::i;:::-;2182:103;;1998:293;1921:370;;;;:::o;2297:133::-;2340:5;2378:6;2365:20;2356:29;;2394:30;2418:5;2394:30;:::i;:::-;2297:133;;;;:::o;2436:137::-;2481:5;2519:6;2506:20;2497:29;;2535:32;2561:5;2535:32;:::i;:::-;2436:137;;;;:::o;2592:338::-;2647:5;2696:3;2689:4;2681:6;2677:17;2673:27;2663:122;;2704:79;;:::i;:::-;2663:122;2821:6;2808:20;2846:78;2920:3;2912:6;2905:4;2897:6;2893:17;2846:78;:::i;:::-;2837:87;;2653:277;2592:338;;;;:::o;2936:139::-;2982:5;3020:6;3007:20;2998:29;;3036:33;3063:5;3036:33;:::i;:::-;2936:139;;;;:::o;3081:135::-;3125:5;3163:6;3150:20;3141:29;;3179:31;3204:5;3179:31;:::i;:::-;3081:135;;;;:::o;3222:329::-;3281:6;3330:2;3318:9;3309:7;3305:23;3301:32;3298:119;;;3336:79;;:::i;:::-;3298:119;3456:1;3481:53;3526:7;3517:6;3506:9;3502:22;3481:53;:::i;:::-;3471:63;;3427:117;3222:329;;;;:::o;3557:474::-;3625:6;3633;3682:2;3670:9;3661:7;3657:23;3653:32;3650:119;;;3688:79;;:::i;:::-;3650:119;3808:1;3833:53;3878:7;3869:6;3858:9;3854:22;3833:53;:::i;:::-;3823:63;;3779:117;3935:2;3961:53;4006:7;3997:6;3986:9;3982:22;3961:53;:::i;:::-;3951:63;;3906:118;3557:474;;;;;:::o;4037:1509::-;4191:6;4199;4207;4215;4223;4272:3;4260:9;4251:7;4247:23;4243:33;4240:120;;;4279:79;;:::i;:::-;4240:120;4399:1;4424:53;4469:7;4460:6;4449:9;4445:22;4424:53;:::i;:::-;4414:63;;4370:117;4526:2;4552:53;4597:7;4588:6;4577:9;4573:22;4552:53;:::i;:::-;4542:63;;4497:118;4682:2;4671:9;4667:18;4654:32;4713:18;4705:6;4702:30;4699:117;;;4735:79;;:::i;:::-;4699:117;4840:78;4910:7;4901:6;4890:9;4886:22;4840:78;:::i;:::-;4830:88;;4625:303;4995:2;4984:9;4980:18;4967:32;5026:18;5018:6;5015:30;5012:117;;;5048:79;;:::i;:::-;5012:117;5153:78;5223:7;5214:6;5203:9;5199:22;5153:78;:::i;:::-;5143:88;;4938:303;5308:3;5297:9;5293:19;5280:33;5340:18;5332:6;5329:30;5326:117;;;5362:79;;:::i;:::-;5326:117;5467:62;5521:7;5512:6;5501:9;5497:22;5467:62;:::i;:::-;5457:72;;5251:288;4037:1509;;;;;;;;:::o;5552:619::-;5629:6;5637;5645;5694:2;5682:9;5673:7;5669:23;5665:32;5662:119;;;5700:79;;:::i;:::-;5662:119;5820:1;5845:53;5890:7;5881:6;5870:9;5866:22;5845:53;:::i;:::-;5835:63;;5791:117;5947:2;5973:53;6018:7;6009:6;5998:9;5994:22;5973:53;:::i;:::-;5963:63;;5918:118;6075:2;6101:53;6146:7;6137:6;6126:9;6122:22;6101:53;:::i;:::-;6091:63;;6046:118;5552:619;;;;;:::o;6177:1089::-;6281:6;6289;6297;6305;6313;6362:3;6350:9;6341:7;6337:23;6333:33;6330:120;;;6369:79;;:::i;:::-;6330:120;6489:1;6514:53;6559:7;6550:6;6539:9;6535:22;6514:53;:::i;:::-;6504:63;;6460:117;6616:2;6642:53;6687:7;6678:6;6667:9;6663:22;6642:53;:::i;:::-;6632:63;;6587:118;6744:2;6770:53;6815:7;6806:6;6795:9;6791:22;6770:53;:::i;:::-;6760:63;;6715:118;6872:2;6898:53;6943:7;6934:6;6923:9;6919:22;6898:53;:::i;:::-;6888:63;;6843:118;7028:3;7017:9;7013:19;7000:33;7060:18;7052:6;7049:30;7046:117;;;7082:79;;:::i;:::-;7046:117;7187:62;7241:7;7232:6;7221:9;7217:22;7187:62;:::i;:::-;7177:72;;6971:288;6177:1089;;;;;;;;:::o;7272:1225::-;7412:6;7420;7428;7436;7444;7452;7501:3;7489:9;7480:7;7476:23;7472:33;7469:120;;;7508:79;;:::i;:::-;7469:120;7628:1;7653:53;7698:7;7689:6;7678:9;7674:22;7653:53;:::i;:::-;7643:63;;7599:117;7783:2;7772:9;7768:18;7755:32;7814:18;7806:6;7803:30;7800:117;;;7836:79;;:::i;:::-;7800:117;7949:80;8021:7;8012:6;8001:9;7997:22;7949:80;:::i;:::-;7931:98;;;;7726:313;8106:2;8095:9;8091:18;8078:32;8137:18;8129:6;8126:30;8123:117;;;8159:79;;:::i;:::-;8123:117;8272:80;8344:7;8335:6;8324:9;8320:22;8272:80;:::i;:::-;8254:98;;;;8049:313;8401:2;8427:53;8472:7;8463:6;8452:9;8448:22;8427:53;:::i;:::-;8417:63;;8372:118;7272:1225;;;;;;;;:::o;8503:468::-;8568:6;8576;8625:2;8613:9;8604:7;8600:23;8596:32;8593:119;;;8631:79;;:::i;:::-;8593:119;8751:1;8776:53;8821:7;8812:6;8801:9;8797:22;8776:53;:::i;:::-;8766:63;;8722:117;8878:2;8904:50;8946:7;8937:6;8926:9;8922:22;8904:50;:::i;:::-;8894:60;;8849:115;8503:468;;;;;:::o;8977:474::-;9045:6;9053;9102:2;9090:9;9081:7;9077:23;9073:32;9070:119;;;9108:79;;:::i;:::-;9070:119;9228:1;9253:53;9298:7;9289:6;9278:9;9274:22;9253:53;:::i;:::-;9243:63;;9199:117;9355:2;9381:53;9426:7;9417:6;9406:9;9402:22;9381:53;:::i;:::-;9371:63;;9326:118;8977:474;;;;;:::o;9457:559::-;9543:6;9551;9600:2;9588:9;9579:7;9575:23;9571:32;9568:119;;;9606:79;;:::i;:::-;9568:119;9754:1;9743:9;9739:17;9726:31;9784:18;9776:6;9773:30;9770:117;;;9806:79;;:::i;:::-;9770:117;9919:80;9991:7;9982:6;9971:9;9967:22;9919:80;:::i;:::-;9901:98;;;;9697:312;9457:559;;;;;:::o;10022:327::-;10080:6;10129:2;10117:9;10108:7;10104:23;10100:32;10097:119;;;10135:79;;:::i;:::-;10097:119;10255:1;10280:52;10324:7;10315:6;10304:9;10300:22;10280:52;:::i;:::-;10270:62;;10226:116;10022:327;;;;:::o;10355:329::-;10414:6;10463:2;10451:9;10442:7;10438:23;10434:32;10431:119;;;10469:79;;:::i;:::-;10431:119;10589:1;10614:53;10659:7;10650:6;10639:9;10635:22;10614:53;:::i;:::-;10604:63;;10560:117;10355:329;;;;:::o;10690:466::-;10754:6;10762;10811:2;10799:9;10790:7;10786:23;10782:32;10779:119;;;10817:79;;:::i;:::-;10779:119;10937:1;10962:51;11005:7;10996:6;10985:9;10981:22;10962:51;:::i;:::-;10952:61;;10908:115;11062:2;11088:51;11131:7;11122:6;11111:9;11107:22;11088:51;:::i;:::-;11078:61;;11033:116;10690:466;;;;;:::o;11162:179::-;11231:10;11252:46;11294:3;11286:6;11252:46;:::i;:::-;11330:4;11325:3;11321:14;11307:28;;11162:179;;;;:::o;11347:118::-;11434:24;11452:5;11434:24;:::i;:::-;11429:3;11422:37;11347:118;;:::o;11501:537::-;11629:3;11650:86;11729:6;11724:3;11650:86;:::i;:::-;11643:93;;11760:66;11752:6;11749:78;11746:165;;;11830:79;;:::i;:::-;11746:165;11942:4;11934:6;11930:17;11920:27;;11957:43;11993:6;11988:3;11981:5;11957:43;:::i;:::-;12025:6;12020:3;12016:16;12009:23;;11501:537;;;;;:::o;12074:732::-;12193:3;12222:54;12270:5;12222:54;:::i;:::-;12292:86;12371:6;12366:3;12292:86;:::i;:::-;12285:93;;12402:56;12452:5;12402:56;:::i;:::-;12481:7;12512:1;12497:284;12522:6;12519:1;12516:13;12497:284;;;12598:6;12592:13;12625:63;12684:3;12669:13;12625:63;:::i;:::-;12618:70;;12711:60;12764:6;12711:60;:::i;:::-;12701:70;;12557:224;12544:1;12541;12537:9;12532:14;;12497:284;;;12501:14;12797:3;12790:10;;12198:608;;;12074:732;;;;:::o;12812:109::-;12893:21;12908:5;12893:21;:::i;:::-;12888:3;12881:34;12812:109;;:::o;12927:115::-;13012:23;13029:5;13012:23;:::i;:::-;13007:3;13000:36;12927:115;;:::o;13048:364::-;13136:3;13164:39;13197:5;13164:39;:::i;:::-;13219:71;13283:6;13278:3;13219:71;:::i;:::-;13212:78;;13299:52;13344:6;13339:3;13332:4;13325:5;13321:16;13299:52;:::i;:::-;13376:29;13398:6;13376:29;:::i;:::-;13371:3;13367:39;13360:46;;13140:272;13048:364;;;;:::o;13418:366::-;13560:3;13581:67;13645:2;13640:3;13581:67;:::i;:::-;13574:74;;13657:93;13746:3;13657:93;:::i;:::-;13775:2;13770:3;13766:12;13759:19;;13418:366;;;:::o;13790:::-;13932:3;13953:67;14017:2;14012:3;13953:67;:::i;:::-;13946:74;;14029:93;14118:3;14029:93;:::i;:::-;14147:2;14142:3;14138:12;14131:19;;13790:366;;;:::o;14162:::-;14304:3;14325:67;14389:2;14384:3;14325:67;:::i;:::-;14318:74;;14401:93;14490:3;14401:93;:::i;:::-;14519:2;14514:3;14510:12;14503:19;;14162:366;;;:::o;14534:::-;14676:3;14697:67;14761:2;14756:3;14697:67;:::i;:::-;14690:74;;14773:93;14862:3;14773:93;:::i;:::-;14891:2;14886:3;14882:12;14875:19;;14534:366;;;:::o;14906:::-;15048:3;15069:67;15133:2;15128:3;15069:67;:::i;:::-;15062:74;;15145:93;15234:3;15145:93;:::i;:::-;15263:2;15258:3;15254:12;15247:19;;14906:366;;;:::o;15278:::-;15420:3;15441:67;15505:2;15500:3;15441:67;:::i;:::-;15434:74;;15517:93;15606:3;15517:93;:::i;:::-;15635:2;15630:3;15626:12;15619:19;;15278:366;;;:::o;15650:::-;15792:3;15813:67;15877:2;15872:3;15813:67;:::i;:::-;15806:74;;15889:93;15978:3;15889:93;:::i;:::-;16007:2;16002:3;15998:12;15991:19;;15650:366;;;:::o;16022:::-;16164:3;16185:67;16249:2;16244:3;16185:67;:::i;:::-;16178:74;;16261:93;16350:3;16261:93;:::i;:::-;16379:2;16374:3;16370:12;16363:19;;16022:366;;;:::o;16394:::-;16536:3;16557:67;16621:2;16616:3;16557:67;:::i;:::-;16550:74;;16633:93;16722:3;16633:93;:::i;:::-;16751:2;16746:3;16742:12;16735:19;;16394:366;;;:::o;16766:::-;16908:3;16929:67;16993:2;16988:3;16929:67;:::i;:::-;16922:74;;17005:93;17094:3;17005:93;:::i;:::-;17123:2;17118:3;17114:12;17107:19;;16766:366;;;:::o;17138:::-;17280:3;17301:67;17365:2;17360:3;17301:67;:::i;:::-;17294:74;;17377:93;17466:3;17377:93;:::i;:::-;17495:2;17490:3;17486:12;17479:19;;17138:366;;;:::o;17510:::-;17652:3;17673:67;17737:2;17732:3;17673:67;:::i;:::-;17666:74;;17749:93;17838:3;17749:93;:::i;:::-;17867:2;17862:3;17858:12;17851:19;;17510:366;;;:::o;17882:362::-;18023:3;18044:65;18107:1;18102:3;18044:65;:::i;:::-;18037:72;;18118:93;18207:3;18118:93;:::i;:::-;18236:1;18231:3;18227:11;18220:18;;17882:362;;;:::o;18250:366::-;18392:3;18413:67;18477:2;18472:3;18413:67;:::i;:::-;18406:74;;18489:93;18578:3;18489:93;:::i;:::-;18607:2;18602:3;18598:12;18591:19;;18250:366;;;:::o;18622:::-;18764:3;18785:67;18849:2;18844:3;18785:67;:::i;:::-;18778:74;;18861:93;18950:3;18861:93;:::i;:::-;18979:2;18974:3;18970:12;18963:19;;18622:366;;;:::o;18994:::-;19136:3;19157:67;19221:2;19216:3;19157:67;:::i;:::-;19150:74;;19233:93;19322:3;19233:93;:::i;:::-;19351:2;19346:3;19342:12;19335:19;;18994:366;;;:::o;19366:::-;19508:3;19529:67;19593:2;19588:3;19529:67;:::i;:::-;19522:74;;19605:93;19694:3;19605:93;:::i;:::-;19723:2;19718:3;19714:12;19707:19;;19366:366;;;:::o;19738:365::-;19880:3;19901:66;19965:1;19960:3;19901:66;:::i;:::-;19894:73;;19976:93;20065:3;19976:93;:::i;:::-;20094:2;20089:3;20085:12;20078:19;;19738:365;;;:::o;20109:366::-;20251:3;20272:67;20336:2;20331:3;20272:67;:::i;:::-;20265:74;;20348:93;20437:3;20348:93;:::i;:::-;20466:2;20461:3;20457:12;20450:19;;20109:366;;;:::o;20481:::-;20623:3;20644:67;20708:2;20703:3;20644:67;:::i;:::-;20637:74;;20720:93;20809:3;20720:93;:::i;:::-;20838:2;20833:3;20829:12;20822:19;;20481:366;;;:::o;20853:108::-;20930:24;20948:5;20930:24;:::i;:::-;20925:3;20918:37;20853:108;;:::o;20967:118::-;21054:24;21072:5;21054:24;:::i;:::-;21049:3;21042:37;20967:118;;:::o;21091:115::-;21176:23;21193:5;21176:23;:::i;:::-;21171:3;21164:36;21091:115;;:::o;21212:127::-;21297:35;21326:5;21297:35;:::i;:::-;21292:3;21285:48;21212:127;;:::o;21345:112::-;21428:22;21444:5;21428:22;:::i;:::-;21423:3;21416:35;21345:112;;:::o;21463:222::-;21556:4;21594:2;21583:9;21579:18;21571:26;;21607:71;21675:1;21664:9;21660:17;21651:6;21607:71;:::i;:::-;21463:222;;;;:::o;21691:1201::-;22088:4;22126:3;22115:9;22111:19;22103:27;;22140:71;22208:1;22197:9;22193:17;22184:6;22140:71;:::i;:::-;22221:72;22289:2;22278:9;22274:18;22265:6;22221:72;:::i;:::-;22340:9;22334:4;22330:20;22325:2;22314:9;22310:18;22303:48;22368:118;22481:4;22472:6;22464;22368:118;:::i;:::-;22360:126;;22533:9;22527:4;22523:20;22518:2;22507:9;22503:18;22496:48;22561:118;22674:4;22665:6;22657;22561:118;:::i;:::-;22553:126;;22727:9;22721:4;22717:20;22711:3;22700:9;22696:19;22689:49;22755:130;22880:4;22755:130;:::i;:::-;22747:138;;21691:1201;;;;;;;;;:::o;22898:442::-;23047:4;23085:2;23074:9;23070:18;23062:26;;23098:71;23166:1;23155:9;23151:17;23142:6;23098:71;:::i;:::-;23179:72;23247:2;23236:9;23232:18;23223:6;23179:72;:::i;:::-;23261;23329:2;23318:9;23314:18;23305:6;23261:72;:::i;:::-;22898:442;;;;;;:::o;23346:855::-;23621:4;23659:3;23648:9;23644:19;23636:27;;23673:71;23741:1;23730:9;23726:17;23717:6;23673:71;:::i;:::-;23754:72;23822:2;23811:9;23807:18;23798:6;23754:72;:::i;:::-;23836;23904:2;23893:9;23889:18;23880:6;23836:72;:::i;:::-;23918:70;23984:2;23973:9;23969:18;23960:6;23918:70;:::i;:::-;24036:9;24030:4;24026:20;24020:3;24009:9;24005:19;23998:49;24064:130;24189:4;24064:130;:::i;:::-;24056:138;;23346:855;;;;;;;:::o;24207:373::-;24350:4;24388:2;24377:9;24373:18;24365:26;;24437:9;24431:4;24427:20;24423:1;24412:9;24408:17;24401:47;24465:108;24568:4;24559:6;24465:108;:::i;:::-;24457:116;;24207:373;;;;:::o;24586:210::-;24673:4;24711:2;24700:9;24696:18;24688:26;;24724:65;24786:1;24775:9;24771:17;24762:6;24724:65;:::i;:::-;24586:210;;;;:::o;24802:218::-;24893:4;24931:2;24920:9;24916:18;24908:26;;24944:69;25010:1;24999:9;24995:17;24986:6;24944:69;:::i;:::-;24802:218;;;;:::o;25026:313::-;25139:4;25177:2;25166:9;25162:18;25154:26;;25226:9;25220:4;25216:20;25212:1;25201:9;25197:17;25190:47;25254:78;25327:4;25318:6;25254:78;:::i;:::-;25246:86;;25026:313;;;;:::o;25345:419::-;25511:4;25549:2;25538:9;25534:18;25526:26;;25598:9;25592:4;25588:20;25584:1;25573:9;25569:17;25562:47;25626:131;25752:4;25626:131;:::i;:::-;25618:139;;25345:419;;;:::o;25770:::-;25936:4;25974:2;25963:9;25959:18;25951:26;;26023:9;26017:4;26013:20;26009:1;25998:9;25994:17;25987:47;26051:131;26177:4;26051:131;:::i;:::-;26043:139;;25770:419;;;:::o;26195:::-;26361:4;26399:2;26388:9;26384:18;26376:26;;26448:9;26442:4;26438:20;26434:1;26423:9;26419:17;26412:47;26476:131;26602:4;26476:131;:::i;:::-;26468:139;;26195:419;;;:::o;26620:::-;26786:4;26824:2;26813:9;26809:18;26801:26;;26873:9;26867:4;26863:20;26859:1;26848:9;26844:17;26837:47;26901:131;27027:4;26901:131;:::i;:::-;26893:139;;26620:419;;;:::o;27045:::-;27211:4;27249:2;27238:9;27234:18;27226:26;;27298:9;27292:4;27288:20;27284:1;27273:9;27269:17;27262:47;27326:131;27452:4;27326:131;:::i;:::-;27318:139;;27045:419;;;:::o;27470:::-;27636:4;27674:2;27663:9;27659:18;27651:26;;27723:9;27717:4;27713:20;27709:1;27698:9;27694:17;27687:47;27751:131;27877:4;27751:131;:::i;:::-;27743:139;;27470:419;;;:::o;27895:::-;28061:4;28099:2;28088:9;28084:18;28076:26;;28148:9;28142:4;28138:20;28134:1;28123:9;28119:17;28112:47;28176:131;28302:4;28176:131;:::i;:::-;28168:139;;27895:419;;;:::o;28320:::-;28486:4;28524:2;28513:9;28509:18;28501:26;;28573:9;28567:4;28563:20;28559:1;28548:9;28544:17;28537:47;28601:131;28727:4;28601:131;:::i;:::-;28593:139;;28320:419;;;:::o;28745:::-;28911:4;28949:2;28938:9;28934:18;28926:26;;28998:9;28992:4;28988:20;28984:1;28973:9;28969:17;28962:47;29026:131;29152:4;29026:131;:::i;:::-;29018:139;;28745:419;;;:::o;29170:::-;29336:4;29374:2;29363:9;29359:18;29351:26;;29423:9;29417:4;29413:20;29409:1;29398:9;29394:17;29387:47;29451:131;29577:4;29451:131;:::i;:::-;29443:139;;29170:419;;;:::o;29595:::-;29761:4;29799:2;29788:9;29784:18;29776:26;;29848:9;29842:4;29838:20;29834:1;29823:9;29819:17;29812:47;29876:131;30002:4;29876:131;:::i;:::-;29868:139;;29595:419;;;:::o;30020:::-;30186:4;30224:2;30213:9;30209:18;30201:26;;30273:9;30267:4;30263:20;30259:1;30248:9;30244:17;30237:47;30301:131;30427:4;30301:131;:::i;:::-;30293:139;;30020:419;;;:::o;30445:::-;30611:4;30649:2;30638:9;30634:18;30626:26;;30698:9;30692:4;30688:20;30684:1;30673:9;30669:17;30662:47;30726:131;30852:4;30726:131;:::i;:::-;30718:139;;30445:419;;;:::o;30870:::-;31036:4;31074:2;31063:9;31059:18;31051:26;;31123:9;31117:4;31113:20;31109:1;31098:9;31094:17;31087:47;31151:131;31277:4;31151:131;:::i;:::-;31143:139;;30870:419;;;:::o;31295:::-;31461:4;31499:2;31488:9;31484:18;31476:26;;31548:9;31542:4;31538:20;31534:1;31523:9;31519:17;31512:47;31576:131;31702:4;31576:131;:::i;:::-;31568:139;;31295:419;;;:::o;31720:::-;31886:4;31924:2;31913:9;31909:18;31901:26;;31973:9;31967:4;31963:20;31959:1;31948:9;31944:17;31937:47;32001:131;32127:4;32001:131;:::i;:::-;31993:139;;31720:419;;;:::o;32145:::-;32311:4;32349:2;32338:9;32334:18;32326:26;;32398:9;32392:4;32388:20;32384:1;32373:9;32369:17;32362:47;32426:131;32552:4;32426:131;:::i;:::-;32418:139;;32145:419;;;:::o;32570:::-;32736:4;32774:2;32763:9;32759:18;32751:26;;32823:9;32817:4;32813:20;32809:1;32798:9;32794:17;32787:47;32851:131;32977:4;32851:131;:::i;:::-;32843:139;;32570:419;;;:::o;32995:::-;33161:4;33199:2;33188:9;33184:18;33176:26;;33248:9;33242:4;33238:20;33234:1;33223:9;33219:17;33212:47;33276:131;33402:4;33276:131;:::i;:::-;33268:139;;32995:419;;;:::o;33420:222::-;33513:4;33551:2;33540:9;33536:18;33528:26;;33564:71;33632:1;33621:9;33617:17;33608:6;33564:71;:::i;:::-;33420:222;;;;:::o;33648:743::-;33865:4;33903:3;33892:9;33888:19;33880:27;;33917:69;33983:1;33972:9;33968:17;33959:6;33917:69;:::i;:::-;33996:70;34062:2;34051:9;34047:18;34038:6;33996:70;:::i;:::-;34076;34142:2;34131:9;34127:18;34118:6;34076:70;:::i;:::-;34156;34222:2;34211:9;34207:18;34198:6;34156:70;:::i;:::-;34236:69;34300:3;34289:9;34285:19;34276:6;34236:69;:::i;:::-;34315;34379:3;34368:9;34364:19;34355:6;34315:69;:::i;:::-;33648:743;;;;;;;;;:::o;34397:214::-;34486:4;34524:2;34513:9;34509:18;34501:26;;34537:67;34601:1;34590:9;34586:17;34577:6;34537:67;:::i;:::-;34397:214;;;;:::o;34617:129::-;34651:6;34678:20;;:::i;:::-;34668:30;;34707:33;34735:4;34727:6;34707:33;:::i;:::-;34617:129;;;:::o;34752:75::-;34785:6;34818:2;34812:9;34802:19;;34752:75;:::o;34833:311::-;34910:4;35000:18;34992:6;34989:30;34986:56;;;35022:18;;:::i;:::-;34986:56;35072:4;35064:6;35060:17;35052:25;;35132:4;35126;35122:15;35114:23;;34833:311;;;:::o;35150:307::-;35211:4;35301:18;35293:6;35290:30;35287:56;;;35323:18;;:::i;:::-;35287:56;35361:29;35383:6;35361:29;:::i;:::-;35353:37;;35445:4;35439;35435:15;35427:23;;35150:307;;;:::o;35463:132::-;35530:4;35553:3;35545:11;;35583:4;35578:3;35574:14;35566:22;;35463:132;;;:::o;35601:114::-;35668:6;35702:5;35696:12;35686:22;;35601:114;;;:::o;35721:99::-;35773:6;35807:5;35801:12;35791:22;;35721:99;;;:::o;35826:113::-;35896:4;35928;35923:3;35919:14;35911:22;;35826:113;;;:::o;35945:184::-;36044:11;36078:6;36073:3;36066:19;36118:4;36113:3;36109:14;36094:29;;35945:184;;;;:::o;36135:168::-;36218:11;36252:6;36247:3;36240:19;36292:4;36287:3;36283:14;36268:29;;36135:168;;;;:::o;36309:169::-;36393:11;36427:6;36422:3;36415:19;36467:4;36462:3;36458:14;36443:29;;36309:169;;;;:::o;36484:305::-;36524:3;36543:20;36561:1;36543:20;:::i;:::-;36538:25;;36577:20;36595:1;36577:20;:::i;:::-;36572:25;;36731:1;36663:66;36659:74;36656:1;36653:81;36650:107;;;36737:18;;:::i;:::-;36650:107;36781:1;36778;36774:9;36767:16;;36484:305;;;;:::o;36795:246::-;36834:3;36853:19;36870:1;36853:19;:::i;:::-;36848:24;;36886:19;36903:1;36886:19;:::i;:::-;36881:24;;36983:1;36971:10;36967:18;36964:1;36961:25;36958:51;;;36989:18;;:::i;:::-;36958:51;37033:1;37030;37026:9;37019:16;;36795:246;;;;:::o;37047:237::-;37085:3;37104:18;37120:1;37104:18;:::i;:::-;37099:23;;37136:18;37152:1;37136:18;:::i;:::-;37131:23;;37226:1;37220:4;37216:12;37213:1;37210:19;37207:45;;;37232:18;;:::i;:::-;37207:45;37276:1;37273;37269:9;37262:16;;37047:237;;;;:::o;37290:185::-;37330:1;37347:20;37365:1;37347:20;:::i;:::-;37342:25;;37381:20;37399:1;37381:20;:::i;:::-;37376:25;;37420:1;37410:35;;37425:18;;:::i;:::-;37410:35;37467:1;37464;37460:9;37455:14;;37290:185;;;;:::o;37481:348::-;37521:7;37544:20;37562:1;37544:20;:::i;:::-;37539:25;;37578:20;37596:1;37578:20;:::i;:::-;37573:25;;37766:1;37698:66;37694:74;37691:1;37688:81;37683:1;37676:9;37669:17;37665:105;37662:131;;;37773:18;;:::i;:::-;37662:131;37821:1;37818;37814:9;37803:20;;37481:348;;;;:::o;37835:289::-;37874:7;37897:19;37914:1;37897:19;:::i;:::-;37892:24;;37930:19;37947:1;37930:19;:::i;:::-;37925:24;;38061:1;38049:10;38045:18;38042:1;38039:25;38034:1;38027:9;38020:17;38016:49;38013:75;;;38068:18;;:::i;:::-;38013:75;38116:1;38113;38109:9;38098:20;;37835:289;;;;:::o;38130:191::-;38170:4;38190:20;38208:1;38190:20;:::i;:::-;38185:25;;38224:20;38242:1;38224:20;:::i;:::-;38219:25;;38263:1;38260;38257:8;38254:34;;;38268:18;;:::i;:::-;38254:34;38313:1;38310;38306:9;38298:17;;38130:191;;;;:::o;38327:188::-;38366:4;38386:19;38403:1;38386:19;:::i;:::-;38381:24;;38419:19;38436:1;38419:19;:::i;:::-;38414:24;;38457:1;38454;38451:8;38448:34;;;38462:18;;:::i;:::-;38448:34;38507:1;38504;38500:9;38492:17;;38327:188;;;;:::o;38521:185::-;38559:4;38579:18;38595:1;38579:18;:::i;:::-;38574:23;;38611:18;38627:1;38611:18;:::i;:::-;38606:23;;38648:1;38645;38642:8;38639:34;;;38653:18;;:::i;:::-;38639:34;38698:1;38695;38691:9;38683:17;;38521:185;;;;:::o;38712:96::-;38749:7;38778:24;38796:5;38778:24;:::i;:::-;38767:35;;38712:96;;;:::o;38814:90::-;38848:7;38891:5;38884:13;38877:21;38866:32;;38814:90;;;:::o;38910:149::-;38946:7;38986:66;38979:5;38975:78;38964:89;;38910:149;;;:::o;39065:126::-;39102:7;39142:42;39135:5;39131:54;39120:65;;39065:126;;;:::o;39197:77::-;39234:7;39263:5;39252:16;;39197:77;;;:::o;39280:93::-;39316:7;39356:10;39349:5;39345:22;39334:33;;39280:93;;;:::o;39379:86::-;39414:7;39454:4;39447:5;39443:16;39432:27;;39379:86;;;:::o;39471:109::-;39519:9;39552:22;39568:5;39552:22;:::i;:::-;39539:35;;39471:109;;;:::o;39586:154::-;39670:6;39665:3;39660;39647:30;39732:1;39723:6;39718:3;39714:16;39707:27;39586:154;;;:::o;39746:307::-;39814:1;39824:113;39838:6;39835:1;39832:13;39824:113;;;39923:1;39918:3;39914:11;39908:18;39904:1;39899:3;39895:11;39888:39;39860:2;39857:1;39853:10;39848:15;;39824:113;;;39955:6;39952:1;39949:13;39946:101;;;40035:1;40026:6;40021:3;40017:16;40010:27;39946:101;39795:258;39746:307;;;:::o;40059:171::-;40098:3;40121:24;40139:5;40121:24;:::i;:::-;40112:33;;40167:4;40160:5;40157:15;40154:41;;;40175:18;;:::i;:::-;40154:41;40222:1;40215:5;40211:13;40204:20;;40059:171;;;:::o;40236:320::-;40280:6;40317:1;40311:4;40307:12;40297:22;;40364:1;40358:4;40354:12;40385:18;40375:81;;40441:4;40433:6;40429:17;40419:27;;40375:81;40503:2;40495:6;40492:14;40472:18;40469:38;40466:84;;;40522:18;;:::i;:::-;40466:84;40287:269;40236:320;;;:::o;40562:281::-;40645:27;40667:4;40645:27;:::i;:::-;40637:6;40633:40;40775:6;40763:10;40760:22;40739:18;40727:10;40724:34;40721:62;40718:88;;;40786:18;;:::i;:::-;40718:88;40826:10;40822:2;40815:22;40605:238;40562:281;;:::o;40849:233::-;40888:3;40911:24;40929:5;40911:24;:::i;:::-;40902:33;;40957:66;40950:5;40947:77;40944:103;;;41027:18;;:::i;:::-;40944:103;41074:1;41067:5;41063:13;41056:20;;40849:233;;;:::o;41088:180::-;41136:77;41133:1;41126:88;41233:4;41230:1;41223:15;41257:4;41254:1;41247:15;41274:180;41322:77;41319:1;41312:88;41419:4;41416:1;41409:15;41443:4;41440:1;41433:15;41460:180;41508:77;41505:1;41498:88;41605:4;41602:1;41595:15;41629:4;41626:1;41619:15;41646:180;41694:77;41691:1;41684:88;41791:4;41788:1;41781:15;41815:4;41812:1;41805:15;41832:180;41880:77;41877:1;41870:88;41977:4;41974:1;41967:15;42001:4;41998:1;41991:15;42018:180;42066:77;42063:1;42056:88;42163:4;42160:1;42153:15;42187:4;42184:1;42177:15;42204:117;42313:1;42310;42303:12;42327:117;42436:1;42433;42426:12;42450:117;42559:1;42556;42549:12;42573:117;42682:1;42679;42672:12;42696:117;42805:1;42802;42795:12;42819:117;42928:1;42925;42918:12;42942:117;43051:1;43048;43041:12;43065:102;43106:6;43157:2;43153:7;43148:2;43141:5;43137:14;43133:28;43123:38;;43065:102;;;:::o;43173:222::-;43313:34;43309:1;43301:6;43297:14;43290:58;43382:5;43377:2;43369:6;43365:15;43358:30;43173:222;:::o;43401:221::-;43541:34;43537:1;43529:6;43525:14;43518:58;43610:4;43605:2;43597:6;43593:15;43586:29;43401:221;:::o;43628:225::-;43768:34;43764:1;43756:6;43752:14;43745:58;43837:8;43832:2;43824:6;43820:15;43813:33;43628:225;:::o;43859:221::-;43999:34;43995:1;43987:6;43983:14;43976:58;44068:4;44063:2;44055:6;44051:15;44044:29;43859:221;:::o;44086:167::-;44226:19;44222:1;44214:6;44210:14;44203:43;44086:167;:::o;44259:225::-;44399:34;44395:1;44387:6;44383:14;44376:58;44468:8;44463:2;44455:6;44451:15;44444:33;44259:225;:::o;44490:167::-;44630:19;44626:1;44618:6;44614:14;44607:43;44490:167;:::o;44663:227::-;44803:34;44799:1;44791:6;44787:14;44780:58;44872:10;44867:2;44859:6;44855:15;44848:35;44663:227;:::o;44896:182::-;45036:34;45032:1;45024:6;45020:14;45013:58;44896:182;:::o;45084:220::-;45224:34;45220:1;45212:6;45208:14;45201:58;45293:3;45288:2;45280:6;45276:15;45269:28;45084:220;:::o;45310:164::-;45450:16;45446:1;45438:6;45434:14;45427:40;45310:164;:::o;45480:224::-;45620:34;45616:1;45608:6;45604:14;45597:58;45689:7;45684:2;45676:6;45672:15;45665:32;45480:224;:::o;45710:114::-;;:::o;45830:223::-;45970:34;45966:1;45958:6;45954:14;45947:58;46039:6;46034:2;46026:6;46022:15;46015:31;45830:223;:::o;46059:161::-;46199:13;46195:1;46187:6;46183:14;46176:37;46059:161;:::o;46226:170::-;46366:22;46362:1;46354:6;46350:14;46343:46;46226:170;:::o;46402:181::-;46542:33;46538:1;46530:6;46526:14;46519:57;46402:181;:::o;46589:158::-;46729:10;46725:1;46717:6;46713:14;46706:34;46589:158;:::o;46753:224::-;46893:34;46889:1;46881:6;46877:14;46870:58;46962:7;46957:2;46949:6;46945:15;46938:32;46753:224;:::o;46983:181::-;47123:33;47119:1;47111:6;47107:14;47100:57;46983:181;:::o;47170:122::-;47243:24;47261:5;47243:24;:::i;:::-;47236:5;47233:35;47223:63;;47282:1;47279;47272:12;47223:63;47170:122;:::o;47298:116::-;47368:21;47383:5;47368:21;:::i;:::-;47361:5;47358:32;47348:60;;47404:1;47401;47394:12;47348:60;47298:116;:::o;47420:120::-;47492:23;47509:5;47492:23;:::i;:::-;47485:5;47482:34;47472:62;;47530:1;47527;47520:12;47472:62;47420:120;:::o;47546:122::-;47619:24;47637:5;47619:24;:::i;:::-;47612:5;47609:35;47599:63;;47658:1;47655;47648:12;47599:63;47546:122;:::o;47674:118::-;47745:22;47761:5;47745:22;:::i;:::-;47738:5;47735:33;47725:61;;47782:1;47779;47772:12;47725:61;47674:118;:::o

Swarm Source

ipfs://b1e86d8845da0ae5c9f2f91afc133b257da56d3163d4c8ad536a9499b3989621
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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