ETH Price: $3,389.46 (+1.64%)

Token

LLamas (BLL)
 

Overview

Max Total Supply

3,710 BLL

Holders

1,597

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
icecreamdrip.eth
Balance
1 BLL
0xec2b569d406310a96da8daa1c4c8d684077ede0a
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:
LLamasNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-27
*/

// File: contracts/ISpacePunksTreasureKeys.sol


pragma solidity 0.8.7;

interface ISpacePunksTreasureKeys {
  function burnKeyForAddress(uint256 typeId, address burnTokenAddress) external;
  function balanceOf(address account, uint256 id) external view returns (uint256);
}
// File: @openzeppelin/contracts/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 make 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



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/security/Pausable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol



pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

// File: @openzeppelin/contracts/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: @openzeppelin/contracts/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/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/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/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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


// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}



// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol



pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File: @openzeppelin/contracts/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/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}






// File: contracts/LlamasNFT.sol


pragma solidity ^0.8.7;


// This is built on top of the spacepunks.club smart contract.
contract LLamasNFT is ERC721, ERC721URIStorage, ERC721Enumerable, Ownable, Pausable, PaymentSplitter, ReentrancyGuard {
  using SafeMath for uint256;

  // Max limit of existing tokens
  uint256 public constant TOKEN_LIMIT = 10000;
  uint256 public constant TREASURE_KEYS_LIMIT = 600;

  // Linear price of 1 token
  uint256 private _tokenPrice;

  // Maximum amount of tokens to be bought in one transaction / mint
  uint256 private _maxTokensAtOnce = 20;

  // flag for public sale - sale where anybody can buy multiple tokens
  bool public publicSale = false;

  // flag for team sale - sale where team can buy before currect amount of existing tokens is < 100
  bool public teamSale = false;

  // random nonce/seed
  uint internal nonce = 0;

  // list of existing ids of tokens
  uint[TOKEN_LIMIT] internal indices;

  // mapping of addreses available to buy in teamSale phase
  mapping(address => bool) private _teamSaleAddresses;

  // split of shares when withdrawing eth from contract
  uint256[] private _teamShares = [95, 5];
  address[] private _team = [0xb76655Be2bCb0976a382fe76d8B23871BF01c0c4, 0x10Ed692665Cbe4AA26332d9484765e61dCbFC8a5];

  // Minting with SPC Treasure Keys
  address private _treasureKeys; // TODO: Set the value before deployment.

  function setTreasureKeys(address value) external onlyOwner {
    _treasureKeys = value;
  }

  function mintWithTreasureKey() external nonReentrant {
    ISpacePunksTreasureKeys keys = ISpacePunksTreasureKeys(_treasureKeys);

    require(keys.balanceOf(msg.sender, 5) > 0, "SPC Treasure Keys: must own at least one key");

    keys.burnKeyForAddress(5, msg.sender);
    _mintWithRandomTokenId(msg.sender);
  }

  constructor()
    PaymentSplitter(_team, _teamShares)
    ERC721("LLamas", "BLL")
  {
    // sets the token price in wei
    setTokenPrice(70000000000000000);

    // sets the team addresses flags in array
    _teamSaleAddresses[0xb76655Be2bCb0976a382fe76d8B23871BF01c0c4] = true;
  }


  // Required overrides from parent contracts
  function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage) {
    super._burn(tokenId);
  }

  // return of metadata json uri
  function tokenURI(uint256 tokenId) public view virtual override(ERC721, ERC721URIStorage) returns (string memory) {
    return string(abi.encodePacked(super.tokenURI(tokenId), ".json"));
  }

  // Required overrides from parent contracts
  function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  // Required overrides from parent contracts
  function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
    return super.supportsInterface(interfaceId);
  }


  // _tokenPrice getter
  function getTokenPrice() public view returns(uint256) {
    return _tokenPrice;
  }


  // _tokenPrice setter
  function setTokenPrice(uint256 _price) public onlyOwner {
    _tokenPrice = _price;
  }

  // _paused - pause toggles availability of certain methods that are extending "whenNotPaused" or "whenPaused"
  function togglePaused() public onlyOwner {
    if (paused()) {
      _unpause();
    } else {
      _pause();
    }
  }


  // _maxTokensAtOnce getter
  function getMaxTokensAtOnce() public view returns (uint256) {
    return _maxTokensAtOnce;
  }

  // _maxTokensAtOnce setter
  function setMaxTokensAtOnce(uint256 _count) public onlyOwner {
    _maxTokensAtOnce = _count;
  }


  // enables public sale and sets max token in tx for 20
  function enablePublicSale() public onlyOwner {
    publicSale = true;
    setMaxTokensAtOnce(20);
  }

  // disables public sale
  function disablePublicSale() public onlyOwner {
    publicSale = false;
    setMaxTokensAtOnce(1);
  }

  // toggles teamSale
  function toggleTeamSale() public onlyOwner {
    teamSale = !teamSale;
  }


  // Token URIs base
  function _baseURI() internal override pure returns (string memory) {
    return "ipfs://QmWPzChN8ucQDtK79D3AAYmZBTFcrxSVkkRSoRX1fXNYvY/";
  }

  // Pick a random index
  function randomIndex() internal returns (uint256) {
    uint256 totalSize = TOKEN_LIMIT - totalSupply();
    uint256 index = uint(keccak256(abi.encodePacked(nonce, msg.sender, block.difficulty, block.timestamp))) % totalSize;
    uint256 value = 0;

    if (indices[index] != 0) {
      value = indices[index];
    } else {
      value = index;
    }

    if (indices[totalSize - 1] == 0) {
      indices[index] = totalSize - 1;
    } else {
      indices[index] = indices[totalSize - 1];
    }

    nonce++;

    return value.add(1);
  }


  // Minting single or multiple tokens
  function _mintWithRandomTokenId(address _to) private {
    uint _tokenID = randomIndex();
    _safeMint(_to, _tokenID);
  }

  // public method for minting multiple tokens if public sale is enable
  function mintPublicMultipleTokens(uint256 _amount) public payable nonReentrant whenNotPaused {
    require(totalSupply().add(_amount) <= TOKEN_LIMIT - TREASURE_KEYS_LIMIT, "Purchase would exceed max supply of Llamas");
    require(publicSale, "Public sale must be active to mint multiple tokens at once");
    require(_amount <= _maxTokensAtOnce, "Too many tokens at once");
    require(getTokenPrice().mul(_amount) == msg.value, "Insufficient funds to purchase");

    for(uint256 i = 0; i < _amount; i++) {
      _mintWithRandomTokenId(msg.sender);
    }
  }

  // public method for teammembers for minting multiple tokens if teamsale is enabled and existing tokens amount are less than 100
  function mintTeamMultipleTokens(uint256 _amount) public payable nonReentrant {
    require(totalSupply().add(_amount) <= TOKEN_LIMIT - TREASURE_KEYS_LIMIT, "Purchase would exceed max supply of Llamas");
    require(teamSale, "Team sale must be active to mint as a team member");
    require(totalSupply() < 100, "Exceeded tokens allocation for team members");
    require(_teamSaleAddresses[address(msg.sender)], "Not a team member");

    for(uint256 i = 0; i < _amount; i++) {
      _mintWithRandomTokenId(msg.sender);
    }
  }
}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURE_KEYS_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTokensAtOnce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintPublicMultipleTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTeamMultipleTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintWithTreasureKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaxTokensAtOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setTreasureKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"teamSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTeamSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260146013556000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff02191690831515021790555060006015556040518060400160405280605f60ff168152602001600560ff168152506127279060026200007492919062000843565b50604051806040016040528073b76655be2bcb0976a382fe76d8b23871bf01c0c473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017310ed692665cbe4aa26332d9484765e61dcbfc8a573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506127289060026200011d9291906200089a565b503480156200012b57600080fd5b50612728805480602002602001604051908101604052809291908181526020018280548015620001b157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000166575b50505050506127278054806020026020016040519081016040528092919081815260200182805480156200020557602002820191906000526020600020905b815481526020019060010190808311620001f0575b50505050506040518060400160405280600681526020017f4c4c616d617300000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f424c4c000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200028e92919062000929565b508060019080519060200190620002a792919062000929565b505050620002ca620002be6200047860201b60201c565b6200048060201b60201c565b6000600b60146101000a81548160ff02191690831515021790555080518251146200032c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003239062000b56565b60405180910390fd5b600082511162000373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036a9062000b9a565b60405180910390fd5b60005b8251811015620003e257620003cc8382815181106200039a576200039962000d6c565b5b6020026020010151838381518110620003b857620003b762000d6c565b5b60200260200101516200054660201b60201c565b8080620003d99062000cc0565b91505062000376565b50505060016011819055506200040566f8b0a10e4700006200078060201b60201c565b6001612726600073b76655be2bcb0976a382fe76d8b23871bf01c0c473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000f03565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005b09062000b12565b60405180910390fd5b60008111620005ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f69062000bbc565b60405180910390fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000684576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200067b9062000b78565b60405180910390fd5b6010829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c546200073b919062000bef565b600c819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200077492919062000ae5565b60405180910390a15050565b620007906200047860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007b66200081960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200080f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008069062000b34565b60405180910390fd5b8060128190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805482825590600052602060002090810192821562000887579160200282015b8281111562000886578251829060ff1690559160200191906001019062000864565b5b509050620008969190620009ba565b5090565b82805482825590600052602060002090810192821562000916579160200282015b82811115620009155782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620008bb565b5b509050620009259190620009ba565b5090565b828054620009379062000c8a565b90600052602060002090601f0160209004810192826200095b5760008555620009a7565b82601f106200097657805160ff1916838001178555620009a7565b82800160010185558215620009a7579182015b82811115620009a657825182559160200191906001019062000989565b5b509050620009b69190620009ba565b5090565b5b80821115620009d5576000816000905550600101620009bb565b5090565b620009e48162000c4c565b82525050565b6000620009f9602c8362000bde565b915062000a068262000d9b565b604082019050919050565b600062000a2060208362000bde565b915062000a2d8262000dea565b602082019050919050565b600062000a4760328362000bde565b915062000a548262000e13565b604082019050919050565b600062000a6e602b8362000bde565b915062000a7b8262000e62565b604082019050919050565b600062000a95601a8362000bde565b915062000aa28262000eb1565b602082019050919050565b600062000abc601d8362000bde565b915062000ac98262000eda565b602082019050919050565b62000adf8162000c80565b82525050565b600060408201905062000afc6000830185620009d9565b62000b0b602083018462000ad4565b9392505050565b6000602082019050818103600083015262000b2d81620009ea565b9050919050565b6000602082019050818103600083015262000b4f8162000a11565b9050919050565b6000602082019050818103600083015262000b718162000a38565b9050919050565b6000602082019050818103600083015262000b938162000a5f565b9050919050565b6000602082019050818103600083015262000bb58162000a86565b9050919050565b6000602082019050818103600083015262000bd78162000aad565b9050919050565b600082825260208201905092915050565b600062000bfc8262000c80565b915062000c098362000c80565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c415762000c4062000d0e565b5b828201905092915050565b600062000c598262000c60565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000ca357607f821691505b6020821081141562000cba5762000cb962000d3d565b5b50919050565b600062000ccd8262000c80565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000d035762000d0262000d0e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b6157d58062000f136000396000f3fe6080604052600436106102555760003560e01c80635c975abb116101395780639f214ba7116100b6578063ce7c2ac21161007a578063ce7c2ac2146108bd578063e33b7de3146108fa578063e985e9c514610925578063ec8db81714610962578063f2fde38b14610979578063fc6f77e6146109a25761029c565b80639f214ba7146107d8578063a22cb46514610803578063b88d4fde1461082c578063bf98081b14610855578063c87b56dd146108805761029c565b80638b83209b116100fd5780638b83209b146106ec5780638da5cb5b1461072957806395d89b41146107545780639852595c1461077f5780639cb5fece146107bc5761029c565b80635c975abb146106075780636352211e146106325780636a61e5fc1461066f57806370a0823114610698578063715018a6146106d55761029c565b8063289eff46116101d25780633a98ef39116101965780633a98ef391461051857806340bad3771461054357806342842e0e1461055f5780634b94f50e146105885780634e80619a146105b35780634f6ccce7146105ca5761029c565b8063289eff46146104595780632f745c591461047057806330571c58146104ad57806333bc1c5c146104d657806336566f06146105015761029c565b80630c7bc14a116102195780630c7bc14a1461039a57806318160ddd146103c557806319165587146103f05780632316b4da1461041957806323b872dd146104305761029c565b806301ffc9a7146102a1578063031bd4c4146102de57806306fdde0314610309578063081812fc14610334578063095ea7b3146103715761029c565b3661029c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102836109cb565b346040516102929291906143e4565b60405180910390a1005b600080fd5b3480156102ad57600080fd5b506102c860048036038101906102c39190613bc6565b6109d3565b6040516102d5919061440d565b60405180910390f35b3480156102ea57600080fd5b506102f36109e5565b60405161030091906148b3565b60405180910390f35b34801561031557600080fd5b5061031e6109eb565b60405161032b9190614451565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190613c20565b610a7d565b604051610368919061432b565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190613b86565b610b02565b005b3480156103a657600080fd5b506103af610c1a565b6040516103bc91906148b3565b60405180910390f35b3480156103d157600080fd5b506103da610c20565b6040516103e791906148b3565b60405180910390f35b3480156103fc57600080fd5b5061041760048036038101906104129190613a03565b610c2d565b005b34801561042557600080fd5b5061042e610e95565b005b34801561043c57600080fd5b5061045760048036038101906104529190613a70565b610f38565b005b34801561046557600080fd5b5061046e610f98565b005b34801561047c57600080fd5b5061049760048036038101906104929190613b86565b611040565b6040516104a491906148b3565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190613c20565b6110e5565b005b3480156104e257600080fd5b506104eb61116b565b6040516104f8919061440d565b60405180910390f35b34801561050d57600080fd5b5061051661117e565b005b34801561052457600080fd5b5061052d61121f565b60405161053a91906148b3565b60405180910390f35b61055d60048036038101906105589190613c20565b611229565b005b34801561056b57600080fd5b5061058660048036038101906105819190613a70565b61143b565b005b34801561059457600080fd5b5061059d61145b565b6040516105aa91906148b3565b60405180910390f35b3480156105bf57600080fd5b506105c8611465565b005b3480156105d657600080fd5b506105f160048036038101906105ec9190613c20565b61162a565b6040516105fe91906148b3565b60405180910390f35b34801561061357600080fd5b5061061c61169b565b604051610629919061440d565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613c20565b6116b2565b604051610666919061432b565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190613c20565b611764565b005b3480156106a457600080fd5b506106bf60048036038101906106ba91906139d6565b6117ea565b6040516106cc91906148b3565b60405180910390f35b3480156106e157600080fd5b506106ea6118a2565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613c20565b61192a565b604051610720919061432b565b60405180910390f35b34801561073557600080fd5b5061073e611972565b60405161074b919061432b565b60405180910390f35b34801561076057600080fd5b5061076961199c565b6040516107769190614451565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a191906139d6565b611a2e565b6040516107b391906148b3565b60405180910390f35b6107d660048036038101906107d19190613c20565b611a77565b005b3480156107e457600080fd5b506107ed611c9a565b6040516107fa919061440d565b60405180910390f35b34801561080f57600080fd5b5061082a60048036038101906108259190613b46565b611cad565b005b34801561083857600080fd5b50610853600480360381019061084e9190613ac3565b611e2e565b005b34801561086157600080fd5b5061086a611e90565b60405161087791906148b3565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a29190613c20565b611e9a565b6040516108b49190614451565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df91906139d6565b611ecb565b6040516108f191906148b3565b60405180910390f35b34801561090657600080fd5b5061090f611f14565b60405161091c91906148b3565b60405180910390f35b34801561093157600080fd5b5061094c60048036038101906109479190613a30565b611f1e565b604051610959919061440d565b60405180910390f35b34801561096e57600080fd5b50610977611fb2565b005b34801561098557600080fd5b506109a0600480360381019061099b91906139d6565b612055565b005b3480156109ae57600080fd5b506109c960048036038101906109c491906139d6565b61214d565b005b600033905090565b60006109de8261220e565b9050919050565b61271081565b6060600080546109fa90614b97565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2690614b97565b8015610a735780601f10610a4857610100808354040283529160200191610a73565b820191906000526020600020905b815481529060010190602001808311610a5657829003601f168201915b5050505050905090565b6000610a8882612288565b610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90614773565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0d826116b2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590614813565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b9d6109cb565b73ffffffffffffffffffffffffffffffffffffffff161480610bcc5750610bcb81610bc66109cb565b611f1e565b5b610c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0290614693565b60405180910390fd5b610c1583836122f4565b505050565b61025881565b6000600980549050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690614573565b60405180910390fd5b6000600d5447610cbf9190614972565b90506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c54600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610d5191906149f9565b610d5b91906149c8565b610d659190614a53565b90506000811415610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290614653565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610df69190614972565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600d54610e479190614972565b600d81905550610e5783826123ad565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610e88929190614346565b60405180910390a1505050565b610e9d6109cb565b73ffffffffffffffffffffffffffffffffffffffff16610ebb611972565b73ffffffffffffffffffffffffffffffffffffffff1614610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f08906147b3565b60405180910390fd5b6001601460006101000a81548160ff021916908315150217905550610f3660146110e5565b565b610f49610f436109cb565b826124a1565b610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90614833565b60405180910390fd5b610f9383838361257f565b505050565b610fa06109cb565b73ffffffffffffffffffffffffffffffffffffffff16610fbe611972565b73ffffffffffffffffffffffffffffffffffffffff1614611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b906147b3565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b600061104b836117ea565b821061108c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906144b3565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110ed6109cb565b73ffffffffffffffffffffffffffffffffffffffff1661110b611972565b73ffffffffffffffffffffffffffffffffffffffff1614611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906147b3565b60405180910390fd5b8060138190555050565b601460009054906101000a900460ff1681565b6111866109cb565b73ffffffffffffffffffffffffffffffffffffffff166111a4611972565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f1906147b3565b60405180910390fd5b61120261169b565b156112145761120f6127db565b61121d565b61121c61287d565b5b565b6000600c54905090565b6002601154141561126f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126690614893565b60405180910390fd5b60026011819055506102586127106112879190614a53565b6112a182611293610c20565b61292090919063ffffffff16565b11156112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d9906145d3565b60405180910390fd5b601460019054906101000a900460ff16611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890614713565b60405180910390fd5b606461133b610c20565b1061137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290614553565b60405180910390fd5b61272660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff90614793565b60405180910390fd5b60005b8181101561142f5761141c33612936565b808061142790614bfa565b91505061140b565b50600160118190555050565b61145683838360405180602001604052806000815250611e2e565b505050565b6000601254905090565b600260115414156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614893565b60405180910390fd5b6002601181905550600061272960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360056040518363ffffffff1660e01b81526004016115189291906143bb565b60206040518083038186803b15801561153057600080fd5b505afa158015611544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115689190613c4d565b116115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90614513565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166316ed917a6005336040518363ffffffff1660e01b81526004016115e4929190614428565b600060405180830381600087803b1580156115fe57600080fd5b505af1158015611612573d6000803e3d6000fd5b5050505061161f33612936565b506001601181905550565b6000611634610c20565b8210611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90614853565b60405180910390fd5b6009828154811061168957611688614d5e565b5b90600052602060002001549050919050565b6000600b60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561175b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611752906146f3565b60405180910390fd5b80915050919050565b61176c6109cb565b73ffffffffffffffffffffffffffffffffffffffff1661178a611972565b73ffffffffffffffffffffffffffffffffffffffff16146117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d7906147b3565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561185b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611852906146d3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118aa6109cb565b73ffffffffffffffffffffffffffffffffffffffff166118c8611972565b73ffffffffffffffffffffffffffffffffffffffff161461191e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611915906147b3565b60405180910390fd5b6119286000612950565b565b6000601082815481106119405761193f614d5e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119ab90614b97565b80601f01602080910402602001604051908101604052809291908181526020018280546119d790614b97565b8015611a245780601f106119f957610100808354040283529160200191611a24565b820191906000526020600020905b815481529060010190602001808311611a0757829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60026011541415611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab490614893565b60405180910390fd5b6002601181905550611acd61169b565b15611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614673565b60405180910390fd5b610258612710611b1d9190614a53565b611b3782611b29610c20565b61292090919063ffffffff16565b1115611b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6f906145d3565b60405180910390fd5b601460009054906101000a900460ff16611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe906146b3565b60405180910390fd5b601354811115611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390614473565b60405180910390fd5b34611c2782611c1961145b565b612a1690919063ffffffff16565b14611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614873565b60405180910390fd5b60005b81811015611c8e57611c7b33612936565b8080611c8690614bfa565b915050611c6a565b50600160118190555050565b601460019054906101000a900460ff1681565b611cb56109cb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a906145b3565b60405180910390fd5b8060056000611d306109cb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ddd6109cb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e22919061440d565b60405180910390a35050565b611e3f611e396109cb565b836124a1565b611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7590614833565b60405180910390fd5b611e8a84848484612a2c565b50505050565b6000601354905090565b6060611ea582612a88565b604051602001611eb591906142a6565b6040516020818303038152906040529050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fba6109cb565b73ffffffffffffffffffffffffffffffffffffffff16611fd8611972565b73ffffffffffffffffffffffffffffffffffffffff161461202e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612025906147b3565b60405180910390fd5b6000601460006101000a81548160ff02191690831515021790555061205360016110e5565b565b61205d6109cb565b73ffffffffffffffffffffffffffffffffffffffff1661207b611972565b73ffffffffffffffffffffffffffffffffffffffff16146120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c8906147b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612141576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612138906144f3565b60405180910390fd5b61214a81612950565b50565b6121556109cb565b73ffffffffffffffffffffffffffffffffffffffff16612173611972565b73ffffffffffffffffffffffffffffffffffffffff16146121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c0906147b3565b60405180910390fd5b8061272960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612281575061228082612bda565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612367836116b2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156123f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e790614613565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612416906142c8565b60006040518083038185875af1925050503d8060008114612453576040519150601f19603f3d011682016040523d82523d6000602084013e612458565b606091505b505090508061249c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612493906145f3565b60405180910390fd5b505050565b60006124ac82612288565b6124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290614633565b60405180910390fd5b60006124f6836116b2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061256557508373ffffffffffffffffffffffffffffffffffffffff1661254d84610a7d565b73ffffffffffffffffffffffffffffffffffffffff16145b8061257657506125758185611f1e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661259f826116b2565b73ffffffffffffffffffffffffffffffffffffffff16146125f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ec906147d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c90614593565b60405180910390fd5b612670838383612cbc565b61267b6000826122f4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126cb9190614a53565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127229190614972565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6127e361169b565b612822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281990614493565b60405180910390fd5b6000600b60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6128666109cb565b604051612873919061432b565b60405180910390a1565b61288561169b565b156128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc90614673565b60405180910390fd5b6001600b60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129096109cb565b604051612916919061432b565b60405180910390a1565b6000818361292e9190614972565b905092915050565b6000612940612ccc565b905061294c8282612e31565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612a2491906149f9565b905092915050565b612a3784848461257f565b612a4384848484612e4f565b612a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a79906144d3565b60405180910390fd5b50505050565b6060612a9382612288565b612ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac990614753565b60405180910390fd5b6000600660008481526020019081526020016000208054612af290614b97565b80601f0160208091040260200160405190810160405280929190818152602001828054612b1e90614b97565b8015612b6b5780601f10612b4057610100808354040283529160200191612b6b565b820191906000526020600020905b815481529060010190602001808311612b4e57829003601f168201915b505050505090506000612b7c612fe6565b9050600081511415612b92578192505050612bd5565b600082511115612bc7578082604051602001612baf929190614282565b60405160208183030381529060405292505050612bd5565b612bd084613006565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ca557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cb55750612cb4826130ad565b5b9050919050565b612cc7838383613117565b505050565b600080612cd7610c20565b612710612ce49190614a53565b9050600081601554334442604051602001612d0294939291906142dd565b6040516020818303038152906040528051906020012060001c612d259190614c71565b90506000806016836127108110612d3f57612d3e614d5e565b5b015414612d64576016826127108110612d5b57612d5a614d5e565b5b01549050612d68565b8190505b60006016600185612d799190614a53565b6127108110612d8b57612d8a614d5e565b5b01541415612dbf57600183612da09190614a53565b6016836127108110612db557612db4614d5e565b5b0181905550612dfd565b6016600184612dce9190614a53565b6127108110612de057612ddf614d5e565b5b01546016836127108110612df757612df6614d5e565b5b01819055505b60156000815480929190612e1090614bfa565b9190505550612e2960018261292090919063ffffffff16565b935050505090565b612e4b82826040518060200160405280600081525061322b565b5050565b6000612e708473ffffffffffffffffffffffffffffffffffffffff16613286565b15612fd9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e996109cb565b8786866040518563ffffffff1660e01b8152600401612ebb949392919061436f565b602060405180830381600087803b158015612ed557600080fd5b505af1925050508015612f0657506040513d601f19601f82011682018060405250810190612f039190613bf3565b60015b612f89573d8060008114612f36576040519150601f19603f3d011682016040523d82523d6000602084013e612f3b565b606091505b50600081511415612f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f78906144d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fde565b600190505b949350505050565b606060405180606001604052806036815260200161576a60369139905090565b606061301182612288565b613050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613047906147f3565b60405180910390fd5b600061305a612fe6565b9050600081511161307a57604051806020016040528060008152506130a5565b8061308484613299565b604051602001613095929190614282565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131228383836133fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561316557613160816133ff565b6131a4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131a3576131a28382613448565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131e7576131e2816135b5565b613226565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613225576132248282613686565b5b5b505050565b6132358383613705565b6132426000848484612e4f565b613281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613278906144d3565b60405180910390fd5b505050565b600080823b905060008111915050919050565b606060008214156132e1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133f5565b600082905060005b600082146133135780806132fc90614bfa565b915050600a8261330c91906149c8565b91506132e9565b60008167ffffffffffffffff81111561332f5761332e614d8d565b5b6040519080825280601f01601f1916602001820160405280156133615781602001600182028036833780820191505090505b5090505b600085146133ee5760018261337a9190614a53565b9150600a856133899190614c71565b60306133959190614972565b60f81b8183815181106133ab576133aa614d5e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133e791906149c8565b9450613365565b8093505050505b919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613455846117ea565b61345f9190614a53565b9050600060086000848152602001908152602001600020549050818114613544576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506135c99190614a53565b90506000600a60008481526020019081526020016000205490506000600983815481106135f9576135f8614d5e565b5b90600052602060002001549050806009838154811061361b5761361a614d5e565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061366a57613669614d2f565b5b6001900381819060005260206000200160009055905550505050565b6000613691836117ea565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376c90614733565b60405180910390fd5b61377e81612288565b156137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590614533565b60405180910390fd5b6137ca60008383612cbc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461381a9190614972565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006138e66138e1846148f3565b6148ce565b90508281526020810184848401111561390257613901614dc1565b5b61390d848285614b55565b509392505050565b600081359050613924816156f6565b92915050565b6000813590506139398161570d565b92915050565b60008135905061394e81615724565b92915050565b6000813590506139638161573b565b92915050565b6000815190506139788161573b565b92915050565b600082601f83011261399357613992614dbc565b5b81356139a38482602086016138d3565b91505092915050565b6000813590506139bb81615752565b92915050565b6000815190506139d081615752565b92915050565b6000602082840312156139ec576139eb614dcb565b5b60006139fa84828501613915565b91505092915050565b600060208284031215613a1957613a18614dcb565b5b6000613a278482850161392a565b91505092915050565b60008060408385031215613a4757613a46614dcb565b5b6000613a5585828601613915565b9250506020613a6685828601613915565b9150509250929050565b600080600060608486031215613a8957613a88614dcb565b5b6000613a9786828701613915565b9350506020613aa886828701613915565b9250506040613ab9868287016139ac565b9150509250925092565b60008060008060808587031215613add57613adc614dcb565b5b6000613aeb87828801613915565b9450506020613afc87828801613915565b9350506040613b0d878288016139ac565b925050606085013567ffffffffffffffff811115613b2e57613b2d614dc6565b5b613b3a8782880161397e565b91505092959194509250565b60008060408385031215613b5d57613b5c614dcb565b5b6000613b6b85828601613915565b9250506020613b7c8582860161393f565b9150509250929050565b60008060408385031215613b9d57613b9c614dcb565b5b6000613bab85828601613915565b9250506020613bbc858286016139ac565b9150509250929050565b600060208284031215613bdc57613bdb614dcb565b5b6000613bea84828501613954565b91505092915050565b600060208284031215613c0957613c08614dcb565b5b6000613c1784828501613969565b91505092915050565b600060208284031215613c3657613c35614dcb565b5b6000613c44848285016139ac565b91505092915050565b600060208284031215613c6357613c62614dcb565b5b6000613c71848285016139c1565b91505092915050565b613c8381614b0d565b82525050565b613c9281614a87565b82525050565b613ca9613ca482614a87565b614c43565b82525050565b613cb881614aab565b82525050565b6000613cc982614924565b613cd3818561493a565b9350613ce3818560208601614b64565b613cec81614dd0565b840191505092915050565b613d0081614b1f565b82525050565b6000613d118261492f565b613d1b8185614956565b9350613d2b818560208601614b64565b613d3481614dd0565b840191505092915050565b6000613d4a8261492f565b613d548185614967565b9350613d64818560208601614b64565b80840191505092915050565b6000613d7d601783614956565b9150613d8882614dee565b602082019050919050565b6000613da0601483614956565b9150613dab82614e17565b602082019050919050565b6000613dc3602b83614956565b9150613dce82614e40565b604082019050919050565b6000613de6603283614956565b9150613df182614e8f565b604082019050919050565b6000613e09602683614956565b9150613e1482614ede565b604082019050919050565b6000613e2c602c83614956565b9150613e3782614f2d565b604082019050919050565b6000613e4f601c83614956565b9150613e5a82614f7c565b602082019050919050565b6000613e72602b83614956565b9150613e7d82614fa5565b604082019050919050565b6000613e95602683614956565b9150613ea082614ff4565b604082019050919050565b6000613eb8602483614956565b9150613ec382615043565b604082019050919050565b6000613edb601983614956565b9150613ee682615092565b602082019050919050565b6000613efe602a83614956565b9150613f09826150bb565b604082019050919050565b6000613f21603a83614956565b9150613f2c8261510a565b604082019050919050565b6000613f44601d83614956565b9150613f4f82615159565b602082019050919050565b6000613f67602c83614956565b9150613f7282615182565b604082019050919050565b6000613f8a602b83614956565b9150613f95826151d1565b604082019050919050565b6000613fad601083614956565b9150613fb882615220565b602082019050919050565b6000613fd0603883614956565b9150613fdb82615249565b604082019050919050565b6000613ff3603a83614956565b9150613ffe82615298565b604082019050919050565b6000614016602a83614956565b9150614021826152e7565b604082019050919050565b6000614039602983614956565b915061404482615336565b604082019050919050565b600061405c603183614956565b915061406782615385565b604082019050919050565b600061407f602083614956565b915061408a826153d4565b602082019050919050565b60006140a2603183614956565b91506140ad826153fd565b604082019050919050565b60006140c5602c83614956565b91506140d08261544c565b604082019050919050565b60006140e8600583614967565b91506140f38261549b565b600582019050919050565b600061410b601183614956565b9150614116826154c4565b602082019050919050565b600061412e602083614956565b9150614139826154ed565b602082019050919050565b6000614151602983614956565b915061415c82615516565b604082019050919050565b6000614174602f83614956565b915061417f82615565565b604082019050919050565b6000614197602183614956565b91506141a2826155b4565b604082019050919050565b60006141ba60008361494b565b91506141c582615603565b600082019050919050565b60006141dd603183614956565b91506141e882615606565b604082019050919050565b6000614200602c83614956565b915061420b82615655565b604082019050919050565b6000614223601e83614956565b915061422e826156a4565b602082019050919050565b6000614246601f83614956565b9150614251826156cd565b602082019050919050565b61426581614b03565b82525050565b61427c61427782614b03565b614c67565b82525050565b600061428e8285613d3f565b915061429a8284613d3f565b91508190509392505050565b60006142b28284613d3f565b91506142bd826140db565b915081905092915050565b60006142d3826141ad565b9150819050919050565b60006142e9828761426b565b6020820191506142f98286613c98565b601482019150614309828561426b565b602082019150614319828461426b565b60208201915081905095945050505050565b60006020820190506143406000830184613c89565b92915050565b600060408201905061435b6000830185613c7a565b614368602083018461425c565b9392505050565b60006080820190506143846000830187613c89565b6143916020830186613c89565b61439e604083018561425c565b81810360608301526143b08184613cbe565b905095945050505050565b60006040820190506143d06000830185613c89565b6143dd6020830184613cf7565b9392505050565b60006040820190506143f96000830185613c89565b614406602083018461425c565b9392505050565b60006020820190506144226000830184613caf565b92915050565b600060408201905061443d6000830185613cf7565b61444a6020830184613c89565b9392505050565b6000602082019050818103600083015261446b8184613d06565b905092915050565b6000602082019050818103600083015261448c81613d70565b9050919050565b600060208201905081810360008301526144ac81613d93565b9050919050565b600060208201905081810360008301526144cc81613db6565b9050919050565b600060208201905081810360008301526144ec81613dd9565b9050919050565b6000602082019050818103600083015261450c81613dfc565b9050919050565b6000602082019050818103600083015261452c81613e1f565b9050919050565b6000602082019050818103600083015261454c81613e42565b9050919050565b6000602082019050818103600083015261456c81613e65565b9050919050565b6000602082019050818103600083015261458c81613e88565b9050919050565b600060208201905081810360008301526145ac81613eab565b9050919050565b600060208201905081810360008301526145cc81613ece565b9050919050565b600060208201905081810360008301526145ec81613ef1565b9050919050565b6000602082019050818103600083015261460c81613f14565b9050919050565b6000602082019050818103600083015261462c81613f37565b9050919050565b6000602082019050818103600083015261464c81613f5a565b9050919050565b6000602082019050818103600083015261466c81613f7d565b9050919050565b6000602082019050818103600083015261468c81613fa0565b9050919050565b600060208201905081810360008301526146ac81613fc3565b9050919050565b600060208201905081810360008301526146cc81613fe6565b9050919050565b600060208201905081810360008301526146ec81614009565b9050919050565b6000602082019050818103600083015261470c8161402c565b9050919050565b6000602082019050818103600083015261472c8161404f565b9050919050565b6000602082019050818103600083015261474c81614072565b9050919050565b6000602082019050818103600083015261476c81614095565b9050919050565b6000602082019050818103600083015261478c816140b8565b9050919050565b600060208201905081810360008301526147ac816140fe565b9050919050565b600060208201905081810360008301526147cc81614121565b9050919050565b600060208201905081810360008301526147ec81614144565b9050919050565b6000602082019050818103600083015261480c81614167565b9050919050565b6000602082019050818103600083015261482c8161418a565b9050919050565b6000602082019050818103600083015261484c816141d0565b9050919050565b6000602082019050818103600083015261486c816141f3565b9050919050565b6000602082019050818103600083015261488c81614216565b9050919050565b600060208201905081810360008301526148ac81614239565b9050919050565b60006020820190506148c8600083018461425c565b92915050565b60006148d86148e9565b90506148e48282614bc9565b919050565b6000604051905090565b600067ffffffffffffffff82111561490e5761490d614d8d565b5b61491782614dd0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061497d82614b03565b915061498883614b03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149bd576149bc614ca2565b5b828201905092915050565b60006149d382614b03565b91506149de83614b03565b9250826149ee576149ed614cd1565b5b828204905092915050565b6000614a0482614b03565b9150614a0f83614b03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a4857614a47614ca2565b5b828202905092915050565b6000614a5e82614b03565b9150614a6983614b03565b925082821015614a7c57614a7b614ca2565b5b828203905092915050565b6000614a9282614ae3565b9050919050565b6000614aa482614ae3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614b1882614b31565b9050919050565b6000614b2a82614b03565b9050919050565b6000614b3c82614b43565b9050919050565b6000614b4e82614ae3565b9050919050565b82818337600083830152505050565b60005b83811015614b82578082015181840152602081019050614b67565b83811115614b91576000848401525b50505050565b60006002820490506001821680614baf57607f821691505b60208210811415614bc357614bc2614d00565b5b50919050565b614bd282614dd0565b810181811067ffffffffffffffff82111715614bf157614bf0614d8d565b5b80604052505050565b6000614c0582614b03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c3857614c37614ca2565b5b600182019050919050565b6000614c4e82614c55565b9050919050565b6000614c6082614de1565b9050919050565b6000819050919050565b6000614c7c82614b03565b9150614c8783614b03565b925082614c9757614c96614cd1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f546f6f206d616e7920746f6b656e73206174206f6e6365000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f535043205472656173757265204b6579733a206d757374206f776e206174206c60008201527f65617374206f6e65206b65790000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f457863656564656420746f6b656e7320616c6c6f636174696f6e20666f72207460008201527f65616d206d656d62657273000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204c6c616d617300000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f5075626c69632073616c65206d7573742062652061637469766520746f206d6960008201527f6e74206d756c7469706c6520746f6b656e73206174206f6e6365000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5465616d2073616c65206d7573742062652061637469766520746f206d696e7460008201527f2061732061207465616d206d656d626572000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f742061207465616d206d656d626572000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320746f2070757263686173650000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6156ff81614a87565b811461570a57600080fd5b50565b61571681614a99565b811461572157600080fd5b50565b61572d81614aab565b811461573857600080fd5b50565b61574481614ab7565b811461574f57600080fd5b50565b61575b81614b03565b811461576657600080fd5b5056fe697066733a2f2f516d57507a43684e3875635144744b373944334141596d5a42544663727853566b6b52536f52583166584e5976592fa26469706673582212202cb567e8ecd5f9914087f846d3411dca2fdabac378cf2eacfada5a44bd29cbad64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102555760003560e01c80635c975abb116101395780639f214ba7116100b6578063ce7c2ac21161007a578063ce7c2ac2146108bd578063e33b7de3146108fa578063e985e9c514610925578063ec8db81714610962578063f2fde38b14610979578063fc6f77e6146109a25761029c565b80639f214ba7146107d8578063a22cb46514610803578063b88d4fde1461082c578063bf98081b14610855578063c87b56dd146108805761029c565b80638b83209b116100fd5780638b83209b146106ec5780638da5cb5b1461072957806395d89b41146107545780639852595c1461077f5780639cb5fece146107bc5761029c565b80635c975abb146106075780636352211e146106325780636a61e5fc1461066f57806370a0823114610698578063715018a6146106d55761029c565b8063289eff46116101d25780633a98ef39116101965780633a98ef391461051857806340bad3771461054357806342842e0e1461055f5780634b94f50e146105885780634e80619a146105b35780634f6ccce7146105ca5761029c565b8063289eff46146104595780632f745c591461047057806330571c58146104ad57806333bc1c5c146104d657806336566f06146105015761029c565b80630c7bc14a116102195780630c7bc14a1461039a57806318160ddd146103c557806319165587146103f05780632316b4da1461041957806323b872dd146104305761029c565b806301ffc9a7146102a1578063031bd4c4146102de57806306fdde0314610309578063081812fc14610334578063095ea7b3146103715761029c565b3661029c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102836109cb565b346040516102929291906143e4565b60405180910390a1005b600080fd5b3480156102ad57600080fd5b506102c860048036038101906102c39190613bc6565b6109d3565b6040516102d5919061440d565b60405180910390f35b3480156102ea57600080fd5b506102f36109e5565b60405161030091906148b3565b60405180910390f35b34801561031557600080fd5b5061031e6109eb565b60405161032b9190614451565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190613c20565b610a7d565b604051610368919061432b565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190613b86565b610b02565b005b3480156103a657600080fd5b506103af610c1a565b6040516103bc91906148b3565b60405180910390f35b3480156103d157600080fd5b506103da610c20565b6040516103e791906148b3565b60405180910390f35b3480156103fc57600080fd5b5061041760048036038101906104129190613a03565b610c2d565b005b34801561042557600080fd5b5061042e610e95565b005b34801561043c57600080fd5b5061045760048036038101906104529190613a70565b610f38565b005b34801561046557600080fd5b5061046e610f98565b005b34801561047c57600080fd5b5061049760048036038101906104929190613b86565b611040565b6040516104a491906148b3565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190613c20565b6110e5565b005b3480156104e257600080fd5b506104eb61116b565b6040516104f8919061440d565b60405180910390f35b34801561050d57600080fd5b5061051661117e565b005b34801561052457600080fd5b5061052d61121f565b60405161053a91906148b3565b60405180910390f35b61055d60048036038101906105589190613c20565b611229565b005b34801561056b57600080fd5b5061058660048036038101906105819190613a70565b61143b565b005b34801561059457600080fd5b5061059d61145b565b6040516105aa91906148b3565b60405180910390f35b3480156105bf57600080fd5b506105c8611465565b005b3480156105d657600080fd5b506105f160048036038101906105ec9190613c20565b61162a565b6040516105fe91906148b3565b60405180910390f35b34801561061357600080fd5b5061061c61169b565b604051610629919061440d565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613c20565b6116b2565b604051610666919061432b565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190613c20565b611764565b005b3480156106a457600080fd5b506106bf60048036038101906106ba91906139d6565b6117ea565b6040516106cc91906148b3565b60405180910390f35b3480156106e157600080fd5b506106ea6118a2565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613c20565b61192a565b604051610720919061432b565b60405180910390f35b34801561073557600080fd5b5061073e611972565b60405161074b919061432b565b60405180910390f35b34801561076057600080fd5b5061076961199c565b6040516107769190614451565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a191906139d6565b611a2e565b6040516107b391906148b3565b60405180910390f35b6107d660048036038101906107d19190613c20565b611a77565b005b3480156107e457600080fd5b506107ed611c9a565b6040516107fa919061440d565b60405180910390f35b34801561080f57600080fd5b5061082a60048036038101906108259190613b46565b611cad565b005b34801561083857600080fd5b50610853600480360381019061084e9190613ac3565b611e2e565b005b34801561086157600080fd5b5061086a611e90565b60405161087791906148b3565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a29190613c20565b611e9a565b6040516108b49190614451565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df91906139d6565b611ecb565b6040516108f191906148b3565b60405180910390f35b34801561090657600080fd5b5061090f611f14565b60405161091c91906148b3565b60405180910390f35b34801561093157600080fd5b5061094c60048036038101906109479190613a30565b611f1e565b604051610959919061440d565b60405180910390f35b34801561096e57600080fd5b50610977611fb2565b005b34801561098557600080fd5b506109a0600480360381019061099b91906139d6565b612055565b005b3480156109ae57600080fd5b506109c960048036038101906109c491906139d6565b61214d565b005b600033905090565b60006109de8261220e565b9050919050565b61271081565b6060600080546109fa90614b97565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2690614b97565b8015610a735780601f10610a4857610100808354040283529160200191610a73565b820191906000526020600020905b815481529060010190602001808311610a5657829003601f168201915b5050505050905090565b6000610a8882612288565b610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90614773565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0d826116b2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590614813565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b9d6109cb565b73ffffffffffffffffffffffffffffffffffffffff161480610bcc5750610bcb81610bc66109cb565b611f1e565b5b610c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0290614693565b60405180910390fd5b610c1583836122f4565b505050565b61025881565b6000600980549050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690614573565b60405180910390fd5b6000600d5447610cbf9190614972565b90506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c54600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610d5191906149f9565b610d5b91906149c8565b610d659190614a53565b90506000811415610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290614653565b60405180910390fd5b80600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610df69190614972565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600d54610e479190614972565b600d81905550610e5783826123ad565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610e88929190614346565b60405180910390a1505050565b610e9d6109cb565b73ffffffffffffffffffffffffffffffffffffffff16610ebb611972565b73ffffffffffffffffffffffffffffffffffffffff1614610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f08906147b3565b60405180910390fd5b6001601460006101000a81548160ff021916908315150217905550610f3660146110e5565b565b610f49610f436109cb565b826124a1565b610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90614833565b60405180910390fd5b610f9383838361257f565b505050565b610fa06109cb565b73ffffffffffffffffffffffffffffffffffffffff16610fbe611972565b73ffffffffffffffffffffffffffffffffffffffff1614611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b906147b3565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b600061104b836117ea565b821061108c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906144b3565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110ed6109cb565b73ffffffffffffffffffffffffffffffffffffffff1661110b611972565b73ffffffffffffffffffffffffffffffffffffffff1614611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906147b3565b60405180910390fd5b8060138190555050565b601460009054906101000a900460ff1681565b6111866109cb565b73ffffffffffffffffffffffffffffffffffffffff166111a4611972565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f1906147b3565b60405180910390fd5b61120261169b565b156112145761120f6127db565b61121d565b61121c61287d565b5b565b6000600c54905090565b6002601154141561126f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126690614893565b60405180910390fd5b60026011819055506102586127106112879190614a53565b6112a182611293610c20565b61292090919063ffffffff16565b11156112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d9906145d3565b60405180910390fd5b601460019054906101000a900460ff16611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890614713565b60405180910390fd5b606461133b610c20565b1061137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290614553565b60405180910390fd5b61272660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff90614793565b60405180910390fd5b60005b8181101561142f5761141c33612936565b808061142790614bfa565b91505061140b565b50600160118190555050565b61145683838360405180602001604052806000815250611e2e565b505050565b6000601254905090565b600260115414156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614893565b60405180910390fd5b6002601181905550600061272960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360056040518363ffffffff1660e01b81526004016115189291906143bb565b60206040518083038186803b15801561153057600080fd5b505afa158015611544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115689190613c4d565b116115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90614513565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166316ed917a6005336040518363ffffffff1660e01b81526004016115e4929190614428565b600060405180830381600087803b1580156115fe57600080fd5b505af1158015611612573d6000803e3d6000fd5b5050505061161f33612936565b506001601181905550565b6000611634610c20565b8210611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90614853565b60405180910390fd5b6009828154811061168957611688614d5e565b5b90600052602060002001549050919050565b6000600b60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561175b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611752906146f3565b60405180910390fd5b80915050919050565b61176c6109cb565b73ffffffffffffffffffffffffffffffffffffffff1661178a611972565b73ffffffffffffffffffffffffffffffffffffffff16146117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d7906147b3565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561185b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611852906146d3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118aa6109cb565b73ffffffffffffffffffffffffffffffffffffffff166118c8611972565b73ffffffffffffffffffffffffffffffffffffffff161461191e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611915906147b3565b60405180910390fd5b6119286000612950565b565b6000601082815481106119405761193f614d5e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119ab90614b97565b80601f01602080910402602001604051908101604052809291908181526020018280546119d790614b97565b8015611a245780601f106119f957610100808354040283529160200191611a24565b820191906000526020600020905b815481529060010190602001808311611a0757829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60026011541415611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab490614893565b60405180910390fd5b6002601181905550611acd61169b565b15611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614673565b60405180910390fd5b610258612710611b1d9190614a53565b611b3782611b29610c20565b61292090919063ffffffff16565b1115611b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6f906145d3565b60405180910390fd5b601460009054906101000a900460ff16611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe906146b3565b60405180910390fd5b601354811115611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390614473565b60405180910390fd5b34611c2782611c1961145b565b612a1690919063ffffffff16565b14611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614873565b60405180910390fd5b60005b81811015611c8e57611c7b33612936565b8080611c8690614bfa565b915050611c6a565b50600160118190555050565b601460019054906101000a900460ff1681565b611cb56109cb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a906145b3565b60405180910390fd5b8060056000611d306109cb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ddd6109cb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e22919061440d565b60405180910390a35050565b611e3f611e396109cb565b836124a1565b611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7590614833565b60405180910390fd5b611e8a84848484612a2c565b50505050565b6000601354905090565b6060611ea582612a88565b604051602001611eb591906142a6565b6040516020818303038152906040529050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fba6109cb565b73ffffffffffffffffffffffffffffffffffffffff16611fd8611972565b73ffffffffffffffffffffffffffffffffffffffff161461202e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612025906147b3565b60405180910390fd5b6000601460006101000a81548160ff02191690831515021790555061205360016110e5565b565b61205d6109cb565b73ffffffffffffffffffffffffffffffffffffffff1661207b611972565b73ffffffffffffffffffffffffffffffffffffffff16146120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c8906147b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612141576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612138906144f3565b60405180910390fd5b61214a81612950565b50565b6121556109cb565b73ffffffffffffffffffffffffffffffffffffffff16612173611972565b73ffffffffffffffffffffffffffffffffffffffff16146121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c0906147b3565b60405180910390fd5b8061272960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612281575061228082612bda565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612367836116b2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156123f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e790614613565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612416906142c8565b60006040518083038185875af1925050503d8060008114612453576040519150601f19603f3d011682016040523d82523d6000602084013e612458565b606091505b505090508061249c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612493906145f3565b60405180910390fd5b505050565b60006124ac82612288565b6124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290614633565b60405180910390fd5b60006124f6836116b2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061256557508373ffffffffffffffffffffffffffffffffffffffff1661254d84610a7d565b73ffffffffffffffffffffffffffffffffffffffff16145b8061257657506125758185611f1e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661259f826116b2565b73ffffffffffffffffffffffffffffffffffffffff16146125f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ec906147d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c90614593565b60405180910390fd5b612670838383612cbc565b61267b6000826122f4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126cb9190614a53565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127229190614972565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6127e361169b565b612822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281990614493565b60405180910390fd5b6000600b60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6128666109cb565b604051612873919061432b565b60405180910390a1565b61288561169b565b156128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc90614673565b60405180910390fd5b6001600b60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129096109cb565b604051612916919061432b565b60405180910390a1565b6000818361292e9190614972565b905092915050565b6000612940612ccc565b905061294c8282612e31565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612a2491906149f9565b905092915050565b612a3784848461257f565b612a4384848484612e4f565b612a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a79906144d3565b60405180910390fd5b50505050565b6060612a9382612288565b612ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac990614753565b60405180910390fd5b6000600660008481526020019081526020016000208054612af290614b97565b80601f0160208091040260200160405190810160405280929190818152602001828054612b1e90614b97565b8015612b6b5780601f10612b4057610100808354040283529160200191612b6b565b820191906000526020600020905b815481529060010190602001808311612b4e57829003601f168201915b505050505090506000612b7c612fe6565b9050600081511415612b92578192505050612bd5565b600082511115612bc7578082604051602001612baf929190614282565b60405160208183030381529060405292505050612bd5565b612bd084613006565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ca557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cb55750612cb4826130ad565b5b9050919050565b612cc7838383613117565b505050565b600080612cd7610c20565b612710612ce49190614a53565b9050600081601554334442604051602001612d0294939291906142dd565b6040516020818303038152906040528051906020012060001c612d259190614c71565b90506000806016836127108110612d3f57612d3e614d5e565b5b015414612d64576016826127108110612d5b57612d5a614d5e565b5b01549050612d68565b8190505b60006016600185612d799190614a53565b6127108110612d8b57612d8a614d5e565b5b01541415612dbf57600183612da09190614a53565b6016836127108110612db557612db4614d5e565b5b0181905550612dfd565b6016600184612dce9190614a53565b6127108110612de057612ddf614d5e565b5b01546016836127108110612df757612df6614d5e565b5b01819055505b60156000815480929190612e1090614bfa565b9190505550612e2960018261292090919063ffffffff16565b935050505090565b612e4b82826040518060200160405280600081525061322b565b5050565b6000612e708473ffffffffffffffffffffffffffffffffffffffff16613286565b15612fd9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e996109cb565b8786866040518563ffffffff1660e01b8152600401612ebb949392919061436f565b602060405180830381600087803b158015612ed557600080fd5b505af1925050508015612f0657506040513d601f19601f82011682018060405250810190612f039190613bf3565b60015b612f89573d8060008114612f36576040519150601f19603f3d011682016040523d82523d6000602084013e612f3b565b606091505b50600081511415612f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f78906144d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fde565b600190505b949350505050565b606060405180606001604052806036815260200161576a60369139905090565b606061301182612288565b613050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613047906147f3565b60405180910390fd5b600061305a612fe6565b9050600081511161307a57604051806020016040528060008152506130a5565b8061308484613299565b604051602001613095929190614282565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131228383836133fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561316557613160816133ff565b6131a4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131a3576131a28382613448565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131e7576131e2816135b5565b613226565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613225576132248282613686565b5b5b505050565b6132358383613705565b6132426000848484612e4f565b613281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613278906144d3565b60405180910390fd5b505050565b600080823b905060008111915050919050565b606060008214156132e1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133f5565b600082905060005b600082146133135780806132fc90614bfa565b915050600a8261330c91906149c8565b91506132e9565b60008167ffffffffffffffff81111561332f5761332e614d8d565b5b6040519080825280601f01601f1916602001820160405280156133615781602001600182028036833780820191505090505b5090505b600085146133ee5760018261337a9190614a53565b9150600a856133899190614c71565b60306133959190614972565b60f81b8183815181106133ab576133aa614d5e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133e791906149c8565b9450613365565b8093505050505b919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613455846117ea565b61345f9190614a53565b9050600060086000848152602001908152602001600020549050818114613544576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506135c99190614a53565b90506000600a60008481526020019081526020016000205490506000600983815481106135f9576135f8614d5e565b5b90600052602060002001549050806009838154811061361b5761361a614d5e565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061366a57613669614d2f565b5b6001900381819060005260206000200160009055905550505050565b6000613691836117ea565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376c90614733565b60405180910390fd5b61377e81612288565b156137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590614533565b60405180910390fd5b6137ca60008383612cbc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461381a9190614972565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006138e66138e1846148f3565b6148ce565b90508281526020810184848401111561390257613901614dc1565b5b61390d848285614b55565b509392505050565b600081359050613924816156f6565b92915050565b6000813590506139398161570d565b92915050565b60008135905061394e81615724565b92915050565b6000813590506139638161573b565b92915050565b6000815190506139788161573b565b92915050565b600082601f83011261399357613992614dbc565b5b81356139a38482602086016138d3565b91505092915050565b6000813590506139bb81615752565b92915050565b6000815190506139d081615752565b92915050565b6000602082840312156139ec576139eb614dcb565b5b60006139fa84828501613915565b91505092915050565b600060208284031215613a1957613a18614dcb565b5b6000613a278482850161392a565b91505092915050565b60008060408385031215613a4757613a46614dcb565b5b6000613a5585828601613915565b9250506020613a6685828601613915565b9150509250929050565b600080600060608486031215613a8957613a88614dcb565b5b6000613a9786828701613915565b9350506020613aa886828701613915565b9250506040613ab9868287016139ac565b9150509250925092565b60008060008060808587031215613add57613adc614dcb565b5b6000613aeb87828801613915565b9450506020613afc87828801613915565b9350506040613b0d878288016139ac565b925050606085013567ffffffffffffffff811115613b2e57613b2d614dc6565b5b613b3a8782880161397e565b91505092959194509250565b60008060408385031215613b5d57613b5c614dcb565b5b6000613b6b85828601613915565b9250506020613b7c8582860161393f565b9150509250929050565b60008060408385031215613b9d57613b9c614dcb565b5b6000613bab85828601613915565b9250506020613bbc858286016139ac565b9150509250929050565b600060208284031215613bdc57613bdb614dcb565b5b6000613bea84828501613954565b91505092915050565b600060208284031215613c0957613c08614dcb565b5b6000613c1784828501613969565b91505092915050565b600060208284031215613c3657613c35614dcb565b5b6000613c44848285016139ac565b91505092915050565b600060208284031215613c6357613c62614dcb565b5b6000613c71848285016139c1565b91505092915050565b613c8381614b0d565b82525050565b613c9281614a87565b82525050565b613ca9613ca482614a87565b614c43565b82525050565b613cb881614aab565b82525050565b6000613cc982614924565b613cd3818561493a565b9350613ce3818560208601614b64565b613cec81614dd0565b840191505092915050565b613d0081614b1f565b82525050565b6000613d118261492f565b613d1b8185614956565b9350613d2b818560208601614b64565b613d3481614dd0565b840191505092915050565b6000613d4a8261492f565b613d548185614967565b9350613d64818560208601614b64565b80840191505092915050565b6000613d7d601783614956565b9150613d8882614dee565b602082019050919050565b6000613da0601483614956565b9150613dab82614e17565b602082019050919050565b6000613dc3602b83614956565b9150613dce82614e40565b604082019050919050565b6000613de6603283614956565b9150613df182614e8f565b604082019050919050565b6000613e09602683614956565b9150613e1482614ede565b604082019050919050565b6000613e2c602c83614956565b9150613e3782614f2d565b604082019050919050565b6000613e4f601c83614956565b9150613e5a82614f7c565b602082019050919050565b6000613e72602b83614956565b9150613e7d82614fa5565b604082019050919050565b6000613e95602683614956565b9150613ea082614ff4565b604082019050919050565b6000613eb8602483614956565b9150613ec382615043565b604082019050919050565b6000613edb601983614956565b9150613ee682615092565b602082019050919050565b6000613efe602a83614956565b9150613f09826150bb565b604082019050919050565b6000613f21603a83614956565b9150613f2c8261510a565b604082019050919050565b6000613f44601d83614956565b9150613f4f82615159565b602082019050919050565b6000613f67602c83614956565b9150613f7282615182565b604082019050919050565b6000613f8a602b83614956565b9150613f95826151d1565b604082019050919050565b6000613fad601083614956565b9150613fb882615220565b602082019050919050565b6000613fd0603883614956565b9150613fdb82615249565b604082019050919050565b6000613ff3603a83614956565b9150613ffe82615298565b604082019050919050565b6000614016602a83614956565b9150614021826152e7565b604082019050919050565b6000614039602983614956565b915061404482615336565b604082019050919050565b600061405c603183614956565b915061406782615385565b604082019050919050565b600061407f602083614956565b915061408a826153d4565b602082019050919050565b60006140a2603183614956565b91506140ad826153fd565b604082019050919050565b60006140c5602c83614956565b91506140d08261544c565b604082019050919050565b60006140e8600583614967565b91506140f38261549b565b600582019050919050565b600061410b601183614956565b9150614116826154c4565b602082019050919050565b600061412e602083614956565b9150614139826154ed565b602082019050919050565b6000614151602983614956565b915061415c82615516565b604082019050919050565b6000614174602f83614956565b915061417f82615565565b604082019050919050565b6000614197602183614956565b91506141a2826155b4565b604082019050919050565b60006141ba60008361494b565b91506141c582615603565b600082019050919050565b60006141dd603183614956565b91506141e882615606565b604082019050919050565b6000614200602c83614956565b915061420b82615655565b604082019050919050565b6000614223601e83614956565b915061422e826156a4565b602082019050919050565b6000614246601f83614956565b9150614251826156cd565b602082019050919050565b61426581614b03565b82525050565b61427c61427782614b03565b614c67565b82525050565b600061428e8285613d3f565b915061429a8284613d3f565b91508190509392505050565b60006142b28284613d3f565b91506142bd826140db565b915081905092915050565b60006142d3826141ad565b9150819050919050565b60006142e9828761426b565b6020820191506142f98286613c98565b601482019150614309828561426b565b602082019150614319828461426b565b60208201915081905095945050505050565b60006020820190506143406000830184613c89565b92915050565b600060408201905061435b6000830185613c7a565b614368602083018461425c565b9392505050565b60006080820190506143846000830187613c89565b6143916020830186613c89565b61439e604083018561425c565b81810360608301526143b08184613cbe565b905095945050505050565b60006040820190506143d06000830185613c89565b6143dd6020830184613cf7565b9392505050565b60006040820190506143f96000830185613c89565b614406602083018461425c565b9392505050565b60006020820190506144226000830184613caf565b92915050565b600060408201905061443d6000830185613cf7565b61444a6020830184613c89565b9392505050565b6000602082019050818103600083015261446b8184613d06565b905092915050565b6000602082019050818103600083015261448c81613d70565b9050919050565b600060208201905081810360008301526144ac81613d93565b9050919050565b600060208201905081810360008301526144cc81613db6565b9050919050565b600060208201905081810360008301526144ec81613dd9565b9050919050565b6000602082019050818103600083015261450c81613dfc565b9050919050565b6000602082019050818103600083015261452c81613e1f565b9050919050565b6000602082019050818103600083015261454c81613e42565b9050919050565b6000602082019050818103600083015261456c81613e65565b9050919050565b6000602082019050818103600083015261458c81613e88565b9050919050565b600060208201905081810360008301526145ac81613eab565b9050919050565b600060208201905081810360008301526145cc81613ece565b9050919050565b600060208201905081810360008301526145ec81613ef1565b9050919050565b6000602082019050818103600083015261460c81613f14565b9050919050565b6000602082019050818103600083015261462c81613f37565b9050919050565b6000602082019050818103600083015261464c81613f5a565b9050919050565b6000602082019050818103600083015261466c81613f7d565b9050919050565b6000602082019050818103600083015261468c81613fa0565b9050919050565b600060208201905081810360008301526146ac81613fc3565b9050919050565b600060208201905081810360008301526146cc81613fe6565b9050919050565b600060208201905081810360008301526146ec81614009565b9050919050565b6000602082019050818103600083015261470c8161402c565b9050919050565b6000602082019050818103600083015261472c8161404f565b9050919050565b6000602082019050818103600083015261474c81614072565b9050919050565b6000602082019050818103600083015261476c81614095565b9050919050565b6000602082019050818103600083015261478c816140b8565b9050919050565b600060208201905081810360008301526147ac816140fe565b9050919050565b600060208201905081810360008301526147cc81614121565b9050919050565b600060208201905081810360008301526147ec81614144565b9050919050565b6000602082019050818103600083015261480c81614167565b9050919050565b6000602082019050818103600083015261482c8161418a565b9050919050565b6000602082019050818103600083015261484c816141d0565b9050919050565b6000602082019050818103600083015261486c816141f3565b9050919050565b6000602082019050818103600083015261488c81614216565b9050919050565b600060208201905081810360008301526148ac81614239565b9050919050565b60006020820190506148c8600083018461425c565b92915050565b60006148d86148e9565b90506148e48282614bc9565b919050565b6000604051905090565b600067ffffffffffffffff82111561490e5761490d614d8d565b5b61491782614dd0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061497d82614b03565b915061498883614b03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149bd576149bc614ca2565b5b828201905092915050565b60006149d382614b03565b91506149de83614b03565b9250826149ee576149ed614cd1565b5b828204905092915050565b6000614a0482614b03565b9150614a0f83614b03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a4857614a47614ca2565b5b828202905092915050565b6000614a5e82614b03565b9150614a6983614b03565b925082821015614a7c57614a7b614ca2565b5b828203905092915050565b6000614a9282614ae3565b9050919050565b6000614aa482614ae3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614b1882614b31565b9050919050565b6000614b2a82614b03565b9050919050565b6000614b3c82614b43565b9050919050565b6000614b4e82614ae3565b9050919050565b82818337600083830152505050565b60005b83811015614b82578082015181840152602081019050614b67565b83811115614b91576000848401525b50505050565b60006002820490506001821680614baf57607f821691505b60208210811415614bc357614bc2614d00565b5b50919050565b614bd282614dd0565b810181811067ffffffffffffffff82111715614bf157614bf0614d8d565b5b80604052505050565b6000614c0582614b03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c3857614c37614ca2565b5b600182019050919050565b6000614c4e82614c55565b9050919050565b6000614c6082614de1565b9050919050565b6000819050919050565b6000614c7c82614b03565b9150614c8783614b03565b925082614c9757614c96614cd1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f546f6f206d616e7920746f6b656e73206174206f6e6365000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f535043205472656173757265204b6579733a206d757374206f776e206174206c60008201527f65617374206f6e65206b65790000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f457863656564656420746f6b656e7320616c6c6f636174696f6e20666f72207460008201527f65616d206d656d62657273000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204c6c616d617300000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f5075626c69632073616c65206d7573742062652061637469766520746f206d6960008201527f6e74206d756c7469706c6520746f6b656e73206174206f6e6365000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5465616d2073616c65206d7573742062652061637469766520746f206d696e7460008201527f2061732061207465616d206d656d626572000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f742061207465616d206d656d626572000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320746f2070757263686173650000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6156ff81614a87565b811461570a57600080fd5b50565b61571681614a99565b811461572157600080fd5b50565b61572d81614aab565b811461573857600080fd5b50565b61574481614ab7565b811461574f57600080fd5b50565b61575b81614b03565b811461576657600080fd5b5056fe697066733a2f2f516d57507a43684e3875635144744b373944334141596d5a42544663727853566b6b52536f52583166584e5976592fa26469706673582212202cb567e8ecd5f9914087f846d3411dca2fdabac378cf2eacfada5a44bd29cbad64736f6c63430008070033

