ETH Price: $3,431.96 (+5.42%)
Gas: 8 Gwei

Token

Stripp Mfers (SMFER)
 

Overview

Max Total Supply

0 SMFER

Holders

69

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
shenizian.eth
Balance
5 SMFER
0x1da70c3b87634208eeabfc2541aa1e75c5168dea
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
StrippMfers

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-18
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.14;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: contracts/IOperatorFilterRegistry.sol


//pragma solidity ^0.8.13;


interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts/OperatorFilterer.sol


//pragma solidity ^0.8.13;


contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
// File: contracts/DefaultOperatorFilterer.sol


//pragma solidity ^0.8.13;


contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: https://github.com/nibbstack/erc721/blob/master/src/contracts/tokens/erc721-metadata.sol


//pragma solidity ^0.8.0;

/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

//pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

//pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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://consensys.net/diligence/blog/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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

//pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


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

//pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


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

//pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

//pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

//pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

//pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

//pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol


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

//pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

//pragma solidity ^0.8.0;


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

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

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

//pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: StrippMFers.sol



//pragma solidity ^0.8.17;






//import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol";


abstract contract Functional {
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    
    bool private _reentryKey = false;
    modifier reentryLock {
        require(!_reentryKey, "attempt reenter locked function");
        _reentryKey = true;
        _;
        _reentryKey = false;
    }
}
// ******************************************************************************************************************************
// **************************************************  Start of Main Contract ***************************************************
// ******************************************************************************************************************************

