ETH Price: $3,105.71 (-1.70%)

Token

META ALL-STARS ()
 

Overview

Max Total Supply

207

Holders

180

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x57fD566F5a9cCfb885944cA3048c066467fa62ac
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:
TeamSHINJO2023

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-08
*/

/**
 *Submitted for verification at Etherscan.io on 2022-03-17
*/

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

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

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

// File: ERC1155.sol


pragma solidity ^0.8.4;








contract TeamSHINJO2023 is ERC1155, ERC1155Supply, ERC1155Burnable, AccessControl, Pausable, Ownable {
    bytes32 public constant URI_SETTER_ROLE = keccak256("URI_SETTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    // Token name to secure the compatilibity with ERC721)
    string private _name = "META ALL-STARS";

    // Token URIs (tokenId => tokenURI)
    // URI should be full-length including prefix and suffix (https://example.com/xxxx.json)
    mapping(uint256 => string) private _tokenURIs;

    string base;

    constructor(string memory base_) ERC1155("") {
        _grantRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _grantRole(URI_SETTER_ROLE, _msgSender());
        _grantRole(PAUSER_ROLE, _msgSender());
        _grantRole(MINTER_ROLE, _msgSender());

        base = base_;
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        require(totalSupply(tokenId) != 0, "URI query for nonexistent token");

        // iIf there is no base URI, return the raw token URI;
        if (bytes(base).length == 0) {
            return _tokenURIs[tokenId];
        }

        // else: Concatenate the base and tokenURI
        return string(abi.encodePacked(base, _tokenURIs[tokenId]));
    }

    function setBase(string memory base_) public onlyRole(URI_SETTER_ROLE) {
        base = base_;
    }

    function setURI(uint256 tokenId, string memory _uri) public onlyRole(URI_SETTER_ROLE) {
        require(totalSupply(tokenId) != 0, "URI set of nonexistent token");

        _tokenURIs[tokenId] = _uri;
    }

    function setURIBatch(uint256[] memory tokenIds, string[] memory _uris) public onlyRole(URI_SETTER_ROLE) {
        require(tokenIds.length == _uris.length, "tokenIds and uris length mismatch");

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(totalSupply(tokenIds[i]) != 0, "URI set of nonexistent token");
            _tokenURIs[tokenIds[i]] = _uris[i];
        }
    }

    function name() public view virtual returns (string memory) {
        return _name;
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function mint(address account, uint256 id, uint256 amount, bytes memory data)
        public
        onlyRole(MINTER_ROLE)
    {
        _mint(account, id, amount, data);
    }

    function mintBatch(address[] memory tos, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        public
        onlyRole(MINTER_ROLE)
    {
        require(tos.length == ids.length, "length mismatch");
        require(tos.length == amounts.length, "length mismatch");

        for (uint256 i = 0; i < tos.length; i++) {
            _mint(tos[i], ids[i], amounts[i], data);
        }
    }

    function mintWithURI(address account_, uint256 id_, uint256 amount_, bytes memory data_, string memory uri_)
        public
        onlyRole(MINTER_ROLE)
    {
        _mint(account_, id_, amount_, data_);
        setURI(id_, uri_);
    }

    function mintWithURIBatch(address[] memory tos, uint256[] memory ids, uint256[] memory amounts, bytes memory data, string[] memory uris)
        public
        onlyRole(MINTER_ROLE)
    {
        require(tos.length == ids.length, "length mismatch");
        require(tos.length == amounts.length, "length mismatch");
        require(tos.length == uris.length, "length mismatch");

        for (uint256 i = 0; i < tos.length; i++) {
            mintWithURI(tos[i], ids[i], amounts[i], data, uris[i]);
        }
    }

    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        internal
        whenNotPaused
        override(ERC1155, ERC1155Supply)
    {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    // The following functions are overrides required by Solidity.

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC1155, AccessControl)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"base_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URI_SETTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"},{"internalType":"string","name":"uri_","type":"string"}],"name":"mintWithURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"mintWithURIBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"base_","type":"string"}],"name":"setBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"_uris","type":"string[]"}],"name":"setURIBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600e81526020017f4d45544120414c4c2d5354415253000000000000000000000000000000000000815250600690816200004a919062000695565b503480156200005857600080fd5b50604051620061e3380380620061e383398181016040528101906200007e9190620008e0565b604051806020016040528060008152506200009f81620001db60201b60201c565b506000600560006101000a81548160ff021916908315150217905550620000db620000cf620001f060201b60201c565b620001f860201b60201c565b620000ff6000801b620000f3620001f060201b60201c565b620002be60201b60201c565b620001407f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c62000134620001f060201b60201c565b620002be60201b60201c565b620001817f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a62000175620001f060201b60201c565b620002be60201b60201c565b620001c27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001b6620001f060201b60201c565b620002be60201b60201c565b8060089081620001d3919062000695565b505062000931565b8060029081620001ec919062000695565b5050565b600033905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d08282620003b060201b60201c565b620003ac5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000351620001f060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049d57607f821691505b602082108103620004b357620004b262000455565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200051d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004de565b620005298683620004de565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000576620005706200056a8462000541565b6200054b565b62000541565b9050919050565b6000819050919050565b620005928362000555565b620005aa620005a1826200057d565b848454620004eb565b825550505050565b600090565b620005c1620005b2565b620005ce81848462000587565b505050565b5b81811015620005f657620005ea600082620005b7565b600181019050620005d4565b5050565b601f82111562000645576200060f81620004b9565b6200061a84620004ce565b810160208510156200062a578190505b620006426200063985620004ce565b830182620005d3565b50505b505050565b600082821c905092915050565b60006200066a600019846008026200064a565b1980831691505092915050565b600062000685838362000657565b9150826002028217905092915050565b620006a0826200041b565b67ffffffffffffffff811115620006bc57620006bb62000426565b5b620006c8825462000484565b620006d5828285620005fa565b600060209050601f8311600181146200070d5760008415620006f8578287015190505b62000704858262000677565b86555062000774565b601f1984166200071d86620004b9565b60005b82811015620007475784890151825560018201915060208501945060208101905062000720565b8683101562000767578489015162000763601f89168262000657565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620007b6826200079a565b810181811067ffffffffffffffff82111715620007d857620007d762000426565b5b80604052505050565b6000620007ed6200077c565b9050620007fb8282620007ab565b919050565b600067ffffffffffffffff8211156200081e576200081d62000426565b5b62000829826200079a565b9050602081019050919050565b60005b838110156200085657808201518184015260208101905062000839565b60008484015250505050565b600062000879620008738462000800565b620007e1565b90508281526020810184848401111562000898576200089762000795565b5b620008a584828562000836565b509392505050565b600082601f830112620008c557620008c462000790565b5b8151620008d784826020860162000862565b91505092915050565b600060208284031215620008f957620008f862000786565b5b600082015167ffffffffffffffff8111156200091a57620009196200078b565b5b6200092884828501620008ad565b91505092915050565b6158a280620009416000396000f3fe608060405234801561001057600080fd5b50600436106102105760003560e01c8063731133e911610125578063d3208b0a116100ad578063e985e9c51161007c578063e985e9c5146105d5578063ef5ce9e114610605578063f242432a14610621578063f2fde38b1461063d578063f5298aca1461065957610210565b8063d3208b0a14610561578063d53913931461057d578063d547741f1461059b578063e63ab1e9146105b757610210565b80638da5cb5b116100f45780638da5cb5b146104a957806391d14854146104c7578063a217fddf146104f7578063a22cb46514610515578063bd85b0391461053157610210565b8063731133e9146104495780637f345710146104655780638456cb5914610483578063862440e21461048d57610210565b80632f2ff15d116101a85780634f558e79116101775780634f558e79146103b95780635c975abb146103e9578063664aa26b146104075780636b20c45414610423578063715018a61461043f57610210565b80632f2ff15d1461034757806336568abe146103635780633f4ba83a1461037f5780634e1273f41461038957610210565b80630e89341c116101e45780630e89341c146102af57806313fbdd5a146102df578063248a9ca3146102fb5780632eb2c2d61461032b57610210565b8062fdd58e1461021557806301b98ea01461024557806301ffc9a71461026157806306fdde0314610291575b600080fd5b61022f600480360381019061022a91906133f1565b610675565b60405161023c9190613440565b60405180910390f35b61025f600480360381019061025a919061374a565b61073d565b005b61027b6004803603810190610276919061381a565b610892565b6040516102889190613862565b60405180910390f35b6102996108a4565b6040516102a691906138fc565b60405180910390f35b6102c960048036038101906102c4919061391e565b610936565b6040516102d691906138fc565b60405180910390f35b6102f960048036038101906102f491906139ec565b610a79565b005b61031560048036038101906103109190613ad5565b610ac9565b6040516103229190613b11565b60405180910390f35b61034560048036038101906103409190613b2c565b610ae9565b005b610361600480360381019061035c9190613bfb565b610b8a565b005b61037d60048036038101906103789190613bfb565b610bb3565b005b610387610c36565b005b6103a3600480360381019061039e9190613cfe565b610c73565b6040516103b09190613e34565b60405180910390f35b6103d360048036038101906103ce919061391e565b610d8c565b6040516103e09190613862565b60405180910390f35b6103f1610da0565b6040516103fe9190613862565b60405180910390f35b610421600480360381019061041c9190613e56565b610db7565b005b61043d60048036038101906104389190613e9f565b610dfd565b005b610447610e9a565b005b610463600480360381019061045e9190613f2a565b610f22565b005b61046d610f67565b60405161047a9190613b11565b60405180910390f35b61048b610f8b565b005b6104a760048036038101906104a29190613fad565b610fc8565b005b6104b161106b565b6040516104be9190614018565b60405180910390f35b6104e160048036038101906104dc9190613bfb565b611095565b6040516104ee9190613862565b60405180910390f35b6104ff611100565b60405161050c9190613b11565b60405180910390f35b61052f600480360381019061052a919061405f565b611107565b005b61054b6004803603810190610546919061391e565b61111d565b6040516105589190613440565b60405180910390f35b61057b6004803603810190610576919061409f565b61113a565b005b610585611275565b6040516105929190613b11565b60405180910390f35b6105b560048036038101906105b09190613bfb565b611299565b005b6105bf6112c2565b6040516105cc9190613b11565b60405180910390f35b6105ef60048036038101906105ea9190614176565b6112e6565b6040516105fc9190613862565b60405180910390f35b61061f600480360381019061061a91906141b6565b61137a565b005b61063b600480360381019061063691906142bd565b611515565b005b61065760048036038101906106529190614354565b6115b6565b005b610673600480360381019061066e9190614381565b6116ad565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dc90614446565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c61076f8161076a61174a565b611752565b81518351146107b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107aa906144d8565b60405180910390fd5b60005b835181101561088c5760006107e48583815181106107d7576107d66144f8565b5b602002602001015161111d565b03610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b90614573565b60405180910390fd5b828181518110610837576108366144f8565b5b602002602001015160076000868481518110610856576108556144f8565b5b602002602001015181526020019081526020016000209081610878919061479f565b508080610884906148a0565b9150506107b6565b50505050565b600061089d826117ef565b9050919050565b6060600680546108b3906145c2565b80601f01602080910402602001604051908101604052809291908181526020018280546108df906145c2565b801561092c5780601f106109015761010080835404028352916020019161092c565b820191906000526020600020905b81548152906001019060200180831161090f57829003601f168201915b5050505050905090565b606060006109438361111d565b03610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097a90614934565b60405180910390fd5b600060088054610992906145c2565b905003610a3c576007600083815260200190815260200160002080546109b7906145c2565b80601f01602080910402602001604051908101604052809291908181526020018280546109e3906145c2565b8015610a305780601f10610a0557610100808354040283529160200191610a30565b820191906000526020600020905b815481529060010190602001808311610a1357829003601f168201915b50505050509050610a74565b600860076000848152602001908152602001600020604051602001610a629291906149e2565b60405160208183030381529060405290505b919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610aab81610aa661174a565b611752565b610ab786868686611869565b610ac18583610fc8565b505050505050565b600060046000838152602001908152602001600020600101549050919050565b610af161174a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b375750610b3685610b3161174a565b6112e6565b5b610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90614a78565b60405180910390fd5b610b8385858585856119fe565b5050505050565b610b9382610ac9565b610ba481610b9f61174a565b611752565b610bae8383611d11565b505050565b610bbb61174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614b0a565b60405180910390fd5b610c328282611df2565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c6881610c6361174a565b611752565b610c70611ed4565b50565b60608151835114610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090614b9c565b60405180910390fd5b6000835167ffffffffffffffff811115610cd657610cd5613471565b5b604051908082528060200260200182016040528015610d045781602001602082028036833780820191505090505b50905060005b8451811015610d8157610d51858281518110610d2957610d286144f8565b5b6020026020010151858381518110610d4457610d436144f8565b5b6020026020010151610675565b828281518110610d6457610d636144f8565b5b60200260200101818152505080610d7a906148a0565b9050610d0a565b508091505092915050565b600080610d988361111d565b119050919050565b6000600560009054906101000a900460ff16905090565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610de981610de461174a565b611752565b8160089081610df8919061479f565b505050565b610e0561174a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e4b5750610e4a83610e4561174a565b6112e6565b5b610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190614c2e565b60405180910390fd5b610e95838383611f76565b505050565b610ea261174a565b73ffffffffffffffffffffffffffffffffffffffff16610ec061106b565b73ffffffffffffffffffffffffffffffffffffffff1614610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90614c9a565b60405180910390fd5b610f206000612226565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f5481610f4f61174a565b611752565b610f6085858585611869565b5050505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610fbd81610fb861174a565b611752565b610fc56122ec565b50565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610ffa81610ff561174a565b611752565b60006110058461111d565b03611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90614573565b60405180910390fd5b81600760008581526020019081526020016000209081611065919061479f565b50505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b61111961111261174a565b838361238f565b5050565b600060036000838152602001908152602001600020549050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661116c8161116761174a565b611752565b83518551146111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a790614d06565b60405180910390fd5b82518551146111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90614d06565b60405180910390fd5b60005b855181101561126d5761125a868281518110611216576112156144f8565b5b6020026020010151868381518110611231576112306144f8565b5b602002602001015186848151811061124c5761124b6144f8565b5b602002602001015186611869565b8080611265906148a0565b9150506111f7565b505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6112a282610ac9565b6112b3816112ae61174a565b611752565b6112bd8383611df2565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66113ac816113a761174a565b611752565b84518651146113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e790614d06565b60405180910390fd5b8351865114611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b90614d06565b60405180910390fd5b8151865114611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f90614d06565b60405180910390fd5b60005b865181101561150c576114f987828151811061149a576114996144f8565b5b60200260200101518783815181106114b5576114b46144f8565b5b60200260200101518784815181106114d0576114cf6144f8565b5b6020026020010151878786815181106114ec576114eb6144f8565b5b6020026020010151610a79565b8080611504906148a0565b91505061147b565b50505050505050565b61151d61174a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061156357506115628561155d61174a565b6112e6565b5b6115a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159990614c2e565b60405180910390fd5b6115af85858585856124fb565b5050505050565b6115be61174a565b73ffffffffffffffffffffffffffffffffffffffff166115dc61106b565b73ffffffffffffffffffffffffffffffffffffffff1614611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614c9a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169890614d98565b60405180910390fd5b6116aa81612226565b50565b6116b561174a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806116fb57506116fa836116f561174a565b6112e6565b5b61173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190614c2e565b60405180910390fd5b61174583838361277c565b505050565b600033905090565b61175c8282611095565b6117eb576117818173ffffffffffffffffffffffffffffffffffffffff166014612998565b61178f8360001c6020612998565b6040516020016117a0929190614e81565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e291906138fc565b60405180910390fd5b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611862575061186182612bd4565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90614f2d565b60405180910390fd5b60006118e261174a565b9050611903816000876118f488612cb6565b6118fd88612cb6565b87612d30565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119629190614f4d565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516119e0929190614f81565b60405180910390a46119f781600087878787612d8e565b5050505050565b8151835114611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a399061501c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa8906150ae565b60405180910390fd5b6000611abb61174a565b9050611acb818787878787612d30565b60005b8451811015611c7c576000858281518110611aec57611aeb6144f8565b5b602002602001015190506000858381518110611b0b57611b0a6144f8565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390615140565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c619190614f4d565b9250508190555050505080611c75906148a0565b9050611ace565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611cf3929190615160565b60405180910390a4611d09818787878787612f65565b505050505050565b611d1b8282611095565b611dee5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d9361174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611dfc8282611095565b15611ed05760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e7561174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611edc610da0565b611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f12906151e3565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f5f61174a565b604051611f6c9190614018565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90615275565b60405180910390fd5b8051825114612029576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120209061501c565b60405180910390fd5b600061203361174a565b905061205381856000868660405180602001604052806000815250612d30565b60005b83518110156121a0576000848281518110612074576120736144f8565b5b602002602001015190506000848381518110612093576120926144f8565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90615307565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080612198906148a0565b915050612056565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612218929190615160565b60405180910390a450505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122f4610da0565b15612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90615373565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861237861174a565b6040516123859190614018565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490615405565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124ee9190613862565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361256a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612561906150ae565b60405180910390fd5b600061257461174a565b905061259481878761258588612cb6565b61258e88612cb6565b87612d30565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290615140565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e09190614f4d565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161275d929190614f81565b60405180910390a4612773828888888888612d8e565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290615275565b60405180910390fd5b60006127f561174a565b90506128258185600061280787612cb6565b61281087612cb6565b60405180602001604052806000815250612d30565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b390615307565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612989929190614f81565b60405180910390a45050505050565b6060600060028360026129ab9190615425565b6129b59190614f4d565b67ffffffffffffffff8111156129ce576129cd613471565b5b6040519080825280601f01601f191660200182016040528015612a005781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612a3857612a376144f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a9c57612a9b6144f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612adc9190615425565b612ae69190614f4d565b90505b6001811115612b86577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b2857612b276144f8565b5b1a60f81b828281518110612b3f57612b3e6144f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612b7f90615467565b9050612ae9565b5060008414612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc1906154dc565b60405180910390fd5b8091505092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c9f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612caf5750612cae8261313c565b5b9050919050565b60606000600167ffffffffffffffff811115612cd557612cd4613471565b5b604051908082528060200260200182016040528015612d035781602001602082028036833780820191505090505b5090508281600081518110612d1b57612d1a6144f8565b5b60200260200101818152505080915050919050565b612d38610da0565b15612d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6f90615373565b60405180910390fd5b612d868686868686866131a6565b505050505050565b612dad8473ffffffffffffffffffffffffffffffffffffffff1661331e565b15612f5d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612df3959493929190615551565b6020604051808303816000875af1925050508015612e2f57506040513d601f19601f82011682018060405250810190612e2c91906155c0565b60015b612ed457612e3b6155fa565b806308c379a003612e975750612e4f61561c565b80612e5a5750612e99565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e91906138fc565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecb9061571e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f52906157b0565b60405180910390fd5b505b505050505050565b612f848473ffffffffffffffffffffffffffffffffffffffff1661331e565b15613134578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612fca9594939291906157d0565b6020604051808303816000875af192505050801561300657506040513d601f19601f8201168201806040525081019061300391906155c0565b60015b6130ab576130126155fa565b806308c379a00361306e575061302661561c565b806130315750613070565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306591906138fc565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a29061571e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613129906157b0565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131b4868686868686613341565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036132655760005b835181101561326357828181518110613207576132066144f8565b5b602002602001015160036000868481518110613226576132256144f8565b5b60200260200101518152602001908152602001600020600082825461324b9190614f4d565b925050819055508061325c906148a0565b90506131eb565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036133165760005b8351811015613314578281815181106132b8576132b76144f8565b5b6020026020010151600360008684815181106132d7576132d66144f8565b5b6020026020010151815260200190815260200160002060008282546132fc9190615838565b925050819055508061330d906148a0565b905061329c565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133888261335d565b9050919050565b6133988161337d565b81146133a357600080fd5b50565b6000813590506133b58161338f565b92915050565b6000819050919050565b6133ce816133bb565b81146133d957600080fd5b50565b6000813590506133eb816133c5565b92915050565b6000806040838503121561340857613407613353565b5b6000613416858286016133a6565b9250506020613427858286016133dc565b9150509250929050565b61343a816133bb565b82525050565b60006020820190506134556000830184613431565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134a982613460565b810181811067ffffffffffffffff821117156134c8576134c7613471565b5b80604052505050565b60006134db613349565b90506134e782826134a0565b919050565b600067ffffffffffffffff82111561350757613506613471565b5b602082029050602081019050919050565b600080fd5b600061353061352b846134ec565b6134d1565b9050808382526020820190506020840283018581111561355357613552613518565b5b835b8181101561357c578061356888826133dc565b845260208401935050602081019050613555565b5050509392505050565b600082601f83011261359b5761359a61345b565b5b81356135ab84826020860161351d565b91505092915050565b600067ffffffffffffffff8211156135cf576135ce613471565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff821115613600576135ff613471565b5b61360982613460565b9050602081019050919050565b82818337600083830152505050565b6000613638613633846135e5565b6134d1565b905082815260208101848484011115613654576136536135e0565b5b61365f848285613616565b509392505050565b600082601f83011261367c5761367b61345b565b5b813561368c848260208601613625565b91505092915050565b60006136a86136a3846135b4565b6134d1565b905080838252602082019050602084028301858111156136cb576136ca613518565b5b835b8181101561371257803567ffffffffffffffff8111156136f0576136ef61345b565b5b8086016136fd8982613667565b855260208501945050506020810190506136cd565b5050509392505050565b600082601f8301126137315761373061345b565b5b8135613741848260208601613695565b91505092915050565b6000806040838503121561376157613760613353565b5b600083013567ffffffffffffffff81111561377f5761377e613358565b5b61378b85828601613586565b925050602083013567ffffffffffffffff8111156137ac576137ab613358565b5b6137b88582860161371c565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137f7816137c2565b811461380257600080fd5b50565b600081359050613814816137ee565b92915050565b6000602082840312156138305761382f613353565b5b600061383e84828501613805565b91505092915050565b60008115159050919050565b61385c81613847565b82525050565b60006020820190506138776000830184613853565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138b757808201518184015260208101905061389c565b60008484015250505050565b60006138ce8261387d565b6138d88185613888565b93506138e8818560208601613899565b6138f181613460565b840191505092915050565b6000602082019050818103600083015261391681846138c3565b905092915050565b60006020828403121561393457613933613353565b5b6000613942848285016133dc565b91505092915050565b600067ffffffffffffffff82111561396657613965613471565b5b61396f82613460565b9050602081019050919050565b600061398f61398a8461394b565b6134d1565b9050828152602081018484840111156139ab576139aa6135e0565b5b6139b6848285613616565b509392505050565b600082601f8301126139d3576139d261345b565b5b81356139e384826020860161397c565b91505092915050565b600080600080600060a08688031215613a0857613a07613353565b5b6000613a16888289016133a6565b9550506020613a27888289016133dc565b9450506040613a38888289016133dc565b935050606086013567ffffffffffffffff811115613a5957613a58613358565b5b613a65888289016139be565b925050608086013567ffffffffffffffff811115613a8657613a85613358565b5b613a9288828901613667565b9150509295509295909350565b6000819050919050565b613ab281613a9f565b8114613abd57600080fd5b50565b600081359050613acf81613aa9565b92915050565b600060208284031215613aeb57613aea613353565b5b6000613af984828501613ac0565b91505092915050565b613b0b81613a9f565b82525050565b6000602082019050613b266000830184613b02565b92915050565b600080600080600060a08688031215613b4857613b47613353565b5b6000613b56888289016133a6565b9550506020613b67888289016133a6565b945050604086013567ffffffffffffffff811115613b8857613b87613358565b5b613b9488828901613586565b935050606086013567ffffffffffffffff811115613bb557613bb4613358565b5b613bc188828901613586565b925050608086013567ffffffffffffffff811115613be257613be1613358565b5b613bee888289016139be565b9150509295509295909350565b60008060408385031215613c1257613c11613353565b5b6000613c2085828601613ac0565b9250506020613c31858286016133a6565b9150509250929050565b600067ffffffffffffffff821115613c5657613c55613471565b5b602082029050602081019050919050565b6000613c7a613c7584613c3b565b6134d1565b90508083825260208201905060208402830185811115613c9d57613c9c613518565b5b835b81811015613cc65780613cb288826133a6565b845260208401935050602081019050613c9f565b5050509392505050565b600082601f830112613ce557613ce461345b565b5b8135613cf5848260208601613c67565b91505092915050565b60008060408385031215613d1557613d14613353565b5b600083013567ffffffffffffffff811115613d3357613d32613358565b5b613d3f85828601613cd0565b925050602083013567ffffffffffffffff811115613d6057613d5f613358565b5b613d6c85828601613586565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613dab816133bb565b82525050565b6000613dbd8383613da2565b60208301905092915050565b6000602082019050919050565b6000613de182613d76565b613deb8185613d81565b9350613df683613d92565b8060005b83811015613e27578151613e0e8882613db1565b9750613e1983613dc9565b925050600181019050613dfa565b5085935050505092915050565b60006020820190508181036000830152613e4e8184613dd6565b905092915050565b600060208284031215613e6c57613e6b613353565b5b600082013567ffffffffffffffff811115613e8a57613e89613358565b5b613e9684828501613667565b91505092915050565b600080600060608486031215613eb857613eb7613353565b5b6000613ec6868287016133a6565b935050602084013567ffffffffffffffff811115613ee757613ee6613358565b5b613ef386828701613586565b925050604084013567ffffffffffffffff811115613f1457613f13613358565b5b613f2086828701613586565b9150509250925092565b60008060008060808587031215613f4457613f43613353565b5b6000613f52878288016133a6565b9450506020613f63878288016133dc565b9350506040613f74878288016133dc565b925050606085013567ffffffffffffffff811115613f9557613f94613358565b5b613fa1878288016139be565b91505092959194509250565b60008060408385031215613fc457613fc3613353565b5b6000613fd2858286016133dc565b925050602083013567ffffffffffffffff811115613ff357613ff2613358565b5b613fff85828601613667565b9150509250929050565b6140128161337d565b82525050565b600060208201905061402d6000830184614009565b92915050565b61403c81613847565b811461404757600080fd5b50565b60008135905061405981614033565b92915050565b6000806040838503121561407657614075613353565b5b6000614084858286016133a6565b92505060206140958582860161404a565b9150509250929050565b600080600080608085870312156140b9576140b8613353565b5b600085013567ffffffffffffffff8111156140d7576140d6613358565b5b6140e387828801613cd0565b945050602085013567ffffffffffffffff81111561410457614103613358565b5b61411087828801613586565b935050604085013567ffffffffffffffff81111561413157614130613358565b5b61413d87828801613586565b925050606085013567ffffffffffffffff81111561415e5761415d613358565b5b61416a878288016139be565b91505092959194509250565b6000806040838503121561418d5761418c613353565b5b600061419b858286016133a6565b92505060206141ac858286016133a6565b9150509250929050565b600080600080600060a086880312156141d2576141d1613353565b5b600086013567ffffffffffffffff8111156141f0576141ef613358565b5b6141fc88828901613cd0565b955050602086013567ffffffffffffffff81111561421d5761421c613358565b5b61422988828901613586565b945050604086013567ffffffffffffffff81111561424a57614249613358565b5b61425688828901613586565b935050606086013567ffffffffffffffff81111561427757614276613358565b5b614283888289016139be565b925050608086013567ffffffffffffffff8111156142a4576142a3613358565b5b6142b08882890161371c565b9150509295509295909350565b600080600080600060a086880312156142d9576142d8613353565b5b60006142e7888289016133a6565b95505060206142f8888289016133a6565b9450506040614309888289016133dc565b935050606061431a888289016133dc565b925050608086013567ffffffffffffffff81111561433b5761433a613358565b5b614347888289016139be565b9150509295509295909350565b60006020828403121561436a57614369613353565b5b6000614378848285016133a6565b91505092915050565b60008060006060848603121561439a57614399613353565b5b60006143a8868287016133a6565b93505060206143b9868287016133dc565b92505060406143ca868287016133dc565b9150509250925092565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614430602b83613888565b915061443b826143d4565b604082019050919050565b6000602082019050818103600083015261445f81614423565b9050919050565b7f746f6b656e49647320616e642075726973206c656e677468206d69736d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006144c2602183613888565b91506144cd82614466565b604082019050919050565b600060208201905081810360008301526144f1816144b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f55524920736574206f66206e6f6e6578697374656e7420746f6b656e00000000600082015250565b600061455d601c83613888565b915061456882614527565b602082019050919050565b6000602082019050818103600083015261458c81614550565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145da57607f821691505b6020821081036145ed576145ec614593565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026146557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614618565b61465f8683614618565b95508019841693508086168417925050509392505050565b6000819050919050565b600061469c614697614692846133bb565b614677565b6133bb565b9050919050565b6000819050919050565b6146b683614681565b6146ca6146c2826146a3565b848454614625565b825550505050565b600090565b6146df6146d2565b6146ea8184846146ad565b505050565b5b8181101561470e576147036000826146d7565b6001810190506146f0565b5050565b601f82111561475357614724816145f3565b61472d84614608565b8101602085101561473c578190505b61475061474885614608565b8301826146ef565b50505b505050565b600082821c905092915050565b600061477660001984600802614758565b1980831691505092915050565b600061478f8383614765565b9150826002028217905092915050565b6147a88261387d565b67ffffffffffffffff8111156147c1576147c0613471565b5b6147cb82546145c2565b6147d6828285614712565b600060209050601f83116001811461480957600084156147f7578287015190505b6148018582614783565b865550614869565b601f198416614817866145f3565b60005b8281101561483f5784890151825560018201915060208501945060208101905061481a565b8683101561485c5784890151614858601f891682614765565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148ab826133bb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148dd576148dc614871565b5b600182019050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061491e601f83613888565b9150614929826148e8565b602082019050919050565b6000602082019050818103600083015261494d81614911565b9050919050565b600081905092915050565b6000815461496c816145c2565b6149768186614954565b9450600182166000811461499157600181146149a6576149d9565b60ff19831686528115158202860193506149d9565b6149af856145f3565b60005b838110156149d1578154818901526001820191506020810190506149b2565b838801955050505b50505092915050565b60006149ee828561495f565b91506149fa828461495f565b91508190509392505050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614a62603283613888565b9150614a6d82614a06565b604082019050919050565b60006020820190508181036000830152614a9181614a55565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614af4602f83613888565b9150614aff82614a98565b604082019050919050565b60006020820190508181036000830152614b2381614ae7565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614b86602983613888565b9150614b9182614b2a565b604082019050919050565b60006020820190508181036000830152614bb581614b79565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614c18602983613888565b9150614c2382614bbc565b604082019050919050565b60006020820190508181036000830152614c4781614c0b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c84602083613888565b9150614c8f82614c4e565b602082019050919050565b60006020820190508181036000830152614cb381614c77565b9050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b6000614cf0600f83613888565b9150614cfb82614cba565b602082019050919050565b60006020820190508181036000830152614d1f81614ce3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d82602683613888565b9150614d8d82614d26565b604082019050919050565b60006020820190508181036000830152614db181614d75565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614dee601783614954565b9150614df982614db8565b601782019050919050565b6000614e0f8261387d565b614e198185614954565b9350614e29818560208601613899565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614e6b601183614954565b9150614e7682614e35565b601182019050919050565b6000614e8c82614de1565b9150614e988285614e04565b9150614ea382614e5e565b9150614eaf8284614e04565b91508190509392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f17602183613888565b9150614f2282614ebb565b604082019050919050565b60006020820190508181036000830152614f4681614f0a565b9050919050565b6000614f58826133bb565b9150614f63836133bb565b9250828201905080821115614f7b57614f7a614871565b5b92915050565b6000604082019050614f966000830185613431565b614fa36020830184613431565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615006602883613888565b915061501182614faa565b604082019050919050565b6000602082019050818103600083015261503581614ff9565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615098602583613888565b91506150a38261503c565b604082019050919050565b600060208201905081810360008301526150c78161508b565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061512a602a83613888565b9150615135826150ce565b604082019050919050565b600060208201905081810360008301526151598161511d565b9050919050565b6000604082019050818103600083015261517a8185613dd6565b9050818103602083015261518e8184613dd6565b90509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006151cd601483613888565b91506151d882615197565b602082019050919050565b600060208201905081810360008301526151fc816151c0565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061525f602383613888565b915061526a82615203565b604082019050919050565b6000602082019050818103600083015261528e81615252565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006152f1602483613888565b91506152fc82615295565b604082019050919050565b60006020820190508181036000830152615320816152e4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061535d601083613888565b915061536882615327565b602082019050919050565b6000602082019050818103600083015261538c81615350565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006153ef602983613888565b91506153fa82615393565b604082019050919050565b6000602082019050818103600083015261541e816153e2565b9050919050565b6000615430826133bb565b915061543b836133bb565b9250828202615449816133bb565b915082820484148315176154605761545f614871565b5b5092915050565b6000615472826133bb565b91506000820361548557615484614871565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006154c6602083613888565b91506154d182615490565b602082019050919050565b600060208201905081810360008301526154f5816154b9565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615523826154fc565b61552d8185615507565b935061553d818560208601613899565b61554681613460565b840191505092915050565b600060a0820190506155666000830188614009565b6155736020830187614009565b6155806040830186613431565b61558d6060830185613431565b818103608083015261559f8184615518565b90509695505050505050565b6000815190506155ba816137ee565b92915050565b6000602082840312156155d6576155d5613353565b5b60006155e4848285016155ab565b91505092915050565b60008160e01c9050919050565b600060033d11156156195760046000803e6156166000516155ed565b90505b90565b600060443d106156a95761562e613349565b60043d036004823e80513d602482011167ffffffffffffffff821117156156565750506156a9565b808201805167ffffffffffffffff81111561567457505050506156a9565b80602083010160043d0385018111156156915750505050506156a9565b6156a0826020018501866134a0565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615708603483613888565b9150615713826156ac565b604082019050919050565b60006020820190508181036000830152615737816156fb565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061579a602883613888565b91506157a58261573e565b604082019050919050565b600060208201905081810360008301526157c98161578d565b9050919050565b600060a0820190506157e56000830188614009565b6157f26020830187614009565b81810360408301526158048186613dd6565b905081810360608301526158188185613dd6565b9050818103608083015261582c8184615518565b90509695505050505050565b6000615843826133bb565b915061584e836133bb565b925082820390508181111561586657615865614871565b5b9291505056fea2646970667358221220e0668cbadb007d5daad6b76548e1491d26a1a3bd710e18cfb6689957356e299f64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102105760003560e01c8063731133e911610125578063d3208b0a116100ad578063e985e9c51161007c578063e985e9c5146105d5578063ef5ce9e114610605578063f242432a14610621578063f2fde38b1461063d578063f5298aca1461065957610210565b8063d3208b0a14610561578063d53913931461057d578063d547741f1461059b578063e63ab1e9146105b757610210565b80638da5cb5b116100f45780638da5cb5b146104a957806391d14854146104c7578063a217fddf146104f7578063a22cb46514610515578063bd85b0391461053157610210565b8063731133e9146104495780637f345710146104655780638456cb5914610483578063862440e21461048d57610210565b80632f2ff15d116101a85780634f558e79116101775780634f558e79146103b95780635c975abb146103e9578063664aa26b146104075780636b20c45414610423578063715018a61461043f57610210565b80632f2ff15d1461034757806336568abe146103635780633f4ba83a1461037f5780634e1273f41461038957610210565b80630e89341c116101e45780630e89341c146102af57806313fbdd5a146102df578063248a9ca3146102fb5780632eb2c2d61461032b57610210565b8062fdd58e1461021557806301b98ea01461024557806301ffc9a71461026157806306fdde0314610291575b600080fd5b61022f600480360381019061022a91906133f1565b610675565b60405161023c9190613440565b60405180910390f35b61025f600480360381019061025a919061374a565b61073d565b005b61027b6004803603810190610276919061381a565b610892565b6040516102889190613862565b60405180910390f35b6102996108a4565b6040516102a691906138fc565b60405180910390f35b6102c960048036038101906102c4919061391e565b610936565b6040516102d691906138fc565b60405180910390f35b6102f960048036038101906102f491906139ec565b610a79565b005b61031560048036038101906103109190613ad5565b610ac9565b6040516103229190613b11565b60405180910390f35b61034560048036038101906103409190613b2c565b610ae9565b005b610361600480360381019061035c9190613bfb565b610b8a565b005b61037d60048036038101906103789190613bfb565b610bb3565b005b610387610c36565b005b6103a3600480360381019061039e9190613cfe565b610c73565b6040516103b09190613e34565b60405180910390f35b6103d360048036038101906103ce919061391e565b610d8c565b6040516103e09190613862565b60405180910390f35b6103f1610da0565b6040516103fe9190613862565b60405180910390f35b610421600480360381019061041c9190613e56565b610db7565b005b61043d60048036038101906104389190613e9f565b610dfd565b005b610447610e9a565b005b610463600480360381019061045e9190613f2a565b610f22565b005b61046d610f67565b60405161047a9190613b11565b60405180910390f35b61048b610f8b565b005b6104a760048036038101906104a29190613fad565b610fc8565b005b6104b161106b565b6040516104be9190614018565b60405180910390f35b6104e160048036038101906104dc9190613bfb565b611095565b6040516104ee9190613862565b60405180910390f35b6104ff611100565b60405161050c9190613b11565b60405180910390f35b61052f600480360381019061052a919061405f565b611107565b005b61054b6004803603810190610546919061391e565b61111d565b6040516105589190613440565b60405180910390f35b61057b6004803603810190610576919061409f565b61113a565b005b610585611275565b6040516105929190613b11565b60405180910390f35b6105b560048036038101906105b09190613bfb565b611299565b005b6105bf6112c2565b6040516105cc9190613b11565b60405180910390f35b6105ef60048036038101906105ea9190614176565b6112e6565b6040516105fc9190613862565b60405180910390f35b61061f600480360381019061061a91906141b6565b61137a565b005b61063b600480360381019061063691906142bd565b611515565b005b61065760048036038101906106529190614354565b6115b6565b005b610673600480360381019061066e9190614381565b6116ad565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dc90614446565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c61076f8161076a61174a565b611752565b81518351146107b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107aa906144d8565b60405180910390fd5b60005b835181101561088c5760006107e48583815181106107d7576107d66144f8565b5b602002602001015161111d565b03610824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081b90614573565b60405180910390fd5b828181518110610837576108366144f8565b5b602002602001015160076000868481518110610856576108556144f8565b5b602002602001015181526020019081526020016000209081610878919061479f565b508080610884906148a0565b9150506107b6565b50505050565b600061089d826117ef565b9050919050565b6060600680546108b3906145c2565b80601f01602080910402602001604051908101604052809291908181526020018280546108df906145c2565b801561092c5780601f106109015761010080835404028352916020019161092c565b820191906000526020600020905b81548152906001019060200180831161090f57829003601f168201915b5050505050905090565b606060006109438361111d565b03610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097a90614934565b60405180910390fd5b600060088054610992906145c2565b905003610a3c576007600083815260200190815260200160002080546109b7906145c2565b80601f01602080910402602001604051908101604052809291908181526020018280546109e3906145c2565b8015610a305780601f10610a0557610100808354040283529160200191610a30565b820191906000526020600020905b815481529060010190602001808311610a1357829003601f168201915b50505050509050610a74565b600860076000848152602001908152602001600020604051602001610a629291906149e2565b60405160208183030381529060405290505b919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610aab81610aa661174a565b611752565b610ab786868686611869565b610ac18583610fc8565b505050505050565b600060046000838152602001908152602001600020600101549050919050565b610af161174a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b375750610b3685610b3161174a565b6112e6565b5b610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90614a78565b60405180910390fd5b610b8385858585856119fe565b5050505050565b610b9382610ac9565b610ba481610b9f61174a565b611752565b610bae8383611d11565b505050565b610bbb61174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614b0a565b60405180910390fd5b610c328282611df2565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c6881610c6361174a565b611752565b610c70611ed4565b50565b60608151835114610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090614b9c565b60405180910390fd5b6000835167ffffffffffffffff811115610cd657610cd5613471565b5b604051908082528060200260200182016040528015610d045781602001602082028036833780820191505090505b50905060005b8451811015610d8157610d51858281518110610d2957610d286144f8565b5b6020026020010151858381518110610d4457610d436144f8565b5b6020026020010151610675565b828281518110610d6457610d636144f8565b5b60200260200101818152505080610d7a906148a0565b9050610d0a565b508091505092915050565b600080610d988361111d565b119050919050565b6000600560009054906101000a900460ff16905090565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610de981610de461174a565b611752565b8160089081610df8919061479f565b505050565b610e0561174a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e4b5750610e4a83610e4561174a565b6112e6565b5b610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190614c2e565b60405180910390fd5b610e95838383611f76565b505050565b610ea261174a565b73ffffffffffffffffffffffffffffffffffffffff16610ec061106b565b73ffffffffffffffffffffffffffffffffffffffff1614610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90614c9a565b60405180910390fd5b610f206000612226565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f5481610f4f61174a565b611752565b610f6085858585611869565b5050505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610fbd81610fb861174a565b611752565b610fc56122ec565b50565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610ffa81610ff561174a565b611752565b60006110058461111d565b03611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90614573565b60405180910390fd5b81600760008581526020019081526020016000209081611065919061479f565b50505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b61111961111261174a565b838361238f565b5050565b600060036000838152602001908152602001600020549050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661116c8161116761174a565b611752565b83518551146111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a790614d06565b60405180910390fd5b82518551146111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90614d06565b60405180910390fd5b60005b855181101561126d5761125a868281518110611216576112156144f8565b5b6020026020010151868381518110611231576112306144f8565b5b602002602001015186848151811061124c5761124b6144f8565b5b602002602001015186611869565b8080611265906148a0565b9150506111f7565b505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6112a282610ac9565b6112b3816112ae61174a565b611752565b6112bd8383611df2565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66113ac816113a761174a565b611752565b84518651146113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e790614d06565b60405180910390fd5b8351865114611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b90614d06565b60405180910390fd5b8151865114611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f90614d06565b60405180910390fd5b60005b865181101561150c576114f987828151811061149a576114996144f8565b5b60200260200101518783815181106114b5576114b46144f8565b5b60200260200101518784815181106114d0576114cf6144f8565b5b6020026020010151878786815181106114ec576114eb6144f8565b5b6020026020010151610a79565b8080611504906148a0565b91505061147b565b50505050505050565b61151d61174a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061156357506115628561155d61174a565b6112e6565b5b6115a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159990614c2e565b60405180910390fd5b6115af85858585856124fb565b5050505050565b6115be61174a565b73ffffffffffffffffffffffffffffffffffffffff166115dc61106b565b73ffffffffffffffffffffffffffffffffffffffff1614611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990614c9a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169890614d98565b60405180910390fd5b6116aa81612226565b50565b6116b561174a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806116fb57506116fa836116f561174a565b6112e6565b5b61173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190614c2e565b60405180910390fd5b61174583838361277c565b505050565b600033905090565b61175c8282611095565b6117eb576117818173ffffffffffffffffffffffffffffffffffffffff166014612998565b61178f8360001c6020612998565b6040516020016117a0929190614e81565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e291906138fc565b60405180910390fd5b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611862575061186182612bd4565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90614f2d565b60405180910390fd5b60006118e261174a565b9050611903816000876118f488612cb6565b6118fd88612cb6565b87612d30565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119629190614f4d565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516119e0929190614f81565b60405180910390a46119f781600087878787612d8e565b5050505050565b8151835114611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a399061501c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa8906150ae565b60405180910390fd5b6000611abb61174a565b9050611acb818787878787612d30565b60005b8451811015611c7c576000858281518110611aec57611aeb6144f8565b5b602002602001015190506000858381518110611b0b57611b0a6144f8565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390615140565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c619190614f4d565b9250508190555050505080611c75906148a0565b9050611ace565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611cf3929190615160565b60405180910390a4611d09818787878787612f65565b505050505050565b611d1b8282611095565b611dee5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d9361174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611dfc8282611095565b15611ed05760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e7561174a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611edc610da0565b611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f12906151e3565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f5f61174a565b604051611f6c9190614018565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90615275565b60405180910390fd5b8051825114612029576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120209061501c565b60405180910390fd5b600061203361174a565b905061205381856000868660405180602001604052806000815250612d30565b60005b83518110156121a0576000848281518110612074576120736144f8565b5b602002602001015190506000848381518110612093576120926144f8565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90615307565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080612198906148a0565b915050612056565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612218929190615160565b60405180910390a450505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122f4610da0565b15612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90615373565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861237861174a565b6040516123859190614018565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490615405565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124ee9190613862565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361256a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612561906150ae565b60405180910390fd5b600061257461174a565b905061259481878761258588612cb6565b61258e88612cb6565b87612d30565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290615140565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e09190614f4d565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161275d929190614f81565b60405180910390a4612773828888888888612d8e565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290615275565b60405180910390fd5b60006127f561174a565b90506128258185600061280787612cb6565b61281087612cb6565b60405180602001604052806000815250612d30565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b390615307565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612989929190614f81565b60405180910390a45050505050565b6060600060028360026129ab9190615425565b6129b59190614f4d565b67ffffffffffffffff8111156129ce576129cd613471565b5b6040519080825280601f01601f191660200182016040528015612a005781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612a3857612a376144f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a9c57612a9b6144f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612adc9190615425565b612ae69190614f4d565b90505b6001811115612b86577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b2857612b276144f8565b5b1a60f81b828281518110612b3f57612b3e6144f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612b7f90615467565b9050612ae9565b5060008414612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc1906154dc565b60405180910390fd5b8091505092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c9f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612caf5750612cae8261313c565b5b9050919050565b60606000600167ffffffffffffffff811115612cd557612cd4613471565b5b604051908082528060200260200182016040528015612d035781602001602082028036833780820191505090505b5090508281600081518110612d1b57612d1a6144f8565b5b60200260200101818152505080915050919050565b612d38610da0565b15612d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6f90615373565b60405180910390fd5b612d868686868686866131a6565b505050505050565b612dad8473ffffffffffffffffffffffffffffffffffffffff1661331e565b15612f5d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612df3959493929190615551565b6020604051808303816000875af1925050508015612e2f57506040513d601f19601f82011682018060405250810190612e2c91906155c0565b60015b612ed457612e3b6155fa565b806308c379a003612e975750612e4f61561c565b80612e5a5750612e99565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e91906138fc565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecb9061571e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f52906157b0565b60405180910390fd5b505b505050505050565b612f848473ffffffffffffffffffffffffffffffffffffffff1661331e565b15613134578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612fca9594939291906157d0565b6020604051808303816000875af192505050801561300657506040513d601f19601f8201168201806040525081019061300391906155c0565b60015b6130ab576130126155fa565b806308c379a00361306e575061302661561c565b806130315750613070565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306591906138fc565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a29061571e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613129906157b0565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131b4868686868686613341565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036132655760005b835181101561326357828181518110613207576132066144f8565b5b602002602001015160036000868481518110613226576132256144f8565b5b60200260200101518152602001908152602001600020600082825461324b9190614f4d565b925050819055508061325c906148a0565b90506131eb565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036133165760005b8351811015613314578281815181106132b8576132b76144f8565b5b6020026020010151600360008684815181106132d7576132d66144f8565b5b6020026020010151815260200190815260200160002060008282546132fc9190615838565b925050819055508061330d906148a0565b905061329c565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133888261335d565b9050919050565b6133988161337d565b81146133a357600080fd5b50565b6000813590506133b58161338f565b92915050565b6000819050919050565b6133ce816133bb565b81146133d957600080fd5b50565b6000813590506133eb816133c5565b92915050565b6000806040838503121561340857613407613353565b5b6000613416858286016133a6565b9250506020613427858286016133dc565b9150509250929050565b61343a816133bb565b82525050565b60006020820190506134556000830184613431565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134a982613460565b810181811067ffffffffffffffff821117156134c8576134c7613471565b5b80604052505050565b60006134db613349565b90506134e782826134a0565b919050565b600067ffffffffffffffff82111561350757613506613471565b5b602082029050602081019050919050565b600080fd5b600061353061352b846134ec565b6134d1565b9050808382526020820190506020840283018581111561355357613552613518565b5b835b8181101561357c578061356888826133dc565b845260208401935050602081019050613555565b5050509392505050565b600082601f83011261359b5761359a61345b565b5b81356135ab84826020860161351d565b91505092915050565b600067ffffffffffffffff8211156135cf576135ce613471565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff821115613600576135ff613471565b5b61360982613460565b9050602081019050919050565b82818337600083830152505050565b6000613638613633846135e5565b6134d1565b905082815260208101848484011115613654576136536135e0565b5b61365f848285613616565b509392505050565b600082601f83011261367c5761367b61345b565b5b813561368c848260208601613625565b91505092915050565b60006136a86136a3846135b4565b6134d1565b905080838252602082019050602084028301858111156136cb576136ca613518565b5b835b8181101561371257803567ffffffffffffffff8111156136f0576136ef61345b565b5b8086016136fd8982613667565b855260208501945050506020810190506136cd565b5050509392505050565b600082601f8301126137315761373061345b565b5b8135613741848260208601613695565b91505092915050565b6000806040838503121561376157613760613353565b5b600083013567ffffffffffffffff81111561377f5761377e613358565b5b61378b85828601613586565b925050602083013567ffffffffffffffff8111156137ac576137ab613358565b5b6137b88582860161371c565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137f7816137c2565b811461380257600080fd5b50565b600081359050613814816137ee565b92915050565b6000602082840312156138305761382f613353565b5b600061383e84828501613805565b91505092915050565b60008115159050919050565b61385c81613847565b82525050565b60006020820190506138776000830184613853565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138b757808201518184015260208101905061389c565b60008484015250505050565b60006138ce8261387d565b6138d88185613888565b93506138e8818560208601613899565b6138f181613460565b840191505092915050565b6000602082019050818103600083015261391681846138c3565b905092915050565b60006020828403121561393457613933613353565b5b6000613942848285016133dc565b91505092915050565b600067ffffffffffffffff82111561396657613965613471565b5b61396f82613460565b9050602081019050919050565b600061398f61398a8461394b565b6134d1565b9050828152602081018484840111156139ab576139aa6135e0565b5b6139b6848285613616565b509392505050565b600082601f8301126139d3576139d261345b565b5b81356139e384826020860161397c565b91505092915050565b600080600080600060a08688031215613a0857613a07613353565b5b6000613a16888289016133a6565b9550506020613a27888289016133dc565b9450506040613a38888289016133dc565b935050606086013567ffffffffffffffff811115613a5957613a58613358565b5b613a65888289016139be565b925050608086013567ffffffffffffffff811115613a8657613a85613358565b5b613a9288828901613667565b9150509295509295909350565b6000819050919050565b613ab281613a9f565b8114613abd57600080fd5b50565b600081359050613acf81613aa9565b92915050565b600060208284031215613aeb57613aea613353565b5b6000613af984828501613ac0565b91505092915050565b613b0b81613a9f565b82525050565b6000602082019050613b266000830184613b02565b92915050565b600080600080600060a08688031215613b4857613b47613353565b5b6000613b56888289016133a6565b9550506020613b67888289016133a6565b945050604086013567ffffffffffffffff811115613b8857613b87613358565b5b613b9488828901613586565b935050606086013567ffffffffffffffff811115613bb557613bb4613358565b5b613bc188828901613586565b925050608086013567ffffffffffffffff811115613be257613be1613358565b5b613bee888289016139be565b9150509295509295909350565b60008060408385031215613c1257613c11613353565b5b6000613c2085828601613ac0565b9250506020613c31858286016133a6565b9150509250929050565b600067ffffffffffffffff821115613c5657613c55613471565b5b602082029050602081019050919050565b6000613c7a613c7584613c3b565b6134d1565b90508083825260208201905060208402830185811115613c9d57613c9c613518565b5b835b81811015613cc65780613cb288826133a6565b845260208401935050602081019050613c9f565b5050509392505050565b600082601f830112613ce557613ce461345b565b5b8135613cf5848260208601613c67565b91505092915050565b60008060408385031215613d1557613d14613353565b5b600083013567ffffffffffffffff811115613d3357613d32613358565b5b613d3f85828601613cd0565b925050602083013567ffffffffffffffff811115613d6057613d5f613358565b5b613d6c85828601613586565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613dab816133bb565b82525050565b6000613dbd8383613da2565b60208301905092915050565b6000602082019050919050565b6000613de182613d76565b613deb8185613d81565b9350613df683613d92565b8060005b83811015613e27578151613e0e8882613db1565b9750613e1983613dc9565b925050600181019050613dfa565b5085935050505092915050565b60006020820190508181036000830152613e4e8184613dd6565b905092915050565b600060208284031215613e6c57613e6b613353565b5b600082013567ffffffffffffffff811115613e8a57613e89613358565b5b613e9684828501613667565b91505092915050565b600080600060608486031215613eb857613eb7613353565b5b6000613ec6868287016133a6565b935050602084013567ffffffffffffffff811115613ee757613ee6613358565b5b613ef386828701613586565b925050604084013567ffffffffffffffff811115613f1457613f13613358565b5b613f2086828701613586565b9150509250925092565b60008060008060808587031215613f4457613f43613353565b5b6000613f52878288016133a6565b9450506020613f63878288016133dc565b9350506040613f74878288016133dc565b925050606085013567ffffffffffffffff811115613f9557613f94613358565b5b613fa1878288016139be565b91505092959194509250565b60008060408385031215613fc457613fc3613353565b5b6000613fd2858286016133dc565b925050602083013567ffffffffffffffff811115613ff357613ff2613358565b5b613fff85828601613667565b9150509250929050565b6140128161337d565b82525050565b600060208201905061402d6000830184614009565b92915050565b61403c81613847565b811461404757600080fd5b50565b60008135905061405981614033565b92915050565b6000806040838503121561407657614075613353565b5b6000614084858286016133a6565b92505060206140958582860161404a565b9150509250929050565b600080600080608085870312156140b9576140b8613353565b5b600085013567ffffffffffffffff8111156140d7576140d6613358565b5b6140e387828801613cd0565b945050602085013567ffffffffffffffff81111561410457614103613358565b5b61411087828801613586565b935050604085013567ffffffffffffffff81111561413157614130613358565b5b61413d87828801613586565b925050606085013567ffffffffffffffff81111561415e5761415d613358565b5b61416a878288016139be565b91505092959194509250565b6000806040838503121561418d5761418c613353565b5b600061419b858286016133a6565b92505060206141ac858286016133a6565b9150509250929050565b600080600080600060a086880312156141d2576141d1613353565b5b600086013567ffffffffffffffff8111156141f0576141ef613358565b5b6141fc88828901613cd0565b955050602086013567ffffffffffffffff81111561421d5761421c613358565b5b61422988828901613586565b945050604086013567ffffffffffffffff81111561424a57614249613358565b5b61425688828901613586565b935050606086013567ffffffffffffffff81111561427757614276613358565b5b614283888289016139be565b925050608086013567ffffffffffffffff8111156142a4576142a3613358565b5b6142b08882890161371c565b9150509295509295909350565b600080600080600060a086880312156142d9576142d8613353565b5b60006142e7888289016133a6565b95505060206142f8888289016133a6565b9450506040614309888289016133dc565b935050606061431a888289016133dc565b925050608086013567ffffffffffffffff81111561433b5761433a613358565b5b614347888289016139be565b9150509295509295909350565b60006020828403121561436a57614369613353565b5b6000614378848285016133a6565b91505092915050565b60008060006060848603121561439a57614399613353565b5b60006143a8868287016133a6565b93505060206143b9868287016133dc565b92505060406143ca868287016133dc565b9150509250925092565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614430602b83613888565b915061443b826143d4565b604082019050919050565b6000602082019050818103600083015261445f81614423565b9050919050565b7f746f6b656e49647320616e642075726973206c656e677468206d69736d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006144c2602183613888565b91506144cd82614466565b604082019050919050565b600060208201905081810360008301526144f1816144b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f55524920736574206f66206e6f6e6578697374656e7420746f6b656e00000000600082015250565b600061455d601c83613888565b915061456882614527565b602082019050919050565b6000602082019050818103600083015261458c81614550565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145da57607f821691505b6020821081036145ed576145ec614593565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026146557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614618565b61465f8683614618565b95508019841693508086168417925050509392505050565b6000819050919050565b600061469c614697614692846133bb565b614677565b6133bb565b9050919050565b6000819050919050565b6146b683614681565b6146ca6146c2826146a3565b848454614625565b825550505050565b600090565b6146df6146d2565b6146ea8184846146ad565b505050565b5b8181101561470e576147036000826146d7565b6001810190506146f0565b5050565b601f82111561475357614724816145f3565b61472d84614608565b8101602085101561473c578190505b61475061474885614608565b8301826146ef565b50505b505050565b600082821c905092915050565b600061477660001984600802614758565b1980831691505092915050565b600061478f8383614765565b9150826002028217905092915050565b6147a88261387d565b67ffffffffffffffff8111156147c1576147c0613471565b5b6147cb82546145c2565b6147d6828285614712565b600060209050601f83116001811461480957600084156147f7578287015190505b6148018582614783565b865550614869565b601f198416614817866145f3565b60005b8281101561483f5784890151825560018201915060208501945060208101905061481a565b8683101561485c5784890151614858601f891682614765565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148ab826133bb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148dd576148dc614871565b5b600182019050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061491e601f83613888565b9150614929826148e8565b602082019050919050565b6000602082019050818103600083015261494d81614911565b9050919050565b600081905092915050565b6000815461496c816145c2565b6149768186614954565b9450600182166000811461499157600181146149a6576149d9565b60ff19831686528115158202860193506149d9565b6149af856145f3565b60005b838110156149d1578154818901526001820191506020810190506149b2565b838801955050505b50505092915050565b60006149ee828561495f565b91506149fa828461495f565b91508190509392505050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614a62603283613888565b9150614a6d82614a06565b604082019050919050565b60006020820190508181036000830152614a9181614a55565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614af4602f83613888565b9150614aff82614a98565b604082019050919050565b60006020820190508181036000830152614b2381614ae7565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614b86602983613888565b9150614b9182614b2a565b604082019050919050565b60006020820190508181036000830152614bb581614b79565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614c18602983613888565b9150614c2382614bbc565b604082019050919050565b60006020820190508181036000830152614c4781614c0b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c84602083613888565b9150614c8f82614c4e565b602082019050919050565b60006020820190508181036000830152614cb381614c77565b9050919050565b7f6c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b6000614cf0600f83613888565b9150614cfb82614cba565b602082019050919050565b60006020820190508181036000830152614d1f81614ce3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d82602683613888565b9150614d8d82614d26565b604082019050919050565b60006020820190508181036000830152614db181614d75565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614dee601783614954565b9150614df982614db8565b601782019050919050565b6000614e0f8261387d565b614e198185614954565b9350614e29818560208601613899565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614e6b601183614954565b9150614e7682614e35565b601182019050919050565b6000614e8c82614de1565b9150614e988285614e04565b9150614ea382614e5e565b9150614eaf8284614e04565b91508190509392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f17602183613888565b9150614f2282614ebb565b604082019050919050565b60006020820190508181036000830152614f4681614f0a565b9050919050565b6000614f58826133bb565b9150614f63836133bb565b9250828201905080821115614f7b57614f7a614871565b5b92915050565b6000604082019050614f966000830185613431565b614fa36020830184613431565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615006602883613888565b915061501182614faa565b604082019050919050565b6000602082019050818103600083015261503581614ff9565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615098602583613888565b91506150a38261503c565b604082019050919050565b600060208201905081810360008301526150c78161508b565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061512a602a83613888565b9150615135826150ce565b604082019050919050565b600060208201905081810360008301526151598161511d565b9050919050565b6000604082019050818103600083015261517a8185613dd6565b9050818103602083015261518e8184613dd6565b90509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006151cd601483613888565b91506151d882615197565b602082019050919050565b600060208201905081810360008301526151fc816151c0565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061525f602383613888565b915061526a82615203565b604082019050919050565b6000602082019050818103600083015261528e81615252565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006152f1602483613888565b91506152fc82615295565b604082019050919050565b60006020820190508181036000830152615320816152e4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061535d601083613888565b915061536882615327565b602082019050919050565b6000602082019050818103600083015261538c81615350565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006153ef602983613888565b91506153fa82615393565b604082019050919050565b6000602082019050818103600083015261541e816153e2565b9050919050565b6000615430826133bb565b915061543b836133bb565b9250828202615449816133bb565b915082820484148315176154605761545f614871565b5b5092915050565b6000615472826133bb565b91506000820361548557615484614871565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006154c6602083613888565b91506154d182615490565b602082019050919050565b600060208201905081810360008301526154f5816154b9565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615523826154fc565b61552d8185615507565b935061553d818560208601613899565b61554681613460565b840191505092915050565b600060a0820190506155666000830188614009565b6155736020830187614009565b6155806040830186613431565b61558d6060830185613431565b818103608083015261559f8184615518565b90509695505050505050565b6000815190506155ba816137ee565b92915050565b6000602082840312156155d6576155d5613353565b5b60006155e4848285016155ab565b91505092915050565b60008160e01c9050919050565b600060033d11156156195760046000803e6156166000516155ed565b90505b90565b600060443d106156a95761562e613349565b60043d036004823e80513d602482011167ffffffffffffffff821117156156565750506156a9565b808201805167ffffffffffffffff81111561567457505050506156a9565b80602083010160043d0385018111156156915750505050506156a9565b6156a0826020018501866134a0565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615708603483613888565b9150615713826156ac565b604082019050919050565b60006020820190508181036000830152615737816156fb565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061579a602883613888565b91506157a58261573e565b604082019050919050565b600060208201905081810360008301526157c98161578d565b9050919050565b600060a0820190506157e56000830188614009565b6157f26020830187614009565b81810360408301526158048186613dd6565b905081810360608301526158188185613dd6565b9050818103608083015261582c8184615518565b90509695505050505050565b6000615843826133bb565b915061584e836133bb565b925082820390508181111561586657615865614871565b5b9291505056fea2646970667358221220e0668cbadb007d5daad6b76548e1491d26a1a3bd710e18cfb6689957356e299f64736f6c63430008120033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : base_ (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54992:4400:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38507:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56711:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59179:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57123:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55923:452;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58002:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25444:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40446:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25837:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26885:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57303:77;;;:::i;:::-;;38904:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54066:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9791:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56383:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52770:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7842:103;;;:::i;:::-;;57388:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55100:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57222:73;;;:::i;:::-;;56493:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7191:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24313:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23404:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39501:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53855:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57577:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55246:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26229:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55177:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39728:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58254:525;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39968:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8100:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52441:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38507:231;38593:7;38640:1;38621:21;;:7;:21;;;38613:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;38708:9;:13;38718:2;38708:13;;;;;;;;;;;:22;38722:7;38708:22;;;;;;;;;;;;;;;;38701:29;;38507:231;;;;:::o;56711:404::-;55142:28;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;56853:5:::1;:12;56834:8;:15;:31;56826:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56921:9;56916:192;56940:8;:15;56936:1;:19;56916:192;;;57013:1;56985:24;56997:8;57006:1;56997:11;;;;;;;;:::i;:::-;;;;;;;;56985;:24::i;:::-;:29:::0;56977:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;57088:5;57094:1;57088:8;;;;;;;;:::i;:::-;;;;;;;;57062:10;:23;57073:8;57082:1;57073:11;;;;;;;;:::i;:::-;;;;;;;;57062:23;;;;;;;;;;;:34;;;;;;:::i;:::-;;56957:3;;;;;:::i;:::-;;;;56916:192;;;;56711:404:::0;;;:::o;59179:210::-;59316:4;59345:36;59369:11;59345:23;:36::i;:::-;59338:43;;59179:210;;;:::o;57123:91::-;57168:13;57201:5;57194:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57123:91;:::o;55923:452::-;55991:13;56049:1;56025:20;56037:7;56025:11;:20::i;:::-;:25;56017:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;56189:1;56173:4;56167:18;;;;;:::i;:::-;;;:23;56163:82;;56214:10;:19;56225:7;56214:19;;;;;;;;;;;56207:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56163:82;56340:4;56346:10;:19;56357:7;56346:19;;;;;;;;;;;56323:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56309:58;;55923:452;;;;:::o;58002:244::-;55284:24;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;58174:36:::1;58180:8;58190:3;58195:7;58204:5;58174;:36::i;:::-;58221:17;58228:3;58233:4;58221:6;:17::i;:::-;58002:244:::0;;;;;;:::o;25444:131::-;25518:7;25545:6;:12;25552:4;25545:12;;;;;;;;;;;:22;;;25538:29;;25444:131;;;:::o;40446:442::-;40687:12;:10;:12::i;:::-;40679:20;;:4;:20;;;:60;;;;40703:36;40720:4;40726:12;:10;:12::i;:::-;40703:16;:36::i;:::-;40679:60;40657:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;40828:52;40851:4;40857:2;40861:3;40866:7;40875:4;40828:22;:52::i;:::-;40446:442;;;;;:::o;25837:147::-;25920:18;25933:4;25920:12;:18::i;:::-;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;25951:25:::1;25962:4;25968:7;25951:10;:25::i;:::-;25837:147:::0;;;:::o;26885:218::-;26992:12;:10;:12::i;:::-;26981:23;;:7;:23;;;26973:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;27069:26;27081:4;27087:7;27069:11;:26::i;:::-;26885:218;;:::o;57303:77::-;55215:24;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;57362:10:::1;:8;:10::i;:::-;57303:77:::0;:::o;38904:524::-;39060:16;39121:3;:10;39102:8;:15;:29;39094:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;39190:30;39237:8;:15;39223:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39190:63;;39271:9;39266:122;39290:8;:15;39286:1;:19;39266:122;;;39346:30;39356:8;39365:1;39356:11;;;;;;;;:::i;:::-;;;;;;;;39369:3;39373:1;39369:6;;;;;;;;:::i;:::-;;;;;;;;39346:9;:30::i;:::-;39327:13;39341:1;39327:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;39307:3;;;;:::i;:::-;;;39266:122;;;;39407:13;39400:20;;;38904:524;;;;:::o;54066:122::-;54123:4;54179:1;54147:29;54173:2;54147:25;:29::i;:::-;:33;54140:40;;54066:122;;;:::o;9791:86::-;9838:4;9862:7;;;;;;;;;;;9855:14;;9791:86;:::o;56383:102::-;55142:28;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;56472:5:::1;56465:4;:12;;;;;;:::i;:::-;;56383:102:::0;;:::o;52770:353::-;52946:12;:10;:12::i;:::-;52935:23;;:7;:23;;;:66;;;;52962:39;52979:7;52988:12;:10;:12::i;:::-;52962:16;:39::i;:::-;52935:66;52913:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;53083:32;53094:7;53103:3;53108:6;53083:10;:32::i;:::-;52770:353;;;:::o;7842:103::-;7422:12;:10;:12::i;:::-;7411:23;;:7;:5;:7::i;:::-;:23;;;7403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7907:30:::1;7934:1;7907:18;:30::i;:::-;7842:103::o:0;57388:181::-;55284:24;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;57529:32:::1;57535:7;57544:2;57548:6;57556:4;57529:5;:32::i;:::-;57388:181:::0;;;;;:::o;55100:70::-;55142:28;55100:70;:::o;57222:73::-;55215:24;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;57279:8:::1;:6;:8::i;:::-;57222:73:::0;:::o;56493:210::-;55142:28;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;56622:1:::1;56598:20;56610:7;56598:11;:20::i;:::-;:25:::0;56590:66:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56691:4;56669:10;:19;56680:7;56669:19;;;;;;;;;;;:26;;;;;;:::i;:::-;;56493:210:::0;;;:::o;7191:87::-;7237:7;7264:6;;;;;;;;;;;7257:13;;7191:87;:::o;24313:147::-;24399:4;24423:6;:12;24430:4;24423:12;;;;;;;;;;;:20;;:29;24444:7;24423:29;;;;;;;;;;;;;;;;;;;;;;;;;24416:36;;24313:147;;;;:::o;23404:49::-;23449:4;23404:49;;;:::o;39501:155::-;39596:52;39615:12;:10;:12::i;:::-;39629:8;39639;39596:18;:52::i;:::-;39501:155;;:::o;53855:113::-;53917:7;53944:12;:16;53957:2;53944:16;;;;;;;;;;;;53937:23;;53855:113;;;:::o;57577:417::-;55284:24;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;57770:3:::1;:10;57756:3;:10;:24;57748:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;57833:7;:14;57819:3;:10;:28;57811:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57885:9;57880:107;57904:3;:10;57900:1;:14;57880:107;;;57936:39;57942:3;57946:1;57942:6;;;;;;;;:::i;:::-;;;;;;;;57950:3;57954:1;57950:6;;;;;;;;:::i;:::-;;;;;;;;57958:7;57966:1;57958:10;;;;;;;;:::i;:::-;;;;;;;;57970:4;57936:5;:39::i;:::-;57916:3;;;;;:::i;:::-;;;;57880:107;;;;57577:417:::0;;;;;:::o;55246:62::-;55284:24;55246:62;:::o;26229:149::-;26313:18;26326:4;26313:12;:18::i;:::-;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;26344:26:::1;26356:4;26362:7;26344:11;:26::i;:::-;26229:149:::0;;;:::o;55177:62::-;55215:24;55177:62;:::o;39728:168::-;39827:4;39851:18;:27;39870:7;39851:27;;;;;;;;;;;;;;;:37;39879:8;39851:37;;;;;;;;;;;;;;;;;;;;;;;;;39844:44;;39728:168;;;;:::o;58254:525::-;55284:24;23895:30;23906:4;23912:12;:10;:12::i;:::-;23895:10;:30::i;:::-;58476:3:::1;:10;58462:3;:10;:24;58454:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;58539:7;:14;58525:3;:10;:28;58517:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58606:4;:11;58592:3;:10;:25;58584:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58655:9;58650:122;58674:3;:10;58670:1;:14;58650:122;;;58706:54;58718:3;58722:1;58718:6;;;;;;;;:::i;:::-;;;;;;;;58726:3;58730:1;58726:6;;;;;;;;:::i;:::-;;;;;;;;58734:7;58742:1;58734:10;;;;;;;;:::i;:::-;;;;;;;;58746:4;58752;58757:1;58752:7;;;;;;;;:::i;:::-;;;;;;;;58706:11;:54::i;:::-;58686:3;;;;;:::i;:::-;;;;58650:122;;;;58254:525:::0;;;;;;:::o;39968:401::-;40184:12;:10;:12::i;:::-;40176:20;;:4;:20;;;:60;;;;40200:36;40217:4;40223:12;:10;:12::i;:::-;40200:16;:36::i;:::-;40176:60;40154:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;40316:45;40334:4;40340:2;40344;40348:6;40356:4;40316:17;:45::i;:::-;39968:401;;;;;:::o;8100:201::-;7422:12;:10;:12::i;:::-;7411:23;;:7;:5;:7::i;:::-;:23;;;7403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8209:1:::1;8189:22;;:8;:22;;::::0;8181:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8265:28;8284:8;8265:18;:28::i;:::-;8100:201:::0;:::o;52441:321::-;52592:12;:10;:12::i;:::-;52581:23;;:7;:23;;;:66;;;;52608:39;52625:7;52634:12;:10;:12::i;:::-;52608:16;:39::i;:::-;52581:66;52559:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;52729:25;52735:7;52744:2;52748:5;52729;:25::i;:::-;52441:321;;;:::o;5915:98::-;5968:7;5995:10;5988:17;;5915:98;:::o;24750:505::-;24839:22;24847:4;24853:7;24839;:22::i;:::-;24834:414;;25027:41;25055:7;25027:41;;25065:2;25027:19;:41::i;:::-;25141:38;25169:4;25161:13;;25176:2;25141:19;:38::i;:::-;24932:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24878:358;;;;;;;;;;;:::i;:::-;;;;;;;;24834:414;24750:505;;:::o;24017:204::-;24102:4;24141:32;24126:47;;;:11;:47;;;;:87;;;;24177:36;24201:11;24177:23;:36::i;:::-;24126:87;24119:94;;24017:204;;;:::o;44922:569::-;45089:1;45075:16;;:2;:16;;;45067:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45142:16;45161:12;:10;:12::i;:::-;45142:31;;45186:102;45207:8;45225:1;45229:2;45233:21;45251:2;45233:17;:21::i;:::-;45256:25;45274:6;45256:17;:25::i;:::-;45283:4;45186:20;:102::i;:::-;45322:6;45301:9;:13;45311:2;45301:13;;;;;;;;;;;:17;45315:2;45301:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45381:2;45344:52;;45377:1;45344:52;;45359:8;45344:52;;;45385:2;45389:6;45344:52;;;;;;;:::i;:::-;;;;;;;;45409:74;45440:8;45458:1;45462:2;45466;45470:6;45478:4;45409:30;:74::i;:::-;45056:435;44922:569;;;;:::o;42530:1074::-;42757:7;:14;42743:3;:10;:28;42735:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42849:1;42835:16;;:2;:16;;;42827:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42906:16;42925:12;:10;:12::i;:::-;42906:31;;42950:60;42971:8;42981:4;42987:2;42991:3;42996:7;43005:4;42950:20;:60::i;:::-;43028:9;43023:421;43047:3;:10;43043:1;:14;43023:421;;;43079:10;43092:3;43096:1;43092:6;;;;;;;;:::i;:::-;;;;;;;;43079:19;;43113:14;43130:7;43138:1;43130:10;;;;;;;;:::i;:::-;;;;;;;;43113:27;;43157:19;43179:9;:13;43189:2;43179:13;;;;;;;;;;;:19;43193:4;43179:19;;;;;;;;;;;;;;;;43157:41;;43236:6;43221:11;:21;;43213:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43369:6;43355:11;:20;43333:9;:13;43343:2;43333:13;;;;;;;;;;;:19;43347:4;43333:19;;;;;;;;;;;;;;;:42;;;;43426:6;43405:9;:13;43415:2;43405:13;;;;;;;;;;;:17;43419:2;43405:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;43064:380;;;43059:3;;;;:::i;:::-;;;43023:421;;;;43491:2;43461:47;;43485:4;43461:47;;43475:8;43461:47;;;43495:3;43500:7;43461:47;;;;;;;:::i;:::-;;;;;;;;43521:75;43557:8;43567:4;43573:2;43577:3;43582:7;43591:4;43521:35;:75::i;:::-;42724:880;42530:1074;;;;;:::o;28386:238::-;28470:22;28478:4;28484:7;28470;:22::i;:::-;28465:152;;28541:4;28509:6;:12;28516:4;28509:12;;;;;;;;;;;:20;;:29;28530:7;28509:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;28592:12;:10;:12::i;:::-;28565:40;;28583:7;28565:40;;28577:4;28565:40;;;;;;;;;;28465:152;28386:238;;:::o;28756:239::-;28840:22;28848:4;28854:7;28840;:22::i;:::-;28836:152;;;28911:5;28879:6;:12;28886:4;28879:12;;;;;;;;;;;:20;;:29;28900:7;28879:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;28963:12;:10;:12::i;:::-;28936:40;;28954:7;28936:40;;28948:4;28936:40;;;;;;;;;;28836:152;28756:239;;:::o;10850:120::-;10394:8;:6;:8::i;:::-;10386:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;10919:5:::1;10909:7;;:15;;;;;;;;;;;;;;;;;;10940:22;10949:12;:10;:12::i;:::-;10940:22;;;;;;:::i;:::-;;;;;;;;10850:120::o:0;47683:891::-;47851:1;47835:18;;:4;:18;;;47827:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47926:7;:14;47912:3;:10;:28;47904:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47998:16;48017:12;:10;:12::i;:::-;47998:31;;48042:66;48063:8;48073:4;48087:1;48091:3;48096:7;48042:66;;;;;;;;;;;;:20;:66::i;:::-;48126:9;48121:373;48145:3;:10;48141:1;:14;48121:373;;;48177:10;48190:3;48194:1;48190:6;;;;;;;;:::i;:::-;;;;;;;;48177:19;;48211:14;48228:7;48236:1;48228:10;;;;;;;;:::i;:::-;;;;;;;;48211:27;;48255:19;48277:9;:13;48287:2;48277:13;;;;;;;;;;;:19;48291:4;48277:19;;;;;;;;;;;;;;;;48255:41;;48334:6;48319:11;:21;;48311:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48461:6;48447:11;:20;48425:9;:13;48435:2;48425:13;;;;;;;;;;;:19;48439:4;48425:19;;;;;;;;;;;;;;;:42;;;;48162:332;;;48157:3;;;;;:::i;:::-;;;;48121:373;;;;48549:1;48511:55;;48535:4;48511:55;;48525:8;48511:55;;;48553:3;48558:7;48511:55;;;;;;;:::i;:::-;;;;;;;;47816:758;47683:891;;;:::o;8461:191::-;8535:16;8554:6;;;;;;;;;;;8535:25;;8580:8;8571:6;;:17;;;;;;;;;;;;;;;;;;8635:8;8604:40;;8625:8;8604:40;;;;;;;;;;;;8524:128;8461:191;:::o;10591:118::-;10117:8;:6;:8::i;:::-;10116:9;10108:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;10661:4:::1;10651:7;;:14;;;;;;;;;;;;;;;;;;10681:20;10688:12;:10;:12::i;:::-;10681:20;;;;;;:::i;:::-;;;;;;;;10591:118::o:0;48716:331::-;48871:8;48862:17;;:5;:17;;;48854:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48974:8;48936:18;:25;48955:5;48936:25;;;;;;;;;;;;;;;:35;48962:8;48936:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49020:8;48998:41;;49013:5;48998:41;;;49030:8;48998:41;;;;;;:::i;:::-;;;;;;;;48716:331;;;:::o;41352:820::-;41554:1;41540:16;;:2;:16;;;41532:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41611:16;41630:12;:10;:12::i;:::-;41611:31;;41655:96;41676:8;41686:4;41692:2;41696:21;41714:2;41696:17;:21::i;:::-;41719:25;41737:6;41719:17;:25::i;:::-;41746:4;41655:20;:96::i;:::-;41764:19;41786:9;:13;41796:2;41786:13;;;;;;;;;;;:19;41800:4;41786:19;;;;;;;;;;;;;;;;41764:41;;41839:6;41824:11;:21;;41816:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41964:6;41950:11;:20;41928:9;:13;41938:2;41928:13;;;;;;;;;;;:19;41942:4;41928:19;;;;;;;;;;;;;;;:42;;;;42013:6;41992:9;:13;42002:2;41992:13;;;;;;;;;;;:17;42006:2;41992:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;42068:2;42037:46;;42062:4;42037:46;;42052:8;42037:46;;;42072:2;42076:6;42037:46;;;;;;;:::i;:::-;;;;;;;;42096:68;42127:8;42137:4;42143:2;42147;42151:6;42159:4;42096:30;:68::i;:::-;41521:651;;41352:820;;;;;:::o;46832:648::-;46975:1;46959:18;;:4;:18;;;46951:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47030:16;47049:12;:10;:12::i;:::-;47030:31;;47074:102;47095:8;47105:4;47119:1;47123:21;47141:2;47123:17;:21::i;:::-;47146:25;47164:6;47146:17;:25::i;:::-;47074:102;;;;;;;;;;;;:20;:102::i;:::-;47189:19;47211:9;:13;47221:2;47211:13;;;;;;;;;;;:19;47225:4;47211:19;;;;;;;;;;;;;;;;47189:41;;47264:6;47249:11;:21;;47241:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47383:6;47369:11;:20;47347:9;:13;47357:2;47347:13;;;;;;;;;;;:19;47361:4;47347:19;;;;;;;;;;;;;;;:42;;;;47457:1;47418:54;;47443:4;47418:54;;47433:8;47418:54;;;47461:2;47465:6;47418:54;;;;;;;:::i;:::-;;;;;;;;46940:540;;46832:648;;;:::o;1737:451::-;1812:13;1838:19;1883:1;1874:6;1870:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1860:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1838:47;;1896:15;:6;1903:1;1896:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1922;:6;1929:1;1922:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1953:9;1978:1;1969:6;1965:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1953:26;;1948:135;1985:1;1981;:5;1948:135;;;2020:12;2041:3;2033:5;:11;2020:25;;;;;;;:::i;:::-;;;;;2008:6;2015:1;2008:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;2070:1;2060:11;;;;;1988:3;;;;:::i;:::-;;;1948:135;;;;2110:1;2101:5;:10;2093:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2173:6;2159:21;;;1737:451;;;;:::o;37530:310::-;37632:4;37684:26;37669:41;;;:11;:41;;;;:110;;;;37742:37;37727:52;;;:11;:52;;;;37669:110;:163;;;;37796:36;37820:11;37796:23;:36::i;:::-;37669:163;37649:183;;37530:310;;;:::o;51805:198::-;51871:16;51900:22;51939:1;51925:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51900:41;;51963:7;51952:5;51958:1;51952:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;51990:5;51983:12;;;51805:198;;;:::o;58787:314::-;10117:8;:6;:8::i;:::-;10116:9;10108:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;59027:66:::1;59054:8;59064:4;59070:2;59074:3;59079:7;59088:4;59027:26;:66::i;:::-;58787:314:::0;;;;;;:::o;50232:744::-;50447:15;:2;:13;;;:15::i;:::-;50443:526;;;50500:2;50483:38;;;50522:8;50532:4;50538:2;50542:6;50550:4;50483:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50479:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;50831:6;50824:14;;;;;;;;;;;:::i;:::-;;;;;;;;50479:479;;;50880:62;;;;;;;;;;:::i;:::-;;;;;;;;50479:479;50617:43;;;50605:55;;;:8;:55;;;;50601:154;;50685:50;;;;;;;;;;:::i;:::-;;;;;;;;50601:154;50556:214;50443:526;50232:744;;;;;;:::o;50984:813::-;51224:15;:2;:13;;;:15::i;:::-;51220:570;;;51277:2;51260:43;;;51304:8;51314:4;51320:3;51325:7;51334:4;51260:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51256:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;51652:6;51645:14;;;;;;;;;;;:::i;:::-;;;;;;;;51256:523;;;51701:62;;;;;;;;;;:::i;:::-;;;;;;;;51256:523;51433:48;;;51421:60;;;:8;:60;;;;51417:159;;51506:50;;;;;;;;;;:::i;:::-;;;;;;;;51417:159;51340:251;51220:570;50984:813;;;;;;:::o;21262:157::-;21347:4;21386:25;21371:40;;;:11;:40;;;;21364:47;;21262:157;;;:::o;54263:655::-;54502:66;54529:8;54539:4;54545:2;54549:3;54554:7;54563:4;54502:26;:66::i;:::-;54601:1;54585:18;;:4;:18;;;54581:160;;54625:9;54620:110;54644:3;:10;54640:1;:14;54620:110;;;54704:7;54712:1;54704:10;;;;;;;;:::i;:::-;;;;;;;;54680:12;:20;54693:3;54697:1;54693:6;;;;;;;;:::i;:::-;;;;;;;;54680:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;54656:3;;;;:::i;:::-;;;54620:110;;;;54581:160;54771:1;54757:16;;:2;:16;;;54753:158;;54795:9;54790:110;54814:3;:10;54810:1;:14;54790:110;;;54874:7;54882:1;54874:10;;;;;;;;:::i;:::-;;;;;;;;54850:12;:20;54863:3;54867:1;54863:6;;;;;;;;:::i;:::-;;;;;;;;54850:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;54826:3;;;;:::i;:::-;;;54790:110;;;;54753:158;54263:655;;;;;;:::o;12210:326::-;12270:4;12527:1;12505:7;:19;;;:23;12498:30;;12210:326;;;:::o;50003:221::-;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:117::-;2138:1;2135;2128:12;2152:102;2193:6;2244:2;2240:7;2235:2;2228:5;2224:14;2220:28;2210:38;;2152:102;;;:::o;2260:180::-;2308:77;2305:1;2298:88;2405:4;2402:1;2395:15;2429:4;2426:1;2419:15;2446:281;2529:27;2551:4;2529:27;:::i;:::-;2521:6;2517:40;2659:6;2647:10;2644:22;2623:18;2611:10;2608:34;2605:62;2602:88;;;2670:18;;:::i;:::-;2602:88;2710:10;2706:2;2699:22;2489:238;2446:281;;:::o;2733:129::-;2767:6;2794:20;;:::i;:::-;2784:30;;2823:33;2851:4;2843:6;2823:33;:::i;:::-;2733:129;;;:::o;2868:311::-;2945:4;3035:18;3027:6;3024:30;3021:56;;;3057:18;;:::i;:::-;3021:56;3107:4;3099:6;3095:17;3087:25;;3167:4;3161;3157:15;3149:23;;2868:311;;;:::o;3185:117::-;3294:1;3291;3284:12;3325:710;3421:5;3446:81;3462:64;3519:6;3462:64;:::i;:::-;3446:81;:::i;:::-;3437:90;;3547:5;3576:6;3569:5;3562:21;3610:4;3603:5;3599:16;3592:23;;3663:4;3655:6;3651:17;3643:6;3639:30;3692:3;3684:6;3681:15;3678:122;;;3711:79;;:::i;:::-;3678:122;3826:6;3809:220;3843:6;3838:3;3835:15;3809:220;;;3918:3;3947:37;3980:3;3968:10;3947:37;:::i;:::-;3942:3;3935:50;4014:4;4009:3;4005:14;3998:21;;3885:144;3869:4;3864:3;3860:14;3853:21;;3809:220;;;3813:21;3427:608;;3325:710;;;;;:::o;4058:370::-;4129:5;4178:3;4171:4;4163:6;4159:17;4155:27;4145:122;;4186:79;;:::i;:::-;4145:122;4303:6;4290:20;4328:94;4418:3;4410:6;4403:4;4395:6;4391:17;4328:94;:::i;:::-;4319:103;;4135:293;4058:370;;;;:::o;4434:321::-;4521:4;4611:18;4603:6;4600:30;4597:56;;;4633:18;;:::i;:::-;4597:56;4683:4;4675:6;4671:17;4663:25;;4743:4;4737;4733:15;4725:23;;4434:321;;;:::o;4761:117::-;4870:1;4867;4860:12;4884:308;4946:4;5036:18;5028:6;5025:30;5022:56;;;5058:18;;:::i;:::-;5022:56;5096:29;5118:6;5096:29;:::i;:::-;5088:37;;5180:4;5174;5170:15;5162:23;;4884:308;;;:::o;5198:146::-;5295:6;5290:3;5285;5272:30;5336:1;5327:6;5322:3;5318:16;5311:27;5198:146;;;:::o;5350:425::-;5428:5;5453:66;5469:49;5511:6;5469:49;:::i;:::-;5453:66;:::i;:::-;5444:75;;5542:6;5535:5;5528:21;5580:4;5573:5;5569:16;5618:3;5609:6;5604:3;5600:16;5597:25;5594:112;;;5625:79;;:::i;:::-;5594:112;5715:54;5762:6;5757:3;5752;5715:54;:::i;:::-;5434:341;5350:425;;;;;:::o;5795:340::-;5851:5;5900:3;5893:4;5885:6;5881:17;5877:27;5867:122;;5908:79;;:::i;:::-;5867:122;6025:6;6012:20;6050:79;6125:3;6117:6;6110:4;6102:6;6098:17;6050:79;:::i;:::-;6041:88;;5857:278;5795:340;;;;:::o;6157:945::-;6263:5;6288:91;6304:74;6371:6;6304:74;:::i;:::-;6288:91;:::i;:::-;6279:100;;6399:5;6428:6;6421:5;6414:21;6462:4;6455:5;6451:16;6444:23;;6515:4;6507:6;6503:17;6495:6;6491:30;6544:3;6536:6;6533:15;6530:122;;;6563:79;;:::i;:::-;6530:122;6678:6;6661:435;6695:6;6690:3;6687:15;6661:435;;;6784:3;6771:17;6820:18;6807:11;6804:35;6801:122;;;6842:79;;:::i;:::-;6801:122;6966:11;6958:6;6954:24;7004:47;7047:3;7035:10;7004:47;:::i;:::-;6999:3;6992:60;7081:4;7076:3;7072:14;7065:21;;6737:359;;6721:4;6716:3;6712:14;6705:21;;6661:435;;;6665:21;6269:833;;6157:945;;;;;:::o;7124:390::-;7205:5;7254:3;7247:4;7239:6;7235:17;7231:27;7221:122;;7262:79;;:::i;:::-;7221:122;7379:6;7366:20;7404:104;7504:3;7496:6;7489:4;7481:6;7477:17;7404:104;:::i;:::-;7395:113;;7211:303;7124:390;;;;:::o;7520:914::-;7648:6;7656;7705:2;7693:9;7684:7;7680:23;7676:32;7673:119;;;7711:79;;:::i;:::-;7673:119;7859:1;7848:9;7844:17;7831:31;7889:18;7881:6;7878:30;7875:117;;;7911:79;;:::i;:::-;7875:117;8016:78;8086:7;8077:6;8066:9;8062:22;8016:78;:::i;:::-;8006:88;;7802:302;8171:2;8160:9;8156:18;8143:32;8202:18;8194:6;8191:30;8188:117;;;8224:79;;:::i;:::-;8188:117;8329:88;8409:7;8400:6;8389:9;8385:22;8329:88;:::i;:::-;8319:98;;8114:313;7520:914;;;;;:::o;8440:149::-;8476:7;8516:66;8509:5;8505:78;8494:89;;8440:149;;;:::o;8595:120::-;8667:23;8684:5;8667:23;:::i;:::-;8660:5;8657:34;8647:62;;8705:1;8702;8695:12;8647:62;8595:120;:::o;8721:137::-;8766:5;8804:6;8791:20;8782:29;;8820:32;8846:5;8820:32;:::i;:::-;8721:137;;;;:::o;8864:327::-;8922:6;8971:2;8959:9;8950:7;8946:23;8942:32;8939:119;;;8977:79;;:::i;:::-;8939:119;9097:1;9122:52;9166:7;9157:6;9146:9;9142:22;9122:52;:::i;:::-;9112:62;;9068:116;8864:327;;;;:::o;9197:90::-;9231:7;9274:5;9267:13;9260:21;9249:32;;9197:90;;;:::o;9293:109::-;9374:21;9389:5;9374:21;:::i;:::-;9369:3;9362:34;9293:109;;:::o;9408:210::-;9495:4;9533:2;9522:9;9518:18;9510:26;;9546:65;9608:1;9597:9;9593:17;9584:6;9546:65;:::i;:::-;9408:210;;;;:::o;9624:99::-;9676:6;9710:5;9704:12;9694:22;;9624:99;;;:::o;9729:169::-;9813:11;9847:6;9842:3;9835:19;9887:4;9882:3;9878:14;9863:29;;9729:169;;;;:::o;9904:246::-;9985:1;9995:113;10009:6;10006:1;10003:13;9995:113;;;10094:1;10089:3;10085:11;10079:18;10075:1;10070:3;10066:11;10059:39;10031:2;10028:1;10024:10;10019:15;;9995:113;;;10142:1;10133:6;10128:3;10124:16;10117:27;9966:184;9904:246;;;:::o;10156:377::-;10244:3;10272:39;10305:5;10272:39;:::i;:::-;10327:71;10391:6;10386:3;10327:71;:::i;:::-;10320:78;;10407:65;10465:6;10460:3;10453:4;10446:5;10442:16;10407:65;:::i;:::-;10497:29;10519:6;10497:29;:::i;:::-;10492:3;10488:39;10481:46;;10248:285;10156:377;;;;:::o;10539:313::-;10652:4;10690:2;10679:9;10675:18;10667:26;;10739:9;10733:4;10729:20;10725:1;10714:9;10710:17;10703:47;10767:78;10840:4;10831:6;10767:78;:::i;:::-;10759:86;;10539:313;;;;:::o;10858:329::-;10917:6;10966:2;10954:9;10945:7;10941:23;10937:32;10934:119;;;10972:79;;:::i;:::-;10934:119;11092:1;11117:53;11162:7;11153:6;11142:9;11138:22;11117:53;:::i;:::-;11107:63;;11063:117;10858:329;;;;:::o;11193:307::-;11254:4;11344:18;11336:6;11333:30;11330:56;;;11366:18;;:::i;:::-;11330:56;11404:29;11426:6;11404:29;:::i;:::-;11396:37;;11488:4;11482;11478:15;11470:23;;11193:307;;;:::o;11506:423::-;11583:5;11608:65;11624:48;11665:6;11624:48;:::i;:::-;11608:65;:::i;:::-;11599:74;;11696:6;11689:5;11682:21;11734:4;11727:5;11723:16;11772:3;11763:6;11758:3;11754:16;11751:25;11748:112;;;11779:79;;:::i;:::-;11748:112;11869:54;11916:6;11911:3;11906;11869:54;:::i;:::-;11589:340;11506:423;;;;;:::o;11948:338::-;12003:5;12052:3;12045:4;12037:6;12033:17;12029:27;12019:122;;12060:79;;:::i;:::-;12019:122;12177:6;12164:20;12202:78;12276:3;12268:6;12261:4;12253:6;12249:17;12202:78;:::i;:::-;12193:87;;12009:277;11948:338;;;;:::o;12292:1269::-;12406:6;12414;12422;12430;12438;12487:3;12475:9;12466:7;12462:23;12458:33;12455:120;;;12494:79;;:::i;:::-;12455:120;12614:1;12639:53;12684:7;12675:6;12664:9;12660:22;12639:53;:::i;:::-;12629:63;;12585:117;12741:2;12767:53;12812:7;12803:6;12792:9;12788:22;12767:53;:::i;:::-;12757:63;;12712:118;12869:2;12895:53;12940:7;12931:6;12920:9;12916:22;12895:53;:::i;:::-;12885:63;;12840:118;13025:2;13014:9;13010:18;12997:32;13056:18;13048:6;13045:30;13042:117;;;13078:79;;:::i;:::-;13042:117;13183:62;13237:7;13228:6;13217:9;13213:22;13183:62;:::i;:::-;13173:72;;12968:287;13322:3;13311:9;13307:19;13294:33;13354:18;13346:6;13343:30;13340:117;;;13376:79;;:::i;:::-;13340:117;13481:63;13536:7;13527:6;13516:9;13512:22;13481:63;:::i;:::-;13471:73;;13265:289;12292:1269;;;;;;;;:::o;13567:77::-;13604:7;13633:5;13622:16;;13567:77;;;:::o;13650:122::-;13723:24;13741:5;13723:24;:::i;:::-;13716:5;13713:35;13703:63;;13762:1;13759;13752:12;13703:63;13650:122;:::o;13778:139::-;13824:5;13862:6;13849:20;13840:29;;13878:33;13905:5;13878:33;:::i;:::-;13778:139;;;;:::o;13923:329::-;13982:6;14031:2;14019:9;14010:7;14006:23;14002:32;13999:119;;;14037:79;;:::i;:::-;13999:119;14157:1;14182:53;14227:7;14218:6;14207:9;14203:22;14182:53;:::i;:::-;14172:63;;14128:117;13923:329;;;;:::o;14258:118::-;14345:24;14363:5;14345:24;:::i;:::-;14340:3;14333:37;14258:118;;:::o;14382:222::-;14475:4;14513:2;14502:9;14498:18;14490:26;;14526:71;14594:1;14583:9;14579:17;14570:6;14526:71;:::i;:::-;14382:222;;;;:::o;14610:1509::-;14764:6;14772;14780;14788;14796;14845:3;14833:9;14824:7;14820:23;14816:33;14813:120;;;14852:79;;:::i;:::-;14813:120;14972:1;14997:53;15042:7;15033:6;15022:9;15018:22;14997:53;:::i;:::-;14987:63;;14943:117;15099:2;15125:53;15170:7;15161:6;15150:9;15146:22;15125:53;:::i;:::-;15115:63;;15070:118;15255:2;15244:9;15240:18;15227:32;15286:18;15278:6;15275:30;15272:117;;;15308:79;;:::i;:::-;15272:117;15413:78;15483:7;15474:6;15463:9;15459:22;15413:78;:::i;:::-;15403:88;;15198:303;15568:2;15557:9;15553:18;15540:32;15599:18;15591:6;15588:30;15585:117;;;15621:79;;:::i;:::-;15585:117;15726:78;15796:7;15787:6;15776:9;15772:22;15726:78;:::i;:::-;15716:88;;15511:303;15881:3;15870:9;15866:19;15853:33;15913:18;15905:6;15902:30;15899:117;;;15935:79;;:::i;:::-;15899:117;16040:62;16094:7;16085:6;16074:9;16070:22;16040:62;:::i;:::-;16030:72;;15824:288;14610:1509;;;;;;;;:::o;16125:474::-;16193:6;16201;16250:2;16238:9;16229:7;16225:23;16221:32;16218:119;;;16256:79;;:::i;:::-;16218:119;16376:1;16401:53;16446:7;16437:6;16426:9;16422:22;16401:53;:::i;:::-;16391:63;;16347:117;16503:2;16529:53;16574:7;16565:6;16554:9;16550:22;16529:53;:::i;:::-;16519:63;;16474:118;16125:474;;;;;:::o;16605:311::-;16682:4;16772:18;16764:6;16761:30;16758:56;;;16794:18;;:::i;:::-;16758:56;16844:4;16836:6;16832:17;16824:25;;16904:4;16898;16894:15;16886:23;;16605:311;;;:::o;16939:710::-;17035:5;17060:81;17076:64;17133:6;17076:64;:::i;:::-;17060:81;:::i;:::-;17051:90;;17161:5;17190:6;17183:5;17176:21;17224:4;17217:5;17213:16;17206:23;;17277:4;17269:6;17265:17;17257:6;17253:30;17306:3;17298:6;17295:15;17292:122;;;17325:79;;:::i;:::-;17292:122;17440:6;17423:220;17457:6;17452:3;17449:15;17423:220;;;17532:3;17561:37;17594:3;17582:10;17561:37;:::i;:::-;17556:3;17549:50;17628:4;17623:3;17619:14;17612:21;;17499:144;17483:4;17478:3;17474:14;17467:21;;17423:220;;;17427:21;17041:608;;16939:710;;;;;:::o;17672:370::-;17743:5;17792:3;17785:4;17777:6;17773:17;17769:27;17759:122;;17800:79;;:::i;:::-;17759:122;17917:6;17904:20;17942:94;18032:3;18024:6;18017:4;18009:6;18005:17;17942:94;:::i;:::-;17933:103;;17749:293;17672:370;;;;:::o;18048:894::-;18166:6;18174;18223:2;18211:9;18202:7;18198:23;18194:32;18191:119;;;18229:79;;:::i;:::-;18191:119;18377:1;18366:9;18362:17;18349:31;18407:18;18399:6;18396:30;18393:117;;;18429:79;;:::i;:::-;18393:117;18534:78;18604:7;18595:6;18584:9;18580:22;18534:78;:::i;:::-;18524:88;;18320:302;18689:2;18678:9;18674:18;18661:32;18720:18;18712:6;18709:30;18706:117;;;18742:79;;:::i;:::-;18706:117;18847:78;18917:7;18908:6;18897:9;18893:22;18847:78;:::i;:::-;18837:88;;18632:303;18048:894;;;;;:::o;18948:114::-;19015:6;19049:5;19043:12;19033:22;;18948:114;;;:::o;19068:184::-;19167:11;19201:6;19196:3;19189:19;19241:4;19236:3;19232:14;19217:29;;19068:184;;;;:::o;19258:132::-;19325:4;19348:3;19340:11;;19378:4;19373:3;19369:14;19361:22;;19258:132;;;:::o;19396:108::-;19473:24;19491:5;19473:24;:::i;:::-;19468:3;19461:37;19396:108;;:::o;19510:179::-;19579:10;19600:46;19642:3;19634:6;19600:46;:::i;:::-;19678:4;19673:3;19669:14;19655:28;;19510:179;;;;:::o;19695:113::-;19765:4;19797;19792:3;19788:14;19780:22;;19695:113;;;:::o;19844:732::-;19963:3;19992:54;20040:5;19992:54;:::i;:::-;20062:86;20141:6;20136:3;20062:86;:::i;:::-;20055:93;;20172:56;20222:5;20172:56;:::i;:::-;20251:7;20282:1;20267:284;20292:6;20289:1;20286:13;20267:284;;;20368:6;20362:13;20395:63;20454:3;20439:13;20395:63;:::i;:::-;20388:70;;20481:60;20534:6;20481:60;:::i;:::-;20471:70;;20327:224;20314:1;20311;20307:9;20302:14;;20267:284;;;20271:14;20567:3;20560:10;;19968:608;;;19844:732;;;;:::o;20582:373::-;20725:4;20763:2;20752:9;20748:18;20740:26;;20812:9;20806:4;20802:20;20798:1;20787:9;20783:17;20776:47;20840:108;20943:4;20934:6;20840:108;:::i;:::-;20832:116;;20582:373;;;;:::o;20961:509::-;21030:6;21079:2;21067:9;21058:7;21054:23;21050:32;21047:119;;;21085:79;;:::i;:::-;21047:119;21233:1;21222:9;21218:17;21205:31;21263:18;21255:6;21252:30;21249:117;;;21285:79;;:::i;:::-;21249:117;21390:63;21445:7;21436:6;21425:9;21421:22;21390:63;:::i;:::-;21380:73;;21176:287;20961:509;;;;:::o;21476:1039::-;21603:6;21611;21619;21668:2;21656:9;21647:7;21643:23;21639:32;21636:119;;;21674:79;;:::i;:::-;21636:119;21794:1;21819:53;21864:7;21855:6;21844:9;21840:22;21819:53;:::i;:::-;21809:63;;21765:117;21949:2;21938:9;21934:18;21921:32;21980:18;21972:6;21969:30;21966:117;;;22002:79;;:::i;:::-;21966:117;22107:78;22177:7;22168:6;22157:9;22153:22;22107:78;:::i;:::-;22097:88;;21892:303;22262:2;22251:9;22247:18;22234:32;22293:18;22285:6;22282:30;22279:117;;;22315:79;;:::i;:::-;22279:117;22420:78;22490:7;22481:6;22470:9;22466:22;22420:78;:::i;:::-;22410:88;;22205:303;21476:1039;;;;;:::o;22521:943::-;22616:6;22624;22632;22640;22689:3;22677:9;22668:7;22664:23;22660:33;22657:120;;;22696:79;;:::i;:::-;22657:120;22816:1;22841:53;22886:7;22877:6;22866:9;22862:22;22841:53;:::i;:::-;22831:63;;22787:117;22943:2;22969:53;23014:7;23005:6;22994:9;22990:22;22969:53;:::i;:::-;22959:63;;22914:118;23071:2;23097:53;23142:7;23133:6;23122:9;23118:22;23097:53;:::i;:::-;23087:63;;23042:118;23227:2;23216:9;23212:18;23199:32;23258:18;23250:6;23247:30;23244:117;;;23280:79;;:::i;:::-;23244:117;23385:62;23439:7;23430:6;23419:9;23415:22;23385:62;:::i;:::-;23375:72;;23170:287;22521:943;;;;;;;:::o;23470:654::-;23548:6;23556;23605:2;23593:9;23584:7;23580:23;23576:32;23573:119;;;23611:79;;:::i;:::-;23573:119;23731:1;23756:53;23801:7;23792:6;23781:9;23777:22;23756:53;:::i;:::-;23746:63;;23702:117;23886:2;23875:9;23871:18;23858:32;23917:18;23909:6;23906:30;23903:117;;;23939:79;;:::i;:::-;23903:117;24044:63;24099:7;24090:6;24079:9;24075:22;24044:63;:::i;:::-;24034:73;;23829:288;23470:654;;;;;:::o;24130:118::-;24217:24;24235:5;24217:24;:::i;:::-;24212:3;24205:37;24130:118;;:::o;24254:222::-;24347:4;24385:2;24374:9;24370:18;24362:26;;24398:71;24466:1;24455:9;24451:17;24442:6;24398:71;:::i;:::-;24254:222;;;;:::o;24482:116::-;24552:21;24567:5;24552:21;:::i;:::-;24545:5;24542:32;24532:60;;24588:1;24585;24578:12;24532:60;24482:116;:::o;24604:133::-;24647:5;24685:6;24672:20;24663:29;;24701:30;24725:5;24701:30;:::i;:::-;24604:133;;;;:::o;24743:468::-;24808:6;24816;24865:2;24853:9;24844:7;24840:23;24836:32;24833:119;;;24871:79;;:::i;:::-;24833:119;24991:1;25016:53;25061:7;25052:6;25041:9;25037:22;25016:53;:::i;:::-;25006:63;;24962:117;25118:2;25144:50;25186:7;25177:6;25166:9;25162:22;25144:50;:::i;:::-;25134:60;;25089:115;24743:468;;;;;:::o;25217:1573::-;25387:6;25395;25403;25411;25460:3;25448:9;25439:7;25435:23;25431:33;25428:120;;;25467:79;;:::i;:::-;25428:120;25615:1;25604:9;25600:17;25587:31;25645:18;25637:6;25634:30;25631:117;;;25667:79;;:::i;:::-;25631:117;25772:78;25842:7;25833:6;25822:9;25818:22;25772:78;:::i;:::-;25762:88;;25558:302;25927:2;25916:9;25912:18;25899:32;25958:18;25950:6;25947:30;25944:117;;;25980:79;;:::i;:::-;25944:117;26085:78;26155:7;26146:6;26135:9;26131:22;26085:78;:::i;:::-;26075:88;;25870:303;26240:2;26229:9;26225:18;26212:32;26271:18;26263:6;26260:30;26257:117;;;26293:79;;:::i;:::-;26257:117;26398:78;26468:7;26459:6;26448:9;26444:22;26398:78;:::i;:::-;26388:88;;26183:303;26553:2;26542:9;26538:18;26525:32;26584:18;26576:6;26573:30;26570:117;;;26606:79;;:::i;:::-;26570:117;26711:62;26765:7;26756:6;26745:9;26741:22;26711:62;:::i;:::-;26701:72;;26496:287;25217:1573;;;;;;;:::o;26796:474::-;26864:6;26872;26921:2;26909:9;26900:7;26896:23;26892:32;26889:119;;;26927:79;;:::i;:::-;26889:119;27047:1;27072:53;27117:7;27108:6;27097:9;27093:22;27072:53;:::i;:::-;27062:63;;27018:117;27174:2;27200:53;27245:7;27236:6;27225:9;27221:22;27200:53;:::i;:::-;27190:63;;27145:118;26796:474;;;;;:::o;27276:1949::-;27490:6;27498;27506;27514;27522;27571:3;27559:9;27550:7;27546:23;27542:33;27539:120;;;27578:79;;:::i;:::-;27539:120;27726:1;27715:9;27711:17;27698:31;27756:18;27748:6;27745:30;27742:117;;;27778:79;;:::i;:::-;27742:117;27883:78;27953:7;27944:6;27933:9;27929:22;27883:78;:::i;:::-;27873:88;;27669:302;28038:2;28027:9;28023:18;28010:32;28069:18;28061:6;28058:30;28055:117;;;28091:79;;:::i;:::-;28055:117;28196:78;28266:7;28257:6;28246:9;28242:22;28196:78;:::i;:::-;28186:88;;27981:303;28351:2;28340:9;28336:18;28323:32;28382:18;28374:6;28371:30;28368:117;;;28404:79;;:::i;:::-;28368:117;28509:78;28579:7;28570:6;28559:9;28555:22;28509:78;:::i;:::-;28499:88;;28294:303;28664:2;28653:9;28649:18;28636:32;28695:18;28687:6;28684:30;28681:117;;;28717:79;;:::i;:::-;28681:117;28822:62;28876:7;28867:6;28856:9;28852:22;28822:62;:::i;:::-;28812:72;;28607:287;28961:3;28950:9;28946:19;28933:33;28993:18;28985:6;28982:30;28979:117;;;29015:79;;:::i;:::-;28979:117;29120:88;29200:7;29191:6;29180:9;29176:22;29120:88;:::i;:::-;29110:98;;28904:314;27276:1949;;;;;;;;:::o;29231:1089::-;29335:6;29343;29351;29359;29367;29416:3;29404:9;29395:7;29391:23;29387:33;29384:120;;;29423:79;;:::i;:::-;29384:120;29543:1;29568:53;29613:7;29604:6;29593:9;29589:22;29568:53;:::i;:::-;29558:63;;29514:117;29670:2;29696:53;29741:7;29732:6;29721:9;29717:22;29696:53;:::i;:::-;29686:63;;29641:118;29798:2;29824:53;29869:7;29860:6;29849:9;29845:22;29824:53;:::i;:::-;29814:63;;29769:118;29926:2;29952:53;29997:7;29988:6;29977:9;29973:22;29952:53;:::i;:::-;29942:63;;29897:118;30082:3;30071:9;30067:19;30054:33;30114:18;30106:6;30103:30;30100:117;;;30136:79;;:::i;:::-;30100:117;30241:62;30295:7;30286:6;30275:9;30271:22;30241:62;:::i;:::-;30231:72;;30025:288;29231:1089;;;;;;;;:::o;30326:329::-;30385:6;30434:2;30422:9;30413:7;30409:23;30405:32;30402:119;;;30440:79;;:::i;:::-;30402:119;30560:1;30585:53;30630:7;30621:6;30610:9;30606:22;30585:53;:::i;:::-;30575:63;;30531:117;30326:329;;;;:::o;30661:619::-;30738:6;30746;30754;30803:2;30791:9;30782:7;30778:23;30774:32;30771:119;;;30809:79;;:::i;:::-;30771:119;30929:1;30954:53;30999:7;30990:6;30979:9;30975:22;30954:53;:::i;:::-;30944:63;;30900:117;31056:2;31082:53;31127:7;31118:6;31107:9;31103:22;31082:53;:::i;:::-;31072:63;;31027:118;31184:2;31210:53;31255:7;31246:6;31235:9;31231:22;31210:53;:::i;:::-;31200:63;;31155:118;30661:619;;;;;:::o;31286:230::-;31426:34;31422:1;31414:6;31410:14;31403:58;31495:13;31490:2;31482:6;31478:15;31471:38;31286:230;:::o;31522:366::-;31664:3;31685:67;31749:2;31744:3;31685:67;:::i;:::-;31678:74;;31761:93;31850:3;31761:93;:::i;:::-;31879:2;31874:3;31870:12;31863:19;;31522:366;;;:::o;31894:419::-;32060:4;32098:2;32087:9;32083:18;32075:26;;32147:9;32141:4;32137:20;32133:1;32122:9;32118:17;32111:47;32175:131;32301:4;32175:131;:::i;:::-;32167:139;;31894:419;;;:::o;32319:220::-;32459:34;32455:1;32447:6;32443:14;32436:58;32528:3;32523:2;32515:6;32511:15;32504:28;32319:220;:::o;32545:366::-;32687:3;32708:67;32772:2;32767:3;32708:67;:::i;:::-;32701:74;;32784:93;32873:3;32784:93;:::i;:::-;32902:2;32897:3;32893:12;32886:19;;32545:366;;;:::o;32917:419::-;33083:4;33121:2;33110:9;33106:18;33098:26;;33170:9;33164:4;33160:20;33156:1;33145:9;33141:17;33134:47;33198:131;33324:4;33198:131;:::i;:::-;33190:139;;32917:419;;;:::o;33342:180::-;33390:77;33387:1;33380:88;33487:4;33484:1;33477:15;33511:4;33508:1;33501:15;33528:178;33668:30;33664:1;33656:6;33652:14;33645:54;33528:178;:::o;33712:366::-;33854:3;33875:67;33939:2;33934:3;33875:67;:::i;:::-;33868:74;;33951:93;34040:3;33951:93;:::i;:::-;34069:2;34064:3;34060:12;34053:19;;33712:366;;;:::o;34084:419::-;34250:4;34288:2;34277:9;34273:18;34265:26;;34337:9;34331:4;34327:20;34323:1;34312:9;34308:17;34301:47;34365:131;34491:4;34365:131;:::i;:::-;34357:139;;34084:419;;;:::o;34509:180::-;34557:77;34554:1;34547:88;34654:4;34651:1;34644:15;34678:4;34675:1;34668:15;34695:320;34739:6;34776:1;34770:4;34766:12;34756:22;;34823:1;34817:4;34813:12;34844:18;34834:81;;34900:4;34892:6;34888:17;34878:27;;34834:81;34962:2;34954:6;34951:14;34931:18;34928:38;34925:84;;34981:18;;:::i;:::-;34925:84;34746:269;34695:320;;;:::o;35021:141::-;35070:4;35093:3;35085:11;;35116:3;35113:1;35106:14;35150:4;35147:1;35137:18;35129:26;;35021:141;;;:::o;35168:93::-;35205:6;35252:2;35247;35240:5;35236:14;35232:23;35222:33;;35168:93;;;:::o;35267:107::-;35311:8;35361:5;35355:4;35351:16;35330:37;;35267:107;;;;:::o;35380:393::-;35449:6;35499:1;35487:10;35483:18;35522:97;35552:66;35541:9;35522:97;:::i;:::-;35640:39;35670:8;35659:9;35640:39;:::i;:::-;35628:51;;35712:4;35708:9;35701:5;35697:21;35688:30;;35761:4;35751:8;35747:19;35740:5;35737:30;35727:40;;35456:317;;35380:393;;;;;:::o;35779:60::-;35807:3;35828:5;35821:12;;35779:60;;;:::o;35845:142::-;35895:9;35928:53;35946:34;35955:24;35973:5;35955:24;:::i;:::-;35946:34;:::i;:::-;35928:53;:::i;:::-;35915:66;;35845:142;;;:::o;35993:75::-;36036:3;36057:5;36050:12;;35993:75;;;:::o;36074:269::-;36184:39;36215:7;36184:39;:::i;:::-;36245:91;36294:41;36318:16;36294:41;:::i;:::-;36286:6;36279:4;36273:11;36245:91;:::i;:::-;36239:4;36232:105;36150:193;36074:269;;;:::o;36349:73::-;36394:3;36349:73;:::o;36428:189::-;36505:32;;:::i;:::-;36546:65;36604:6;36596;36590:4;36546:65;:::i;:::-;36481:136;36428:189;;:::o;36623:186::-;36683:120;36700:3;36693:5;36690:14;36683:120;;;36754:39;36791:1;36784:5;36754:39;:::i;:::-;36727:1;36720:5;36716:13;36707:22;;36683:120;;;36623:186;;:::o;36815:543::-;36916:2;36911:3;36908:11;36905:446;;;36950:38;36982:5;36950:38;:::i;:::-;37034:29;37052:10;37034:29;:::i;:::-;37024:8;37020:44;37217:2;37205:10;37202:18;37199:49;;;37238:8;37223:23;;37199:49;37261:80;37317:22;37335:3;37317:22;:::i;:::-;37307:8;37303:37;37290:11;37261:80;:::i;:::-;36920:431;;36905:446;36815:543;;;:::o;37364:117::-;37418:8;37468:5;37462:4;37458:16;37437:37;;37364:117;;;;:::o;37487:169::-;37531:6;37564:51;37612:1;37608:6;37600:5;37597:1;37593:13;37564:51;:::i;:::-;37560:56;37645:4;37639;37635:15;37625:25;;37538:118;37487:169;;;;:::o;37661:295::-;37737:4;37883:29;37908:3;37902:4;37883:29;:::i;:::-;37875:37;;37945:3;37942:1;37938:11;37932:4;37929:21;37921:29;;37661:295;;;;:::o;37961:1395::-;38078:37;38111:3;38078:37;:::i;:::-;38180:18;38172:6;38169:30;38166:56;;;38202:18;;:::i;:::-;38166:56;38246:38;38278:4;38272:11;38246:38;:::i;:::-;38331:67;38391:6;38383;38377:4;38331:67;:::i;:::-;38425:1;38449:4;38436:17;;38481:2;38473:6;38470:14;38498:1;38493:618;;;;39155:1;39172:6;39169:77;;;39221:9;39216:3;39212:19;39206:26;39197:35;;39169:77;39272:67;39332:6;39325:5;39272:67;:::i;:::-;39266:4;39259:81;39128:222;38463:887;;38493:618;38545:4;38541:9;38533:6;38529:22;38579:37;38611:4;38579:37;:::i;:::-;38638:1;38652:208;38666:7;38663:1;38660:14;38652:208;;;38745:9;38740:3;38736:19;38730:26;38722:6;38715:42;38796:1;38788:6;38784:14;38774:24;;38843:2;38832:9;38828:18;38815:31;;38689:4;38686:1;38682:12;38677:17;;38652:208;;;38888:6;38879:7;38876:19;38873:179;;;38946:9;38941:3;38937:19;38931:26;38989:48;39031:4;39023:6;39019:17;39008:9;38989:48;:::i;:::-;38981:6;38974:64;38896:156;38873:179;39098:1;39094;39086:6;39082:14;39078:22;39072:4;39065:36;38500:611;;;38463:887;;38053:1303;;;37961:1395;;:::o;39362:180::-;39410:77;39407:1;39400:88;39507:4;39504:1;39497:15;39531:4;39528:1;39521:15;39548:233;39587:3;39610:24;39628:5;39610:24;:::i;:::-;39601:33;;39656:66;39649:5;39646:77;39643:103;;39726:18;;:::i;:::-;39643:103;39773:1;39766:5;39762:13;39755:20;;39548:233;;;:::o;39787:181::-;39927:33;39923:1;39915:6;39911:14;39904:57;39787:181;:::o;39974:366::-;40116:3;40137:67;40201:2;40196:3;40137:67;:::i;:::-;40130:74;;40213:93;40302:3;40213:93;:::i;:::-;40331:2;40326:3;40322:12;40315:19;;39974:366;;;:::o;40346:419::-;40512:4;40550:2;40539:9;40535:18;40527:26;;40599:9;40593:4;40589:20;40585:1;40574:9;40570:17;40563:47;40627:131;40753:4;40627:131;:::i;:::-;40619:139;;40346:419;;;:::o;40771:148::-;40873:11;40910:3;40895:18;;40771:148;;;;:::o;40949:874::-;41052:3;41089:5;41083:12;41118:36;41144:9;41118:36;:::i;:::-;41170:89;41252:6;41247:3;41170:89;:::i;:::-;41163:96;;41290:1;41279:9;41275:17;41306:1;41301:166;;;;41481:1;41476:341;;;;41268:549;;41301:166;41385:4;41381:9;41370;41366:25;41361:3;41354:38;41447:6;41440:14;41433:22;41425:6;41421:35;41416:3;41412:45;41405:52;;41301:166;;41476:341;41543:38;41575:5;41543:38;:::i;:::-;41603:1;41617:154;41631:6;41628:1;41625:13;41617:154;;;41705:7;41699:14;41695:1;41690:3;41686:11;41679:35;41755:1;41746:7;41742:15;41731:26;;41653:4;41650:1;41646:12;41641:17;;41617:154;;;41800:6;41795:3;41791:16;41784:23;;41483:334;;41268:549;;41056:767;;40949:874;;;;:::o;41829:423::-;42003:3;42025:92;42113:3;42104:6;42025:92;:::i;:::-;42018:99;;42134:92;42222:3;42213:6;42134:92;:::i;:::-;42127:99;;42243:3;42236:10;;41829:423;;;;;:::o;42258:237::-;42398:34;42394:1;42386:6;42382:14;42375:58;42467:20;42462:2;42454:6;42450:15;42443:45;42258:237;:::o;42501:366::-;42643:3;42664:67;42728:2;42723:3;42664:67;:::i;:::-;42657:74;;42740:93;42829:3;42740:93;:::i;:::-;42858:2;42853:3;42849:12;42842:19;;42501:366;;;:::o;42873:419::-;43039:4;43077:2;43066:9;43062:18;43054:26;;43126:9;43120:4;43116:20;43112:1;43101:9;43097:17;43090:47;43154:131;43280:4;43154:131;:::i;:::-;43146:139;;42873:419;;;:::o;43298:234::-;43438:34;43434:1;43426:6;43422:14;43415:58;43507:17;43502:2;43494:6;43490:15;43483:42;43298:234;:::o;43538:366::-;43680:3;43701:67;43765:2;43760:3;43701:67;:::i;:::-;43694:74;;43777:93;43866:3;43777:93;:::i;:::-;43895:2;43890:3;43886:12;43879:19;;43538:366;;;:::o;43910:419::-;44076:4;44114:2;44103:9;44099:18;44091:26;;44163:9;44157:4;44153:20;44149:1;44138:9;44134:17;44127:47;44191:131;44317:4;44191:131;:::i;:::-;44183:139;;43910:419;;;:::o;44335:228::-;44475:34;44471:1;44463:6;44459:14;44452:58;44544:11;44539:2;44531:6;44527:15;44520:36;44335:228;:::o;44569:366::-;44711:3;44732:67;44796:2;44791:3;44732:67;:::i;:::-;44725:74;;44808:93;44897:3;44808:93;:::i;:::-;44926:2;44921:3;44917:12;44910:19;;44569:366;;;:::o;44941:419::-;45107:4;45145:2;45134:9;45130:18;45122:26;;45194:9;45188:4;45184:20;45180:1;45169:9;45165:17;45158:47;45222:131;45348:4;45222:131;:::i;:::-;45214:139;;44941:419;;;:::o;45366:228::-;45506:34;45502:1;45494:6;45490:14;45483:58;45575:11;45570:2;45562:6;45558:15;45551:36;45366:228;:::o;45600:366::-;45742:3;45763:67;45827:2;45822:3;45763:67;:::i;:::-;45756:74;;45839:93;45928:3;45839:93;:::i;:::-;45957:2;45952:3;45948:12;45941:19;;45600:366;;;:::o;45972:419::-;46138:4;46176:2;46165:9;46161:18;46153:26;;46225:9;46219:4;46215:20;46211:1;46200:9;46196:17;46189:47;46253:131;46379:4;46253:131;:::i;:::-;46245:139;;45972:419;;;:::o;46397:182::-;46537:34;46533:1;46525:6;46521:14;46514:58;46397:182;:::o;46585:366::-;46727:3;46748:67;46812:2;46807:3;46748:67;:::i;:::-;46741:74;;46824:93;46913:3;46824:93;:::i;:::-;46942:2;46937:3;46933:12;46926:19;;46585:366;;;:::o;46957:419::-;47123:4;47161:2;47150:9;47146:18;47138:26;;47210:9;47204:4;47200:20;47196:1;47185:9;47181:17;47174:47;47238:131;47364:4;47238:131;:::i;:::-;47230:139;;46957:419;;;:::o;47382:165::-;47522:17;47518:1;47510:6;47506:14;47499:41;47382:165;:::o;47553:366::-;47695:3;47716:67;47780:2;47775:3;47716:67;:::i;:::-;47709:74;;47792:93;47881:3;47792:93;:::i;:::-;47910:2;47905:3;47901:12;47894:19;;47553:366;;;:::o;47925:419::-;48091:4;48129:2;48118:9;48114:18;48106:26;;48178:9;48172:4;48168:20;48164:1;48153:9;48149:17;48142:47;48206:131;48332:4;48206:131;:::i;:::-;48198:139;;47925:419;;;:::o;48350:225::-;48490:34;48486:1;48478:6;48474:14;48467:58;48559:8;48554:2;48546:6;48542:15;48535:33;48350:225;:::o;48581:366::-;48723:3;48744:67;48808:2;48803:3;48744:67;:::i;:::-;48737:74;;48820:93;48909:3;48820:93;:::i;:::-;48938:2;48933:3;48929:12;48922:19;;48581:366;;;:::o;48953:419::-;49119:4;49157:2;49146:9;49142:18;49134:26;;49206:9;49200:4;49196:20;49192:1;49181:9;49177:17;49170:47;49234:131;49360:4;49234:131;:::i;:::-;49226:139;;48953:419;;;:::o;49378:173::-;49518:25;49514:1;49506:6;49502:14;49495:49;49378:173;:::o;49557:402::-;49717:3;49738:85;49820:2;49815:3;49738:85;:::i;:::-;49731:92;;49832:93;49921:3;49832:93;:::i;:::-;49950:2;49945:3;49941:12;49934:19;;49557:402;;;:::o;49965:390::-;50071:3;50099:39;50132:5;50099:39;:::i;:::-;50154:89;50236:6;50231:3;50154:89;:::i;:::-;50147:96;;50252:65;50310:6;50305:3;50298:4;50291:5;50287:16;50252:65;:::i;:::-;50342:6;50337:3;50333:16;50326:23;;50075:280;49965:390;;;;:::o;50361:167::-;50501:19;50497:1;50489:6;50485:14;50478:43;50361:167;:::o;50534:402::-;50694:3;50715:85;50797:2;50792:3;50715:85;:::i;:::-;50708:92;;50809:93;50898:3;50809:93;:::i;:::-;50927:2;50922:3;50918:12;50911:19;;50534:402;;;:::o;50942:967::-;51324:3;51346:148;51490:3;51346:148;:::i;:::-;51339:155;;51511:95;51602:3;51593:6;51511:95;:::i;:::-;51504:102;;51623:148;51767:3;51623:148;:::i;:::-;51616:155;;51788:95;51879:3;51870:6;51788:95;:::i;:::-;51781:102;;51900:3;51893:10;;50942:967;;;;;:::o;51915:220::-;52055:34;52051:1;52043:6;52039:14;52032:58;52124:3;52119:2;52111:6;52107:15;52100:28;51915:220;:::o;52141:366::-;52283:3;52304:67;52368:2;52363:3;52304:67;:::i;:::-;52297:74;;52380:93;52469:3;52380:93;:::i;:::-;52498:2;52493:3;52489:12;52482:19;;52141:366;;;:::o;52513:419::-;52679:4;52717:2;52706:9;52702:18;52694:26;;52766:9;52760:4;52756:20;52752:1;52741:9;52737:17;52730:47;52794:131;52920:4;52794:131;:::i;:::-;52786:139;;52513:419;;;:::o;52938:191::-;52978:3;52997:20;53015:1;52997:20;:::i;:::-;52992:25;;53031:20;53049:1;53031:20;:::i;:::-;53026:25;;53074:1;53071;53067:9;53060:16;;53095:3;53092:1;53089:10;53086:36;;;53102:18;;:::i;:::-;53086:36;52938:191;;;;:::o;53135:332::-;53256:4;53294:2;53283:9;53279:18;53271:26;;53307:71;53375:1;53364:9;53360:17;53351:6;53307:71;:::i;:::-;53388:72;53456:2;53445:9;53441:18;53432:6;53388:72;:::i;:::-;53135:332;;;;;:::o;53473:227::-;53613:34;53609:1;53601:6;53597:14;53590:58;53682:10;53677:2;53669:6;53665:15;53658:35;53473:227;:::o;53706:366::-;53848:3;53869:67;53933:2;53928:3;53869:67;:::i;:::-;53862:74;;53945:93;54034:3;53945:93;:::i;:::-;54063:2;54058:3;54054:12;54047:19;;53706:366;;;:::o;54078:419::-;54244:4;54282:2;54271:9;54267:18;54259:26;;54331:9;54325:4;54321:20;54317:1;54306:9;54302:17;54295:47;54359:131;54485:4;54359:131;:::i;:::-;54351:139;;54078:419;;;:::o;54503:224::-;54643:34;54639:1;54631:6;54627:14;54620:58;54712:7;54707:2;54699:6;54695:15;54688:32;54503:224;:::o;54733:366::-;54875:3;54896:67;54960:2;54955:3;54896:67;:::i;:::-;54889:74;;54972:93;55061:3;54972:93;:::i;:::-;55090:2;55085:3;55081:12;55074:19;;54733:366;;;:::o;55105:419::-;55271:4;55309:2;55298:9;55294:18;55286:26;;55358:9;55352:4;55348:20;55344:1;55333:9;55329:17;55322:47;55386:131;55512:4;55386:131;:::i;:::-;55378:139;;55105:419;;;:::o;55530:229::-;55670:34;55666:1;55658:6;55654:14;55647:58;55739:12;55734:2;55726:6;55722:15;55715:37;55530:229;:::o;55765:366::-;55907:3;55928:67;55992:2;55987:3;55928:67;:::i;:::-;55921:74;;56004:93;56093:3;56004:93;:::i;:::-;56122:2;56117:3;56113:12;56106:19;;55765:366;;;:::o;56137:419::-;56303:4;56341:2;56330:9;56326:18;56318:26;;56390:9;56384:4;56380:20;56376:1;56365:9;56361:17;56354:47;56418:131;56544:4;56418:131;:::i;:::-;56410:139;;56137:419;;;:::o;56562:634::-;56783:4;56821:2;56810:9;56806:18;56798:26;;56870:9;56864:4;56860:20;56856:1;56845:9;56841:17;56834:47;56898:108;57001:4;56992:6;56898:108;:::i;:::-;56890:116;;57053:9;57047:4;57043:20;57038:2;57027:9;57023:18;57016:48;57081:108;57184:4;57175:6;57081:108;:::i;:::-;57073:116;;56562:634;;;;;:::o;57202:170::-;57342:22;57338:1;57330:6;57326:14;57319:46;57202:170;:::o;57378:366::-;57520:3;57541:67;57605:2;57600:3;57541:67;:::i;:::-;57534:74;;57617:93;57706:3;57617:93;:::i;:::-;57735:2;57730:3;57726:12;57719:19;;57378:366;;;:::o;57750:419::-;57916:4;57954:2;57943:9;57939:18;57931:26;;58003:9;57997:4;57993:20;57989:1;57978:9;57974:17;57967:47;58031:131;58157:4;58031:131;:::i;:::-;58023:139;;57750:419;;;:::o;58175:222::-;58315:34;58311:1;58303:6;58299:14;58292:58;58384:5;58379:2;58371:6;58367:15;58360:30;58175:222;:::o;58403:366::-;58545:3;58566:67;58630:2;58625:3;58566:67;:::i;:::-;58559:74;;58642:93;58731:3;58642:93;:::i;:::-;58760:2;58755:3;58751:12;58744:19;;58403:366;;;:::o;58775:419::-;58941:4;58979:2;58968:9;58964:18;58956:26;;59028:9;59022:4;59018:20;59014:1;59003:9;58999:17;58992:47;59056:131;59182:4;59056:131;:::i;:::-;59048:139;;58775:419;;;:::o;59200:223::-;59340:34;59336:1;59328:6;59324:14;59317:58;59409:6;59404:2;59396:6;59392:15;59385:31;59200:223;:::o;59429:366::-;59571:3;59592:67;59656:2;59651:3;59592:67;:::i;:::-;59585:74;;59668:93;59757:3;59668:93;:::i;:::-;59786:2;59781:3;59777:12;59770:19;;59429:366;;;:::o;59801:419::-;59967:4;60005:2;59994:9;59990:18;59982:26;;60054:9;60048:4;60044:20;60040:1;60029:9;60025:17;60018:47;60082:131;60208:4;60082:131;:::i;:::-;60074:139;;59801:419;;;:::o;60226:166::-;60366:18;60362:1;60354:6;60350:14;60343:42;60226:166;:::o;60398:366::-;60540:3;60561:67;60625:2;60620:3;60561:67;:::i;:::-;60554:74;;60637:93;60726:3;60637:93;:::i;:::-;60755:2;60750:3;60746:12;60739:19;;60398:366;;;:::o;60770:419::-;60936:4;60974:2;60963:9;60959:18;60951:26;;61023:9;61017:4;61013:20;61009:1;60998:9;60994:17;60987:47;61051:131;61177:4;61051:131;:::i;:::-;61043:139;;60770:419;;;:::o;61195:228::-;61335:34;61331:1;61323:6;61319:14;61312:58;61404:11;61399:2;61391:6;61387:15;61380:36;61195:228;:::o;61429:366::-;61571:3;61592:67;61656:2;61651:3;61592:67;:::i;:::-;61585:74;;61668:93;61757:3;61668:93;:::i;:::-;61786:2;61781:3;61777:12;61770:19;;61429:366;;;:::o;61801:419::-;61967:4;62005:2;61994:9;61990:18;61982:26;;62054:9;62048:4;62044:20;62040:1;62029:9;62025:17;62018:47;62082:131;62208:4;62082:131;:::i;:::-;62074:139;;61801:419;;;:::o;62226:410::-;62266:7;62289:20;62307:1;62289:20;:::i;:::-;62284:25;;62323:20;62341:1;62323:20;:::i;:::-;62318:25;;62378:1;62375;62371:9;62400:30;62418:11;62400:30;:::i;:::-;62389:41;;62579:1;62570:7;62566:15;62563:1;62560:22;62540:1;62533:9;62513:83;62490:139;;62609:18;;:::i;:::-;62490:139;62274:362;62226:410;;;;:::o;62642:171::-;62681:3;62704:24;62722:5;62704:24;:::i;:::-;62695:33;;62750:4;62743:5;62740:15;62737:41;;62758:18;;:::i;:::-;62737:41;62805:1;62798:5;62794:13;62787:20;;62642:171;;;:::o;62819:182::-;62959:34;62955:1;62947:6;62943:14;62936:58;62819:182;:::o;63007:366::-;63149:3;63170:67;63234:2;63229:3;63170:67;:::i;:::-;63163:74;;63246:93;63335:3;63246:93;:::i;:::-;63364:2;63359:3;63355:12;63348:19;;63007:366;;;:::o;63379:419::-;63545:4;63583:2;63572:9;63568:18;63560:26;;63632:9;63626:4;63622:20;63618:1;63607:9;63603:17;63596:47;63660:131;63786:4;63660:131;:::i;:::-;63652:139;;63379:419;;;:::o;63804:98::-;63855:6;63889:5;63883:12;63873:22;;63804:98;;;:::o;63908:168::-;63991:11;64025:6;64020:3;64013:19;64065:4;64060:3;64056:14;64041:29;;63908:168;;;;:::o;64082:373::-;64168:3;64196:38;64228:5;64196:38;:::i;:::-;64250:70;64313:6;64308:3;64250:70;:::i;:::-;64243:77;;64329:65;64387:6;64382:3;64375:4;64368:5;64364:16;64329:65;:::i;:::-;64419:29;64441:6;64419:29;:::i;:::-;64414:3;64410:39;64403:46;;64172:283;64082:373;;;;:::o;64461:751::-;64684:4;64722:3;64711:9;64707:19;64699:27;;64736:71;64804:1;64793:9;64789:17;64780:6;64736:71;:::i;:::-;64817:72;64885:2;64874:9;64870:18;64861:6;64817:72;:::i;:::-;64899;64967:2;64956:9;64952:18;64943:6;64899:72;:::i;:::-;64981;65049:2;65038:9;65034:18;65025:6;64981:72;:::i;:::-;65101:9;65095:4;65091:20;65085:3;65074:9;65070:19;65063:49;65129:76;65200:4;65191:6;65129:76;:::i;:::-;65121:84;;64461:751;;;;;;;;:::o;65218:141::-;65274:5;65305:6;65299:13;65290:22;;65321:32;65347:5;65321:32;:::i;:::-;65218:141;;;;:::o;65365:349::-;65434:6;65483:2;65471:9;65462:7;65458:23;65454:32;65451:119;;;65489:79;;:::i;:::-;65451:119;65609:1;65634:63;65689:7;65680:6;65669:9;65665:22;65634:63;:::i;:::-;65624:73;;65580:127;65365:349;;;;:::o;65720:106::-;65764:8;65813:5;65808:3;65804:15;65783:36;;65720:106;;;:::o;65832:183::-;65867:3;65905:1;65887:16;65884:23;65881:128;;;65943:1;65940;65937;65922:23;65965:34;65996:1;65990:8;65965:34;:::i;:::-;65958:41;;65881:128;65832:183;:::o;66021:711::-;66060:3;66098:4;66080:16;66077:26;66106:5;66074:39;66135:20;;:::i;:::-;66210:1;66192:16;66188:24;66185:1;66179:4;66164:49;66243:4;66237:11;66342:16;66335:4;66327:6;66323:17;66320:39;66287:18;66279:6;66276:30;66260:113;66257:146;;;66388:5;;;;66257:146;66434:6;66428:4;66424:17;66470:3;66464:10;66497:18;66489:6;66486:30;66483:43;;;66519:5;;;;;;66483:43;66567:6;66560:4;66555:3;66551:14;66547:27;66626:1;66608:16;66604:24;66598:4;66594:35;66589:3;66586:44;66583:57;;;66633:5;;;;;;;66583:57;66650;66698:6;66692:4;66688:17;66680:6;66676:30;66670:4;66650:57;:::i;:::-;66723:3;66716:10;;66064:668;;;;;66021:711;;:::o;66738:239::-;66878:34;66874:1;66866:6;66862:14;66855:58;66947:22;66942:2;66934:6;66930:15;66923:47;66738:239;:::o;66983:366::-;67125:3;67146:67;67210:2;67205:3;67146:67;:::i;:::-;67139:74;;67222:93;67311:3;67222:93;:::i;:::-;67340:2;67335:3;67331:12;67324:19;;66983:366;;;:::o;67355:419::-;67521:4;67559:2;67548:9;67544:18;67536:26;;67608:9;67602:4;67598:20;67594:1;67583:9;67579:17;67572:47;67636:131;67762:4;67636:131;:::i;:::-;67628:139;;67355:419;;;:::o;67780:227::-;67920:34;67916:1;67908:6;67904:14;67897:58;67989:10;67984:2;67976:6;67972:15;67965:35;67780:227;:::o;68013:366::-;68155:3;68176:67;68240:2;68235:3;68176:67;:::i;:::-;68169:74;;68252:93;68341:3;68252:93;:::i;:::-;68370:2;68365:3;68361:12;68354:19;;68013:366;;;:::o;68385:419::-;68551:4;68589:2;68578:9;68574:18;68566:26;;68638:9;68632:4;68628:20;68624:1;68613:9;68609:17;68602:47;68666:131;68792:4;68666:131;:::i;:::-;68658:139;;68385:419;;;:::o;68810:1053::-;69133:4;69171:3;69160:9;69156:19;69148:27;;69185:71;69253:1;69242:9;69238:17;69229:6;69185:71;:::i;:::-;69266:72;69334:2;69323:9;69319:18;69310:6;69266:72;:::i;:::-;69385:9;69379:4;69375:20;69370:2;69359:9;69355:18;69348:48;69413:108;69516:4;69507:6;69413:108;:::i;:::-;69405:116;;69568:9;69562:4;69558:20;69553:2;69542:9;69538:18;69531:48;69596:108;69699:4;69690:6;69596:108;:::i;:::-;69588:116;;69752:9;69746:4;69742:20;69736:3;69725:9;69721:19;69714:49;69780:76;69851:4;69842:6;69780:76;:::i;:::-;69772:84;;68810:1053;;;;;;;;:::o;69869:194::-;69909:4;69929:20;69947:1;69929:20;:::i;:::-;69924:25;;69963:20;69981:1;69963:20;:::i;:::-;69958:25;;70007:1;70004;70000:9;69992:17;;70031:1;70025:4;70022:11;70019:37;;;70036:18;;:::i;:::-;70019:37;69869:194;;;;:::o

Swarm Source

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