ETH Price: $3,417.11 (+3.53%)

Token

DreamBeatz! Genesis (DRMBTZ)
 

Overview

Max Total Supply

2,501 DRMBTZ

Holders

374

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
respon.eth
Balance
8 DRMBTZ
0xe6eaf29c78590eec67b421d2136655458f5a8675
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:
DreamBeatzGenesis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
// ░░░░░░░░░░░░░▒▓██████████████████████████▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
// ░░░░░░░░░░░░▓█▓░░░░░░░░░░░░░░░░░░░░░░░░░░▓█▒░░░░░░▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
// ░░░░░░░░░░░▒██░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░▒██▓░░░░▒█████▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓███▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
// ░░░░░▒░░░░░▓█▒░░███████▓▒▒▒▒▒▒▒▓███████░░▒███▓░▒▓██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
// ░░░░░▒▒▒▒▒▓█▓░░▒███████░░░░░░░░▒███████░░▒████▓▓▓███████▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░
// ░░░░▒▒▒▒▒▒██░░░███████▒░░░░░░░░▒███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▓█▓░░░░░░░░
// ░░░░▒▒▒▒▒▓█▓░░▓███████░░░░░░░░░███████▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▒░▒▒░▒▒░▒▒▒▒▒▒▒▒▒▒▒▒▒░▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░▓█▓░░░░░░░
// ░░░░░▒▒▒░██░░░███████▒░░░░░░░░▒███████░█▓░█████▓▓▓▓▓▓▓▓▓▓▓▓░▒▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓▒░▒▓░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓████████░▒▒▒▓███▓▒▒███████▓▓▓███████░░░████░░░░░░
// ░░░░░░░░▒█▓░░▓███████░░░░░░░░░███████▒▒███████░░░░░░░░░░░░░░▓▓▓▓▓▓▓░░░░░░░░░▒▓▓▓▓▒▓▒░░░░░░░░░░░░░░░░░███████▒░▓▒▓███▓░░░██████▓░░▒██████▓░░▓████▒░░░░░
// ░░░░░░░░██░░░███████░░░░░░░░░▓██████▓░███████▒░░▓███████▒░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▓▓▓▓▒░████████████████████████░▒██████▒░░▓██████░░░███████░░░█████░░░░░░
// ░░░░█▒▒▓█▓░░▓███████░░░░░░░░▓█▓▓▒▓█▓░▒███████░░▒████████░░░▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░▒███████░░░░░░░░░███▓▓▓█▒░██████▓░░░██████▓░░▒██████▓░░▓████▒░░░░░░
// ░░▒▓██▓██░░░███████▓▓▓▓▓▓▓▓▓██▓░▒█▓░░███████▒░░▓████▓██▒░░▒▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░████████▓▓▓▓▓▓▓▓▓███▒░▓▓░▓██████▒░░▓██████░░░███▓░▒█░░▒█████░░░░░░░
// ░░░░▒░▒█▓░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░▒▒▒▒▒▒▒░░▒████▓░██░░░▒▒░▒▒▒▒▒▒▒▒▒▒░▒▒░▒▒░▒▒░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒░░░▒▒▒▒▒▒▒░░░▒▒▒▒▒▒░░░▓████▓▒▒▒▒░░░
// ░░░░░░██░░░▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░▒█████░░▒█▓▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒░░░░░▒▒░░░░░▓▓▓▓▓▓▒░░▒█████▒▒▒▒▒░░░
// ░░░░░▒█▓░░▒██████▓▒▒▒▒▒▒▓███████░░▒███████████████▒░░░░▓█████████████████████████████▓░░░░░░░░░░░░████████████░░░▓▓▒░░░░░░▒▓▒░▓▒▓████░░░▒▓███▓▒▒▒▒▒▒░░
// ░░░░░██░░░███████▒░░░░░░███████▒░░▓███████████████▓▓▓▓▓██████████████████████████████░░░▓▓▓▓▓▒▓░░░████████████▓░░░▓░░▓▓▒░░░▒░░█▓████▒░▒░░░░▓█▓▒▒░░░░░░
// ░░░░▒█▓░░▒██████▓░░░░░░▒███████░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░▓▓▓▓░▒▒░░░▒▒▒▒▒▒▒▒▒▒▒▒░░░▓█▒░░░░░▒▒░░▓█████▒▓▒███▒░░▓██░░░░░░░
// ░░░░██░░░███████▓▒▒▒▒▒▒███████▓▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░▓▓▓▓▓▓▒░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░███▓▓▓▒█▓▒██▓░░▓███░░░░░░
// ░░░▒█▓░░▓███████▓▓▓▓▓▓▓▓▓███████░░███████▓▓▓▓▓▓▓▓▓███████▓░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓████▒▓█░▓▓▓▓▓▓▓▓▒▓▓▓▓░░▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▒░░░░▓▓▓█▓▓▒▒▓▓░▒░░▒████▓░░░░░
// ░░░██░░░███████░░░░░░░░░▓██████▓░▓███████░░░░░░░░░███▒░▒█░░░░░░░░░░░░░░░░░░█████▓█▒░▓▓▓▓▓▓▓▒▓▓▓▓░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▒░░░░░░▓██▓▒▓░░░░░░░▒▓█████▒░░░░░
// ░░▓█▓░░▓██████▓░░░░░░░░▒███████░░████████████████████▓██▓░▓███████████████████████░░░░▓▓▓▓▓▓░░░░░░░░░░░░░▒▓▓▓▓▓▓▓▓▒░░░░░░▒▒▒▓▓▓▓▓▒░░░░░░░▓██████░░░░░░
// ░░██░░░▓░▒▓███░░░░░░░░░▓██████▓░▓███████░░░░░░░░░░░░░░░░░▒███████░░░░░░░░░███████▒░░░░█████▓░░░░░░░░░░▒▓▓▓▓▓▓▓▓▒░░░░░░░░░▒▒▒▒▒▒▒▒░░░░░▒▒░░████▓▒░░░░░░
// ░▓█▒░░▓█▒█████▒▒▒▒▒▒▒▒▓███████░░███████▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░███████▓▒▒▒▒▒▒▒▒▓███████░░░████████▓▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒░░▓█████▓░░░▒▒▒░░▒████▒██▓░░░░
// ░██░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▓▓▓▓▓▓▓▓▓▓▓░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓▓▓▓▓▓░░░░░░░▒▓█████▓█▓▓░░░░
// ░▒█▓▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▓▓█████████░░░░░░░░
// ░░▒█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▓░░░░░░░░░
// ░░░▒█████████████████████████████████████████████████████▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓█████████████████████████████████████████████████▓▒░░░░░░░░░░░
// ░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░░░░░░░░
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;  
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) 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);
}
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        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(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }
    
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
} 
library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
   function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    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);
    }
 
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
 
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
library Address { 
    function isContract(address account) internal view returns (bool) { 
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    } 
    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");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    } 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    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");
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    } 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else { 
            if (returndata.length > 0) { 

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
interface IERC721Receiver { 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 { 
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
abstract contract ERC165 is IERC165 { 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
} 
interface IERC721 is IERC165 { 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); 
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); 
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved); 
    function balanceOf(address owner) external view returns (uint256 balance); 
    function ownerOf(uint256 tokenId) external view returns (address owner); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function approve(address to, uint256 tokenId) external;
 
    function getApproved(uint256 tokenId) external view returns (address operator); 
    function setApprovalForAll(address operator, bool _approved) external; 
    function isApprovedForAll(address owner, address operator) external view returns (bool); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
interface IERC721Metadata is IERC721 { 
    function name() external view returns (string memory); 
    function symbol() external view returns (string memory); 
    function tokenURI(uint256 tokenId) external view returns (string memory);
} 
interface IERC721Enumerable is IERC721 { 
    function totalSupply() external view returns (uint256); 
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); 
    function tokenByIndex(uint256 index) external view returns (uint256);
} 
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        return _currentIndex;
    } 
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    } 
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
        TokenOwnership memory ownership = _ownerships[i];
        if (ownership.addr != address(0)) {
            currOwnershipAddr = ownership.addr;
        }
        if (currOwnershipAddr == owner) {
            if (tokenIdsIdx == index) {
            return i;
            }
            tokenIdsIdx++;
        }
        }
        revert("ERC721A: unable to get token of owner by index");
    } 

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

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

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

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

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

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

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

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

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