contract StrippMfers is Ownable, Functional, ERC721, DefaultOperatorFilterer{
using Address for address;

    //Tokens (ERC20 & ERC721) Objects
    IERC20 private gasFactoryAddress;
    IERC20 private loveTokenAddress;
    ERC721 CT;
    
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;
    
    // URI Root Location for Json Files
    string private baseURI;


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

    mapping(uint256 => bool) public excludedChemToken;
    
    bool public mintActive;
    bool private _revealed;
    uint256 public maxSupply;
    uint256 public price;
    uint256 public tokenMinted;
    uint256 public reservedTokens; 
    uint256 public reservedChem;
    uint256 public reservedGas;
    uint256 public reservedLove;
    uint256 public maxPerWallet;
    uint256 public maxMintPerTx;
    uint256 public gasPrice;
    uint256 public lovePrice;

    address doxxd      = payable(0xC1FDc68dc63d3316F32420d4d2c3DeA43091bCDD); //70%
    address toronto    = payable(0xb3a05B0feCC927e32ab448415C7D0EFC694fD5E4); //30%
    
    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor() ERC721("Stripp Mfers","SMFER"){
        _name = "Stripp Mfers";
        _symbol = "SMFER";
        baseURI = "https://strippmfers.io/metadata/";
        
        price = 2 * (10 ** 16); // Replace leading value with price in finney = 0.02 Eth
        gasPrice = 5000 * (10 ** 18) ;//5000;       
        lovePrice = 2500 * (10 ** 18);//2500;       
        maxSupply = 2222;
        reservedTokens = 100;
        reservedChem = 400;
        reservedGas = 200;
        reservedLove = 200;
        maxPerWallet = 100;
        maxMintPerTx = 50;
        CT = ERC721(0xFD3C3717164831916E6D2D7cdde9904dd793eC84);                 //Chameleons contract address.
        gasFactoryAddress = IERC20(0xDf3aD440135B1880d40C78DdE59631293Da1dC2e);   //GasFactory contract address.
        loveTokenAddress = IERC20(0x14d312Ac2bfC95d9BBeFa87deB1d3cfCF69980de);   //LoveToken contract address.
    }
    
    function ownerMint(address _to, uint256 qty) external onlyOwner {
        require(((tokenMinted + qty) > tokenMinted) && ((tokenMinted + qty) <= maxSupply), "Math overflow");
        require((reservedTokens != 0) && (reservedTokens - qty >= 0), "Owner reserved tokens end");
        
        uint256 mintSeedValue = tokenMinted; 
        if (reservedTokens >= qty) {
            reservedTokens -= qty;
        } else {
            reservedTokens = 0;
        }
        tokenMinted += qty;
        for(uint256 i = 0; i < qty; i++) {
            _safeMint(_to, mintSeedValue + i);
        }
    }

    function withdraw() external onlyOwner {
        uint256 sendAmount = address(this).balance;
        uint256 sendLoveTokens =loveTokenAddress.balanceOf(address(this));
        uint256 sendGasTokens =gasFactoryAddress.balanceOf(address(this));

        bool success;
        
        (success, ) = toronto.call{value: ((sendAmount * 30) / 100)}("");
        require(success, "Transaction Unsuccessful");
        
        (success, ) = doxxd.call{value: ((sendAmount * 70) / 100)}("");
        require(success, "Transaction Unsuccessful");
        
        loveTokenAddress.transfer(toronto, (sendLoveTokens * 30) / 100 );
        loveTokenAddress.transfer(doxxd, (sendLoveTokens * 70 ) / 100 );
        
        gasFactoryAddress.transfer(toronto, (sendGasTokens * 30 ) / 100 );
        gasFactoryAddress.transfer(doxxd, (sendGasTokens * 70 ) / 100 );
        
     }
    
    function requireAll(uint256 qty) private view {
        require(mintActive, "Mint is not Active");
        require((qty + tokenMinted + reservedTokens + reservedChem + reservedGas + reservedLove ) <= maxSupply, "Not enough availability"); 
        require(qty <= maxMintPerTx,"Mint tokens per transaction exceeded");
        require(( tokensMintedby[ _msgSender() ] + qty ) <= maxPerWallet, "Mint per wallet exceeded");
    }

    function publicMint(uint256 qty) external payable reentryLock {
        requireAll(qty);
        require(msg.value == price * qty, "Mint: Insufficient Fund");
        tokensMint(qty);
    }

    //Give tokenId of Chameleons as argument array in mintCham function.
    function mintByChameleons(uint256 [] memory qty) external reentryLock {
        requireAll(qty.length);
        require(CT.balanceOf(_msgSender()) > 0, "Must have Chameleon.");
        require(reservedChem >= 0, "Chameleon limit over.");
        for(uint i =0; i < qty.length ; i++)
        {
           require(!excludedChemToken[ qty[i] ],"Chameleon already minted");
           require(msg.sender == (CT).ownerOf( qty[i] ),"Invalid owner");
        }
        uint256 mintSeedValue = tokenMinted;
        tokensMintedby[msg.sender] += qty.length;
        tokenMinted += qty.length;
        reservedChem -= qty.length;
        for(uint256 i = 0; i < qty.length; i++) {
        	_safeMint(_msgSender(), mintSeedValue + i);
            excludedChemToken[ qty[i] ] = true;
        }
    }

    function mintByFungibleTokens(uint256 qty, uint256 flag) external reentryLock {
        requireAll(qty);
        require(flag == 1 || flag == 2, "Invalid mint type."); 
        if(flag == 1){
            require(loveTokenAddress.balanceOf(msg.sender) >= lovePrice * qty,"Less fund");
            require(reservedLove - qty >= 0, "Reserved Love tokens end");
            loveTokenAddress.transferFrom(msg.sender, address(this), lovePrice * qty);
            reservedLove -= qty;
        }else if(flag == 2) {
            require(gasFactoryAddress.balanceOf(msg.sender) >= gasPrice * qty,"Less fund");
            require(reservedGas - qty >= 0, "Reserved GasFactory tokens end");
            gasFactoryAddress.transferFrom(msg.sender, address(this), gasPrice * qty);
            reservedGas -= qty;
        }
        tokensMint(qty);
    }

    function tokensMint(uint256 qty) private{
        uint256 mintSeedValue = tokenMinted; 
        tokensMintedby[msg.sender] += qty;       
        tokenMinted += qty;
        for(uint256 i = 0; i < qty; i++) {
            _safeMint(msg.sender, mintSeedValue + i);
        }
    }

    //////////////////////////////////////////////////////////////
    //////////////////// Setters and Getters /////////////////////
    //////////////////////////////////////////////////////////////
    function reveal() external onlyOwner {
        _revealed = true;
    }
    
    function setMaxPerWallet(uint256 newMax) public onlyOwner{
    	maxPerWallet = newMax;
    }

    function setMaxPerTransaction(uint256 newMaxTx) public onlyOwner{
    	maxMintPerTx = newMaxTx;
    }

    function setMaxSupply( uint256 newValue ) external onlyOwner {
        maxSupply = newValue;
    }

    function setReservedTokens( uint256 newValue ) external onlyOwner {
        reservedTokens = newValue;
    }

    function setReservedCham( uint256 newValue ) external onlyOwner {
        reservedChem = newValue;
    }

    function setReservedGas( uint256 newValue ) external onlyOwner {
        reservedGas = newValue;
    }

    function setReservedLove( uint256 newValue ) external onlyOwner {
        reservedLove = newValue;
    }

    function hide() external onlyOwner {
        _revealed = false;
    }

    function setBaseURI(string memory newURI) public onlyOwner {
        baseURI = newURI;
    }
    
    function activateMint() public onlyOwner {
        mintActive = true;
    }
    
    function deactivateMint() public onlyOwner {
        mintActive = false;
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    function setGasPrice(uint256 newPrice) public onlyOwner {
        gasPrice = newPrice;
    }

    function setLovePrice(uint256 newPrice) public onlyOwner {
        lovePrice = newPrice;
    }

    function getExcludedChemToken(uint256 [] memory ids) public view returns(bool [] memory) {
        bool [] memory excludedIds= new bool[](ids.length);
        for(uint256 i = 0; i < ids.length; i++){
            excludedIds[i] = excludedChemToken[ids[i]];
        }
        return excludedIds;
    }
    
    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    // **************************************** Metadata Standard Functions **********
    //@dev Returns the token collection name.
    function getname() external view returns (string memory){
        return _name;
    }

    //@dev Returns the token collection symbol.
    function getsymbol() external view returns (string memory){
        return _symbol;
    }

    //@dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
    function tokenURI(uint256 tokenId) public virtual override view returns (string memory){
        require(_exists(tokenId), "ERC721Metadata: URI 0x0 token");
        string memory tokenuri;
        if (_revealed){
            tokenuri = string(abi.encodePacked(baseURI, toString(tokenId), ".json"));
        } else {
            tokenuri = string(abi.encodePacked(baseURI, "mystery.json"));
        }
        return tokenuri;
    }
    
    function contractURI() public view returns (string memory) {
            return string(abi.encodePacked(baseURI,"contract.json"));
    }
    // *******************************************************************************

    receive() external payable {}
    
    fallback() external payable {}

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"activateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deactivateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"excludedChemToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"getExcludedChemToken","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getname","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getsymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hide","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lovePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"qty","type":"uint256[]"}],"name":"mintByChameleons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"uint256","name":"flag","type":"uint256"}],"name":"mintByFungibleTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedChem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedLove","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setLovePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTx","type":"uint256"}],"name":"setMaxPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setReservedCham","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setReservedGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setReservedLove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setReservedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260008060146101000a81548160ff02191690831515021790555073c1fdc68dc63d3316f32420d4d2c3dea43091bcdd601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b3a05b0fecc927e32ab448415c7d0efc694fd5e4601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d557600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f537472697070204d6665727300000000000000000000000000000000000000008152506040518060400160405280600581526020017f534d464552000000000000000000000000000000000000000000000000000000815250620001796200016d620005d960201b60201c565b620005e160201b60201c565b81600190816200018a91906200091f565b5080600290816200019c91906200091f565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003945780156200025a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200022092919062000a4b565b600060405180830381600087803b1580156200023b57600080fd5b505af115801562000250573d6000803e3d6000fd5b5050505062000393565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000314576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002da92919062000a4b565b600060405180830381600087803b158015620002f557600080fd5b505af11580156200030a573d6000803e3d6000fd5b5050505062000392565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200035d919062000a78565b600060405180830381600087803b1580156200037857600080fd5b505af11580156200038d573d6000803e3d6000fd5b505050505b5b5b50506040518060400160405280600c81526020017f537472697070204d666572730000000000000000000000000000000000000000815250600a9081620003dc91906200091f565b506040518060400160405280600581526020017f534d464552000000000000000000000000000000000000000000000000000000815250600b90816200042391906200091f565b506040518060400160405280602081526020017f68747470733a2f2f7374726970706d666572732e696f2f6d657461646174612f815250600c90816200046a91906200091f565b5066470de4df82000060118190555069010f0cf064dd5920000060198190555068878678326eac900000601a819055506108ae601081905550606460138190555061019060148190555060c860158190555060c86016819055506064601781905550603260188190555073fd3c3717164831916e6d2d7cdde9904dd793ec84600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073df3ad440135b1880d40c78dde59631293da1dc2e600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507314d312ac2bfc95d9bbefa87deb1d3cfcf69980de600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000a95565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200072757607f821691505b6020821081036200073d576200073c620006df565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007a77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000768565b620007b3868362000768565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000800620007fa620007f484620007cb565b620007d5565b620007cb565b9050919050565b6000819050919050565b6200081c83620007df565b620008346200082b8262000807565b84845462000775565b825550505050565b600090565b6200084b6200083c565b6200085881848462000811565b505050565b5b8181101562000880576200087460008262000841565b6001810190506200085e565b5050565b601f821115620008cf57620008998162000743565b620008a48462000758565b81016020851015620008b4578190505b620008cc620008c38562000758565b8301826200085d565b50505b505050565b600082821c905092915050565b6000620008f460001984600802620008d4565b1980831691505092915050565b60006200090f8383620008e1565b9150826002028217905092915050565b6200092a82620006a5565b67ffffffffffffffff811115620009465762000945620006b0565b5b6200095282546200070e565b6200095f82828562000884565b600060209050601f83116001811462000997576000841562000982578287015190505b6200098e858262000901565b865550620009fe565b601f198416620009a78662000743565b60005b82811015620009d157848901518255600182019150602085019450602081019050620009aa565b86831015620009f15784890151620009ed601f891682620008e1565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a338262000a06565b9050919050565b62000a458162000a26565b82525050565b600060408201905062000a62600083018562000a3a565b62000a71602083018462000a3a565b9392505050565b600060208201905062000a8f600083018462000a3a565b92915050565b615fa68062000aa56000396000f3fe60806040526004361061031e5760003560e01c806394308138116101ab578063c87b56dd116100f7578063e268e4d311610095578063e985e9c51161006f578063e985e9c514610b33578063f2fde38b14610b70578063f46aa9d214610b99578063fe173b9714610bc457610325565b8063e268e4d314610ab4578063e70d3e6314610add578063e8a3d48514610b0857610325565b8063ccfdd2f8116100d1578063ccfdd2f814610a0c578063d5abeb0114610a35578063dccaaa3414610a60578063de7fcb1d14610a8957610325565b8063c87b56dd1461097b578063c91c0462146109b8578063cae04731146109cf57610325565b8063a475b5dd11610164578063b88d4fde1161013e578063b88d4fde146108d5578063b926ffac146108fe578063bf1fe42014610927578063c6ea59b91461095057610325565b8063a475b5dd1461087c578063aac04f3814610893578063b62a7625146108be57610325565b8063943081381461078057806395d89b41146107a957806396356355146107d45780639ab36e5a146107ff578063a035b1fe14610828578063a22cb4651461085357610325565b8063453c23101161026a57806370a0823111610223578063789533bb116101fd578063789533bb146106c65780638befa71b146107035780638da5cb5b1461072c57806391b7f5ed1461075757610325565b806370a0823114610649578063715018a6146106865780637195ecf41461069d57610325565b8063453c23101461053b578063484b973c14610566578063553763af1461058f57806355f804b3146105ba5780636352211e146105e35780636f8b44b01461062057610325565b806323b872dd116102d75780632e56f71e116102b15780632e56f71e146104b95780633ccfd60b146104d05780633cd7594c146104e757806342842e0e1461051257610325565b806323b872dd1461044957806325fd90f3146104725780632db115441461049d57610325565b806301ffc9a714610327578063027903ef1461036457806306fdde031461038d578063081812fc146103b8578063095ea7b3146103f557806315a553471461041e57610325565b3661032557005b005b34801561033357600080fd5b5061034e60048036038101906103499190613f50565b610bef565b60405161035b9190613f98565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613fe9565b610cd1565b005b34801561039957600080fd5b506103a2610ce3565b6040516103af91906140a6565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613fe9565b610d75565b6040516103ec9190614109565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190614150565b610dbb565b005b34801561042a57600080fd5b50610433610ed2565b604051610440919061419f565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906141ba565b610ed8565b005b34801561047e57600080fd5b50610487610fe4565b6040516104949190613f98565b60405180910390f35b6104b760048036038101906104b29190613fe9565b610ff7565b005b3480156104c557600080fd5b506104ce6110e0565b005b3480156104dc57600080fd5b506104e5611105565b005b3480156104f357600080fd5b506104fc611792565b60405161050991906140a6565b60405180910390f35b34801561051e57600080fd5b50610539600480360381019061053491906141ba565b611824565b005b34801561054757600080fd5b50610550611930565b60405161055d919061419f565b60405180910390f35b34801561057257600080fd5b5061058d60048036038101906105889190614150565b611936565b005b34801561059b57600080fd5b506105a4611a93565b6040516105b1919061419f565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190614342565b611a99565b005b3480156105ef57600080fd5b5061060a60048036038101906106059190613fe9565b611ab4565b6040516106179190614109565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190613fe9565b611b3a565b005b34801561065557600080fd5b50610670600480360381019061066b919061438b565b611b4c565b60405161067d919061419f565b60405180910390f35b34801561069257600080fd5b5061069b611c03565b005b3480156106a957600080fd5b506106c460048036038101906106bf9190613fe9565b611c17565b005b3480156106d257600080fd5b506106ed60048036038101906106e89190613fe9565b611c29565b6040516106fa9190613f98565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190613fe9565b611c49565b005b34801561073857600080fd5b50610741611c5b565b60405161074e9190614109565b60405180910390f35b34801561076357600080fd5b5061077e60048036038101906107799190613fe9565b611c84565b005b34801561078c57600080fd5b506107a760048036038101906107a291906143b8565b611c96565b005b3480156107b557600080fd5b506107be6121a0565b6040516107cb91906140a6565b60405180910390f35b3480156107e057600080fd5b506107e9612232565b6040516107f6919061419f565b60405180910390f35b34801561080b57600080fd5b50610826600480360381019061082191906144c0565b612238565b005b34801561083457600080fd5b5061083d6126c8565b60405161084a919061419f565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190614535565b6126ce565b005b34801561088857600080fd5b506108916126e4565b005b34801561089f57600080fd5b506108a8612709565b6040516108b5919061419f565b60405180910390f35b3480156108ca57600080fd5b506108d361270f565b005b3480156108e157600080fd5b506108fc60048036038101906108f79190614616565b612734565b005b34801561090a57600080fd5b5061092560048036038101906109209190613fe9565b612842565b005b34801561093357600080fd5b5061094e60048036038101906109499190613fe9565b612854565b005b34801561095c57600080fd5b50610965612866565b60405161097291906140a6565b60405180910390f35b34801561098757600080fd5b506109a2600480360381019061099d9190613fe9565b6128f8565b6040516109af91906140a6565b60405180910390f35b3480156109c457600080fd5b506109cd6129b8565b005b3480156109db57600080fd5b506109f660048036038101906109f191906144c0565b6129dd565b604051610a039190614757565b60405180910390f35b348015610a1857600080fd5b50610a336004803603810190610a2e9190613fe9565b612ab6565b005b348015610a4157600080fd5b50610a4a612ac8565b604051610a57919061419f565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a829190613fe9565b612ace565b005b348015610a9557600080fd5b50610a9e612ae0565b604051610aab919061419f565b60405180910390f35b348015610ac057600080fd5b50610adb6004803603810190610ad69190613fe9565b612ae6565b005b348015610ae957600080fd5b50610af2612af8565b604051610aff919061419f565b60405180910390f35b348015610b1457600080fd5b50610b1d612afe565b604051610b2a91906140a6565b60405180910390f35b348015610b3f57600080fd5b50610b5a6004803603810190610b559190614779565b612b26565b604051610b679190613f98565b60405180910390f35b348015610b7c57600080fd5b50610b976004803603810190610b92919061438b565b612bba565b005b348015610ba557600080fd5b50610bae612c3d565b604051610bbb919061419f565b60405180910390f35b348015610bd057600080fd5b50610bd9612c43565b604051610be6919061419f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cca5750610cc982612c49565b5b9050919050565b610cd9612cb3565b8060138190555050565b606060018054610cf2906147e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1e906147e8565b8015610d6b5780601f10610d4057610100808354040283529160200191610d6b565b820191906000526020600020905b815481529060010190602001808311610d4e57829003601f168201915b5050505050905090565b6000610d8082612d31565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dc682611ab4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d9061488b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e55612d7c565b73ffffffffffffffffffffffffffffffffffffffff161480610e845750610e8381610e7e612d7c565b612b26565b5b610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba9061491d565b60405180910390fd5b610ecd8383612d84565b505050565b60135481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fd4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f4f92919061493d565b6020604051808303816000875af1158015610f6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f92919061497b565b610fd357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fca9190614109565b60405180910390fd5b5b610fdf838383612e3d565b505050565b600f60009054906101000a900460ff1681565b600060149054906101000a900460ff1615611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906149f4565b60405180910390fd5b6001600060146101000a81548160ff02191690831515021790555061106b81612e9d565b806011546110799190614a43565b34146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b190614ad1565b60405180910390fd5b6110c381613050565b60008060146101000a81548160ff02191690831515021790555050565b6110e8612cb3565b6000600f60006101000a81548160ff021916908315150217905550565b61110d612cb3565b60004790506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161116f9190614109565b602060405180830381865afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b09190614b06565b90506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120f9190614109565b602060405180830381865afa15801561122c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112509190614b06565b90506000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166064601e8661129c9190614a43565b6112a69190614b62565b6040516112b290614bc4565b60006040518083038185875af1925050503d80600081146112ef576040519150601f19603f3d011682016040523d82523d6000602084013e6112f4565b606091505b5050809150508061133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190614c25565b60405180910390fd5b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660646046866113829190614a43565b61138c9190614b62565b60405161139890614bc4565b60006040518083038185875af1925050503d80600081146113d5576040519150601f19603f3d011682016040523d82523d6000602084013e6113da565b606091505b50508091505080611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790614c25565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601e876114909190614a43565b61149a9190614b62565b6040518363ffffffff1660e01b81526004016114b7929190614c45565b6020604051808303816000875af11580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa919061497b565b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606460468761156b9190614a43565b6115759190614b62565b6040518363ffffffff1660e01b8152600401611592929190614c45565b6020604051808303816000875af11580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d5919061497b565b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601e866116469190614a43565b6116509190614b62565b6040518363ffffffff1660e01b815260040161166d929190614c45565b6020604051808303816000875af115801561168c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b0919061497b565b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660646046866117219190614a43565b61172b9190614b62565b6040518363ffffffff1660e01b8152600401611748929190614c45565b6020604051808303816000875af1158015611767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178b919061497b565b5050505050565b6060600b80546117a1906147e8565b80601f01602080910402602001604051908101604052809291908181526020018280546117cd906147e8565b801561181a5780601f106117ef5761010080835404028352916020019161181a565b820191906000526020600020905b8154815290600101906020018083116117fd57829003601f168201915b5050505050905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611920576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161189b92919061493d565b6020604051808303816000875af11580156118ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118de919061497b565b61191f57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016119169190614109565b60405180910390fd5b5b61192b8383836130fe565b505050565b60175481565b61193e612cb3565b6012548160125461194f9190614c6e565b11801561196b5750601054816012546119689190614c6e565b11155b6119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a190614cee565b60405180910390fd5b6000601354141580156119cb57506000816013546119c89190614d0e565b10155b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190614d8e565b60405180910390fd5b600060125490508160135410611a38578160136000828254611a2c9190614d0e565b92505081905550611a41565b60006013819055505b8160126000828254611a539190614c6e565b9250508190555060005b82811015611a8d57611a7a848284611a759190614c6e565b61311e565b8080611a8590614dae565b915050611a5d565b50505050565b60165481565b611aa1612cb3565b80600c9081611ab09190614fa2565b5050565b600080611ac08361313c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b28906150c0565b60405180910390fd5b80915050919050565b611b42612cb3565b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb390615152565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c0b612cb3565b611c156000613179565b565b611c1f612cb3565b8060158190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b611c51612cb3565b8060168190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c8c612cb3565b8060118190555050565b600060149054906101000a900460ff1615611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd906149f4565b60405180910390fd5b6001600060146101000a81548160ff021916908315150217905550611d0a82612e9d565b6001811480611d195750600281145b611d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4f906151be565b60405180910390fd5b60018103611f6a5781601a54611d6e9190614a43565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611dc99190614109565b602060405180830381865afa158015611de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0a9190614b06565b1015611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e429061522a565b60405180910390fd5b600082601654611e5b9190614d0e565b1015611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9390615296565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333085601a54611eea9190614a43565b6040518463ffffffff1660e01b8152600401611f08939291906152b6565b6020604051808303816000875af1158015611f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4b919061497b565b508160166000828254611f5e9190614d0e565b92505081905550612179565b600281036121785781601954611f809190614a43565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611fdb9190614109565b602060405180830381865afa158015611ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201c9190614b06565b101561205d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120549061522a565b60405180910390fd5b60008260155461206d9190614d0e565b10156120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590615339565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856019546120fc9190614a43565b6040518463ffffffff1660e01b815260040161211a939291906152b6565b6020604051808303816000875af1158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d919061497b565b5081601560008282546121709190614d0e565b925050819055505b5b61218282613050565b60008060146101000a81548160ff0219169083151502179055505050565b6060600280546121af906147e8565b80601f01602080910402602001604051908101604052809291908181526020018280546121db906147e8565b80156122285780601f106121fd57610100808354040283529160200191612228565b820191906000526020600020905b81548152906001019060200180831161220b57829003601f168201915b5050505050905090565b60125481565b600060149054906101000a900460ff1615612288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227f906149f4565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055506122ad8151612e9d565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316122f5612d7c565b6040518263ffffffff1660e01b81526004016123119190614109565b602060405180830381865afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123529190614b06565b11612392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612389906153a5565b60405180910390fd5b600060145410156123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf90615411565b60405180910390fd5b60005b815181101561259557600e60008383815181106123fb576123fa615431565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161561245f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612456906154ac565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8383815181106124b0576124af615431565b5b60200260200101516040518263ffffffff1660e01b81526004016124d4919061419f565b602060405180830381865afa1580156124f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251591906154e1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125799061555a565b60405180910390fd5b808061258d90614dae565b9150506123db565b50600060125490508151600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ed9190614c6e565b925050819055508151601260008282546126079190614c6e565b925050819055508151601460008282546126219190614d0e565b9250508190555060005b82518110156126a95761265061263f612d7c565b828461264b9190614c6e565b61311e565b6001600e600085848151811061266957612668615431565b5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806126a190614dae565b91505061262b565b505060008060146101000a81548160ff02191690831515021790555050565b60115481565b6126e06126d9612d7c565b838361323d565b5050565b6126ec612cb3565b6001600f60016101000a81548160ff021916908315150217905550565b601a5481565b612717612cb3565b6000600f60016101000a81548160ff021916908315150217905550565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612830576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016127ab92919061493d565b6020604051808303816000875af11580156127ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ee919061497b565b61282f57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016128269190614109565b60405180910390fd5b5b61283c848484846133a9565b50505050565b61284a612cb3565b8060148190555050565b61285c612cb3565b8060198190555050565b6060600a8054612875906147e8565b80601f01602080910402602001604051908101604052809291908181526020018280546128a1906147e8565b80156128ee5780601f106128c3576101008083540402835291602001916128ee565b820191906000526020600020905b8154815290600101906020018083116128d157829003601f168201915b5050505050905090565b60606129038261340b565b612942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612939906155c6565b60405180910390fd5b6060600f60019054906101000a900460ff161561298b57600c6129648461344c565b6040516020016129759291906156f1565b60405160208183030381529060405290506129af565b600c60405160200161299d919061576c565b60405160208183030381529060405290505b80915050919050565b6129c0612cb3565b6001600f60006101000a81548160ff021916908315150217905550565b60606000825167ffffffffffffffff8111156129fc576129fb614217565b5b604051908082528060200260200182016040528015612a2a5781602001602082028036833780820191505090505b50905060005b8351811015612aac57600e6000858381518110612a5057612a4f615431565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16828281518110612a8757612a86615431565b5b6020026020010190151590811515815250508080612aa490614dae565b915050612a30565b5080915050919050565b612abe612cb3565b8060188190555050565b60105481565b612ad6612cb3565b80601a8190555050565b60185481565b612aee612cb3565b8060178190555050565b60145481565b6060600c604051602001612b1291906157da565b604051602081830303815290604052905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612bc2612cb3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c289061586e565b60405180910390fd5b612c3a81613179565b50565b60155481565b60195481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cbb612d7c565b73ffffffffffffffffffffffffffffffffffffffff16612cd9611c5b565b73ffffffffffffffffffffffffffffffffffffffff1614612d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d26906158da565b60405180910390fd5b565b612d3a8161340b565b612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d70906150c0565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612df783611ab4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612e4e612e48612d7c565b826135ac565b612e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e849061596c565b60405180910390fd5b612e98838383613641565b505050565b600f60009054906101000a900460ff16612eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee3906159d8565b60405180910390fd5b60105460165460155460145460135460125486612f099190614c6e565b612f139190614c6e565b612f1d9190614c6e565b612f279190614c6e565b612f319190614c6e565b1115612f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6990615a44565b60405180910390fd5b601854811115612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae90615ad6565b60405180910390fd5b60175481600d6000612fc7612d7c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300c9190614c6e565b111561304d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304490615b42565b60405180910390fd5b50565b6000601254905081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a69190614c6e565b9250508190555081601260008282546130bf9190614c6e565b9250508190555060005b828110156130f9576130e63382846130e19190614c6e565b61311e565b80806130f190614dae565b9150506130c9565b505050565b61311983838360405180602001604052806000815250612734565b505050565b61313882826040518060200160405280600081525061393a565b5050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036132ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a290615bae565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161339c9190613f98565b60405180910390a3505050565b6133ba6133b4612d7c565b836135ac565b6133f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f09061596c565b60405180910390fd5b61340584848484613995565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661342d8361313c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008203613493576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135a7565b600082905060005b600082146134c55780806134ae90614dae565b915050600a826134be9190614b62565b915061349b565b60008167ffffffffffffffff8111156134e1576134e0614217565b5b6040519080825280601f01601f1916602001820160405280156135135781602001600182028036833780820191505090505b5090505b600085146135a05760018261352c9190614d0e565b9150600a8561353b9190615bce565b60306135479190614c6e565b60f81b81838151811061355d5761355c615431565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135999190614b62565b9450613517565b8093505050505b919050565b6000806135b883611ab4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135fa57506135f98185612b26565b5b8061363857508373ffffffffffffffffffffffffffffffffffffffff1661362084610d75565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661366182611ab4565b73ffffffffffffffffffffffffffffffffffffffff16146136b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ae90615c71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371d90615d03565b60405180910390fd5b61373383838360016139f1565b8273ffffffffffffffffffffffffffffffffffffffff1661375382611ab4565b73ffffffffffffffffffffffffffffffffffffffff16146137a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a090615c71565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139358383836001613b17565b505050565b6139448383613b1d565b6139516000848484613d3a565b613990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398790615d95565b60405180910390fd5b505050565b6139a0848484613641565b6139ac84848484613d3a565b6139eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e290615d95565b60405180910390fd5b50505050565b6001811115613b1157600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613a855780600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a7d9190614d0e565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b105780600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b089190614c6e565b925050819055505b5b50505050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8390615e01565b60405180910390fd5b613b958161340b565b15613bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bcc90615e6d565b60405180910390fd5b613be36000838360016139f1565b613bec8161340b565b15613c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2390615e6d565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d36600083836001613b17565b5050565b6000613d5b8473ffffffffffffffffffffffffffffffffffffffff16613ec1565b15613eb4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d84612d7c565b8786866040518563ffffffff1660e01b8152600401613da69493929190615ee2565b6020604051808303816000875af1925050508015613de257506040513d601f19601f82011682018060405250810190613ddf9190615f43565b60015b613e64573d8060008114613e12576040519150601f19603f3d011682016040523d82523d6000602084013e613e17565b606091505b506000815103613e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5390615d95565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613eb9565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f2d81613ef8565b8114613f3857600080fd5b50565b600081359050613f4a81613f24565b92915050565b600060208284031215613f6657613f65613eee565b5b6000613f7484828501613f3b565b91505092915050565b60008115159050919050565b613f9281613f7d565b82525050565b6000602082019050613fad6000830184613f89565b92915050565b6000819050919050565b613fc681613fb3565b8114613fd157600080fd5b50565b600081359050613fe381613fbd565b92915050565b600060208284031215613fff57613ffe613eee565b5b600061400d84828501613fd4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614050578082015181840152602081019050614035565b60008484015250505050565b6000601f19601f8301169050919050565b600061407882614016565b6140828185614021565b9350614092818560208601614032565b61409b8161405c565b840191505092915050565b600060208201905081810360008301526140c0818461406d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140f3826140c8565b9050919050565b614103816140e8565b82525050565b600060208201905061411e60008301846140fa565b92915050565b61412d816140e8565b811461413857600080fd5b50565b60008135905061414a81614124565b92915050565b6000806040838503121561416757614166613eee565b5b60006141758582860161413b565b925050602061418685828601613fd4565b9150509250929050565b61419981613fb3565b82525050565b60006020820190506141b46000830184614190565b92915050565b6000806000606084860312156141d3576141d2613eee565b5b60006141e18682870161413b565b93505060206141f28682870161413b565b925050604061420386828701613fd4565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61424f8261405c565b810181811067ffffffffffffffff8211171561426e5761426d614217565b5b80604052505050565b6000614281613ee4565b905061428d8282614246565b919050565b600067ffffffffffffffff8211156142ad576142ac614217565b5b6142b68261405c565b9050602081019050919050565b82818337600083830152505050565b60006142e56142e084614292565b614277565b90508281526020810184848401111561430157614300614212565b5b61430c8482856142c3565b509392505050565b600082601f8301126143295761432861420d565b5b81356143398482602086016142d2565b91505092915050565b60006020828403121561435857614357613eee565b5b600082013567ffffffffffffffff81111561437657614375613ef3565b5b61438284828501614314565b91505092915050565b6000602082840312156143a1576143a0613eee565b5b60006143af8482850161413b565b91505092915050565b600080604083850312156143cf576143ce613eee565b5b60006143dd85828601613fd4565b92505060206143ee85828601613fd4565b9150509250929050565b600067ffffffffffffffff82111561441357614412614217565b5b602082029050602081019050919050565b600080fd5b600061443c614437846143f8565b614277565b9050808382526020820190506020840283018581111561445f5761445e614424565b5b835b8181101561448857806144748882613fd4565b845260208401935050602081019050614461565b5050509392505050565b600082601f8301126144a7576144a661420d565b5b81356144b7848260208601614429565b91505092915050565b6000602082840312156144d6576144d5613eee565b5b600082013567ffffffffffffffff8111156144f4576144f3613ef3565b5b61450084828501614492565b91505092915050565b61451281613f7d565b811461451d57600080fd5b50565b60008135905061452f81614509565b92915050565b6000806040838503121561454c5761454b613eee565b5b600061455a8582860161413b565b925050602061456b85828601614520565b9150509250929050565b600067ffffffffffffffff8211156145905761458f614217565b5b6145998261405c565b9050602081019050919050565b60006145b96145b484614575565b614277565b9050828152602081018484840111156145d5576145d4614212565b5b6145e08482856142c3565b509392505050565b600082601f8301126145fd576145fc61420d565b5b813561460d8482602086016145a6565b91505092915050565b600080600080608085870312156146305761462f613eee565b5b600061463e8782880161413b565b945050602061464f8782880161413b565b935050604061466087828801613fd4565b925050606085013567ffffffffffffffff81111561468157614680613ef3565b5b61468d878288016145e8565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6146ce81613f7d565b82525050565b60006146e083836146c5565b60208301905092915050565b6000602082019050919050565b600061470482614699565b61470e81856146a4565b9350614719836146b5565b8060005b8381101561474a57815161473188826146d4565b975061473c836146ec565b92505060018101905061471d565b5085935050505092915050565b6000602082019050818103600083015261477181846146f9565b905092915050565b600080604083850312156147905761478f613eee565b5b600061479e8582860161413b565b92505060206147af8582860161413b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061480057607f821691505b602082108103614813576148126147b9565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614875602183614021565b915061488082614819565b604082019050919050565b600060208201905081810360008301526148a481614868565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614907603d83614021565b9150614912826148ab565b604082019050919050565b60006020820190508181036000830152614936816148fa565b9050919050565b600060408201905061495260008301856140fa565b61495f60208301846140fa565b9392505050565b60008151905061497581614509565b92915050565b60006020828403121561499157614990613eee565b5b600061499f84828501614966565b91505092915050565b7f617474656d7074207265656e746572206c6f636b65642066756e6374696f6e00600082015250565b60006149de601f83614021565b91506149e9826149a8565b602082019050919050565b60006020820190508181036000830152614a0d816149d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a4e82613fb3565b9150614a5983613fb3565b9250828202614a6781613fb3565b91508282048414831517614a7e57614a7d614a14565b5b5092915050565b7f4d696e743a20496e73756666696369656e742046756e64000000000000000000600082015250565b6000614abb601783614021565b9150614ac682614a85565b602082019050919050565b60006020820190508181036000830152614aea81614aae565b9050919050565b600081519050614b0081613fbd565b92915050565b600060208284031215614b1c57614b1b613eee565b5b6000614b2a84828501614af1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b6d82613fb3565b9150614b7883613fb3565b925082614b8857614b87614b33565b5b828204905092915050565b600081905092915050565b50565b6000614bae600083614b93565b9150614bb982614b9e565b600082019050919050565b6000614bcf82614ba1565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000614c0f601883614021565b9150614c1a82614bd9565b602082019050919050565b60006020820190508181036000830152614c3e81614c02565b9050919050565b6000604082019050614c5a60008301856140fa565b614c676020830184614190565b9392505050565b6000614c7982613fb3565b9150614c8483613fb3565b9250828201905080821115614c9c57614c9b614a14565b5b92915050565b7f4d617468206f766572666c6f7700000000000000000000000000000000000000600082015250565b6000614cd8600d83614021565b9150614ce382614ca2565b602082019050919050565b60006020820190508181036000830152614d0781614ccb565b9050919050565b6000614d1982613fb3565b9150614d2483613fb3565b9250828203905081811115614d3c57614d3b614a14565b5b92915050565b7f4f776e657220726573657276656420746f6b656e7320656e6400000000000000600082015250565b6000614d78601983614021565b9150614d8382614d42565b602082019050919050565b60006020820190508181036000830152614da781614d6b565b9050919050565b6000614db982613fb3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614deb57614dea614a14565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614e587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e1b565b614e628683614e1b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614e9f614e9a614e9584613fb3565b614e7a565b613fb3565b9050919050565b6000819050919050565b614eb983614e84565b614ecd614ec582614ea6565b848454614e28565b825550505050565b600090565b614ee2614ed5565b614eed818484614eb0565b505050565b5b81811015614f1157614f06600082614eda565b600181019050614ef3565b5050565b601f821115614f5657614f2781614df6565b614f3084614e0b565b81016020851015614f3f578190505b614f53614f4b85614e0b565b830182614ef2565b50505b505050565b600082821c905092915050565b6000614f7960001984600802614f5b565b1980831691505092915050565b6000614f928383614f68565b9150826002028217905092915050565b614fab82614016565b67ffffffffffffffff811115614fc457614fc3614217565b5b614fce82546147e8565b614fd9828285614f15565b600060209050601f83116001811461500c5760008415614ffa578287015190505b6150048582614f86565b86555061506c565b601f19841661501a86614df6565b60005b828110156150425784890151825560018201915060208501945060208101905061501d565b8683101561505f578489015161505b601f891682614f68565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006150aa601883614021565b91506150b582615074565b602082019050919050565b600060208201905081810360008301526150d98161509d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061513c602983614021565b9150615147826150e0565b604082019050919050565b6000602082019050818103600083015261516b8161512f565b9050919050565b7f496e76616c6964206d696e7420747970652e0000000000000000000000000000600082015250565b60006151a8601283614021565b91506151b382615172565b602082019050919050565b600060208201905081810360008301526151d78161519b565b9050919050565b7f4c6573732066756e640000000000000000000000000000000000000000000000600082015250565b6000615214600983614021565b915061521f826151de565b602082019050919050565b6000602082019050818103600083015261524381615207565b9050919050565b7f5265736572766564204c6f766520746f6b656e7320656e640000000000000000600082015250565b6000615280601883614021565b915061528b8261524a565b602082019050919050565b600060208201905081810360008301526152af81615273565b9050919050565b60006060820190506152cb60008301866140fa565b6152d860208301856140fa565b6152e56040830184614190565b949350505050565b7f526573657276656420476173466163746f727920746f6b656e7320656e640000600082015250565b6000615323601e83614021565b915061532e826152ed565b602082019050919050565b6000602082019050818103600083015261535281615316565b9050919050565b7f4d7573742068617665204368616d656c656f6e2e000000000000000000000000600082015250565b600061538f601483614021565b915061539a82615359565b602082019050919050565b600060208201905081810360008301526153be81615382565b9050919050565b7f4368616d656c656f6e206c696d6974206f7665722e0000000000000000000000600082015250565b60006153fb601583614021565b9150615406826153c5565b602082019050919050565b6000602082019050818103600083015261542a816153ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4368616d656c656f6e20616c7265616479206d696e7465640000000000000000600082015250565b6000615496601883614021565b91506154a182615460565b602082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b6000815190506154db81614124565b92915050565b6000602082840312156154f7576154f6613eee565b5b6000615505848285016154cc565b91505092915050565b7f496e76616c6964206f776e657200000000000000000000000000000000000000600082015250565b6000615544600d83614021565b915061554f8261550e565b602082019050919050565b6000602082019050818103600083015261557381615537565b9050919050565b7f4552433732314d657461646174613a205552492030783020746f6b656e000000600082015250565b60006155b0601d83614021565b91506155bb8261557a565b602082019050919050565b600060208201905081810360008301526155df816155a3565b9050919050565b600081905092915050565b600081546155fe816147e8565b61560881866155e6565b9450600182166000811461562357600181146156385761566b565b60ff198316865281151582028601935061566b565b61564185614df6565b60005b8381101561566357815481890152600182019150602081019050615644565b838801955050505b50505092915050565b600061567f82614016565b61568981856155e6565b9350615699818560208601614032565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006156db6005836155e6565b91506156e6826156a5565b600582019050919050565b60006156fd82856155f1565b91506157098284615674565b9150615714826156ce565b91508190509392505050565b7f6d7973746572792e6a736f6e0000000000000000000000000000000000000000600082015250565b6000615756600c836155e6565b915061576182615720565b600c82019050919050565b600061577882846155f1565b915061578382615749565b915081905092915050565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b60006157c4600d836155e6565b91506157cf8261578e565b600d82019050919050565b60006157e682846155f1565b91506157f1826157b7565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615858602683614021565b9150615863826157fc565b604082019050919050565b600060208201905081810360008301526158878161584b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006158c4602083614021565b91506158cf8261588e565b602082019050919050565b600060208201905081810360008301526158f3816158b7565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000615956602d83614021565b9150615961826158fa565b604082019050919050565b6000602082019050818103600083015261598581615949565b9050919050565b7f4d696e74206973206e6f74204163746976650000000000000000000000000000600082015250565b60006159c2601283614021565b91506159cd8261598c565b602082019050919050565b600060208201905081810360008301526159f1816159b5565b9050919050565b7f4e6f7420656e6f75676820617661696c6162696c697479000000000000000000600082015250565b6000615a2e601783614021565b9150615a39826159f8565b602082019050919050565b60006020820190508181036000830152615a5d81615a21565b9050919050565b7f4d696e7420746f6b656e7320706572207472616e73616374696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000615ac0602483614021565b9150615acb82615a64565b604082019050919050565b60006020820190508181036000830152615aef81615ab3565b9050919050565b7f4d696e74207065722077616c6c65742065786365656465640000000000000000600082015250565b6000615b2c601883614021565b9150615b3782615af6565b602082019050919050565b60006020820190508181036000830152615b5b81615b1f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615b98601983614021565b9150615ba382615b62565b602082019050919050565b60006020820190508181036000830152615bc781615b8b565b9050919050565b6000615bd982613fb3565b9150615be483613fb3565b925082615bf457615bf3614b33565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615c5b602583614021565b9150615c6682615bff565b604082019050919050565b60006020820190508181036000830152615c8a81615c4e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615ced602483614021565b9150615cf882615c91565b604082019050919050565b60006020820190508181036000830152615d1c81615ce0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615d7f603283614021565b9150615d8a82615d23565b604082019050919050565b60006020820190508181036000830152615dae81615d72565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615deb602083614021565b9150615df682615db5565b602082019050919050565b60006020820190508181036000830152615e1a81615dde565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615e57601c83614021565b9150615e6282615e21565b602082019050919050565b60006020820190508181036000830152615e8681615e4a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615eb482615e8d565b615ebe8185615e98565b9350615ece818560208601614032565b615ed78161405c565b840191505092915050565b6000608082019050615ef760008301876140fa565b615f0460208301866140fa565b615f116040830185614190565b8181036060830152615f238184615ea9565b905095945050505050565b600081519050615f3d81613f24565b92915050565b600060208284031215615f5957615f58613eee565b5b6000615f6784828501615f2e565b9150509291505056fea26469706673582212204d38b9d771907ee4ec7052370b12a2a85856fa2b149e475acdba9ed35f38ac9464736f6c63430008110033

