ETH Price: $3,389.01 (+1.24%)

Contract

0xB8Ece8Aa502937c978B499065F01f2D5dd1FD2e2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Facet Patter...161435372022-12-09 0:21:23746 days ago1670545283IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0032405713.86673595
Add Facet Patter...155356292022-09-14 23:22:14831 days ago1663197734IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.001753147.50189441
Add Facet Patter...154637322022-09-03 6:08:41842 days ago1662185321IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.002902846.35571521
Add Facet Patter...154359132022-08-29 19:24:20847 days ago1661801060IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0057895927.76185113
Add Facet Patter...153806932022-08-21 0:05:25856 days ago1661040325IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.003191396.62282296
Add Facet Patter...153492682022-08-16 0:47:00861 days ago1660610820IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0030093312.87724981
Add Facet Patter...153033522022-08-08 19:11:56868 days ago1659985916IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0048674620.8283631
Add Facet Patter...151323132022-07-13 5:02:00894 days ago1657688520IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0027509515
Add Facet Patter...149932622022-06-19 22:52:48918 days ago1655679168IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0074051317.15811631
Add Facet Patter...149932232022-06-19 22:45:34918 days ago1655678734IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0145341630.16150808
Set Facet For ER...149649152022-06-15 1:32:10923 days ago1655256730IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0014669728.29858535
Set Facet For ER...149491292022-06-12 8:18:08925 days ago1655021888IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0012067323.27853281
Set Facet For ER...149491242022-06-12 8:16:41925 days ago1655021801IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0012265723.66115719
Set Facet For ER...149490722022-06-12 8:06:18925 days ago1655021178IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0019236937.10904195
Add Facet Patter...149490712022-06-12 8:05:54925 days ago1655021154IN
0xB8Ece8Aa...5dd1FD2e2
0 ETH0.0695643435.86417766

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DiamondSaw

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 16 : DiamondSaw.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";

import {IDiamondCut} from "./facets/DiamondClone/IDiamondCut.sol";
import {IDiamondLoupe} from "./facets/DiamondClone/IDiamondLoupe.sol";
import {DiamondSawLib} from "./libraries/DiamondSawLib.sol";
import {BasicAccessControlFacet} from "./facets/AccessControl/BasicAccessControlFacet.sol";
import {AccessControlModifiers} from "./facets/AccessControl/AccessControlModifiers.sol";
import {AccessControlLib} from "./facets/AccessControl/AccessControlLib.sol";
import {PausableFacet} from "./facets/Pausable/PausableFacet.sol";
import {PausableModifiers} from "./facets/Pausable/PausableModifiers.sol";

/**
 * DiamondSaw is meant to be used as a
 * Singleton to "cut" many minimal diamond clones
 * In a gas efficient manner for deployments.
 *
 * This is accomplished by handling the storage intensive
 * selector mappings in one contract, "the saw" instead of in each diamond.
 *
 * Adding a new facet to the saw enables new diamond "patterns"
 *
 * This should be used if you
 *
 * 1. Need cheap deployments of many similar cloned diamonds that
 * utilize the same pre-deployed facets
 *
 * 2. Are okay with gas overhead on write txn to the diamonds
 * to communicate with the singleton (saw) to fetch selectors
 *
 */
contract DiamondSaw is
    BasicAccessControlFacet,
    AccessControlModifiers,
    PausableFacet,
    PausableModifiers
{
    constructor() {
        AccessControlLib._transferOwnership(msg.sender);
    }

    function addFacetPattern(
        IDiamondCut.FacetCut[] calldata _facetAdds,
        address _init,
        bytes calldata _calldata
    ) external onlyOwner whenNotPaused {
        DiamondSawLib.diamondCutAddOnly(_facetAdds, _init, _calldata);
    }

    // if a facet has no selectors, it is not supported
    function checkFacetSupported(address _facetAddress) external view {
        DiamondSawLib.checkFacetSupported(_facetAddress);
    }

    function facetAddressForSelector(bytes4 selector)
        external
        view
        returns (address)
    {
        return
            DiamondSawLib
                .diamondSawStorage()
                .selectorToFacetAndPosition[selector]
                .facetAddress;
    }

    function functionSelectorsForFacetAddress(address facetAddress)
        external
        view
        returns (bytes4[] memory)
    {
        return
            DiamondSawLib
                .diamondSawStorage()
                .facetFunctionSelectors[facetAddress]
                .functionSelectors;
    }

    function allFacetAddresses() external view returns (address[] memory) {
        return DiamondSawLib.diamondSawStorage().facetAddresses;
    }

    function allFacetsWithSelectors()
        external
        view
        returns (IDiamondLoupe.Facet[] memory _facetsWithSelectors)
    {
        DiamondSawLib.DiamondSawStorage storage ds = DiamondSawLib
            .diamondSawStorage();

        uint256 numFacets = ds.facetAddresses.length;
        _facetsWithSelectors = new IDiamondLoupe.Facet[](numFacets);
        for (uint256 i; i < numFacets; i++) {
            address facetAddress_ = ds.facetAddresses[i];
            _facetsWithSelectors[i].facetAddress = facetAddress_;
            _facetsWithSelectors[i].functionSelectors = ds
                .facetFunctionSelectors[facetAddress_]
                .functionSelectors;
        }
    }

    function facetAddressForInterface(bytes4 _interface)
        external
        view
        returns (address)
    {
        DiamondSawLib.DiamondSawStorage storage ds = DiamondSawLib
            .diamondSawStorage();
        return ds.interfaceToFacet[_interface];
    }

    function setFacetForERC165Interface(bytes4 _interface, address _facet)
        external
        onlyOwner
        whenNotPaused
    {
        DiamondSawLib.checkFacetSupported(_facet);
        require(
            DiamondSawLib.diamondSawStorage().interfaceToFacet[_interface] ==
                address(0),
            "Only one facet can implement an interface"
        );
        DiamondSawLib.diamondSawStorage().interfaceToFacet[_interface] = _facet;
    }

    function approveTransferHookSelector(bytes4 selector)
        external
        onlyOwner
        whenNotPaused
    {
        DiamondSawLib.approveTransferHookSelector(selector);
    }

    function approveTokenURISelector(bytes4 selector)
        external
        onlyOwner
        whenNotPaused
    {
        DiamondSawLib.approveTokenURISelector(selector);
    }

    function isTokenURISelectorApproved(bytes4 selector)
        external
        view
        returns (bool)
    {
        return
            DiamondSawLib.diamondSawStorage().approvedTokenURIFunctionSelectors[
                selector
            ];
    }

    function isTransferHookSelectorApproved(bytes4 selector)
        external
        view
        returns (bool)
    {
        return
            DiamondSawLib
                .diamondSawStorage()
                .approvedTransferHookFunctionSelectors[selector];
    }

    function setUpgradeSawAddress(address _upgradeSaw)
        external
        onlyOwner
        whenNotPaused
    {
        DiamondSawLib.setUpgradeSawAddress(_upgradeSaw);
    }

    function isUpgradeSawSupported(address _upgradeSaw)
        external
        view
        returns (bool)
    {
        return
            DiamondSawLib.diamondSawStorage().supportedSawAddresses[
                _upgradeSaw
            ];
    }
}