contract DreamBeatzGenesis is Ownable, ERC721A, ReentrancyGuard, DefaultOperatorFilterer  {
    using Strings for uint256;
    using SafeMath for uint256;
    uint256 public collectionSize = 5555;
    mapping(uint => uint) public level;

    string public uri = "https://bafkreic6isl34cafxhs64xy2owxujb5acnfmyt6uctdl7oaqwaj67qknqe.ipfs.nftstorage.link";
    function setURI(string memory u) public onlyOwner{
        uri = u;
    }
    
    address public beatzAddress;
    function setBeatzAddress(address a) public onlyOwner{
        beatzAddress = a;
    }
    
    address public beatz_vault;
    function setBeatzVault(address a) public onlyOwner{
        beatz_vault = a;
    }

    mapping(string => uint) public swapPrice;
    function set_swapPrice(string memory category, uint price_) public onlyOwner {
        swapPrice[category] = price_;
    }

    bool public reveal = false;
    function setReveal(bool set) public onlyOwner{
        reveal = set;
    }

    uint public status = 0; //0-stop 2-WL 3-PUBLIC
    function switch_status(uint Status) public onlyOwner {
        status = Status;
    }

    bool public status_trait_swap = false;
    function switch_status_trait_swap(bool Status) public onlyOwner {
        status_trait_swap = Status;
    }
    
    uint public mint_perAdd = 3;
    function set_mint_perAdd(uint new_) public onlyOwner {
        mint_perAdd = new_;
    }
    
    uint public price = 0.025 ether;
    function set_price(uint price_) public onlyOwner {
        price = price_;
    }

    bytes32 public merkleRoot_WL = 0x3e0e42f01476115c127a82967a00f112df4953c2cea3b4dc6b2421ac9251aa6a;
    function setMerkleRoot_WL(bytes32 m) public onlyOwner{
        merkleRoot_WL = m;
    }
    
    uint256 public reserve = 55;
    function setReserve(uint256 number) public onlyOwner {
        reserve = number;
    }

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

    constructor() ERC721A("DreamBeatz! Genesis", "DRMBTZ") {
        swapPrice["Background"] = 150 ether;
        swapPrice["Accessory 1"] = 200 ether;
        swapPrice["Accessory 2"] = 200 ether;
        swapPrice["Accessory 3"] = 200 ether;
        swapPrice["Accessory 4"] = 200 ether;
        swapPrice["Accessory 5"] = 200 ether;
        swapPrice["Body Trait"] = 200 ether;
        swapPrice["Clothes"] = 500 ether;
        swapPrice["Eyes"] = 300 ether;
        swapPrice["Hairstyle"] = 400 ether;
        swapPrice["Instrument Design"] = 500 ether;
        swapPrice["Mouth"] = 300 ether;
    }

    function giveaway(address recipient, uint256 quantity) public onlyOwner {
        require(totalSupply() + quantity <= collectionSize, "Giveaway exceeds current batch!!!");
        require(quantity <= reserve, "No more reserved remaining!!");

        _safeMint(recipient, quantity);
        reserve -= quantity;
    }

    function mint_list(uint256 quantity, bytes32[] calldata merkleproof) public payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        if(status == 2)
        require(MerkleProof.verify( merkleproof, merkleRoot_WL, leaf),"Not whitelisted");

        require(numberMinted(msg.sender).add(quantity) <= mint_perAdd && quantity > 0, "Invalid mint quantity!!");
        require(msg.value >= quantity.mul(price), "Insufficient eth sent for mint!!");
        require(totalSupply().add(quantity) + reserve <= collectionSize, "Mint exceeds Collection size!!");        

        _safeMint(msg.sender, quantity);
    }

    function mint(uint256 quantity) public payable {
        require(status == 3, "Minting not active!!");
        require(numberMinted(msg.sender).add(quantity) <= mint_perAdd && quantity > 0, "Invalid mint quantity!!");
        require(msg.value >= quantity.mul(price), "Insufficient eth sent for mint!!");
        require(totalSupply().add(quantity) + reserve <= collectionSize, "Mint exceeds Collection size!!");        

        _safeMint(msg.sender, quantity);
    }

    function swapTrait(uint id, string memory category) public {
      require(status_trait_swap ,"Trait Swap not Active!");
      require(_exists(id),"Invalid Token id!");
      require(ownerOf(id) == msg.sender, "Caller is not id owner!");
      require(IERC20(beatzAddress).balanceOf(msg.sender) >= swapPrice[category], "Insufficient balance to update trait!!");
      
      IERC20(beatzAddress).transferFrom(msg.sender, beatz_vault, swapPrice[category]);
      level[id] = level[id] + 1;
    }

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

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token!");

        if(reveal)
            return bytes(baseURI()).length > 0 ? string(abi.encodePacked(baseURI(), tokenId.toString())) : "";
        else 
            return bytes(baseURI()).length > 0 ? baseURI() : "";
    }

    function baseURI() public view returns (string memory) {
        return uri;
    }

    function _startTokenId() pure internal override returns (uint256) {
        return 1;
    }

    function ownerTokens(address a) public view returns (uint[] memory){
        uint b = balanceOf(a);
        uint[] memory t= new uint[](b);
        for(uint i=0; i<b; i++) t[i] = tokenOfOwnerByIndex(a,i);
        return t;
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

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

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

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

    function withdrawMoney() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","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"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beatzAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beatz_vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","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":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"level","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot_WL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleproof","type":"bytes32[]"}],"name":"mint_list","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint_perAdd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"ownerTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"a","type":"address"}],"name":"setBeatzAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setBeatzVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"set","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"u","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_","type":"uint256"}],"name":"set_mint_perAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"set_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"category","type":"string"},{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"set_swapPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status_trait_swap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"swapPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"category","type":"string"}],"name":"swapTrait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Status","type":"uint256"}],"name":"switch_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"Status","type":"bool"}],"name":"switch_status_trait_swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b3600a556040518060800160405280605881526020016200652460589139600c90805190602001906200003b92919062000698565b506000601060006101000a81548160ff02191690831515021790555060006011556000601260006101000a81548160ff02191690831515021790555060036013556658d15e176280006014557f3e0e42f01476115c127a82967a00f112df4953c2cea3b4dc6b2421ac9251aa6a60001b6015556037601655348015620000c057600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601381526020017f447265616d426561747a212047656e65736973000000000000000000000000008152506040518060400160405280600681526020017f44524d42545a00000000000000000000000000000000000000000000000000008152506200016462000158620005c360201b60201c565b620005cb60201b60201c565b81600390805190602001906200017c92919062000698565b5080600490805190602001906200019592919062000698565b50620001a66200068f60201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003ab57801562000271576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200023792919062000a5e565b600060405180830381600087803b1580156200025257600080fd5b505af115801562000267573d6000803e3d6000fd5b50505050620003aa565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200032b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002f192919062000a5e565b600060405180830381600087803b1580156200030c57600080fd5b505af115801562000321573d6000803e3d6000fd5b50505050620003a9565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000374919062000a41565b600060405180830381600087803b1580156200038f57600080fd5b505af1158015620003a4573d6000803e3d6000fd5b505050505b5b5b5050680821ab0d4414980000600f604051620003c790620009e5565b908152602001604051809103902081905550680ad78ebc5ac6200000600f604051620003f39062000a13565b908152602001604051809103902081905550680ad78ebc5ac6200000600f6040516200041f906200095b565b908152602001604051809103902081905550680ad78ebc5ac6200000600f6040516200044b9062000989565b908152602001604051809103902081905550680ad78ebc5ac6200000600f6040516200047790620009fc565b908152602001604051809103902081905550680ad78ebc5ac6200000600f604051620004a3906200092d565b908152602001604051809103902081905550680ad78ebc5ac6200000600f604051620004cf9062000944565b908152602001604051809103902081905550681b1ae4d6e2ef500000600f604051620004fb90620009b7565b908152602001604051809103902081905550681043561a8829300000600f6040516200052790620009a0565b9081526020016040518091039020819055506815af1d78b58c400000600f604051620005539062000972565b908152602001604051809103902081905550681b1ae4d6e2ef500000600f6040516200057f90620009ce565b908152602001604051809103902081905550681043561a8829300000600f604051620005ab9062000a2a565b90815260200160405180910390208190555062000d1b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620006a69062000aca565b90600052602060002090601f016020900481019282620006ca576000855562000716565b82601f10620006e557805160ff191683800117855562000716565b8280016001018555821562000716579182015b8281111562000715578251825591602001919060010190620006f8565b5b50905062000725919062000729565b5090565b5b80821115620007445760008160009055506001016200072a565b5090565b620007538162000a96565b82525050565b600062000768600b8362000a8b565b9150620007758262000b2f565b600b82019050919050565b60006200078f600a8362000a8b565b91506200079c8262000b58565b600a82019050919050565b6000620007b6600b8362000a8b565b9150620007c38262000b81565b600b82019050919050565b6000620007dd60098362000a8b565b9150620007ea8262000baa565b600982019050919050565b600062000804600b8362000a8b565b9150620008118262000bd3565b600b82019050919050565b60006200082b60048362000a8b565b9150620008388262000bfc565b600482019050919050565b60006200085260078362000a8b565b91506200085f8262000c25565b600782019050919050565b60006200087960118362000a8b565b9150620008868262000c4e565b601182019050919050565b6000620008a0600a8362000a8b565b9150620008ad8262000c77565b600a82019050919050565b6000620008c7600b8362000a8b565b9150620008d48262000ca0565b600b82019050919050565b6000620008ee600b8362000a8b565b9150620008fb8262000cc9565b600b82019050919050565b60006200091560058362000a8b565b9150620009228262000cf2565b600582019050919050565b60006200093a8262000759565b9150819050919050565b6000620009518262000780565b9150819050919050565b60006200096882620007a7565b9150819050919050565b60006200097f82620007ce565b9150819050919050565b60006200099682620007f5565b9150819050919050565b6000620009ad826200081c565b9150819050919050565b6000620009c48262000843565b9150819050919050565b6000620009db826200086a565b9150819050919050565b6000620009f28262000891565b9150819050919050565b600062000a0982620008b8565b9150819050919050565b600062000a2082620008df565b9150819050919050565b600062000a378262000906565b9150819050919050565b600060208201905062000a58600083018462000748565b92915050565b600060408201905062000a75600083018562000748565b62000a84602083018462000748565b9392505050565b600081905092915050565b600062000aa38262000aaa565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000600282049050600182168062000ae357607f821691505b6020821081141562000afa5762000af962000b00565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4163636573736f72792035000000000000000000000000000000000000000000600082015250565b7f426f647920547261697400000000000000000000000000000000000000000000600082015250565b7f4163636573736f72792032000000000000000000000000000000000000000000600082015250565b7f486169727374796c650000000000000000000000000000000000000000000000600082015250565b7f4163636573736f72792033000000000000000000000000000000000000000000600082015250565b7f4579657300000000000000000000000000000000000000000000000000000000600082015250565b7f436c6f7468657300000000000000000000000000000000000000000000000000600082015250565b7f496e737472756d656e742044657369676e000000000000000000000000000000600082015250565b7f4261636b67726f756e6400000000000000000000000000000000000000000000600082015250565b7f4163636573736f72792034000000000000000000000000000000000000000000600082015250565b7f4163636573736f72792031000000000000000000000000000000000000000000600082015250565b7f4d6f757468000000000000000000000000000000000000000000000000000000600082015250565b6157f98062000d2b6000396000f3fe6080604052600436106102ff5760003560e01c80636fed249311610190578063b88d4fde116100dc578063cd30d63c11610095578063e985e9c51161006f578063e985e9c514610b72578063eac989f814610baf578063ec42b66814610bda578063f2fde38b14610c03576102ff565b8063cd30d63c14610acd578063cd3293de14610b0a578063dc33e68114610b35576102ff565b8063b88d4fde146109bc578063bba7723e146109e5578063bc53a8d014610a22578063bf625cce14610a4b578063c7c9cda714610a74578063c87b56dd14610a90576102ff565b80639da295dc11610149578063a22cb46511610123578063a22cb46514610928578063a475b5dd14610951578063ac4460021461097c578063b012781414610993576102ff565b80639da295dc146108b8578063a035b1fe146108e1578063a0712d681461090c576102ff565b80636fed2493146107b857806370a08231146107e3578063715018a61461082057806371b3056c146108375780638da5cb5b1461086257806395d89b411461088d576102ff565b806329818d401161024f57806341f434341161020857806345c0f533116101e257806345c0f533146106e85780634f6ccce7146107135780636352211e146107505780636c0360eb1461078d576102ff565b806341f434341461066b5780634256dbe31461069657806342842e0e146106bf576102ff565b806329818d401461055d5780632a3f300c146105865780632f745c59146105af5780633311d207146105ec578063370e86d0146106175780633d2a6bd414610642576102ff565b8063081812fc116102bc57806318779fc91161029657806318779fc9146104b5578063200d2ed2146104e057806323b872dd1461050b57806328bf794d14610534576102ff565b8063081812fc14610424578063095ea7b31461046157806318160ddd1461048a576102ff565b806301ffc9a71461030457806302377e1f1461034157806302fe53051461036a578063050225ea1461039357806305c58df2146103bc57806306fdde03146103f9575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906143c6565b610c2c565b6040516103389190614b52565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906144c5565b610d0e565b005b34801561037657600080fd5b50610391600480360381019061038c9190614420565b610d94565b005b34801561039f57600080fd5b506103ba60048036038101906103b591906142ff565b610e2a565b005b3480156103c857600080fd5b506103e360048036038101906103de91906144c5565b610f69565b6040516103f09190614e05565b60405180910390f35b34801561040557600080fd5b5061040e610f81565b60405161041b9190614ba3565b60405180910390f35b34801561043057600080fd5b5061044b600480360381019061044691906144c5565b611013565b6040516104589190614a69565b60405180910390f35b34801561046d57600080fd5b50610488600480360381019061048391906142ff565b61108f565b005b34801561049657600080fd5b5061049f6110a8565b6040516104ac9190614e05565b60405180910390f35b3480156104c157600080fd5b506104ca6110b2565b6040516104d79190614b52565b60405180910390f35b3480156104ec57600080fd5b506104f56110c5565b6040516105029190614e05565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d91906141e9565b6110cb565b005b34801561054057600080fd5b5061055b600480360381019061055691906144c5565b61111a565b005b34801561056957600080fd5b50610584600480360381019061057f919061417c565b6111a0565b005b34801561059257600080fd5b506105ad60048036038101906105a8919061433f565b611260565b005b3480156105bb57600080fd5b506105d660048036038101906105d191906142ff565b6112f9565b6040516105e39190614e05565b60405180910390f35b3480156105f857600080fd5b50610601611512565b60405161060e9190614a69565b60405180910390f35b34801561062357600080fd5b5061062c611538565b6040516106399190614b6d565b60405180910390f35b34801561064e57600080fd5b506106696004803603810190610664919061417c565b61153e565b005b34801561067757600080fd5b506106806115fe565b60405161068d9190614b88565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b891906144c5565b611610565b005b3480156106cb57600080fd5b506106e660048036038101906106e191906141e9565b611696565b005b3480156106f457600080fd5b506106fd6116e5565b60405161070a9190614e05565b60405180910390f35b34801561071f57600080fd5b5061073a600480360381019061073591906144c5565b6116eb565b6040516107479190614e05565b60405180910390f35b34801561075c57600080fd5b50610777600480360381019061077291906144c5565b61173e565b6040516107849190614a69565b60405180910390f35b34801561079957600080fd5b506107a2611754565b6040516107af9190614ba3565b60405180910390f35b3480156107c457600080fd5b506107cd6117e6565b6040516107da9190614a69565b60405180910390f35b3480156107ef57600080fd5b5061080a6004803603810190610805919061417c565b61180c565b6040516108179190614e05565b60405180910390f35b34801561082c57600080fd5b506108356118dc565b005b34801561084357600080fd5b5061084c611964565b6040516108599190614e05565b60405180910390f35b34801561086e57600080fd5b5061087761196a565b6040516108849190614a69565b60405180910390f35b34801561089957600080fd5b506108a2611993565b6040516108af9190614ba3565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da9190614469565b611a25565b005b3480156108ed57600080fd5b506108f6611ac8565b6040516109039190614e05565b60405180910390f35b610926600480360381019061092191906144c5565b611ace565b005b34801561093457600080fd5b5061094f600480360381019061094a91906142bf565b611c4d565b005b34801561095d57600080fd5b50610966611c66565b6040516109739190614b52565b60405180910390f35b34801561098857600080fd5b50610991611c79565b005b34801561099f57600080fd5b506109ba60048036038101906109b591906144c5565b611da4565b005b3480156109c857600080fd5b506109e360048036038101906109de919061423c565b611e2a565b005b3480156109f157600080fd5b50610a0c6004803603810190610a07919061417c565b611e7b565b604051610a199190614b30565b60405180910390f35b348015610a2e57600080fd5b50610a496004803603810190610a44919061457f565b611f29565b005b348015610a5757600080fd5b50610a726004803603810190610a6d919061433f565b61226e565b005b610a8e6004803603810190610a89919061451f565b612307565b005b348015610a9c57600080fd5b50610ab76004803603810190610ab291906144c5565b612508565b604051610ac49190614ba3565b60405180910390f35b348015610ad957600080fd5b50610af46004803603810190610aef9190614420565b6125fb565b604051610b019190614e05565b60405180910390f35b348015610b1657600080fd5b50610b1f612629565b604051610b2c9190614e05565b60405180910390f35b348015610b4157600080fd5b50610b5c6004803603810190610b57919061417c565b61262f565b604051610b699190614e05565b60405180910390f35b348015610b7e57600080fd5b50610b996004803603810190610b9491906141a9565b612641565b604051610ba69190614b52565b60405180910390f35b348015610bbb57600080fd5b50610bc46126d5565b604051610bd19190614ba3565b60405180910390f35b348015610be657600080fd5b50610c016004803603810190610bfc9190614399565b612763565b005b348015610c0f57600080fd5b50610c2a6004803603810190610c25919061417c565b6127e9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cf757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d075750610d06826128e1565b5b9050919050565b610d1661294b565b73ffffffffffffffffffffffffffffffffffffffff16610d3461196a565b73ffffffffffffffffffffffffffffffffffffffff1614610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8190614d25565b60405180910390fd5b8060138190555050565b610d9c61294b565b73ffffffffffffffffffffffffffffffffffffffff16610dba61196a565b73ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790614d25565b60405180910390fd5b80600c9080519060200190610e26929190613eb8565b5050565b610e3261294b565b73ffffffffffffffffffffffffffffffffffffffff16610e5061196a565b73ffffffffffffffffffffffffffffffffffffffff1614610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90614d25565b60405180910390fd5b600a5481610eb26110a8565b610ebc9190614f2e565b1115610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490614c05565b60405180910390fd5b601654811115610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990614ce5565b60405180910390fd5b610f4c8282612953565b8060166000828254610f5e919061500f565b925050819055505050565b600b6020528060005260406000206000915090505481565b606060038054610f9090615139565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbc90615139565b80156110095780601f10610fde57610100808354040283529160200191611009565b820191906000526020600020905b815481529060010190602001808311610fec57829003601f168201915b5050505050905090565b600061101e82612971565b611054576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81611099816129bf565b6110a38383612acb565b505050565b6000600154905090565b601260009054906101000a900460ff1681565b60115481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461110957611108336129bf565b5b611114848484612bd6565b50505050565b61112261294b565b73ffffffffffffffffffffffffffffffffffffffff1661114061196a565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614d25565b60405180910390fd5b8060148190555050565b6111a861294b565b73ffffffffffffffffffffffffffffffffffffffff166111c661196a565b73ffffffffffffffffffffffffffffffffffffffff161461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614d25565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61126861294b565b73ffffffffffffffffffffffffffffffffffffffff1661128661196a565b73ffffffffffffffffffffffffffffffffffffffff16146112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614d25565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b60006113048361180c565b8210611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90614bc5565b60405180910390fd5b600061134f6110a8565b905060008060005b838110156114d0576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461146457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114bc57868414156114ad57819550505050505061150c565b83806114b89061519c565b9450505b5080806114c89061519c565b915050611357565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390614dc5565b60405180910390fd5b92915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b61154661294b565b73ffffffffffffffffffffffffffffffffffffffff1661156461196a565b73ffffffffffffffffffffffffffffffffffffffff16146115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b190614d25565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6daaeb6d7670e522a718067333cd4e81565b61161861294b565b73ffffffffffffffffffffffffffffffffffffffff1661163661196a565b73ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390614d25565b60405180910390fd5b8060168190555050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116d4576116d3336129bf565b5b6116df848484612be6565b50505050565b600a5481565b60006116f56110a8565b8210611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90614ca5565b60405180910390fd5b819050919050565b600061174982612c06565b600001519050919050565b6060600c805461176390615139565b80601f016020809104026020016040519081016040528092919081815260200182805461178f90615139565b80156117dc5780601f106117b1576101008083540402835291602001916117dc565b820191906000526020600020905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611874576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6118e461294b565b73ffffffffffffffffffffffffffffffffffffffff1661190261196a565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614d25565b60405180910390fd5b6119626000612e95565b565b60135481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546119a290615139565b80601f01602080910402602001604051908101604052809291908181526020018280546119ce90615139565b8015611a1b5780601f106119f057610100808354040283529160200191611a1b565b820191906000526020600020905b8154815290600101906020018083116119fe57829003601f168201915b5050505050905090565b611a2d61294b565b73ffffffffffffffffffffffffffffffffffffffff16611a4b61196a565b73ffffffffffffffffffffffffffffffffffffffff1614611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614d25565b60405180910390fd5b80600f83604051611ab29190614a19565b9081526020016040518091039020819055505050565b60145481565b600360115414611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a90614de5565b60405180910390fd5b601354611b3182611b233361262f565b612f5990919063ffffffff16565b11158015611b3f5750600081115b611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614c25565b60405180910390fd5b611b9360145482612f6f90919063ffffffff16565b341015611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc90614c85565b60405180910390fd5b600a54601654611bf583611be76110a8565b612f5990919063ffffffff16565b611bff9190614f2e565b1115611c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3790614cc5565b60405180910390fd5b611c4a3382612953565b50565b81611c57816129bf565b611c618383612f85565b505050565b601060009054906101000a900460ff1681565b611c8161294b565b73ffffffffffffffffffffffffffffffffffffffff16611c9f61196a565b73ffffffffffffffffffffffffffffffffffffffff1614611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec90614d25565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611d1b90614a54565b60006040518083038185875af1925050503d8060008114611d58576040519150601f19603f3d011682016040523d82523d6000602084013e611d5d565b606091505b5050905080611da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9890614d65565b60405180910390fd5b50565b611dac61294b565b73ffffffffffffffffffffffffffffffffffffffff16611dca61196a565b73ffffffffffffffffffffffffffffffffffffffff1614611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1790614d25565b60405180910390fd5b8060118190555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e6857611e67336129bf565b5b611e74858585856130fd565b5050505050565b60606000611e888361180c565b905060008167ffffffffffffffff811115611ea657611ea56152f6565b5b604051908082528060200260200182016040528015611ed45781602001602082028036833780820191505090505b50905060005b82811015611f1e57611eec85826112f9565b828281518110611eff57611efe6152c7565b5b6020026020010181815250508080611f169061519c565b915050611eda565b508092505050919050565b601260009054906101000a900460ff16611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90614d85565b60405180910390fd5b611f8182612971565b611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614d45565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611fe08361173e565b73ffffffffffffffffffffffffffffffffffffffff1614612036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202d90614c65565b60405180910390fd5b600f816040516120469190614a19565b908152602001604051809103902054600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016120b09190614a69565b60206040518083038186803b1580156120c857600080fd5b505afa1580156120dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210091906144f2565b1015612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213890614da5565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f856040516121b39190614a19565b9081526020016040518091039020546040518463ffffffff1660e01b81526004016121e093929190614aad565b602060405180830381600087803b1580156121fa57600080fd5b505af115801561220e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612232919061436c565b506001600b6000848152602001908152602001600020546122539190614f2e565b600b6000848152602001908152602001600020819055505050565b61227661294b565b73ffffffffffffffffffffffffffffffffffffffff1661229461196a565b73ffffffffffffffffffffffffffffffffffffffff16146122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190614d25565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60003360405160200161231a91906149fe565b604051602081830303815290604052805190602001209050600260115414156123cb5761238b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155483613179565b6123ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c190614d05565b60405180910390fd5b5b6013546123e9856123db3361262f565b612f5990919063ffffffff16565b111580156123f75750600084115b612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90614c25565b60405180910390fd5b61244b60145485612f6f90919063ffffffff16565b34101561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614c85565b60405180910390fd5b600a546016546124ad8661249f6110a8565b612f5990919063ffffffff16565b6124b79190614f2e565b11156124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef90614cc5565b60405180910390fd5b6125023385612953565b50505050565b606061251382612971565b612552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254990614c45565b60405180910390fd5b601060009054906101000a900460ff16156125c5576000612571611754565b511161258c57604051806020016040528060008152506125be565b612594611754565b61259d83613190565b6040516020016125ae929190614a30565b6040516020818303038152906040525b90506125f6565b60006125cf611754565b51116125ea57604051806020016040528060008152506125f3565b6125f2611754565b5b90505b919050565b600f818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60165481565b600061263a826132f1565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c80546126e290615139565b80601f016020809104026020016040519081016040528092919081815260200182805461270e90615139565b801561275b5780601f106127305761010080835404028352916020019161275b565b820191906000526020600020905b81548152906001019060200180831161273e57829003601f168201915b505050505081565b61276b61294b565b73ffffffffffffffffffffffffffffffffffffffff1661278961196a565b73ffffffffffffffffffffffffffffffffffffffff16146127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d690614d25565b60405180910390fd5b8060158190555050565b6127f161294b565b73ffffffffffffffffffffffffffffffffffffffff1661280f61196a565b73ffffffffffffffffffffffffffffffffffffffff1614612865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285c90614d25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cc90614be5565b60405180910390fd5b6128de81612e95565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b61296d82826040518060200160405280600081525061335b565b5050565b60008161297c61336d565b1115801561298b575060015482105b80156129b8575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612ac8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612a36929190614a84565b60206040518083038186803b158015612a4e57600080fd5b505afa158015612a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a86919061436c565b612ac757806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612abe9190614a69565b60405180910390fd5b5b50565b6000612ad68261173e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b3e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612b5d61294b565b73ffffffffffffffffffffffffffffffffffffffff1614158015612b8f5750612b8d81612b8861294b565b612641565b155b15612bc6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd1838383613376565b505050565b612be1838383613428565b505050565b612c0183838360405180602001604052806000815250611e2a565b505050565b612c0e613f3e565b600082905080612c1c61336d565b11158015612c2b575060015481105b15612e5e576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e5c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d40578092505050612e90565b5b600115612e5b57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e56578092505050612e90565b612d41565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612f679190614f2e565b905092915050565b60008183612f7d9190614fb5565b905092915050565b612f8d61294b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000612fff61294b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166130ac61294b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516130f19190614b52565b60405180910390a35050565b613108848484613428565b6131278373ffffffffffffffffffffffffffffffffffffffff166138de565b801561313c575061313a848484846138f1565b155b15613173576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000826131868584613a51565b1490509392505050565b606060008214156131d8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132ec565b600082905060005b6000821461320a5780806131f39061519c565b915050600a826132039190614f84565b91506131e0565b60008167ffffffffffffffff811115613226576132256152f6565b5b6040519080825280601f01601f1916602001820160405280156132585781602001600182028036833780820191505090505b5090505b600085146132e557600182613271919061500f565b9150600a856132809190615209565b603061328c9190614f2e565b60f81b8183815181106132a2576132a16152c7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132de9190614f84565b945061325c565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6133688383836001613ac6565b505050565b60006001905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061343382612c06565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461349e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166134bf61294b565b73ffffffffffffffffffffffffffffffffffffffff1614806134ee57506134ed856134e861294b565b612641565b5b8061353357506134fc61294b565b73ffffffffffffffffffffffffffffffffffffffff1661351b84611013565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061356c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156135d3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135e08585856001613e95565b6135ec60008487613376565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561386c57600154821461386b57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138d78585856001613e9b565b5050505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261391761294b565b8786866040518563ffffffff1660e01b81526004016139399493929190614ae4565b602060405180830381600087803b15801561395357600080fd5b505af192505050801561398457506040513d601f19601f8201168201806040525081019061398191906143f3565b60015b6139fe573d80600081146139b4576040519150601f19603f3d011682016040523d82523d6000602084013e6139b9565b606091505b506000815114156139f6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008082905060005b8451811015613abb576000858281518110613a7857613a776152c7565b5b60200260200101519050808311613a9a57613a938382613ea1565b9250613aa7565b613aa48184613ea1565b92505b508080613ab39061519c565b915050613a5a565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613b34576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613b6f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b7c6000868387613e95565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613d465750613d458773ffffffffffffffffffffffffffffffffffffffff166138de565b5b15613e0c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613dbb60008884806001019550886138f1565b613df1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613d4c578260015414613e0757600080fd5b613e78565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613e0d575b816001819055505050613e8e6000868387613e9b565b5050505050565b50505050565b50505050565b600082600052816020526040600020905092915050565b828054613ec490615139565b90600052602060002090601f016020900481019282613ee65760008555613f2d565b82601f10613eff57805160ff1916838001178555613f2d565b82800160010185558215613f2d579182015b82811115613f2c578251825591602001919060010190613f11565b5b509050613f3a9190613f81565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613f9a576000816000905550600101613f82565b5090565b6000613fb1613fac84614e45565b614e20565b905082815260208101848484011115613fcd57613fcc615334565b5b613fd88482856150f7565b509392505050565b6000613ff3613fee84614e76565b614e20565b90508281526020810184848401111561400f5761400e615334565b5b61401a8482856150f7565b509392505050565b60008135905061403181615750565b92915050565b60008083601f84011261404d5761404c61532a565b5b8235905067ffffffffffffffff81111561406a57614069615325565b5b6020830191508360208202830111156140865761408561532f565b5b9250929050565b60008135905061409c81615767565b92915050565b6000815190506140b181615767565b92915050565b6000813590506140c68161577e565b92915050565b6000813590506140db81615795565b92915050565b6000815190506140f081615795565b92915050565b600082601f83011261410b5761410a61532a565b5b813561411b848260208601613f9e565b91505092915050565b600082601f8301126141395761413861532a565b5b8135614149848260208601613fe0565b91505092915050565b600081359050614161816157ac565b92915050565b600081519050614176816157ac565b92915050565b6000602082840312156141925761419161533e565b5b60006141a084828501614022565b91505092915050565b600080604083850312156141c0576141bf61533e565b5b60006141ce85828601614022565b92505060206141df85828601614022565b9150509250929050565b6000806000606084860312156142025761420161533e565b5b600061421086828701614022565b935050602061422186828701614022565b925050604061423286828701614152565b9150509250925092565b600080600080608085870312156142565761425561533e565b5b600061426487828801614022565b945050602061427587828801614022565b935050604061428687828801614152565b925050606085013567ffffffffffffffff8111156142a7576142a6615339565b5b6142b3878288016140f6565b91505092959194509250565b600080604083850312156142d6576142d561533e565b5b60006142e485828601614022565b92505060206142f58582860161408d565b9150509250929050565b600080604083850312156143165761431561533e565b5b600061432485828601614022565b925050602061433585828601614152565b9150509250929050565b6000602082840312156143555761435461533e565b5b60006143638482850161408d565b91505092915050565b6000602082840312156143825761438161533e565b5b6000614390848285016140a2565b91505092915050565b6000602082840312156143af576143ae61533e565b5b60006143bd848285016140b7565b91505092915050565b6000602082840312156143dc576143db61533e565b5b60006143ea848285016140cc565b91505092915050565b6000602082840312156144095761440861533e565b5b6000614417848285016140e1565b91505092915050565b6000602082840312156144365761443561533e565b5b600082013567ffffffffffffffff81111561445457614453615339565b5b61446084828501614124565b91505092915050565b600080604083850312156144805761447f61533e565b5b600083013567ffffffffffffffff81111561449e5761449d615339565b5b6144aa85828601614124565b92505060206144bb85828601614152565b9150509250929050565b6000602082840312156144db576144da61533e565b5b60006144e984828501614152565b91505092915050565b6000602082840312156145085761450761533e565b5b600061451684828501614167565b91505092915050565b6000806000604084860312156145385761453761533e565b5b600061454686828701614152565b935050602084013567ffffffffffffffff81111561456757614566615339565b5b61457386828701614037565b92509250509250925092565b600080604083850312156145965761459561533e565b5b60006145a485828601614152565b925050602083013567ffffffffffffffff8111156145c5576145c4615339565b5b6145d185828601614124565b9150509250929050565b60006145e783836149e0565b60208301905092915050565b6145fc81615043565b82525050565b61461361460e82615043565b6151e5565b82525050565b600061462482614eb7565b61462e8185614ee5565b935061463983614ea7565b8060005b8381101561466a57815161465188826145db565b975061465c83614ed8565b92505060018101905061463d565b5085935050505092915050565b61468081615055565b82525050565b61468f81615061565b82525050565b60006146a082614ec2565b6146aa8185614ef6565b93506146ba818560208601615106565b6146c381615343565b840191505092915050565b6146d7816150c1565b82525050565b60006146e882614ecd565b6146f28185614f12565b9350614702818560208601615106565b61470b81615343565b840191505092915050565b600061472182614ecd565b61472b8185614f23565b935061473b818560208601615106565b80840191505092915050565b6000614754602283614f12565b915061475f82615361565b604082019050919050565b6000614777602683614f12565b9150614782826153b0565b604082019050919050565b600061479a602183614f12565b91506147a5826153ff565b604082019050919050565b60006147bd601783614f12565b91506147c88261544e565b602082019050919050565b60006147e0603083614f12565b91506147eb82615477565b604082019050919050565b6000614803601783614f12565b915061480e826154c6565b602082019050919050565b6000614826602083614f12565b9150614831826154ef565b602082019050919050565b6000614849602383614f12565b915061485482615518565b604082019050919050565b600061486c601e83614f12565b915061487782615567565b602082019050919050565b600061488f601c83614f12565b915061489a82615590565b602082019050919050565b60006148b2600f83614f12565b91506148bd826155b9565b602082019050919050565b60006148d5602083614f12565b91506148e0826155e2565b602082019050919050565b60006148f8601183614f12565b91506149038261560b565b602082019050919050565b600061491b600083614f07565b915061492682615634565b600082019050919050565b600061493e601083614f12565b915061494982615637565b602082019050919050565b6000614961601683614f12565b915061496c82615660565b602082019050919050565b6000614984602683614f12565b915061498f82615689565b604082019050919050565b60006149a7602e83614f12565b91506149b2826156d8565b604082019050919050565b60006149ca601483614f12565b91506149d582615727565b602082019050919050565b6149e9816150b7565b82525050565b6149f8816150b7565b82525050565b6000614a0a8284614602565b60148201915081905092915050565b6000614a258284614716565b915081905092915050565b6000614a3c8285614716565b9150614a488284614716565b91508190509392505050565b6000614a5f8261490e565b9150819050919050565b6000602082019050614a7e60008301846145f3565b92915050565b6000604082019050614a9960008301856145f3565b614aa660208301846145f3565b9392505050565b6000606082019050614ac260008301866145f3565b614acf60208301856145f3565b614adc60408301846149ef565b949350505050565b6000608082019050614af960008301876145f3565b614b0660208301866145f3565b614b1360408301856149ef565b8181036060830152614b258184614695565b905095945050505050565b60006020820190508181036000830152614b4a8184614619565b905092915050565b6000602082019050614b676000830184614677565b92915050565b6000602082019050614b826000830184614686565b92915050565b6000602082019050614b9d60008301846146ce565b92915050565b60006020820190508181036000830152614bbd81846146dd565b905092915050565b60006020820190508181036000830152614bde81614747565b9050919050565b60006020820190508181036000830152614bfe8161476a565b9050919050565b60006020820190508181036000830152614c1e8161478d565b9050919050565b60006020820190508181036000830152614c3e816147b0565b9050919050565b60006020820190508181036000830152614c5e816147d3565b9050919050565b60006020820190508181036000830152614c7e816147f6565b9050919050565b60006020820190508181036000830152614c9e81614819565b9050919050565b60006020820190508181036000830152614cbe8161483c565b9050919050565b60006020820190508181036000830152614cde8161485f565b9050919050565b60006020820190508181036000830152614cfe81614882565b9050919050565b60006020820190508181036000830152614d1e816148a5565b9050919050565b60006020820190508181036000830152614d3e816148c8565b9050919050565b60006020820190508181036000830152614d5e816148eb565b9050919050565b60006020820190508181036000830152614d7e81614931565b9050919050565b60006020820190508181036000830152614d9e81614954565b9050919050565b60006020820190508181036000830152614dbe81614977565b9050919050565b60006020820190508181036000830152614dde8161499a565b9050919050565b60006020820190508181036000830152614dfe816149bd565b9050919050565b6000602082019050614e1a60008301846149ef565b92915050565b6000614e2a614e3b565b9050614e36828261516b565b919050565b6000604051905090565b600067ffffffffffffffff821115614e6057614e5f6152f6565b5b614e6982615343565b9050602081019050919050565b600067ffffffffffffffff821115614e9157614e906152f6565b5b614e9a82615343565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f39826150b7565b9150614f44836150b7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f7957614f7861523a565b5b828201905092915050565b6000614f8f826150b7565b9150614f9a836150b7565b925082614faa57614fa9615269565b5b828204905092915050565b6000614fc0826150b7565b9150614fcb836150b7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150045761500361523a565b5b828202905092915050565b600061501a826150b7565b9150615025836150b7565b9250828210156150385761503761523a565b5b828203905092915050565b600061504e82615097565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150cc826150d3565b9050919050565b60006150de826150e5565b9050919050565b60006150f082615097565b9050919050565b82818337600083830152505050565b60005b83811015615124578082015181840152602081019050615109565b83811115615133576000848401525b50505050565b6000600282049050600182168061515157607f821691505b6020821081141561516557615164615298565b5b50919050565b61517482615343565b810181811067ffffffffffffffff82111715615193576151926152f6565b5b80604052505050565b60006151a7826150b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151da576151d961523a565b5b600182019050919050565b60006151f0826151f7565b9050919050565b600061520282615354565b9050919050565b6000615214826150b7565b915061521f836150b7565b92508261522f5761522e615269565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f476976656177617920657863656564732063757272656e74206261746368212160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e74207175616e746974792121000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2100000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f74206964206f776e657221000000000000000000600082015250565b7f496e73756666696369656e74206574682073656e7420666f72206d696e742121600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74206578636565647320436f6c6c656374696f6e2073697a6521210000600082015250565b7f4e6f206d6f72652072657365727665642072656d61696e696e67212100000000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420546f6b656e20696421000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f54726169742053776170206e6f74204163746976652100000000000000000000600082015250565b7f496e73756666696369656e742062616c616e636520746f20757064617465207460008201527f7261697421210000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f74206163746976652121000000000000000000000000600082015250565b61575981615043565b811461576457600080fd5b50565b61577081615055565b811461577b57600080fd5b50565b61578781615061565b811461579257600080fd5b50565b61579e8161506b565b81146157a957600080fd5b50565b6157b5816150b7565b81146157c057600080fd5b5056fea2646970667358221220798ed420d7889b97bc3a0f1f88f151302ac1a6af2aeb8d99a21dbc63556cdf1964736f6c6343000807003368747470733a2f2f6261666b726569633669736c333463616678687336347879326f7778756a623561636e666d797436756374646c376f617177616a3637716b6e71652e697066732e6e667473746f726167652e6c696e6b

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80636fed249311610190578063b88d4fde116100dc578063cd30d63c11610095578063e985e9c51161006f578063e985e9c514610b72578063eac989f814610baf578063ec42b66814610bda578063f2fde38b14610c03576102ff565b8063cd30d63c14610acd578063cd3293de14610b0a578063dc33e68114610b35576102ff565b8063b88d4fde146109bc578063bba7723e146109e5578063bc53a8d014610a22578063bf625cce14610a4b578063c7c9cda714610a74578063c87b56dd14610a90576102ff565b80639da295dc11610149578063a22cb46511610123578063a22cb46514610928578063a475b5dd14610951578063ac4460021461097c578063b012781414610993576102ff565b80639da295dc146108b8578063a035b1fe146108e1578063a0712d681461090c576102ff565b80636fed2493146107b857806370a08231146107e3578063715018a61461082057806371b3056c146108375780638da5cb5b1461086257806395d89b411461088d576102ff565b806329818d401161024f57806341f434341161020857806345c0f533116101e257806345c0f533146106e85780634f6ccce7146107135780636352211e146107505780636c0360eb1461078d576102ff565b806341f434341461066b5780634256dbe31461069657806342842e0e146106bf576102ff565b806329818d401461055d5780632a3f300c146105865780632f745c59146105af5780633311d207146105ec578063370e86d0146106175780633d2a6bd414610642576102ff565b8063081812fc116102bc57806318779fc91161029657806318779fc9146104b5578063200d2ed2146104e057806323b872dd1461050b57806328bf794d14610534576102ff565b8063081812fc14610424578063095ea7b31461046157806318160ddd1461048a576102ff565b806301ffc9a71461030457806302377e1f1461034157806302fe53051461036a578063050225ea1461039357806305c58df2146103bc57806306fdde03146103f9575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906143c6565b610c2c565b6040516103389190614b52565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906144c5565b610d0e565b005b34801561037657600080fd5b50610391600480360381019061038c9190614420565b610d94565b005b34801561039f57600080fd5b506103ba60048036038101906103b591906142ff565b610e2a565b005b3480156103c857600080fd5b506103e360048036038101906103de91906144c5565b610f69565b6040516103f09190614e05565b60405180910390f35b34801561040557600080fd5b5061040e610f81565b60405161041b9190614ba3565b60405180910390f35b34801561043057600080fd5b5061044b600480360381019061044691906144c5565b611013565b6040516104589190614a69565b60405180910390f35b34801561046d57600080fd5b50610488600480360381019061048391906142ff565b61108f565b005b34801561049657600080fd5b5061049f6110a8565b6040516104ac9190614e05565b60405180910390f35b3480156104c157600080fd5b506104ca6110b2565b6040516104d79190614b52565b60405180910390f35b3480156104ec57600080fd5b506104f56110c5565b6040516105029190614e05565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d91906141e9565b6110cb565b005b34801561054057600080fd5b5061055b600480360381019061055691906144c5565b61111a565b005b34801561056957600080fd5b50610584600480360381019061057f919061417c565b6111a0565b005b34801561059257600080fd5b506105ad60048036038101906105a8919061433f565b611260565b005b3480156105bb57600080fd5b506105d660048036038101906105d191906142ff565b6112f9565b6040516105e39190614e05565b60405180910390f35b3480156105f857600080fd5b50610601611512565b60405161060e9190614a69565b60405180910390f35b34801561062357600080fd5b5061062c611538565b6040516106399190614b6d565b60405180910390f35b34801561064e57600080fd5b506106696004803603810190610664919061417c565b61153e565b005b34801561067757600080fd5b506106806115fe565b60405161068d9190614b88565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b891906144c5565b611610565b005b3480156106cb57600080fd5b506106e660048036038101906106e191906141e9565b611696565b005b3480156106f457600080fd5b506106fd6116e5565b60405161070a9190614e05565b60405180910390f35b34801561071f57600080fd5b5061073a600480360381019061073591906144c5565b6116eb565b6040516107479190614e05565b60405180910390f35b34801561075c57600080fd5b50610777600480360381019061077291906144c5565b61173e565b6040516107849190614a69565b60405180910390f35b34801561079957600080fd5b506107a2611754565b6040516107af9190614ba3565b60405180910390f35b3480156107c457600080fd5b506107cd6117e6565b6040516107da9190614a69565b60405180910390f35b3480156107ef57600080fd5b5061080a6004803603810190610805919061417c565b61180c565b6040516108179190614e05565b60405180910390f35b34801561082c57600080fd5b506108356118dc565b005b34801561084357600080fd5b5061084c611964565b6040516108599190614e05565b60405180910390f35b34801561086e57600080fd5b5061087761196a565b6040516108849190614a69565b60405180910390f35b34801561089957600080fd5b506108a2611993565b6040516108af9190614ba3565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da9190614469565b611a25565b005b3480156108ed57600080fd5b506108f6611ac8565b6040516109039190614e05565b60405180910390f35b610926600480360381019061092191906144c5565b611ace565b005b34801561093457600080fd5b5061094f600480360381019061094a91906142bf565b611c4d565b005b34801561095d57600080fd5b50610966611c66565b6040516109739190614b52565b60405180910390f35b34801561098857600080fd5b50610991611c79565b005b34801561099f57600080fd5b506109ba60048036038101906109b591906144c5565b611da4565b005b3480156109c857600080fd5b506109e360048036038101906109de919061423c565b611e2a565b005b3480156109f157600080fd5b50610a0c6004803603810190610a07919061417c565b611e7b565b604051610a199190614b30565b60405180910390f35b348015610a2e57600080fd5b50610a496004803603810190610a44919061457f565b611f29565b005b348015610a5757600080fd5b50610a726004803603810190610a6d919061433f565b61226e565b005b610a8e6004803603810190610a89919061451f565b612307565b005b348015610a9c57600080fd5b50610ab76004803603810190610ab291906144c5565b612508565b604051610ac49190614ba3565b60405180910390f35b348015610ad957600080fd5b50610af46004803603810190610aef9190614420565b6125fb565b604051610b019190614e05565b60405180910390f35b348015610b1657600080fd5b50610b1f612629565b604051610b2c9190614e05565b60405180910390f35b348015610b4157600080fd5b50610b5c6004803603810190610b57919061417c565b61262f565b604051610b699190614e05565b60405180910390f35b348015610b7e57600080fd5b50610b996004803603810190610b9491906141a9565b612641565b604051610ba69190614b52565b60405180910390f35b348015610bbb57600080fd5b50610bc46126d5565b604051610bd19190614ba3565b60405180910390f35b348015610be657600080fd5b50610c016004803603810190610bfc9190614399565b612763565b005b348015610c0f57600080fd5b50610c2a6004803603810190610c25919061417c565b6127e9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cf757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d075750610d06826128e1565b5b9050919050565b610d1661294b565b73ffffffffffffffffffffffffffffffffffffffff16610d3461196a565b73ffffffffffffffffffffffffffffffffffffffff1614610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8190614d25565b60405180910390fd5b8060138190555050565b610d9c61294b565b73ffffffffffffffffffffffffffffffffffffffff16610dba61196a565b73ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790614d25565b60405180910390fd5b80600c9080519060200190610e26929190613eb8565b5050565b610e3261294b565b73ffffffffffffffffffffffffffffffffffffffff16610e5061196a565b73ffffffffffffffffffffffffffffffffffffffff1614610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90614d25565b60405180910390fd5b600a5481610eb26110a8565b610ebc9190614f2e565b1115610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490614c05565b60405180910390fd5b601654811115610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990614ce5565b60405180910390fd5b610f4c8282612953565b8060166000828254610f5e919061500f565b925050819055505050565b600b6020528060005260406000206000915090505481565b606060038054610f9090615139565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbc90615139565b80156110095780601f10610fde57610100808354040283529160200191611009565b820191906000526020600020905b815481529060010190602001808311610fec57829003601f168201915b5050505050905090565b600061101e82612971565b611054576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81611099816129bf565b6110a38383612acb565b505050565b6000600154905090565b601260009054906101000a900460ff1681565b60115481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461110957611108336129bf565b5b611114848484612bd6565b50505050565b61112261294b565b73ffffffffffffffffffffffffffffffffffffffff1661114061196a565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614d25565b60405180910390fd5b8060148190555050565b6111a861294b565b73ffffffffffffffffffffffffffffffffffffffff166111c661196a565b73ffffffffffffffffffffffffffffffffffffffff161461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614d25565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61126861294b565b73ffffffffffffffffffffffffffffffffffffffff1661128661196a565b73ffffffffffffffffffffffffffffffffffffffff16146112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614d25565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b60006113048361180c565b8210611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90614bc5565b60405180910390fd5b600061134f6110a8565b905060008060005b838110156114d0576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461146457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114bc57868414156114ad57819550505050505061150c565b83806114b89061519c565b9450505b5080806114c89061519c565b915050611357565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390614dc5565b60405180910390fd5b92915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b61154661294b565b73ffffffffffffffffffffffffffffffffffffffff1661156461196a565b73ffffffffffffffffffffffffffffffffffffffff16146115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b190614d25565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6daaeb6d7670e522a718067333cd4e81565b61161861294b565b73ffffffffffffffffffffffffffffffffffffffff1661163661196a565b73ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390614d25565b60405180910390fd5b8060168190555050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116d4576116d3336129bf565b5b6116df848484612be6565b50505050565b600a5481565b60006116f56110a8565b8210611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90614ca5565b60405180910390fd5b819050919050565b600061174982612c06565b600001519050919050565b6060600c805461176390615139565b80601f016020809104026020016040519081016040528092919081815260200182805461178f90615139565b80156117dc5780601f106117b1576101008083540402835291602001916117dc565b820191906000526020600020905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611874576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6118e461294b565b73ffffffffffffffffffffffffffffffffffffffff1661190261196a565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614d25565b60405180910390fd5b6119626000612e95565b565b60135481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546119a290615139565b80601f01602080910402602001604051908101604052809291908181526020018280546119ce90615139565b8015611a1b5780601f106119f057610100808354040283529160200191611a1b565b820191906000526020600020905b8154815290600101906020018083116119fe57829003601f168201915b5050505050905090565b611a2d61294b565b73ffffffffffffffffffffffffffffffffffffffff16611a4b61196a565b73ffffffffffffffffffffffffffffffffffffffff1614611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614d25565b60405180910390fd5b80600f83604051611ab29190614a19565b9081526020016040518091039020819055505050565b60145481565b600360115414611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a90614de5565b60405180910390fd5b601354611b3182611b233361262f565b612f5990919063ffffffff16565b11158015611b3f5750600081115b611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614c25565b60405180910390fd5b611b9360145482612f6f90919063ffffffff16565b341015611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc90614c85565b60405180910390fd5b600a54601654611bf583611be76110a8565b612f5990919063ffffffff16565b611bff9190614f2e565b1115611c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3790614cc5565b60405180910390fd5b611c4a3382612953565b50565b81611c57816129bf565b611c618383612f85565b505050565b601060009054906101000a900460ff1681565b611c8161294b565b73ffffffffffffffffffffffffffffffffffffffff16611c9f61196a565b73ffffffffffffffffffffffffffffffffffffffff1614611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec90614d25565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611d1b90614a54565b60006040518083038185875af1925050503d8060008114611d58576040519150601f19603f3d011682016040523d82523d6000602084013e611d5d565b606091505b5050905080611da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9890614d65565b60405180910390fd5b50565b611dac61294b565b73ffffffffffffffffffffffffffffffffffffffff16611dca61196a565b73ffffffffffffffffffffffffffffffffffffffff1614611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1790614d25565b60405180910390fd5b8060118190555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e6857611e67336129bf565b5b611e74858585856130fd565b5050505050565b60606000611e888361180c565b905060008167ffffffffffffffff811115611ea657611ea56152f6565b5b604051908082528060200260200182016040528015611ed45781602001602082028036833780820191505090505b50905060005b82811015611f1e57611eec85826112f9565b828281518110611eff57611efe6152c7565b5b6020026020010181815250508080611f169061519c565b915050611eda565b508092505050919050565b601260009054906101000a900460ff16611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90614d85565b60405180910390fd5b611f8182612971565b611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614d45565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611fe08361173e565b73ffffffffffffffffffffffffffffffffffffffff1614612036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202d90614c65565b60405180910390fd5b600f816040516120469190614a19565b908152602001604051809103902054600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016120b09190614a69565b60206040518083038186803b1580156120c857600080fd5b505afa1580156120dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210091906144f2565b1015612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213890614da5565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f856040516121b39190614a19565b9081526020016040518091039020546040518463ffffffff1660e01b81526004016121e093929190614aad565b602060405180830381600087803b1580156121fa57600080fd5b505af115801561220e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612232919061436c565b506001600b6000848152602001908152602001600020546122539190614f2e565b600b6000848152602001908152602001600020819055505050565b61227661294b565b73ffffffffffffffffffffffffffffffffffffffff1661229461196a565b73ffffffffffffffffffffffffffffffffffffffff16146122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190614d25565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60003360405160200161231a91906149fe565b604051602081830303815290604052805190602001209050600260115414156123cb5761238b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155483613179565b6123ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c190614d05565b60405180910390fd5b5b6013546123e9856123db3361262f565b612f5990919063ffffffff16565b111580156123f75750600084115b612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90614c25565b60405180910390fd5b61244b60145485612f6f90919063ffffffff16565b34101561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614c85565b60405180910390fd5b600a546016546124ad8661249f6110a8565b612f5990919063ffffffff16565b6124b79190614f2e565b11156124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef90614cc5565b60405180910390fd5b6125023385612953565b50505050565b606061251382612971565b612552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254990614c45565b60405180910390fd5b601060009054906101000a900460ff16156125c5576000612571611754565b511161258c57604051806020016040528060008152506125be565b612594611754565b61259d83613190565b6040516020016125ae929190614a30565b6040516020818303038152906040525b90506125f6565b60006125cf611754565b51116125ea57604051806020016040528060008152506125f3565b6125f2611754565b5b90505b919050565b600f818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60165481565b600061263a826132f1565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c80546126e290615139565b80601f016020809104026020016040519081016040528092919081815260200182805461270e90615139565b801561275b5780601f106127305761010080835404028352916020019161275b565b820191906000526020600020905b81548152906001019060200180831161273e57829003601f168201915b505050505081565b61276b61294b565b73ffffffffffffffffffffffffffffffffffffffff1661278961196a565b73ffffffffffffffffffffffffffffffffffffffff16146127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d690614d25565b60405180910390fd5b8060158190555050565b6127f161294b565b73ffffffffffffffffffffffffffffffffffffffff1661280f61196a565b73ffffffffffffffffffffffffffffffffffffffff1614612865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285c90614d25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cc90614be5565b60405180910390fd5b6128de81612e95565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b61296d82826040518060200160405280600081525061335b565b5050565b60008161297c61336d565b1115801561298b575060015482105b80156129b8575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612ac8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612a36929190614a84565b60206040518083038186803b158015612a4e57600080fd5b505afa158015612a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a86919061436c565b612ac757806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612abe9190614a69565b60405180910390fd5b5b50565b6000612ad68261173e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b3e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612b5d61294b565b73ffffffffffffffffffffffffffffffffffffffff1614158015612b8f5750612b8d81612b8861294b565b612641565b155b15612bc6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd1838383613376565b505050565b612be1838383613428565b505050565b612c0183838360405180602001604052806000815250611e2a565b505050565b612c0e613f3e565b600082905080612c1c61336d565b11158015612c2b575060015481105b15612e5e576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e5c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d40578092505050612e90565b5b600115612e5b57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e56578092505050612e90565b612d41565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612f679190614f2e565b905092915050565b60008183612f7d9190614fb5565b905092915050565b612f8d61294b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000612fff61294b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166130ac61294b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516130f19190614b52565b60405180910390a35050565b613108848484613428565b6131278373ffffffffffffffffffffffffffffffffffffffff166138de565b801561313c575061313a848484846138f1565b155b15613173576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000826131868584613a51565b1490509392505050565b606060008214156131d8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132ec565b600082905060005b6000821461320a5780806131f39061519c565b915050600a826132039190614f84565b91506131e0565b60008167ffffffffffffffff811115613226576132256152f6565b5b6040519080825280601f01601f1916602001820160405280156132585781602001600182028036833780820191505090505b5090505b600085146132e557600182613271919061500f565b9150600a856132809190615209565b603061328c9190614f2e565b60f81b8183815181106132a2576132a16152c7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132de9190614f84565b945061325c565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6133688383836001613ac6565b505050565b60006001905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061343382612c06565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461349e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166134bf61294b565b73ffffffffffffffffffffffffffffffffffffffff1614806134ee57506134ed856134e861294b565b612641565b5b8061353357506134fc61294b565b73ffffffffffffffffffffffffffffffffffffffff1661351b84611013565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061356c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156135d3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135e08585856001613e95565b6135ec60008487613376565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561386c57600154821461386b57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138d78585856001613e9b565b5050505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261391761294b565b8786866040518563ffffffff1660e01b81526004016139399493929190614ae4565b602060405180830381600087803b15801561395357600080fd5b505af192505050801561398457506040513d601f19601f8201168201806040525081019061398191906143f3565b60015b6139fe573d80600081146139b4576040519150601f19603f3d011682016040523d82523d6000602084013e6139b9565b606091505b506000815114156139f6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008082905060005b8451811015613abb576000858281518110613a7857613a776152c7565b5b60200260200101519050808311613a9a57613a938382613ea1565b9250613aa7565b613aa48184613ea1565b92505b508080613ab39061519c565b915050613a5a565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613b34576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613b6f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b7c6000868387613e95565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613d465750613d458773ffffffffffffffffffffffffffffffffffffffff166138de565b5b15613e0c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613dbb60008884806001019550886138f1565b613df1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613d4c578260015414613e0757600080fd5b613e78565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613e0d575b816001819055505050613e8e6000868387613e9b565b5050505050565b50505050565b50505050565b600082600052816020526040600020905092915050565b828054613ec490615139565b90600052602060002090601f016020900481019282613ee65760008555613f2d565b82601f10613eff57805160ff1916838001178555613f2d565b82800160010185558215613f2d579182015b82811115613f2c578251825591602001919060010190613f11565b5b509050613f3a9190613f81565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613f9a576000816000905550600101613f82565b5090565b6000613fb1613fac84614e45565b614e20565b905082815260208101848484011115613fcd57613fcc615334565b5b613fd88482856150f7565b509392505050565b6000613ff3613fee84614e76565b614e20565b90508281526020810184848401111561400f5761400e615334565b5b61401a8482856150f7565b509392505050565b60008135905061403181615750565b92915050565b60008083601f84011261404d5761404c61532a565b5b8235905067ffffffffffffffff81111561406a57614069615325565b5b6020830191508360208202830111156140865761408561532f565b5b9250929050565b60008135905061409c81615767565b92915050565b6000815190506140b181615767565b92915050565b6000813590506140c68161577e565b92915050565b6000813590506140db81615795565b92915050565b6000815190506140f081615795565b92915050565b600082601f83011261410b5761410a61532a565b5b813561411b848260208601613f9e565b91505092915050565b600082601f8301126141395761413861532a565b5b8135614149848260208601613fe0565b91505092915050565b600081359050614161816157ac565b92915050565b600081519050614176816157ac565b92915050565b6000602082840312156141925761419161533e565b5b60006141a084828501614022565b91505092915050565b600080604083850312156141c0576141bf61533e565b5b60006141ce85828601614022565b92505060206141df85828601614022565b9150509250929050565b6000806000606084860312156142025761420161533e565b5b600061421086828701614022565b935050602061422186828701614022565b925050604061423286828701614152565b9150509250925092565b600080600080608085870312156142565761425561533e565b5b600061426487828801614022565b945050602061427587828801614022565b935050604061428687828801614152565b925050606085013567ffffffffffffffff8111156142a7576142a6615339565b5b6142b3878288016140f6565b91505092959194509250565b600080604083850312156142d6576142d561533e565b5b60006142e485828601614022565b92505060206142f58582860161408d565b9150509250929050565b600080604083850312156143165761431561533e565b5b600061432485828601614022565b925050602061433585828601614152565b9150509250929050565b6000602082840312156143555761435461533e565b5b60006143638482850161408d565b91505092915050565b6000602082840312156143825761438161533e565b5b6000614390848285016140a2565b91505092915050565b6000602082840312156143af576143ae61533e565b5b60006143bd848285016140b7565b91505092915050565b6000602082840312156143dc576143db61533e565b5b60006143ea848285016140cc565b91505092915050565b6000602082840312156144095761440861533e565b5b6000614417848285016140e1565b91505092915050565b6000602082840312156144365761443561533e565b5b600082013567ffffffffffffffff81111561445457614453615339565b5b61446084828501614124565b91505092915050565b600080604083850312156144805761447f61533e565b5b600083013567ffffffffffffffff81111561449e5761449d615339565b5b6144aa85828601614124565b92505060206144bb85828601614152565b9150509250929050565b6000602082840312156144db576144da61533e565b5b60006144e984828501614152565b91505092915050565b6000602082840312156145085761450761533e565b5b600061451684828501614167565b91505092915050565b6000806000604084860312156145385761453761533e565b5b600061454686828701614152565b935050602084013567ffffffffffffffff81111561456757614566615339565b5b61457386828701614037565b92509250509250925092565b600080604083850312156145965761459561533e565b5b60006145a485828601614152565b925050602083013567ffffffffffffffff8111156145c5576145c4615339565b5b6145d185828601614124565b9150509250929050565b60006145e783836149e0565b60208301905092915050565b6145fc81615043565b82525050565b61461361460e82615043565b6151e5565b82525050565b600061462482614eb7565b61462e8185614ee5565b935061463983614ea7565b8060005b8381101561466a57815161465188826145db565b975061465c83614ed8565b92505060018101905061463d565b5085935050505092915050565b61468081615055565b82525050565b61468f81615061565b82525050565b60006146a082614ec2565b6146aa8185614ef6565b93506146ba818560208601615106565b6146c381615343565b840191505092915050565b6146d7816150c1565b82525050565b60006146e882614ecd565b6146f28185614f12565b9350614702818560208601615106565b61470b81615343565b840191505092915050565b600061472182614ecd565b61472b8185614f23565b935061473b818560208601615106565b80840191505092915050565b6000614754602283614f12565b915061475f82615361565b604082019050919050565b6000614777602683614f12565b9150614782826153b0565b604082019050919050565b600061479a602183614f12565b91506147a5826153ff565b604082019050919050565b60006147bd601783614f12565b91506147c88261544e565b602082019050919050565b60006147e0603083614f12565b91506147eb82615477565b604082019050919050565b6000614803601783614f12565b915061480e826154c6565b602082019050919050565b6000614826602083614f12565b9150614831826154ef565b602082019050919050565b6000614849602383614f12565b915061485482615518565b604082019050919050565b600061486c601e83614f12565b915061487782615567565b602082019050919050565b600061488f601c83614f12565b915061489a82615590565b602082019050919050565b60006148b2600f83614f12565b91506148bd826155b9565b602082019050919050565b60006148d5602083614f12565b91506148e0826155e2565b602082019050919050565b60006148f8601183614f12565b91506149038261560b565b602082019050919050565b600061491b600083614f07565b915061492682615634565b600082019050919050565b600061493e601083614f12565b915061494982615637565b602082019050919050565b6000614961601683614f12565b915061496c82615660565b602082019050919050565b6000614984602683614f12565b915061498f82615689565b604082019050919050565b60006149a7602e83614f12565b91506149b2826156d8565b604082019050919050565b60006149ca601483614f12565b91506149d582615727565b602082019050919050565b6149e9816150b7565b82525050565b6149f8816150b7565b82525050565b6000614a0a8284614602565b60148201915081905092915050565b6000614a258284614716565b915081905092915050565b6000614a3c8285614716565b9150614a488284614716565b91508190509392505050565b6000614a5f8261490e565b9150819050919050565b6000602082019050614a7e60008301846145f3565b92915050565b6000604082019050614a9960008301856145f3565b614aa660208301846145f3565b9392505050565b6000606082019050614ac260008301866145f3565b614acf60208301856145f3565b614adc60408301846149ef565b949350505050565b6000608082019050614af960008301876145f3565b614b0660208301866145f3565b614b1360408301856149ef565b8181036060830152614b258184614695565b905095945050505050565b60006020820190508181036000830152614b4a8184614619565b905092915050565b6000602082019050614b676000830184614677565b92915050565b6000602082019050614b826000830184614686565b92915050565b6000602082019050614b9d60008301846146ce565b92915050565b60006020820190508181036000830152614bbd81846146dd565b905092915050565b60006020820190508181036000830152614bde81614747565b9050919050565b60006020820190508181036000830152614bfe8161476a565b9050919050565b60006020820190508181036000830152614c1e8161478d565b9050919050565b60006020820190508181036000830152614c3e816147b0565b9050919050565b60006020820190508181036000830152614c5e816147d3565b9050919050565b60006020820190508181036000830152614c7e816147f6565b9050919050565b60006020820190508181036000830152614c9e81614819565b9050919050565b60006020820190508181036000830152614cbe8161483c565b9050919050565b60006020820190508181036000830152614cde8161485f565b9050919050565b60006020820190508181036000830152614cfe81614882565b9050919050565b60006020820190508181036000830152614d1e816148a5565b9050919050565b60006020820190508181036000830152614d3e816148c8565b9050919050565b60006020820190508181036000830152614d5e816148eb565b9050919050565b60006020820190508181036000830152614d7e81614931565b9050919050565b60006020820190508181036000830152614d9e81614954565b9050919050565b60006020820190508181036000830152614dbe81614977565b9050919050565b60006020820190508181036000830152614dde8161499a565b9050919050565b60006020820190508181036000830152614dfe816149bd565b9050919050565b6000602082019050614e1a60008301846149ef565b92915050565b6000614e2a614e3b565b9050614e36828261516b565b919050565b6000604051905090565b600067ffffffffffffffff821115614e6057614e5f6152f6565b5b614e6982615343565b9050602081019050919050565b600067ffffffffffffffff821115614e9157614e906152f6565b5b614e9a82615343565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f39826150b7565b9150614f44836150b7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f7957614f7861523a565b5b828201905092915050565b6000614f8f826150b7565b9150614f9a836150b7565b925082614faa57614fa9615269565b5b828204905092915050565b6000614fc0826150b7565b9150614fcb836150b7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150045761500361523a565b5b828202905092915050565b600061501a826150b7565b9150615025836150b7565b9250828210156150385761503761523a565b5b828203905092915050565b600061504e82615097565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150cc826150d3565b9050919050565b60006150de826150e5565b9050919050565b60006150f082615097565b9050919050565b82818337600083830152505050565b60005b83811015615124578082015181840152602081019050615109565b83811115615133576000848401525b50505050565b6000600282049050600182168061515157607f821691505b6020821081141561516557615164615298565b5b50919050565b61517482615343565b810181811067ffffffffffffffff82111715615193576151926152f6565b5b80604052505050565b60006151a7826150b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151da576151d961523a565b5b600182019050919050565b60006151f0826151f7565b9050919050565b600061520282615354565b9050919050565b6000615214826150b7565b915061521f836150b7565b92508261522f5761522e615269565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f476976656177617920657863656564732063757272656e74206261746368212160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e74207175616e746974792121000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2100000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f74206964206f776e657221000000000000000000600082015250565b7f496e73756666696369656e74206574682073656e7420666f72206d696e742121600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74206578636565647320436f6c6c656374696f6e2073697a6521210000600082015250565b7f4e6f206d6f72652072657365727665642072656d61696e696e67212100000000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420546f6b656e20696421000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f54726169742053776170206e6f74204163746976652100000000000000000000600082015250565b7f496e73756666696369656e742062616c616e636520746f20757064617465207460008201527f7261697421210000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f74206163746976652121000000000000000000000000600082015250565b61575981615043565b811461576457600080fd5b50565b61577081615055565b811461577b57600080fd5b50565b61578781615061565b811461579257600080fd5b50565b61579e8161506b565b81146157a957600080fd5b50565b6157b5816150b7565b81146157c057600080fd5b5056fea2646970667358221220798ed420d7889b97bc3a0f1f88f151302ac1a6af2aeb8d99a21dbc63556cdf1964736f6c63430008070033