Deployed Bytecode

0x60806040526004361061031e5760003560e01c806394308138116101ab578063c87b56dd116100f7578063e268e4d311610095578063e985e9c51161006f578063e985e9c514610b33578063f2fde38b14610b70578063f46aa9d214610b99578063fe173b9714610bc457610325565b8063e268e4d314610ab4578063e70d3e6314610add578063e8a3d48514610b0857610325565b8063ccfdd2f8116100d1578063ccfdd2f814610a0c578063d5abeb0114610a35578063dccaaa3414610a60578063de7fcb1d14610a8957610325565b8063c87b56dd1461097b578063c91c0462146109b8578063cae04731146109cf57610325565b8063a475b5dd11610164578063b88d4fde1161013e578063b88d4fde146108d5578063b926ffac146108fe578063bf1fe42014610927578063c6ea59b91461095057610325565b8063a475b5dd1461087c578063aac04f3814610893578063b62a7625146108be57610325565b8063943081381461078057806395d89b41146107a957806396356355146107d45780639ab36e5a146107ff578063a035b1fe14610828578063a22cb4651461085357610325565b8063453c23101161026a57806370a0823111610223578063789533bb116101fd578063789533bb146106c65780638befa71b146107035780638da5cb5b1461072c57806391b7f5ed1461075757610325565b806370a0823114610649578063715018a6146106865780637195ecf41461069d57610325565b8063453c23101461053b578063484b973c14610566578063553763af1461058f57806355f804b3146105ba5780636352211e146105e35780636f8b44b01461062057610325565b806323b872dd116102d75780632e56f71e116102b15780632e56f71e146104b95780633ccfd60b146104d05780633cd7594c146104e757806342842e0e1461051257610325565b806323b872dd1461044957806325fd90f3146104725780632db115441461049d57610325565b806301ffc9a714610327578063027903ef1461036457806306fdde031461038d578063081812fc146103b8578063095ea7b3146103f557806315a553471461041e57610325565b3661032557005b005b34801561033357600080fd5b5061034e60048036038101906103499190613f50565b610bef565b60405161035b9190613f98565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613fe9565b610cd1565b005b34801561039957600080fd5b506103a2610ce3565b6040516103af91906140a6565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613fe9565b610d75565b6040516103ec9190614109565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190614150565b610dbb565b005b34801561042a57600080fd5b50610433610ed2565b604051610440919061419f565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906141ba565b610ed8565b005b34801561047e57600080fd5b50610487610fe4565b6040516104949190613f98565b60405180910390f35b6104b760048036038101906104b29190613fe9565b610ff7565b005b3480156104c557600080fd5b506104ce6110e0565b005b3480156104dc57600080fd5b506104e5611105565b005b3480156104f357600080fd5b506104fc611792565b60405161050991906140a6565b60405180910390f35b34801561051e57600080fd5b50610539600480360381019061053491906141ba565b611824565b005b34801561054757600080fd5b50610550611930565b60405161055d919061419f565b60405180910390f35b34801561057257600080fd5b5061058d60048036038101906105889190614150565b611936565b005b34801561059b57600080fd5b506105a4611a93565b6040516105b1919061419f565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190614342565b611a99565b005b3480156105ef57600080fd5b5061060a60048036038101906106059190613fe9565b611ab4565b6040516106179190614109565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190613fe9565b611b3a565b005b34801561065557600080fd5b50610670600480360381019061066b919061438b565b611b4c565b60405161067d919061419f565b60405180910390f35b34801561069257600080fd5b5061069b611c03565b005b3480156106a957600080fd5b506106c460048036038101906106bf9190613fe9565b611c17565b005b3480156106d257600080fd5b506106ed60048036038101906106e89190613fe9565b611c29565b6040516106fa9190613f98565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190613fe9565b611c49565b005b34801561073857600080fd5b50610741611c5b565b60405161074e9190614109565b60405180910390f35b34801561076357600080fd5b5061077e60048036038101906107799190613fe9565b611c84565b005b34801561078c57600080fd5b506107a760048036038101906107a291906143b8565b611c96565b005b3480156107b557600080fd5b506107be6121a0565b6040516107cb91906140a6565b60405180910390f35b3480156107e057600080fd5b506107e9612232565b6040516107f6919061419f565b60405180910390f35b34801561080b57600080fd5b50610826600480360381019061082191906144c0565b612238565b005b34801561083457600080fd5b5061083d6126c8565b60405161084a919061419f565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190614535565b6126ce565b005b34801561088857600080fd5b506108916126e4565b005b34801561089f57600080fd5b506108a8612709565b6040516108b5919061419f565b60405180910390f35b3480156108ca57600080fd5b506108d361270f565b005b3480156108e157600080fd5b506108fc60048036038101906108f79190614616565b612734565b005b34801561090a57600080fd5b5061092560048036038101906109209190613fe9565b612842565b005b34801561093357600080fd5b5061094e60048036038101906109499190613fe9565b612854565b005b34801561095c57600080fd5b50610965612866565b60405161097291906140a6565b60405180910390f35b34801561098757600080fd5b506109a2600480360381019061099d9190613fe9565b6128f8565b6040516109af91906140a6565b60405180910390f35b3480156109c457600080fd5b506109cd6129b8565b005b3480156109db57600080fd5b506109f660048036038101906109f191906144c0565b6129dd565b604051610a039190614757565b60405180910390f35b348015610a1857600080fd5b50610a336004803603810190610a2e9190613fe9565b612ab6565b005b348015610a4157600080fd5b50610a4a612ac8565b604051610a57919061419f565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a829190613fe9565b612ace565b005b348015610a9557600080fd5b50610a9e612ae0565b604051610aab919061419f565b60405180910390f35b348015610ac057600080fd5b50610adb6004803603810190610ad69190613fe9565b612ae6565b005b348015610ae957600080fd5b50610af2612af8565b604051610aff919061419f565b60405180910390f35b348015610b1457600080fd5b50610b1d612afe565b604051610b2a91906140a6565b60405180910390f35b348015610b3f57600080fd5b50610b5a6004803603810190610b559190614779565b612b26565b604051610b679190613f98565b60405180910390f35b348015610b7c57600080fd5b50610b976004803603810190610b92919061438b565b612bba565b005b348015610ba557600080fd5b50610bae612c3d565b604051610bbb919061419f565b60405180910390f35b348015610bd057600080fd5b50610bd9612c43565b604051610be6919061419f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cca5750610cc982612c49565b5b9050919050565b610cd9612cb3565b8060138190555050565b606060018054610cf2906147e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1e906147e8565b8015610d6b5780601f10610d4057610100808354040283529160200191610d6b565b820191906000526020600020905b815481529060010190602001808311610d4e57829003601f168201915b5050505050905090565b6000610d8082612d31565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dc682611ab4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d9061488b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e55612d7c565b73ffffffffffffffffffffffffffffffffffffffff161480610e845750610e8381610e7e612d7c565b612b26565b5b610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba9061491d565b60405180910390fd5b610ecd8383612d84565b505050565b60135481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fd4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f4f92919061493d565b6020604051808303816000875af1158015610f6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f92919061497b565b610fd357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fca9190614109565b60405180910390fd5b5b610fdf838383612e3d565b505050565b600f60009054906101000a900460ff1681565b600060149054906101000a900460ff1615611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906149f4565b60405180910390fd5b6001600060146101000a81548160ff02191690831515021790555061106b81612e9d565b806011546110799190614a43565b34146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b190614ad1565b60405180910390fd5b6110c381613050565b60008060146101000a81548160ff02191690831515021790555050565b6110e8612cb3565b6000600f60006101000a81548160ff021916908315150217905550565b61110d612cb3565b60004790506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161116f9190614109565b602060405180830381865afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b09190614b06565b90506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120f9190614109565b602060405180830381865afa15801561122c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112509190614b06565b90506000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166064601e8661129c9190614a43565b6112a69190614b62565b6040516112b290614bc4565b60006040518083038185875af1925050503d80600081146112ef576040519150601f19603f3d011682016040523d82523d6000602084013e6112f4565b606091505b5050809150508061133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190614c25565b60405180910390fd5b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660646046866113829190614a43565b61138c9190614b62565b60405161139890614bc4565b60006040518083038185875af1925050503d80600081146113d5576040519150601f19603f3d011682016040523d82523d6000602084013e6113da565b606091505b50508091505080611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790614c25565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601e876114909190614a43565b61149a9190614b62565b6040518363ffffffff1660e01b81526004016114b7929190614c45565b6020604051808303816000875af11580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa919061497b565b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606460468761156b9190614a43565b6115759190614b62565b6040518363ffffffff1660e01b8152600401611592929190614c45565b6020604051808303816000875af11580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d5919061497b565b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601e866116469190614a43565b6116509190614b62565b6040518363ffffffff1660e01b815260040161166d929190614c45565b6020604051808303816000875af115801561168c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b0919061497b565b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660646046866117219190614a43565b61172b9190614b62565b6040518363ffffffff1660e01b8152600401611748929190614c45565b6020604051808303816000875af1158015611767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178b919061497b565b5050505050565b6060600b80546117a1906147e8565b80601f01602080910402602001604051908101604052809291908181526020018280546117cd906147e8565b801561181a5780601f106117ef5761010080835404028352916020019161181a565b820191906000526020600020905b8154815290600101906020018083116117fd57829003601f168201915b5050505050905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611920576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161189b92919061493d565b6020604051808303816000875af11580156118ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118de919061497b565b61191f57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016119169190614109565b60405180910390fd5b5b61192b8383836130fe565b505050565b60175481565b61193e612cb3565b6012548160125461194f9190614c6e565b11801561196b5750601054816012546119689190614c6e565b11155b6119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a190614cee565b60405180910390fd5b6000601354141580156119cb57506000816013546119c89190614d0e565b10155b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190614d8e565b60405180910390fd5b600060125490508160135410611a38578160136000828254611a2c9190614d0e565b92505081905550611a41565b60006013819055505b8160126000828254611a539190614c6e565b9250508190555060005b82811015611a8d57611a7a848284611a759190614c6e565b61311e565b8080611a8590614dae565b915050611a5d565b50505050565b60165481565b611aa1612cb3565b80600c9081611ab09190614fa2565b5050565b600080611ac08361313c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b28906150c0565b60405180910390fd5b80915050919050565b611b42612cb3565b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb390615152565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c0b612cb3565b611c156000613179565b565b611c1f612cb3565b8060158190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b611c51612cb3565b8060168190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c8c612cb3565b8060118190555050565b600060149054906101000a900460ff1615611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd906149f4565b60405180910390fd5b6001600060146101000a81548160ff021916908315150217905550611d0a82612e9d565b6001811480611d195750600281145b611d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4f906151be565b60405180910390fd5b60018103611f6a5781601a54611d6e9190614a43565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611dc99190614109565b602060405180830381865afa158015611de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0a9190614b06565b1015611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e429061522a565b60405180910390fd5b600082601654611e5b9190614d0e565b1015611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9390615296565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333085601a54611eea9190614a43565b6040518463ffffffff1660e01b8152600401611f08939291906152b6565b6020604051808303816000875af1158015611f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4b919061497b565b508160166000828254611f5e9190614d0e565b92505081905550612179565b600281036121785781601954611f809190614a43565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611fdb9190614109565b602060405180830381865afa158015611ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201c9190614b06565b101561205d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120549061522a565b60405180910390fd5b60008260155461206d9190614d0e565b10156120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590615339565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856019546120fc9190614a43565b6040518463ffffffff1660e01b815260040161211a939291906152b6565b6020604051808303816000875af1158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d919061497b565b5081601560008282546121709190614d0e565b925050819055505b5b61218282613050565b60008060146101000a81548160ff0219169083151502179055505050565b6060600280546121af906147e8565b80601f01602080910402602001604051908101604052809291908181526020018280546121db906147e8565b80156122285780601f106121fd57610100808354040283529160200191612228565b820191906000526020600020905b81548152906001019060200180831161220b57829003601f168201915b5050505050905090565b60125481565b600060149054906101000a900460ff1615612288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227f906149f4565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055506122ad8151612e9d565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316122f5612d7c565b6040518263ffffffff1660e01b81526004016123119190614109565b602060405180830381865afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123529190614b06565b11612392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612389906153a5565b60405180910390fd5b600060145410156123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf90615411565b60405180910390fd5b60005b815181101561259557600e60008383815181106123fb576123fa615431565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161561245f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612456906154ac565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8383815181106124b0576124af615431565b5b60200260200101516040518263ffffffff1660e01b81526004016124d4919061419f565b602060405180830381865afa1580156124f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251591906154e1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125799061555a565b60405180910390fd5b808061258d90614dae565b9150506123db565b50600060125490508151600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ed9190614c6e565b925050819055508151601260008282546126079190614c6e565b925050819055508151601460008282546126219190614d0e565b9250508190555060005b82518110156126a95761265061263f612d7c565b828461264b9190614c6e565b61311e565b6001600e600085848151811061266957612668615431565b5b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806126a190614dae565b91505061262b565b505060008060146101000a81548160ff02191690831515021790555050565b60115481565b6126e06126d9612d7c565b838361323d565b5050565b6126ec612cb3565b6001600f60016101000a81548160ff021916908315150217905550565b601a5481565b612717612cb3565b6000600f60016101000a81548160ff021916908315150217905550565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612830576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016127ab92919061493d565b6020604051808303816000875af11580156127ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ee919061497b565b61282f57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016128269190614109565b60405180910390fd5b5b61283c848484846133a9565b50505050565b61284a612cb3565b8060148190555050565b61285c612cb3565b8060198190555050565b6060600a8054612875906147e8565b80601f01602080910402602001604051908101604052809291908181526020018280546128a1906147e8565b80156128ee5780601f106128c3576101008083540402835291602001916128ee565b820191906000526020600020905b8154815290600101906020018083116128d157829003601f168201915b5050505050905090565b60606129038261340b565b612942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612939906155c6565b60405180910390fd5b6060600f60019054906101000a900460ff161561298b57600c6129648461344c565b6040516020016129759291906156f1565b60405160208183030381529060405290506129af565b600c60405160200161299d919061576c565b60405160208183030381529060405290505b80915050919050565b6129c0612cb3565b6001600f60006101000a81548160ff021916908315150217905550565b60606000825167ffffffffffffffff8111156129fc576129fb614217565b5b604051908082528060200260200182016040528015612a2a5781602001602082028036833780820191505090505b50905060005b8351811015612aac57600e6000858381518110612a5057612a4f615431565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16828281518110612a8757612a86615431565b5b6020026020010190151590811515815250508080612aa490614dae565b915050612a30565b5080915050919050565b612abe612cb3565b8060188190555050565b60105481565b612ad6612cb3565b80601a8190555050565b60185481565b612aee612cb3565b8060178190555050565b60145481565b6060600c604051602001612b1291906157da565b604051602081830303815290604052905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612bc2612cb3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c289061586e565b60405180910390fd5b612c3a81613179565b50565b60155481565b60195481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cbb612d7c565b73ffffffffffffffffffffffffffffffffffffffff16612cd9611c5b565b73ffffffffffffffffffffffffffffffffffffffff1614612d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d26906158da565b60405180910390fd5b565b612d3a8161340b565b612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d70906150c0565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612df783611ab4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612e4e612e48612d7c565b826135ac565b612e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e849061596c565b60405180910390fd5b612e98838383613641565b505050565b600f60009054906101000a900460ff16612eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee3906159d8565b60405180910390fd5b60105460165460155460145460135460125486612f099190614c6e565b612f139190614c6e565b612f1d9190614c6e565b612f279190614c6e565b612f319190614c6e565b1115612f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6990615a44565b60405180910390fd5b601854811115612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae90615ad6565b60405180910390fd5b60175481600d6000612fc7612d7c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300c9190614c6e565b111561304d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304490615b42565b60405180910390fd5b50565b6000601254905081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a69190614c6e565b9250508190555081601260008282546130bf9190614c6e565b9250508190555060005b828110156130f9576130e63382846130e19190614c6e565b61311e565b80806130f190614dae565b9150506130c9565b505050565b61311983838360405180602001604052806000815250612734565b505050565b61313882826040518060200160405280600081525061393a565b5050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036132ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a290615bae565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161339c9190613f98565b60405180910390a3505050565b6133ba6133b4612d7c565b836135ac565b6133f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f09061596c565b60405180910390fd5b61340584848484613995565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661342d8361313c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008203613493576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135a7565b600082905060005b600082146134c55780806134ae90614dae565b915050600a826134be9190614b62565b915061349b565b60008167ffffffffffffffff8111156134e1576134e0614217565b5b6040519080825280601f01601f1916602001820160405280156135135781602001600182028036833780820191505090505b5090505b600085146135a05760018261352c9190614d0e565b9150600a8561353b9190615bce565b60306135479190614c6e565b60f81b81838151811061355d5761355c615431565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135999190614b62565b9450613517565b8093505050505b919050565b6000806135b883611ab4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135fa57506135f98185612b26565b5b8061363857508373ffffffffffffffffffffffffffffffffffffffff1661362084610d75565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661366182611ab4565b73ffffffffffffffffffffffffffffffffffffffff16146136b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ae90615c71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371d90615d03565b60405180910390fd5b61373383838360016139f1565b8273ffffffffffffffffffffffffffffffffffffffff1661375382611ab4565b73ffffffffffffffffffffffffffffffffffffffff16146137a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a090615c71565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139358383836001613b17565b505050565b6139448383613b1d565b6139516000848484613d3a565b613990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398790615d95565b60405180910390fd5b505050565b6139a0848484613641565b6139ac84848484613d3a565b6139eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e290615d95565b60405180910390fd5b50505050565b6001811115613b1157600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613a855780600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a7d9190614d0e565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b105780600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b089190614c6e565b925050819055505b5b50505050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8390615e01565b60405180910390fd5b613b958161340b565b15613bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bcc90615e6d565b60405180910390fd5b613be36000838360016139f1565b613bec8161340b565b15613c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2390615e6d565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d36600083836001613b17565b5050565b6000613d5b8473ffffffffffffffffffffffffffffffffffffffff16613ec1565b15613eb4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d84612d7c565b8786866040518563ffffffff1660e01b8152600401613da69493929190615ee2565b6020604051808303816000875af1925050508015613de257506040513d601f19601f82011682018060405250810190613ddf9190615f43565b60015b613e64573d8060008114613e12576040519150601f19603f3d011682016040523d82523d6000602084013e613e17565b606091505b506000815103613e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5390615d95565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613eb9565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f2d81613ef8565b8114613f3857600080fd5b50565b600081359050613f4a81613f24565b92915050565b600060208284031215613f6657613f65613eee565b5b6000613f7484828501613f3b565b91505092915050565b60008115159050919050565b613f9281613f7d565b82525050565b6000602082019050613fad6000830184613f89565b92915050565b6000819050919050565b613fc681613fb3565b8114613fd157600080fd5b50565b600081359050613fe381613fbd565b92915050565b600060208284031215613fff57613ffe613eee565b5b600061400d84828501613fd4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614050578082015181840152602081019050614035565b60008484015250505050565b6000601f19601f8301169050919050565b600061407882614016565b6140828185614021565b9350614092818560208601614032565b61409b8161405c565b840191505092915050565b600060208201905081810360008301526140c0818461406d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140f3826140c8565b9050919050565b614103816140e8565b82525050565b600060208201905061411e60008301846140fa565b92915050565b61412d816140e8565b811461413857600080fd5b50565b60008135905061414a81614124565b92915050565b6000806040838503121561416757614166613eee565b5b60006141758582860161413b565b925050602061418685828601613fd4565b9150509250929050565b61419981613fb3565b82525050565b60006020820190506141b46000830184614190565b92915050565b6000806000606084860312156141d3576141d2613eee565b5b60006141e18682870161413b565b93505060206141f28682870161413b565b925050604061420386828701613fd4565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61424f8261405c565b810181811067ffffffffffffffff8211171561426e5761426d614217565b5b80604052505050565b6000614281613ee4565b905061428d8282614246565b919050565b600067ffffffffffffffff8211156142ad576142ac614217565b5b6142b68261405c565b9050602081019050919050565b82818337600083830152505050565b60006142e56142e084614292565b614277565b90508281526020810184848401111561430157614300614212565b5b61430c8482856142c3565b509392505050565b600082601f8301126143295761432861420d565b5b81356143398482602086016142d2565b91505092915050565b60006020828403121561435857614357613eee565b5b600082013567ffffffffffffffff81111561437657614375613ef3565b5b61438284828501614314565b91505092915050565b6000602082840312156143a1576143a0613eee565b5b60006143af8482850161413b565b91505092915050565b600080604083850312156143cf576143ce613eee565b5b60006143dd85828601613fd4565b92505060206143ee85828601613fd4565b9150509250929050565b600067ffffffffffffffff82111561441357614412614217565b5b602082029050602081019050919050565b600080fd5b600061443c614437846143f8565b614277565b9050808382526020820190506020840283018581111561445f5761445e614424565b5b835b8181101561448857806144748882613fd4565b845260208401935050602081019050614461565b5050509392505050565b600082601f8301126144a7576144a661420d565b5b81356144b7848260208601614429565b91505092915050565b6000602082840312156144d6576144d5613eee565b5b600082013567ffffffffffffffff8111156144f4576144f3613ef3565b5b61450084828501614492565b91505092915050565b61451281613f7d565b811461451d57600080fd5b50565b60008135905061452f81614509565b92915050565b6000806040838503121561454c5761454b613eee565b5b600061455a8582860161413b565b925050602061456b85828601614520565b9150509250929050565b600067ffffffffffffffff8211156145905761458f614217565b5b6145998261405c565b9050602081019050919050565b60006145b96145b484614575565b614277565b9050828152602081018484840111156145d5576145d4614212565b5b6145e08482856142c3565b509392505050565b600082601f8301126145fd576145fc61420d565b5b813561460d8482602086016145a6565b91505092915050565b600080600080608085870312156146305761462f613eee565b5b600061463e8782880161413b565b945050602061464f8782880161413b565b935050604061466087828801613fd4565b925050606085013567ffffffffffffffff81111561468157614680613ef3565b5b61468d878288016145e8565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6146ce81613f7d565b82525050565b60006146e083836146c5565b60208301905092915050565b6000602082019050919050565b600061470482614699565b61470e81856146a4565b9350614719836146b5565b8060005b8381101561474a57815161473188826146d4565b975061473c836146ec565b92505060018101905061471d565b5085935050505092915050565b6000602082019050818103600083015261477181846146f9565b905092915050565b600080604083850312156147905761478f613eee565b5b600061479e8582860161413b565b92505060206147af8582860161413b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061480057607f821691505b602082108103614813576148126147b9565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614875602183614021565b915061488082614819565b604082019050919050565b600060208201905081810360008301526148a481614868565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614907603d83614021565b9150614912826148ab565b604082019050919050565b60006020820190508181036000830152614936816148fa565b9050919050565b600060408201905061495260008301856140fa565b61495f60208301846140fa565b9392505050565b60008151905061497581614509565b92915050565b60006020828403121561499157614990613eee565b5b600061499f84828501614966565b91505092915050565b7f617474656d7074207265656e746572206c6f636b65642066756e6374696f6e00600082015250565b60006149de601f83614021565b91506149e9826149a8565b602082019050919050565b60006020820190508181036000830152614a0d816149d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a4e82613fb3565b9150614a5983613fb3565b9250828202614a6781613fb3565b91508282048414831517614a7e57614a7d614a14565b5b5092915050565b7f4d696e743a20496e73756666696369656e742046756e64000000000000000000600082015250565b6000614abb601783614021565b9150614ac682614a85565b602082019050919050565b60006020820190508181036000830152614aea81614aae565b9050919050565b600081519050614b0081613fbd565b92915050565b600060208284031215614b1c57614b1b613eee565b5b6000614b2a84828501614af1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b6d82613fb3565b9150614b7883613fb3565b925082614b8857614b87614b33565b5b828204905092915050565b600081905092915050565b50565b6000614bae600083614b93565b9150614bb982614b9e565b600082019050919050565b6000614bcf82614ba1565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000614c0f601883614021565b9150614c1a82614bd9565b602082019050919050565b60006020820190508181036000830152614c3e81614c02565b9050919050565b6000604082019050614c5a60008301856140fa565b614c676020830184614190565b9392505050565b6000614c7982613fb3565b9150614c8483613fb3565b9250828201905080821115614c9c57614c9b614a14565b5b92915050565b7f4d617468206f766572666c6f7700000000000000000000000000000000000000600082015250565b6000614cd8600d83614021565b9150614ce382614ca2565b602082019050919050565b60006020820190508181036000830152614d0781614ccb565b9050919050565b6000614d1982613fb3565b9150614d2483613fb3565b9250828203905081811115614d3c57614d3b614a14565b5b92915050565b7f4f776e657220726573657276656420746f6b656e7320656e6400000000000000600082015250565b6000614d78601983614021565b9150614d8382614d42565b602082019050919050565b60006020820190508181036000830152614da781614d6b565b9050919050565b6000614db982613fb3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614deb57614dea614a14565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614e587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e1b565b614e628683614e1b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614e9f614e9a614e9584613fb3565b614e7a565b613fb3565b9050919050565b6000819050919050565b614eb983614e84565b614ecd614ec582614ea6565b848454614e28565b825550505050565b600090565b614ee2614ed5565b614eed818484614eb0565b505050565b5b81811015614f1157614f06600082614eda565b600181019050614ef3565b5050565b601f821115614f5657614f2781614df6565b614f3084614e0b565b81016020851015614f3f578190505b614f53614f4b85614e0b565b830182614ef2565b50505b505050565b600082821c905092915050565b6000614f7960001984600802614f5b565b1980831691505092915050565b6000614f928383614f68565b9150826002028217905092915050565b614fab82614016565b67ffffffffffffffff811115614fc457614fc3614217565b5b614fce82546147e8565b614fd9828285614f15565b600060209050601f83116001811461500c5760008415614ffa578287015190505b6150048582614f86565b86555061506c565b601f19841661501a86614df6565b60005b828110156150425784890151825560018201915060208501945060208101905061501d565b8683101561505f578489015161505b601f891682614f68565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006150aa601883614021565b91506150b582615074565b602082019050919050565b600060208201905081810360008301526150d98161509d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061513c602983614021565b9150615147826150e0565b604082019050919050565b6000602082019050818103600083015261516b8161512f565b9050919050565b7f496e76616c6964206d696e7420747970652e0000000000000000000000000000600082015250565b60006151a8601283614021565b91506151b382615172565b602082019050919050565b600060208201905081810360008301526151d78161519b565b9050919050565b7f4c6573732066756e640000000000000000000000000000000000000000000000600082015250565b6000615214600983614021565b915061521f826151de565b602082019050919050565b6000602082019050818103600083015261524381615207565b9050919050565b7f5265736572766564204c6f766520746f6b656e7320656e640000000000000000600082015250565b6000615280601883614021565b915061528b8261524a565b602082019050919050565b600060208201905081810360008301526152af81615273565b9050919050565b60006060820190506152cb60008301866140fa565b6152d860208301856140fa565b6152e56040830184614190565b949350505050565b7f526573657276656420476173466163746f727920746f6b656e7320656e640000600082015250565b6000615323601e83614021565b915061532e826152ed565b602082019050919050565b6000602082019050818103600083015261535281615316565b9050919050565b7f4d7573742068617665204368616d656c656f6e2e000000000000000000000000600082015250565b600061538f601483614021565b915061539a82615359565b602082019050919050565b600060208201905081810360008301526153be81615382565b9050919050565b7f4368616d656c656f6e206c696d6974206f7665722e0000000000000000000000600082015250565b60006153fb601583614021565b9150615406826153c5565b602082019050919050565b6000602082019050818103600083015261542a816153ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4368616d656c656f6e20616c7265616479206d696e7465640000000000000000600082015250565b6000615496601883614021565b91506154a182615460565b602082019050919050565b600060208201905081810360008301526154c581615489565b9050919050565b6000815190506154db81614124565b92915050565b6000602082840312156154f7576154f6613eee565b5b6000615505848285016154cc565b91505092915050565b7f496e76616c6964206f776e657200000000000000000000000000000000000000600082015250565b6000615544600d83614021565b915061554f8261550e565b602082019050919050565b6000602082019050818103600083015261557381615537565b9050919050565b7f4552433732314d657461646174613a205552492030783020746f6b656e000000600082015250565b60006155b0601d83614021565b91506155bb8261557a565b602082019050919050565b600060208201905081810360008301526155df816155a3565b9050919050565b600081905092915050565b600081546155fe816147e8565b61560881866155e6565b9450600182166000811461562357600181146156385761566b565b60ff198316865281151582028601935061566b565b61564185614df6565b60005b8381101561566357815481890152600182019150602081019050615644565b838801955050505b50505092915050565b600061567f82614016565b61568981856155e6565b9350615699818560208601614032565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006156db6005836155e6565b91506156e6826156a5565b600582019050919050565b60006156fd82856155f1565b91506157098284615674565b9150615714826156ce565b91508190509392505050565b7f6d7973746572792e6a736f6e0000000000000000000000000000000000000000600082015250565b6000615756600c836155e6565b915061576182615720565b600c82019050919050565b600061577882846155f1565b915061578382615749565b915081905092915050565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b60006157c4600d836155e6565b91506157cf8261578e565b600d82019050919050565b60006157e682846155f1565b91506157f1826157b7565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615858602683614021565b9150615863826157fc565b604082019050919050565b600060208201905081810360008301526158878161584b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006158c4602083614021565b91506158cf8261588e565b602082019050919050565b600060208201905081810360008301526158f3816158b7565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000615956602d83614021565b9150615961826158fa565b604082019050919050565b6000602082019050818103600083015261598581615949565b9050919050565b7f4d696e74206973206e6f74204163746976650000000000000000000000000000600082015250565b60006159c2601283614021565b91506159cd8261598c565b602082019050919050565b600060208201905081810360008301526159f1816159b5565b9050919050565b7f4e6f7420656e6f75676820617661696c6162696c697479000000000000000000600082015250565b6000615a2e601783614021565b9150615a39826159f8565b602082019050919050565b60006020820190508181036000830152615a5d81615a21565b9050919050565b7f4d696e7420746f6b656e7320706572207472616e73616374696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000615ac0602483614021565b9150615acb82615a64565b604082019050919050565b60006020820190508181036000830152615aef81615ab3565b9050919050565b7f4d696e74207065722077616c6c65742065786365656465640000000000000000600082015250565b6000615b2c601883614021565b9150615b3782615af6565b602082019050919050565b60006020820190508181036000830152615b5b81615b1f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615b98601983614021565b9150615ba382615b62565b602082019050919050565b60006020820190508181036000830152615bc781615b8b565b9050919050565b6000615bd982613fb3565b9150615be483613fb3565b925082615bf457615bf3614b33565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615c5b602583614021565b9150615c6682615bff565b604082019050919050565b60006020820190508181036000830152615c8a81615c4e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615ced602483614021565b9150615cf882615c91565b604082019050919050565b60006020820190508181036000830152615d1c81615ce0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615d7f603283614021565b9150615d8a82615d23565b604082019050919050565b60006020820190508181036000830152615dae81615d72565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615deb602083614021565b9150615df682615db5565b602082019050919050565b60006020820190508181036000830152615e1a81615dde565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615e57601c83614021565b9150615e6282615e21565b602082019050919050565b60006020820190508181036000830152615e8681615e4a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615eb482615e8d565b615ebe8185615e98565b9350615ece818560208601614032565b615ed78161405c565b840191505092915050565b6000608082019050615ef760008301876140fa565b615f0460208301866140fa565b615f116040830185614190565b8181036060830152615f238184615ea9565b905095945050505050565b600081519050615f3d81613f24565b92915050565b600060208284031215615f5957615f58613eee565b5b6000615f6784828501615f2e565b9150509291505056fea26469706673582212204d38b9d771907ee4ec7052370b12a2a85856fa2b149e475acdba9ed35f38ac9464736f6c63430008110033

