Token ShibaJanny

Overview ERC-20

Total Supply:
20,488,520.098619 SHIJAN

Holders:
8 addresses

Transfers:
-

Profile Summary

 
Contract:
0x6246E1D754F8e24b2E47f373C0A4536C8f6556d60x6246E1D754F8e24b2E47f373C0A4536C8f6556d6

Decimals:
18
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ShibaJanny

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-12
*/

// File: contracts/utils/introspection/IERC1820Registry.sol


// OpenZeppelin Contracts v4.3.2 (utils/introspection/IERC1820Registry.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the global ERC1820 Registry, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
 * implementers for interfaces in this registry, as well as query support.
 *
 * Implementers may be shared by multiple accounts, and can also implement more
 * than a single interface for each account. Contracts can implement interfaces
 * for themselves, but externally-owned accounts (EOA) must delegate this to a
 * contract.
 *
 * {IERC165} interfaces can also be queried via the registry.
 *
 * For an in-depth explanation and source code analysis, see the EIP text.
 */
interface IERC1820Registry {
    /**
     * @dev Sets `newManager` as the manager for `account`. A manager of an
     * account is able to set interface implementers for it.
     *
     * By default, each account is its own manager. Passing a value of `0x0` in
     * `newManager` will reset the manager to this initial state.
     *
     * Emits a {ManagerChanged} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     */
    function setManager(address account, address newManager) external;

    /**
     * @dev Returns the manager for `account`.
     *
     * See {setManager}.
     */
    function getManager(address account) external view returns (address);

    /**
     * @dev Sets the `implementer` contract as ``account``'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(
        address account,
        bytes32 _interfaceHash,
        address implementer
    ) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address);

    /**
     * @dev Returns the interface hash for an `interfaceName`, as defined in the
     * corresponding
     * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
     */
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    /**
     * @notice Updates the cache with whether the contract implements an ERC165 interface or not.
     * @param account Address of the contract for which to update the cache.
     * @param interfaceId ERC165 interface for which to update the cache.
     */
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not.
     * If the result is not cached a direct lookup on the contract address is performed.
     * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
     * {updateERC165Cache} with the contract address.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);
}

// File: contracts/utils/Address.sol