Deployed Bytecode Sourcemap

62515:6306:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15691:40;15707:12;:10;:12::i;:::-;15721:9;15691:40;;;;;;;:::i;:::-;;;;;;;;62515:6306;;;;;65225:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62706:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30072:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31631:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31154:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62754:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45739:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16897:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66209:104;;;;;;;;;;;;;:::i;:::-;;32521:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66480:76;;;;;;;;;;;;;:::i;:::-;;45407:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66044:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63060:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65749:125;;;;;;;;;;;;;:::i;:::-;;15822:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68279:539;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32931:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65423:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63920:321;;;;;;;;;;;;;:::i;:::-;;45929:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4893:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29766:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65541:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29496:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19831:94;;;;;;;;;;;;;:::i;:::-;;16597:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19180:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30241:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16397:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67572:569;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63198:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31924:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33187:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65912:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64752:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16193:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16007:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32290:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66346:105;;;;;;;;;;;;;:::i;:::-;;20080:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63821:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3603:98;3656:7;3683:10;3676:17;;3603:98;:::o;65225:165::-;65328:4;65348:36;65372:11;65348:23;:36::i;:::-;65341:43;;65225:165;;;:::o;62706:43::-;62744:5;62706:43;:::o;30072:100::-;30126:13;30159:5;30152:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30072:100;:::o;31631:221::-;31707:7;31735:16;31743:7;31735;:16::i;:::-;31727:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31820:15;:24;31836:7;31820:24;;;;;;;;;;;;;;;;;;;;;31813:31;;31631:221;;;:::o;31154:411::-;31235:13;31251:23;31266:7;31251:14;:23::i;:::-;31235:39;;31299:5;31293:11;;:2;:11;;;;31285:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31393:5;31377:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31402:37;31419:5;31426:12;:10;:12::i;:::-;31402:16;:37::i;:::-;31377:62;31355:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31536:21;31545:2;31549:7;31536:8;:21::i;:::-;31224:341;31154:411;;:::o;62754:49::-;62800:3;62754:49;:::o;45739:113::-;45800:7;45827:10;:17;;;;45820:24;;45739:113;:::o;16897:613::-;16992:1;16973:7;:16;16981:7;16973:16;;;;;;;;;;;;;;;;:20;16965:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;17049:21;17097:14;;17073:21;:38;;;;:::i;:::-;17049:62;;17122:15;17192:9;:18;17202:7;17192:18;;;;;;;;;;;;;;;;17177:12;;17157:7;:16;17165:7;17157:16;;;;;;;;;;;;;;;;17141:13;:32;;;;:::i;:::-;17140:49;;;;:::i;:::-;:70;;;;:::i;:::-;17122:88;;17242:1;17231:7;:12;;17223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17346:7;17325:9;:18;17335:7;17325:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;17304:9;:18;17314:7;17304:18;;;;;;;;;;;;;;;:49;;;;17398:7;17381:14;;:24;;;;:::i;:::-;17364:14;:41;;;;17418:35;17436:7;17445;17418:17;:35::i;:::-;17469:33;17485:7;17494;17469:33;;;;;;;:::i;:::-;;;;;;;;16954:556;;16897:613;:::o;66209:104::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66274:4:::1;66261:10;;:17;;;;;;;;;;;;;;;;;;66285:22;66304:2;66285:18;:22::i;:::-;66209:104::o:0;32521:339::-;32716:41;32735:12;:10;:12::i;:::-;32749:7;32716:18;:41::i;:::-;32708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32824:28;32834:4;32840:2;32844:7;32824:9;:28::i;:::-;32521:339;;;:::o;66480:76::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66542:8:::1;;;;;;;;;;;66541:9;66530:8;;:20;;;;;;;;;;;;;;;;;;66480:76::o:0;45407:256::-;45504:7;45540:23;45557:5;45540:16;:23::i;:::-;45532:5;:31;45524:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;45629:12;:19;45642:5;45629:19;;;;;;;;;;;;;;;:26;45649:5;45629:26;;;;;;;;;;;;45622:33;;45407:256;;;;:::o;66044:99::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66131:6:::1;66112:16;:25;;;;66044:99:::0;:::o;63060:30::-;;;;;;;;;;;;;:::o;65749:125::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65801:8:::1;:6;:8::i;:::-;65797:72;;;65820:10;:8;:10::i;:::-;65797:72;;;65853:8;:6;:8::i;:::-;65797:72;65749:125::o:0;15822:91::-;15866:7;15893:12;;15886:19;;15822:91;:::o;68279:539::-;2031:1;2627:7;;:19;;2619:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:1;2760:7;:18;;;;62800:3:::1;62744:5;68401:33;;;;:::i;:::-;68371:26;68389:7;68371:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:63;;68363:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;68496:8;;;;;;;;;;;68488:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;68589:3;68573:13;:11;:13::i;:::-;:19;68565:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;68655:18;:39;68682:10;68655:39;;;;;;;;;;;;;;;;;;;;;;;;;68647:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;68729:9;68725:88;68748:7;68744:1;:11;68725:88;;;68771:34;68794:10;68771:22;:34::i;:::-;68757:3;;;;;:::i;:::-;;;;68725:88;;;;1987:1:::0;2939:7;:22;;;;68279:539;:::o;32931:185::-;33069:39;33086:4;33092:2;33096:7;33069:39;;;;;;;;;;;;:16;:39::i;:::-;32931:185;;;:::o;65423:85::-;65468:7;65491:11;;65484:18;;65423:85;:::o;63920:321::-;2031:1;2627:7;;:19;;2619:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:1;2760:7;:18;;;;63980:28:::1;64035:13;;;;;;;;;;;63980:69;;64098:1;64066:4;:14;;;64081:10;64093:1;64066:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;64058:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;64157:4;:22;;;64180:1;64183:10;64157:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64201:34;64224:10;64201:22;:34::i;:::-;63973:268;1987:1:::0;2939:7;:22;;;;63920:321::o;45929:233::-;46004:7;46040:30;:28;:30::i;:::-;46032:5;:38;46024:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46137:10;46148:5;46137:17;;;;;;;;:::i;:::-;;;;;;;;;;46130:24;;45929:233;;;:::o;4893:86::-;4940:4;4964:7;;;;;;;;;;;4957:14;;4893:86;:::o;29766:239::-;29838:7;29858:13;29874:7;:16;29882:7;29874:16;;;;;;;;;;;;;;;;;;;;;29858:32;;29926:1;29909:19;;:5;:19;;;;29901:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29992:5;29985:12;;;29766:239;;;:::o;65541:89::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65618:6:::1;65604:11;:20;;;;65541:89:::0;:::o;29496:208::-;29568:7;29613:1;29596:19;;:5;:19;;;;29588:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29680:9;:16;29690:5;29680:16;;;;;;;;;;;;;;;;29673:23;;29496:208;;;:::o;19831:94::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19896:21:::1;19914:1;19896:9;:21::i;:::-;19831:94::o:0;16597:100::-;16648:7;16675;16683:5;16675:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16668:21;;16597:100;;;:::o;19180:87::-;19226:7;19253:6;;;;;;;;;;;19246:13;;19180:87;:::o;30241:104::-;30297:13;30330:7;30323:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30241:104;:::o;16397:109::-;16453:7;16480:9;:18;16490:7;16480:18;;;;;;;;;;;;;;;;16473:25;;16397:109;;;:::o;67572:569::-;2031:1;2627:7;;:19;;2619:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:1;2760:7;:18;;;;5219:8:::1;:6;:8::i;:::-;5218:9;5210:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;62800:3:::2;62744:5;67710:33;;;;:::i;:::-;67680:26;67698:7;67680:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:63;;67672:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;67805:10;;;;;;;;;;;67797:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;67904:16;;67893:7;:27;;67885:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;67995:9;67963:28;67983:7;67963:15;:13;:15::i;:::-;:19;;:28;;;;:::i;:::-;:41;67955:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;68052:9;68048:88;68071:7;68067:1;:11;68048:88;;;68094:34;68117:10;68094:22;:34::i;:::-;68080:3;;;;;:::i;:::-;;;;68048:88;;;;1987:1:::0;2939:7;:22;;;;67572:569;:::o;63198:28::-;;;;;;;;;;;;;:::o;31924:295::-;32039:12;:10;:12::i;:::-;32027:24;;:8;:24;;;;32019:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32139:8;32094:18;:32;32113:12;:10;:12::i;:::-;32094:32;;;;;;;;;;;;;;;:42;32127:8;32094:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32192:8;32163:48;;32178:12;:10;:12::i;:::-;32163:48;;;32202:8;32163:48;;;;;;:::i;:::-;;;;;;;;31924:295;;:::o;33187:328::-;33362:41;33381:12;:10;:12::i;:::-;33395:7;33362:18;:41::i;:::-;33354:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33468:39;33482:4;33488:2;33492:7;33501:5;33468:13;:39::i;:::-;33187:328;;;;:::o;65912:96::-;65963:7;65986:16;;65979:23;;65912:96;:::o;64752:192::-;64851:13;64904:23;64919:7;64904:14;:23::i;:::-;64887:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;64873:65;;64752:192;;;:::o;16193:105::-;16247:7;16274;:16;16282:7;16274:16;;;;;;;;;;;;;;;;16267:23;;16193:105;;;:::o;16007:95::-;16053:7;16080:14;;16073:21;;16007:95;:::o;32290:164::-;32387:4;32411:18;:25;32430:5;32411:25;;;;;;;;;;;;;;;:35;32437:8;32411:35;;;;;;;;;;;;;;;;;;;;;;;;;32404:42;;32290:164;;;;:::o;66346:105::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66412:5:::1;66399:10;;:18;;;;;;;;;;;;;;;;;;66424:21;66443:1;66424:18;:21::i;:::-;66346:105::o:0;20080:192::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20189:1:::1;20169:22;;:8;:22;;;;20161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20245:19;20255:8;20245:9;:19::i;:::-;20080:192:::0;:::o;63821:93::-;19411:12;:10;:12::i;:::-;19400:23;;:7;:5;:7::i;:::-;:23;;;19392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63903:5:::1;63887:13;;:21;;;;;;;;;;;;;;;;;;63821:93:::0;:::o;45099:224::-;45201:4;45240:35;45225:50;;;:11;:50;;;;:90;;;;45279:36;45303:11;45279:23;:36::i;:::-;45225:90;45218:97;;45099:224;;;:::o;35025:127::-;35090:4;35142:1;35114:30;;:7;:16;35122:7;35114:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35107:37;;35025:127;;;:::o;39007:174::-;39109:2;39082:15;:24;39098:7;39082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39165:7;39161:2;39127:46;;39136:23;39151:7;39136:14;:23::i;:::-;39127:46;;;;;;;;;;;;39007:174;;:::o;55405:317::-;55520:6;55495:21;:31;;55487:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55574:12;55592:9;:14;;55614:6;55592:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55573:52;;;55644:7;55636:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;55476:246;55405:317;;:::o;35319:348::-;35412:4;35437:16;35445:7;35437;:16::i;:::-;35429:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35513:13;35529:23;35544:7;35529:14;:23::i;:::-;35513:39;;35582:5;35571:16;;:7;:16;;;:51;;;;35615:7;35591:31;;:20;35603:7;35591:11;:20::i;:::-;:31;;;35571:51;:87;;;;35626:32;35643:5;35650:7;35626:16;:32::i;:::-;35571:87;35563:96;;;35319:348;;;;:::o;38311:578::-;38470:4;38443:31;;:23;38458:7;38443:14;:23::i;:::-;:31;;;38435:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38553:1;38539:16;;:2;:16;;;;38531:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38609:39;38630:4;38636:2;38640:7;38609:20;:39::i;:::-;38713:29;38730:1;38734:7;38713:8;:29::i;:::-;38774:1;38755:9;:15;38765:4;38755:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38803:1;38786:9;:13;38796:2;38786:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38834:2;38815:7;:16;38823:7;38815:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38873:7;38869:2;38854:27;;38863:4;38854:27;;;;;;;;;;;;38311:578;;;:::o;5952:120::-;5496:8;:6;:8::i;:::-;5488:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;6021:5:::1;6011:7;;:15;;;;;;;;;;;;;;;;;;6042:22;6051:12;:10;:12::i;:::-;6042:22;;;;;;:::i;:::-;;;;;;;;5952:120::o:0;5693:118::-;5219:8;:6;:8::i;:::-;5218:9;5210:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;5763:4:::1;5753:7;;:14;;;;;;;;;;;;;;;;;;5783:20;5790:12;:10;:12::i;:::-;5783:20;;;;;;:::i;:::-;;;;;;;;5693:118::o:0;8871:98::-;8929:7;8960:1;8956;:5;;;;:::i;:::-;8949:12;;8871:98;;;;:::o;67367:126::-;67427:13;67443;:11;:13::i;:::-;67427:29;;67463:24;67473:3;67478:8;67463:9;:24::i;:::-;67420:73;67367:126;:::o;20280:173::-;20336:16;20355:6;;;;;;;;;;;20336:25;;20381:8;20372:6;;:17;;;;;;;;;;;;;;;;;;20436:8;20405:40;;20426:8;20405:40;;;;;;;;;;;;20325:128;20280:173;:::o;9609:98::-;9667:7;9698:1;9694;:5;;;;:::i;:::-;9687:12;;9609:98;;;;:::o;34397:315::-;34554:28;34564:4;34570:2;34574:7;34554:9;:28::i;:::-;34601:48;34624:4;34630:2;34634:7;34643:5;34601:22;:48::i;:::-;34593:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34397:315;;;;:::o;41684:679::-;41757:13;41791:16;41799:7;41791;:16::i;:::-;41783:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41874:23;41900:10;:19;41911:7;41900:19;;;;;;;;;;;41874:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41930:18;41951:10;:8;:10::i;:::-;41930:31;;42059:1;42043:4;42037:18;:23;42033:72;;;42084:9;42077:16;;;;;;42033:72;42235:1;42215:9;42209:23;:27;42205:108;;;42284:4;42290:9;42267:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42253:48;;;;;;42205:108;42332:23;42347:7;42332:14;:23::i;:::-;42325:30;;;;41684:679;;;;:::o;29127:305::-;29229:4;29281:25;29266:40;;;:11;:40;;;;:105;;;;29338:33;29323:48;;;:11;:48;;;;29266:105;:158;;;;29388:36;29412:11;29388:23;:36::i;:::-;29266:158;29246:178;;29127:305;;;:::o;64997:175::-;65121:45;65148:4;65154:2;65158:7;65121:26;:45::i;:::-;64997:175;;;:::o;66761:558::-;66802:7;66818:17;66852:13;:11;:13::i;:::-;62744:5;66838:27;;;;:::i;:::-;66818:47;;66872:13;66978:9;66920:5;;66927:10;66939:16;66957:15;66903:70;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66893:81;;;;;;66888:87;;:99;;;;:::i;:::-;66872:115;;66994:13;67042:1;67024:7;67032:5;67024:14;;;;;;;:::i;:::-;;;;:19;67020:100;;67062:7;67070:5;67062:14;;;;;;;:::i;:::-;;;;67054:22;;67020:100;;;67107:5;67099:13;;67020:100;67158:1;67132:7;67152:1;67140:9;:13;;;;:::i;:::-;67132:22;;;;;;;:::i;:::-;;;;:27;67128:142;;;67199:1;67187:9;:13;;;;:::i;:::-;67170:7;67178:5;67170:14;;;;;;;:::i;:::-;;;:30;;;;67128:142;;;67240:7;67260:1;67248:9;:13;;;;:::i;:::-;67240:22;;;;;;;:::i;:::-;;;;67223:7;67231:5;67223:14;;;;;;;:::i;:::-;;;:39;;;;67128:142;67278:5;;:7;;;;;;;;;:::i;:::-;;;;;;67301:12;67311:1;67301:5;:9;;:12;;;;:::i;:::-;67294:19;;;;;66761:558;:::o;36009:110::-;36085:26;36095:2;36099:7;36085:26;;;;;;;;;;;;:9;:26::i;:::-;36009:110;;:::o;39746:799::-;39901:4;39922:15;:2;:13;;;:15::i;:::-;39918:620;;;39974:2;39958:36;;;39995:12;:10;:12::i;:::-;40009:4;40015:7;40024:5;39958:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39954:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40217:1;40200:6;:13;:18;40196:272;;;40243:60;;;;;;;;;;:::i;:::-;;;;;;;;40196:272;40418:6;40412:13;40403:6;40399:2;40395:15;40388:38;39954:529;40091:41;;;40081:51;;;:6;:51;;;;40074:58;;;;;39918:620;40522:4;40515:11;;39746:799;;;;;;;:::o;66586:143::-;66638:13;66660:63;;;;;;;;;;;;;;;;;;;66586:143;:::o;30416:334::-;30489:13;30523:16;30531:7;30523;:16::i;:::-;30515:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30604:21;30628:10;:8;:10::i;:::-;30604:34;;30680:1;30662:7;30656:21;:25;:86;;;;;;;;;;;;;;;;;30708:7;30717:18;:7;:16;:18::i;:::-;30691:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30656:86;30649:93;;;30416:334;;;:::o;26914:157::-;26999:4;27038:25;27023:40;;;:11;:40;;;;27016:47;;26914:157;;;:::o;46775:589::-;46919:45;46946:4;46952:2;46956:7;46919:26;:45::i;:::-;46997:1;46981:18;;:4;:18;;;46977:187;;;47016:40;47048:7;47016:31;:40::i;:::-;46977:187;;;47086:2;47078:10;;:4;:10;;;47074:90;;47105:47;47138:4;47144:7;47105:32;:47::i;:::-;47074:90;46977:187;47192:1;47178:16;;:2;:16;;;47174:183;;;47211:45;47248:7;47211:36;:45::i;:::-;47174:183;;;47284:4;47278:10;;:2;:10;;;47274:83;;47305:40;47333:2;47337:7;47305:27;:40::i;:::-;47274:83;47174:183;46775:589;;;:::o;36346:321::-;36476:18;36482:2;36486:7;36476:5;:18::i;:::-;36527:54;36558:1;36562:2;36566:7;36575:5;36527:22;:54::i;:::-;36505:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36346:321;;;:::o;54083:387::-;54143:4;54351:12;54418:7;54406:20;54398:28;;54461:1;54454:4;:8;54447:15;;;54083:387;;;:::o;51558:723::-;51614:13;51844:1;51835:5;:10;51831:53;;;51862:10;;;;;;;;;;;;;;;;;;;;;51831:53;51894:12;51909:5;51894:20;;51925:14;51950:78;51965:1;51957:4;:9;51950:78;;51983:8;;;;;:::i;:::-;;;;52014:2;52006:10;;;;;:::i;:::-;;;51950:78;;;52038:19;52070:6;52060:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52038:39;;52088:154;52104:1;52095:5;:10;52088:154;;52132:1;52122:11;;;;;:::i;:::-;;;52199:2;52191:5;:10;;;;:::i;:::-;52178:2;:24;;;;:::i;:::-;52165:39;;52148:6;52155;52148:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;52228:2;52219:11;;;;;:::i;:::-;;;52088:154;;;52266:6;52252:21;;;;;51558:723;;;;:::o;41117:126::-;;;;:::o;48087:164::-;48191:10;:17;;;;48164:15;:24;48180:7;48164:24;;;;;;;;;;;:44;;;;48219:10;48235:7;48219:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48087:164;:::o;48878:988::-;49144:22;49194:1;49169:22;49186:4;49169:16;:22::i;:::-;:26;;;;:::i;:::-;49144:51;;49206:18;49227:17;:26;49245:7;49227:26;;;;;;;;;;;;49206:47;;49374:14;49360:10;:28;49356:328;;49405:19;49427:12;:18;49440:4;49427:18;;;;;;;;;;;;;;;:34;49446:14;49427:34;;;;;;;;;;;;49405:56;;49511:11;49478:12;:18;49491:4;49478:18;;;;;;;;;;;;;;;:30;49497:10;49478:30;;;;;;;;;;;:44;;;;49628:10;49595:17;:30;49613:11;49595:30;;;;;;;;;;;:43;;;;49390:294;49356:328;49780:17;:26;49798:7;49780:26;;;;;;;;;;;49773:33;;;49824:12;:18;49837:4;49824:18;;;;;;;;;;;;;;;:34;49843:14;49824:34;;;;;;;;;;;49817:41;;;48959:907;;48878:988;;:::o;50161:1079::-;50414:22;50459:1;50439:10;:17;;;;:21;;;;:::i;:::-;50414:46;;50471:18;50492:15;:24;50508:7;50492:24;;;;;;;;;;;;50471:45;;50843:19;50865:10;50876:14;50865:26;;;;;;;;:::i;:::-;;;;;;;;;;50843:48;;50929:11;50904:10;50915;50904:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;51040:10;51009:15;:28;51025:11;51009:28;;;;;;;;;;;:41;;;;51181:15;:24;51197:7;51181:24;;;;;;;;;;;51174:31;;;51216:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50232:1008;;;50161:1079;:::o;47665:221::-;47750:14;47767:20;47784:2;47767:16;:20::i;:::-;47750:37;;47825:7;47798:12;:16;47811:2;47798:16;;;;;;;;;;;;;;;:24;47815:6;47798:24;;;;;;;;;;;:34;;;;47872:6;47843:17;:26;47861:7;47843:26;;;;;;;;;;;:35;;;;47739:147;47665:221;;:::o;37003:382::-;37097:1;37083:16;;:2;:16;;;;37075:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37156:16;37164:7;37156;:16::i;:::-;37155:17;37147:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37218:45;37247:1;37251:2;37255:7;37218:20;:45::i;:::-;37293:1;37276:9;:13;37286:2;37276:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37324:2;37305:7;:16;37313:7;37305:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37369:7;37365:2;37344:33;;37361:1;37344:33;;;;;;;;;;;;37003:382;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:155::-;622:5;660:6;647:20;638:29;;676:41;711:5;676:41;:::i;:::-;568:155;;;;:::o;729:133::-;772:5;810:6;797:20;788:29;;826:30;850:5;826:30;:::i;:::-;729:133;;;;:::o;868:137::-;913:5;951:6;938:20;929:29;;967:32;993:5;967:32;:::i;:::-;868:137;;;;:::o;1011:141::-;1067:5;1098:6;1092:13;1083:22;;1114:32;1140:5;1114:32;:::i;:::-;1011:141;;;;:::o;1171:338::-;1226:5;1275:3;1268:4;1260:6;1256:17;1252:27;1242:122;;1283:79;;:::i;:::-;1242:122;1400:6;1387:20;1425:78;1499:3;1491:6;1484:4;1476:6;1472:17;1425:78;:::i;:::-;1416:87;;1232:277;1171:338;;;;:::o;1515:139::-;1561:5;1599:6;1586:20;1577:29;;1615:33;1642:5;1615:33;:::i;:::-;1515:139;;;;:::o;1660:143::-;1717:5;1748:6;1742:13;1733:22;;1764:33;1791:5;1764:33;:::i;:::-;1660:143;;;;:::o;1809:329::-;1868:6;1917:2;1905:9;1896:7;1892:23;1888:32;1885:119;;;1923:79;;:::i;:::-;1885:119;2043:1;2068:53;2113:7;2104:6;2093:9;2089:22;2068:53;:::i;:::-;2058:63;;2014:117;1809:329;;;;:::o;2144:345::-;2211:6;2260:2;2248:9;2239:7;2235:23;2231:32;2228:119;;;2266:79;;:::i;:::-;2228:119;2386:1;2411:61;2464:7;2455:6;2444:9;2440:22;2411:61;:::i;:::-;2401:71;;2357:125;2144:345;;;;:::o;2495:474::-;2563:6;2571;2620:2;2608:9;2599:7;2595:23;2591:32;2588:119;;;2626:79;;:::i;:::-;2588:119;2746:1;2771:53;2816:7;2807:6;2796:9;2792:22;2771:53;:::i;:::-;2761:63;;2717:117;2873:2;2899:53;2944:7;2935:6;2924:9;2920:22;2899:53;:::i;:::-;2889:63;;2844:118;2495:474;;;;;:::o;2975:619::-;3052:6;3060;3068;3117:2;3105:9;3096:7;3092:23;3088:32;3085:119;;;3123:79;;:::i;:::-;3085:119;3243:1;3268:53;3313:7;3304:6;3293:9;3289:22;3268:53;:::i;:::-;3258:63;;3214:117;3370:2;3396:53;3441:7;3432:6;3421:9;3417:22;3396:53;:::i;:::-;3386:63;;3341:118;3498:2;3524:53;3569:7;3560:6;3549:9;3545:22;3524:53;:::i;:::-;3514:63;;3469:118;2975:619;;;;;:::o;3600:943::-;3695:6;3703;3711;3719;3768:3;3756:9;3747:7;3743:23;3739:33;3736:120;;;3775:79;;:::i;:::-;3736:120;3895:1;3920:53;3965:7;3956:6;3945:9;3941:22;3920:53;:::i;:::-;3910:63;;3866:117;4022:2;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3993:118;4150:2;4176:53;4221:7;4212:6;4201:9;4197:22;4176:53;:::i;:::-;4166:63;;4121:118;4306:2;4295:9;4291:18;4278:32;4337:18;4329:6;4326:30;4323:117;;;4359:79;;:::i;:::-;4323:117;4464:62;4518:7;4509:6;4498:9;4494:22;4464:62;:::i;:::-;4454:72;;4249:287;3600:943;;;;;;;:::o;4549:468::-;4614:6;4622;4671:2;4659:9;4650:7;4646:23;4642:32;4639:119;;;4677:79;;:::i;:::-;4639:119;4797:1;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4768:117;4924:2;4950:50;4992:7;4983:6;4972:9;4968:22;4950:50;:::i;:::-;4940:60;;4895:115;4549:468;;;;;:::o;5023:474::-;5091:6;5099;5148:2;5136:9;5127:7;5123:23;5119:32;5116:119;;;5154:79;;:::i;:::-;5116:119;5274:1;5299:53;5344:7;5335:6;5324:9;5320:22;5299:53;:::i;:::-;5289:63;;5245:117;5401:2;5427:53;5472:7;5463:6;5452:9;5448:22;5427:53;:::i;:::-;5417:63;;5372:118;5023:474;;;;;:::o;5503:327::-;5561:6;5610:2;5598:9;5589:7;5585:23;5581:32;5578:119;;;5616:79;;:::i;:::-;5578:119;5736:1;5761:52;5805:7;5796:6;5785:9;5781:22;5761:52;:::i;:::-;5751:62;;5707:116;5503:327;;;;:::o;5836:349::-;5905:6;5954:2;5942:9;5933:7;5929:23;5925:32;5922:119;;;5960:79;;:::i;:::-;5922:119;6080:1;6105:63;6160:7;6151:6;6140:9;6136:22;6105:63;:::i;:::-;6095:73;;6051:127;5836:349;;;;:::o;6191:329::-;6250:6;6299:2;6287:9;6278:7;6274:23;6270:32;6267:119;;;6305:79;;:::i;:::-;6267:119;6425:1;6450:53;6495:7;6486:6;6475:9;6471:22;6450:53;:::i;:::-;6440:63;;6396:117;6191:329;;;;:::o;6526:351::-;6596:6;6645:2;6633:9;6624:7;6620:23;6616:32;6613:119;;;6651:79;;:::i;:::-;6613:119;6771:1;6796:64;6852:7;6843:6;6832:9;6828:22;6796:64;:::i;:::-;6786:74;;6742:128;6526:351;;;;:::o;6883:147::-;6978:45;7017:5;6978:45;:::i;:::-;6973:3;6966:58;6883:147;;:::o;7036:118::-;7123:24;7141:5;7123:24;:::i;:::-;7118:3;7111:37;7036:118;;:::o;7160:157::-;7265:45;7285:24;7303:5;7285:24;:::i;:::-;7265:45;:::i;:::-;7260:3;7253:58;7160:157;;:::o;7323:109::-;7404:21;7419:5;7404:21;:::i;:::-;7399:3;7392:34;7323:109;;:::o;7438:360::-;7524:3;7552:38;7584:5;7552:38;:::i;:::-;7606:70;7669:6;7664:3;7606:70;:::i;:::-;7599:77;;7685:52;7730:6;7725:3;7718:4;7711:5;7707:16;7685:52;:::i;:::-;7762:29;7784:6;7762:29;:::i;:::-;7757:3;7753:39;7746:46;;7528:270;7438:360;;;;:::o;7804:147::-;7899:45;7938:5;7899:45;:::i;:::-;7894:3;7887:58;7804:147;;:::o;7957:364::-;8045:3;8073:39;8106:5;8073:39;:::i;:::-;8128:71;8192:6;8187:3;8128:71;:::i;:::-;8121:78;;8208:52;8253:6;8248:3;8241:4;8234:5;8230:16;8208:52;:::i;:::-;8285:29;8307:6;8285:29;:::i;:::-;8280:3;8276:39;8269:46;;8049:272;7957:364;;;;:::o;8327:377::-;8433:3;8461:39;8494:5;8461:39;:::i;:::-;8516:89;8598:6;8593:3;8516:89;:::i;:::-;8509:96;;8614:52;8659:6;8654:3;8647:4;8640:5;8636:16;8614:52;:::i;:::-;8691:6;8686:3;8682:16;8675:23;;8437:267;8327:377;;;;:::o;8710:366::-;8852:3;8873:67;8937:2;8932:3;8873:67;:::i;:::-;8866:74;;8949:93;9038:3;8949:93;:::i;:::-;9067:2;9062:3;9058:12;9051:19;;8710:366;;;:::o;9082:::-;9224:3;9245:67;9309:2;9304:3;9245:67;:::i;:::-;9238:74;;9321:93;9410:3;9321:93;:::i;:::-;9439:2;9434:3;9430:12;9423:19;;9082:366;;;:::o;9454:::-;9596:3;9617:67;9681:2;9676:3;9617:67;:::i;:::-;9610:74;;9693:93;9782:3;9693:93;:::i;:::-;9811:2;9806:3;9802:12;9795:19;;9454:366;;;:::o;9826:::-;9968:3;9989:67;10053:2;10048:3;9989:67;:::i;:::-;9982:74;;10065:93;10154:3;10065:93;:::i;:::-;10183:2;10178:3;10174:12;10167:19;;9826:366;;;:::o;10198:::-;10340:3;10361:67;10425:2;10420:3;10361:67;:::i;:::-;10354:74;;10437:93;10526:3;10437:93;:::i;:::-;10555:2;10550:3;10546:12;10539:19;;10198:366;;;:::o;10570:::-;10712:3;10733:67;10797:2;10792:3;10733:67;:::i;:::-;10726:74;;10809:93;10898:3;10809:93;:::i;:::-;10927:2;10922:3;10918:12;10911:19;;10570:366;;;:::o;10942:::-;11084:3;11105:67;11169:2;11164:3;11105:67;:::i;:::-;11098:74;;11181:93;11270:3;11181:93;:::i;:::-;11299:2;11294:3;11290:12;11283:19;;10942:366;;;:::o;11314:::-;11456:3;11477:67;11541:2;11536:3;11477:67;:::i;:::-;11470:74;;11553:93;11642:3;11553:93;:::i;:::-;11671:2;11666:3;11662:12;11655:19;;11314:366;;;:::o;11686:::-;11828:3;11849:67;11913:2;11908:3;11849:67;:::i;:::-;11842:74;;11925:93;12014:3;11925:93;:::i;:::-;12043:2;12038:3;12034:12;12027:19;;11686:366;;;:::o;12058:::-;12200:3;12221:67;12285:2;12280:3;12221:67;:::i;:::-;12214:74;;12297:93;12386:3;12297:93;:::i;:::-;12415:2;12410:3;12406:12;12399:19;;12058:366;;;:::o;12430:::-;12572:3;12593:67;12657:2;12652:3;12593:67;:::i;:::-;12586:74;;12669:93;12758:3;12669:93;:::i;:::-;12787:2;12782:3;12778:12;12771:19;;12430:366;;;:::o;12802:::-;12944:3;12965:67;13029:2;13024:3;12965:67;:::i;:::-;12958:74;;13041:93;13130:3;13041:93;:::i;:::-;13159:2;13154:3;13150:12;13143:19;;12802:366;;;:::o;13174:::-;13316:3;13337:67;13401:2;13396:3;13337:67;:::i;:::-;13330:74;;13413:93;13502:3;13413:93;:::i;:::-;13531:2;13526:3;13522:12;13515:19;;13174:366;;;:::o;13546:::-;13688:3;13709:67;13773:2;13768:3;13709:67;:::i;:::-;13702:74;;13785:93;13874:3;13785:93;:::i;:::-;13903:2;13898:3;13894:12;13887:19;;13546:366;;;:::o;13918:::-;14060:3;14081:67;14145:2;14140:3;14081:67;:::i;:::-;14074:74;;14157:93;14246:3;14157:93;:::i;:::-;14275:2;14270:3;14266:12;14259:19;;13918:366;;;:::o;14290:::-;14432:3;14453:67;14517:2;14512:3;14453:67;:::i;:::-;14446:74;;14529:93;14618:3;14529:93;:::i;:::-;14647:2;14642:3;14638:12;14631:19;;14290:366;;;:::o;14662:::-;14804:3;14825:67;14889:2;14884:3;14825:67;:::i;:::-;14818:74;;14901:93;14990:3;14901:93;:::i;:::-;15019:2;15014:3;15010:12;15003:19;;14662:366;;;:::o;15034:::-;15176:3;15197:67;15261:2;15256:3;15197:67;:::i;:::-;15190:74;;15273:93;15362:3;15273:93;:::i;:::-;15391:2;15386:3;15382:12;15375:19;;15034:366;;;:::o;15406:::-;15548:3;15569:67;15633:2;15628:3;15569:67;:::i;:::-;15562:74;;15645:93;15734:3;15645:93;:::i;:::-;15763:2;15758:3;15754:12;15747:19;;15406:366;;;:::o;15778:::-;15920:3;15941:67;16005:2;16000:3;15941:67;:::i;:::-;15934:74;;16017:93;16106:3;16017:93;:::i;:::-;16135:2;16130:3;16126:12;16119:19;;15778:366;;;:::o;16150:::-;16292:3;16313:67;16377:2;16372:3;16313:67;:::i;:::-;16306:74;;16389:93;16478:3;16389:93;:::i;:::-;16507:2;16502:3;16498:12;16491:19;;16150:366;;;:::o;16522:::-;16664:3;16685:67;16749:2;16744:3;16685:67;:::i;:::-;16678:74;;16761:93;16850:3;16761:93;:::i;:::-;16879:2;16874:3;16870:12;16863:19;;16522:366;;;:::o;16894:::-;17036:3;17057:67;17121:2;17116:3;17057:67;:::i;:::-;17050:74;;17133:93;17222:3;17133:93;:::i;:::-;17251:2;17246:3;17242:12;17235:19;;16894:366;;;:::o;17266:::-;17408:3;17429:67;17493:2;17488:3;17429:67;:::i;:::-;17422:74;;17505:93;17594:3;17505:93;:::i;:::-;17623:2;17618:3;17614:12;17607:19;;17266:366;;;:::o;17638:::-;17780:3;17801:67;17865:2;17860:3;17801:67;:::i;:::-;17794:74;;17877:93;17966:3;17877:93;:::i;:::-;17995:2;17990:3;17986:12;17979:19;;17638:366;;;:::o;18010:400::-;18170:3;18191:84;18273:1;18268:3;18191:84;:::i;:::-;18184:91;;18284:93;18373:3;18284:93;:::i;:::-;18402:1;18397:3;18393:11;18386:18;;18010:400;;;:::o;18416:366::-;18558:3;18579:67;18643:2;18638:3;18579:67;:::i;:::-;18572:74;;18655:93;18744:3;18655:93;:::i;:::-;18773:2;18768:3;18764:12;18757:19;;18416:366;;;:::o;18788:::-;18930:3;18951:67;19015:2;19010:3;18951:67;:::i;:::-;18944:74;;19027:93;19116:3;19027:93;:::i;:::-;19145:2;19140:3;19136:12;19129:19;;18788:366;;;:::o;19160:::-;19302:3;19323:67;19387:2;19382:3;19323:67;:::i;:::-;19316:74;;19399:93;19488:3;19399:93;:::i;:::-;19517:2;19512:3;19508:12;19501:19;;19160:366;;;:::o;19532:::-;19674:3;19695:67;19759:2;19754:3;19695:67;:::i;:::-;19688:74;;19771:93;19860:3;19771:93;:::i;:::-;19889:2;19884:3;19880:12;19873:19;;19532:366;;;:::o;19904:::-;20046:3;20067:67;20131:2;20126:3;20067:67;:::i;:::-;20060:74;;20143:93;20232:3;20143:93;:::i;:::-;20261:2;20256:3;20252:12;20245:19;;19904:366;;;:::o;20276:398::-;20435:3;20456:83;20537:1;20532:3;20456:83;:::i;:::-;20449:90;;20548:93;20637:3;20548:93;:::i;:::-;20666:1;20661:3;20657:11;20650:18;;20276:398;;;:::o;20680:366::-;20822:3;20843:67;20907:2;20902:3;20843:67;:::i;:::-;20836:74;;20919:93;21008:3;20919:93;:::i;:::-;21037:2;21032:3;21028:12;21021:19;;20680:366;;;:::o;21052:::-;21194:3;21215:67;21279:2;21274:3;21215:67;:::i;:::-;21208:74;;21291:93;21380:3;21291:93;:::i;:::-;21409:2;21404:3;21400:12;21393:19;;21052:366;;;:::o;21424:::-;21566:3;21587:67;21651:2;21646:3;21587:67;:::i;:::-;21580:74;;21663:93;21752:3;21663:93;:::i;:::-;21781:2;21776:3;21772:12;21765:19;;21424:366;;;:::o;21796:::-;21938:3;21959:67;22023:2;22018:3;21959:67;:::i;:::-;21952:74;;22035:93;22124:3;22035:93;:::i;:::-;22153:2;22148:3;22144:12;22137:19;;21796:366;;;:::o;22168:118::-;22255:24;22273:5;22255:24;:::i;:::-;22250:3;22243:37;22168:118;;:::o;22292:157::-;22397:45;22417:24;22435:5;22417:24;:::i;:::-;22397:45;:::i;:::-;22392:3;22385:58;22292:157;;:::o;22455:435::-;22635:3;22657:95;22748:3;22739:6;22657:95;:::i;:::-;22650:102;;22769:95;22860:3;22851:6;22769:95;:::i;:::-;22762:102;;22881:3;22874:10;;22455:435;;;;;:::o;22896:541::-;23129:3;23151:95;23242:3;23233:6;23151:95;:::i;:::-;23144:102;;23263:148;23407:3;23263:148;:::i;:::-;23256:155;;23428:3;23421:10;;22896:541;;;;:::o;23443:379::-;23627:3;23649:147;23792:3;23649:147;:::i;:::-;23642:154;;23813:3;23806:10;;23443:379;;;:::o;23828:679::-;24024:3;24039:75;24110:3;24101:6;24039:75;:::i;:::-;24139:2;24134:3;24130:12;24123:19;;24152:75;24223:3;24214:6;24152:75;:::i;:::-;24252:2;24247:3;24243:12;24236:19;;24265:75;24336:3;24327:6;24265:75;:::i;:::-;24365:2;24360:3;24356:12;24349:19;;24378:75;24449:3;24440:6;24378:75;:::i;:::-;24478:2;24473:3;24469:12;24462:19;;24498:3;24491:10;;23828:679;;;;;;;:::o;24513:222::-;24606:4;24644:2;24633:9;24629:18;24621:26;;24657:71;24725:1;24714:9;24710:17;24701:6;24657:71;:::i;:::-;24513:222;;;;:::o;24741:348::-;24870:4;24908:2;24897:9;24893:18;24885:26;;24921:79;24997:1;24986:9;24982:17;24973:6;24921:79;:::i;:::-;25010:72;25078:2;25067:9;25063:18;25054:6;25010:72;:::i;:::-;24741:348;;;;;:::o;25095:640::-;25290:4;25328:3;25317:9;25313:19;25305:27;;25342:71;25410:1;25399:9;25395:17;25386:6;25342:71;:::i;:::-;25423:72;25491:2;25480:9;25476:18;25467:6;25423:72;:::i;:::-;25505;25573:2;25562:9;25558:18;25549:6;25505:72;:::i;:::-;25624:9;25618:4;25614:20;25609:2;25598:9;25594:18;25587:48;25652:76;25723:4;25714:6;25652:76;:::i;:::-;25644:84;;25095:640;;;;;;;:::o;25741:348::-;25870:4;25908:2;25897:9;25893:18;25885:26;;25921:71;25989:1;25978:9;25974:17;25965:6;25921:71;:::i;:::-;26002:80;26078:2;26067:9;26063:18;26054:6;26002:80;:::i;:::-;25741:348;;;;;:::o;26095:332::-;26216:4;26254:2;26243:9;26239:18;26231:26;;26267:71;26335:1;26324:9;26320:17;26311:6;26267:71;:::i;:::-;26348:72;26416:2;26405:9;26401:18;26392:6;26348:72;:::i;:::-;26095:332;;;;;:::o;26433:210::-;26520:4;26558:2;26547:9;26543:18;26535:26;;26571:65;26633:1;26622:9;26618:17;26609:6;26571:65;:::i;:::-;26433:210;;;;:::o;26649:348::-;26778:4;26816:2;26805:9;26801:18;26793:26;;26829:79;26905:1;26894:9;26890:17;26881:6;26829:79;:::i;:::-;26918:72;26986:2;26975:9;26971:18;26962:6;26918:72;:::i;:::-;26649:348;;;;;:::o;27003:313::-;27116:4;27154:2;27143:9;27139:18;27131:26;;27203:9;27197:4;27193:20;27189:1;27178:9;27174:17;27167:47;27231:78;27304:4;27295:6;27231:78;:::i;:::-;27223:86;;27003:313;;;;:::o;27322:419::-;27488:4;27526:2;27515:9;27511:18;27503:26;;27575:9;27569:4;27565:20;27561:1;27550:9;27546:17;27539:47;27603:131;27729:4;27603:131;:::i;:::-;27595:139;;27322:419;;;:::o;27747:::-;27913:4;27951:2;27940:9;27936:18;27928:26;;28000:9;27994:4;27990:20;27986:1;27975:9;27971:17;27964:47;28028:131;28154:4;28028:131;:::i;:::-;28020:139;;27747:419;;;:::o;28172:::-;28338:4;28376:2;28365:9;28361:18;28353:26;;28425:9;28419:4;28415:20;28411:1;28400:9;28396:17;28389:47;28453:131;28579:4;28453:131;:::i;:::-;28445:139;;28172:419;;;:::o;28597:::-;28763:4;28801:2;28790:9;28786:18;28778:26;;28850:9;28844:4;28840:20;28836:1;28825:9;28821:17;28814:47;28878:131;29004:4;28878:131;:::i;:::-;28870:139;;28597:419;;;:::o;29022:::-;29188:4;29226:2;29215:9;29211:18;29203:26;;29275:9;29269:4;29265:20;29261:1;29250:9;29246:17;29239:47;29303:131;29429:4;29303:131;:::i;:::-;29295:139;;29022:419;;;:::o;29447:::-;29613:4;29651:2;29640:9;29636:18;29628:26;;29700:9;29694:4;29690:20;29686:1;29675:9;29671:17;29664:47;29728:131;29854:4;29728:131;:::i;:::-;29720:139;;29447:419;;;:::o;29872:::-;30038:4;30076:2;30065:9;30061:18;30053:26;;30125:9;30119:4;30115:20;30111:1;30100:9;30096:17;30089:47;30153:131;30279:4;30153:131;:::i;:::-;30145:139;;29872:419;;;:::o;30297:::-;30463:4;30501:2;30490:9;30486:18;30478:26;;30550:9;30544:4;30540:20;30536:1;30525:9;30521:17;30514:47;30578:131;30704:4;30578:131;:::i;:::-;30570:139;;30297:419;;;:::o;30722:::-;30888:4;30926:2;30915:9;30911:18;30903:26;;30975:9;30969:4;30965:20;30961:1;30950:9;30946:17;30939:47;31003:131;31129:4;31003:131;:::i;:::-;30995:139;;30722:419;;;:::o;31147:::-;31313:4;31351:2;31340:9;31336:18;31328:26;;31400:9;31394:4;31390:20;31386:1;31375:9;31371:17;31364:47;31428:131;31554:4;31428:131;:::i;:::-;31420:139;;31147:419;;;:::o;31572:::-;31738:4;31776:2;31765:9;31761:18;31753:26;;31825:9;31819:4;31815:20;31811:1;31800:9;31796:17;31789:47;31853:131;31979:4;31853:131;:::i;:::-;31845:139;;31572:419;;;:::o;31997:::-;32163:4;32201:2;32190:9;32186:18;32178:26;;32250:9;32244:4;32240:20;32236:1;32225:9;32221:17;32214:47;32278:131;32404:4;32278:131;:::i;:::-;32270:139;;31997:419;;;:::o;32422:::-;32588:4;32626:2;32615:9;32611:18;32603:26;;32675:9;32669:4;32665:20;32661:1;32650:9;32646:17;32639:47;32703:131;32829:4;32703:131;:::i;:::-;32695:139;;32422:419;;;:::o;32847:::-;33013:4;33051:2;33040:9;33036:18;33028:26;;33100:9;33094:4;33090:20;33086:1;33075:9;33071:17;33064:47;33128:131;33254:4;33128:131;:::i;:::-;33120:139;;32847:419;;;:::o;33272:::-;33438:4;33476:2;33465:9;33461:18;33453:26;;33525:9;33519:4;33515:20;33511:1;33500:9;33496:17;33489:47;33553:131;33679:4;33553:131;:::i;:::-;33545:139;;33272:419;;;:::o;33697:::-;33863:4;33901:2;33890:9;33886:18;33878:26;;33950:9;33944:4;33940:20;33936:1;33925:9;33921:17;33914:47;33978:131;34104:4;33978:131;:::i;:::-;33970:139;;33697:419;;;:::o;34122:::-;34288:4;34326:2;34315:9;34311:18;34303:26;;34375:9;34369:4;34365:20;34361:1;34350:9;34346:17;34339:47;34403:131;34529:4;34403:131;:::i;:::-;34395:139;;34122:419;;;:::o;34547:::-;34713:4;34751:2;34740:9;34736:18;34728:26;;34800:9;34794:4;34790:20;34786:1;34775:9;34771:17;34764:47;34828:131;34954:4;34828:131;:::i;:::-;34820:139;;34547:419;;;:::o;34972:::-;35138:4;35176:2;35165:9;35161:18;35153:26;;35225:9;35219:4;35215:20;35211:1;35200:9;35196:17;35189:47;35253:131;35379:4;35253:131;:::i;:::-;35245:139;;34972:419;;;:::o;35397:::-;35563:4;35601:2;35590:9;35586:18;35578:26;;35650:9;35644:4;35640:20;35636:1;35625:9;35621:17;35614:47;35678:131;35804:4;35678:131;:::i;:::-;35670:139;;35397:419;;;:::o;35822:::-;35988:4;36026:2;36015:9;36011:18;36003:26;;36075:9;36069:4;36065:20;36061:1;36050:9;36046:17;36039:47;36103:131;36229:4;36103:131;:::i;:::-;36095:139;;35822:419;;;:::o;36247:::-;36413:4;36451:2;36440:9;36436:18;36428:26;;36500:9;36494:4;36490:20;36486:1;36475:9;36471:17;36464:47;36528:131;36654:4;36528:131;:::i;:::-;36520:139;;36247:419;;;:::o;36672:::-;36838:4;36876:2;36865:9;36861:18;36853:26;;36925:9;36919:4;36915:20;36911:1;36900:9;36896:17;36889:47;36953:131;37079:4;36953:131;:::i;:::-;36945:139;;36672:419;;;:::o;37097:::-;37263:4;37301:2;37290:9;37286:18;37278:26;;37350:9;37344:4;37340:20;37336:1;37325:9;37321:17;37314:47;37378:131;37504:4;37378:131;:::i;:::-;37370:139;;37097:419;;;:::o;37522:::-;37688:4;37726:2;37715:9;37711:18;37703:26;;37775:9;37769:4;37765:20;37761:1;37750:9;37746:17;37739:47;37803:131;37929:4;37803:131;:::i;:::-;37795:139;;37522:419;;;:::o;37947:::-;38113:4;38151:2;38140:9;38136:18;38128:26;;38200:9;38194:4;38190:20;38186:1;38175:9;38171:17;38164:47;38228:131;38354:4;38228:131;:::i;:::-;38220:139;;37947:419;;;:::o;38372:::-;38538:4;38576:2;38565:9;38561:18;38553:26;;38625:9;38619:4;38615:20;38611:1;38600:9;38596:17;38589:47;38653:131;38779:4;38653:131;:::i;:::-;38645:139;;38372:419;;;:::o;38797:::-;38963:4;39001:2;38990:9;38986:18;38978:26;;39050:9;39044:4;39040:20;39036:1;39025:9;39021:17;39014:47;39078:131;39204:4;39078:131;:::i;:::-;39070:139;;38797:419;;;:::o;39222:::-;39388:4;39426:2;39415:9;39411:18;39403:26;;39475:9;39469:4;39465:20;39461:1;39450:9;39446:17;39439:47;39503:131;39629:4;39503:131;:::i;:::-;39495:139;;39222:419;;;:::o;39647:::-;39813:4;39851:2;39840:9;39836:18;39828:26;;39900:9;39894:4;39890:20;39886:1;39875:9;39871:17;39864:47;39928:131;40054:4;39928:131;:::i;:::-;39920:139;;39647:419;;;:::o;40072:::-;40238:4;40276:2;40265:9;40261:18;40253:26;;40325:9;40319:4;40315:20;40311:1;40300:9;40296:17;40289:47;40353:131;40479:4;40353:131;:::i;:::-;40345:139;;40072:419;;;:::o;40497:::-;40663:4;40701:2;40690:9;40686:18;40678:26;;40750:9;40744:4;40740:20;40736:1;40725:9;40721:17;40714:47;40778:131;40904:4;40778:131;:::i;:::-;40770:139;;40497:419;;;:::o;40922:::-;41088:4;41126:2;41115:9;41111:18;41103:26;;41175:9;41169:4;41165:20;41161:1;41150:9;41146:17;41139:47;41203:131;41329:4;41203:131;:::i;:::-;41195:139;;40922:419;;;:::o;41347:::-;41513:4;41551:2;41540:9;41536:18;41528:26;;41600:9;41594:4;41590:20;41586:1;41575:9;41571:17;41564:47;41628:131;41754:4;41628:131;:::i;:::-;41620:139;;41347:419;;;:::o;41772:222::-;41865:4;41903:2;41892:9;41888:18;41880:26;;41916:71;41984:1;41973:9;41969:17;41960:6;41916:71;:::i;:::-;41772:222;;;;:::o;42000:129::-;42034:6;42061:20;;:::i;:::-;42051:30;;42090:33;42118:4;42110:6;42090:33;:::i;:::-;42000:129;;;:::o;42135:75::-;42168:6;42201:2;42195:9;42185:19;;42135:75;:::o;42216:307::-;42277:4;42367:18;42359:6;42356:30;42353:56;;;42389:18;;:::i;:::-;42353:56;42427:29;42449:6;42427:29;:::i;:::-;42419:37;;42511:4;42505;42501:15;42493:23;;42216:307;;;:::o;42529:98::-;42580:6;42614:5;42608:12;42598:22;;42529:98;;;:::o;42633:99::-;42685:6;42719:5;42713:12;42703:22;;42633:99;;;:::o;42738:168::-;42821:11;42855:6;42850:3;42843:19;42895:4;42890:3;42886:14;42871:29;;42738:168;;;;:::o;42912:147::-;43013:11;43050:3;43035:18;;42912:147;;;;:::o;43065:169::-;43149:11;43183:6;43178:3;43171:19;43223:4;43218:3;43214:14;43199:29;;43065:169;;;;:::o;43240:148::-;43342:11;43379:3;43364:18;;43240:148;;;;:::o;43394:305::-;43434:3;43453:20;43471:1;43453:20;:::i;:::-;43448:25;;43487:20;43505:1;43487:20;:::i;:::-;43482:25;;43641:1;43573:66;43569:74;43566:1;43563:81;43560:107;;;43647:18;;:::i;:::-;43560:107;43691:1;43688;43684:9;43677:16;;43394:305;;;;:::o;43705:185::-;43745:1;43762:20;43780:1;43762:20;:::i;:::-;43757:25;;43796:20;43814:1;43796:20;:::i;:::-;43791:25;;43835:1;43825:35;;43840:18;;:::i;:::-;43825:35;43882:1;43879;43875:9;43870:14;;43705:185;;;;:::o;43896:348::-;43936:7;43959:20;43977:1;43959:20;:::i;:::-;43954:25;;43993:20;44011:1;43993:20;:::i;:::-;43988:25;;44181:1;44113:66;44109:74;44106:1;44103:81;44098:1;44091:9;44084:17;44080:105;44077:131;;;44188:18;;:::i;:::-;44077:131;44236:1;44233;44229:9;44218:20;;43896:348;;;;:::o;44250:191::-;44290:4;44310:20;44328:1;44310:20;:::i;:::-;44305:25;;44344:20;44362:1;44344:20;:::i;:::-;44339:25;;44383:1;44380;44377:8;44374:34;;;44388:18;;:::i;:::-;44374:34;44433:1;44430;44426:9;44418:17;;44250:191;;;;:::o;44447:96::-;44484:7;44513:24;44531:5;44513:24;:::i;:::-;44502:35;;44447:96;;;:::o;44549:104::-;44594:7;44623:24;44641:5;44623:24;:::i;:::-;44612:35;;44549:104;;;:::o;44659:90::-;44693:7;44736:5;44729:13;44722:21;44711:32;;44659:90;;;:::o;44755:149::-;44791:7;44831:66;44824:5;44820:78;44809:89;;44755:149;;;:::o;44910:126::-;44947:7;44987:42;44980:5;44976:54;44965:65;;44910:126;;;:::o;45042:77::-;45079:7;45108:5;45097:16;;45042:77;;;:::o;45125:134::-;45183:9;45216:37;45247:5;45216:37;:::i;:::-;45203:50;;45125:134;;;:::o;45265:121::-;45323:9;45356:24;45374:5;45356:24;:::i;:::-;45343:37;;45265:121;;;:::o;45392:126::-;45442:9;45475:37;45506:5;45475:37;:::i;:::-;45462:50;;45392:126;;;:::o;45524:113::-;45574:9;45607:24;45625:5;45607:24;:::i;:::-;45594:37;;45524:113;;;:::o;45643:154::-;45727:6;45722:3;45717;45704:30;45789:1;45780:6;45775:3;45771:16;45764:27;45643:154;;;:::o;45803:307::-;45871:1;45881:113;45895:6;45892:1;45889:13;45881:113;;;45980:1;45975:3;45971:11;45965:18;45961:1;45956:3;45952:11;45945:39;45917:2;45914:1;45910:10;45905:15;;45881:113;;;46012:6;46009:1;46006:13;46003:101;;;46092:1;46083:6;46078:3;46074:16;46067:27;46003:101;45852:258;45803:307;;;:::o;46116:320::-;46160:6;46197:1;46191:4;46187:12;46177:22;;46244:1;46238:4;46234:12;46265:18;46255:81;;46321:4;46313:6;46309:17;46299:27;;46255:81;46383:2;46375:6;46372:14;46352:18;46349:38;46346:84;;;46402:18;;:::i;:::-;46346:84;46167:269;46116:320;;;:::o;46442:281::-;46525:27;46547:4;46525:27;:::i;:::-;46517:6;46513:40;46655:6;46643:10;46640:22;46619:18;46607:10;46604:34;46601:62;46598:88;;;46666:18;;:::i;:::-;46598:88;46706:10;46702:2;46695:22;46485:238;46442:281;;:::o;46729:233::-;46768:3;46791:24;46809:5;46791:24;:::i;:::-;46782:33;;46837:66;46830:5;46827:77;46824:103;;;46907:18;;:::i;:::-;46824:103;46954:1;46947:5;46943:13;46936:20;;46729:233;;;:::o;46968:100::-;47007:7;47036:26;47056:5;47036:26;:::i;:::-;47025:37;;46968:100;;;:::o;47074:94::-;47113:7;47142:20;47156:5;47142:20;:::i;:::-;47131:31;;47074:94;;;:::o;47174:79::-;47213:7;47242:5;47231:16;;47174:79;;;:::o;47259:176::-;47291:1;47308:20;47326:1;47308:20;:::i;:::-;47303:25;;47342:20;47360:1;47342:20;:::i;:::-;47337:25;;47381:1;47371:35;;47386:18;;:::i;:::-;47371:35;47427:1;47424;47420:9;47415:14;;47259:176;;;;:::o;47441:180::-;47489:77;47486:1;47479:88;47586:4;47583:1;47576:15;47610:4;47607:1;47600:15;47627:180;47675:77;47672:1;47665:88;47772:4;47769:1;47762:15;47796:4;47793:1;47786:15;47813:180;47861:77;47858:1;47851:88;47958:4;47955:1;47948:15;47982:4;47979:1;47972:15;47999:180;48047:77;48044:1;48037:88;48144:4;48141:1;48134:15;48168:4;48165:1;48158:15;48185:180;48233:77;48230:1;48223:88;48330:4;48327:1;48320:15;48354:4;48351:1;48344:15;48371:180;48419:77;48416:1;48409:88;48516:4;48513:1;48506:15;48540:4;48537:1;48530:15;48557:117;48666:1;48663;48656:12;48680:117;48789:1;48786;48779:12;48803:117;48912:1;48909;48902:12;48926:117;49035:1;49032;49025:12;49049:102;49090:6;49141:2;49137:7;49132:2;49125:5;49121:14;49117:28;49107:38;;49049:102;;;:::o;49157:94::-;49190:8;49238:5;49234:2;49230:14;49209:35;;49157:94;;;:::o;49257:173::-;49397:25;49393:1;49385:6;49381:14;49374:49;49257:173;:::o;49436:170::-;49576:22;49572:1;49564:6;49560:14;49553:46;49436:170;:::o;49612:230::-;49752:34;49748:1;49740:6;49736:14;49729:58;49821:13;49816:2;49808:6;49804:15;49797:38;49612:230;:::o;49848:237::-;49988:34;49984:1;49976:6;49972:14;49965:58;50057:20;50052:2;50044:6;50040:15;50033:45;49848:237;:::o;50091:225::-;50231:34;50227:1;50219:6;50215:14;50208:58;50300:8;50295:2;50287:6;50283:15;50276:33;50091:225;:::o;50322:231::-;50462:34;50458:1;50450:6;50446:14;50439:58;50531:14;50526:2;50518:6;50514:15;50507:39;50322:231;:::o;50559:178::-;50699:30;50695:1;50687:6;50683:14;50676:54;50559:178;:::o;50743:230::-;50883:34;50879:1;50871:6;50867:14;50860:58;50952:13;50947:2;50939:6;50935:15;50928:38;50743:230;:::o;50979:225::-;51119:34;51115:1;51107:6;51103:14;51096:58;51188:8;51183:2;51175:6;51171:15;51164:33;50979:225;:::o;51210:223::-;51350:34;51346:1;51338:6;51334:14;51327:58;51419:6;51414:2;51406:6;51402:15;51395:31;51210:223;:::o;51439:175::-;51579:27;51575:1;51567:6;51563:14;51556:51;51439:175;:::o;51620:229::-;51760:34;51756:1;51748:6;51744:14;51737:58;51829:12;51824:2;51816:6;51812:15;51805:37;51620:229;:::o;51855:245::-;51995:34;51991:1;51983:6;51979:14;51972:58;52064:28;52059:2;52051:6;52047:15;52040:53;51855:245;:::o;52106:179::-;52246:31;52242:1;52234:6;52230:14;52223:55;52106:179;:::o;52291:231::-;52431:34;52427:1;52419:6;52415:14;52408:58;52500:14;52495:2;52487:6;52483:15;52476:39;52291:231;:::o;52528:230::-;52668:34;52664:1;52656:6;52652:14;52645:58;52737:13;52732:2;52724:6;52720:15;52713:38;52528:230;:::o;52764:166::-;52904:18;52900:1;52892:6;52888:14;52881:42;52764:166;:::o;52936:243::-;53076:34;53072:1;53064:6;53060:14;53053:58;53145:26;53140:2;53132:6;53128:15;53121:51;52936:243;:::o;53185:245::-;53325:34;53321:1;53313:6;53309:14;53302:58;53394:28;53389:2;53381:6;53377:15;53370:53;53185:245;:::o;53436:229::-;53576:34;53572:1;53564:6;53560:14;53553:58;53645:12;53640:2;53632:6;53628:15;53621:37;53436:229;:::o;53671:228::-;53811:34;53807:1;53799:6;53795:14;53788:58;53880:11;53875:2;53867:6;53863:15;53856:36;53671:228;:::o;53905:236::-;54045:34;54041:1;54033:6;54029:14;54022:58;54114:19;54109:2;54101:6;54097:15;54090:44;53905:236;:::o;54147:182::-;54287:34;54283:1;54275:6;54271:14;54264:58;54147:182;:::o;54335:236::-;54475:34;54471:1;54463:6;54459:14;54452:58;54544:19;54539:2;54531:6;54527:15;54520:44;54335:236;:::o;54577:231::-;54717:34;54713:1;54705:6;54701:14;54694:58;54786:14;54781:2;54773:6;54769:15;54762:39;54577:231;:::o;54814:155::-;54954:7;54950:1;54942:6;54938:14;54931:31;54814:155;:::o;54975:167::-;55115:19;55111:1;55103:6;55099:14;55092:43;54975:167;:::o;55148:182::-;55288:34;55284:1;55276:6;55272:14;55265:58;55148:182;:::o;55336:228::-;55476:34;55472:1;55464:6;55460:14;55453:58;55545:11;55540:2;55532:6;55528:15;55521:36;55336:228;:::o;55570:234::-;55710:34;55706:1;55698:6;55694:14;55687:58;55779:17;55774:2;55766:6;55762:15;55755:42;55570:234;:::o;55810:220::-;55950:34;55946:1;55938:6;55934:14;55927:58;56019:3;56014:2;56006:6;56002:15;55995:28;55810:220;:::o;56036:114::-;;:::o;56156:236::-;56296:34;56292:1;56284:6;56280:14;56273:58;56365:19;56360:2;56352:6;56348:15;56341:44;56156:236;:::o;56398:231::-;56538:34;56534:1;56526:6;56522:14;56515:58;56607:14;56602:2;56594:6;56590:15;56583:39;56398:231;:::o;56635:180::-;56775:32;56771:1;56763:6;56759:14;56752:56;56635:180;:::o;56821:181::-;56961:33;56957:1;56949:6;56945:14;56938:57;56821:181;:::o;57008:122::-;57081:24;57099:5;57081:24;:::i;:::-;57074:5;57071:35;57061:63;;57120:1;57117;57110:12;57061:63;57008:122;:::o;57136:138::-;57217:32;57243:5;57217:32;:::i;:::-;57210:5;57207:43;57197:71;;57264:1;57261;57254:12;57197:71;57136:138;:::o;57280:116::-;57350:21;57365:5;57350:21;:::i;:::-;57343:5;57340:32;57330:60;;57386:1;57383;57376:12;57330:60;57280:116;:::o;57402:120::-;57474:23;57491:5;57474:23;:::i;:::-;57467:5;57464:34;57454:62;;57512:1;57509;57502:12;57454:62;57402:120;:::o;57528:122::-;57601:24;57619:5;57601:24;:::i;:::-;57594:5;57591:35;57581:63;;57640:1;57637;57630:12;57581:63;57528:122;:::o

Swarm Source

ipfs://2cb567e8ecd5f9914087f846d3411dca2fdabac378cf2eacfada5a44bd29cbad
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.