Deployed Bytecode Sourcemap

77951:10258:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57980:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84984:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58908:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60420:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59938:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78695:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86423:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78546:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82135:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85716:80;;;;;;;;;;;;;:::i;:::-;;80800:885;;;;;;;;;;;;;:::i;:::-;;87270:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86588:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78833:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80184:608;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78799:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85521:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58618:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84876:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58349:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75758:103;;;;;;;;;;;;;:::i;:::-;;85216:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78484:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85328:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75110:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85804:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83221:853;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59077:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78662:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82410:803;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78635:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60663:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84579:72;;;;;;;;;;;;;:::i;:::-;;78931:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85442:71;;;;;;;;;;;;;:::i;:::-;;86761:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85102:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85900:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87126:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87448:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85627:77;;;;;;;;;;;;;:::i;:::-;;86106:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84765:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78604:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86002:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78867:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84663:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78732:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87899:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60889:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76016:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78766:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78901:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57980:305;58082:4;58134:25;58119:40;;;:11;:40;;;;:105;;;;58191:33;58176:48;;;:11;:48;;;;58119:105;:158;;;;58241:36;58265:11;58241:23;:36::i;:::-;58119:158;58099:178;;57980:305;;;:::o;84984:110::-;74996:13;:11;:13::i;:::-;85078:8:::1;85061:14;:25;;;;84984:110:::0;:::o;58908:100::-;58962:13;58995:5;58988:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58908:100;:::o;60420:171::-;60496:7;60516:23;60531:7;60516:14;:23::i;:::-;60559:15;:24;60575:7;60559:24;;;;;;;;;;;;;;;;;;;;;60552:31;;60420:171;;;:::o;59938:416::-;60019:13;60035:23;60050:7;60035:14;:23::i;:::-;60019:39;;60083:5;60077:11;;:2;:11;;;60069:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60177:5;60161:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;60186:37;60203:5;60210:12;:10;:12::i;:::-;60186:16;:37::i;:::-;60161:62;60139:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;60325:21;60334:2;60338:7;60325:8;:21::i;:::-;60008:346;59938:416;;:::o;78695:29::-;;;;:::o;86423:157::-;16973:1;15799:42;16927:43;;;:47;16923:225;;;15799:42;16996:40;;;17045:4;17052:10;16996:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16991:146;;17110:10;17091:30;;;;;;;;;;;:::i;:::-;;;;;;;;16991:146;16923:225;86535:37:::1;86554:4;86560:2;86564:7;86535:18;:37::i;:::-;86423:157:::0;;;:::o;78546:22::-;;;;;;;;;;;;;:::o;82135:193::-;77425:11;;;;;;;;;;;77424:12;77416:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77497:4;77483:11;;:18;;;;;;;;;;;;;;;;;;82208:15:::1;82219:3;82208:10;:15::i;:::-;82263:3;82255:5;;:11;;;;:::i;:::-;82242:9;:24;82234:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;82305:15;82316:3;82305:10;:15::i;:::-;77538:5:::0;77524:11;;:19;;;;;;;;;;;;;;;;;;82135:193;:::o;85716:80::-;74996:13;:11;:13::i;:::-;85783:5:::1;85770:10;;:18;;;;;;;;;;;;;;;;;;85716:80::o:0;80800:885::-;74996:13;:11;:13::i;:::-;80850:18:::1;80871:21;80850:42;;80903:22;80927:16;;;;;;;;;;;:26;;;80962:4;80927:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80903:65;;80979:21;81002:17;;;;;;;;;;;:27;;;81038:4;81002:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80979:65;;81057:12;81104:7;;;;;;;;;;;:12;;81145:3;81139:2;81126:10;:15;;;;:::i;:::-;81125:23;;;;:::i;:::-;81104:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81090:64;;;;;81173:7;81165:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;81244:5;;;;;;;;;;;:10;;81283:3;81277:2;81264:10;:15;;;;:::i;:::-;81263:23;;;;:::i;:::-;81244:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81230:62;;;;;81311:7;81303:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;81368:16;;;;;;;;;;;:25;;;81394:7;;;;;;;;;;;81427:3;81421:2;81404:14;:19;;;;:::i;:::-;81403:27;;;;:::i;:::-;81368:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81443:16;;;;;;;;;;;:25;;;81469:5;;;;;;;;;;;81501:3;81494:2;81477:14;:19;;;;:::i;:::-;81476:28;;;;:::i;:::-;81443:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81527:17;;;;;;;;;;;:26;;;81554:7;;;;;;;;;;;81587:3;81580:2;81564:13;:18;;;;:::i;:::-;81563:27;;;;:::i;:::-;81527:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81603:17;;;;;;;;;;;:26;;;81630:5;;;;;;;;;;;81661:3;81654:2;81638:13;:18;;;;:::i;:::-;81637:27;;;;:::i;:::-;81603:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;80839:846;;;;80800:885::o:0;87270:91::-;87314:13;87346:7;87339:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87270:91;:::o;86588:165::-;16973:1;15799:42;16927:43;;;:47;16923:225;;;15799:42;16996:40;;;17045:4;17052:10;16996:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16991:146;;17110:10;17091:30;;;;;;;;;;;:::i;:::-;;;;;;;;16991:146;16923:225;86704:41:::1;86727:4;86733:2;86737:7;86704:22;:41::i;:::-;86588:165:::0;;;:::o;78833:27::-;;;;:::o;80184:608::-;74996:13;:11;:13::i;:::-;80290:11:::1;;80283:3;80269:11;;:17;;;;:::i;:::-;80268:33;80267:73;;;;;80330:9;;80322:3;80308:11;;:17;;;;:::i;:::-;80307:32;;80267:73;80259:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;80396:1;80378:14;;:19;;80377:52;;;;;80427:1;80420:3;80403:14;;:20;;;;:::i;:::-;:25;;80377:52;80369:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;80480:21;80504:11;;80480:35;;80549:3;80531:14;;:21;80527:126;;80587:3;80569:14;;:21;;;;;;;:::i;:::-;;;;;;;;80527:126;;;80640:1;80623:14;:18;;;;80527:126;80678:3;80663:11;;:18;;;;;;;:::i;:::-;;;;;;;;80696:9;80692:93;80715:3;80711:1;:7;80692:93;;;80740:33;80750:3;80771:1;80755:13;:17;;;;:::i;:::-;80740:9;:33::i;:::-;80720:3;;;;;:::i;:::-;;;;80692:93;;;;80248:544;80184:608:::0;;:::o;78799:27::-;;;;:::o;85521:94::-;74996:13;:11;:13::i;:::-;85601:6:::1;85591:7;:16;;;;;;:::i;:::-;;85521:94:::0;:::o;58618:223::-;58690:7;58710:13;58726:17;58735:7;58726:8;:17::i;:::-;58710:33;;58779:1;58762:19;;:5;:19;;;58754:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58828:5;58821:12;;;58618:223;;;:::o;84876:100::-;74996:13;:11;:13::i;:::-;84960:8:::1;84948:9;:20;;;;84876:100:::0;:::o;58349:207::-;58421:7;58466:1;58449:19;;:5;:19;;;58441:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58532:9;:16;58542:5;58532:16;;;;;;;;;;;;;;;;58525:23;;58349:207;;;:::o;75758:103::-;74996:13;:11;:13::i;:::-;75823:30:::1;75850:1;75823:18;:30::i;:::-;75758:103::o:0;85216:104::-;74996:13;:11;:13::i;:::-;85304:8:::1;85290:11;:22;;;;85216:104:::0;:::o;78484:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;85328:106::-;74996:13;:11;:13::i;:::-;85418:8:::1;85403:12;:23;;;;85328:106:::0;:::o;75110:87::-;75156:7;75183:6;;;;;;;;;;;75176:13;;75110:87;:::o;85804:88::-;74996:13;:11;:13::i;:::-;85876:8:::1;85868:5;:16;;;;85804:88:::0;:::o;83221:853::-;77425:11;;;;;;;;;;;77424:12;77416:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77497:4;77483:11;;:18;;;;;;;;;;;;;;;;;;83310:15:::1;83321:3;83310:10;:15::i;:::-;83352:1;83344:4;:9;:22;;;;83365:1;83357:4;:9;83344:22;83336:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;83412:1;83404:4;:9:::0;83401:640:::1;;83491:3;83479:9;;:15;;;;:::i;:::-;83437:16;;;;;;;;;;;:26;;;83464:10;83437:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;83429:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;83552:1;83545:3;83530:12;;:18;;;;:::i;:::-;:23;;83522:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;83597:16;;;;;;;;;;;:29;;;83627:10;83647:4;83666:3;83654:9;;:15;;;;:::i;:::-;83597:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;83701:3;83685:12;;:19;;;;;;;:::i;:::-;;;;;;;;83401:640;;;83732:1;83724:4;:9:::0;83721:320:::1;;83812:3;83801:8;;:14;;;;:::i;:::-;83758:17;;;;;;;;;;;:27;;;83786:10;83758:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;83750:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;83872:1;83865:3;83851:11;;:17;;;;:::i;:::-;:22;;83843:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;83923:17;;;;;;;;;;;:30;;;83954:10;83974:4;83992:3;83981:8;;:14;;;;:::i;:::-;83923:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;84026:3;84011:11;;:18;;;;;;;:::i;:::-;;;;;;;;83721:320;83401:640;84051:15;84062:3;84051:10;:15::i;:::-;77538:5:::0;77524:11;;:19;;;;;;;;;;;;;;;;;;83221:853;;:::o;59077:104::-;59133:13;59166:7;59159:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59077:104;:::o;78662:26::-;;;;:::o;82410:803::-;77425:11;;;;;;;;;;;77424:12;77416:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77497:4;77483:11;;:18;;;;;;;;;;;;;;;;;;82491:22:::1;82502:3;:10;82491;:22::i;:::-;82561:1;82532:2;;;;;;;;;;;:12;;;82545;:10;:12::i;:::-;82532:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;82524:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;82622:1;82606:12;;:17;;82598:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;82664:6;82660:211;82679:3;:10;82675:1;:14;82660:211;;;82729:17;:27;82748:3;82752:1;82748:6;;;;;;;;:::i;:::-;;;;;;;;82729:27;;;;;;;;;;;;;;;;;;;;;82728:28;82720:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;82821:2;;;;;;;;;;;82820:12;;;82834:3;82838:1;82834:6;;;;;;;;:::i;:::-;;;;;;;;82820:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82806:36;;:10;:36;;;82798:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;82692:3;;;;;:::i;:::-;;;;82660:211;;;;82881:21;82905:11;;82881:35;;82957:3;:10;82927:14;:26;82942:10;82927:26;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;82993:3;:10;82978:11;;:25;;;;;;;:::i;:::-;;;;;;;;83030:3;:10;83014:12;;:26;;;;;;;:::i;:::-;;;;;;;;83055:9;83051:155;83074:3;:10;83070:1;:14;83051:155;;;83103:42;83113:12;:10;:12::i;:::-;83143:1;83127:13;:17;;;;:::i;:::-;83103:9;:42::i;:::-;83190:4;83160:17;:27;83179:3;83183:1;83179:6;;;;;;;;:::i;:::-;;;;;;;;83160:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;83086:3;;;;;:::i;:::-;;;;83051:155;;;;82480:733;77538:5:::0;77524:11;;:19;;;;;;;;;;;;;;;;;;82410:803;:::o;78635:20::-;;;;:::o;60663:155::-;60758:52;60777:12;:10;:12::i;:::-;60791:8;60801;60758:18;:52::i;:::-;60663:155;;:::o;84579:72::-;74996:13;:11;:13::i;:::-;84639:4:::1;84627:9;;:16;;;;;;;;;;;;;;;;;;84579:72::o:0;78931:24::-;;;;:::o;85442:71::-;74996:13;:11;:13::i;:::-;85500:5:::1;85488:9;;:17;;;;;;;;;;;;;;;;;;85442:71::o:0;86761:222::-;16973:1;15799:42;16927:43;;;:47;16923:225;;;15799:42;16996:40;;;17045:4;17052:10;16996:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16991:146;;17110:10;17091:30;;;;;;;;;;;:::i;:::-;;;;;;;;16991:146;16923:225;86928:47:::1;86951:4;86957:2;86961:7;86970:4;86928:22;:47::i;:::-;86761:222:::0;;;;:::o;85102:106::-;74996:13;:11;:13::i;:::-;85192:8:::1;85177:12;:23;;;;85102:106:::0;:::o;85900:94::-;74996:13;:11;:13::i;:::-;85978:8:::1;85967;:19;;;;85900:94:::0;:::o;87126:87::-;87168:13;87200:5;87193:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87126:87;:::o;87448:439::-;87521:13;87554:16;87562:7;87554;:16::i;:::-;87546:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;87615:22;87652:9;;;;;;;;;;;87648:206;;;87712:7;87721:17;87730:7;87721:8;:17::i;:::-;87695:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87677:72;;87648:206;;;87817:7;87800:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;87782:60;;87648:206;87871:8;87864:15;;;87448:439;;;:::o;85627:77::-;74996:13;:11;:13::i;:::-;85692:4:::1;85679:10;;:17;;;;;;;;;;;;;;;;;;85627:77::o:0;86106:305::-;86179:14;86206:26;86245:3;:10;86234:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86206:50;;86271:9;86267:108;86290:3;:10;86286:1;:14;86267:108;;;86338:17;:25;86356:3;86360:1;86356:6;;;;;;;;:::i;:::-;;;;;;;;86338:25;;;;;;;;;;;;;;;;;;;;;86321:11;86333:1;86321:14;;;;;;;;:::i;:::-;;;;;;;:42;;;;;;;;;;;86302:3;;;;;:::i;:::-;;;;86267:108;;;;86392:11;86385:18;;;86106:305;;;:::o;84765:103::-;74996:13;:11;:13::i;:::-;84852:8:::1;84837:12;:23;;;;84765:103:::0;:::o;78604:24::-;;;;:::o;86002:96::-;74996:13;:11;:13::i;:::-;86082:8:::1;86070:9;:20;;;;86002:96:::0;:::o;78867:27::-;;;;:::o;84663:94::-;74996:13;:11;:13::i;:::-;84743:6:::1;84728:12;:21;;;;84663:94:::0;:::o;78732:27::-;;;;:::o;87899:138::-;87943:13;88004:7;87987:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;87973:56;;87899:138;:::o;60889:164::-;60986:4;61010:18;:25;61029:5;61010:25;;;;;;;;;;;;;;;:35;61036:8;61010:35;;;;;;;;;;;;;;;;;;;;;;;;;61003:42;;60889:164;;;;:::o;76016:201::-;74996:13;:11;:13::i;:::-;76125:1:::1;76105:22;;:8;:22;;::::0;76097:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;76181:28;76200:8;76181:18;:28::i;:::-;76016:201:::0;:::o;78766:26::-;;;;:::o;78901:23::-;;;;:::o;34056:157::-;34141:4;34180:25;34165:40;;;:11;:40;;;;34158:47;;34056:157;;;:::o;75275:132::-;75350:12;:10;:12::i;:::-;75339:23;;:7;:5;:7::i;:::-;:23;;;75331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75275:132::o;70239:135::-;70321:16;70329:7;70321;:16::i;:::-;70313:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;70239:135;:::o;56316:98::-;56369:7;56396:10;56389:17;;56316:98;:::o;69518:174::-;69620:2;69593:15;:24;69609:7;69593:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;69676:7;69672:2;69638:46;;69647:23;69662:7;69647:14;:23::i;:::-;69638:46;;;;;;;;;;;;69518:174;;:::o;61120:335::-;61315:41;61334:12;:10;:12::i;:::-;61348:7;61315:18;:41::i;:::-;61307:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;61419:28;61429:4;61435:2;61439:7;61419:9;:28::i;:::-;61120:335;;;:::o;81697:430::-;81762:10;;;;;;;;;;;81754:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;81899:9;;81881:12;;81867:11;;81852:12;;81835:14;;81821:11;;81815:3;:17;;;;:::i;:::-;:34;;;;:::i;:::-;:49;;;;:::i;:::-;:63;;;;:::i;:::-;:78;;;;:::i;:::-;81814:94;;81806:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;81963:12;;81956:3;:19;;81948:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;82078:12;;82069:3;82036:14;:30;82052:12;:10;:12::i;:::-;82036:30;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;82034:56;;82026:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;81697:430;:::o;84082:285::-;84133:21;84157:11;;84133:35;;84210:3;84180:14;:26;84195:10;84180:26;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;84246:3;84231:11;;:18;;;;;;;:::i;:::-;;;;;;;;84264:9;84260:100;84283:3;84279:1;:7;84260:100;;;84308:40;84318:10;84346:1;84330:13;:17;;;;:::i;:::-;84308:9;:40::i;:::-;84288:3;;;;;:::i;:::-;;;;84260:100;;;;84122:245;84082:285;:::o;61526:185::-;61664:39;61681:4;61687:2;61691:7;61664:39;;;;;;;;;;;;:16;:39::i;:::-;61526:185;;;:::o;64743:110::-;64819:26;64829:2;64833:7;64819:26;;;;;;;;;;;;:9;:26::i;:::-;64743:110;;:::o;63412:117::-;63478:7;63505;:16;63513:7;63505:16;;;;;;;;;;;;;;;;;;;;;63498:23;;63412:117;;;:::o;76377:191::-;76451:16;76470:6;;;;;;;;;;;76451:25;;76496:8;76487:6;;:17;;;;;;;;;;;;;;;;;;76551:8;76520:40;;76541:8;76520:40;;;;;;;;;;;;76440:128;76377:191;:::o;69835:315::-;69990:8;69981:17;;:5;:17;;;69973:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;70077:8;70039:18;:25;70058:5;70039:25;;;;;;;;;;;;;;;:35;70065:8;70039:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;70123:8;70101:41;;70116:5;70101:41;;;70133:8;70101:41;;;;;;:::i;:::-;;;;;;;;69835:315;;;:::o;61782:322::-;61956:41;61975:12;:10;:12::i;:::-;61989:7;61956:18;:41::i;:::-;61948:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;62058:38;62072:4;62078:2;62082:7;62091:4;62058:13;:38::i;:::-;61782:322;;;;:::o;63842:128::-;63907:4;63960:1;63931:31;;:17;63940:7;63931:8;:17::i;:::-;:31;;;;63924:38;;63842:128;;;:::o;76801:532::-;76857:13;76896:1;76887:5;:10;76883:53;;76914:10;;;;;;;;;;;;;;;;;;;;;76883:53;76946:12;76961:5;76946:20;;76977:14;77002:78;77017:1;77009:4;:9;77002:78;;77035:8;;;;;:::i;:::-;;;;77066:2;77058:10;;;;;:::i;:::-;;;77002:78;;;77090:19;77122:6;77112:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77090:39;;77140:154;77156:1;77147:5;:10;77140:154;;77184:1;77174:11;;;;;:::i;:::-;;;77251:2;77243:5;:10;;;;:::i;:::-;77230:2;:24;;;;:::i;:::-;77217:39;;77200:6;77207;77200:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;77280:2;77271:11;;;;;:::i;:::-;;;77140:154;;;77318:6;77304:21;;;;;76801:532;;;;:::o;64137:264::-;64230:4;64247:13;64263:23;64278:7;64263:14;:23::i;:::-;64247:39;;64316:5;64305:16;;:7;:16;;;:52;;;;64325:32;64342:5;64349:7;64325:16;:32::i;:::-;64305:52;:87;;;;64385:7;64361:31;;:20;64373:7;64361:11;:20::i;:::-;:31;;;64305:87;64297:96;;;64137:264;;;;:::o;68136:1263::-;68295:4;68268:31;;:23;68283:7;68268:14;:23::i;:::-;:31;;;68260:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68374:1;68360:16;;:2;:16;;;68352:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;68430:42;68451:4;68457:2;68461:7;68470:1;68430:20;:42::i;:::-;68602:4;68575:31;;:23;68590:7;68575:14;:23::i;:::-;:31;;;68567:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68720:15;:24;68736:7;68720:24;;;;;;;;;;;;68713:31;;;;;;;;;;;69215:1;69196:9;:15;69206:4;69196:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;69248:1;69231:9;:13;69241:2;69231:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;69290:2;69271:7;:16;69279:7;69271:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;69329:7;69325:2;69310:27;;69319:4;69310:27;;;;;;;;;;;;69350:41;69370:4;69376:2;69380:7;69389:1;69350:19;:41::i;:::-;68136:1263;;;:::o;65080:319::-;65209:18;65215:2;65219:7;65209:5;:18::i;:::-;65260:53;65291:1;65295:2;65299:7;65308:4;65260:22;:53::i;:::-;65238:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;65080:319;;;:::o;62985:313::-;63141:28;63151:4;63157:2;63161:7;63141:9;:28::i;:::-;63188:47;63211:4;63217:2;63221:7;63230:4;63188:22;:47::i;:::-;63180:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;62985:313;;;;:::o;72523:410::-;72713:1;72701:9;:13;72697:229;;;72751:1;72735:18;;:4;:18;;;72731:87;;72793:9;72774;:15;72784:4;72774:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;72731:87;72850:1;72836:16;;:2;:16;;;72832:83;;72890:9;72873;:13;72883:2;72873:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;72832:83;72697:229;72523:410;;;;:::o;73655:158::-;;;;;:::o;65735:942::-;65829:1;65815:16;;:2;:16;;;65807:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;65888:16;65896:7;65888;:16::i;:::-;65887:17;65879:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65950:48;65979:1;65983:2;65987:7;65996:1;65950:20;:48::i;:::-;66097:16;66105:7;66097;:16::i;:::-;66096:17;66088:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66512:1;66495:9;:13;66505:2;66495:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;66556:2;66537:7;:16;66545:7;66537:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;66601:7;66597:2;66576:33;;66593:1;66576:33;;;;;;;;;;;;66622:47;66650:1;66654:2;66658:7;66667:1;66622:19;:47::i;:::-;65735:942;;:::o;70938:853::-;71092:4;71113:15;:2;:13;;;:15::i;:::-;71109:675;;;71165:2;71149:36;;;71186:12;:10;:12::i;:::-;71200:4;71206:7;71215:4;71149:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;71145:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71407:1;71390:6;:13;:18;71386:328;;71433:60;;;;;;;;;;:::i;:::-;;;;;;;;71386:328;71664:6;71658:13;71649:6;71645:2;71641:15;71634:38;71145:584;71281:41;;;71271:51;;;:6;:51;;;;71264:58;;;;;71109:675;71768:4;71761:11;;70938:853;;;;;;;:::o;22861:326::-;22921:4;23178:1;23156:7;:19;;;:23;23149:30;;22861:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:246::-;2570:1;2580:113;2594:6;2591:1;2588:13;2580:113;;;2679:1;2674:3;2670:11;2664:18;2660:1;2655:3;2651:11;2644:39;2616:2;2613:1;2609:10;2604:15;;2580:113;;;2727:1;2718:6;2713:3;2709:16;2702:27;2551:184;2489:246;;;:::o;2741:102::-;2782:6;2833:2;2829:7;2824:2;2817:5;2813:14;2809:28;2799:38;;2741:102;;;:::o;2849:377::-;2937:3;2965:39;2998:5;2965:39;:::i;:::-;3020:71;3084:6;3079:3;3020:71;:::i;:::-;3013:78;;3100:65;3158:6;3153:3;3146:4;3139:5;3135:16;3100:65;:::i;:::-;3190:29;3212:6;3190:29;:::i;:::-;3185:3;3181:39;3174:46;;2941:285;2849:377;;;;:::o;3232:313::-;3345:4;3383:2;3372:9;3368:18;3360:26;;3432:9;3426:4;3422:20;3418:1;3407:9;3403:17;3396:47;3460:78;3533:4;3524:6;3460:78;:::i;:::-;3452:86;;3232:313;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:509::-;8047:6;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8250:1;8239:9;8235:17;8222:31;8280:18;8272:6;8269:30;8266:117;;;8302:79;;:::i;:::-;8266:117;8407:63;8462:7;8453:6;8442:9;8438:22;8407:63;:::i;:::-;8397:73;;8193:287;7978:509;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:474::-;8896:6;8904;8953:2;8941:9;8932:7;8928:23;8924:32;8921:119;;;8959:79;;:::i;:::-;8921:119;9079:1;9104:53;9149:7;9140:6;9129:9;9125:22;9104:53;:::i;:::-;9094:63;;9050:117;9206:2;9232:53;9277:7;9268:6;9257:9;9253:22;9232:53;:::i;:::-;9222:63;;9177:118;8828:474;;;;;:::o;9308:311::-;9385:4;9475:18;9467:6;9464:30;9461:56;;;9497:18;;:::i;:::-;9461:56;9547:4;9539:6;9535:17;9527:25;;9607:4;9601;9597:15;9589:23;;9308:311;;;:::o;9625:117::-;9734:1;9731;9724:12;9765:710;9861:5;9886:81;9902:64;9959:6;9902:64;:::i;:::-;9886:81;:::i;:::-;9877:90;;9987:5;10016:6;10009:5;10002:21;10050:4;10043:5;10039:16;10032:23;;10103:4;10095:6;10091:17;10083:6;10079:30;10132:3;10124:6;10121:15;10118:122;;;10151:79;;:::i;:::-;10118:122;10266:6;10249:220;10283:6;10278:3;10275:15;10249:220;;;10358:3;10387:37;10420:3;10408:10;10387:37;:::i;:::-;10382:3;10375:50;10454:4;10449:3;10445:14;10438:21;;10325:144;10309:4;10304:3;10300:14;10293:21;;10249:220;;;10253:21;9867:608;;9765:710;;;;;:::o;10498:370::-;10569:5;10618:3;10611:4;10603:6;10599:17;10595:27;10585:122;;10626:79;;:::i;:::-;10585:122;10743:6;10730:20;10768:94;10858:3;10850:6;10843:4;10835:6;10831:17;10768:94;:::i;:::-;10759:103;;10575:293;10498:370;;;;:::o;10874:539::-;10958:6;11007:2;10995:9;10986:7;10982:23;10978:32;10975:119;;;11013:79;;:::i;:::-;10975:119;11161:1;11150:9;11146:17;11133:31;11191:18;11183:6;11180:30;11177:117;;;11213:79;;:::i;:::-;11177:117;11318:78;11388:7;11379:6;11368:9;11364:22;11318:78;:::i;:::-;11308:88;;11104:302;10874:539;;;;:::o;11419:116::-;11489:21;11504:5;11489:21;:::i;:::-;11482:5;11479:32;11469:60;;11525:1;11522;11515:12;11469:60;11419:116;:::o;11541:133::-;11584:5;11622:6;11609:20;11600:29;;11638:30;11662:5;11638:30;:::i;:::-;11541:133;;;;:::o;11680:468::-;11745:6;11753;11802:2;11790:9;11781:7;11777:23;11773:32;11770:119;;;11808:79;;:::i;:::-;11770:119;11928:1;11953:53;11998:7;11989:6;11978:9;11974:22;11953:53;:::i;:::-;11943:63;;11899:117;12055:2;12081:50;12123:7;12114:6;12103:9;12099:22;12081:50;:::i;:::-;12071:60;;12026:115;11680:468;;;;;:::o;12154:307::-;12215:4;12305:18;12297:6;12294:30;12291:56;;;12327:18;;:::i;:::-;12291:56;12365:29;12387:6;12365:29;:::i;:::-;12357:37;;12449:4;12443;12439:15;12431:23;;12154:307;;;:::o;12467:423::-;12544:5;12569:65;12585:48;12626:6;12585:48;:::i;:::-;12569:65;:::i;:::-;12560:74;;12657:6;12650:5;12643:21;12695:4;12688:5;12684:16;12733:3;12724:6;12719:3;12715:16;12712:25;12709:112;;;12740:79;;:::i;:::-;12709:112;12830:54;12877:6;12872:3;12867;12830:54;:::i;:::-;12550:340;12467:423;;;;;:::o;12909:338::-;12964:5;13013:3;13006:4;12998:6;12994:17;12990:27;12980:122;;13021:79;;:::i;:::-;12980:122;13138:6;13125:20;13163:78;13237:3;13229:6;13222:4;13214:6;13210:17;13163:78;:::i;:::-;13154:87;;12970:277;12909:338;;;;:::o;13253:943::-;13348:6;13356;13364;13372;13421:3;13409:9;13400:7;13396:23;13392:33;13389:120;;;13428:79;;:::i;:::-;13389:120;13548:1;13573:53;13618:7;13609:6;13598:9;13594:22;13573:53;:::i;:::-;13563:63;;13519:117;13675:2;13701:53;13746:7;13737:6;13726:9;13722:22;13701:53;:::i;:::-;13691:63;;13646:118;13803:2;13829:53;13874:7;13865:6;13854:9;13850:22;13829:53;:::i;:::-;13819:63;;13774:118;13959:2;13948:9;13944:18;13931:32;13990:18;13982:6;13979:30;13976:117;;;14012:79;;:::i;:::-;13976:117;14117:62;14171:7;14162:6;14151:9;14147:22;14117:62;:::i;:::-;14107:72;;13902:287;13253:943;;;;;;;:::o;14202:111::-;14266:6;14300:5;14294:12;14284:22;;14202:111;;;:::o;14319:181::-;14415:11;14449:6;14444:3;14437:19;14489:4;14484:3;14480:14;14465:29;;14319:181;;;;:::o;14506:129::-;14570:4;14593:3;14585:11;;14623:4;14618:3;14614:14;14606:22;;14506:129;;;:::o;14641:99::-;14712:21;14727:5;14712:21;:::i;:::-;14707:3;14700:34;14641:99;;:::o;14746:167::-;14809:10;14830:40;14866:3;14858:6;14830:40;:::i;:::-;14902:4;14897:3;14893:14;14879:28;;14746:167;;;;:::o;14919:110::-;14986:4;15018;15013:3;15009:14;15001:22;;14919:110;;;:::o;15059:708::-;15172:3;15201:51;15246:5;15201:51;:::i;:::-;15268:83;15344:6;15339:3;15268:83;:::i;:::-;15261:90;;15375:53;15422:5;15375:53;:::i;:::-;15451:7;15482:1;15467:275;15492:6;15489:1;15486:13;15467:275;;;15568:6;15562:13;15595:57;15648:3;15633:13;15595:57;:::i;:::-;15588:64;;15675:57;15725:6;15675:57;:::i;:::-;15665:67;;15527:215;15514:1;15511;15507:9;15502:14;;15467:275;;;15471:14;15758:3;15751:10;;15177:590;;;15059:708;;;;:::o;15773:361::-;15910:4;15948:2;15937:9;15933:18;15925:26;;15997:9;15991:4;15987:20;15983:1;15972:9;15968:17;15961:47;16025:102;16122:4;16113:6;16025:102;:::i;:::-;16017:110;;15773:361;;;;:::o;16140:474::-;16208:6;16216;16265:2;16253:9;16244:7;16240:23;16236:32;16233:119;;;16271:79;;:::i;:::-;16233:119;16391:1;16416:53;16461:7;16452:6;16441:9;16437:22;16416:53;:::i;:::-;16406:63;;16362:117;16518:2;16544:53;16589:7;16580:6;16569:9;16565:22;16544:53;:::i;:::-;16534:63;;16489:118;16140:474;;;;;:::o;16620:180::-;16668:77;16665:1;16658:88;16765:4;16762:1;16755:15;16789:4;16786:1;16779:15;16806:320;16850:6;16887:1;16881:4;16877:12;16867:22;;16934:1;16928:4;16924:12;16955:18;16945:81;;17011:4;17003:6;16999:17;16989:27;;16945:81;17073:2;17065:6;17062:14;17042:18;17039:38;17036:84;;17092:18;;:::i;:::-;17036:84;16857:269;16806:320;;;:::o;17132:220::-;17272:34;17268:1;17260:6;17256:14;17249:58;17341:3;17336:2;17328:6;17324:15;17317:28;17132:220;:::o;17358:366::-;17500:3;17521:67;17585:2;17580:3;17521:67;:::i;:::-;17514:74;;17597:93;17686:3;17597:93;:::i;:::-;17715:2;17710:3;17706:12;17699:19;;17358:366;;;:::o;17730:419::-;17896:4;17934:2;17923:9;17919:18;17911:26;;17983:9;17977:4;17973:20;17969:1;17958:9;17954:17;17947:47;18011:131;18137:4;18011:131;:::i;:::-;18003:139;;17730:419;;;:::o;18155:248::-;18295:34;18291:1;18283:6;18279:14;18272:58;18364:31;18359:2;18351:6;18347:15;18340:56;18155:248;:::o;18409:366::-;18551:3;18572:67;18636:2;18631:3;18572:67;:::i;:::-;18565:74;;18648:93;18737:3;18648:93;:::i;:::-;18766:2;18761:3;18757:12;18750:19;;18409:366;;;:::o;18781:419::-;18947:4;18985:2;18974:9;18970:18;18962:26;;19034:9;19028:4;19024:20;19020:1;19009:9;19005:17;18998:47;19062:131;19188:4;19062:131;:::i;:::-;19054:139;;18781:419;;;:::o;19206:332::-;19327:4;19365:2;19354:9;19350:18;19342:26;;19378:71;19446:1;19435:9;19431:17;19422:6;19378:71;:::i;:::-;19459:72;19527:2;19516:9;19512:18;19503:6;19459:72;:::i;:::-;19206:332;;;;;:::o;19544:137::-;19598:5;19629:6;19623:13;19614:22;;19645:30;19669:5;19645:30;:::i;:::-;19544:137;;;;:::o;19687:345::-;19754:6;19803:2;19791:9;19782:7;19778:23;19774:32;19771:119;;;19809:79;;:::i;:::-;19771:119;19929:1;19954:61;20007:7;19998:6;19987:9;19983:22;19954:61;:::i;:::-;19944:71;;19900:125;19687:345;;;;:::o;20038:181::-;20178:33;20174:1;20166:6;20162:14;20155:57;20038:181;:::o;20225:366::-;20367:3;20388:67;20452:2;20447:3;20388:67;:::i;:::-;20381:74;;20464:93;20553:3;20464:93;:::i;:::-;20582:2;20577:3;20573:12;20566:19;;20225:366;;;:::o;20597:419::-;20763:4;20801:2;20790:9;20786:18;20778:26;;20850:9;20844:4;20840:20;20836:1;20825:9;20821:17;20814:47;20878:131;21004:4;20878:131;:::i;:::-;20870:139;;20597:419;;;:::o;21022:180::-;21070:77;21067:1;21060:88;21167:4;21164:1;21157:15;21191:4;21188:1;21181:15;21208:410;21248:7;21271:20;21289:1;21271:20;:::i;:::-;21266:25;;21305:20;21323:1;21305:20;:::i;:::-;21300:25;;21360:1;21357;21353:9;21382:30;21400:11;21382:30;:::i;:::-;21371:41;;21561:1;21552:7;21548:15;21545:1;21542:22;21522:1;21515:9;21495:83;21472:139;;21591:18;;:::i;:::-;21472:139;21256:362;21208:410;;;;:::o;21624:173::-;21764:25;21760:1;21752:6;21748:14;21741:49;21624:173;:::o;21803:366::-;21945:3;21966:67;22030:2;22025:3;21966:67;:::i;:::-;21959:74;;22042:93;22131:3;22042:93;:::i;:::-;22160:2;22155:3;22151:12;22144:19;;21803:366;;;:::o;22175:419::-;22341:4;22379:2;22368:9;22364:18;22356:26;;22428:9;22422:4;22418:20;22414:1;22403:9;22399:17;22392:47;22456:131;22582:4;22456:131;:::i;:::-;22448:139;;22175:419;;;:::o;22600:143::-;22657:5;22688:6;22682:13;22673:22;;22704:33;22731:5;22704:33;:::i;:::-;22600:143;;;;:::o;22749:351::-;22819:6;22868:2;22856:9;22847:7;22843:23;22839:32;22836:119;;;22874:79;;:::i;:::-;22836:119;22994:1;23019:64;23075:7;23066:6;23055:9;23051:22;23019:64;:::i;:::-;23009:74;;22965:128;22749:351;;;;:::o;23106:180::-;23154:77;23151:1;23144:88;23251:4;23248:1;23241:15;23275:4;23272:1;23265:15;23292:185;23332:1;23349:20;23367:1;23349:20;:::i;:::-;23344:25;;23383:20;23401:1;23383:20;:::i;:::-;23378:25;;23422:1;23412:35;;23427:18;;:::i;:::-;23412:35;23469:1;23466;23462:9;23457:14;;23292:185;;;;:::o;23483:147::-;23584:11;23621:3;23606:18;;23483:147;;;;:::o;23636:114::-;;:::o;23756:398::-;23915:3;23936:83;24017:1;24012:3;23936:83;:::i;:::-;23929:90;;24028:93;24117:3;24028:93;:::i;:::-;24146:1;24141:3;24137:11;24130:18;;23756:398;;;:::o;24160:379::-;24344:3;24366:147;24509:3;24366:147;:::i;:::-;24359:154;;24530:3;24523:10;;24160:379;;;:::o;24545:174::-;24685:26;24681:1;24673:6;24669:14;24662:50;24545:174;:::o;24725:366::-;24867:3;24888:67;24952:2;24947:3;24888:67;:::i;:::-;24881:74;;24964:93;25053:3;24964:93;:::i;:::-;25082:2;25077:3;25073:12;25066:19;;24725:366;;;:::o;25097:419::-;25263:4;25301:2;25290:9;25286:18;25278:26;;25350:9;25344:4;25340:20;25336:1;25325:9;25321:17;25314:47;25378:131;25504:4;25378:131;:::i;:::-;25370:139;;25097:419;;;:::o;25522:332::-;25643:4;25681:2;25670:9;25666:18;25658:26;;25694:71;25762:1;25751:9;25747:17;25738:6;25694:71;:::i;:::-;25775:72;25843:2;25832:9;25828:18;25819:6;25775:72;:::i;:::-;25522:332;;;;;:::o;25860:191::-;25900:3;25919:20;25937:1;25919:20;:::i;:::-;25914:25;;25953:20;25971:1;25953:20;:::i;:::-;25948:25;;25996:1;25993;25989:9;25982:16;;26017:3;26014:1;26011:10;26008:36;;;26024:18;;:::i;:::-;26008:36;25860:191;;;;:::o;26057:163::-;26197:15;26193:1;26185:6;26181:14;26174:39;26057:163;:::o;26226:366::-;26368:3;26389:67;26453:2;26448:3;26389:67;:::i;:::-;26382:74;;26465:93;26554:3;26465:93;:::i;:::-;26583:2;26578:3;26574:12;26567:19;;26226:366;;;:::o;26598:419::-;26764:4;26802:2;26791:9;26787:18;26779:26;;26851:9;26845:4;26841:20;26837:1;26826:9;26822:17;26815:47;26879:131;27005:4;26879:131;:::i;:::-;26871:139;;26598:419;;;:::o;27023:194::-;27063:4;27083:20;27101:1;27083:20;:::i;:::-;27078:25;;27117:20;27135:1;27117:20;:::i;:::-;27112:25;;27161:1;27158;27154:9;27146:17;;27185:1;27179:4;27176:11;27173:37;;;27190:18;;:::i;:::-;27173:37;27023:194;;;;:::o;27223:175::-;27363:27;27359:1;27351:6;27347:14;27340:51;27223:175;:::o;27404:366::-;27546:3;27567:67;27631:2;27626:3;27567:67;:::i;:::-;27560:74;;27643:93;27732:3;27643:93;:::i;:::-;27761:2;27756:3;27752:12;27745:19;;27404:366;;;:::o;27776:419::-;27942:4;27980:2;27969:9;27965:18;27957:26;;28029:9;28023:4;28019:20;28015:1;28004:9;28000:17;27993:47;28057:131;28183:4;28057:131;:::i;:::-;28049:139;;27776:419;;;:::o;28201:233::-;28240:3;28263:24;28281:5;28263:24;:::i;:::-;28254:33;;28309:66;28302:5;28299:77;28296:103;;28379:18;;:::i;:::-;28296:103;28426:1;28419:5;28415:13;28408:20;;28201:233;;;:::o;28440:141::-;28489:4;28512:3;28504:11;;28535:3;28532:1;28525:14;28569:4;28566:1;28556:18;28548:26;;28440:141;;;:::o;28587:93::-;28624:6;28671:2;28666;28659:5;28655:14;28651:23;28641:33;;28587:93;;;:::o;28686:107::-;28730:8;28780:5;28774:4;28770:16;28749:37;;28686:107;;;;:::o;28799:393::-;28868:6;28918:1;28906:10;28902:18;28941:97;28971:66;28960:9;28941:97;:::i;:::-;29059:39;29089:8;29078:9;29059:39;:::i;:::-;29047:51;;29131:4;29127:9;29120:5;29116:21;29107:30;;29180:4;29170:8;29166:19;29159:5;29156:30;29146:40;;28875:317;;28799:393;;;;;:::o;29198:60::-;29226:3;29247:5;29240:12;;29198:60;;;:::o;29264:142::-;29314:9;29347:53;29365:34;29374:24;29392:5;29374:24;:::i;:::-;29365:34;:::i;:::-;29347:53;:::i;:::-;29334:66;;29264:142;;;:::o;29412:75::-;29455:3;29476:5;29469:12;;29412:75;;;:::o;29493:269::-;29603:39;29634:7;29603:39;:::i;:::-;29664:91;29713:41;29737:16;29713:41;:::i;:::-;29705:6;29698:4;29692:11;29664:91;:::i;:::-;29658:4;29651:105;29569:193;29493:269;;;:::o;29768:73::-;29813:3;29768:73;:::o;29847:189::-;29924:32;;:::i;:::-;29965:65;30023:6;30015;30009:4;29965:65;:::i;:::-;29900:136;29847:189;;:::o;30042:186::-;30102:120;30119:3;30112:5;30109:14;30102:120;;;30173:39;30210:1;30203:5;30173:39;:::i;:::-;30146:1;30139:5;30135:13;30126:22;;30102:120;;;30042:186;;:::o;30234:543::-;30335:2;30330:3;30327:11;30324:446;;;30369:38;30401:5;30369:38;:::i;:::-;30453:29;30471:10;30453:29;:::i;:::-;30443:8;30439:44;30636:2;30624:10;30621:18;30618:49;;;30657:8;30642:23;;30618:49;30680:80;30736:22;30754:3;30736:22;:::i;:::-;30726:8;30722:37;30709:11;30680:80;:::i;:::-;30339:431;;30324:446;30234:543;;;:::o;30783:117::-;30837:8;30887:5;30881:4;30877:16;30856:37;;30783:117;;;;:::o;30906:169::-;30950:6;30983:51;31031:1;31027:6;31019:5;31016:1;31012:13;30983:51;:::i;:::-;30979:56;31064:4;31058;31054:15;31044:25;;30957:118;30906:169;;;;:::o;31080:295::-;31156:4;31302:29;31327:3;31321:4;31302:29;:::i;:::-;31294:37;;31364:3;31361:1;31357:11;31351:4;31348:21;31340:29;;31080:295;;;;:::o;31380:1395::-;31497:37;31530:3;31497:37;:::i;:::-;31599:18;31591:6;31588:30;31585:56;;;31621:18;;:::i;:::-;31585:56;31665:38;31697:4;31691:11;31665:38;:::i;:::-;31750:67;31810:6;31802;31796:4;31750:67;:::i;:::-;31844:1;31868:4;31855:17;;31900:2;31892:6;31889:14;31917:1;31912:618;;;;32574:1;32591:6;32588:77;;;32640:9;32635:3;32631:19;32625:26;32616:35;;32588:77;32691:67;32751:6;32744:5;32691:67;:::i;:::-;32685:4;32678:81;32547:222;31882:887;;31912:618;31964:4;31960:9;31952:6;31948:22;31998:37;32030:4;31998:37;:::i;:::-;32057:1;32071:208;32085:7;32082:1;32079:14;32071:208;;;32164:9;32159:3;32155:19;32149:26;32141:6;32134:42;32215:1;32207:6;32203:14;32193:24;;32262:2;32251:9;32247:18;32234:31;;32108:4;32105:1;32101:12;32096:17;;32071:208;;;32307:6;32298:7;32295:19;32292:179;;;32365:9;32360:3;32356:19;32350:26;32408:48;32450:4;32442:6;32438:17;32427:9;32408:48;:::i;:::-;32400:6;32393:64;32315:156;32292:179;32517:1;32513;32505:6;32501:14;32497:22;32491:4;32484:36;31919:611;;;31882:887;;31472:1303;;;31380:1395;;:::o;32781:174::-;32921:26;32917:1;32909:6;32905:14;32898:50;32781:174;:::o;32961:366::-;33103:3;33124:67;33188:2;33183:3;33124:67;:::i;:::-;33117:74;;33200:93;33289:3;33200:93;:::i;:::-;33318:2;33313:3;33309:12;33302:19;;32961:366;;;:::o;33333:419::-;33499:4;33537:2;33526:9;33522:18;33514:26;;33586:9;33580:4;33576:20;33572:1;33561:9;33557:17;33550:47;33614:131;33740:4;33614:131;:::i;:::-;33606:139;;33333:419;;;:::o;33758:228::-;33898:34;33894:1;33886:6;33882:14;33875:58;33967:11;33962:2;33954:6;33950:15;33943:36;33758:228;:::o;33992:366::-;34134:3;34155:67;34219:2;34214:3;34155:67;:::i;:::-;34148:74;;34231:93;34320:3;34231:93;:::i;:::-;34349:2;34344:3;34340:12;34333:19;;33992:366;;;:::o;34364:419::-;34530:4;34568:2;34557:9;34553:18;34545:26;;34617:9;34611:4;34607:20;34603:1;34592:9;34588:17;34581:47;34645:131;34771:4;34645:131;:::i;:::-;34637:139;;34364:419;;;:::o;34789:168::-;34929:20;34925:1;34917:6;34913:14;34906:44;34789:168;:::o;34963:366::-;35105:3;35126:67;35190:2;35185:3;35126:67;:::i;:::-;35119:74;;35202:93;35291:3;35202:93;:::i;:::-;35320:2;35315:3;35311:12;35304:19;;34963:366;;;:::o;35335:419::-;35501:4;35539:2;35528:9;35524:18;35516:26;;35588:9;35582:4;35578:20;35574:1;35563:9;35559:17;35552:47;35616:131;35742:4;35616:131;:::i;:::-;35608:139;;35335:419;;;:::o;35760:159::-;35900:11;35896:1;35888:6;35884:14;35877:35;35760:159;:::o;35925:365::-;36067:3;36088:66;36152:1;36147:3;36088:66;:::i;:::-;36081:73;;36163:93;36252:3;36163:93;:::i;:::-;36281:2;36276:3;36272:12;36265:19;;35925:365;;;:::o;36296:419::-;36462:4;36500:2;36489:9;36485:18;36477:26;;36549:9;36543:4;36539:20;36535:1;36524:9;36520:17;36513:47;36577:131;36703:4;36577:131;:::i;:::-;36569:139;;36296:419;;;:::o;36721:174::-;36861:26;36857:1;36849:6;36845:14;36838:50;36721:174;:::o;36901:366::-;37043:3;37064:67;37128:2;37123:3;37064:67;:::i;:::-;37057:74;;37140:93;37229:3;37140:93;:::i;:::-;37258:2;37253:3;37249:12;37242:19;;36901:366;;;:::o;37273:419::-;37439:4;37477:2;37466:9;37462:18;37454:26;;37526:9;37520:4;37516:20;37512:1;37501:9;37497:17;37490:47;37554:131;37680:4;37554:131;:::i;:::-;37546:139;;37273:419;;;:::o;37698:442::-;37847:4;37885:2;37874:9;37870:18;37862:26;;37898:71;37966:1;37955:9;37951:17;37942:6;37898:71;:::i;:::-;37979:72;38047:2;38036:9;38032:18;38023:6;37979:72;:::i;:::-;38061;38129:2;38118:9;38114:18;38105:6;38061:72;:::i;:::-;37698:442;;;;;;:::o;38146:180::-;38286:32;38282:1;38274:6;38270:14;38263:56;38146:180;:::o;38332:366::-;38474:3;38495:67;38559:2;38554:3;38495:67;:::i;:::-;38488:74;;38571:93;38660:3;38571:93;:::i;:::-;38689:2;38684:3;38680:12;38673:19;;38332:366;;;:::o;38704:419::-;38870:4;38908:2;38897:9;38893:18;38885:26;;38957:9;38951:4;38947:20;38943:1;38932:9;38928:17;38921:47;38985:131;39111:4;38985:131;:::i;:::-;38977:139;;38704:419;;;:::o;39129:170::-;39269:22;39265:1;39257:6;39253:14;39246:46;39129:170;:::o;39305:366::-;39447:3;39468:67;39532:2;39527:3;39468:67;:::i;:::-;39461:74;;39544:93;39633:3;39544:93;:::i;:::-;39662:2;39657:3;39653:12;39646:19;;39305:366;;;:::o;39677:419::-;39843:4;39881:2;39870:9;39866:18;39858:26;;39930:9;39924:4;39920:20;39916:1;39905:9;39901:17;39894:47;39958:131;40084:4;39958:131;:::i;:::-;39950:139;;39677:419;;;:::o;40102:171::-;40242:23;40238:1;40230:6;40226:14;40219:47;40102:171;:::o;40279:366::-;40421:3;40442:67;40506:2;40501:3;40442:67;:::i;:::-;40435:74;;40518:93;40607:3;40518:93;:::i;:::-;40636:2;40631:3;40627:12;40620:19;;40279:366;;;:::o;40651:419::-;40817:4;40855:2;40844:9;40840:18;40832:26;;40904:9;40898:4;40894:20;40890:1;40879:9;40875:17;40868:47;40932:131;41058:4;40932:131;:::i;:::-;40924:139;;40651:419;;;:::o;41076:180::-;41124:77;41121:1;41114:88;41221:4;41218:1;41211:15;41245:4;41242:1;41235:15;41262:174;41402:26;41398:1;41390:6;41386:14;41379:50;41262:174;:::o;41442:366::-;41584:3;41605:67;41669:2;41664:3;41605:67;:::i;:::-;41598:74;;41681:93;41770:3;41681:93;:::i;:::-;41799:2;41794:3;41790:12;41783:19;;41442:366;;;:::o;41814:419::-;41980:4;42018:2;42007:9;42003:18;41995:26;;42067:9;42061:4;42057:20;42053:1;42042:9;42038:17;42031:47;42095:131;42221:4;42095:131;:::i;:::-;42087:139;;41814:419;;;:::o;42239:143::-;42296:5;42327:6;42321:13;42312:22;;42343:33;42370:5;42343:33;:::i;:::-;42239:143;;;;:::o;42388:351::-;42458:6;42507:2;42495:9;42486:7;42482:23;42478:32;42475:119;;;42513:79;;:::i;:::-;42475:119;42633:1;42658:64;42714:7;42705:6;42694:9;42690:22;42658:64;:::i;:::-;42648:74;;42604:128;42388:351;;;;:::o;42745:163::-;42885:15;42881:1;42873:6;42869:14;42862:39;42745:163;:::o;42914:366::-;43056:3;43077:67;43141:2;43136:3;43077:67;:::i;:::-;43070:74;;43153:93;43242:3;43153:93;:::i;:::-;43271:2;43266:3;43262:12;43255:19;;42914:366;;;:::o;43286:419::-;43452:4;43490:2;43479:9;43475:18;43467:26;;43539:9;43533:4;43529:20;43525:1;43514:9;43510:17;43503:47;43567:131;43693:4;43567:131;:::i;:::-;43559:139;;43286:419;;;:::o;43711:179::-;43851:31;43847:1;43839:6;43835:14;43828:55;43711:179;:::o;43896:366::-;44038:3;44059:67;44123:2;44118:3;44059:67;:::i;:::-;44052:74;;44135:93;44224:3;44135:93;:::i;:::-;44253:2;44248:3;44244:12;44237:19;;43896:366;;;:::o;44268:419::-;44434:4;44472:2;44461:9;44457:18;44449:26;;44521:9;44515:4;44511:20;44507:1;44496:9;44492:17;44485:47;44549:131;44675:4;44549:131;:::i;:::-;44541:139;;44268:419;;;:::o;44693:148::-;44795:11;44832:3;44817:18;;44693:148;;;;:::o;44871:874::-;44974:3;45011:5;45005:12;45040:36;45066:9;45040:36;:::i;:::-;45092:89;45174:6;45169:3;45092:89;:::i;:::-;45085:96;;45212:1;45201:9;45197:17;45228:1;45223:166;;;;45403:1;45398:341;;;;45190:549;;45223:166;45307:4;45303:9;45292;45288:25;45283:3;45276:38;45369:6;45362:14;45355:22;45347:6;45343:35;45338:3;45334:45;45327:52;;45223:166;;45398:341;45465:38;45497:5;45465:38;:::i;:::-;45525:1;45539:154;45553:6;45550:1;45547:13;45539:154;;;45627:7;45621:14;45617:1;45612:3;45608:11;45601:35;45677:1;45668:7;45664:15;45653:26;;45575:4;45572:1;45568:12;45563:17;;45539:154;;;45722:6;45717:3;45713:16;45706:23;;45405:334;;45190:549;;44978:767;;44871:874;;;;:::o;45751:390::-;45857:3;45885:39;45918:5;45885:39;:::i;:::-;45940:89;46022:6;46017:3;45940:89;:::i;:::-;45933:96;;46038:65;46096:6;46091:3;46084:4;46077:5;46073:16;46038:65;:::i;:::-;46128:6;46123:3;46119:16;46112:23;;45861:280;45751:390;;;;:::o;46147:155::-;46287:7;46283:1;46275:6;46271:14;46264:31;46147:155;:::o;46308:400::-;46468:3;46489:84;46571:1;46566:3;46489:84;:::i;:::-;46482:91;;46582:93;46671:3;46582:93;:::i;:::-;46700:1;46695:3;46691:11;46684:18;;46308:400;;;:::o;46714:695::-;46992:3;47014:92;47102:3;47093:6;47014:92;:::i;:::-;47007:99;;47123:95;47214:3;47205:6;47123:95;:::i;:::-;47116:102;;47235:148;47379:3;47235:148;:::i;:::-;47228:155;;47400:3;47393:10;;46714:695;;;;;:::o;47415:162::-;47555:14;47551:1;47543:6;47539:14;47532:38;47415:162;:::o;47583:402::-;47743:3;47764:85;47846:2;47841:3;47764:85;:::i;:::-;47757:92;;47858:93;47947:3;47858:93;:::i;:::-;47976:2;47971:3;47967:12;47960:19;;47583:402;;;:::o;47991:535::-;48221:3;48243:92;48331:3;48322:6;48243:92;:::i;:::-;48236:99;;48352:148;48496:3;48352:148;:::i;:::-;48345:155;;48517:3;48510:10;;47991:535;;;;:::o;48532:163::-;48672:15;48668:1;48660:6;48656:14;48649:39;48532:163;:::o;48701:402::-;48861:3;48882:85;48964:2;48959:3;48882:85;:::i;:::-;48875:92;;48976:93;49065:3;48976:93;:::i;:::-;49094:2;49089:3;49085:12;49078:19;;48701:402;;;:::o;49109:535::-;49339:3;49361:92;49449:3;49440:6;49361:92;:::i;:::-;49354:99;;49470:148;49614:3;49470:148;:::i;:::-;49463:155;;49635:3;49628:10;;49109:535;;;;:::o;49650:225::-;49790:34;49786:1;49778:6;49774:14;49767:58;49859:8;49854:2;49846:6;49842:15;49835:33;49650:225;:::o;49881:366::-;50023:3;50044:67;50108:2;50103:3;50044:67;:::i;:::-;50037:74;;50120:93;50209:3;50120:93;:::i;:::-;50238:2;50233:3;50229:12;50222:19;;49881:366;;;:::o;50253:419::-;50419:4;50457:2;50446:9;50442:18;50434:26;;50506:9;50500:4;50496:20;50492:1;50481:9;50477:17;50470:47;50534:131;50660:4;50534:131;:::i;:::-;50526:139;;50253:419;;;:::o;50678:182::-;50818:34;50814:1;50806:6;50802:14;50795:58;50678:182;:::o;50866:366::-;51008:3;51029:67;51093:2;51088:3;51029:67;:::i;:::-;51022:74;;51105:93;51194:3;51105:93;:::i;:::-;51223:2;51218:3;51214:12;51207:19;;50866:366;;;:::o;51238:419::-;51404:4;51442:2;51431:9;51427:18;51419:26;;51491:9;51485:4;51481:20;51477:1;51466:9;51462:17;51455:47;51519:131;51645:4;51519:131;:::i;:::-;51511:139;;51238:419;;;:::o;51663:232::-;51803:34;51799:1;51791:6;51787:14;51780:58;51872:15;51867:2;51859:6;51855:15;51848:40;51663:232;:::o;51901:366::-;52043:3;52064:67;52128:2;52123:3;52064:67;:::i;:::-;52057:74;;52140:93;52229:3;52140:93;:::i;:::-;52258:2;52253:3;52249:12;52242:19;;51901:366;;;:::o;52273:419::-;52439:4;52477:2;52466:9;52462:18;52454:26;;52526:9;52520:4;52516:20;52512:1;52501:9;52497:17;52490:47;52554:131;52680:4;52554:131;:::i;:::-;52546:139;;52273:419;;;:::o;52698:168::-;52838:20;52834:1;52826:6;52822:14;52815:44;52698:168;:::o;52872:366::-;53014:3;53035:67;53099:2;53094:3;53035:67;:::i;:::-;53028:74;;53111:93;53200:3;53111:93;:::i;:::-;53229:2;53224:3;53220:12;53213:19;;52872:366;;;:::o;53244:419::-;53410:4;53448:2;53437:9;53433:18;53425:26;;53497:9;53491:4;53487:20;53483:1;53472:9;53468:17;53461:47;53525:131;53651:4;53525:131;:::i;:::-;53517:139;;53244:419;;;:::o;53669:173::-;53809:25;53805:1;53797:6;53793:14;53786:49;53669:173;:::o;53848:366::-;53990:3;54011:67;54075:2;54070:3;54011:67;:::i;:::-;54004:74;;54087:93;54176:3;54087:93;:::i;:::-;54205:2;54200:3;54196:12;54189:19;;53848:366;;;:::o;54220:419::-;54386:4;54424:2;54413:9;54409:18;54401:26;;54473:9;54467:4;54463:20;54459:1;54448:9;54444:17;54437:47;54501:131;54627:4;54501:131;:::i;:::-;54493:139;;54220:419;;;:::o;54645:223::-;54785:34;54781:1;54773:6;54769:14;54762:58;54854:6;54849:2;54841:6;54837:15;54830:31;54645:223;:::o;54874:366::-;55016:3;55037:67;55101:2;55096:3;55037:67;:::i;:::-;55030:74;;55113:93;55202:3;55113:93;:::i;:::-;55231:2;55226:3;55222:12;55215:19;;54874:366;;;:::o;55246:419::-;55412:4;55450:2;55439:9;55435:18;55427:26;;55499:9;55493:4;55489:20;55485:1;55474:9;55470:17;55463:47;55527:131;55653:4;55527:131;:::i;:::-;55519:139;;55246:419;;;:::o;55671:174::-;55811:26;55807:1;55799:6;55795:14;55788:50;55671:174;:::o;55851:366::-;55993:3;56014:67;56078:2;56073:3;56014:67;:::i;:::-;56007:74;;56090:93;56179:3;56090:93;:::i;:::-;56208:2;56203:3;56199:12;56192:19;;55851:366;;;:::o;56223:419::-;56389:4;56427:2;56416:9;56412:18;56404:26;;56476:9;56470:4;56466:20;56462:1;56451:9;56447:17;56440:47;56504:131;56630:4;56504:131;:::i;:::-;56496:139;;56223:419;;;:::o;56648:175::-;56788:27;56784:1;56776:6;56772:14;56765:51;56648:175;:::o;56829:366::-;56971:3;56992:67;57056:2;57051:3;56992:67;:::i;:::-;56985:74;;57068:93;57157:3;57068:93;:::i;:::-;57186:2;57181:3;57177:12;57170:19;;56829:366;;;:::o;57201:419::-;57367:4;57405:2;57394:9;57390:18;57382:26;;57454:9;57448:4;57444:20;57440:1;57429:9;57425:17;57418:47;57482:131;57608:4;57482:131;:::i;:::-;57474:139;;57201:419;;;:::o;57626:176::-;57658:1;57675:20;57693:1;57675:20;:::i;:::-;57670:25;;57709:20;57727:1;57709:20;:::i;:::-;57704:25;;57748:1;57738:35;;57753:18;;:::i;:::-;57738:35;57794:1;57791;57787:9;57782:14;;57626:176;;;;:::o;57808:224::-;57948:34;57944:1;57936:6;57932:14;57925:58;58017:7;58012:2;58004:6;58000:15;57993:32;57808:224;:::o;58038:366::-;58180:3;58201:67;58265:2;58260:3;58201:67;:::i;:::-;58194:74;;58277:93;58366:3;58277:93;:::i;:::-;58395:2;58390:3;58386:12;58379:19;;58038:366;;;:::o;58410:419::-;58576:4;58614:2;58603:9;58599:18;58591:26;;58663:9;58657:4;58653:20;58649:1;58638:9;58634:17;58627:47;58691:131;58817:4;58691:131;:::i;:::-;58683:139;;58410:419;;;:::o;58835:223::-;58975:34;58971:1;58963:6;58959:14;58952:58;59044:6;59039:2;59031:6;59027:15;59020:31;58835:223;:::o;59064:366::-;59206:3;59227:67;59291:2;59286:3;59227:67;:::i;:::-;59220:74;;59303:93;59392:3;59303:93;:::i;:::-;59421:2;59416:3;59412:12;59405:19;;59064:366;;;:::o;59436:419::-;59602:4;59640:2;59629:9;59625:18;59617:26;;59689:9;59683:4;59679:20;59675:1;59664:9;59660:17;59653:47;59717:131;59843:4;59717:131;:::i;:::-;59709:139;;59436:419;;;:::o;59861:237::-;60001:34;59997:1;59989:6;59985:14;59978:58;60070:20;60065:2;60057:6;60053:15;60046:45;59861:237;:::o;60104:366::-;60246:3;60267:67;60331:2;60326:3;60267:67;:::i;:::-;60260:74;;60343:93;60432:3;60343:93;:::i;:::-;60461:2;60456:3;60452:12;60445:19;;60104:366;;;:::o;60476:419::-;60642:4;60680:2;60669:9;60665:18;60657:26;;60729:9;60723:4;60719:20;60715:1;60704:9;60700:17;60693:47;60757:131;60883:4;60757:131;:::i;:::-;60749:139;;60476:419;;;:::o;60901:182::-;61041:34;61037:1;61029:6;61025:14;61018:58;60901:182;:::o;61089:366::-;61231:3;61252:67;61316:2;61311:3;61252:67;:::i;:::-;61245:74;;61328:93;61417:3;61328:93;:::i;:::-;61446:2;61441:3;61437:12;61430:19;;61089:366;;;:::o;61461:419::-;61627:4;61665:2;61654:9;61650:18;61642:26;;61714:9;61708:4;61704:20;61700:1;61689:9;61685:17;61678:47;61742:131;61868:4;61742:131;:::i;:::-;61734:139;;61461:419;;;:::o;61886:178::-;62026:30;62022:1;62014:6;62010:14;62003:54;61886:178;:::o;62070:366::-;62212:3;62233:67;62297:2;62292:3;62233:67;:::i;:::-;62226:74;;62309:93;62398:3;62309:93;:::i;:::-;62427:2;62422:3;62418:12;62411:19;;62070:366;;;:::o;62442:419::-;62608:4;62646:2;62635:9;62631:18;62623:26;;62695:9;62689:4;62685:20;62681:1;62670:9;62666:17;62659:47;62723:131;62849:4;62723:131;:::i;:::-;62715:139;;62442:419;;;:::o;62867:98::-;62918:6;62952:5;62946:12;62936:22;;62867:98;;;:::o;62971:168::-;63054:11;63088:6;63083:3;63076:19;63128:4;63123:3;63119:14;63104:29;;62971:168;;;;:::o;63145:373::-;63231:3;63259:38;63291:5;63259:38;:::i;:::-;63313:70;63376:6;63371:3;63313:70;:::i;:::-;63306:77;;63392:65;63450:6;63445:3;63438:4;63431:5;63427:16;63392:65;:::i;:::-;63482:29;63504:6;63482:29;:::i;:::-;63477:3;63473:39;63466:46;;63235:283;63145:373;;;;:::o;63524:640::-;63719:4;63757:3;63746:9;63742:19;63734:27;;63771:71;63839:1;63828:9;63824:17;63815:6;63771:71;:::i;:::-;63852:72;63920:2;63909:9;63905:18;63896:6;63852:72;:::i;:::-;63934;64002:2;63991:9;63987:18;63978:6;63934:72;:::i;:::-;64053:9;64047:4;64043:20;64038:2;64027:9;64023:18;64016:48;64081:76;64152:4;64143:6;64081:76;:::i;:::-;64073:84;;63524:640;;;;;;;:::o;64170:141::-;64226:5;64257:6;64251:13;64242:22;;64273:32;64299:5;64273:32;:::i;:::-;64170:141;;;;:::o;64317:349::-;64386:6;64435:2;64423:9;64414:7;64410:23;64406:32;64403:119;;;64441:79;;:::i;:::-;64403:119;64561:1;64586:63;64641:7;64632:6;64621:9;64617:22;64586:63;:::i;:::-;64576:73;;64532:127;64317:349;;;;:::o

Swarm Source

ipfs://4d38b9d771907ee4ec7052370b12a2a85856fa2b149e475acdba9ed35f38ac94
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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