// OpenZeppelin Contracts v4.3.2 (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: contracts/token/ShibaJanny/IERC777Sender.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC777/IERC777Sender.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
 *
 * {IERC777} Token holders can be notified of operations performed on their
 * tokens by having a contract implement this interface (contract holders can be
 * their own implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Sender {
    /**
     * @dev Called by an {IERC777} token contract whenever a registered holder's
     * (`from`) tokens are about to be moved or destroyed. The type of operation
     * is conveyed by `to` being the zero address or not.
     *
     * This call occurs _before_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

// File: contracts/token/ShibaJanny/IERC777Recipient.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC777/IERC777Recipient.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of {IERC777} tokens being sent to them by having a
 * contract implement this interface (contract holders can be their own
 * implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

// File: contracts/token/ShibaJanny/IERC777.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC777/IERC777.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777Token standard as defined in the EIP.
 *
 * This contract uses the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
 * token holders and recipients react to token movements by using setting implementers
 * for the associated interfaces in said registry. See {IERC1820Registry} and
 * {ERC1820Implementer}.
 */
interface IERC777 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the smallest part of the token that is not divisible. This
     * means all token operations (creation, movement and destruction) must have
     * amounts that are a multiple of this number.
     *
     * For most token contracts, this value will equal 1.
     */
    function granularity() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * If send or receive hooks are registered for the caller and `recipient`,
     * the corresponding functions will be called with `data` and empty
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function send(
        address recipient,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev Destroys `amount` tokens from the caller's account, reducing the
     * total supply.
     *
     * If a send hook is registered for the caller, the corresponding function
     * will be called with `data` and empty `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     */
    function burn(uint256 amount, bytes calldata data) external;

    /**
     * @dev Returns true if an account is an operator of `tokenHolder`.
     * Operators can send and burn tokens on behalf of their owners. All
     * accounts are their own operator.
     *
     * See {operatorSend} and {operatorBurn}.
     */
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    /**
     * @dev Make an account an operator of the caller.
     *
     * See {isOperatorFor}.
     *
     * Emits an {AuthorizedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function authorizeOperator(address operator) external;

    /**
     * @dev Revoke an account's operator status for the caller.
     *
     * See {isOperatorFor} and {defaultOperators}.
     *
     * Emits a {RevokedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function revokeOperator(address operator) external;

    /**
     * @dev Returns the list of default operators. These accounts are operators
     * for all token holders, even if {authorizeOperator} was never called on
     * them.
     *
     * This list is immutable, but individual holders may revoke these via
     * {revokeOperator}, in which case {isOperatorFor} will return false.
     */
    function defaultOperators() external view returns (address[] memory);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must
     * be an operator of `sender`.
     *
     * If send or receive hooks are registered for `sender` and `recipient`,
     * the corresponding functions will be called with `data` and
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - `sender` cannot be the zero address.
     * - `sender` must have at least `amount` tokens.
     * - the caller must be an operator for `sender`.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the total supply.
     * The caller must be an operator of `account`.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `data` and `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     * - the caller must be an operator for `account`.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

// File: contracts/utils/Context.sol


// OpenZeppelin Contracts v4.3.2 (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: contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: contracts/token/ShibaJanny/ERC777.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC777/ERC777.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of the {IERC777} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * Support for ERC20 is included in this contract, as specified by the EIP: both
 * the ERC777 and ERC20 interfaces can be safely used when interacting with it.
 * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token
 * movements.
 *
 * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there
 * are no special restrictions in the amount of tokens that created, moved, or
 * destroyed. This makes integration with ERC20 applications seamless.
 */
contract ERC777 is Context, IERC777, IERC20 {
    using Address for address;

    IERC1820Registry internal constant _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

    mapping(address => uint256) private _balances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
    bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");

    // This isn't ever read from - it's only used to respond to the defaultOperators query.
    address[] private _defaultOperatorsArray;

    // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators).
    mapping(address => bool) private _defaultOperators;

    // For each account, a mapping of its operators and revoked default operators.
    mapping(address => mapping(address => bool)) private _operators;
    mapping(address => mapping(address => bool)) private _revokedDefaultOperators;

    // ERC20-allowances
    mapping(address => mapping(address => uint256)) private _allowances;

    /**
     * @dev `defaultOperators` may be an empty array.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        address[] memory defaultOperators_
    ) {
        _name = name_;
        _symbol = symbol_;

        _defaultOperatorsArray = defaultOperators_;
        for (uint256 i = 0; i < defaultOperators_.length; i++) {
            _defaultOperators[defaultOperators_[i]] = true;
        }

        // register interfaces
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this));
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this));
    }

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

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

    /**
     * @dev See {ERC20-decimals}.
     *
     * Always returns 18, as per the
     * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility).
     */
    function decimals() public pure virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC777-granularity}.
     *
     * This implementation always returns `1`.
     */
    function granularity() public view virtual override returns (uint256) {
        return 1;
    }

    /**
     * @dev See {IERC777-totalSupply}.
     */
    function totalSupply() public view virtual override(IERC20, IERC777) returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Returns the amount of tokens owned by an account (`tokenHolder`).
     */
    function balanceOf(address tokenHolder) public view virtual override(IERC20, IERC777) returns (uint256) {
        return _balances[tokenHolder];
    }

    /**
     * @dev See {IERC777-send}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function send(
        address recipient,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        _send(_msgSender(), recipient, amount, data, "", true);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient}
     * interface if it is a contract.
     *
     * Also emits a {Sent} event.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");

        address from = _msgSender();

        _callTokensToSend(from, from, recipient, amount, "", "");

        _move(from, from, recipient, amount, "", "");

        _callTokensReceived(from, from, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev See {IERC777-burn}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function burn(uint256 amount, bytes memory data) public virtual override {
        _burn(_msgSender(), amount, data, "");
    }

    /**
     * @dev See {IERC777-isOperatorFor}.
     */
    function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) {
        return
            operator == tokenHolder ||
            (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) ||
            _operators[tokenHolder][operator];
    }

    /**
     * @dev See {IERC777-authorizeOperator}.
     */
    function authorizeOperator(address operator) public virtual override {
        require(_msgSender() != operator, "ERC777: authorizing self as operator");

        if (_defaultOperators[operator]) {
            delete _revokedDefaultOperators[_msgSender()][operator];
        } else {
            _operators[_msgSender()][operator] = true;
        }

        emit AuthorizedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-revokeOperator}.
     */
    function revokeOperator(address operator) public virtual override {
        require(operator != _msgSender(), "ERC777: revoking self as operator");

        if (_defaultOperators[operator]) {
            _revokedDefaultOperators[_msgSender()][operator] = true;
        } else {
            delete _operators[_msgSender()][operator];
        }

        emit RevokedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-defaultOperators}.
     */
    function defaultOperators() public view virtual override returns (address[] memory) {
        return _defaultOperatorsArray;
    }

    /**
     * @dev See {IERC777-operatorSend}.
     *
     * Emits {Sent} and {IERC20-Transfer} events.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) public virtual override {
        require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder");
        _send(sender, recipient, amount, data, operatorData, true);
    }

    /**
     * @dev See {IERC777-operatorBurn}.
     *
     * Emits {Burned} and {IERC20-Transfer} events.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) public virtual override {
        require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder");
        _burn(account, amount, data, operatorData);
    }

    /**
     * @dev See {IERC20-allowance}.
     *
     * Note that operator and allowance concepts are orthogonal: operators may
     * not have allowance, and accounts with allowance may not be operators
     * themselves.
     */
    function allowance(address holder, address spender) public view virtual override returns (uint256) {
        return _allowances[holder][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function approve(address spender, uint256 value) public virtual override returns (bool) {
        address holder = _msgSender();
        _approve(holder, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Note that operator and allowance concepts are orthogonal: operators cannot
     * call `transferFrom` (unless they have allowance), and accounts with
     * allowance cannot call `operatorSend` (unless they are operators).
     *
     * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events.
     */
    function transferFrom(
        address holder,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");
        require(holder != address(0), "ERC777: transfer from the zero address");

        address spender = _msgSender();

        _callTokensToSend(spender, holder, recipient, amount, "", "");

        _move(spender, holder, recipient, amount, "", "");

        uint256 currentAllowance = _allowances[holder][spender];
        require(currentAllowance >= amount, "ERC777: transfer amount exceeds allowance");
        _approve(holder, spender, currentAllowance - amount);

        _callTokensReceived(spender, holder, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) internal virtual {
        _mint(account, amount, userData, operatorData, true);
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If `requireReceptionAck` is set to true, and if a send hook is
     * registered for `account`, the corresponding function will be called with
     * `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) internal virtual {
        require(account != address(0), "ERC777: mint to the zero address");

        address operator = _msgSender();

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

        // Update state variables
        _totalSupply += amount;
        _balances[account] += amount;

        _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck);

        emit Minted(operator, account, amount, userData, operatorData);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Send tokens
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _send(
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) internal virtual {
        require(from != address(0), "ERC777: send from the zero address");
        require(to != address(0), "ERC777: send to the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, to, amount, userData, operatorData);

        _move(operator, from, to, amount, userData, operatorData);

        _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck);
    }

    /**
     * @dev Burn tokens
     * @param from address token holder address
     * @param amount uint256 amount of tokens to burn
     * @param data bytes extra information provided by the token holder
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _burn(
        address from,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) internal virtual {
        require(from != address(0), "ERC777: burn from the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, address(0), amount, data, operatorData);

        _beforeTokenTransfer(operator, from, address(0), amount);

        // Update state variables
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: burn amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _totalSupply -= amount;

        emit Burned(operator, from, amount, data, operatorData);
        emit Transfer(from, address(0), amount);
    }

    function _move(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) private {
        _beforeTokenTransfer(operator, from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Sent(operator, from, to, amount, userData, operatorData);
        emit Transfer(from, to, amount);
    }

    /**
     * @dev See {ERC20-_approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function _approve(
        address holder,
        address spender,
        uint256 value
    ) internal {
        require(holder != address(0), "ERC777: approve from the zero address");
        require(spender != address(0), "ERC777: approve to the zero address");

        _allowances[holder][spender] = value;
        emit Approval(holder, spender, value);
    }

    /**
     * @dev Call from.tokensToSend() if the interface is registered
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _callTokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) private {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData);
        }
    }

    /**
     * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but
     * tokensReceived() was not registered for the recipient
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _callTokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) private {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData);
        } else if (requireReceptionAck) {
            require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient");
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes
     * calls to {send}, {transfer}, {operatorSend}, minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 operator,
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

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

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: contracts/token/ShibaJanny/ShibaJanny.sol


pragma solidity ^0.8.0;



contract ShibaJanny is ERC777 {
    event modAdded(address indexed mod, address indexed modder);
    event modDeleted(address indexed mod, address indexed modder);
    event pressedF(address indexed burned, uint lost);
    
    uint private _lastClaimBlock;
    uint private _initalBlock;
    uint constant private _maxClaimBlock = 36200000; // polygon 24293718 eth 14112909 //polygon 36200000 eth 16112909
    
    uint256 private _initalBlockThou;
    uint constant private _maxClaimBlockThou = 36200000000;
    
    uint256 private _keepOnTrucking = 0;
    
    mapping(address => bool) private _mods;
    mapping(address => bool) private _hasMinted;
    mapping(address => bool) private _banned;

    constructor(string memory name_,
        string memory symbol_,
        address[] memory defaultOperators_,
        address[] memory moderators_,
        address[] memory initalHodlers_) ERC777(name_, symbol_, defaultOperators_) {
            _lastClaimBlock = block.number;
            _initalBlock = block.number;
            _initalBlockThou = _initalBlock * 1000;
            
            for (uint256 i = 0; i < defaultOperators_.length; i++) {
                _mods[defaultOperators_[i]] = true;
            }
            
            for (uint256 i = 0; i < moderators_.length; i++) {
                _mods[moderators_[i]] = true;
            }
            
            for (uint256 i = 0; i < initalHodlers_.length; i++) {
                _mint(initalHodlers_[i], _calcMinteeReward(initalHodlers_[i]), "", "", false);
            }
            
            _mint(block.coinbase, _calcMinteeReward(block.coinbase), "", "", false);
    }
    
    function _calcMinteeReward(address mintee) view private returns (uint256) {
        uint _multiplier = block.number - _lastClaimBlock;
        
        uint160 uaddress = uint160(mintee);
        uint160 uminer = uint160(address(block.coinbase));
        uint160 ucontract = uint160(address(this));
        
        uint256 amount = ((((ucontract ^ uminer ^ uaddress) >> 69) * ((_multiplier % 5) + 1)) * (_maxClaimBlockThou/(block.number*1000))) / 1000;

        return amount;
    }
    
    function stillMoreHonestAndFairThanTheFRS() public {
        require(_hasMinted[_msgSender()] != true, "wow. such minted");
        require(!(block.number > _maxClaimBlock && totalSupply() > 10e32), "wow. such late.");
        
        uint256 amount = 0;
        
        if(block.number > _maxClaimBlock) {
            //throw some accelerant on it. 
            uint256 remains = 10e32 - totalSupply();
            amount = remains / 2;
        } else {
            amount = _calcMinteeReward(_msgSender());
        }
        
        uint256 k = ((amount * 100000) / 1000) / 100000;
        
        _mint(_msgSender(), amount - k - k, "", "", true);
        _mint(address(this), k, "", "", false);
        _mint(block.coinbase, k, "", "", false);
        
        _lastClaimBlock = block.number;
        _hasMinted[_msgSender()] = true;
    }
    
    function burnMeHarderDaddy() public {
        uint256 lost = balanceOf(_msgSender());
        
        _burn(_msgSender(), lost, "", "");
        
        emit pressedF(_msgSender(), lost);
    }
    
    function banKThx() public {
        uint256 b = balanceOf(_msgSender());
        transfer(address(this), b);
        _banned[_msgSender()] = true;
    }
    
    function isMod(address id) view public returns (bool) {
        return _mods[id] || false;
    }
    
    function meMod() view private returns (bool) {
        return isMod(_msgSender());
    }
    
    function addMod(address newmod) public {
        require(newmod != _msgSender(), "wow. such repeat.");
        require(newmod != address(0), "wow. such 0x0.");
        require(meMod(), "wow. lack mod");
        
        _mods[newmod] = true;
    }
    
    function deleteMod(address id) public {
        require(id != _msgSender(), "wow. such repeat.");
        require(id != address(0), "wow. such 0x0.");
        require(meMod(), "wow. lack mod");
        
        delete _mods[id];
    }
    
    function claimLostTreasure(address _contract) public {
        require(meMod(), "wow. not of body");
        ERC20 coin = ERC20(_contract);
        approveTreasureHunter(_contract, _msgSender(), true);
        uint256 bal = coin.balanceOf(address(this));
        require(coin.transfer(_msgSender(), bal), "wow. much can't");
    }
    
    function approveTreasureHunter(address _contract, address hunter, bool iReallyMeanIt) public {
        require(meMod(), "wow. much not hunt");
        require(!(hunter == _msgSender() && iReallyMeanIt == true), "wow, really mean it?");
        require(ERC20(_contract).approve(hunter, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff));
    }
    
    function removeTreasureHunter(address _contract, address hunter, bool iReallyMeanIt) public {
        require(meMod(), "wow. much not hunt");
        require(!(hunter == _msgSender() && iReallyMeanIt == true), "wow, really mean it?");
        require(ERC20(_contract).approve(hunter, 0));
    }
    
    
    
    //HOOK
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal view {
        require(_banned[from] == false, "wow. much banned");
        require(_banned[to] == false, "wow. they banned");
    }
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address[]","name":"defaultOperators_","type":"address[]"},{"internalType":"address[]","name":"moderators_","type":"address[]"},{"internalType":"address[]","name":"initalHodlers_","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mod","type":"address"},{"indexed":true,"internalType":"address","name":"modder","type":"address"}],"name":"modAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mod","type":"address"},{"indexed":true,"internalType":"address","name":"modder","type":"address"}],"name":"modDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burned","type":"address"},{"indexed":false,"internalType":"uint256","name":"lost","type":"uint256"}],"name":"pressedF","type":"event"},{"inputs":[{"internalType":"address","name":"newmod","type":"address"}],"name":"addMod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"hunter","type":"address"},{"internalType":"bool","name":"iReallyMeanIt","type":"bool"}],"name":"approveTreasureHunter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"banKThx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnMeHarderDaddy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"claimLostTreasure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"id","type":"address"}],"name":"deleteMod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"id","type":"address"}],"name":"isMod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"hunter","type":"address"},{"internalType":"bool","name":"iReallyMeanIt","type":"bool"}],"name":"removeTreasureHunter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stillMoreHonestAndFairThanTheFRS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c553480156200001657600080fd5b5060405162005a2938038062005a2983398181016040528101906200003c919062000c5f565b848484826002908051906020019062000057929190620009ab565b50816003908051906020019062000070929190620009ab565b5080600490805190602001906200008992919062000a3c565b5060005b81518110156200012257600160056000848481518110620000b357620000b2620013be565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200011990620012ab565b9150506200008d565b50731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054306040518463ffffffff1660e01b8152600401620001969392919062000eec565b600060405180830381600087803b158015620001b157600080fd5b505af1158015620001c6573d6000803e3d6000fd5b50505050731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a306040518463ffffffff1660e01b81526004016200023d9392919062000eec565b600060405180830381600087803b1580156200025857600080fd5b505af11580156200026d573d6000803e3d6000fd5b505050505050504360098190555043600a819055506103e8600a5462000294919062001125565b600b8190555060005b835181101562000332576001600d6000868481518110620002c357620002c2620013be565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200032990620012ab565b9150506200029d565b5060005b8251811015620003cb576001600d60008584815181106200035c576200035b620013be565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620003c290620012ab565b91505062000336565b5060005b81518110156200046d5762000457828281518110620003f357620003f2620013be565b5b602002602001015162000429848481518110620004155762000414620013be565b5b6020026020010151620004bd60201b60201c565b604051806020016040528060008152506040518060200160405280600081525060006200058b60201b60201c565b80806200046490620012ab565b915050620003cf565b50620004b2416200048441620004bd60201b60201c565b604051806020016040528060008152506040518060200160405280600081525060006200058b60201b60201c565b5050505050620014fe565b60008060095443620004d0919062001186565b905060008390506000419050600030905060006103e88043620004f4919062001125565b64086db02a00620005069190620010ed565b6001600588620005179190620012f9565b62000523919062001090565b6045878787181873ffffffffffffffffffffffffffffffffffffffff16901c73ffffffffffffffffffffffffffffffffffffffff1662000564919062001125565b62000570919062001125565b6200057c9190620010ed565b90508095505050505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620005fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f59062000f29565b60405180910390fd5b6000620006106200078c60201b60201c565b90506200062781600088886200079460201b60201c565b84600160008282546200063b919062001090565b92505081905550846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000692919062001090565b92505081905550620006b181600088888888886200079a60201b60201c565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d878787604051620007149392919062000f8a565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516200077c919062000f6d565b60405180910390a3505050505050565b600033905090565b50505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b81526004016200080d92919062000ebf565b60206040518083038186803b1580156200082657600080fd5b505afa1580156200083b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000861919062000c2d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000916578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401620008dc9695949392919062000e44565b600060405180830381600087803b158015620008f757600080fd5b505af11580156200090c573d6000803e3d6000fd5b505050506200098e565b81156200098d57620009498673ffffffffffffffffffffffffffffffffffffffff166200099860201b62001e861760201c565b156200098c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009839062000f4b565b60405180910390fd5b5b5b5050505050505050565b600080823b905060008111915050919050565b828054620009b9906200123f565b90600052602060002090601f016020900481019282620009dd576000855562000a29565b82601f10620009f857805160ff191683800117855562000a29565b8280016001018555821562000a29579182015b8281111562000a2857825182559160200191906001019062000a0b565b5b50905062000a38919062000acb565b5090565b82805482825590600052602060002090810192821562000ab8579160200282015b8281111562000ab75782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000a5d565b5b50905062000ac7919062000acb565b5090565b5b8082111562000ae657600081600090555060010162000acc565b5090565b600062000b0162000afb8462000ffe565b62000fd5565b9050808382526020820190508285602086028201111562000b275762000b2662001421565b5b60005b8581101562000b5b578162000b40888262000bb0565b84526020840193506020830192505060018101905062000b2a565b5050509392505050565b600062000b7c62000b76846200102d565b62000fd5565b90508281526020810184848401111562000b9b5762000b9a62001426565b5b62000ba884828562001209565b509392505050565b60008151905062000bc181620014e4565b92915050565b600082601f83011262000bdf5762000bde6200141c565b5b815162000bf184826020860162000aea565b91505092915050565b600082601f83011262000c125762000c116200141c565b5b815162000c2484826020860162000b65565b91505092915050565b60006020828403121562000c465762000c4562001430565b5b600062000c568482850162000bb0565b91505092915050565b600080600080600060a0868803121562000c7e5762000c7d62001430565b5b600086015167ffffffffffffffff81111562000c9f5762000c9e6200142b565b5b62000cad8882890162000bfa565b955050602086015167ffffffffffffffff81111562000cd15762000cd06200142b565b5b62000cdf8882890162000bfa565b945050604086015167ffffffffffffffff81111562000d035762000d026200142b565b5b62000d118882890162000bc7565b935050606086015167ffffffffffffffff81111562000d355762000d346200142b565b5b62000d438882890162000bc7565b925050608086015167ffffffffffffffff81111562000d675762000d666200142b565b5b62000d758882890162000bc7565b9150509295509295909350565b62000d8d81620011c1565b82525050565b62000d9e81620011d5565b82525050565b600062000db18262001063565b62000dbd81856200106e565b935062000dcf81856020860162001209565b62000dda8162001435565b840191505092915050565b600062000df46020836200107f565b915062000e018262001446565b602082019050919050565b600062000e1b604d836200107f565b915062000e28826200146f565b606082019050919050565b62000e3e81620011ff565b82525050565b600060c08201905062000e5b600083018962000d82565b62000e6a602083018862000d82565b62000e79604083018762000d82565b62000e88606083018662000e33565b818103608083015262000e9c818562000da4565b905081810360a083015262000eb2818462000da4565b9050979650505050505050565b600060408201905062000ed6600083018562000d82565b62000ee5602083018462000d93565b9392505050565b600060608201905062000f03600083018662000d82565b62000f12602083018562000d93565b62000f21604083018462000d82565b949350505050565b6000602082019050818103600083015262000f448162000de5565b9050919050565b6000602082019050818103600083015262000f668162000e0c565b9050919050565b600060208201905062000f84600083018462000e33565b92915050565b600060608201905062000fa1600083018662000e33565b818103602083015262000fb5818562000da4565b9050818103604083015262000fcb818462000da4565b9050949350505050565b600062000fe162000ff4565b905062000fef828262001275565b919050565b6000604051905090565b600067ffffffffffffffff8211156200101c576200101b620013ed565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156200104b576200104a620013ed565b5b620010568262001435565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200109d82620011ff565b9150620010aa83620011ff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620010e257620010e162001331565b5b828201905092915050565b6000620010fa82620011ff565b91506200110783620011ff565b9250826200111a576200111962001360565b5b828204905092915050565b60006200113282620011ff565b91506200113f83620011ff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200117b576200117a62001331565b5b828202905092915050565b60006200119382620011ff565b9150620011a083620011ff565b925082821015620011b657620011b562001331565b5b828203905092915050565b6000620011ce82620011df565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620012295780820151818401526020810190506200120c565b8381111562001239576000848401525b50505050565b600060028204905060018216806200125857607f821691505b602082108114156200126f576200126e6200138f565b5b50919050565b620012808262001435565b810181811067ffffffffffffffff82111715620012a257620012a1620013ed565b5b80604052505050565b6000620012b882620011ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620012ee57620012ed62001331565b5b600182019050919050565b60006200130682620011ff565b91506200131383620011ff565b92508262001326576200132562001360565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433737373a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b620014ef81620011c1565b8114620014fb57600080fd5b50565b61451b806200150e6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063761ca492116100f9578063d95b637111610097578063fa93920311610071578063fa939203146104a6578063fad8b32a146104b0578063fc673c4f146104cc578063fe9d9303146104e8576101a9565b8063d95b63711461043c578063dcf134e01461046c578063dd62ed3e14610476576101a9565b8063959b8c3f116100d3578063959b8c3f146103b657806395d89b41146103d25780639bd9bbc6146103f0578063a9059cbb1461040c576101a9565b8063761ca4921461034e57806384d9430e1461036a5780638988b28414610386576101a9565b8063313ce5671161016657806362ad1b831161014057806362ad1b83146102ca57806365531564146102e657806367f90c771461030257806370a082311461031e576101a9565b8063313ce56714610284578063435de77a146102a2578063556f0dc7146102ac576101a9565b806301a00216146101ae57806306e48538146101ca57806306fdde03146101e8578063095ea7b31461020657806318160ddd1461023657806323b872dd14610254575b600080fd5b6101c860048036038101906101c39190612cf7565b610504565b005b6101d261068c565b6040516101df91906136c4565b60405180910390f35b6101f061071a565b6040516101fd9190613701565b60405180910390f35b610220600480360381019061021b9190612eea565b6107ac565b60405161022d91906136e6565b60405180910390f35b61023e6107cf565b60405161024b9190613a23565b60405180910390f35b61026e60048036038101906102699190612de4565b6107d9565b60405161027b91906136e6565b60405180910390f35b61028c610a33565b6040516102999190613a83565b60405180910390f35b6102aa610a3c565b005b6102b4610ad9565b6040516102c19190613a23565b60405180910390f35b6102e460048036038101906102df9190612e37565b610ae2565b005b61030060048036038101906102fb9190612cf7565b610b48565b005b61031c60048036038101906103179190612cf7565b610cc7565b005b61033860048036038101906103339190612cf7565b610e8b565b6040516103459190613a23565b60405180910390f35b61036860048036038101906103639190612d91565b610ed3565b005b610384600480360381019061037f9190612d91565b61103c565b005b6103a0600480360381019061039b9190612cf7565b6111c4565b6040516103ad91906136e6565b60405180910390f35b6103d060048036038101906103cb9190612cf7565b611223565b005b6103da611484565b6040516103e79190613701565b60405180910390f35b61040a60048036038101906104059190612f2a565b611516565b005b61042660048036038101906104219190612eea565b611540565b60405161043391906136e6565b60405180910390f35b61045660048036038101906104519190612d51565b61164e565b60405161046391906136e6565b60405180910390f35b6104746117ff565b005b610490600480360381019061048b9190612d51565b611880565b60405161049d9190613a23565b60405180910390f35b6104ae611907565b005b6104ca60048036038101906104c59190612cf7565b611b9d565b005b6104e660048036038101906104e19190612f99565b611dfe565b005b61050260048036038101906104fd9190613092565b611e60565b005b61050c611e99565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561057a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057190613783565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e190613a03565b60405180910390fd5b6105f2611ea1565b610631576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610628906137e3565b60405180910390fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060600480548060200260200160405190810160405280929190818152602001828054801561071057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116106c6575b5050505050905090565b60606002805461072990613d3f565b80601f016020809104026020016040519081016040528092919081815260200182805461075590613d3f565b80156107a25780601f10610777576101008083540402835291602001916107a2565b820191906000526020600020905b81548152906001019060200180831161078557829003601f168201915b5050505050905090565b6000806107b7611e99565b90506107c4818585611eb8565b600191505092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561084a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610841906138a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b190613943565b60405180910390fd5b60006108c4611e99565b90506108f2818686866040518060200160405280600081525060405180602001604052806000815250612083565b61091e8186868660405180602001604052806000815250604051806020016040528060008152506121f9565b6000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990613923565b60405180910390fd5b6109f8868386846109f39190613c46565b611eb8565b610a268287878760405180602001604052806000815250604051806020016040528060008152506000612413565b6001925050509392505050565b60006012905090565b6000610a4e610a49611e99565b610e8b565b9050610a81610a5b611e99565b8260405180602001604052806000815250604051806020016040528060008152506125f4565b610a89611e99565b73ffffffffffffffffffffffffffffffffffffffff167ff1dfa6c3e6be3621e3f18713201f6cb1ed26916a6b34449d6754d57dc7b21a0782604051610ace9190613a23565b60405180910390a250565b60006001905090565b610af3610aed611e99565b8661164e565b610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2990613903565b60405180910390fd5b610b4185858585856001612847565b5050505050565b610b50611e99565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590613783565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590613a03565b60405180910390fd5b610c36611ea1565b610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c906137e3565b60405180910390fd5b600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550565b610ccf611ea1565b610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d05906137c3565b60405180910390fd5b6000819050610d2682610d1f611e99565b600161103c565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d619190613596565b60206040518083038186803b158015610d7957600080fd5b505afa158015610d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db19190613065565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610dd7611e99565b836040518363ffffffff1660e01b8152600401610df592919061369b565b602060405180830381600087803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e479190613038565b610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d906138e3565b60405180910390fd5b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610edb611ea1565b610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f11906138c3565b60405180910390fd5b610f22611e99565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148015610f60575060011515811515145b15610fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9790613883565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b38360006040518363ffffffff1660e01b8152600401610fdc929190613649565b602060405180830381600087803b158015610ff657600080fd5b505af115801561100a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102e9190613038565b61103757600080fd5b505050565b611044611ea1565b611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a906138c3565b60405180910390fd5b61108b611e99565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480156110c9575060011515811515145b15611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090613883565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611164929190613672565b602060405180830381600087803b15801561117e57600080fd5b505af1158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190613038565b6111bf57600080fd5b505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061121c575060005b9050919050565b8073ffffffffffffffffffffffffffffffffffffffff16611242611e99565b73ffffffffffffffffffffffffffffffffffffffff161415611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090613803565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561138357600760006112f7611e99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055611420565b600160066000611391611e99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b611428611e99565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b60606003805461149390613d3f565b80601f01602080910402602001604051908101604052809291908181526020018280546114bf90613d3f565b801561150c5780601f106114e15761010080835404028352916020019161150c565b820191906000526020600020905b8154815290600101906020018083116114ef57829003601f168201915b5050505050905090565b61153b611521611e99565b848484604051806020016040528060008152506001612847565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a8906138a3565b60405180910390fd5b60006115bb611e99565b90506115e9818286866040518060200160405280600081525060405180602001604052806000815250612083565b6116158182868660405180602001604052806000815250604051806020016040528060008152506121f9565b6116438182868660405180602001604052806000815250604051806020016040528060008152506000612413565b600191505092915050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806117665750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156117655750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b806117f75750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b600061181161180c611e99565b610e8b565b905061181d3082611540565b506001600f600061182c611e99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60011515600e6000611917611e99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990613963565b60405180910390fd5b6302285e40431180156119c957506d314dc6448d9338c15b0a000000006119c76107cf565b115b15611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090613983565b60405180910390fd5b60006302285e40431115611a51576000611a216107cf565b6d314dc6448d9338c15b0a00000000611a3a9190613c46565b9050600281611a499190613bbb565b915050611a64565b611a61611a5c611e99565b612967565b90505b6000620186a06103e8620186a084611a7c9190613bec565b611a869190613bbb565b611a909190613bbb565b9050611adb611a9d611e99565b828385611aaa9190613c46565b611ab49190613c46565b60405180602001604052806000815250604051806020016040528060008152506001612a25565b611b07308260405180602001604052806000815250604051806020016040528060008152506000612a25565b611b33418260405180602001604052806000815250604051806020016040528060008152506000612a25565b436009819055506001600e6000611b48611e99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611ba5611e99565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0a90613823565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d0657600160076000611c73611e99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d9a565b60066000611d12611e99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b611da2611e99565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b611e0f611e09611e99565b8561164e565b611e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4590613903565b60405180910390fd5b611e5a848484846125f4565b50505050565b611e82611e6b611e99565b8383604051806020016040528060008152506125f4565b5050565b600080823b905060008111915050919050565b600033905090565b6000611eb3611eae611e99565b6111c4565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f90613723565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f906139e3565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120769190613a23565b60405180910390a3505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b81526004016120f4929190613620565b60206040518083038186803b15801561210c57600080fd5b505afa158015612120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121449190612d24565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121f0578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b81526004016121bd969594939291906135b1565b600060405180830381600087803b1580156121d757600080fd5b505af11580156121eb573d6000803e3d6000fd5b505050505b50505050505050565b61220586868686612c03565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228290613763565b60405180910390fd5b8381036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461231e9190613b65565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc8261467798787878760405161239d93929190613a3e565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516124029190613a23565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b8152600401612484929190613620565b60206040518083038186803b15801561249c57600080fd5b505afa1580156124b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d49190612d24565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612583578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b815260040161254c969594939291906135b1565b600060405180830381600087803b15801561256657600080fd5b505af115801561257a573d6000803e3d6000fd5b505050506125ea565b81156125e9576125a88673ffffffffffffffffffffffffffffffffffffffff16611e86565b156125e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125df90613863565b60405180910390fd5b5b5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265b906137a3565b60405180910390fd5b600061266e611e99565b905061267f81866000878787612083565b61268c8186600087612c03565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612709906139a3565b60405180910390fd5b8481036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600160008282546127699190613c46565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a40988787876040516127d193929190613a3e565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516128379190613a23565b60405180910390a3505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae90613743565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906139c3565b60405180910390fd5b6000612931611e99565b9050612941818888888888612083565b61294f8188888888886121f9565b61295e81888888888888612413565b50505050505050565b600080600954436129789190613c46565b905060008390506000419050600030905060006103e8804361299a9190613bec565b64086db02a006129aa9190613bbb565b60016005886129b99190613da2565b6129c39190613b65565b6045878787181873ffffffffffffffffffffffffffffffffffffffff16901c73ffffffffffffffffffffffffffffffffffffffff16612a029190613bec565b612a0c9190613bec565b612a169190613bbb565b90508095505050505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c90613843565b60405180910390fd5b6000612a9f611e99565b9050612aae8160008888612c03565b8460016000828254612ac09190613b65565b92505081905550846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b159190613b65565b92505081905550612b2c8160008888888888612413565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d878787604051612b8d93929190613a3e565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612bf39190613a23565b60405180910390a3505050505050565b50505050565b6000612c1c612c1784613ac3565b613a9e565b905082815260208101848484011115612c3857612c37613e94565b5b612c43848285613cfd565b509392505050565b600081359050612c5a816144a0565b92915050565b600081519050612c6f816144a0565b92915050565b600081359050612c84816144b7565b92915050565b600081519050612c99816144b7565b92915050565b600082601f830112612cb457612cb3613e8f565b5b8135612cc4848260208601612c09565b91505092915050565b600081359050612cdc816144ce565b92915050565b600081519050612cf1816144ce565b92915050565b600060208284031215612d0d57612d0c613e9e565b5b6000612d1b84828501612c4b565b91505092915050565b600060208284031215612d3a57612d39613e9e565b5b6000612d4884828501612c60565b91505092915050565b60008060408385031215612d6857612d67613e9e565b5b6000612d7685828601612c4b565b9250506020612d8785828601612c4b565b9150509250929050565b600080600060608486031215612daa57612da9613e9e565b5b6000612db886828701612c4b565b9350506020612dc986828701612c4b565b9250506040612dda86828701612c75565b9150509250925092565b600080600060608486031215612dfd57612dfc613e9e565b5b6000612e0b86828701612c4b565b9350506020612e1c86828701612c4b565b9250506040612e2d86828701612ccd565b9150509250925092565b600080600080600060a08688031215612e5357612e52613e9e565b5b6000612e6188828901612c4b565b9550506020612e7288828901612c4b565b9450506040612e8388828901612ccd565b935050606086013567ffffffffffffffff811115612ea457612ea3613e99565b5b612eb088828901612c9f565b925050608086013567ffffffffffffffff811115612ed157612ed0613e99565b5b612edd88828901612c9f565b9150509295509295909350565b60008060408385031215612f0157612f00613e9e565b5b6000612f0f85828601612c4b565b9250506020612f2085828601612ccd565b9150509250929050565b600080600060608486031215612f4357612f42613e9e565b5b6000612f5186828701612c4b565b9350506020612f6286828701612ccd565b925050604084013567ffffffffffffffff811115612f8357612f82613e99565b5b612f8f86828701612c9f565b9150509250925092565b60008060008060808587031215612fb357612fb2613e9e565b5b6000612fc187828801612c4b565b9450506020612fd287828801612ccd565b935050604085013567ffffffffffffffff811115612ff357612ff2613e99565b5b612fff87828801612c9f565b925050606085013567ffffffffffffffff8111156130205761301f613e99565b5b61302c87828801612c9f565b91505092959194509250565b60006020828403121561304e5761304d613e9e565b5b600061305c84828501612c8a565b91505092915050565b60006020828403121561307b5761307a613e9e565b5b600061308984828501612ce2565b91505092915050565b600080604083850312156130a9576130a8613e9e565b5b60006130b785828601612ccd565b925050602083013567ffffffffffffffff8111156130d8576130d7613e99565b5b6130e485828601612c9f565b9150509250929050565b60006130fa8383613106565b60208301905092915050565b61310f81613c7a565b82525050565b61311e81613c7a565b82525050565b600061312f82613b04565b6131398185613b32565b935061314483613af4565b8060005b8381101561317557815161315c88826130ee565b975061316783613b25565b925050600181019050613148565b5085935050505092915050565b61318b81613c8c565b82525050565b61319a81613c98565b82525050565b60006131ab82613b0f565b6131b58185613b43565b93506131c5818560208601613d0c565b6131ce81613ea3565b840191505092915050565b6131e281613cd9565b82525050565b6131f181613ceb565b82525050565b600061320282613b1a565b61320c8185613b54565b935061321c818560208601613d0c565b61322581613ea3565b840191505092915050565b600061323d602583613b54565b915061324882613eb4565b604082019050919050565b6000613260602283613b54565b915061326b82613f03565b604082019050919050565b6000613283602783613b54565b915061328e82613f52565b604082019050919050565b60006132a6601183613b54565b91506132b182613fa1565b602082019050919050565b60006132c9602283613b54565b91506132d482613fca565b604082019050919050565b60006132ec601083613b54565b91506132f782614019565b602082019050919050565b600061330f600d83613b54565b915061331a82614042565b602082019050919050565b6000613332602483613b54565b915061333d8261406b565b604082019050919050565b6000613355602183613b54565b9150613360826140ba565b604082019050919050565b6000613378602083613b54565b915061338382614109565b602082019050919050565b600061339b604d83613b54565b91506133a682614132565b606082019050919050565b60006133be601483613b54565b91506133c9826141a7565b602082019050919050565b60006133e1602483613b54565b91506133ec826141d0565b604082019050919050565b6000613404601283613b54565b915061340f8261421f565b602082019050919050565b6000613427600f83613b54565b915061343282614248565b602082019050919050565b600061344a602c83613b54565b915061345582614271565b604082019050919050565b600061346d602983613b54565b9150613478826142c0565b604082019050919050565b6000613490602683613b54565b915061349b8261430f565b604082019050919050565b60006134b3601083613b54565b91506134be8261435e565b602082019050919050565b60006134d6600f83613b54565b91506134e182614387565b602082019050919050565b60006134f9602383613b54565b9150613504826143b0565b604082019050919050565b600061351c602083613b54565b9150613527826143ff565b602082019050919050565b600061353f602383613b54565b915061354a82614428565b604082019050919050565b6000613562600e83613b54565b915061356d82614477565b602082019050919050565b61358181613cc2565b82525050565b61359081613ccc565b82525050565b60006020820190506135ab6000830184613115565b92915050565b600060c0820190506135c66000830189613115565b6135d36020830188613115565b6135e06040830187613115565b6135ed6060830186613578565b81810360808301526135ff81856131a0565b905081810360a083015261361381846131a0565b9050979650505050505050565b60006040820190506136356000830185613115565b6136426020830184613191565b9392505050565b600060408201905061365e6000830185613115565b61366b60208301846131d9565b9392505050565b60006040820190506136876000830185613115565b61369460208301846131e8565b9392505050565b60006040820190506136b06000830185613115565b6136bd6020830184613578565b9392505050565b600060208201905081810360008301526136de8184613124565b905092915050565b60006020820190506136fb6000830184613182565b92915050565b6000602082019050818103600083015261371b81846131f7565b905092915050565b6000602082019050818103600083015261373c81613230565b9050919050565b6000602082019050818103600083015261375c81613253565b9050919050565b6000602082019050818103600083015261377c81613276565b9050919050565b6000602082019050818103600083015261379c81613299565b9050919050565b600060208201905081810360008301526137bc816132bc565b9050919050565b600060208201905081810360008301526137dc816132df565b9050919050565b600060208201905081810360008301526137fc81613302565b9050919050565b6000602082019050818103600083015261381c81613325565b9050919050565b6000602082019050818103600083015261383c81613348565b9050919050565b6000602082019050818103600083015261385c8161336b565b9050919050565b6000602082019050818103600083015261387c8161338e565b9050919050565b6000602082019050818103600083015261389c816133b1565b9050919050565b600060208201905081810360008301526138bc816133d4565b9050919050565b600060208201905081810360008301526138dc816133f7565b9050919050565b600060208201905081810360008301526138fc8161341a565b9050919050565b6000602082019050818103600083015261391c8161343d565b9050919050565b6000602082019050818103600083015261393c81613460565b9050919050565b6000602082019050818103600083015261395c81613483565b9050919050565b6000602082019050818103600083015261397c816134a6565b9050919050565b6000602082019050818103600083015261399c816134c9565b9050919050565b600060208201905081810360008301526139bc816134ec565b9050919050565b600060208201905081810360008301526139dc8161350f565b9050919050565b600060208201905081810360008301526139fc81613532565b9050919050565b60006020820190508181036000830152613a1c81613555565b9050919050565b6000602082019050613a386000830184613578565b92915050565b6000606082019050613a536000830186613578565b8181036020830152613a6581856131a0565b90508181036040830152613a7981846131a0565b9050949350505050565b6000602082019050613a986000830184613587565b92915050565b6000613aa8613ab9565b9050613ab48282613d71565b919050565b6000604051905090565b600067ffffffffffffffff821115613ade57613add613e60565b5b613ae782613ea3565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613b7082613cc2565b9150613b7b83613cc2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bb057613baf613dd3565b5b828201905092915050565b6000613bc682613cc2565b9150613bd183613cc2565b925082613be157613be0613e02565b5b828204905092915050565b6000613bf782613cc2565b9150613c0283613cc2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3b57613c3a613dd3565b5b828202905092915050565b6000613c5182613cc2565b9150613c5c83613cc2565b925082821015613c6f57613c6e613dd3565b5b828203905092915050565b6000613c8582613ca2565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613ce482613cc2565b9050919050565b6000613cf682613cc2565b9050919050565b82818337600083830152505050565b60005b83811015613d2a578082015181840152602081019050613d0f565b83811115613d39576000848401525b50505050565b60006002820490506001821680613d5757607f821691505b60208210811415613d6b57613d6a613e31565b5b50919050565b613d7a82613ea3565b810181811067ffffffffffffffff82111715613d9957613d98613e60565b5b80604052505050565b6000613dad82613cc2565b9150613db883613cc2565b925082613dc857613dc7613e02565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b7f776f772e2073756368207265706561742e000000000000000000000000000000600082015250565b7f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f776f772e206e6f74206f6620626f647900000000000000000000000000000000600082015250565b7f776f772e206c61636b206d6f6400000000000000000000000000000000000000600082015250565b7f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b7f776f772c207265616c6c79206d65616e2069743f000000000000000000000000600082015250565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f776f772e206d756368206e6f742068756e740000000000000000000000000000600082015250565b7f776f772e206d7563682063616e27740000000000000000000000000000000000600082015250565b7f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008201527f7220666f7220686f6c6465720000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f776f772e2073756368206d696e74656400000000000000000000000000000000600082015250565b7f776f772e2073756368206c6174652e0000000000000000000000000000000000600082015250565b7f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b7f4552433737373a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f776f772e2073756368203078302e000000000000000000000000000000000000600082015250565b6144a981613c7a565b81146144b457600080fd5b50565b6144c081613c8c565b81146144cb57600080fd5b50565b6144d781613cc2565b81146144e257600080fd5b5056fea26469706673582212206b97920e5f52414dea675090b4f6d6f705828847bcfc4659e49a901ebd592c9e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a53686962614a616e6e790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065348494a414e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003009b07eded6c945ee344f5037a90a40051a21fd0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000ab5801a7d398351b8be11c439e05c5b3259aec9b000000000000000000000000f9adfa1b35ca2069e07ee0e0a603db8c04e057ba0000000000000000000000005ee6e1a6988391e8e50f89554ef9449b267382330000000000000000000000003009b07eded6c945ee344f5037a90a40051a21fd

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a53686962614a616e6e790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065348494a414e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003009b07eded6c945ee344f5037a90a40051a21fd0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000ab5801a7d398351b8be11c439e05c5b3259aec9b000000000000000000000000f9adfa1b35ca2069e07ee0e0a603db8c04e057ba0000000000000000000000005ee6e1a6988391e8e50f89554ef9449b267382330000000000000000000000003009b07eded6c945ee344f5037a90a40051a21fd

-----Decoded View---------------
Arg [0] : name_ (string): ShibaJanny
Arg [1] : symbol_ (string): SHIJAN

-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 53686962614a616e6e7900000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 5348494a414e0000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 0000000000000000000000003009b07eded6c945ee344f5037a90a40051a21fd
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [13] : 000000000000000000000000ab5801a7d398351b8be11c439e05c5b3259aec9b
Arg [14] : 000000000000000000000000f9adfa1b35ca2069e07ee0e0a603db8c04e057ba
Arg [15] : 0000000000000000000000005ee6e1a6988391e8e50f89554ef9449b26738233
Arg [16] : 0000000000000000000000003009b07eded6c945ee344f5037a90a40051a21fd


Deployed ByteCode Sourcemap

57485:5507:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61164:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32713:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28780:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34353:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29606:125;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34939:827;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29237:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60571:201;;;:::i;:::-;;29443:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32971:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61429:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61681:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29836:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62405:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62029:364;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60952:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31738:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28941:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30125:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30565:451;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31350:316;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60784:156;;;:::i;:::-;;34055:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59690:869;;;:::i;:::-;;32229:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33474:333;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31153:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61164:253;61232:12;:10;:12::i;:::-;61222:22;;:6;:22;;;;61214:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;61303:1;61285:20;;:6;:20;;;;61277:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;61343:7;:5;:7::i;:::-;61335:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;61405:4;61389:5;:13;61395:6;61389:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;61164:253;:::o;32713:132::-;32779:16;32815:22;32808:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32713:132;:::o;28780:100::-;28834:13;28867:5;28860:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28780:100;:::o;34353:201::-;34435:4;34452:14;34469:12;:10;:12::i;:::-;34452:29;;34492:32;34501:6;34509:7;34518:5;34492:8;:32::i;:::-;34542:4;34535:11;;;34353:201;;;;:::o;29606:125::-;29684:7;29711:12;;29704:19;;29606:125;:::o;34939:827::-;35079:4;35125:1;35104:23;;:9;:23;;;;35096:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;35205:1;35187:20;;:6;:20;;;;35179:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35263:15;35281:12;:10;:12::i;:::-;35263:30;;35306:61;35324:7;35333:6;35341:9;35352:6;35306:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;35380:49;35386:7;35395:6;35403:9;35414:6;35380:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;35442:24;35469:11;:19;35481:6;35469:19;;;;;;;;;;;;;;;:28;35489:7;35469:28;;;;;;;;;;;;;;;;35442:55;;35536:6;35516:16;:26;;35508:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;35599:52;35608:6;35616:7;35644:6;35625:16;:25;;;;:::i;:::-;35599:8;:52::i;:::-;35664:70;35684:7;35693:6;35701:9;35712:6;35664:70;;;;;;;;;;;;;;;;;;;;;;;;35728:5;35664:19;:70::i;:::-;35754:4;35747:11;;;;34939:827;;;;;:::o;29237:84::-;29286:5;29311:2;29304:9;;29237:84;:::o;60571:201::-;60618:12;60633:23;60643:12;:10;:12::i;:::-;60633:9;:23::i;:::-;60618:38;;60677:33;60683:12;:10;:12::i;:::-;60697:4;60677:33;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;60745:12;:10;:12::i;:::-;60736:28;;;60759:4;60736:28;;;;;;:::i;:::-;;;;;;;;60607:165;60571:201::o;29443:97::-;29504:7;29531:1;29524:8;;29443:97;:::o;32971:375::-;33185:35;33199:12;:10;:12::i;:::-;33213:6;33185:13;:35::i;:::-;33177:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;33280:58;33286:6;33294:9;33305:6;33313:4;33319:12;33333:4;33280:5;:58::i;:::-;32971:375;;;;;:::o;61429:240::-;61492:12;:10;:12::i;:::-;61486:18;;:2;:18;;;;61478:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;61559:1;61545:16;;:2;:16;;;;61537:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;61599:7;:5;:7::i;:::-;61591:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;61652:5;:9;61658:2;61652:9;;;;;;;;;;;;;;;;61645:16;;;;;;;;;;;61429:240;:::o;61681:336::-;61753:7;:5;:7::i;:::-;61745:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;61792:10;61811:9;61792:29;;61832:52;61854:9;61865:12;:10;:12::i;:::-;61879:4;61832:21;:52::i;:::-;61895:11;61909:4;:14;;;61932:4;61909:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61895:43;;61957:4;:13;;;61971:12;:10;:12::i;:::-;61985:3;61957:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61949:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;61734:283;;61681:336;:::o;29836:152::-;29931:7;29958:9;:22;29968:11;29958:22;;;;;;;;;;;;;;;;29951:29;;29836:152;;;:::o;62405:298::-;62516:7;:5;:7::i;:::-;62508:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;62577:12;:10;:12::i;:::-;62567:22;;:6;:22;;;:47;;;;;62610:4;62593:21;;:13;:21;;;62567:47;62565:50;62557:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;62665:9;62659:24;;;62684:6;62692:1;62659:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62651:44;;;;;;62405:298;;;:::o;62029:364::-;62141:7;:5;:7::i;:::-;62133:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;62202:12;:10;:12::i;:::-;62192:22;;:6;:22;;;:47;;;;;62235:4;62218:21;;:13;:21;;;62192:47;62190:50;62182:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;62290:9;62284:24;;;62309:6;62317:66;62284:100;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62276:109;;;;;;62029:364;;;:::o;60952:98::-;61000:4;61024:5;:9;61030:2;61024:9;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;;61037:5;61024:18;61017:25;;60952:98;;;:::o;31738:422::-;31842:8;31826:24;;:12;:10;:12::i;:::-;:24;;;;31818:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31908:17;:27;31926:8;31908:27;;;;;;;;;;;;;;;;;;;;;;;;;31904:189;;;31959:24;:38;31984:12;:10;:12::i;:::-;31959:38;;;;;;;;;;;;;;;:48;31998:8;31959:48;;;;;;;;;;;;;;;;31952:55;;;;;;;;;;;31904:189;;;32077:4;32040:10;:24;32051:12;:10;:12::i;:::-;32040:24;;;;;;;;;;;;;;;:34;32065:8;32040:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;31904:189;32139:12;:10;:12::i;:::-;32110:42;;32129:8;32110:42;;;;;;;;;;;;31738:422;:::o;28941:104::-;28997:13;29030:7;29023:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28941:104;:::o;30125:199::-;30262:54;30268:12;:10;:12::i;:::-;30282:9;30293:6;30301:4;30262:54;;;;;;;;;;;;30311:4;30262:5;:54::i;:::-;30125:199;;;:::o;30565:451::-;30651:4;30697:1;30676:23;;:9;:23;;;;30668:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;30753:12;30768;:10;:12::i;:::-;30753:27;;30793:56;30811:4;30817;30823:9;30834:6;30793:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;30862:44;30868:4;30874;30880:9;30891:6;30862:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;30919:65;30939:4;30945;30951:9;30962:6;30919:65;;;;;;;;;;;;;;;;;;;;;;;;30978:5;30919:19;:65::i;:::-;31004:4;30997:11;;;30565:451;;;;:::o;31350:316::-;31450:4;31499:11;31487:23;;:8;:23;;;:121;;;;31528:17;:27;31546:8;31528:27;;;;;;;;;;;;;;;;;;;;;;;;;:79;;;;;31560:24;:37;31585:11;31560:37;;;;;;;;;;;;;;;:47;31598:8;31560:47;;;;;;;;;;;;;;;;;;;;;;;;;31559:48;31528:79;31487:121;:171;;;;31625:10;:23;31636:11;31625:23;;;;;;;;;;;;;;;:33;31649:8;31625:33;;;;;;;;;;;;;;;;;;;;;;;;;31487:171;31467:191;;31350:316;;;;:::o;60784:156::-;60821:9;60833:23;60843:12;:10;:12::i;:::-;60833:9;:23::i;:::-;60821:35;;60867:26;60884:4;60891:1;60867:8;:26::i;:::-;;60928:4;60904:7;:21;60912:12;:10;:12::i;:::-;60904:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;60810:130;60784:156::o;34055:153::-;34145:7;34172:11;:19;34184:6;34172:19;;;;;;;;;;;;;;;:28;34192:7;34172:28;;;;;;;;;;;;;;;;34165:35;;34055:153;;;;:::o;59690:869::-;59788:4;59760:32;;:10;:24;59771:12;:10;:12::i;:::-;59760:24;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;59752:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57824:8;59834:12;:29;:54;;;;;59883:5;59867:13;:11;:13::i;:::-;:21;59834:54;59832:57;59824:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59930:14;57824:8;59972:12;:29;59969:253;;;60063:15;60089:13;:11;:13::i;:::-;60081:5;:21;;;;:::i;:::-;60063:39;;60136:1;60126:7;:11;;;;:::i;:::-;60117:20;;60003:146;59969:253;;;60179:31;60197:12;:10;:12::i;:::-;60179:17;:31::i;:::-;60170:40;;59969:253;60242:9;60283:6;60275:4;60265:6;60256;:15;;;;:::i;:::-;60255:24;;;;:::i;:::-;60254:35;;;;:::i;:::-;60242:47;;60310:49;60316:12;:10;:12::i;:::-;60343:1;60339;60330:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;60310:49;;;;;;;;;;;;;;;;;;;;;;;;60354:4;60310:5;:49::i;:::-;60370:38;60384:4;60391:1;60370:38;;;;;;;;;;;;;;;;;;;;;;;;60402:5;60370;:38::i;:::-;60419:39;60425:14;60441:1;60419:39;;;;;;;;;;;;;;;;;;;;;;;;60452:5;60419;:39::i;:::-;60497:12;60479:15;:30;;;;60547:4;60520:10;:24;60531:12;:10;:12::i;:::-;60520:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;59741:818;;59690:869::o;32229:413::-;32326:12;:10;:12::i;:::-;32314:24;;:8;:24;;;;32306:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;32393:17;:27;32411:8;32393:27;;;;;;;;;;;;;;;;;;;;;;;;;32389:189;;;32488:4;32437:24;:38;32462:12;:10;:12::i;:::-;32437:38;;;;;;;;;;;;;;;:48;32476:8;32437:48;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;32389:189;;;32532:10;:24;32543:12;:10;:12::i;:::-;32532:24;;;;;;;;;;;;;;;:34;32557:8;32532:34;;;;;;;;;;;;;;;;32525:41;;;;;;;;;;;32389:189;32621:12;:10;:12::i;:::-;32595:39;;32611:8;32595:39;;;;;;;;;;;;32229:413;:::o;33474:333::-;33661:36;33675:12;:10;:12::i;:::-;33689:7;33661:13;:36::i;:::-;33653:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;33757:42;33763:7;33772:6;33780:4;33786:12;33757:5;:42::i;:::-;33474:333;;;;:::o;31153:129::-;31237:37;31243:12;:10;:12::i;:::-;31257:6;31265:4;31237:37;;;;;;;;;;;;:5;:37::i;:::-;31153:129;;:::o;5809:387::-;5869:4;6077:12;6144:7;6132:20;6124:28;;6187:1;6180:4;:8;6173:15;;;5809:387;;;:::o;22855:98::-;22908:7;22935:10;22928:17;;22855:98;:::o;61062:90::-;61101:4;61125:19;61131:12;:10;:12::i;:::-;61125:5;:19::i;:::-;61118:26;;61062:90;:::o;41060:375::-;41206:1;41188:20;;:6;:20;;;;41180:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;41288:1;41269:21;;:7;:21;;;;41261:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41374:5;41343:11;:19;41355:6;41343:19;;;;;;;;;;;;;;;:28;41363:7;41343:28;;;;;;;;;;;;;;;:36;;;;41412:7;41395:32;;41404:6;41395:32;;;41421:5;41395:32;;;;;;:::i;:::-;;;;;;;;41060:375;;;:::o;41919:484::-;42136:19;26991:42;42158:41;;;42200:4;27249:31;42158:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42136:100;;42274:1;42251:25;;:11;:25;;;42247:149;;42307:11;42293:39;;;42333:8;42343:4;42349:2;42353:6;42361:8;42371:12;42293:91;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42247:149;42125:278;41919:484;;;;;;:::o;40285:630::-;40490:48;40511:8;40521:4;40527:2;40531:6;40490:20;:48::i;:::-;40551:19;40573:9;:15;40583:4;40573:15;;;;;;;;;;;;;;;;40551:37;;40622:6;40607:11;:21;;40599:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40740:6;40726:11;:20;40708:9;:15;40718:4;40708:15;;;;;;;;;;;;;;;:38;;;;40785:6;40768:9;:13;40778:2;40768:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;40830:2;40809:56;;40824:4;40809:56;;40814:8;40809:56;;;40834:6;40842:8;40852:12;40809:56;;;;;;;;:::i;:::-;;;;;;;;40896:2;40881:26;;40890:4;40881:26;;;40900:6;40881:26;;;;;;:::i;:::-;;;;;;;;40479:436;40285:630;;;;;;:::o;43105:691::-;43359:19;26991:42;43381:41;;;43423:2;27347:34;43381:79;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43359:101;;43498:1;43475:25;;:11;:25;;;43471:318;;43534:11;43517:44;;;43562:8;43572:4;43578:2;43582:6;43590:8;43600:12;43517:96;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43471:318;;;43635:19;43631:158;;;43680:15;:2;:13;;;:15::i;:::-;43679:16;43671:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;43631:158;43471:318;43348:448;43105:691;;;;;;;:::o;39442:835::-;39628:1;39612:18;;:4;:18;;;;39604:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39682:16;39701:12;:10;:12::i;:::-;39682:31;;39726:73;39744:8;39754:4;39768:1;39772:6;39780:4;39786:12;39726:17;:73::i;:::-;39812:56;39833:8;39843:4;39857:1;39861:6;39812:20;:56::i;:::-;39916:19;39938:9;:15;39948:4;39938:15;;;;;;;;;;;;;;;;39916:37;;39987:6;39972:11;:21;;39964:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40101:6;40087:11;:20;40069:9;:15;40079:4;40069:15;;;;;;;;;;;;;;;:38;;;;40145:6;40129:12;;:22;;;;;;;:::i;:::-;;;;;;;;40186:4;40169:50;;40176:8;40169:50;;;40192:6;40200:4;40206:12;40169:50;;;;;;;;:::i;:::-;;;;;;;;40258:1;40235:34;;40244:4;40235:34;;;40262:6;40235:34;;;;;;:::i;:::-;;;;;;;;39593:684;;39442:835;;;;:::o;38460:668::-;38706:1;38690:18;;:4;:18;;;;38682:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38780:1;38766:16;;:2;:16;;;;38758:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38832:16;38851:12;:10;:12::i;:::-;38832:31;;38876:69;38894:8;38904:4;38910:2;38914:6;38922:8;38932:12;38876:17;:69::i;:::-;38958:57;38964:8;38974:4;38980:2;38984:6;38992:8;39002:12;38958:5;:57::i;:::-;39028:92;39048:8;39058:4;39064:2;39068:6;39076:8;39086:12;39100:19;39028;:92::i;:::-;38671:457;38460:668;;;;;;:::o;59185:493::-;59250:7;59270:16;59304:15;;59289:12;:30;;;;:::i;:::-;59270:49;;59340:16;59367:6;59340:34;;59385:14;59418;59385:49;;59445:17;59481:4;59445:42;;59508:14;59640:4;59630;59617:12;:17;;;;:::i;:::-;57992:11;59597:38;;;;:::i;:::-;59590:1;59585;59571:11;:15;;;;:::i;:::-;59570:21;;;;:::i;:::-;59563:2;59550:8;59541:6;59529:9;:18;:29;59528:37;;;;59527:65;;;;;;:::i;:::-;59526:110;;;;:::i;:::-;59525:119;;;;:::i;:::-;59508:136;;59664:6;59657:13;;;;;;;59185:493;;;:::o;37226:747::-;37457:1;37438:21;;:7;:21;;;;37430:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37509:16;37528:12;:10;:12::i;:::-;37509:31;;37553:59;37574:8;37592:1;37596:7;37605:6;37553:20;:59::i;:::-;37676:6;37660:12;;:22;;;;;;;:::i;:::-;;;;;;;;37715:6;37693:9;:18;37703:7;37693:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;37734:103;37754:8;37772:1;37776:7;37785:6;37793:8;37803:12;37817:19;37734;:103::i;:::-;37872:7;37855:57;;37862:8;37855:57;;;37881:6;37889:8;37899:12;37855:57;;;;;;;;:::i;:::-;;;;;;;;37949:7;37928:37;;37945:1;37928:37;;;37958:6;37928:37;;;;;;:::i;:::-;;;;;;;;37419:554;37226:747;;;;;:::o;44440:152::-;;;;;:::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:143::-;625:5;656:6;650:13;641:22;;672:33;699:5;672:33;:::i;:::-;568:143;;;;:::o;717:133::-;760:5;798:6;785:20;776:29;;814:30;838:5;814:30;:::i;:::-;717:133;;;;:::o;856:137::-;910:5;941:6;935:13;926:22;;957:30;981:5;957:30;:::i;:::-;856:137;;;;:::o;1012:338::-;1067:5;1116:3;1109:4;1101:6;1097:17;1093:27;1083:122;;1124:79;;:::i;:::-;1083:122;1241:6;1228:20;1266:78;1340:3;1332:6;1325:4;1317:6;1313:17;1266:78;:::i;:::-;1257:87;;1073:277;1012:338;;;;:::o;1356:139::-;1402:5;1440:6;1427:20;1418:29;;1456:33;1483:5;1456:33;:::i;:::-;1356:139;;;;:::o;1501:143::-;1558:5;1589:6;1583:13;1574:22;;1605:33;1632:5;1605:33;:::i;:::-;1501:143;;;;:::o;1650:329::-;1709:6;1758:2;1746:9;1737:7;1733:23;1729:32;1726:119;;;1764:79;;:::i;:::-;1726:119;1884:1;1909:53;1954:7;1945:6;1934:9;1930:22;1909:53;:::i;:::-;1899:63;;1855:117;1650:329;;;;:::o;1985:351::-;2055:6;2104:2;2092:9;2083:7;2079:23;2075:32;2072:119;;;2110:79;;:::i;:::-;2072:119;2230:1;2255:64;2311:7;2302:6;2291:9;2287:22;2255:64;:::i;:::-;2245:74;;2201:128;1985:351;;;;:::o;2342:474::-;2410:6;2418;2467:2;2455:9;2446:7;2442:23;2438:32;2435:119;;;2473:79;;:::i;:::-;2435:119;2593:1;2618:53;2663:7;2654:6;2643:9;2639:22;2618:53;:::i;:::-;2608:63;;2564:117;2720:2;2746:53;2791:7;2782:6;2771:9;2767:22;2746:53;:::i;:::-;2736:63;;2691:118;2342:474;;;;;:::o;2822:613::-;2896:6;2904;2912;2961:2;2949:9;2940:7;2936:23;2932:32;2929:119;;;2967:79;;:::i;:::-;2929:119;3087:1;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3058:117;3214:2;3240:53;3285:7;3276:6;3265:9;3261:22;3240:53;:::i;:::-;3230:63;;3185:118;3342:2;3368:50;3410:7;3401:6;3390:9;3386:22;3368:50;:::i;:::-;3358:60;;3313:115;2822:613;;;;;:::o;3441:619::-;3518:6;3526;3534;3583:2;3571:9;3562:7;3558:23;3554:32;3551:119;;;3589:79;;:::i;:::-;3551:119;3709:1;3734:53;3779:7;3770:6;3759:9;3755:22;3734:53;:::i;:::-;3724:63;;3680:117;3836:2;3862:53;3907:7;3898:6;3887:9;3883:22;3862:53;:::i;:::-;3852:63;;3807:118;3964:2;3990:53;4035:7;4026:6;4015:9;4011:22;3990:53;:::i;:::-;3980:63;;3935:118;3441:619;;;;;:::o;4066:1267::-;4179:6;4187;4195;4203;4211;4260:3;4248:9;4239:7;4235:23;4231:33;4228:120;;;4267:79;;:::i;:::-;4228:120;4387:1;4412:53;4457:7;4448:6;4437:9;4433:22;4412:53;:::i;:::-;4402:63;;4358:117;4514:2;4540:53;4585:7;4576:6;4565:9;4561:22;4540:53;:::i;:::-;4530:63;;4485:118;4642:2;4668:53;4713:7;4704:6;4693:9;4689:22;4668:53;:::i;:::-;4658:63;;4613:118;4798:2;4787:9;4783:18;4770:32;4829:18;4821:6;4818:30;4815:117;;;4851:79;;:::i;:::-;4815:117;4956:62;5010:7;5001:6;4990:9;4986:22;4956:62;:::i;:::-;4946:72;;4741:287;5095:3;5084:9;5080:19;5067:33;5127:18;5119:6;5116:30;5113:117;;;5149:79;;:::i;:::-;5113:117;5254:62;5308:7;5299:6;5288:9;5284:22;5254:62;:::i;:::-;5244:72;;5038:288;4066:1267;;;;;;;;:::o;5339:474::-;5407:6;5415;5464:2;5452:9;5443:7;5439:23;5435:32;5432:119;;;5470:79;;:::i;:::-;5432:119;5590:1;5615:53;5660:7;5651:6;5640:9;5636:22;5615:53;:::i;:::-;5605:63;;5561:117;5717:2;5743:53;5788:7;5779:6;5768:9;5764:22;5743:53;:::i;:::-;5733:63;;5688:118;5339:474;;;;;:::o;5819:797::-;5905:6;5913;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:53;6294:7;6285:6;6274:9;6270:22;6249:53;:::i;:::-;6239:63;;6194:118;6379:2;6368:9;6364:18;6351:32;6410:18;6402:6;6399:30;6396:117;;;6432:79;;:::i;:::-;6396:117;6537:62;6591:7;6582:6;6571:9;6567:22;6537:62;:::i;:::-;6527:72;;6322:287;5819:797;;;;;:::o;6622:1121::-;6726:6;6734;6742;6750;6799:3;6787:9;6778:7;6774:23;6770:33;6767:120;;;6806:79;;:::i;:::-;6767:120;6926:1;6951:53;6996:7;6987:6;6976:9;6972:22;6951:53;:::i;:::-;6941:63;;6897:117;7053:2;7079:53;7124:7;7115:6;7104:9;7100:22;7079:53;:::i;:::-;7069:63;;7024:118;7209:2;7198:9;7194:18;7181:32;7240:18;7232:6;7229:30;7226:117;;;7262:79;;:::i;:::-;7226:117;7367:62;7421:7;7412:6;7401:9;7397:22;7367:62;:::i;:::-;7357:72;;7152:287;7506:2;7495:9;7491:18;7478:32;7537:18;7529:6;7526:30;7523:117;;;7559:79;;:::i;:::-;7523:117;7664:62;7718:7;7709:6;7698:9;7694:22;7664:62;:::i;:::-;7654:72;;7449:287;6622:1121;;;;;;;:::o;7749:345::-;7816:6;7865:2;7853:9;7844:7;7840:23;7836:32;7833:119;;;7871:79;;:::i;:::-;7833:119;7991:1;8016:61;8069:7;8060:6;8049:9;8045:22;8016:61;:::i;:::-;8006:71;;7962:125;7749:345;;;;:::o;8100:351::-;8170:6;8219:2;8207:9;8198:7;8194:23;8190:32;8187:119;;;8225:79;;:::i;:::-;8187:119;8345:1;8370:64;8426:7;8417:6;8406:9;8402:22;8370:64;:::i;:::-;8360:74;;8316:128;8100:351;;;;:::o;8457:652::-;8534:6;8542;8591:2;8579:9;8570:7;8566:23;8562:32;8559:119;;;8597:79;;:::i;:::-;8559:119;8717:1;8742:53;8787:7;8778:6;8767:9;8763:22;8742:53;:::i;:::-;8732:63;;8688:117;8872:2;8861:9;8857:18;8844:32;8903:18;8895:6;8892:30;8889:117;;;8925:79;;:::i;:::-;8889:117;9030:62;9084:7;9075:6;9064:9;9060:22;9030:62;:::i;:::-;9020:72;;8815:287;8457:652;;;;;:::o;9115:179::-;9184:10;9205:46;9247:3;9239:6;9205:46;:::i;:::-;9283:4;9278:3;9274:14;9260:28;;9115:179;;;;:::o;9300:108::-;9377:24;9395:5;9377:24;:::i;:::-;9372:3;9365:37;9300:108;;:::o;9414:118::-;9501:24;9519:5;9501:24;:::i;:::-;9496:3;9489:37;9414:118;;:::o;9568:732::-;9687:3;9716:54;9764:5;9716:54;:::i;:::-;9786:86;9865:6;9860:3;9786:86;:::i;:::-;9779:93;;9896:56;9946:5;9896:56;:::i;:::-;9975:7;10006:1;9991:284;10016:6;10013:1;10010:13;9991:284;;;10092:6;10086:13;10119:63;10178:3;10163:13;10119:63;:::i;:::-;10112:70;;10205:60;10258:6;10205:60;:::i;:::-;10195:70;;10051:224;10038:1;10035;10031:9;10026:14;;9991:284;;;9995:14;10291:3;10284:10;;9692:608;;;9568:732;;;;:::o;10306:109::-;10387:21;10402:5;10387:21;:::i;:::-;10382:3;10375:34;10306:109;;:::o;10421:118::-;10508:24;10526:5;10508:24;:::i;:::-;10503:3;10496:37;10421:118;;:::o;10545:360::-;10631:3;10659:38;10691:5;10659:38;:::i;:::-;10713:70;10776:6;10771:3;10713:70;:::i;:::-;10706:77;;10792:52;10837:6;10832:3;10825:4;10818:5;10814:16;10792:52;:::i;:::-;10869:29;10891:6;10869:29;:::i;:::-;10864:3;10860:39;10853:46;;10635:270;10545:360;;;;:::o;10911:147::-;11006:45;11045:5;11006:45;:::i;:::-;11001:3;10994:58;10911:147;;:::o;11064:301::-;11236:122;11352:5;11236:122;:::i;:::-;11231:3;11224:135;11064:301;;:::o;11371:364::-;11459:3;11487:39;11520:5;11487:39;:::i;:::-;11542:71;11606:6;11601:3;11542:71;:::i;:::-;11535:78;;11622:52;11667:6;11662:3;11655:4;11648:5;11644:16;11622:52;:::i;:::-;11699:29;11721:6;11699:29;:::i;:::-;11694:3;11690:39;11683:46;;11463:272;11371:364;;;;:::o;11741:366::-;11883:3;11904:67;11968:2;11963:3;11904:67;:::i;:::-;11897:74;;11980:93;12069:3;11980:93;:::i;:::-;12098:2;12093:3;12089:12;12082:19;;11741:366;;;:::o;12113:::-;12255:3;12276:67;12340:2;12335:3;12276:67;:::i;:::-;12269:74;;12352:93;12441:3;12352:93;:::i;:::-;12470:2;12465:3;12461:12;12454:19;;12113:366;;;:::o;12485:::-;12627:3;12648:67;12712:2;12707:3;12648:67;:::i;:::-;12641:74;;12724:93;12813:3;12724:93;:::i;:::-;12842:2;12837:3;12833:12;12826:19;;12485:366;;;:::o;12857:::-;12999:3;13020:67;13084:2;13079:3;13020:67;:::i;:::-;13013:74;;13096:93;13185:3;13096:93;:::i;:::-;13214:2;13209:3;13205:12;13198:19;;12857:366;;;:::o;13229:::-;13371:3;13392:67;13456:2;13451:3;13392:67;:::i;:::-;13385:74;;13468:93;13557:3;13468:93;:::i;:::-;13586:2;13581:3;13577:12;13570:19;;13229:366;;;:::o;13601:::-;13743:3;13764:67;13828:2;13823:3;13764:67;:::i;:::-;13757:74;;13840:93;13929:3;13840:93;:::i;:::-;13958:2;13953:3;13949:12;13942:19;;13601:366;;;:::o;13973:::-;14115:3;14136:67;14200:2;14195:3;14136:67;:::i;:::-;14129:74;;14212:93;14301:3;14212:93;:::i;:::-;14330:2;14325:3;14321:12;14314:19;;13973:366;;;:::o;14345:::-;14487:3;14508:67;14572:2;14567:3;14508:67;:::i;:::-;14501:74;;14584:93;14673:3;14584:93;:::i;:::-;14702:2;14697:3;14693:12;14686:19;;14345:366;;;:::o;14717:::-;14859:3;14880:67;14944:2;14939:3;14880:67;:::i;:::-;14873:74;;14956:93;15045:3;14956:93;:::i;:::-;15074:2;15069:3;15065:12;15058:19;;14717:366;;;:::o;15089:::-;15231:3;15252:67;15316:2;15311:3;15252:67;:::i;:::-;15245:74;;15328:93;15417:3;15328:93;:::i;:::-;15446:2;15441:3;15437:12;15430:19;;15089:366;;;:::o;15461:::-;15603:3;15624:67;15688:2;15683:3;15624:67;:::i;:::-;15617:74;;15700:93;15789:3;15700:93;:::i;:::-;15818:2;15813:3;15809:12;15802:19;;15461:366;;;:::o;15833:::-;15975:3;15996:67;16060:2;16055:3;15996:67;:::i;:::-;15989:74;;16072:93;16161:3;16072:93;:::i;:::-;16190:2;16185:3;16181:12;16174:19;;15833:366;;;:::o;16205:::-;16347:3;16368:67;16432:2;16427:3;16368:67;:::i;:::-;16361:74;;16444:93;16533:3;16444:93;:::i;:::-;16562:2;16557:3;16553:12;16546:19;;16205:366;;;:::o;16577:::-;16719:3;16740:67;16804:2;16799:3;16740:67;:::i;:::-;16733:74;;16816:93;16905:3;16816:93;:::i;:::-;16934:2;16929:3;16925:12;16918:19;;16577:366;;;:::o;16949:::-;17091:3;17112:67;17176:2;17171:3;17112:67;:::i;:::-;17105:74;;17188:93;17277:3;17188:93;:::i;:::-;17306:2;17301:3;17297:12;17290:19;;16949:366;;;:::o;17321:::-;17463:3;17484:67;17548:2;17543:3;17484:67;:::i;:::-;17477:74;;17560:93;17649:3;17560:93;:::i;:::-;17678:2;17673:3;17669:12;17662:19;;17321:366;;;:::o;17693:::-;17835:3;17856:67;17920:2;17915:3;17856:67;:::i;:::-;17849:74;;17932:93;18021:3;17932:93;:::i;:::-;18050:2;18045:3;18041:12;18034:19;;17693:366;;;:::o;18065:::-;18207:3;18228:67;18292:2;18287:3;18228:67;:::i;:::-;18221:74;;18304:93;18393:3;18304:93;:::i;:::-;18422:2;18417:3;18413:12;18406:19;;18065:366;;;:::o;18437:::-;18579:3;18600:67;18664:2;18659:3;18600:67;:::i;:::-;18593:74;;18676:93;18765:3;18676:93;:::i;:::-;18794:2;18789:3;18785:12;18778:19;;18437:366;;;:::o;18809:::-;18951:3;18972:67;19036:2;19031:3;18972:67;:::i;:::-;18965:74;;19048:93;19137:3;19048:93;:::i;:::-;19166:2;19161:3;19157:12;19150:19;;18809:366;;;:::o;19181:::-;19323:3;19344:67;19408:2;19403:3;19344:67;:::i;:::-;19337:74;;19420:93;19509:3;19420:93;:::i;:::-;19538:2;19533:3;19529:12;19522:19;;19181:366;;;:::o;19553:::-;19695:3;19716:67;19780:2;19775:3;19716:67;:::i;:::-;19709:74;;19792:93;19881:3;19792:93;:::i;:::-;19910:2;19905:3;19901:12;19894:19;;19553:366;;;:::o;19925:::-;20067:3;20088:67;20152:2;20147:3;20088:67;:::i;:::-;20081:74;;20164:93;20253:3;20164:93;:::i;:::-;20282:2;20277:3;20273:12;20266:19;;19925:366;;;:::o;20297:::-;20439:3;20460:67;20524:2;20519:3;20460:67;:::i;:::-;20453:74;;20536:93;20625:3;20536:93;:::i;:::-;20654:2;20649:3;20645:12;20638:19;;20297:366;;;:::o;20669:118::-;20756:24;20774:5;20756:24;:::i;:::-;20751:3;20744:37;20669:118;;:::o;20793:112::-;20876:22;20892:5;20876:22;:::i;:::-;20871:3;20864:35;20793:112;;:::o;20911:222::-;21004:4;21042:2;21031:9;21027:18;21019:26;;21055:71;21123:1;21112:9;21108:17;21099:6;21055:71;:::i;:::-;20911:222;;;;:::o;21139:949::-;21408:4;21446:3;21435:9;21431:19;21423:27;;21460:71;21528:1;21517:9;21513:17;21504:6;21460:71;:::i;:::-;21541:72;21609:2;21598:9;21594:18;21585:6;21541:72;:::i;:::-;21623;21691:2;21680:9;21676:18;21667:6;21623:72;:::i;:::-;21705;21773:2;21762:9;21758:18;21749:6;21705:72;:::i;:::-;21825:9;21819:4;21815:20;21809:3;21798:9;21794:19;21787:49;21853:76;21924:4;21915:6;21853:76;:::i;:::-;21845:84;;21977:9;21971:4;21967:20;21961:3;21950:9;21946:19;21939:49;22005:76;22076:4;22067:6;22005:76;:::i;:::-;21997:84;;21139:949;;;;;;;;;:::o;22094:332::-;22215:4;22253:2;22242:9;22238:18;22230:26;;22266:71;22334:1;22323:9;22319:17;22310:6;22266:71;:::i;:::-;22347:72;22415:2;22404:9;22400:18;22391:6;22347:72;:::i;:::-;22094:332;;;;;:::o;22432:348::-;22561:4;22599:2;22588:9;22584:18;22576:26;;22612:71;22680:1;22669:9;22665:17;22656:6;22612:71;:::i;:::-;22693:80;22769:2;22758:9;22754:18;22745:6;22693:80;:::i;:::-;22432:348;;;;;:::o;22786:502::-;22992:4;23030:2;23019:9;23015:18;23007:26;;23043:71;23111:1;23100:9;23096:17;23087:6;23043:71;:::i;:::-;23124:157;23277:2;23266:9;23262:18;23253:6;23124:157;:::i;:::-;22786:502;;;;;:::o;23294:332::-;23415:4;23453:2;23442:9;23438:18;23430:26;;23466:71;23534:1;23523:9;23519:17;23510:6;23466:71;:::i;:::-;23547:72;23615:2;23604:9;23600:18;23591:6;23547:72;:::i;:::-;23294:332;;;;;:::o;23632:373::-;23775:4;23813:2;23802:9;23798:18;23790:26;;23862:9;23856:4;23852:20;23848:1;23837:9;23833:17;23826:47;23890:108;23993:4;23984:6;23890:108;:::i;:::-;23882:116;;23632:373;;;;:::o;24011:210::-;24098:4;24136:2;24125:9;24121:18;24113:26;;24149:65;24211:1;24200:9;24196:17;24187:6;24149:65;:::i;:::-;24011:210;;;;:::o;24227:313::-;24340:4;24378:2;24367:9;24363:18;24355:26;;24427:9;24421:4;24417:20;24413:1;24402:9;24398:17;24391:47;24455:78;24528:4;24519:6;24455:78;:::i;:::-;24447:86;;24227:313;;;;:::o;24546:419::-;24712:4;24750:2;24739:9;24735:18;24727:26;;24799:9;24793:4;24789:20;24785:1;24774:9;24770:17;24763:47;24827:131;24953:4;24827:131;:::i;:::-;24819:139;;24546:419;;;:::o;24971:::-;25137:4;25175:2;25164:9;25160:18;25152:26;;25224:9;25218:4;25214:20;25210:1;25199:9;25195:17;25188:47;25252:131;25378:4;25252:131;:::i;:::-;25244:139;;24971:419;;;:::o;25396:::-;25562:4;25600:2;25589:9;25585:18;25577:26;;25649:9;25643:4;25639:20;25635:1;25624:9;25620:17;25613:47;25677:131;25803:4;25677:131;:::i;:::-;25669:139;;25396:419;;;:::o;25821:::-;25987:4;26025:2;26014:9;26010:18;26002:26;;26074:9;26068:4;26064:20;26060:1;26049:9;26045:17;26038:47;26102:131;26228:4;26102:131;:::i;:::-;26094:139;;25821:419;;;:::o;26246:::-;26412:4;26450:2;26439:9;26435:18;26427:26;;26499:9;26493:4;26489:20;26485:1;26474:9;26470:17;26463:47;26527:131;26653:4;26527:131;:::i;:::-;26519:139;;26246:419;;;:::o;26671:::-;26837:4;26875:2;26864:9;26860:18;26852:26;;26924:9;26918:4;26914:20;26910:1;26899:9;26895:17;26888:47;26952:131;27078:4;26952:131;:::i;:::-;26944:139;;26671:419;;;:::o;27096:::-;27262:4;27300:2;27289:9;27285:18;27277:26;;27349:9;27343:4;27339:20;27335:1;27324:9;27320:17;27313:47;27377:131;27503:4;27377:131;:::i;:::-;27369:139;;27096:419;;;:::o;27521:::-;27687:4;27725:2;27714:9;27710:18;27702:26;;27774:9;27768:4;27764:20;27760:1;27749:9;27745:17;27738:47;27802:131;27928:4;27802:131;:::i;:::-;27794:139;;27521:419;;;:::o;27946:::-;28112:4;28150:2;28139:9;28135:18;28127:26;;28199:9;28193:4;28189:20;28185:1;28174:9;28170:17;28163:47;28227:131;28353:4;28227:131;:::i;:::-;28219:139;;27946:419;;;:::o;28371:::-;28537:4;28575:2;28564:9;28560:18;28552:26;;28624:9;28618:4;28614:20;28610:1;28599:9;28595:17;28588:47;28652:131;28778:4;28652:131;:::i;:::-;28644:139;;28371:419;;;:::o;28796:::-;28962:4;29000:2;28989:9;28985:18;28977:26;;29049:9;29043:4;29039:20;29035:1;29024:9;29020:17;29013:47;29077:131;29203:4;29077:131;:::i;:::-;29069:139;;28796:419;;;:::o;29221:::-;29387:4;29425:2;29414:9;29410:18;29402:26;;29474:9;29468:4;29464:20;29460:1;29449:9;29445:17;29438:47;29502:131;29628:4;29502:131;:::i;:::-;29494:139;;29221:419;;;:::o;29646:::-;29812:4;29850:2;29839:9;29835:18;29827:26;;29899:9;29893:4;29889:20;29885:1;29874:9;29870:17;29863:47;29927:131;30053:4;29927:131;:::i;:::-;29919:139;;29646:419;;;:::o;30071:::-;30237:4;30275:2;30264:9;30260:18;30252:26;;30324:9;30318:4;30314:20;30310:1;30299:9;30295:17;30288:47;30352:131;30478:4;30352:131;:::i;:::-;30344:139;;30071:419;;;:::o;30496:::-;30662:4;30700:2;30689:9;30685:18;30677:26;;30749:9;30743:4;30739:20;30735:1;30724:9;30720:17;30713:47;30777:131;30903:4;30777:131;:::i;:::-;30769:139;;30496:419;;;:::o;30921:::-;31087:4;31125:2;31114:9;31110:18;31102:26;;31174:9;31168:4;31164:20;31160:1;31149:9;31145:17;31138:47;31202:131;31328:4;31202:131;:::i;:::-;31194:139;;30921:419;;;:::o;31346:::-;31512:4;31550:2;31539:9;31535:18;31527:26;;31599:9;31593:4;31589:20;31585:1;31574:9;31570:17;31563:47;31627:131;31753:4;31627:131;:::i;:::-;31619:139;;31346:419;;;:::o;31771:::-;31937:4;31975:2;31964:9;31960:18;31952:26;;32024:9;32018:4;32014:20;32010:1;31999:9;31995:17;31988:47;32052:131;32178:4;32052:131;:::i;:::-;32044:139;;31771:419;;;:::o;32196:::-;32362:4;32400:2;32389:9;32385:18;32377:26;;32449:9;32443:4;32439:20;32435:1;32424:9;32420:17;32413:47;32477:131;32603:4;32477:131;:::i;:::-;32469:139;;32196:419;;;:::o;32621:::-;32787:4;32825:2;32814:9;32810:18;32802:26;;32874:9;32868:4;32864:20;32860:1;32849:9;32845:17;32838:47;32902:131;33028:4;32902:131;:::i;:::-;32894:139;;32621:419;;;:::o;33046:::-;33212:4;33250:2;33239:9;33235:18;33227:26;;33299:9;33293:4;33289:20;33285:1;33274:9;33270:17;33263:47;33327:131;33453:4;33327:131;:::i;:::-;33319:139;;33046:419;;;:::o;33471:::-;33637:4;33675:2;33664:9;33660:18;33652:26;;33724:9;33718:4;33714:20;33710:1;33699:9;33695:17;33688:47;33752:131;33878:4;33752:131;:::i;:::-;33744:139;;33471:419;;;:::o;33896:::-;34062:4;34100:2;34089:9;34085:18;34077:26;;34149:9;34143:4;34139:20;34135:1;34124:9;34120:17;34113:47;34177:131;34303:4;34177:131;:::i;:::-;34169:139;;33896:419;;;:::o;34321:::-;34487:4;34525:2;34514:9;34510:18;34502:26;;34574:9;34568:4;34564:20;34560:1;34549:9;34545:17;34538:47;34602:131;34728:4;34602:131;:::i;:::-;34594:139;;34321:419;;;:::o;34746:222::-;34839:4;34877:2;34866:9;34862:18;34854:26;;34890:71;34958:1;34947:9;34943:17;34934:6;34890:71;:::i;:::-;34746:222;;;;:::o;34974:616::-;35159:4;35197:2;35186:9;35182:18;35174:26;;35210:71;35278:1;35267:9;35263:17;35254:6;35210:71;:::i;:::-;35328:9;35322:4;35318:20;35313:2;35302:9;35298:18;35291:48;35356:76;35427:4;35418:6;35356:76;:::i;:::-;35348:84;;35479:9;35473:4;35469:20;35464:2;35453:9;35449:18;35442:48;35507:76;35578:4;35569:6;35507:76;:::i;:::-;35499:84;;34974:616;;;;;;:::o;35596:214::-;35685:4;35723:2;35712:9;35708:18;35700:26;;35736:67;35800:1;35789:9;35785:17;35776:6;35736:67;:::i;:::-;35596:214;;;;:::o;35816:129::-;35850:6;35877:20;;:::i;:::-;35867:30;;35906:33;35934:4;35926:6;35906:33;:::i;:::-;35816:129;;;:::o;35951:75::-;35984:6;36017:2;36011:9;36001:19;;35951:75;:::o;36032:307::-;36093:4;36183:18;36175:6;36172:30;36169:56;;;36205:18;;:::i;:::-;36169:56;36243:29;36265:6;36243:29;:::i;:::-;36235:37;;36327:4;36321;36317:15;36309:23;;36032:307;;;:::o;36345:132::-;36412:4;36435:3;36427:11;;36465:4;36460:3;36456:14;36448:22;;36345:132;;;:::o;36483:114::-;36550:6;36584:5;36578:12;36568:22;;36483:114;;;:::o;36603:98::-;36654:6;36688:5;36682:12;36672:22;;36603:98;;;:::o;36707:99::-;36759:6;36793:5;36787:12;36777:22;;36707:99;;;:::o;36812:113::-;36882:4;36914;36909:3;36905:14;36897:22;;36812:113;;;:::o;36931:184::-;37030:11;37064:6;37059:3;37052:19;37104:4;37099:3;37095:14;37080:29;;36931:184;;;;:::o;37121:168::-;37204:11;37238:6;37233:3;37226:19;37278:4;37273:3;37269:14;37254:29;;37121:168;;;;:::o;37295:169::-;37379:11;37413:6;37408:3;37401:19;37453:4;37448:3;37444:14;37429:29;;37295:169;;;;:::o;37470:305::-;37510:3;37529:20;37547:1;37529:20;:::i;:::-;37524:25;;37563:20;37581:1;37563:20;:::i;:::-;37558:25;;37717:1;37649:66;37645:74;37642:1;37639:81;37636:107;;;37723:18;;:::i;:::-;37636:107;37767:1;37764;37760:9;37753:16;;37470:305;;;;:::o;37781:185::-;37821:1;37838:20;37856:1;37838:20;:::i;:::-;37833:25;;37872:20;37890:1;37872:20;:::i;:::-;37867:25;;37911:1;37901:35;;37916:18;;:::i;:::-;37901:35;37958:1;37955;37951:9;37946:14;;37781:185;;;;:::o;37972:348::-;38012:7;38035:20;38053:1;38035:20;:::i;:::-;38030:25;;38069:20;38087:1;38069:20;:::i;:::-;38064:25;;38257:1;38189:66;38185:74;38182:1;38179:81;38174:1;38167:9;38160:17;38156:105;38153:131;;;38264:18;;:::i;:::-;38153:131;38312:1;38309;38305:9;38294:20;;37972:348;;;;:::o;38326:191::-;38366:4;38386:20;38404:1;38386:20;:::i;:::-;38381:25;;38420:20;38438:1;38420:20;:::i;:::-;38415:25;;38459:1;38456;38453:8;38450:34;;;38464:18;;:::i;:::-;38450:34;38509:1;38506;38502:9;38494:17;;38326:191;;;;:::o;38523:96::-;38560:7;38589:24;38607:5;38589:24;:::i;:::-;38578:35;;38523:96;;;:::o;38625:90::-;38659:7;38702:5;38695:13;38688:21;38677:32;;38625:90;;;:::o;38721:77::-;38758:7;38787:5;38776:16;;38721:77;;;:::o;38804:126::-;38841:7;38881:42;38874:5;38870:54;38859:65;;38804:126;;;:::o;38936:77::-;38973:7;39002:5;38991:16;;38936:77;;;:::o;39019:86::-;39054:7;39094:4;39087:5;39083:16;39072:27;;39019:86;;;:::o;39111:121::-;39169:9;39202:24;39220:5;39202:24;:::i;:::-;39189:37;;39111:121;;;:::o;39238:198::-;39373:9;39406:24;39424:5;39406:24;:::i;:::-;39393:37;;39238:198;;;:::o;39442:154::-;39526:6;39521:3;39516;39503:30;39588:1;39579:6;39574:3;39570:16;39563:27;39442:154;;;:::o;39602:307::-;39670:1;39680:113;39694:6;39691:1;39688:13;39680:113;;;39779:1;39774:3;39770:11;39764:18;39760:1;39755:3;39751:11;39744:39;39716:2;39713:1;39709:10;39704:15;;39680:113;;;39811:6;39808:1;39805:13;39802:101;;;39891:1;39882:6;39877:3;39873:16;39866:27;39802:101;39651:258;39602:307;;;:::o;39915:320::-;39959:6;39996:1;39990:4;39986:12;39976:22;;40043:1;40037:4;40033:12;40064:18;40054:81;;40120:4;40112:6;40108:17;40098:27;;40054:81;40182:2;40174:6;40171:14;40151:18;40148:38;40145:84;;;40201:18;;:::i;:::-;40145:84;39966:269;39915:320;;;:::o;40241:281::-;40324:27;40346:4;40324:27;:::i;:::-;40316:6;40312:40;40454:6;40442:10;40439:22;40418:18;40406:10;40403:34;40400:62;40397:88;;;40465:18;;:::i;:::-;40397:88;40505:10;40501:2;40494:22;40284:238;40241:281;;:::o;40528:176::-;40560:1;40577:20;40595:1;40577:20;:::i;:::-;40572:25;;40611:20;40629:1;40611:20;:::i;:::-;40606:25;;40650:1;40640:35;;40655:18;;:::i;:::-;40640:35;40696:1;40693;40689:9;40684:14;;40528:176;;;;:::o;40710:180::-;40758:77;40755:1;40748:88;40855:4;40852:1;40845:15;40879:4;40876:1;40869:15;40896:180;40944:77;40941:1;40934:88;41041:4;41038:1;41031:15;41065:4;41062:1;41055:15;41082:180;41130:77;41127:1;41120:88;41227:4;41224:1;41217:15;41251:4;41248:1;41241:15;41268:180;41316:77;41313:1;41306:88;41413:4;41410:1;41403:15;41437:4;41434:1;41427:15;41454:117;41563:1;41560;41553:12;41577:117;41686:1;41683;41676:12;41700:117;41809:1;41806;41799:12;41823:117;41932:1;41929;41922:12;41946:102;41987:6;42038:2;42034:7;42029:2;42022:5;42018:14;42014:28;42004:38;;41946:102;;;:::o;42054:224::-;42194:34;42190:1;42182:6;42178:14;42171:58;42263:7;42258:2;42250:6;42246:15;42239:32;42054:224;:::o;42284:221::-;42424:34;42420:1;42412:6;42408:14;42401:58;42493:4;42488:2;42480:6;42476:15;42469:29;42284:221;:::o;42511:226::-;42651:34;42647:1;42639:6;42635:14;42628:58;42720:9;42715:2;42707:6;42703:15;42696:34;42511:226;:::o;42743:167::-;42883:19;42879:1;42871:6;42867:14;42860:43;42743:167;:::o;42916:221::-;43056:34;43052:1;43044:6;43040:14;43033:58;43125:4;43120:2;43112:6;43108:15;43101:29;42916:221;:::o;43143:166::-;43283:18;43279:1;43271:6;43267:14;43260:42;43143:166;:::o;43315:163::-;43455:15;43451:1;43443:6;43439:14;43432:39;43315:163;:::o;43484:223::-;43624:34;43620:1;43612:6;43608:14;43601:58;43693:6;43688:2;43680:6;43676:15;43669:31;43484:223;:::o;43713:220::-;43853:34;43849:1;43841:6;43837:14;43830:58;43922:3;43917:2;43909:6;43905:15;43898:28;43713:220;:::o;43939:182::-;44079:34;44075:1;44067:6;44063:14;44056:58;43939:182;:::o;44127:301::-;44267:34;44263:1;44255:6;44251:14;44244:58;44336:34;44331:2;44323:6;44319:15;44312:59;44405:15;44400:2;44392:6;44388:15;44381:40;44127:301;:::o;44434:170::-;44574:22;44570:1;44562:6;44558:14;44551:46;44434:170;:::o;44610:223::-;44750:34;44746:1;44738:6;44734:14;44727:58;44819:6;44814:2;44806:6;44802:15;44795:31;44610:223;:::o;44839:168::-;44979:20;44975:1;44967:6;44963:14;44956:44;44839:168;:::o;45013:165::-;45153:17;45149:1;45141:6;45137:14;45130:41;45013:165;:::o;45184:231::-;45324:34;45320:1;45312:6;45308:14;45301:58;45393:14;45388:2;45380:6;45376:15;45369:39;45184:231;:::o;45421:228::-;45561:34;45557:1;45549:6;45545:14;45538:58;45630:11;45625:2;45617:6;45613:15;45606:36;45421:228;:::o;45655:225::-;45795:34;45791:1;45783:6;45779:14;45772:58;45864:8;45859:2;45851:6;45847:15;45840:33;45655:225;:::o;45886:166::-;46026:18;46022:1;46014:6;46010:14;46003:42;45886:166;:::o;46058:165::-;46198:17;46194:1;46186:6;46182:14;46175:41;46058:165;:::o;46229:222::-;46369:34;46365:1;46357:6;46353:14;46346:58;46438:5;46433:2;46425:6;46421:15;46414:30;46229:222;:::o;46457:182::-;46597:34;46593:1;46585:6;46581:14;46574:58;46457:182;:::o;46645:222::-;46785:34;46781:1;46773:6;46769:14;46762:58;46854:5;46849:2;46841:6;46837:15;46830:30;46645:222;:::o;46873:164::-;47013:16;47009:1;47001:6;46997:14;46990:40;46873:164;:::o;47043:122::-;47116:24;47134:5;47116:24;:::i;:::-;47109:5;47106:35;47096:63;;47155:1;47152;47145:12;47096:63;47043:122;:::o;47171:116::-;47241:21;47256:5;47241:21;:::i;:::-;47234:5;47231:32;47221:60;;47277:1;47274;47267:12;47221:60;47171:116;:::o;47293:122::-;47366:24;47384:5;47366:24;:::i;:::-;47359:5;47356:35;47346:63;;47405:1;47402;47395:12;47346:63;47293:122;:::o

Swarm Source

ipfs://6b97920e5f52414dea675090b4f6d6f705828847bcfc4659e49a901ebd592c9e
Loading