File 2 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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 3 of 16 : IDiamondCut.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/******************************************************************************\
* Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/

interface IDiamondCut {
    enum FacetCutAction {Add, Replace, Remove}
    // Add=0, Replace=1, Remove=2

    struct FacetCut {
        address facetAddress;
        FacetCutAction action;
        bytes4[] functionSelectors;
    }

    /// @notice Add/replace/remove any number of functions and optionally execute
    ///         a function with delegatecall
    /// @param _diamondCut Contains the facet addresses and function selectors
    /// @param _init The address of the contract or facet to execute _calldata
    /// @param _calldata A function call, including function selector and arguments
    ///                  _calldata is executed with delegatecall on _init
    function diamondCut(
        FacetCut[] calldata _diamondCut,
        address _init,
        bytes calldata _calldata
    ) external;

    event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}

File 4 of 16 : IDiamondLoupe.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/******************************************************************************\
* Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/

// A loupe is a small magnifying glass used to look at diamonds.
// These functions look at diamonds
interface IDiamondLoupe {
    /// These functions are expected to be called frequently
    /// by tools.

    struct Facet {
        address facetAddress;
        bytes4[] functionSelectors;
    }

    /// @notice Gets all facet addresses and their four byte function selectors.
    /// @return facets_ Facet
    function facets() external view returns (Facet[] memory facets_);

    /// @notice Gets all the function selectors supported by a specific facet.
    /// @param _facet The facet address.
    /// @return facetFunctionSelectors_
    function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_);

    /// @notice Get all the facet addresses used by a diamond.
    /// @return facetAddresses_
    function facetAddresses() external view returns (address[] memory facetAddresses_);

    /// @notice Gets the facet that supports the given selector.
    /// @dev If facet is not found return address(0).
    /// @param _functionSelector The function selector.
    /// @return facetAddress_ The facet address.
    function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);
}

File 5 of 16 : DiamondSawLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IDiamondCut} from "../facets/DiamondClone/IDiamondCut.sol";

library DiamondSawLib {
    bytes32 constant DIAMOND_SAW_STORAGE_POSITION =
        keccak256("diamond.standard.diamond.saw.storage");

    struct FacetAddressAndPosition {
        address facetAddress;
        uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
    }

    struct FacetFunctionSelectors {
        bytes4[] functionSelectors;
        uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
    }

    struct DiamondSawStorage {
        // maps function selector to the facet address and
        // the position of the selector in the facetFunctionSelectors.selectors array
        mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
        // maps facet addresses to function selectors
        mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
        // facet addresses
        address[] facetAddresses;
        // Used to query if a facet implements a given interface
        // Note: this works because no interface can be implemented by
        // two different facets with diamond saw because no
        // selector overlap is permitted!!
        mapping(bytes4 => address) interfaceToFacet;
        // for transfer hooks, selectors must be approved in the saw
        mapping(bytes4 => bool) approvedTransferHookFunctionSelectors;
        // for tokenURI overrides, selectors must be approved in the saw
        mapping(bytes4 => bool) approvedTokenURIFunctionSelectors;
        // Saw contracts which clients can upgrade to
        mapping(address => bool) supportedSawAddresses;
    }

    function diamondSawStorage()
        internal
        pure
        returns (DiamondSawStorage storage ds)
    {
        bytes32 position = DIAMOND_SAW_STORAGE_POSITION;
        assembly {
            ds.slot := position
        }
    }

    event DiamondCut(
        IDiamondCut.FacetCut[] _diamondCut,
        address _init,
        bytes _calldata
    );

    // Internal function version of diamondCut
    // only supports adding new selectors
    function diamondCutAddOnly(
        IDiamondCut.FacetCut[] memory _diamondCut,
        address _init,
        bytes memory _calldata
    ) internal {
        for (
            uint256 facetIndex;
            facetIndex < _diamondCut.length;
            facetIndex++
        ) {
            require(
                _diamondCut[facetIndex].action ==
                    IDiamondCut.FacetCutAction.Add,
                "Only add action supported in saw"
            );
            require(
                !isFacetSupported(_diamondCut[facetIndex].facetAddress),
                "Facet already exists in saw"
            );
            addFunctions(
                _diamondCut[facetIndex].facetAddress,
                _diamondCut[facetIndex].functionSelectors
            );
        }
        emit DiamondCut(_diamondCut, _init, _calldata);
        initializeDiamondCut(_init, _calldata);
    }

    function addFunctions(
        address _facetAddress,
        bytes4[] memory _functionSelectors
    ) internal {
        require(
            _functionSelectors.length > 0,
            "LibDiamondCut: No selectors in facet to cut"
        );
        DiamondSawStorage storage ds = diamondSawStorage();
        require(
            _facetAddress != address(0),
            "LibDiamondCut: Add facet can't be address(0)"
        );
        uint96 selectorPosition = uint96(
            ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
        );
        // add new facet address if it does not exist
        if (selectorPosition == 0) {
            addFacet(ds, _facetAddress);
        }
        for (
            uint256 selectorIndex;
            selectorIndex < _functionSelectors.length;
            selectorIndex++
        ) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds
                .selectorToFacetAndPosition[selector]
                .facetAddress;

            require(
                oldFacetAddress == address(0),
                "Cannot add function that already exists"
            );
            addFunction(ds, selector, selectorPosition, _facetAddress);
            selectorPosition++;
        }
    }

    function addFacet(DiamondSawStorage storage ds, address _facetAddress)
        internal
    {
        enforceHasContractCode(
            _facetAddress,
            "LibDiamondCut: New facet has no code"
        );
        ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds
            .facetAddresses
            .length;
        ds.facetAddresses.push(_facetAddress);
    }

    function addFunction(
        DiamondSawStorage storage ds,
        bytes4 _selector,
        uint96 _selectorPosition,
        address _facetAddress
    ) internal {
        ds
            .selectorToFacetAndPosition[_selector]
            .functionSelectorPosition = _selectorPosition;
        ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(
            _selector
        );
        ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
    }

    function initializeDiamondCut(address _init, bytes memory _calldata)
        internal
    {
        if (_init == address(0)) {
            require(
                _calldata.length == 0,
                "LibDiamondCut: _init is address(0) but_calldata is not empty"
            );
        } else {
            require(
                _calldata.length > 0,
                "LibDiamondCut: _calldata is empty but _init is not address(0)"
            );
            if (_init != address(this)) {
                enforceHasContractCode(
                    _init,
                    "LibDiamondCut: _init address has no code"
                );
            }
            (bool success, bytes memory error) = _init.delegatecall(_calldata);
            if (!success) {
                if (error.length > 0) {
                    // bubble up the error
                    revert(string(error));
                } else {
                    revert("LibDiamondCut: _init function reverted");
                }
            }
        }
    }

    function enforceHasContractCode(
        address _contract,
        string memory _errorMessage
    ) internal view {
        uint256 contractSize;
        assembly {
            contractSize := extcodesize(_contract)
        }
        require(contractSize > 0, _errorMessage);
    }

    function setFacetSupportsInterface(bytes4 _interface, address _facetAddress)
        internal
    {
        checkFacetSupported(_facetAddress);
        DiamondSawStorage storage ds = diamondSawStorage();
        ds.interfaceToFacet[_interface] = _facetAddress;
    }

    function isFacetSupported(address _facetAddress)
        internal
        view
        returns (bool)
    {
        return
            diamondSawStorage()
                .facetFunctionSelectors[_facetAddress]
                .functionSelectors
                .length > 0;
    }

    function checkFacetSupported(address _facetAddress) internal view {
        require(isFacetSupported(_facetAddress), "Facet not supported");
    }

    function approveTransferHookSelector(bytes4 transferHookSelector) internal {
        DiamondSawStorage storage s = diamondSawStorage();
        address facetImplementation = s
            .selectorToFacetAndPosition[transferHookSelector]
            .facetAddress;

        require(
            facetImplementation != address(0),
            "Cannot set transfer hook to unsupported selector"
        );

        s.approvedTransferHookFunctionSelectors[transferHookSelector] = true;
    }

    function approveTokenURISelector(bytes4 tokenURISelector) internal {
        DiamondSawStorage storage s = diamondSawStorage();
        address facetImplementation = s
            .selectorToFacetAndPosition[tokenURISelector]
            .facetAddress;
        require(
            facetImplementation != address(0),
            "Cannot set token uri override to unsupported selector"
        );
        s.approvedTokenURIFunctionSelectors[tokenURISelector] = true;
    }

    function setUpgradeSawAddress(address _upgradeSaw) internal {
        diamondSawStorage().supportedSawAddresses[_upgradeSaw] = true;
    }
}

File 6 of 16 : BasicAccessControlFacet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/IAccessControl.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "./AccessControlLib.sol";
import {PausableLib} from "../Pausable/PausableLib.sol";

/**
 * @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 BasicAccessControlFacet is Context {
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return AccessControlLib.accessControlStorage()._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 {
        PausableLib.enforceUnpaused();
        AccessControlLib._enforceOwner();
        AccessControlLib._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 {
        PausableLib.enforceUnpaused();
        AccessControlLib._enforceOwner();
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        AccessControlLib._transferOwnership(newOwner);
    }

    function grantOperator(address _operator) public virtual {
        PausableLib.enforceUnpaused();
        AccessControlLib._enforceOwner();

        AccessControlLib.grantRole(AccessControlLib.OPERATOR_ROLE, _operator);
    }

    function revokeOperator(address _operator) public virtual {
        PausableLib.enforceUnpaused();
        AccessControlLib._enforceOwner();
        AccessControlLib.revokeRole(AccessControlLib.OPERATOR_ROLE, _operator);
    }
}

File 7 of 16 : AccessControlModifiers.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./AccessControlLib.sol";

abstract contract AccessControlModifiers {
    modifier onlyOperator() {
        AccessControlLib._checkRole(AccessControlLib.OPERATOR_ROLE, msg.sender);
        _;
    }

    modifier onlyOwner() {
        AccessControlLib._enforceOwner();
        _;
    }
}

File 8 of 16 : AccessControlLib.sol
// SPDX-License-Identifier: MIT

import "@openzeppelin/contracts/utils/Strings.sol";
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

pragma solidity ^0.8.0;

library AccessControlLib {
    bytes32 constant DEFAULT_ADMIN_ROLE = 0x00;
    bytes32 constant OPERATOR_ROLE = keccak256("operator.role");

    /**
     * @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
    );

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

    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    struct AccessControlStorage {
        address _owner;
        mapping(bytes32 => RoleData) _roles;
    }

    bytes32 constant ACCESS_CONTROL_STORAGE_POSITION =
        keccak256("Access.Control.library.storage");

    function accessControlStorage()
        internal
        pure
        returns (AccessControlStorage storage s)
    {
        bytes32 position = ACCESS_CONTROL_STORAGE_POSITION;
        assembly {
            s.slot := position
        }
    }

    function _isOwner() internal view returns (bool) {
        return accessControlStorage()._owner == msg.sender;
    }

    function owner() internal view returns (address) {
        return accessControlStorage()._owner;
    }

    function _enforceOwner() internal view {
        require(_isOwner(), "Caller is not the owner");
    }

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

    /**
     * @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, msg.sender);
        _;
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account)
        internal
        view
        returns (bool)
    {
        return accessControlStorage()._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})$/
     *
     * NOTE: Modified to always pass if the account is the owner
     * and to always fail if ownership is revoked!
     */
    function _checkRole(bytes32 role, address account) internal view {
        address ownerAddress = accessControlStorage()._owner;
        require(ownerAddress != address(0), "Admin functionality revoked");
        if (!hasRole(role, account) && account != ownerAddress) {
            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) internal view returns (bytes32) {
        return accessControlStorage()._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)
        internal
        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)
        internal
        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) internal {
        require(
            account == msg.sender,
            "AccessControl: can only renounce roles for self"
        );

        _revokeRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal {
        bytes32 previousAdminRole = getRoleAdmin(role);
        accessControlStorage()._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 {
        if (!hasRole(role, account)) {
            accessControlStorage()._roles[role].members[account] = true;
            emit RoleGranted(role, account, msg.sender);
        }
    }

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

File 9 of 16 : PausableFacet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import {AccessControlModifiers} from "../AccessControl/AccessControlModifiers.sol";
import {PausableLib} from "./PausableLib.sol";

/**
 * @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 PausableFacet is AccessControlModifiers {
    function pause() public onlyOwner {
        PausableLib._pause();
    }

    function unpause() public onlyOwner {
        PausableLib._unpause();
    }

    function paused() public view returns (bool) {
        return PausableLib._paused();
    }
}

File 10 of 16 : PausableModifiers.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {PausableLib} from "./PausableLib.sol";

abstract contract PausableModifiers {
    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        PausableLib.enforceUnpaused();
        _;
    }

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

File 11 of 16 : Context.sol
// SPDX-License-Identifier: MIT
// 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 12 of 16 : IAccessControl.sol
// SPDX-License-Identifier: MIT
// 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 13 of 16 : Strings.sol
// SPDX-License-Identifier: MIT
// 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 14 of 16 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 15 of 16 : PausableLib.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

error ContractPaused();
error ContractUnpaused();

library PausableLib {
    bytes32 constant PAUSABLE_STORAGE_POSITION =
        keccak256("pausable.facet.storage");
    /**
     * @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);

    struct PausableStorage {
        bool _paused;
    }

    function pausableStorage()
        internal
        pure
        returns (PausableStorage storage s)
    {
        bytes32 position = PAUSABLE_STORAGE_POSITION;
        assembly {
            s.slot := position
        }
    }

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

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal {
        PausableStorage storage s = pausableStorage();
        if (s._paused) revert ContractPaused();
        s._paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal {
        PausableStorage storage s = pausableStorage();
        if (!s._paused) revert ContractUnpaused();
        s._paused = false;
        emit Unpaused(msg.sender);
    }

    function enforceUnpaused() internal view {
        if (pausableStorage()._paused) revert ContractPaused();
    }

    function enforcePaused() internal view {
        if (!pausableStorage()._paused) revert ContractUnpaused();
    }
}

File 16 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT
// 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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractPaused","type":"error"},{"inputs":[],"name":"ContractUnpaused","type":"error"},{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_facetAdds","type":"tuple[]"},{"internalType":"address","name":"_init","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"addFacetPattern","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allFacetAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allFacetsWithSelectors","outputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondLoupe.Facet[]","name":"_facetsWithSelectors","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"approveTokenURISelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"approveTransferHookSelector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_facetAddress","type":"address"}],"name":"checkFacetSupported","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interface","type":"bytes4"}],"name":"facetAddressForInterface","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"facetAddressForSelector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"facetAddress","type":"address"}],"name":"functionSelectorsForFacetAddress","outputs":[{"internalType":"bytes4[]","name":"","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"grantOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"isTokenURISelectorApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"isTransferHookSelectorApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_upgradeSaw","type":"address"}],"name":"isUpgradeSawSupported","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"_operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interface","type":"bytes4"},{"internalType":"address","name":"_facet","type":"address"}],"name":"setFacetForERC165Interface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_upgradeSaw","type":"address"}],"name":"setUpgradeSawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5062000028336200002e60201b62000e7a1760201c565b62000143565b6000620000406200011660201b60201c565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081620000776200011660201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000807f23a3985ff794c67d8d516a95b83c7dfb32e426521153078d1eadc4dc887e2d3e90508091505090565b613edd80620001536000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806383372a71116100b85780638f7e19501161007c5780638f7e19501461034f578063cbaf15a91461036d578063e348da1314610389578063ea609fe2146103a5578063f2fde38b146103c1578063fad8b32a146103dd57610142565b806383372a71146102bf5780638456cb59146102ef5780638ccab119146102f95780638d1da160146103155780638da5cb5b1461033157610142565b806348670ae11161010a57806348670ae1146102115780635065a0311461022d578063552d91ad1461024957806355a2cd0b146102795780635c975abb14610297578063715018a6146102b557610142565b806301feb4721461014757806314bc75601461017757806324a40579146101a757806324ca5e1f146101d75780633f4ba83a14610207575b600080fd5b610161600480360381019061015c9190612a94565b6103f9565b60405161016e91906131c8565b60405180910390f35b610191600480360381019061018c9190612a94565b610482565b60405161019e91906131c8565b60405180910390f35b6101c160048036038101906101bc9190612a94565b610509565b6040516101ce919061328e565b60405180910390f35b6101f160048036038101906101ec91906129e2565b61057a565b6040516101fe919061328e565b60405180910390f35b61020f6105d9565b005b61022b60048036038101906102269190612a0b565b6105eb565b005b61024760048036038101906102429190612a94565b61065d565b005b610263600480360381019061025e9190612a94565b610679565b604051610270919061328e565b60405180910390f35b6102816106ea565b60405161028e919061326c565b60405180910390f35b61029f6109a5565b6040516102ac919061328e565b60405180910390f35b6102bd6109b4565b005b6102d960048036038101906102d491906129e2565b6109d0565b6040516102e69190613205565b60405180910390f35b6102f7610ab5565b005b610313600480360381019061030e91906129e2565b610ac7565b005b61032f600480360381019061032a9190612abd565b610ad3565b005b610339610c72565b60405161034691906131c8565b60405180910390f35b610357610ca5565b60405161036491906131e3565b60405180910390f35b610387600480360381019061038291906129e2565b610d3c565b005b6103a3600480360381019061039e91906129e2565b610d58565b005b6103bf60048036038101906103ba9190612a94565b610d95565b005b6103db60048036038101906103d691906129e2565b610db1565b005b6103f760048036038101906103f291906129e2565b610e3d565b005b600080610404610f52565b9050806003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b600061048c610f52565b6000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610513610f52565b6005016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000610584610f52565b60060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6105e1610f7f565b6105e9610fc8565b565b6105f3610f7f565b6105fb611073565b61065685859061060b91906137da565b8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506110c5565b5050505050565b610665610f7f565b61066d611073565b61067681611345565b50565b6000610683610f52565b6004016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060006106f6610f52565b90506000816002018054905090508067ffffffffffffffff811115610744577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561077d57816020015b61076a61274b565b8152602001906001900390816107625790505b50925060005b8181101561099f5760008360020182815481106107c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080858381518110610830577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561093e57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116108eb5790505b505050505085838151811061097c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001819052505080806109979061388f565b915050610783565b50505090565b60006109af6114ad565b905090565b6109bc611073565b6109c4610f7f565b6109ce6000610e7a565b565b60606109da610f52565b60010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015610aa957602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411610a565790505b50505050509050919050565b610abd610f7f565b610ac56114cd565b565b610ad081611579565b50565b610adb610f7f565b610ae3611073565b610aec81611579565b600073ffffffffffffffffffffffffffffffffffffffff16610b0c610f52565b6003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc906134ab565b60405180910390fd5b80610bde610f52565b6003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000610c7c6115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060610caf610f52565b600201805480602002602001604051908101604052809291908181526020018280548015610d3257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ce8575b5050505050905090565b610d44610f7f565b610d4c611073565b610d55816115f1565b50565b610d60611073565b610d68610f7f565b610d927fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e82611655565b50565b610d9d610f7f565b610da5611073565b610dae81611677565b50565b610db9611073565b610dc1610f7f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e28906133cb565b60405180910390fd5b610e3a81610e7a565b50565b610e45611073565b610e4d610f7f565b610e777fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e826117df565b50565b6000610e846115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081610eb36115c4565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000807f9181e2ce76c26b04a55bebc31fdd43a0e490600a9bbf4a0b5d47f8b8895b35ae90508091505090565b610f87611801565b610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd9061336b565b60405180910390fd5b565b6000610fd2611862565b90508060000160009054906101000a900460ff1661101c576040517f0e5e3b3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3360405161106891906131c8565b60405180910390a150565b61107b611862565b60000160009054906101000a900460ff16156110c3576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005b83518110156112fa576000600281111561110b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b848281518110611144577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516002811115611188577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf906133ab565b60405180910390fd5b611215848281518110611204577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015161188f565b15611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c906133eb565b60405180910390fd5b6112e7848281518110611291577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518583815181106112d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001516118e9565b80806112f29061388f565b9150506110c8565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161132e93929190613227565b60405180910390a16113408282611b88565b505050565b600061134f610f52565b90506000816000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114339061332b565b60405180910390fd5b6001826004016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60006114b7611862565b60000160009054906101000a900460ff16905090565b60006114d7611862565b90508060000160009054906101000a900460ff1615611522576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583360405161156e91906131c8565b60405180910390a150565b6115828161188f565b6115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b89061342b565b60405180910390fd5b50565b6000807f23a3985ff794c67d8d516a95b83c7dfb32e426521153078d1eadc4dc887e2d3e90508091505090565b60016115fb610f52565b60060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61165e82611d9b565b6116688133611dc4565b6116728383611f3c565b505050565b6000611681610f52565b90506000816000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561176e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117659061340b565b60405180910390fd5b6001826005016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6117e882611d9b565b6117f28133611dc4565b6117fc838361201f565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff166118226115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905090565b6000807f898bcb892ce96890816cc7d1ea86c592f314ff2e839268e378d8f279767ea82290508091505090565b60008061189a610f52565b60010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050119050919050565b600081511161192d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119249061338b565b60405180910390fd5b6000611937610f52565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a09061344b565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff161415611a1757611a168285612103565b5b60005b8351811015611b81576000848281518110611a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b499061348b565b60405180910390fd5b611b5e8583868a6121de565b8380611b69906138d8565b94505050508080611b799061388f565b915050611a1a565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c06576000815114611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf8906132cb565b60405180910390fd5b611d97565b6000815111611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c419061346b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611ca057611c9f82604051806060016040528060288152602001613e5c6028913961238b565b5b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611cc89190613177565b600060405180830381855af49150503d8060008114611d03576040519150601f19603f3d011682016040523d82523d6000602084013e611d08565b606091505b509150915081611d9457600081511115611d5957806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5091906132a9565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b9061330b565b60405180910390fd5b50505b5050565b6000611da56115c4565b6001016000838152602001908152602001600020600101549050919050565b6000611dce6115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b9061334b565b60405180910390fd5b611e6e83836123dd565b158015611ea757508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611f3757611ecd8273ffffffffffffffffffffffffffffffffffffffff166014612451565b611edb8460001c6020612451565b604051602001611eec92919061318e565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e91906132a9565b60405180910390fd5b505050565b611f4682826123dd565b61201b576001611f546115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61202982826123dd565b156120ff5760006120386115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61212581604051806060016040528060248152602001613e846024913961238b565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6000823b90506000811182906123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce91906132a9565b60405180910390fd5b50505050565b60006123e76115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606000600283600261246491906136e1565b61246e919061368b565b67ffffffffffffffff8111156124ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124df5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061253d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261260791906136e1565b612611919061368b565b90505b60018111156126fd577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612679577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106126b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806126f690613834565b9050612614565b5060008414612741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612738906132eb565b60405180910390fd5b8091505092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600061278e612789846134f0565b6134cb565b905080838252602082019050828560208602820111156127ad57600080fd5b60005b858110156127dd57816127c388826128f6565b8452602084019350602083019250506001810190506127b0565b5050509392505050565b60006127fa6127f58461351c565b6134cb565b9050808382526020820190508285602086028201111561281957600080fd5b60005b8581101561286357813567ffffffffffffffff81111561283b57600080fd5b808601612848898261296a565b8552602085019450602084019350505060018101905061281c565b5050509392505050565b60008135905061287c81613e1d565b92915050565b600082601f83011261289357600080fd5b81356128a384826020860161277b565b91505092915050565b60008083601f8401126128be57600080fd5b8235905067ffffffffffffffff8111156128d757600080fd5b6020830191508360208202830111156128ef57600080fd5b9250929050565b60008135905061290581613e34565b92915050565b60008083601f84011261291d57600080fd5b8235905067ffffffffffffffff81111561293657600080fd5b60208301915083600182028301111561294e57600080fd5b9250929050565b60008135905061296481613e4b565b92915050565b60006060828403121561297c57600080fd5b61298660606134cb565b905060006129968482850161286d565b60008301525060206129aa84828501612955565b602083015250604082013567ffffffffffffffff8111156129ca57600080fd5b6129d684828501612882565b60408301525092915050565b6000602082840312156129f457600080fd5b6000612a028482850161286d565b91505092915050565b600080600080600060608688031215612a2357600080fd5b600086013567ffffffffffffffff811115612a3d57600080fd5b612a49888289016128ac565b95509550506020612a5c8882890161286d565b935050604086013567ffffffffffffffff811115612a7957600080fd5b612a858882890161290b565b92509250509295509295909350565b600060208284031215612aa657600080fd5b6000612ab4848285016128f6565b91505092915050565b60008060408385031215612ad057600080fd5b6000612ade858286016128f6565b9250506020612aef8582860161286d565b9150509250929050565b6000612b058383612b51565b60208301905092915050565b6000612b1d8383612d82565b60208301905092915050565b6000612b3583836130ea565b905092915050565b6000612b49838361313a565b905092915050565b612b5a8161373b565b82525050565b612b698161373b565b82525050565b6000612b7a82613588565b612b8481856135fe565b9350612b8f83613548565b8060005b83811015612bc0578151612ba78882612af9565b9750612bb2836135ca565b925050600181019050612b93565b5085935050505092915050565b6000612bd882613593565b612be2818561360f565b9350612bed83613558565b8060005b83811015612c1e578151612c058882612b11565b9750612c10836135d7565b925050600181019050612bf1565b5085935050505092915050565b6000612c3682613593565b612c408185613620565b9350612c4b83613558565b8060005b83811015612c7c578151612c638882612b11565b9750612c6e836135d7565b925050600181019050612c4f565b5085935050505092915050565b6000612c948261359e565b612c9e8185613631565b935083602082028501612cb085613568565b8060005b85811015612cec5784840389528151612ccd8582612b29565b9450612cd8836135e4565b925060208a01995050600181019050612cb4565b50829750879550505050505092915050565b6000612d09826135a9565b612d138185613642565b935083602082028501612d2585613578565b8060005b85811015612d615784840389528151612d428582612b3d565b9450612d4d836135f1565b925060208a01995050600181019050612d29565b50829750879550505050505092915050565b612d7c8161374d565b82525050565b612d8b81613759565b82525050565b6000612d9c826135b4565b612da68185613653565b9350612db6818560208601613801565b612dbf8161399a565b840191505092915050565b6000612dd5826135b4565b612ddf8185613664565b9350612def818560208601613801565b80840191505092915050565b612e04816137ef565b82525050565b6000612e15826135bf565b612e1f818561366f565b9350612e2f818560208601613801565b612e388161399a565b840191505092915050565b6000612e4e826135bf565b612e588185613680565b9350612e68818560208601613801565b80840191505092915050565b6000612e81603c8361366f565b9150612e8c826139ab565b604082019050919050565b6000612ea460208361366f565b9150612eaf826139fa565b602082019050919050565b6000612ec760268361366f565b9150612ed282613a23565b604082019050919050565b6000612eea60308361366f565b9150612ef582613a72565b604082019050919050565b6000612f0d601b8361366f565b9150612f1882613ac1565b602082019050919050565b6000612f3060178361366f565b9150612f3b82613aea565b602082019050919050565b6000612f53602b8361366f565b9150612f5e82613b13565b604082019050919050565b6000612f7660208361366f565b9150612f8182613b62565b602082019050919050565b6000612f9960268361366f565b9150612fa482613b8b565b604082019050919050565b6000612fbc601b8361366f565b9150612fc782613bda565b602082019050919050565b6000612fdf60358361366f565b9150612fea82613c03565b604082019050919050565b600061300260138361366f565b915061300d82613c52565b602082019050919050565b6000613025602c8361366f565b915061303082613c7b565b604082019050919050565b6000613048603d8361366f565b915061305382613cca565b604082019050919050565b600061306b60278361366f565b915061307682613d19565b604082019050919050565b600061308e60298361366f565b915061309982613d68565b604082019050919050565b60006130b1601783613680565b91506130bc82613db7565b601782019050919050565b60006130d4601183613680565b91506130df82613de0565b601182019050919050565b60006060830160008301516131026000860182612b51565b5060208301516131156020860182612dfb565b506040830151848203604086015261312d8282612bcd565b9150508091505092915050565b60006040830160008301516131526000860182612b51565b506020830151848203602086015261316a8282612bcd565b9150508091505092915050565b60006131838284612dca565b915081905092915050565b6000613199826130a4565b91506131a58285612e43565b91506131b0826130c7565b91506131bc8284612e43565b91508190509392505050565b60006020820190506131dd6000830184612b60565b92915050565b600060208201905081810360008301526131fd8184612b6f565b905092915050565b6000602082019050818103600083015261321f8184612c2b565b905092915050565b600060608201905081810360008301526132418186612c89565b90506132506020830185612b60565b81810360408301526132628184612d91565b9050949350505050565b600060208201905081810360008301526132868184612cfe565b905092915050565b60006020820190506132a36000830184612d73565b92915050565b600060208201905081810360008301526132c38184612e0a565b905092915050565b600060208201905081810360008301526132e481612e74565b9050919050565b6000602082019050818103600083015261330481612e97565b9050919050565b6000602082019050818103600083015261332481612eba565b9050919050565b6000602082019050818103600083015261334481612edd565b9050919050565b6000602082019050818103600083015261336481612f00565b9050919050565b6000602082019050818103600083015261338481612f23565b9050919050565b600060208201905081810360008301526133a481612f46565b9050919050565b600060208201905081810360008301526133c481612f69565b9050919050565b600060208201905081810360008301526133e481612f8c565b9050919050565b6000602082019050818103600083015261340481612faf565b9050919050565b6000602082019050818103600083015261342481612fd2565b9050919050565b6000602082019050818103600083015261344481612ff5565b9050919050565b6000602082019050818103600083015261346481613018565b9050919050565b600060208201905081810360008301526134848161303b565b9050919050565b600060208201905081810360008301526134a48161305e565b9050919050565b600060208201905081810360008301526134c481613081565b9050919050565b60006134d56134e6565b90506134e1828261385e565b919050565b6000604051905090565b600067ffffffffffffffff82111561350b5761350a61396b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156135375761353661396b565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613696826137b8565b91506136a1836137b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136d6576136d561390d565b5b828201905092915050565b60006136ec826137b8565b91506136f7836137b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137305761372f61390d565b5b828202905092915050565b600061374682613798565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061379382613e09565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60006137e73684846127e7565b905092915050565b60006137fa82613785565b9050919050565b60005b8381101561381f578082015181840152602081019050613804565b8381111561382e576000848401525b50505050565b600061383f826137b8565b915060008214156138535761385261390d565b5b600182039050919050565b6138678261399a565b810181811067ffffffffffffffff821117156138865761388561396b565b5b80604052505050565b600061389a826137b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138cd576138cc61390d565b5b600182019050919050565b60006138e3826137c2565b91506bffffffffffffffffffffffff8214156139025761390161390d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420736574207472616e7366657220686f6f6b20746f20756e737560008201527f70706f727465642073656c6563746f7200000000000000000000000000000000602082015250565b7f41646d696e2066756e6374696f6e616c697479207265766f6b65640000000000600082015250565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b7f4f6e6c792061646420616374696f6e20737570706f7274656420696e20736177600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f466163657420616c72656164792065786973747320696e207361770000000000600082015250565b7f43616e6e6f742073657420746f6b656e20757269206f7665727269646520746f60008201527f20756e737570706f727465642073656c6563746f720000000000000000000000602082015250565b7f4661636574206e6f7420737570706f7274656400000000000000000000000000600082015250565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b7f43616e6e6f74206164642066756e6374696f6e207468617420616c726561647960008201527f2065786973747300000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c79206f6e652066616365742063616e20696d706c656d656e7420616e2060008201527f696e746572666163650000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60038110613e1a57613e1961393c565b5b50565b613e268161373b565b8114613e3157600080fd5b50565b613e3d81613759565b8114613e4857600080fd5b50565b60038110613e5857600080fd5b5056fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a264697066735822122035464097ae9831b99850d4ce14d4df1aa70b73418f19c6c0ae99cb9ec304e78564736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806383372a71116100b85780638f7e19501161007c5780638f7e19501461034f578063cbaf15a91461036d578063e348da1314610389578063ea609fe2146103a5578063f2fde38b146103c1578063fad8b32a146103dd57610142565b806383372a71146102bf5780638456cb59146102ef5780638ccab119146102f95780638d1da160146103155780638da5cb5b1461033157610142565b806348670ae11161010a57806348670ae1146102115780635065a0311461022d578063552d91ad1461024957806355a2cd0b146102795780635c975abb14610297578063715018a6146102b557610142565b806301feb4721461014757806314bc75601461017757806324a40579146101a757806324ca5e1f146101d75780633f4ba83a14610207575b600080fd5b610161600480360381019061015c9190612a94565b6103f9565b60405161016e91906131c8565b60405180910390f35b610191600480360381019061018c9190612a94565b610482565b60405161019e91906131c8565b60405180910390f35b6101c160048036038101906101bc9190612a94565b610509565b6040516101ce919061328e565b60405180910390f35b6101f160048036038101906101ec91906129e2565b61057a565b6040516101fe919061328e565b60405180910390f35b61020f6105d9565b005b61022b60048036038101906102269190612a0b565b6105eb565b005b61024760048036038101906102429190612a94565b61065d565b005b610263600480360381019061025e9190612a94565b610679565b604051610270919061328e565b60405180910390f35b6102816106ea565b60405161028e919061326c565b60405180910390f35b61029f6109a5565b6040516102ac919061328e565b60405180910390f35b6102bd6109b4565b005b6102d960048036038101906102d491906129e2565b6109d0565b6040516102e69190613205565b60405180910390f35b6102f7610ab5565b005b610313600480360381019061030e91906129e2565b610ac7565b005b61032f600480360381019061032a9190612abd565b610ad3565b005b610339610c72565b60405161034691906131c8565b60405180910390f35b610357610ca5565b60405161036491906131e3565b60405180910390f35b610387600480360381019061038291906129e2565b610d3c565b005b6103a3600480360381019061039e91906129e2565b610d58565b005b6103bf60048036038101906103ba9190612a94565b610d95565b005b6103db60048036038101906103d691906129e2565b610db1565b005b6103f760048036038101906103f291906129e2565b610e3d565b005b600080610404610f52565b9050806003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b600061048c610f52565b6000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610513610f52565b6005016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000610584610f52565b60060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6105e1610f7f565b6105e9610fc8565b565b6105f3610f7f565b6105fb611073565b61065685859061060b91906137da565b8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506110c5565b5050505050565b610665610f7f565b61066d611073565b61067681611345565b50565b6000610683610f52565b6004016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060006106f6610f52565b90506000816002018054905090508067ffffffffffffffff811115610744577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561077d57816020015b61076a61274b565b8152602001906001900390816107625790505b50925060005b8181101561099f5760008360020182815481106107c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080858381518110610830577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561093e57602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190600401906020826003010492830192600103820291508084116108eb5790505b505050505085838151811061097c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001819052505080806109979061388f565b915050610783565b50505090565b60006109af6114ad565b905090565b6109bc611073565b6109c4610f7f565b6109ce6000610e7a565b565b60606109da610f52565b60010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015610aa957602002820191906000526020600020906000905b82829054906101000a900460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019060040190602082600301049283019260010382029150808411610a565790505b50505050509050919050565b610abd610f7f565b610ac56114cd565b565b610ad081611579565b50565b610adb610f7f565b610ae3611073565b610aec81611579565b600073ffffffffffffffffffffffffffffffffffffffff16610b0c610f52565b6003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc906134ab565b60405180910390fd5b80610bde610f52565b6003016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000610c7c6115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060610caf610f52565b600201805480602002602001604051908101604052809291908181526020018280548015610d3257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ce8575b5050505050905090565b610d44610f7f565b610d4c611073565b610d55816115f1565b50565b610d60611073565b610d68610f7f565b610d927fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e82611655565b50565b610d9d610f7f565b610da5611073565b610dae81611677565b50565b610db9611073565b610dc1610f7f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e28906133cb565b60405180910390fd5b610e3a81610e7a565b50565b610e45611073565b610e4d610f7f565b610e777fb905253714c57beb31c9b4f35be6565322dce8a529999da99d3bd3479785d83e826117df565b50565b6000610e846115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081610eb36115c4565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000807f9181e2ce76c26b04a55bebc31fdd43a0e490600a9bbf4a0b5d47f8b8895b35ae90508091505090565b610f87611801565b610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd9061336b565b60405180910390fd5b565b6000610fd2611862565b90508060000160009054906101000a900460ff1661101c576040517f0e5e3b3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160000160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3360405161106891906131c8565b60405180910390a150565b61107b611862565b60000160009054906101000a900460ff16156110c3576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005b83518110156112fa576000600281111561110b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b848281518110611144577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516002811115611188577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf906133ab565b60405180910390fd5b611215848281518110611204577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015161188f565b15611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c906133eb565b60405180910390fd5b6112e7848281518110611291577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518583815181106112d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001516118e9565b80806112f29061388f565b9150506110c8565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161132e93929190613227565b60405180910390a16113408282611b88565b505050565b600061134f610f52565b90506000816000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114339061332b565b60405180910390fd5b6001826004016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60006114b7611862565b60000160009054906101000a900460ff16905090565b60006114d7611862565b90508060000160009054906101000a900460ff1615611522576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160000160006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583360405161156e91906131c8565b60405180910390a150565b6115828161188f565b6115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b89061342b565b60405180910390fd5b50565b6000807f23a3985ff794c67d8d516a95b83c7dfb32e426521153078d1eadc4dc887e2d3e90508091505090565b60016115fb610f52565b60060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61165e82611d9b565b6116688133611dc4565b6116728383611f3c565b505050565b6000611681610f52565b90506000816000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561176e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117659061340b565b60405180910390fd5b6001826005016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6117e882611d9b565b6117f28133611dc4565b6117fc838361201f565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff166118226115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905090565b6000807f898bcb892ce96890816cc7d1ea86c592f314ff2e839268e378d8f279767ea82290508091505090565b60008061189a610f52565b60010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050119050919050565b600081511161192d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119249061338b565b60405180910390fd5b6000611937610f52565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a09061344b565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff161415611a1757611a168285612103565b5b60005b8351811015611b81576000848281518110611a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b499061348b565b60405180910390fd5b611b5e8583868a6121de565b8380611b69906138d8565b94505050508080611b799061388f565b915050611a1a565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c06576000815114611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf8906132cb565b60405180910390fd5b611d97565b6000815111611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c419061346b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611ca057611c9f82604051806060016040528060288152602001613e5c6028913961238b565b5b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611cc89190613177565b600060405180830381855af49150503d8060008114611d03576040519150601f19603f3d011682016040523d82523d6000602084013e611d08565b606091505b509150915081611d9457600081511115611d5957806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5091906132a9565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b9061330b565b60405180910390fd5b50505b5050565b6000611da56115c4565b6001016000838152602001908152602001600020600101549050919050565b6000611dce6115c4565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b9061334b565b60405180910390fd5b611e6e83836123dd565b158015611ea757508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611f3757611ecd8273ffffffffffffffffffffffffffffffffffffffff166014612451565b611edb8460001c6020612451565b604051602001611eec92919061318e565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e91906132a9565b60405180910390fd5b505050565b611f4682826123dd565b61201b576001611f546115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61202982826123dd565b156120ff5760006120386115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61212581604051806060016040528060248152602001613e846024913961238b565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6000823b90506000811182906123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce91906132a9565b60405180910390fd5b50505050565b60006123e76115c4565b600101600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606000600283600261246491906136e1565b61246e919061368b565b67ffffffffffffffff8111156124ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124df5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061253d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261260791906136e1565b612611919061368b565b90505b60018111156126fd577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612679577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106126b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806126f690613834565b9050612614565b5060008414612741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612738906132eb565b60405180910390fd5b8091505092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600061278e612789846134f0565b6134cb565b905080838252602082019050828560208602820111156127ad57600080fd5b60005b858110156127dd57816127c388826128f6565b8452602084019350602083019250506001810190506127b0565b5050509392505050565b60006127fa6127f58461351c565b6134cb565b9050808382526020820190508285602086028201111561281957600080fd5b60005b8581101561286357813567ffffffffffffffff81111561283b57600080fd5b808601612848898261296a565b8552602085019450602084019350505060018101905061281c565b5050509392505050565b60008135905061287c81613e1d565b92915050565b600082601f83011261289357600080fd5b81356128a384826020860161277b565b91505092915050565b60008083601f8401126128be57600080fd5b8235905067ffffffffffffffff8111156128d757600080fd5b6020830191508360208202830111156128ef57600080fd5b9250929050565b60008135905061290581613e34565b92915050565b60008083601f84011261291d57600080fd5b8235905067ffffffffffffffff81111561293657600080fd5b60208301915083600182028301111561294e57600080fd5b9250929050565b60008135905061296481613e4b565b92915050565b60006060828403121561297c57600080fd5b61298660606134cb565b905060006129968482850161286d565b60008301525060206129aa84828501612955565b602083015250604082013567ffffffffffffffff8111156129ca57600080fd5b6129d684828501612882565b60408301525092915050565b6000602082840312156129f457600080fd5b6000612a028482850161286d565b91505092915050565b600080600080600060608688031215612a2357600080fd5b600086013567ffffffffffffffff811115612a3d57600080fd5b612a49888289016128ac565b95509550506020612a5c8882890161286d565b935050604086013567ffffffffffffffff811115612a7957600080fd5b612a858882890161290b565b92509250509295509295909350565b600060208284031215612aa657600080fd5b6000612ab4848285016128f6565b91505092915050565b60008060408385031215612ad057600080fd5b6000612ade858286016128f6565b9250506020612aef8582860161286d565b9150509250929050565b6000612b058383612b51565b60208301905092915050565b6000612b1d8383612d82565b60208301905092915050565b6000612b3583836130ea565b905092915050565b6000612b49838361313a565b905092915050565b612b5a8161373b565b82525050565b612b698161373b565b82525050565b6000612b7a82613588565b612b8481856135fe565b9350612b8f83613548565b8060005b83811015612bc0578151612ba78882612af9565b9750612bb2836135ca565b925050600181019050612b93565b5085935050505092915050565b6000612bd882613593565b612be2818561360f565b9350612bed83613558565b8060005b83811015612c1e578151612c058882612b11565b9750612c10836135d7565b925050600181019050612bf1565b5085935050505092915050565b6000612c3682613593565b612c408185613620565b9350612c4b83613558565b8060005b83811015612c7c578151612c638882612b11565b9750612c6e836135d7565b925050600181019050612c4f565b5085935050505092915050565b6000612c948261359e565b612c9e8185613631565b935083602082028501612cb085613568565b8060005b85811015612cec5784840389528151612ccd8582612b29565b9450612cd8836135e4565b925060208a01995050600181019050612cb4565b50829750879550505050505092915050565b6000612d09826135a9565b612d138185613642565b935083602082028501612d2585613578565b8060005b85811015612d615784840389528151612d428582612b3d565b9450612d4d836135f1565b925060208a01995050600181019050612d29565b50829750879550505050505092915050565b612d7c8161374d565b82525050565b612d8b81613759565b82525050565b6000612d9c826135b4565b612da68185613653565b9350612db6818560208601613801565b612dbf8161399a565b840191505092915050565b6000612dd5826135b4565b612ddf8185613664565b9350612def818560208601613801565b80840191505092915050565b612e04816137ef565b82525050565b6000612e15826135bf565b612e1f818561366f565b9350612e2f818560208601613801565b612e388161399a565b840191505092915050565b6000612e4e826135bf565b612e588185613680565b9350612e68818560208601613801565b80840191505092915050565b6000612e81603c8361366f565b9150612e8c826139ab565b604082019050919050565b6000612ea460208361366f565b9150612eaf826139fa565b602082019050919050565b6000612ec760268361366f565b9150612ed282613a23565b604082019050919050565b6000612eea60308361366f565b9150612ef582613a72565b604082019050919050565b6000612f0d601b8361366f565b9150612f1882613ac1565b602082019050919050565b6000612f3060178361366f565b9150612f3b82613aea565b602082019050919050565b6000612f53602b8361366f565b9150612f5e82613b13565b604082019050919050565b6000612f7660208361366f565b9150612f8182613b62565b602082019050919050565b6000612f9960268361366f565b9150612fa482613b8b565b604082019050919050565b6000612fbc601b8361366f565b9150612fc782613bda565b602082019050919050565b6000612fdf60358361366f565b9150612fea82613c03565b604082019050919050565b600061300260138361366f565b915061300d82613c52565b602082019050919050565b6000613025602c8361366f565b915061303082613c7b565b604082019050919050565b6000613048603d8361366f565b915061305382613cca565b604082019050919050565b600061306b60278361366f565b915061307682613d19565b604082019050919050565b600061308e60298361366f565b915061309982613d68565b604082019050919050565b60006130b1601783613680565b91506130bc82613db7565b601782019050919050565b60006130d4601183613680565b91506130df82613de0565b601182019050919050565b60006060830160008301516131026000860182612b51565b5060208301516131156020860182612dfb565b506040830151848203604086015261312d8282612bcd565b9150508091505092915050565b60006040830160008301516131526000860182612b51565b506020830151848203602086015261316a8282612bcd565b9150508091505092915050565b60006131838284612dca565b915081905092915050565b6000613199826130a4565b91506131a58285612e43565b91506131b0826130c7565b91506131bc8284612e43565b91508190509392505050565b60006020820190506131dd6000830184612b60565b92915050565b600060208201905081810360008301526131fd8184612b6f565b905092915050565b6000602082019050818103600083015261321f8184612c2b565b905092915050565b600060608201905081810360008301526132418186612c89565b90506132506020830185612b60565b81810360408301526132628184612d91565b9050949350505050565b600060208201905081810360008301526132868184612cfe565b905092915050565b60006020820190506132a36000830184612d73565b92915050565b600060208201905081810360008301526132c38184612e0a565b905092915050565b600060208201905081810360008301526132e481612e74565b9050919050565b6000602082019050818103600083015261330481612e97565b9050919050565b6000602082019050818103600083015261332481612eba565b9050919050565b6000602082019050818103600083015261334481612edd565b9050919050565b6000602082019050818103600083015261336481612f00565b9050919050565b6000602082019050818103600083015261338481612f23565b9050919050565b600060208201905081810360008301526133a481612f46565b9050919050565b600060208201905081810360008301526133c481612f69565b9050919050565b600060208201905081810360008301526133e481612f8c565b9050919050565b6000602082019050818103600083015261340481612faf565b9050919050565b6000602082019050818103600083015261342481612fd2565b9050919050565b6000602082019050818103600083015261344481612ff5565b9050919050565b6000602082019050818103600083015261346481613018565b9050919050565b600060208201905081810360008301526134848161303b565b9050919050565b600060208201905081810360008301526134a48161305e565b9050919050565b600060208201905081810360008301526134c481613081565b9050919050565b60006134d56134e6565b90506134e1828261385e565b919050565b6000604051905090565b600067ffffffffffffffff82111561350b5761350a61396b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156135375761353661396b565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613696826137b8565b91506136a1836137b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136d6576136d561390d565b5b828201905092915050565b60006136ec826137b8565b91506136f7836137b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137305761372f61390d565b5b828202905092915050565b600061374682613798565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061379382613e09565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60006137e73684846127e7565b905092915050565b60006137fa82613785565b9050919050565b60005b8381101561381f578082015181840152602081019050613804565b8381111561382e576000848401525b50505050565b600061383f826137b8565b915060008214156138535761385261390d565b5b600182039050919050565b6138678261399a565b810181811067ffffffffffffffff821117156138865761388561396b565b5b80604052505050565b600061389a826137b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138cd576138cc61390d565b5b600182019050919050565b60006138e3826137c2565b91506bffffffffffffffffffffffff8214156139025761390161390d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860008201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560008201527f7665727465640000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420736574207472616e7366657220686f6f6b20746f20756e737560008201527f70706f727465642073656c6563746f7200000000000000000000000000000000602082015250565b7f41646d696e2066756e6374696f6e616c697479207265766f6b65640000000000600082015250565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b7f4f6e6c792061646420616374696f6e20737570706f7274656420696e20736177600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f466163657420616c72656164792065786973747320696e207361770000000000600082015250565b7f43616e6e6f742073657420746f6b656e20757269206f7665727269646520746f60008201527f20756e737570706f727465642073656c6563746f720000000000000000000000602082015250565b7f4661636574206e6f7420737570706f7274656400000000000000000000000000600082015250565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b7f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460008201527f7920627574205f696e6974206973206e6f742061646472657373283029000000602082015250565b7f43616e6e6f74206164642066756e6374696f6e207468617420616c726561647960008201527f2065786973747300000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c79206f6e652066616365742063616e20696d706c656d656e7420616e2060008201527f696e746572666163650000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60038110613e1a57613e1961393c565b5b50565b613e268161373b565b8114613e3157600080fd5b50565b613e3d81613759565b8114613e4857600080fd5b50565b60038110613e5857600080fd5b5056fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a264697066735822122035464097ae9831b99850d4ce14d4df1aa70b73418f19c6c0ae99cb9ec304e78564736f6c63430008040033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.