Deployed Bytecode Sourcemap

59926:6748:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39532:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61278:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60291:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62546:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60131:34;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42645:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44156:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65748:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37961:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61079:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60932:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65913:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61418:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60412:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60848:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38263:820;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60378:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61508:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60544:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22431:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61747:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66084:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60088:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38069:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42453:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65130:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60511:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39901:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28217:103;;;;;;;;;;;;;:::i;:::-;;61244:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27994:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42814:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60683:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61380:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63527:475;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65564:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60815:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66493:178;;;;;;;;;;;;;:::i;:::-;;60984:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66263:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65323:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64010:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61123:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62877:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64724:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60636:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61713:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64603:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44790:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60174:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61612:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28329:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39532:305;39634:4;39686:25;39671:40;;;:11;:40;;;;:105;;;;39743:33;39728:48;;;:11;:48;;;;39671:105;:158;;;;39793:36;39817:11;39793:23;:36::i;:::-;39671:158;39651:178;;39532:305;;;:::o;61278:90::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61356:4:::1;61342:11;:18;;;;61278:90:::0;:::o;60291:75::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60357:1:::1;60351:3;:7;;;;;;;;;;;;:::i;:::-;;60291:75:::0;:::o;62546:323::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62665:14:::1;;62653:8;62637:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;62629:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;62748:7;;62736:8;:19;;62728:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;62801:30;62811:9;62822:8;62801:9;:30::i;:::-;62853:8;62842:7;;:19;;;;;;;:::i;:::-;;;;;;;;62546:323:::0;;:::o;60131:34::-;;;;;;;;;;;;;;;;;:::o;42645:100::-;42699:13;42732:5;42725:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42645:100;:::o;44156:204::-;44224:7;44249:16;44257:7;44249;:16::i;:::-;44244:64;;44274:34;;;;;;;;;;;;;;44244:64;44328:15;:24;44344:7;44328:24;;;;;;;;;;;;;;;;;;;;;44321:31;;44156:204;;;:::o;65748:157::-;65844:8;23952:30;23973:8;23952:20;:30::i;:::-;65865:32:::1;65879:8;65889:7;65865:13;:32::i;:::-;65748:157:::0;;;:::o;37961:101::-;38014:7;38041:13;;38034:20;;37961:101;:::o;61079:37::-;;;;;;;;;;;;;:::o;60932:22::-;;;;:::o;65913:163::-;66014:4;23780:10;23772:18;;:4;:18;;;23768:83;;23807:32;23828:10;23807:20;:32::i;:::-;23768:83;66031:37:::1;66050:4;66056:2;66060:7;66031:18;:37::i;:::-;65913:163:::0;;;;:::o;61418:82::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61486:6:::1;61478:5;:14;;;;61418:82:::0;:::o;60412:87::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60490:1:::1;60475:12;;:16;;;;;;;;;;;;;;;;;;60412:87:::0;:::o;60848:76::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60913:3:::1;60904:6;;:12;;;;;;;;;;;;;;;;;;60848:76:::0;:::o;38263:820::-;38388:7;38429:16;38439:5;38429:9;:16::i;:::-;38421:5;:24;38413:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38495:22;38520:13;:11;:13::i;:::-;38495:38;;38544:19;38578:25;38632:9;38627:382;38651:14;38647:1;:18;38627:382;;;38683:31;38717:11;:14;38729:1;38717:14;;;;;;;;;;;38683:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38772:1;38746:28;;:9;:14;;;:28;;;38742:95;;38811:9;:14;;;38791:34;;38742:95;38872:5;38851:26;;:17;:26;;;38847:151;;;38913:5;38898:11;:20;38894:65;;;38942:1;38935:8;;;;;;;;;38894:65;38973:13;;;;;:::i;:::-;;;;38847:151;38672:337;38667:3;;;;;:::i;:::-;;;;38627:382;;;;39019:56;;;;;;;;;;:::i;:::-;;;;;;;;38263:820;;;;;:::o;60378:27::-;;;;;;;;;;;;;:::o;61508:97::-;;;;:::o;60544:84::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60619:1:::1;60605:11;;:15;;;;;;;;;;;;;;;;;;60544:84:::0;:::o;22431:143::-;22531:42;22431:143;:::o;61747:88::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61821:6:::1;61811:7;:16;;;;61747:88:::0;:::o;66084:171::-;66189:4;23780:10;23772:18;;:4;:18;;;23768:83;;23807:32;23828:10;23807:20;:32::i;:::-;23768:83;66206:41:::1;66229:4;66235:2;66239:7;66206:22;:41::i;:::-;66084:171:::0;;;;:::o;60088:36::-;;;;:::o;38069:187::-;38136:7;38172:13;:11;:13::i;:::-;38164:5;:21;38156:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;38243:5;38236:12;;38069:187;;;:::o;42453:125::-;42517:7;42544:21;42557:7;42544:12;:21::i;:::-;:26;;;42537:33;;42453:125;;;:::o;65130:84::-;65170:13;65203:3;65196:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65130:84;:::o;60511:26::-;;;;;;;;;;;;;:::o;39901:206::-;39965:7;40006:1;39989:19;;:5;:19;;;39985:60;;;40017:28;;;;;;;;;;;;;;39985:60;40071:12;:19;40084:5;40071:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;40063:36;;40056:43;;39901:206;;;:::o;28217:103::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28282:30:::1;28309:1;28282:18;:30::i;:::-;28217:103::o:0;61244:27::-;;;;:::o;27994:87::-;28040:7;28067:6;;;;;;;;;;;28060:13;;27994:87;:::o;42814:104::-;42870:13;42903:7;42896:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42814:104;:::o;60683:124::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60793:6:::1;60771:9;60781:8;60771:19;;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;;60683:124:::0;;:::o;61380:31::-;;;;:::o;63527:475::-;63603:1;63593:6;;:11;63585:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;63690:11;;63648:38;63677:8;63648:24;63661:10;63648:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:53;;:69;;;;;63716:1;63705:8;:12;63648:69;63640:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;63777:19;63790:5;;63777:8;:12;;:19;;;;:::i;:::-;63764:9;:32;;63756:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63893:14;;63882:7;;63852:27;63870:8;63852:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:37;;;;:::i;:::-;:55;;63844:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;63963:31;63973:10;63985:8;63963:9;:31::i;:::-;63527:475;:::o;65564:176::-;65668:8;23952:30;23973:8;23952:20;:30::i;:::-;65689:43:::1;65713:8;65723;65689:23;:43::i;:::-;65564:176:::0;;;:::o;60815:26::-;;;;;;;;;;;;;:::o;66493:178::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66549:12:::1;66567:10;:15;;66590:21;66567:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66548:68;;;66635:7;66627:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;66537:134;66493:178::o:0;60984:87::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61057:6:::1;61048;:15;;;;60984:87:::0;:::o;66263:222::-;66414:4;23780:10;23772:18;;:4;:18;;;23768:83;;23807:32;23828:10;23807:20;:32::i;:::-;23768:83;66430:47:::1;66453:4;66459:2;66463:7;66472:4;66430:22;:47::i;:::-;66263:222:::0;;;;;:::o;65323:233::-;65376:13;65401:6;65410:12;65420:1;65410:9;:12::i;:::-;65401:21;;65433:15;65461:1;65450:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65433:30;;65478:6;65474:55;65490:1;65488;:3;65474:55;;;65505:24;65525:1;65527;65505:19;:24::i;:::-;65498:1;65500;65498:4;;;;;;;;:::i;:::-;;;;;;;:31;;;;;65493:3;;;;;:::i;:::-;;;;65474:55;;;;65547:1;65540:8;;;;65323:233;;;:::o;64010:502::-;64086:17;;;;;;;;;;;64078:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;64147:11;64155:2;64147:7;:11::i;:::-;64139:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;64211:10;64196:25;;:11;64204:2;64196:7;:11::i;:::-;:25;;;64188:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;64312:9;64322:8;64312:19;;;;;;:::i;:::-;;;;;;;;;;;;;;64273:12;;;;;;;;;;;64266:30;;;64297:10;64266:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;64258:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;64398:12;;;;;;;;;;;64391:33;;;64425:10;64437:11;;;;;;;;;;;64450:9;64460:8;64450:19;;;;;;:::i;:::-;;;;;;;;;;;;;;64391:79;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64503:1;64491:5;:9;64497:2;64491:9;;;;;;;;;;;;:13;;;;:::i;:::-;64479:5;:9;64485:2;64479:9;;;;;;;;;;;:25;;;;64010:502;;:::o;61123:109::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61218:6:::1;61198:17;;:26;;;;;;;;;;;;;;;;;;61123:109:::0;:::o;62877:642::-;62972:12;63014:10;62997:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;62987:39;;;;;;62972:54;;63052:1;63042:6;;:11;63039:105;;;63072:53;63092:11;;63072:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63105:13;;63120:4;63072:18;:53::i;:::-;63064:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;63039:105;63207:11;;63165:38;63194:8;63165:24;63178:10;63165:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:53;;:69;;;;;63233:1;63222:8;:12;63165:69;63157:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;63294:19;63307:5;;63294:8;:12;;:19;;;;:::i;:::-;63281:9;:32;;63273:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63410:14;;63399:7;;63369:27;63387:8;63369:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:37;;;;:::i;:::-;:55;;63361:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;63480:31;63490:10;63502:8;63480:9;:31::i;:::-;62961:558;62877:642;;;:::o;64724:398::-;64797:13;64831:16;64839:7;64831;:16::i;:::-;64823:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64915:6;;;;;;;;;;;64912:202;;;64969:1;64949:9;:7;:9::i;:::-;64943:23;:27;:90;;;;;;;;;;;;;;;;;64997:9;:7;:9::i;:::-;65008:18;:7;:16;:18::i;:::-;64980:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64943:90;64936:97;;;;64912:202;65096:1;65076:9;:7;:9::i;:::-;65070:23;:27;:44;;;;;;;;;;;;;;;;;65100:9;:7;:9::i;:::-;65070:44;65063:51;;64724:398;;;;:::o;60636:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61713:27::-;;;;:::o;64603:113::-;64661:7;64688:20;64702:5;64688:13;:20::i;:::-;64681:27;;64603:113;;;:::o;44790:164::-;44887:4;44911:18;:25;44930:5;44911:25;;;;;;;;;;;;;;;:35;44937:8;44911:35;;;;;;;;;;;;;;;;;;;;;;;;;44904:42;;44790:164;;;;:::o;60174:110::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61612:89::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61692:1:::1;61676:13;:17;;;;61612:89:::0;:::o;28329:201::-;28139:12;:10;:12::i;:::-;28128:23;;:7;:5;:7::i;:::-;:23;;;28120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28438:1:::1;28418:22;;:8;:22;;;;28410:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28494:28;28513:8;28494:18;:28::i;:::-;28329:201:::0;:::o;32647:157::-;32732:4;32771:25;32756:40;;;:11;:40;;;;32749:47;;32647:157;;;:::o;27537:98::-;27590:7;27617:10;27610:17;;27537:98;:::o;46324:104::-;46393:27;46403:2;46407:8;46393:27;;;;;;;;;;;;:9;:27::i;:::-;46324:104;;:::o;46142:174::-;46199:4;46242:7;46223:15;:13;:15::i;:::-;:26;;:53;;;;;46263:13;;46253:7;:23;46223:53;:85;;;;;46281:11;:20;46293:7;46281:20;;;;;;;;;;;:27;;;;;;;;;;;;46280:28;46223:85;46216:92;;46142:174;;;:::o;24014:419::-;24253:1;22531:42;24205:45;;;:49;24201:225;;;22531:42;24276;;;24327:4;24334:8;24276:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24271:144;;24390:8;24371:28;;;;;;;;;;;:::i;:::-;;;;;;;;24271:144;24201:225;24014:419;:::o;43711:379::-;43792:13;43808:24;43824:7;43808:15;:24::i;:::-;43792:40;;43853:5;43847:11;;:2;:11;;;43843:48;;;43867:24;;;;;;;;;;;;;;43843:48;43924:5;43908:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;43934:37;43951:5;43958:12;:10;:12::i;:::-;43934:16;:37::i;:::-;43933:38;43908:63;43904:138;;;43995:35;;;;;;;;;;;;;;43904:138;44054:28;44063:2;44067:7;44076:5;44054:8;:28::i;:::-;43781:309;43711:379;;:::o;45021:170::-;45155:28;45165:4;45171:2;45175:7;45155:9;:28::i;:::-;45021:170;;;:::o;45262:185::-;45400:39;45417:4;45423:2;45427:7;45400:39;;;;;;;;;;;;:16;:39::i;:::-;45262:185;;;:::o;41282:1109::-;41344:21;;:::i;:::-;41378:12;41393:7;41378:22;;41461:4;41442:15;:13;:15::i;:::-;:23;;:47;;;;;41476:13;;41469:4;:20;41442:47;41438:886;;;41510:31;41544:11;:17;41556:4;41544:17;;;;;;;;;;;41510:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41585:9;:16;;;41580:729;;41656:1;41630:28;;:9;:14;;;:28;;;41626:101;;41694:9;41687:16;;;;;;41626:101;42029:261;42036:4;42029:261;;;42069:6;;;;;;;;42114:11;:17;42126:4;42114:17;;;;;;;;;;;42102:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42188:1;42162:28;;:9;:14;;;:28;;;42158:109;;42230:9;42223:16;;;;;;42158:109;42029:261;;;41580:729;41491:833;41438:886;42352:31;;;;;;;;;;;;;;41282:1109;;;;:::o;28539:191::-;28613:16;28632:6;;;;;;;;;;;28613:25;;28658:8;28649:6;;:17;;;;;;;;;;;;;;;;;;28713:8;28682:40;;28703:8;28682:40;;;;;;;;;;;;28602:128;28539:191;:::o;16061:98::-;16119:7;16150:1;16146;:5;;;;:::i;:::-;16139:12;;16061:98;;;;:::o;16799:::-;16857:7;16888:1;16884;:5;;;;:::i;:::-;16877:12;;16799:98;;;;:::o;44432:287::-;44543:12;:10;:12::i;:::-;44531:24;;:8;:24;;;44527:54;;;44564:17;;;;;;;;;;;;;;44527:54;44639:8;44594:18;:32;44613:12;:10;:12::i;:::-;44594:32;;;;;;;;;;;;;;;:42;44627:8;44594:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;44692:8;44663:48;;44678:12;:10;:12::i;:::-;44663:48;;;44702:8;44663:48;;;;;;:::i;:::-;;;;;;;;44432:287;;:::o;45518:369::-;45685:28;45695:4;45701:2;45705:7;45685:9;:28::i;:::-;45728:15;:2;:13;;;:15::i;:::-;:76;;;;;45748:56;45779:4;45785:2;45789:7;45798:5;45748:30;:56::i;:::-;45747:57;45728:76;45724:156;;;45828:40;;;;;;;;;;;;;;45724:156;45518:369;;;;:::o;24701:190::-;24826:4;24879;24850:25;24863:5;24870:4;24850:12;:25::i;:::-;:33;24843:40;;24701:190;;;;;:::o;26154:533::-;26210:13;26250:1;26241:5;:10;26237:53;;;26268:10;;;;;;;;;;;;;;;;;;;;;26237:53;26300:12;26315:5;26300:20;;26331:14;26356:78;26371:1;26363:4;:9;26356:78;;26389:8;;;;;:::i;:::-;;;;26420:2;26412:10;;;;;:::i;:::-;;;26356:78;;;26444:19;26476:6;26466:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26444:39;;26494:154;26510:1;26501:5;:10;26494:154;;26538:1;26528:11;;;;;:::i;:::-;;;26605:2;26597:5;:10;;;;:::i;:::-;26584:2;:24;;;;:::i;:::-;26571:39;;26554:6;26561;26554:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;26634:2;26625:11;;;;;:::i;:::-;;;26494:154;;;26672:6;26658:21;;;;;26154:533;;;;:::o;40189:137::-;40250:7;40285:12;:19;40298:5;40285:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;40277:41;;40270:48;;40189:137;;;:::o;46791:163::-;46914:32;46920:2;46924:8;46934:5;46941:4;46914:5;:32::i;:::-;46791:163;;;:::o;65222:93::-;65279:7;65306:1;65299:8;;65222:93;:::o;54299:196::-;54441:2;54414:15;:24;54430:7;54414:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54479:7;54475:2;54459:28;;54468:5;54459:28;;;;;;;;;;;;54299:196;;;:::o;49242:2130::-;49357:35;49395:21;49408:7;49395:12;:21::i;:::-;49357:59;;49455:4;49433:26;;:13;:18;;;:26;;;49429:67;;49468:28;;;;;;;;;;;;;;49429:67;49509:22;49551:4;49535:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;49572:36;49589:4;49595:12;:10;:12::i;:::-;49572:16;:36::i;:::-;49535:73;:126;;;;49649:12;:10;:12::i;:::-;49625:36;;:20;49637:7;49625:11;:20::i;:::-;:36;;;49535:126;49509:153;;49680:17;49675:66;;49706:35;;;;;;;;;;;;;;49675:66;49770:1;49756:16;;:2;:16;;;49752:52;;;49781:23;;;;;;;;;;;;;;49752:52;49817:43;49839:4;49845:2;49849:7;49858:1;49817:21;:43::i;:::-;49925:35;49942:1;49946:7;49955:4;49925:8;:35::i;:::-;50286:1;50256:12;:18;50269:4;50256:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50330:1;50302:12;:16;50315:2;50302:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50348:31;50382:11;:20;50394:7;50382:20;;;;;;;;;;;50348:54;;50433:2;50417:8;:13;;;:18;;;;;;;;;;;;;;;;;;50483:15;50450:8;:23;;;:49;;;;;;;;;;;;;;;;;;50751:19;50783:1;50773:7;:11;50751:33;;50799:31;50833:11;:24;50845:11;50833:24;;;;;;;;;;;50799:58;;50901:1;50876:27;;:8;:13;;;;;;;;;;;;:27;;;50872:384;;;51086:13;;51071:11;:28;51067:174;;51140:4;51124:8;:13;;;:20;;;;;;;;;;;;;;;;;;51193:13;:28;;;51167:8;:23;;;:54;;;;;;;;;;;;;;;;;;51067:174;50872:384;50231:1036;;;51303:7;51299:2;51284:27;;51293:4;51284:27;;;;;;;;;;;;51322:42;51343:4;51349:2;51353:7;51362:1;51322:20;:42::i;:::-;49346:2026;;49242:2130;;;:::o;28762:197::-;28822:4;28840:12;28907:7;28895:20;28887:28;;28950:1;28943:4;:8;28936:15;;;28762:197;;;:::o;54987:667::-;55150:4;55187:2;55171:36;;;55208:12;:10;:12::i;:::-;55222:4;55228:7;55237:5;55171:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55167:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55422:1;55405:6;:13;:18;55401:235;;;55451:40;;;;;;;;;;;;;;55401:235;55594:6;55588:13;55579:6;55575:2;55571:15;55564:38;55167:480;55300:45;;;55290:55;;;:6;:55;;;;55283:62;;;54987:667;;;;;;:::o;24896:517::-;24979:7;24999:20;25022:4;24999:27;;25042:9;25037:339;25061:5;:12;25057:1;:16;25037:339;;;25095:20;25118:5;25124:1;25118:8;;;;;;;;:::i;:::-;;;;;;;;25095:31;;25161:12;25145;:28;25141:224;;25209:42;25224:12;25238;25209:14;:42::i;:::-;25194:57;;25141:224;;;25307:42;25322:12;25336;25307:14;:42::i;:::-;25292:57;;25141:224;25080:296;25075:3;;;;;:::i;:::-;;;;25037:339;;;;25393:12;25386:19;;;24896:517;;;;:::o;47213:1775::-;47352:20;47375:13;;47352:36;;47417:1;47403:16;;:2;:16;;;47399:48;;;47428:19;;;;;;;;;;;;;;47399:48;47474:1;47462:8;:13;47458:44;;;47484:18;;;;;;;;;;;;;;47458:44;47515:61;47545:1;47549:2;47553:12;47567:8;47515:21;:61::i;:::-;47888:8;47853:12;:16;47866:2;47853:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47952:8;47912:12;:16;47925:2;47912:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48011:2;47978:11;:25;47990:12;47978:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;48078:15;48028:11;:25;48040:12;48028:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;48111:20;48134:12;48111:35;;48161:11;48190:8;48175:12;:23;48161:37;;48219:4;:23;;;;;48227:15;:2;:13;;;:15::i;:::-;48219:23;48215:641;;;48263:314;48319:12;48315:2;48294:38;;48311:1;48294:38;;;;;;;;;;;;48360:69;48399:1;48403:2;48407:14;;;;;;48423:5;48360:30;:69::i;:::-;48355:174;;48465:40;;;;;;;;;;;;;;48355:174;48572:3;48556:12;:19;;48263:314;;48658:12;48641:13;;:29;48637:43;;48672:8;;;48637:43;48215:641;;;48721:120;48777:14;;;;;;48773:2;48752:40;;48769:1;48752:40;;;;;;;;;;;;48836:3;48820:12;:19;;48721:120;;48215:641;48886:12;48870:13;:28;;;;47828:1082;;48920:60;48949:1;48953:2;48957:12;48971:8;48920:20;:60::i;:::-;47341:1647;47213:1775;;;;:::o;56302:159::-;;;;;:::o;57120:158::-;;;;;:::o;25421:224::-;25489:13;25552:1;25546:4;25539:15;25581:1;25575:4;25568:15;25622:4;25616;25606:21;25597:30;;25421:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1770:5;1801:6;1795:13;1786:22;;1817:30;1841:5;1817:30;:::i;:::-;1716:137;;;;:::o;1859:139::-;1905:5;1943:6;1930:20;1921:29;;1959:33;1986:5;1959:33;:::i;:::-;1859:139;;;;:::o;2004:137::-;2049:5;2087:6;2074:20;2065:29;;2103:32;2129:5;2103:32;:::i;:::-;2004:137;;;;:::o;2147:141::-;2203:5;2234:6;2228:13;2219:22;;2250:32;2276:5;2250:32;:::i;:::-;2147:141;;;;:::o;2307:338::-;2362:5;2411:3;2404:4;2396:6;2392:17;2388:27;2378:122;;2419:79;;:::i;:::-;2378:122;2536:6;2523:20;2561:78;2635:3;2627:6;2620:4;2612:6;2608:17;2561:78;:::i;:::-;2552:87;;2368:277;2307:338;;;;:::o;2665:340::-;2721:5;2770:3;2763:4;2755:6;2751:17;2747:27;2737:122;;2778:79;;:::i;:::-;2737:122;2895:6;2882:20;2920:79;2995:3;2987:6;2980:4;2972:6;2968:17;2920:79;:::i;:::-;2911:88;;2727:278;2665:340;;;;:::o;3011:139::-;3057:5;3095:6;3082:20;3073:29;;3111:33;3138:5;3111:33;:::i;:::-;3011:139;;;;:::o;3156:143::-;3213:5;3244:6;3238:13;3229:22;;3260:33;3287:5;3260:33;:::i;:::-;3156:143;;;;:::o;3305:329::-;3364:6;3413:2;3401:9;3392:7;3388:23;3384:32;3381:119;;;3419:79;;:::i;:::-;3381:119;3539:1;3564:53;3609:7;3600:6;3589:9;3585:22;3564:53;:::i;:::-;3554:63;;3510:117;3305:329;;;;:::o;3640:474::-;3708:6;3716;3765:2;3753:9;3744:7;3740:23;3736:32;3733:119;;;3771:79;;:::i;:::-;3733:119;3891:1;3916:53;3961:7;3952:6;3941:9;3937:22;3916:53;:::i;:::-;3906:63;;3862:117;4018:2;4044:53;4089:7;4080:6;4069:9;4065:22;4044:53;:::i;:::-;4034:63;;3989:118;3640:474;;;;;:::o;4120:619::-;4197:6;4205;4213;4262:2;4250:9;4241:7;4237:23;4233:32;4230:119;;;4268:79;;:::i;:::-;4230:119;4388:1;4413:53;4458:7;4449:6;4438:9;4434:22;4413:53;:::i;:::-;4403:63;;4359:117;4515:2;4541:53;4586:7;4577:6;4566:9;4562:22;4541:53;:::i;:::-;4531:63;;4486:118;4643:2;4669:53;4714:7;4705:6;4694:9;4690:22;4669:53;:::i;:::-;4659:63;;4614:118;4120:619;;;;;:::o;4745:943::-;4840:6;4848;4856;4864;4913:3;4901:9;4892:7;4888:23;4884:33;4881:120;;;4920:79;;:::i;:::-;4881:120;5040:1;5065:53;5110:7;5101:6;5090:9;5086:22;5065:53;:::i;:::-;5055:63;;5011:117;5167:2;5193:53;5238:7;5229:6;5218:9;5214:22;5193:53;:::i;:::-;5183:63;;5138:118;5295:2;5321:53;5366:7;5357:6;5346:9;5342:22;5321:53;:::i;:::-;5311:63;;5266:118;5451:2;5440:9;5436:18;5423:32;5482:18;5474:6;5471:30;5468:117;;;5504:79;;:::i;:::-;5468:117;5609:62;5663:7;5654:6;5643:9;5639:22;5609:62;:::i;:::-;5599:72;;5394:287;4745:943;;;;;;;:::o;5694:468::-;5759:6;5767;5816:2;5804:9;5795:7;5791:23;5787:32;5784:119;;;5822:79;;:::i;:::-;5784:119;5942:1;5967:53;6012:7;6003:6;5992:9;5988:22;5967:53;:::i;:::-;5957:63;;5913:117;6069:2;6095:50;6137:7;6128:6;6117:9;6113:22;6095:50;:::i;:::-;6085:60;;6040:115;5694:468;;;;;:::o;6168:474::-;6236:6;6244;6293:2;6281:9;6272:7;6268:23;6264:32;6261:119;;;6299:79;;:::i;:::-;6261:119;6419:1;6444:53;6489:7;6480:6;6469:9;6465:22;6444:53;:::i;:::-;6434:63;;6390:117;6546:2;6572:53;6617:7;6608:6;6597:9;6593:22;6572:53;:::i;:::-;6562:63;;6517:118;6168:474;;;;;:::o;6648:323::-;6704:6;6753:2;6741:9;6732:7;6728:23;6724:32;6721:119;;;6759:79;;:::i;:::-;6721:119;6879:1;6904:50;6946:7;6937:6;6926:9;6922:22;6904:50;:::i;:::-;6894:60;;6850:114;6648:323;;;;:::o;6977:345::-;7044:6;7093:2;7081:9;7072:7;7068:23;7064:32;7061:119;;;7099:79;;:::i;:::-;7061:119;7219:1;7244:61;7297:7;7288:6;7277:9;7273:22;7244:61;:::i;:::-;7234:71;;7190:125;6977:345;;;;:::o;7328:329::-;7387:6;7436:2;7424:9;7415:7;7411:23;7407:32;7404:119;;;7442:79;;:::i;:::-;7404:119;7562:1;7587:53;7632:7;7623:6;7612:9;7608:22;7587:53;:::i;:::-;7577:63;;7533:117;7328:329;;;;:::o;7663:327::-;7721:6;7770:2;7758:9;7749:7;7745:23;7741:32;7738:119;;;7776:79;;:::i;:::-;7738:119;7896:1;7921:52;7965:7;7956:6;7945:9;7941:22;7921:52;:::i;:::-;7911:62;;7867:116;7663:327;;;;:::o;7996:349::-;8065:6;8114:2;8102:9;8093:7;8089:23;8085:32;8082:119;;;8120:79;;:::i;:::-;8082:119;8240:1;8265:63;8320:7;8311:6;8300:9;8296:22;8265:63;:::i;:::-;8255:73;;8211:127;7996:349;;;;:::o;8351:509::-;8420:6;8469:2;8457:9;8448:7;8444:23;8440:32;8437:119;;;8475:79;;:::i;:::-;8437:119;8623:1;8612:9;8608:17;8595:31;8653:18;8645:6;8642:30;8639:117;;;8675:79;;:::i;:::-;8639:117;8780:63;8835:7;8826:6;8815:9;8811:22;8780:63;:::i;:::-;8770:73;;8566:287;8351:509;;;;:::o;8866:654::-;8944:6;8952;9001:2;8989:9;8980:7;8976:23;8972:32;8969:119;;;9007:79;;:::i;:::-;8969:119;9155:1;9144:9;9140:17;9127:31;9185:18;9177:6;9174:30;9171:117;;;9207:79;;:::i;:::-;9171:117;9312:63;9367:7;9358:6;9347:9;9343:22;9312:63;:::i;:::-;9302:73;;9098:287;9424:2;9450:53;9495:7;9486:6;9475:9;9471:22;9450:53;:::i;:::-;9440:63;;9395:118;8866:654;;;;;:::o;9526:329::-;9585:6;9634:2;9622:9;9613:7;9609:23;9605:32;9602:119;;;9640:79;;:::i;:::-;9602:119;9760:1;9785:53;9830:7;9821:6;9810:9;9806:22;9785:53;:::i;:::-;9775:63;;9731:117;9526:329;;;;:::o;9861:351::-;9931:6;9980:2;9968:9;9959:7;9955:23;9951:32;9948:119;;;9986:79;;:::i;:::-;9948:119;10106:1;10131:64;10187:7;10178:6;10167:9;10163:22;10131:64;:::i;:::-;10121:74;;10077:128;9861:351;;;;:::o;10218:704::-;10313:6;10321;10329;10378:2;10366:9;10357:7;10353:23;10349:32;10346:119;;;10384:79;;:::i;:::-;10346:119;10504:1;10529:53;10574:7;10565:6;10554:9;10550:22;10529:53;:::i;:::-;10519:63;;10475:117;10659:2;10648:9;10644:18;10631:32;10690:18;10682:6;10679:30;10676:117;;;10712:79;;:::i;:::-;10676:117;10825:80;10897:7;10888:6;10877:9;10873:22;10825:80;:::i;:::-;10807:98;;;;10602:313;10218:704;;;;;:::o;10928:654::-;11006:6;11014;11063:2;11051:9;11042:7;11038:23;11034:32;11031:119;;;11069:79;;:::i;:::-;11031:119;11189:1;11214:53;11259:7;11250:6;11239:9;11235:22;11214:53;:::i;:::-;11204:63;;11160:117;11344:2;11333:9;11329:18;11316:32;11375:18;11367:6;11364:30;11361:117;;;11397:79;;:::i;:::-;11361:117;11502:63;11557:7;11548:6;11537:9;11533:22;11502:63;:::i;:::-;11492:73;;11287:288;10928:654;;;;;:::o;11588:179::-;11657:10;11678:46;11720:3;11712:6;11678:46;:::i;:::-;11756:4;11751:3;11747:14;11733:28;;11588:179;;;;:::o;11773:118::-;11860:24;11878:5;11860:24;:::i;:::-;11855:3;11848:37;11773:118;;:::o;11897:157::-;12002:45;12022:24;12040:5;12022:24;:::i;:::-;12002:45;:::i;:::-;11997:3;11990:58;11897:157;;:::o;12090:732::-;12209:3;12238:54;12286:5;12238:54;:::i;:::-;12308:86;12387:6;12382:3;12308:86;:::i;:::-;12301:93;;12418:56;12468:5;12418:56;:::i;:::-;12497:7;12528:1;12513:284;12538:6;12535:1;12532:13;12513:284;;;12614:6;12608:13;12641:63;12700:3;12685:13;12641:63;:::i;:::-;12634:70;;12727:60;12780:6;12727:60;:::i;:::-;12717:70;;12573:224;12560:1;12557;12553:9;12548:14;;12513:284;;;12517:14;12813:3;12806:10;;12214:608;;;12090:732;;;;:::o;12828:109::-;12909:21;12924:5;12909:21;:::i;:::-;12904:3;12897:34;12828:109;;:::o;12943:118::-;13030:24;13048:5;13030:24;:::i;:::-;13025:3;13018:37;12943:118;;:::o;13067:360::-;13153:3;13181:38;13213:5;13181:38;:::i;:::-;13235:70;13298:6;13293:3;13235:70;:::i;:::-;13228:77;;13314:52;13359:6;13354:3;13347:4;13340:5;13336:16;13314:52;:::i;:::-;13391:29;13413:6;13391:29;:::i;:::-;13386:3;13382:39;13375:46;;13157:270;13067:360;;;;:::o;13433:193::-;13551:68;13613:5;13551:68;:::i;:::-;13546:3;13539:81;13433:193;;:::o;13632:364::-;13720:3;13748:39;13781:5;13748:39;:::i;:::-;13803:71;13867:6;13862:3;13803:71;:::i;:::-;13796:78;;13883:52;13928:6;13923:3;13916:4;13909:5;13905:16;13883:52;:::i;:::-;13960:29;13982:6;13960:29;:::i;:::-;13955:3;13951:39;13944:46;;13724:272;13632:364;;;;:::o;14002:377::-;14108:3;14136:39;14169:5;14136:39;:::i;:::-;14191:89;14273:6;14268:3;14191:89;:::i;:::-;14184:96;;14289:52;14334:6;14329:3;14322:4;14315:5;14311:16;14289:52;:::i;:::-;14366:6;14361:3;14357:16;14350:23;;14112:267;14002:377;;;;:::o;14385:366::-;14527:3;14548:67;14612:2;14607:3;14548:67;:::i;:::-;14541:74;;14624:93;14713:3;14624:93;:::i;:::-;14742:2;14737:3;14733:12;14726:19;;14385:366;;;:::o;14757:::-;14899:3;14920:67;14984:2;14979:3;14920:67;:::i;:::-;14913:74;;14996:93;15085:3;14996:93;:::i;:::-;15114:2;15109:3;15105:12;15098:19;;14757:366;;;:::o;15129:::-;15271:3;15292:67;15356:2;15351:3;15292:67;:::i;:::-;15285:74;;15368:93;15457:3;15368:93;:::i;:::-;15486:2;15481:3;15477:12;15470:19;;15129:366;;;:::o;15501:::-;15643:3;15664:67;15728:2;15723:3;15664:67;:::i;:::-;15657:74;;15740:93;15829:3;15740:93;:::i;:::-;15858:2;15853:3;15849:12;15842:19;;15501:366;;;:::o;15873:::-;16015:3;16036:67;16100:2;16095:3;16036:67;:::i;:::-;16029:74;;16112:93;16201:3;16112:93;:::i;:::-;16230:2;16225:3;16221:12;16214:19;;15873:366;;;:::o;16245:::-;16387:3;16408:67;16472:2;16467:3;16408:67;:::i;:::-;16401:74;;16484:93;16573:3;16484:93;:::i;:::-;16602:2;16597:3;16593:12;16586:19;;16245:366;;;:::o;16617:::-;16759:3;16780:67;16844:2;16839:3;16780:67;:::i;:::-;16773:74;;16856:93;16945:3;16856:93;:::i;:::-;16974:2;16969:3;16965:12;16958:19;;16617:366;;;:::o;16989:::-;17131:3;17152:67;17216:2;17211:3;17152:67;:::i;:::-;17145:74;;17228:93;17317:3;17228:93;:::i;:::-;17346:2;17341:3;17337:12;17330:19;;16989:366;;;:::o;17361:::-;17503:3;17524:67;17588:2;17583:3;17524:67;:::i;:::-;17517:74;;17600:93;17689:3;17600:93;:::i;:::-;17718:2;17713:3;17709:12;17702:19;;17361:366;;;:::o;17733:::-;17875:3;17896:67;17960:2;17955:3;17896:67;:::i;:::-;17889:74;;17972:93;18061:3;17972:93;:::i;:::-;18090:2;18085:3;18081:12;18074:19;;17733:366;;;:::o;18105:::-;18247:3;18268:67;18332:2;18327:3;18268:67;:::i;:::-;18261:74;;18344:93;18433:3;18344:93;:::i;:::-;18462:2;18457:3;18453:12;18446:19;;18105:366;;;:::o;18477:::-;18619:3;18640:67;18704:2;18699:3;18640:67;:::i;:::-;18633:74;;18716:93;18805:3;18716:93;:::i;:::-;18834:2;18829:3;18825:12;18818:19;;18477:366;;;:::o;18849:::-;18991:3;19012:67;19076:2;19071:3;19012:67;:::i;:::-;19005:74;;19088:93;19177:3;19088:93;:::i;:::-;19206:2;19201:3;19197:12;19190:19;;18849:366;;;:::o;19221:398::-;19380:3;19401:83;19482:1;19477:3;19401:83;:::i;:::-;19394:90;;19493:93;19582:3;19493:93;:::i;:::-;19611:1;19606:3;19602:11;19595:18;;19221:398;;;:::o;19625:366::-;19767:3;19788:67;19852:2;19847:3;19788:67;:::i;:::-;19781:74;;19864:93;19953:3;19864:93;:::i;:::-;19982:2;19977:3;19973:12;19966:19;;19625:366;;;:::o;19997:::-;20139:3;20160:67;20224:2;20219:3;20160:67;:::i;:::-;20153:74;;20236:93;20325:3;20236:93;:::i;:::-;20354:2;20349:3;20345:12;20338:19;;19997:366;;;:::o;20369:::-;20511:3;20532:67;20596:2;20591:3;20532:67;:::i;:::-;20525:74;;20608:93;20697:3;20608:93;:::i;:::-;20726:2;20721:3;20717:12;20710:19;;20369:366;;;:::o;20741:::-;20883:3;20904:67;20968:2;20963:3;20904:67;:::i;:::-;20897:74;;20980:93;21069:3;20980:93;:::i;:::-;21098:2;21093:3;21089:12;21082:19;;20741:366;;;:::o;21113:::-;21255:3;21276:67;21340:2;21335:3;21276:67;:::i;:::-;21269:74;;21352:93;21441:3;21352:93;:::i;:::-;21470:2;21465:3;21461:12;21454:19;;21113:366;;;:::o;21485:108::-;21562:24;21580:5;21562:24;:::i;:::-;21557:3;21550:37;21485:108;;:::o;21599:118::-;21686:24;21704:5;21686:24;:::i;:::-;21681:3;21674:37;21599:118;;:::o;21723:256::-;21835:3;21850:75;21921:3;21912:6;21850:75;:::i;:::-;21950:2;21945:3;21941:12;21934:19;;21970:3;21963:10;;21723:256;;;;:::o;21985:275::-;22117:3;22139:95;22230:3;22221:6;22139:95;:::i;:::-;22132:102;;22251:3;22244:10;;21985:275;;;;:::o;22266:435::-;22446:3;22468:95;22559:3;22550:6;22468:95;:::i;:::-;22461:102;;22580:95;22671:3;22662:6;22580:95;:::i;:::-;22573:102;;22692:3;22685:10;;22266:435;;;;;:::o;22707:379::-;22891:3;22913:147;23056:3;22913:147;:::i;:::-;22906:154;;23077:3;23070:10;;22707:379;;;:::o;23092:222::-;23185:4;23223:2;23212:9;23208:18;23200:26;;23236:71;23304:1;23293:9;23289:17;23280:6;23236:71;:::i;:::-;23092:222;;;;:::o;23320:332::-;23441:4;23479:2;23468:9;23464:18;23456:26;;23492:71;23560:1;23549:9;23545:17;23536:6;23492:71;:::i;:::-;23573:72;23641:2;23630:9;23626:18;23617:6;23573:72;:::i;:::-;23320:332;;;;;:::o;23658:442::-;23807:4;23845:2;23834:9;23830:18;23822:26;;23858:71;23926:1;23915:9;23911:17;23902:6;23858:71;:::i;:::-;23939:72;24007:2;23996:9;23992:18;23983:6;23939:72;:::i;:::-;24021;24089:2;24078:9;24074:18;24065:6;24021:72;:::i;:::-;23658:442;;;;;;:::o;24106:640::-;24301:4;24339:3;24328:9;24324:19;24316:27;;24353:71;24421:1;24410:9;24406:17;24397:6;24353:71;:::i;:::-;24434:72;24502:2;24491:9;24487:18;24478:6;24434:72;:::i;:::-;24516;24584:2;24573:9;24569:18;24560:6;24516:72;:::i;:::-;24635:9;24629:4;24625:20;24620:2;24609:9;24605:18;24598:48;24663:76;24734:4;24725:6;24663:76;:::i;:::-;24655:84;;24106:640;;;;;;;:::o;24752:373::-;24895:4;24933:2;24922:9;24918:18;24910:26;;24982:9;24976:4;24972:20;24968:1;24957:9;24953:17;24946:47;25010:108;25113:4;25104:6;25010:108;:::i;:::-;25002:116;;24752:373;;;;:::o;25131:210::-;25218:4;25256:2;25245:9;25241:18;25233:26;;25269:65;25331:1;25320:9;25316:17;25307:6;25269:65;:::i;:::-;25131:210;;;;:::o;25347:222::-;25440:4;25478:2;25467:9;25463:18;25455:26;;25491:71;25559:1;25548:9;25544:17;25535:6;25491:71;:::i;:::-;25347:222;;;;:::o;25575:284::-;25699:4;25737:2;25726:9;25722:18;25714:26;;25750:102;25849:1;25838:9;25834:17;25825:6;25750:102;:::i;:::-;25575:284;;;;:::o;25865:313::-;25978:4;26016:2;26005:9;26001:18;25993:26;;26065:9;26059:4;26055:20;26051:1;26040:9;26036:17;26029:47;26093:78;26166:4;26157:6;26093:78;:::i;:::-;26085:86;;25865:313;;;;:::o;26184:419::-;26350:4;26388:2;26377:9;26373:18;26365:26;;26437:9;26431:4;26427:20;26423:1;26412:9;26408:17;26401:47;26465:131;26591:4;26465:131;:::i;:::-;26457:139;;26184:419;;;:::o;26609:::-;26775:4;26813:2;26802:9;26798:18;26790:26;;26862:9;26856:4;26852:20;26848:1;26837:9;26833:17;26826:47;26890:131;27016:4;26890:131;:::i;:::-;26882:139;;26609:419;;;:::o;27034:::-;27200:4;27238:2;27227:9;27223:18;27215:26;;27287:9;27281:4;27277:20;27273:1;27262:9;27258:17;27251:47;27315:131;27441:4;27315:131;:::i;:::-;27307:139;;27034:419;;;:::o;27459:::-;27625:4;27663:2;27652:9;27648:18;27640:26;;27712:9;27706:4;27702:20;27698:1;27687:9;27683:17;27676:47;27740:131;27866:4;27740:131;:::i;:::-;27732:139;;27459:419;;;:::o;27884:::-;28050:4;28088:2;28077:9;28073:18;28065:26;;28137:9;28131:4;28127:20;28123:1;28112:9;28108:17;28101:47;28165:131;28291:4;28165:131;:::i;:::-;28157:139;;27884:419;;;:::o;28309:::-;28475:4;28513:2;28502:9;28498:18;28490:26;;28562:9;28556:4;28552:20;28548:1;28537:9;28533:17;28526:47;28590:131;28716:4;28590:131;:::i;:::-;28582:139;;28309:419;;;:::o;28734:::-;28900:4;28938:2;28927:9;28923:18;28915:26;;28987:9;28981:4;28977:20;28973:1;28962:9;28958:17;28951:47;29015:131;29141:4;29015:131;:::i;:::-;29007:139;;28734:419;;;:::o;29159:::-;29325:4;29363:2;29352:9;29348:18;29340:26;;29412:9;29406:4;29402:20;29398:1;29387:9;29383:17;29376:47;29440:131;29566:4;29440:131;:::i;:::-;29432:139;;29159:419;;;:::o;29584:::-;29750:4;29788:2;29777:9;29773:18;29765:26;;29837:9;29831:4;29827:20;29823:1;29812:9;29808:17;29801:47;29865:131;29991:4;29865:131;:::i;:::-;29857:139;;29584:419;;;:::o;30009:::-;30175:4;30213:2;30202:9;30198:18;30190:26;;30262:9;30256:4;30252:20;30248:1;30237:9;30233:17;30226:47;30290:131;30416:4;30290:131;:::i;:::-;30282:139;;30009:419;;;:::o;30434:::-;30600:4;30638:2;30627:9;30623:18;30615:26;;30687:9;30681:4;30677:20;30673:1;30662:9;30658:17;30651:47;30715:131;30841:4;30715:131;:::i;:::-;30707:139;;30434:419;;;:::o;30859:::-;31025:4;31063:2;31052:9;31048:18;31040:26;;31112:9;31106:4;31102:20;31098:1;31087:9;31083:17;31076:47;31140:131;31266:4;31140:131;:::i;:::-;31132:139;;30859:419;;;:::o;31284:::-;31450:4;31488:2;31477:9;31473:18;31465:26;;31537:9;31531:4;31527:20;31523:1;31512:9;31508:17;31501:47;31565:131;31691:4;31565:131;:::i;:::-;31557:139;;31284:419;;;:::o;31709:::-;31875:4;31913:2;31902:9;31898:18;31890:26;;31962:9;31956:4;31952:20;31948:1;31937:9;31933:17;31926:47;31990:131;32116:4;31990:131;:::i;:::-;31982:139;;31709:419;;;:::o;32134:::-;32300:4;32338:2;32327:9;32323:18;32315:26;;32387:9;32381:4;32377:20;32373:1;32362:9;32358:17;32351:47;32415:131;32541:4;32415:131;:::i;:::-;32407:139;;32134:419;;;:::o;32559:::-;32725:4;32763:2;32752:9;32748:18;32740:26;;32812:9;32806:4;32802:20;32798:1;32787:9;32783:17;32776:47;32840:131;32966:4;32840:131;:::i;:::-;32832:139;;32559:419;;;:::o;32984:::-;33150:4;33188:2;33177:9;33173:18;33165:26;;33237:9;33231:4;33227:20;33223:1;33212:9;33208:17;33201:47;33265:131;33391:4;33265:131;:::i;:::-;33257:139;;32984:419;;;:::o;33409:::-;33575:4;33613:2;33602:9;33598:18;33590:26;;33662:9;33656:4;33652:20;33648:1;33637:9;33633:17;33626:47;33690:131;33816:4;33690:131;:::i;:::-;33682:139;;33409:419;;;:::o;33834:222::-;33927:4;33965:2;33954:9;33950:18;33942:26;;33978:71;34046:1;34035:9;34031:17;34022:6;33978:71;:::i;:::-;33834:222;;;;:::o;34062:129::-;34096:6;34123:20;;:::i;:::-;34113:30;;34152:33;34180:4;34172:6;34152:33;:::i;:::-;34062:129;;;:::o;34197:75::-;34230:6;34263:2;34257:9;34247:19;;34197:75;:::o;34278:307::-;34339:4;34429:18;34421:6;34418:30;34415:56;;;34451:18;;:::i;:::-;34415:56;34489:29;34511:6;34489:29;:::i;:::-;34481:37;;34573:4;34567;34563:15;34555:23;;34278:307;;;:::o;34591:308::-;34653:4;34743:18;34735:6;34732:30;34729:56;;;34765:18;;:::i;:::-;34729:56;34803:29;34825:6;34803:29;:::i;:::-;34795:37;;34887:4;34881;34877:15;34869:23;;34591:308;;;:::o;34905:132::-;34972:4;34995:3;34987:11;;35025:4;35020:3;35016:14;35008:22;;34905:132;;;:::o;35043:114::-;35110:6;35144:5;35138:12;35128:22;;35043:114;;;:::o;35163:98::-;35214:6;35248:5;35242:12;35232:22;;35163:98;;;:::o;35267:99::-;35319:6;35353:5;35347:12;35337:22;;35267:99;;;:::o;35372:113::-;35442:4;35474;35469:3;35465:14;35457:22;;35372:113;;;:::o;35491:184::-;35590:11;35624:6;35619:3;35612:19;35664:4;35659:3;35655:14;35640:29;;35491:184;;;;:::o;35681:168::-;35764:11;35798:6;35793:3;35786:19;35838:4;35833:3;35829:14;35814:29;;35681:168;;;;:::o;35855:147::-;35956:11;35993:3;35978:18;;35855:147;;;;:::o;36008:169::-;36092:11;36126:6;36121:3;36114:19;36166:4;36161:3;36157:14;36142:29;;36008:169;;;;:::o;36183:148::-;36285:11;36322:3;36307:18;;36183:148;;;;:::o;36337:305::-;36377:3;36396:20;36414:1;36396:20;:::i;:::-;36391:25;;36430:20;36448:1;36430:20;:::i;:::-;36425:25;;36584:1;36516:66;36512:74;36509:1;36506:81;36503:107;;;36590:18;;:::i;:::-;36503:107;36634:1;36631;36627:9;36620:16;;36337:305;;;;:::o;36648:185::-;36688:1;36705:20;36723:1;36705:20;:::i;:::-;36700:25;;36739:20;36757:1;36739:20;:::i;:::-;36734:25;;36778:1;36768:35;;36783:18;;:::i;:::-;36768:35;36825:1;36822;36818:9;36813:14;;36648:185;;;;:::o;36839:348::-;36879:7;36902:20;36920:1;36902:20;:::i;:::-;36897:25;;36936:20;36954:1;36936:20;:::i;:::-;36931:25;;37124:1;37056:66;37052:74;37049:1;37046:81;37041:1;37034:9;37027:17;37023:105;37020:131;;;37131:18;;:::i;:::-;37020:131;37179:1;37176;37172:9;37161:20;;36839:348;;;;:::o;37193:191::-;37233:4;37253:20;37271:1;37253:20;:::i;:::-;37248:25;;37287:20;37305:1;37287:20;:::i;:::-;37282:25;;37326:1;37323;37320:8;37317:34;;;37331:18;;:::i;:::-;37317:34;37376:1;37373;37369:9;37361:17;;37193:191;;;;:::o;37390:96::-;37427:7;37456:24;37474:5;37456:24;:::i;:::-;37445:35;;37390:96;;;:::o;37492:90::-;37526:7;37569:5;37562:13;37555:21;37544:32;;37492:90;;;:::o;37588:77::-;37625:7;37654:5;37643:16;;37588:77;;;:::o;37671:149::-;37707:7;37747:66;37740:5;37736:78;37725:89;;37671:149;;;:::o;37826:126::-;37863:7;37903:42;37896:5;37892:54;37881:65;;37826:126;;;:::o;37958:77::-;37995:7;38024:5;38013:16;;37958:77;;;:::o;38041:157::-;38122:9;38155:37;38186:5;38155:37;:::i;:::-;38142:50;;38041:157;;;:::o;38204:126::-;38254:9;38287:37;38318:5;38287:37;:::i;:::-;38274:50;;38204:126;;;:::o;38336:113::-;38386:9;38419:24;38437:5;38419:24;:::i;:::-;38406:37;;38336:113;;;:::o;38455:154::-;38539:6;38534:3;38529;38516:30;38601:1;38592:6;38587:3;38583:16;38576:27;38455:154;;;:::o;38615:307::-;38683:1;38693:113;38707:6;38704:1;38701:13;38693:113;;;38792:1;38787:3;38783:11;38777:18;38773:1;38768:3;38764:11;38757:39;38729:2;38726:1;38722:10;38717:15;;38693:113;;;38824:6;38821:1;38818:13;38815:101;;;38904:1;38895:6;38890:3;38886:16;38879:27;38815:101;38664:258;38615:307;;;:::o;38928:320::-;38972:6;39009:1;39003:4;38999:12;38989:22;;39056:1;39050:4;39046:12;39077:18;39067:81;;39133:4;39125:6;39121:17;39111:27;;39067:81;39195:2;39187:6;39184:14;39164:18;39161:38;39158:84;;;39214:18;;:::i;:::-;39158:84;38979:269;38928:320;;;:::o;39254:281::-;39337:27;39359:4;39337:27;:::i;:::-;39329:6;39325:40;39467:6;39455:10;39452:22;39431:18;39419:10;39416:34;39413:62;39410:88;;;39478:18;;:::i;:::-;39410:88;39518:10;39514:2;39507:22;39297:238;39254:281;;:::o;39541:233::-;39580:3;39603:24;39621:5;39603:24;:::i;:::-;39594:33;;39649:66;39642:5;39639:77;39636:103;;;39719:18;;:::i;:::-;39636:103;39766:1;39759:5;39755:13;39748:20;;39541:233;;;:::o;39780:100::-;39819:7;39848:26;39868:5;39848:26;:::i;:::-;39837:37;;39780:100;;;:::o;39886:94::-;39925:7;39954:20;39968:5;39954:20;:::i;:::-;39943:31;;39886:94;;;:::o;39986:176::-;40018:1;40035:20;40053:1;40035:20;:::i;:::-;40030:25;;40069:20;40087:1;40069:20;:::i;:::-;40064:25;;40108:1;40098:35;;40113:18;;:::i;:::-;40098:35;40154:1;40151;40147:9;40142:14;;39986:176;;;;:::o;40168:180::-;40216:77;40213:1;40206:88;40313:4;40310:1;40303:15;40337:4;40334:1;40327:15;40354:180;40402:77;40399:1;40392:88;40499:4;40496:1;40489:15;40523:4;40520:1;40513:15;40540:180;40588:77;40585:1;40578:88;40685:4;40682:1;40675:15;40709:4;40706:1;40699:15;40726:180;40774:77;40771:1;40764:88;40871:4;40868:1;40861:15;40895:4;40892:1;40885:15;40912:180;40960:77;40957:1;40950:88;41057:4;41054:1;41047:15;41081:4;41078:1;41071:15;41098:117;41207:1;41204;41197:12;41221:117;41330:1;41327;41320:12;41344:117;41453:1;41450;41443:12;41467:117;41576:1;41573;41566:12;41590:117;41699:1;41696;41689:12;41713:117;41822:1;41819;41812:12;41836:102;41877:6;41928:2;41924:7;41919:2;41912:5;41908:14;41904:28;41894:38;;41836:102;;;:::o;41944:94::-;41977:8;42025:5;42021:2;42017:14;41996:35;;41944:94;;;:::o;42044:221::-;42184:34;42180:1;42172:6;42168:14;42161:58;42253:4;42248:2;42240:6;42236:15;42229:29;42044:221;:::o;42271:225::-;42411:34;42407:1;42399:6;42395:14;42388:58;42480:8;42475:2;42467:6;42463:15;42456:33;42271:225;:::o;42502:220::-;42642:34;42638:1;42630:6;42626:14;42619:58;42711:3;42706:2;42698:6;42694:15;42687:28;42502:220;:::o;42728:173::-;42868:25;42864:1;42856:6;42852:14;42845:49;42728:173;:::o;42907:235::-;43047:34;43043:1;43035:6;43031:14;43024:58;43116:18;43111:2;43103:6;43099:15;43092:43;42907:235;:::o;43148:173::-;43288:25;43284:1;43276:6;43272:14;43265:49;43148:173;:::o;43327:182::-;43467:34;43463:1;43455:6;43451:14;43444:58;43327:182;:::o;43515:222::-;43655:34;43651:1;43643:6;43639:14;43632:58;43724:5;43719:2;43711:6;43707:15;43700:30;43515:222;:::o;43743:180::-;43883:32;43879:1;43871:6;43867:14;43860:56;43743:180;:::o;43929:178::-;44069:30;44065:1;44057:6;44053:14;44046:54;43929:178;:::o;44113:165::-;44253:17;44249:1;44241:6;44237:14;44230:41;44113:165;:::o;44284:182::-;44424:34;44420:1;44412:6;44408:14;44401:58;44284:182;:::o;44472:167::-;44612:19;44608:1;44600:6;44596:14;44589:43;44472:167;:::o;44645:114::-;;:::o;44765:166::-;44905:18;44901:1;44893:6;44889:14;44882:42;44765:166;:::o;44937:172::-;45077:24;45073:1;45065:6;45061:14;45054:48;44937:172;:::o;45115:225::-;45255:34;45251:1;45243:6;45239:14;45232:58;45324:8;45319:2;45311:6;45307:15;45300:33;45115:225;:::o;45346:233::-;45486:34;45482:1;45474:6;45470:14;45463:58;45555:16;45550:2;45542:6;45538:15;45531:41;45346:233;:::o;45585:170::-;45725:22;45721:1;45713:6;45709:14;45702:46;45585:170;:::o;45761:122::-;45834:24;45852:5;45834:24;:::i;:::-;45827:5;45824:35;45814:63;;45873:1;45870;45863:12;45814:63;45761:122;:::o;45889:116::-;45959:21;45974:5;45959:21;:::i;:::-;45952:5;45949:32;45939:60;;45995:1;45992;45985:12;45939:60;45889:116;:::o;46011:122::-;46084:24;46102:5;46084:24;:::i;:::-;46077:5;46074:35;46064:63;;46123:1;46120;46113:12;46064:63;46011:122;:::o;46139:120::-;46211:23;46228:5;46211:23;:::i;:::-;46204:5;46201:34;46191:62;;46249:1;46246;46239:12;46191:62;46139:120;:::o;46265:122::-;46338:24;46356:5;46338:24;:::i;:::-;46331:5;46328:35;46318:63;;46377:1;46374;46367:12;46318:63;46265:122;:::o

Swarm Source

ipfs://798ed420d7889b97bc3a0f1f88f151302ac1a6af2aeb8d99a21dbc63556cdf19
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.