ETH Price: $2,677.98 (-0.83%)

Contract

0xa2707b069EEbca7f8Ae133162f19FE720D3aAA58
 
Transaction Hash
Method
Block
From
To
Create Sale208438502024-09-27 18:47:4724 hrs ago1727462867IN
0xa2707b06...20D3aAA58
0 ETH0.0008454813.8397912
Create Sale208438132024-09-27 18:40:2324 hrs ago1727462423IN
0xa2707b06...20D3aAA58
0 ETH0.000874613.68903073
Purchase OBO208365772024-09-26 18:26:592 days ago1727375219IN
0xa2707b06...20D3aAA58
0 ETH0.0032020122.6076783
Create Sale208363812024-09-26 17:47:232 days ago1727372843IN
0xa2707b06...20D3aAA58
0 ETH0.002478230.40070513
Create Sale208363712024-09-26 17:45:232 days ago1727372723IN
0xa2707b06...20D3aAA58
0 ETH0.0026396532.38123386
Create Sale208363672024-09-26 17:44:352 days ago1727372675IN
0xa2707b06...20D3aAA58
0 ETH0.0025841931.70096257
Create Sale208363622024-09-26 17:43:352 days ago1727372615IN
0xa2707b06...20D3aAA58
0 ETH0.0025073530.75824833
Create Sale208363552024-09-26 17:42:112 days ago1727372531IN
0xa2707b06...20D3aAA58
0 ETH0.0024935530.58898205
Create Sale208362142024-09-26 17:13:472 days ago1727370827IN
0xa2707b06...20D3aAA58
0 ETH0.0027189834.5407664
Create Sale208362032024-09-26 17:11:352 days ago1727370695IN
0xa2707b06...20D3aAA58
0 ETH0.0029734336.47583541
Create Sale208361632024-09-26 17:03:352 days ago1727370215IN
0xa2707b06...20D3aAA58
0 ETH0.0035468243.50977338
Create Sale208321712024-09-26 3:43:112 days ago1727322191IN
0xa2707b06...20D3aAA58
0 ETH0.0013049913.3490732
Create Sale208321632024-09-26 3:41:352 days ago1727322095IN
0xa2707b06...20D3aAA58
0 ETH0.0013799914.11633392
Accept Bid208314462024-09-26 1:17:232 days ago1727313443IN
0xa2707b06...20D3aAA58
0 ETH0.0015411713.45813186
Purchase OBO208303852024-09-25 21:44:472 days ago1727300687IN
0xa2707b06...20D3aAA58
0 ETH0.0021361815.08243211
Purchase OBO208303832024-09-25 21:44:232 days ago1727300663IN
0xa2707b06...20D3aAA58
0 ETH0.0019828814.00008698
Purchase OBO208303832024-09-25 21:44:232 days ago1727300663IN
0xa2707b06...20D3aAA58
0 ETH0.0019830514.00008698
Accept Bid208295892024-09-25 19:05:353 days ago1727291135IN
0xa2707b06...20D3aAA58
0 ETH0.003406420.70221289
Bid On Token208242652024-09-25 1:12:593 days ago1727226779IN
0xa2707b06...20D3aAA58
0.069 ETH0.0018324716.45111458
Accept Bids OBO208233362024-09-24 22:06:353 days ago1727215595IN
0xa2707b06...20D3aAA58
0 ETH0.0020618.26148733
Create Sale208218602024-09-24 17:10:354 days ago1727197835IN
0xa2707b06...20D3aAA58
0 ETH0.0034838125.16881998
Create Sale208180192024-09-24 4:19:594 days ago1727151599IN
0xa2707b06...20D3aAA58
0 ETH0.0019630914.18237591
Create Sale208179432024-09-24 4:04:354 days ago1727150675IN
0xa2707b06...20D3aAA58
0 ETH0.0015761511.38689371
Create Sale208178702024-09-24 3:49:594 days ago1727149799IN
0xa2707b06...20D3aAA58
0 ETH0.0017189612.41865506
Purchase208142442024-09-23 15:41:475 days ago1727106107IN
0xa2707b06...20D3aAA58
0.05 ETH0.0028734132.30337925
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
208314462024-09-26 1:17:232 days ago1727313443
0xa2707b06...20D3aAA58
0.05865 ETH
208295892024-09-25 19:05:353 days ago1727291135
0xa2707b06...20D3aAA58
0.063 ETH
208142442024-09-23 15:41:475 days ago1727106107
0xa2707b06...20D3aAA58
0.0425 ETH
208139312024-09-23 14:38:355 days ago1727102315
0xa2707b06...20D3aAA58
0.0875 ETH
207924882024-09-20 14:46:358 days ago1726843595
0xa2707b06...20D3aAA58
0.1615 ETH
207924772024-09-20 14:44:238 days ago1726843463
0xa2707b06...20D3aAA58
0.1615 ETH
207924592024-09-20 14:40:478 days ago1726843247
0xa2707b06...20D3aAA58
0.153 ETH
207782732024-09-18 15:08:1110 days ago1726672091
0xa2707b06...20D3aAA58
0.55 ETH
207782692024-09-18 15:07:2310 days ago1726672043
0xa2707b06...20D3aAA58
0.55 ETH
207382582024-09-13 0:58:4715 days ago1726189127
0xa2707b06...20D3aAA58
0.05 ETH
207370142024-09-12 20:48:2315 days ago1726174103
0xa2707b06...20D3aAA58
0.05 ETH
207151832024-09-09 19:36:2318 days ago1725910583
0xa2707b06...20D3aAA58
0.1615 ETH
206856072024-09-05 16:33:5923 days ago1725554039
0xa2707b06...20D3aAA58
0.1615 ETH
206855982024-09-05 16:32:1123 days ago1725553931
0xa2707b06...20D3aAA58
0.1615 ETH
206855932024-09-05 16:31:1123 days ago1725553871
0xa2707b06...20D3aAA58
0.1615 ETH
206855842024-09-05 16:29:1123 days ago1725553751
0xa2707b06...20D3aAA58
0.1615 ETH
206855712024-09-05 16:26:2323 days ago1725553583
0xa2707b06...20D3aAA58
0.1615 ETH
206855642024-09-05 16:24:5923 days ago1725553499
0xa2707b06...20D3aAA58
0.1615 ETH
206855552024-09-05 16:23:1123 days ago1725553391
0xa2707b06...20D3aAA58
0.1615 ETH
206786042024-09-04 17:06:2324 days ago1725469583
0xa2707b06...20D3aAA58
0.14625 ETH
206499132024-08-31 17:02:1128 days ago1725123731
0xa2707b06...20D3aAA58
1.198 ETH
206423372024-08-30 15:38:1129 days ago1725032291
0xa2707b06...20D3aAA58
1.7 ETH
206415282024-08-30 12:55:2329 days ago1725022523
0xa2707b06...20D3aAA58
0.062 ETH
206415242024-08-30 12:54:3529 days ago1725022475
0xa2707b06...20D3aAA58
0.062 ETH
206368192024-08-29 21:07:3529 days ago1724965655
0xa2707b06...20D3aAA58
0.15725 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DigitalMediaSaleCore

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: SafeBoxInterface.sol



pragma solidity 0.8.16;

abstract contract SafeBoxInterface {
    function VERSION() public pure virtual returns (uint8);

    function typeOfContract() public pure virtual returns (bytes32);

    function singleTransfer(
        address _tokenContract,
        uint256 _tokenId,
        address _to
    ) external virtual;
}

// File: VaultCoreInterface.sol



pragma solidity 0.8.16;

abstract contract VaultCoreInterface {
    function VERSION() public pure virtual returns (uint8);

    function typeOfContract() public pure virtual returns (bytes32);

    function approveToken(uint256 _tokenId, address _tokenContractAddress)
        external
        virtual;
}

// File: RoyaltyRegistryInterface.sol



pragma solidity 0.8.16;

/**
 * Interface to the RoyaltyRegistry responsible for looking payout addresses
 */
abstract contract RoyaltyRegistryInterface {
    function getAddress(address custodial)
        external
        view
        virtual
        returns (address);

    function getMediaCustomPercentage(uint256 mediaId, address tokenAddress)
        external
        view
        virtual
        returns (uint16);

    function getExternalTokenPercentage(uint256 tokenId, address tokenAddress)
        external
        view
        virtual
        returns (uint16, uint16);

    function typeOfContract() public pure virtual returns (string calldata);

    function VERSION() public pure virtual returns (uint8);
}

// File: PaymentsBufferInterface.sol



pragma solidity 0.8.16;

/**
 * Interface to move funds to PaymentsBuffer for owner to claim it later.
 */
abstract contract PaymentsBufferInterface {
    function typeOfContract() public pure virtual returns (bytes32);

    function add(address _to) external payable virtual;

    function withdraw() external payable virtual;
}

// File: DigitalMediaBurnInterfaceV3.sol



pragma solidity 0.8.16;

/**
 * Interface to the DigitalMediaCore responsible for burning tokens
 */
abstract contract DigitalMediaBurnInterfaceV3 {
    struct PayoutInfo {
        address user;
        uint256 amount;
    }

    function burn(uint256 _tokenId) external virtual;

    function burnDigitalMedia(uint256 _digitalMedia) external virtual;

    function getDigitalMediaForSale(uint256 _digitalMediaId)
        external
        view
        virtual
        returns (
            address,
            bool,
            uint16
        );

    function getDigitalMediaRelease(uint256 _tokenId)
        external
        view
        virtual
        returns (uint32, uint256);

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        returns (PayoutInfo[] memory);

    function saleInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        returns (PayoutInfo[] memory);
}

// File: DigitalMediaBurnInterfaceV2.sol



pragma solidity 0.8.16;

/**
 * Interface to the DigitalMediaCore responsible for burning tokens
 */
abstract contract DigitalMediaBurnInterfaceV2 {
    function burn(uint256 _tokenId) external virtual;

    function burnToken(uint256 _tokenId) external virtual;

    function burnDigitalMedia(uint256 _digitalMedia) external virtual;

    function getDigitalMedia(uint256 _digitalMediaId)
        external
        view
        virtual
        returns (
            uint256,
            uint32,
            uint32,
            uint256,
            address,
            string calldata
        );

    function getDigitalMediaRelease(uint256 _tokenId)
        external
        view
        virtual
        returns (
            uint256,
            uint32,
            uint256
        );
}

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: WithdrawFundsControl.sol



pragma solidity 0.8.16;



contract WithdrawFundsControl is Ownable, Pausable {
    // List of approved on withdraw addresses
    mapping(address => uint256) public approvedWithdrawAddresses;
    bool public isInitialWithdrawAddressAdded = false;

    // Full week wait period before an approved withdraw address becomes active
    uint256 public constant withdrawApprovalWaitPeriod = 1 days;

    event WithdrawAddressAdded(address withdrawAddress);
    event WithdrawAddressRemoved(address widthdrawAddress);

    /**
     * Add a new approved on behalf of user address.
     */
    function addApprovedWithdrawAddress(address _withdrawAddress)
        external
        onlyOwner
    {
        approvedWithdrawAddresses[_withdrawAddress] = block.timestamp;
        emit WithdrawAddressAdded(_withdrawAddress);
    }

    /*
     * Add new withdrawAddress for immediate use. This is an internal only Fn that is called
     * only when the contract is deployed.
     */
    function addApprovedWithdrawAddressImmediately(address _withdrawAddress)
        internal
        onlyOwner
    {
        if (_withdrawAddress != address(0)) {
            // set the date to one in past so that address is active immediately.
            approvedWithdrawAddresses[_withdrawAddress] =
                block.timestamp -
                withdrawApprovalWaitPeriod -
                1;
            emit WithdrawAddressAdded(_withdrawAddress);
        }
    }

    /**
     * Removes an approved on bhealf of user address.
     */
    function removeApprovedWithdrawAddress(address _withdrawAddress)
        external
        onlyOwner
    {
        delete approvedWithdrawAddresses[_withdrawAddress];
        emit WithdrawAddressRemoved(_withdrawAddress);
    }

    function addApprovedWithdrawAddressAfterDeploy(address _withdrawAddress)
        external
        onlyOwner
    {
        require(
            isInitialWithdrawAddressAdded == false,
            "Initial withdraw address already added"
        );
        addApprovedWithdrawAddressImmediately(_withdrawAddress);
        isInitialWithdrawAddressAdded = true;
    }

    /**
     * Checks that a given withdraw address ia approved and is past it's required
     * wait time.
     */
    function isApprovedWithdrawAddress(address _withdrawAddress)
        internal
        view
        returns (bool)
    {
        uint256 approvalTime = approvedWithdrawAddresses[_withdrawAddress];
        require(approvalTime > 0, "withdraw address is not registered");
        return block.timestamp - approvalTime > withdrawApprovalWaitPeriod;
    }
}

// File: OBOControl.sol



pragma solidity 0.8.16;


contract OBOControl is Ownable {
    address public oboAdmin;
    uint256 public constant newAddressWaitPeriod = 1 days;
    bool public canAddOBOImmediately = true;

    // List of approved on behalf of users.
    mapping(address => uint256) public approvedOBOs;

    event NewOBOAddressEvent(address OBOAddress, bool action);

    event NewOBOAdminAddressEvent(address oboAdminAddress);

    modifier onlyOBOAdmin() {
        require(
            owner() == _msgSender() || oboAdmin == _msgSender(),
            "not oboAdmin"
        );
        _;
    }

    function setOBOAdmin(address _oboAdmin) external onlyOwner {
        oboAdmin = _oboAdmin;
        emit NewOBOAdminAddressEvent(_oboAdmin);
    }

    /**
     * Add a new approvedOBO address. The address can be used after wait period.
     */
    function addApprovedOBO(address _oboAddress) external onlyOBOAdmin {
        require(_oboAddress != address(0), "cant set to 0x");
        require(approvedOBOs[_oboAddress] == 0, "already added");
        approvedOBOs[_oboAddress] = block.timestamp;
        emit NewOBOAddressEvent(_oboAddress, true);
    }

    /**
     * Removes an approvedOBO immediately.
     */
    function removeApprovedOBO(address _oboAddress) external onlyOBOAdmin {
        delete approvedOBOs[_oboAddress];
        emit NewOBOAddressEvent(_oboAddress, false);
    }

    /*
     * Add OBOAddress for immediate use. This is an internal only Fn that is called
     * only when the contract is deployed.
     */
    function addApprovedOBOImmediately(address _oboAddress) internal {
        require(_oboAddress != address(0), "addr(0)");
        // set the date to one in past so that address is active immediately.
        approvedOBOs[_oboAddress] = block.timestamp - newAddressWaitPeriod - 1;
        emit NewOBOAddressEvent(_oboAddress, true);
    }

    function addApprovedOBOAfterDeploy(address _oboAddress)
        external
        onlyOBOAdmin
    {
        require(canAddOBOImmediately == true, "disabled");
        addApprovedOBOImmediately(_oboAddress);
    }

    function blockImmediateOBO() external onlyOBOAdmin {
        canAddOBOImmediately = false;
    }

    /*
     * Helper function to verify is a given address is a valid approvedOBO address.
     */
    function isValidApprovedOBO(address _oboAddress)
        public
        view
        returns (bool)
    {
        uint256 createdAt = approvedOBOs[_oboAddress];
        if (createdAt == 0) {
            return false;
        }
        return block.timestamp - createdAt > newAddressWaitPeriod;
    }

    /**
     * @dev Modifier to make the obo calls only callable by approved addressess
     */
    modifier isApprovedOBO() {
        require(isValidApprovedOBO(msg.sender), "unauthorized OBO user");
        _;
    }
}

// File: DigitalMediaSaleBase.sol



pragma solidity 0.8.16;






contract DigitalMediaSaleBase is OBOControl, Pausable {
    uint16 public royaltyPercentage = 1000;
    // reserving 0 with BadContract so that we can verify membership of a mapping.
    enum ContractType {
        BadContract,
        MakersPlaceV2,
        MakersPlaceV3
    }
    // Mapping of token contract address to bool indicated approval.
    mapping(address => ContractType) public approvedTokenContracts;
    error InvalidTokenAddress(address tokenAddress);

    /**
     * Adds a new token contract address to be approved to be called.
     */
    function addApprovedTokenContract(
        address _tokenContractAddress,
        ContractType _contractType
    ) external onlyOwner {
        approvedTokenContracts[_tokenContractAddress] = _contractType;
    }

    /**
     * Remove an approved token contract address from the list of approved addresses.
     */
    function removeApprovedTokenContract(address _tokenContractAddress)
        external
        onlyOwner
    {
        delete approvedTokenContracts[_tokenContractAddress];
    }

    /**
     * Checks that a particular token contract address is a valid MP token contract.
     */
    function _isValidTokenContract(address _tokenContractAddress)
        internal
        view
        returns (bool)
    {
        return
            approvedTokenContracts[_tokenContractAddress] !=
            ContractType.BadContract;
    }

    /**
     * Returns an ERC721 instance of a token contract address.  Throws otherwise.
     * Only valid and approved token contracts are allowed to be interacted with.
     */
    function _getTokenContract(address _tokenContractAddress)
        internal
        pure
        returns (IERC721)
    {
        // require(_isValidTokenContract(_tokenContractAddress), "Invalid tcontract");
        return IERC721(_tokenContractAddress);
    }

    /**
     * Checks with the ERC-721 token contract the owner of the a token
     */
    function _ownerOf(uint256 _tokenId, address _tokenContractAddress)
        internal
        view
        returns (address)
    {
        IERC721 tokenContract = _getTokenContract(_tokenContractAddress);
        return tokenContract.ownerOf(_tokenId);
    }

    /**
     * Checks to ensure that the token owner has approved the escrow contract,
     * or escrowAddress owns the token.
     */
    function _approvedForEscrow(
        address _seller,
        uint256 _tokenId,
        address _tokenContractAddress,
        address _escrowAddress
    ) internal view returns (bool) {
        IERC721 tokenContract = _getTokenContract(_tokenContractAddress);
        // seller is the owner of the token, so checking that first
        return (_seller == _escrowAddress ||
            tokenContract.isApprovedForAll(_seller, _escrowAddress) ||
            tokenContract.getApproved(_tokenId) == _escrowAddress);
    }

    /**
     * Transfer an ERC-721 token from seller to the buyer.  This is to be called after a purchase is
     * completed.
     */
    function _transferFromTo(
        address _seller,
        address _receiver,
        uint256 _tokenId,
        address _tokenContractAddress
    ) internal {
        IERC721 tokenContract = _getTokenContract(_tokenContractAddress);
        tokenContract.safeTransferFrom(_seller, _receiver, _tokenId);
    }

    function getDigitalMedia(uint256 _digitalMediaId, address _tokenAddress)
        internal
        view
        returns (
            address creator,
            bool collaborated,
            uint16 royalty
        )
    {
        ContractType cType = approvedTokenContracts[_tokenAddress];
        if (cType == ContractType.MakersPlaceV2) {
            DigitalMediaBurnInterfaceV2 tokenContract = DigitalMediaBurnInterfaceV2(
                    _tokenAddress
                );
            (, , , , creator, ) = tokenContract.getDigitalMedia(
                _digitalMediaId
            );
            collaborated = false;
            royalty = royaltyPercentage;
        } else if (cType == ContractType.MakersPlaceV3) {
            DigitalMediaBurnInterfaceV3 tokenContract = DigitalMediaBurnInterfaceV3(
                    _tokenAddress
                );
            (creator, collaborated, royalty) = tokenContract
                .getDigitalMediaForSale(_digitalMediaId);
        } else {
            revert InvalidTokenAddress({tokenAddress: _tokenAddress});
        }
    }

    function getReleaseMedia(uint256 _tokenId, address _tokenAddress)
        internal
        view
        returns (uint256 mediaId)
    {
        ContractType cType = approvedTokenContracts[_tokenAddress];
        if (cType == ContractType.MakersPlaceV2) {
            DigitalMediaBurnInterfaceV2 tokenContract = DigitalMediaBurnInterfaceV2(
                    _tokenAddress
                );
            (, , mediaId) = tokenContract.getDigitalMediaRelease(_tokenId);
        } else if (cType == ContractType.MakersPlaceV3) {
            DigitalMediaBurnInterfaceV3 tokenContract = DigitalMediaBurnInterfaceV3(
                    _tokenAddress
                );
            (, mediaId) = tokenContract.getDigitalMediaRelease(_tokenId);
        } else {
            revert InvalidTokenAddress({tokenAddress: _tokenAddress});
        }
    }
}

// File: CommissionControl.sol



pragma solidity 0.8.16;



contract CommissionControl is OBOControl, Pausable {
    enum CommissionType {
        InvalidType,
        saleType,
        reSaleType,
        externalType
    }
    event CommissionPercentageChanged(
        CommissionType commissionType,
        uint16 percentage,
        bool committed
    );

    // 3 days wait period before new percentage is in effect
    uint256 public constant commissionAddressWaitPeriod = 3 days;

    struct CommissionStruct {
        uint16 percentage;
        uint16 intermediatePercentage;
        uint256 createdAt;
    }

    CommissionStruct public saleCommission = CommissionStruct(1500, 0, 0);
    CommissionStruct public reSaleCommission = CommissionStruct(250, 0, 0);
    CommissionStruct public externalSaleCommission = CommissionStruct(0, 0, 0);
    uint256 internal constant HUNDREDPERCENT = 10000;

    function _getCommisssionStruct(CommissionType _cType)
        internal
        view
        returns (CommissionStruct storage)
    {
        CommissionStruct storage x;
        if (_cType == CommissionType.saleType) {
            x = saleCommission;
        } else if (_cType == CommissionType.reSaleType) {
            x = reSaleCommission;
        } else {
            x = externalSaleCommission;
        }
        return x;
    }

    /*
     * Change commission percentage for contract. Usually in the range of 80-90%.
     * This change is stored in mapping untill committed. You can only commit
     * after the wait period.
     */
    function changeCommissionPercentage(
        uint16 _percentage,
        CommissionType _cType
    ) external whenNotPaused onlyOwner {
        require(
            _percentage > 0 && _percentage <= HUNDREDPERCENT,
            "Invalid percentage"
        );
        CommissionStruct storage commission = _getCommisssionStruct(_cType);
        require(
            commission.intermediatePercentage == 0,
            "commissionChange exists"
        );
        commission.intermediatePercentage = _percentage;
        commission.createdAt = block.timestamp;
        emit CommissionPercentageChanged({
            commissionType: _cType,
            percentage: _percentage,
            committed: false
        });
    }

    function deleteCommissionChange(CommissionType _cType)
        external
        whenNotPaused
        onlyOwner
    {
        CommissionStruct storage commission = _getCommisssionStruct(_cType);
        commission.intermediatePercentage = 0;
        commission.createdAt = 0;
    }

    /*
     * Commit a commission percentage change that has already been submitted for change.
     */
    function commitCommissionChange(CommissionType _cType)
        external
        whenNotPaused
        onlyOwner
    {
        CommissionStruct storage commission = _getCommisssionStruct(_cType);
        require(
            commission.intermediatePercentage > 0,
            "commissionChange exists"
        );
        require(
            block.timestamp - commission.createdAt >
                commissionAddressWaitPeriod,
            "under wait period"
        );
        commission.percentage = commission.intermediatePercentage;
        commission.intermediatePercentage = 0;
        commission.createdAt = 0;
        emit CommissionPercentageChanged({
            commissionType: _cType,
            percentage: commission.percentage,
            committed: true
        });
    }

    /*
     * Calculates payout for a given sale / bid price by doing the percentage math.
     */
    function _computePayoutForPrice(
        uint256 salePrice,
        uint256 thisCommissionPercentage
    ) internal pure returns (uint256) {
        return
            (salePrice * ((HUNDREDPERCENT - thisCommissionPercentage))) /
            (HUNDREDPERCENT);
    }
}

// File: DigitalMediaFixedSale.sol



pragma solidity 0.8.16;








contract DigitalMediaFixedSale is
    DigitalMediaSaleBase,
    CommissionControl,
    WithdrawFundsControl
{
    // constants (no storage used)
    uint256 internal constant changeContractWaitPeriod = 2 days;

    // storage
    bool public canRoyaltyRegistryChange = true;

    address internal newSafeBoxAddress;
    uint256 internal newSafeBoxCreatedAt;
    address internal newVaultAddress;
    uint256 internal newVaultCreatedAt;

    // Keep track of all the bids so that we dont withdraw current bids from this contract.
    // When a bid is accepted we can subtract the bid value from this totalBidAmount.
    // Initializaing variable to zero costs extra gas. by default its zero.
    uint256 public totalBidAmount;

    /** EVENTS **/
    event SaleCreatedEvent(
        uint256 tokenId,
        address tokenContractAddress,
        bool acceptFiat,
        uint256 priceInWei
    );

    event SaleSuccessfulEvent(
        uint256 tokenId,
        address tokenContractAddress,
        address buyer,
        address payoutAddress,
        uint256 payoutAmount,
        uint256 priceInWei
    );

    event OBOSaleEvent(
        uint256 tokenId,
        address tokenContractAddress,
        address buyer,
        uint256 priceInWei
    );

    event SaleCanceledEvent(uint256 tokenId, address tokenContractAddress);

    event NewSafeBoxRegistered(address newSafeBoxAddress);
    event NewVaultRegistered(address newVaultAddress);
    event NewVaultInEffect(address newVaultAddress);
    event NewSafeBoxInEffect(address newSafeBoxAddress);

    struct DigitalMediaSale {
        bool acceptFiat;
        address seller;
        uint256 priceInWei;
        // if commissionPercentage is set its a non-custodial sale.
        // createSaleOBO will set commissionPercentage to zero.
        uint256 commissionPercentage;
    }

    // Mapping of token contract address to ID to Digital Media Sale object.
    mapping(address => mapping(uint256 => DigitalMediaSale)) public tokenToSale;
    PaymentsBufferInterface public paymentInterface;
    RoyaltyRegistryInterface public royaltyStore;
    SafeBoxInterface public safebox;
    VaultCoreInterface public vaultInterface;

    constructor(
        address _royaltyRegistryAddress,
        address _safebox,
        address _vaultAddress
    ) {
        setRoyaltyRegistryStore(_royaltyRegistryAddress);
        safebox = _validateSafeBoxAddress(_safebox);
        vaultInterface = _validateVaultAddress(_vaultAddress);
    }

    function _validateVaultAddress(address _vaultAddress)
        internal
        pure
        returns (VaultCoreInterface)
    {
        require(_vaultAddress != address(0), "vault can't be 0x");
        bytes32 vault_type = 0x6d707661756c7400000000000000000000000000000000000000000000000000;

        VaultCoreInterface vault = VaultCoreInterface(_vaultAddress);
        require(vault.typeOfContract() == vault_type, "not vault");
        return vault;
    }

    function _validateSafeBoxAddress(address _safebox)
        internal
        pure
        returns (SafeBoxInterface)
    {
        // bytes32 safebox_type = bytes32(bytes("safebox"));
        bytes32 safebox_type = 0x73616665426f7800000000000000000000000000000000000000000000000000;

        SafeBoxInterface sb = SafeBoxInterface(_safebox);
        require(sb.typeOfContract() == safebox_type, "not safebox");
        return sb;
    }

    /*
     * Need to register the new vault address first. Then call setVaultAddress after
     * wait period to set it for good.
     */
    function registerNewVaultAddress(address _vaultAddress) external onlyOwner {
        _validateVaultAddress(_vaultAddress);
        newVaultAddress = _vaultAddress;
        newVaultCreatedAt = block.timestamp;
        emit NewVaultRegistered(_vaultAddress);
    }

    /*
     * Need to register the new safebox address first. Then call setSafeboxddress after
     * wait period to set it for good.
     */
    function registerNewSafeBoxAddress(address _safebox)
        external
        whenNotPaused
        onlyOwner
    {
        newSafeBoxAddress = address(_validateSafeBoxAddress(_safebox));
        newSafeBoxCreatedAt = block.timestamp;
        emit NewSafeBoxRegistered(_safebox);
    }

    /* set the vault for this sale contract. All custodial token owners grant approveAll
     * permission to the vault. The sale contract get approve permission for each token
     * from the vault and transfers it to the final destination in case of sale / bid accept.
     */
    function setVaultAddress(address _vaultAddress) external onlyOwner {
        VaultCoreInterface vault = _validateVaultAddress(_vaultAddress);
        // If we are changing vault address make sure it passes the conditions
        if (address(vaultInterface) != address(0)) {
            // store vault address
            require(_vaultAddress == newVaultAddress, "_vault != newVault");
            require(
                block.timestamp - newVaultCreatedAt > changeContractWaitPeriod,
                "wait"
            );
        }
        vaultInterface = vault;
        emit NewVaultInEffect(_vaultAddress);
    }

    function setSafeboxAddress(address _safebox)
        external
        whenNotPaused
        onlyOwner
    {
        require(_safebox == newSafeBoxAddress, "_safebox != newSafebox");
        require(
            block.timestamp - newSafeBoxCreatedAt > changeContractWaitPeriod,
            "wait"
        );
        safebox = _validateSafeBoxAddress(_safebox);
        emit NewSafeBoxInEffect(_safebox);
    }

    function setRoyaltyPercentage(uint16 _newPercentage)
        external
        whenNotPaused
        onlyOwner
    {
        // Royalty can be 30% max
        require(
            _newPercentage >= 0 && _newPercentage <= 3000,
            "Invalid Royalty"
        );
        royaltyPercentage = _newPercentage;
    }

    function setRoyaltyRegistryStore(address _royaltyStore)
        public
        whenNotPaused
        onlyOBOAdmin
    {
        require(canRoyaltyRegistryChange == true, "no");
        RoyaltyRegistryInterface candidateRoyaltyStore = RoyaltyRegistryInterface(
                _royaltyStore
            );
        require(candidateRoyaltyStore.VERSION() == 1, "roylty v!= 1");
        bytes32 contractType = keccak256(
            abi.encodePacked(candidateRoyaltyStore.typeOfContract())
        );
        // keccak256(abi.encodePacked("royaltyRegistry")) = 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323
        require(
            contractType ==
                0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323,
            "not royalty"
        );
        royaltyStore = candidateRoyaltyStore;
    }

    function setRoyaltyRegistryForever() external whenNotPaused onlyOwner {
        canRoyaltyRegistryChange = false;
    }

    /**
     * Removes the sale object and emits SaleCanceledEvent.
     */
    function _cancelSale(uint256 _tokenId, address _tokenContractAddress)
        internal
    {
        _removeSale(_tokenId, _tokenContractAddress);
        emit SaleCanceledEvent(_tokenId, _tokenContractAddress);
    }

    /**
     * Removes a token from storage.
     */
    function _removeSale(uint256 _tokenId, address _tokenContractAddress)
        internal
    {
        delete tokenToSale[_tokenContractAddress][_tokenId];
    }

    /**
     * Returns true whether a particular DigitalMediaSale instance is on sale.
     */
    function _isOnSale(DigitalMediaSale storage _sale)
        internal
        view
        returns (bool)
    {
        return (_sale.priceInWei > 0);
    }

    /**
     * Cancel sale if sale exists for a token. Safe to call even if sale does not exist.
     */
    function _cancelSaleIfSaleExists(
        uint256 _tokenId,
        address _tokenContractAddress
    ) internal {
        DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][
            _tokenId
        ];
        if (_isOnSale(sale)) {
            _cancelSale(_tokenId, _tokenContractAddress);
        }
    }

    /**
     * Handles the purchase logic of a token.  Checks that only tokens on sale are actually
     * purchaseable, ensures that right amount of ether is sent and also sends back any
     * excess payment to the buyer.
     *
     * This function only handles the purchase capability not the actual transfer
     * of the token itself or emitting event related to purchase.
     *
     * The proceeds remains on the smart contract until ready for withdrawl from the CFO account.
     */
    function _purchase(
        uint256 _tokenId,
        address _tokenContractAddress,
        DigitalMediaSale storage sale,
        uint256 _paymentAmount
    ) internal returns (uint256) {
        // Check that the bid is greater than or equal to the current price
        uint256 price = sale.priceInWei;
        require(_paymentAmount >= price, "< price");
        // Remove the token from being on sale before transferring funds to avoid replay
        _removeSale(_tokenId, _tokenContractAddress);
        uint256 excessPayment = _paymentAmount - price;

        if (excessPayment > 0) {
            payable(msg.sender).call{value: excessPayment, gas: 5000};
        }
        return price;
    }

    /* Set PaymentsBuffer interface */
    function registerPaymentsBufferAddress(address _bufferAddress)
        external
        onlyOwner
    {
        require(address(paymentInterface) == address(0), "already set");
        PaymentsBufferInterface paymentsBuffer = PaymentsBufferInterface(
            _bufferAddress
        );
        require(
            paymentsBuffer.typeOfContract() ==
                0x6d707061796d656e747362756666657200000000000000000000000000000000,
            "not buffer"
        );
        paymentInterface = paymentsBuffer;
    }

    /*
     * Transfer money to an address. If the transfer fails move the funds to
     * PaymentsBuffer contract where the owner of the funds can come and claim it.
     */
    function transferFunds(address _toAddress, uint256 amount) internal {
        (bool sent, ) = _toAddress.call{value: amount, gas: 5000}("");
        if (!sent) {
            require(
                address(paymentInterface) != address(0),
                "paymentInterface should be set"
            );
            paymentInterface.add{value: amount}(_toAddress);
        }
    }

    /**
     * Withdraws all the funds to a specified non-zero address.
     */
    function withdrawFunds(address payable _withdrawAddress)
        external
        isApprovedOBO
    {
        require(
            isApprovedWithdrawAddress(_withdrawAddress),
            "unapproved withdrawAddress"
        );
        uint256 contractBalance = address(this).balance;
        // We can withdraw all successful sale related funds but not pending bids
        uint256 deductibleBalance = contractBalance - totalBidAmount;
        _withdrawAddress.transfer(deductibleBalance);
    }

    /**
     * Validate tokenId, tokenAddress and escrow permission for msg.sender
     */
    function validateTokenForEscrow(
        uint256 _tokenId,
        address _tokenContractAddress
    ) internal view returns (address) {
        address seller = _ownerOf(_tokenId, _tokenContractAddress);
        require(msg.sender == seller, "msg.sender != seller");
        require(
            _approvedForEscrow(
                msg.sender,
                _tokenId,
                _tokenContractAddress,
                address(this)
            ),
            "approve/All missing"
        );
        return seller;
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: DigitalMediaSaleCore.sol



pragma solidity 0.8.16;




contract DigitalMediaSaleCore is DigitalMediaFixedSale, ReentrancyGuard {
    using Counters for Counters.Counter;

    // consts
    uint8 public constant VERSION = 3;
    bytes32 private constant safeboxType =
        0x73616665426f7800000000000000000000000000000000000000000000000000;

    // storage slots
    Counters.Counter private _bidCounter;
    // tokenIdToBidId[tokenAddress[token_id]] = 2;
    mapping(address => mapping(uint256 => uint256)) tokenIdToBidId;
    mapping(uint256 => TokenBid) bidIdToTokenBid;

    struct SaleRequest {
        uint256 tokenId;
        uint256 amount;
        bool acceptFiat;
        address tokenAddress;
    }

    event TokenBidCreatedEvent(
        uint256 tokenId,
        address tokenAddress,
        uint256 bidId,
        uint256 bidPrice,
        address bidder
    );

    event TokenBidRemovedEvent(
        uint256 tokenId,
        address tokenAddress,
        uint256 bidId,
        bool isBidder
    );

    event TokenBidAccepted(
        uint256 tokenId,
        address tokenAddress,
        uint256 bidId,
        uint256 bidPrice,
        address bidder,
        address payoutAddress,
        address seller,
        uint256 payoutAmount
    );

    struct TokenBid {
        address bidder;
        uint256 price;
    }

    struct OBOAcceptBidStruct {
        address tokenAddress;
        uint256 tokenId;
        uint256 bidId;
        bool useSafebox;
    }

    constructor(
        address _royaltyRegistryAddress,
        address _safebox,
        address _vault
    ) DigitalMediaFixedSale(_royaltyRegistryAddress, _safebox, _vault) {}

    /*
     * Compute commission percentage for a given token. Checks if token creator is seller
     * to determine if its a sale or a resale.
     */
    function getCommissionPercentageForToken(
        address _seller,
        uint256 _tokenId,
        address _tokenContractAddress
    ) internal view returns (uint256) {
        // if the tokenContractAddress is of external type return external sale commission
        if (_isValidTokenContract(_tokenContractAddress) == false) {
            (uint16 customCommission, uint16 customRoyalty) = royaltyStore
                .getExternalTokenPercentage(_tokenId, _tokenContractAddress);
            return
                customCommission + customRoyalty > 0
                    ? customCommission + customRoyalty
                    : externalSaleCommission.percentage;
        }
        uint256 digitalMediaId = getReleaseMedia(
            _tokenId,
            _tokenContractAddress
        );
        (address creator, bool collaborated, uint16 royalty) = getDigitalMedia(
            digitalMediaId,
            _tokenContractAddress
        );
        uint256 commissionPercentage;
        if (creator == _seller) {
            // if this media is a collaborated piece dont do payout on chain
            if (collaborated == true) {
                commissionPercentage = 0;
            } else {
                uint16 customPercentage = royaltyStore.getMediaCustomPercentage(
                    digitalMediaId,
                    _tokenContractAddress
                );
                commissionPercentage = customPercentage > 0
                    ? customPercentage
                    : saleCommission.percentage;
            }
        } else {
            // for secondary sales charge commission + royalty
            commissionPercentage = reSaleCommission.percentage + royalty;
        }
        return commissionPercentage;
    }

    /**
     * Creates a sale.  This end point is used by non-custodial accounts. We create
     * a record of sale. The token will stay with the owner but this contract has
     * approve / approveAll to move the token during purchase.
     */
    function createSale(
        uint256 _tokenId,
        address _tokenContractAddress,
        uint256 _priceInWei,
        bool _acceptFiat
    ) external whenNotPaused {
        address seller = validateTokenForEscrow(
            _tokenId,
            _tokenContractAddress
        );
        require(_priceInWei > 0, "price > 0");
        // We charge commission for this sale since the token owner / approve
        uint256 commissionPercentage = getCommissionPercentageForToken(
            seller,
            _tokenId,
            _tokenContractAddress
        );
        // is calling this function.
        DigitalMediaSale memory sale = DigitalMediaSale(
            _acceptFiat,
            seller,
            _priceInWei,
            commissionPercentage
        );
        tokenToSale[_tokenContractAddress][_tokenId] = sale;
        emit SaleCreatedEvent(
            _tokenId,
            _tokenContractAddress,
            _acceptFiat,
            _priceInWei
        );
    }

    /**
     * Onchain purchase an NFT.
     * Non custodial seller only. Custodial seller is done in DepositFund flow
     */
    function purchase(uint256 _tokenId, address _tokenContractAddress)
        external
        payable
        whenNotPaused
        nonReentrant
    {
        require(msg.value > 0, "msg.value");
        DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][
            _tokenId
        ];
        require(_isOnSale(sale), "no sale");
        address seller = sale.seller;
        uint256 price = sale.priceInWei;
        uint256 thisCommissionPercentage = sale.commissionPercentage;
        address tokenOwner = _ownerOf(_tokenId, _tokenContractAddress);
        require(seller == tokenOwner, "seller != tokOwner");
        require(
            _approvedForEscrow(
                seller,
                _tokenId,
                _tokenContractAddress,
                address(this)
            ),
            "salecontract not approved"
        );
        _purchase(_tokenId, _tokenContractAddress, sale, msg.value);
        _transferFromTo(seller, msg.sender, _tokenId, _tokenContractAddress);
        uint256 payoutAmount = 0;
        // if token belongs to MP and has commissionPercentage compute payout
        if (_isValidTokenContract(_tokenContractAddress) == true) {
            if (thisCommissionPercentage > 0) {
                payoutAmount = _computePayoutForPrice(
                    price,
                    thisCommissionPercentage
                );
            }
        } else {
            payoutAmount = _computePayoutForPrice(
                price,
                thisCommissionPercentage
            );
        }
        if (payoutAmount > 0) {
            transferFunds(seller, payoutAmount);
        }
        emit SaleSuccessfulEvent(
            _tokenId,
            _tokenContractAddress,
            msg.sender,
            seller,
            payoutAmount,
            price
        );
    }

    /**
     * Custodial purchase. NFT moves to safebox
     * While in safebox, it will be locked up in a wait period
     */
    function purchaseOBO(uint256 _tokenId, address _tokenContractAddress)
        external
        whenNotPaused
        isApprovedOBO
        nonReentrant
    {
        address seller = _ownerOf(_tokenId, _tokenContractAddress);
        DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][
            _tokenId
        ];
        require(
            _isOnSale(sale) && seller == sale.seller && sale.acceptFiat == true,
            "sale not valid"
        );
        require(
            _approvedForEscrow(
                seller,
                _tokenId,
                _tokenContractAddress,
                address(this)
            ),
            "sale not approved"
        );
        uint256 priceInWei = sale.priceInWei;
        _removeSale(_tokenId, _tokenContractAddress);
        _transferFromTo(
            seller,
            address(safebox),
            _tokenId,
            _tokenContractAddress
        );
        emit OBOSaleEvent(
            _tokenId,
            _tokenContractAddress,
            address(safebox),
            priceInWei
        );
    }

    /**
     * Cancels a token sale and delete the record of sale. Only token owner
     * can call this Fn.
     */
    function cancelSale(uint256 _tokenId, address _tokenContractAddress)
        external
    {
        DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][
            _tokenId
        ];
        require(_isOnSale(sale), "no sale");
        require(msg.sender == sale.seller, "caller is not token owner");
        _cancelSale(_tokenId, _tokenContractAddress);
    }

    /**
     * Looks up a token that's on sale.
     */
    function getSale(uint256 _tokenId, address _tokenContractAddress)
        external
        view
        returns (DigitalMediaSale memory)
    {
        DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][
            _tokenId
        ];
        require(_isOnSale(sale), "no sale");
        return sale;
    }

    /* Cancel many sales at once. Only ApprovedOBO can call this
     */
    function cancelSalesOBO(SaleRequest[] memory requests)
        external
        isApprovedOBO
    {
        for (uint32 i = 0; i < requests.length; i++) {
            SaleRequest memory request = requests[i];
            DigitalMediaSale storage sale = tokenToSale[request.tokenAddress][
                request.tokenId
            ];
            if (_isOnSale(sale) == true) {
                _cancelSale(request.tokenId, request.tokenAddress);
            }
        }
    }

    /**********************
     *       BIDDING       *
     **********************/

    /**
     * Function to put a bid on an approved ERC721 contract token. This function
     * stores only the current bid and the bid value in the contract. Any one can
     * bid on any token. Make sure you are bidding over the current bid price.
     */
    function bidOnToken(uint256 _tokenId, address _tokenContractAddress)
        external
        payable
        whenNotPaused
        nonReentrant
    {
        uint256 bidPrice = msg.value;
        require(bidPrice > 0, "send msg.value");
        IERC721 tokenContract = _getTokenContract(_tokenContractAddress);
        require(tokenContract.ownerOf(_tokenId) != address(0), "inv tokenId");
        // Check if the current bid id exists for tokenId
        uint256 currentBidId = tokenIdToBidId[_tokenContractAddress][_tokenId];
        if (currentBidId != 0) {
            TokenBid storage currentBid = bidIdToTokenBid[currentBidId];
            require(bidPrice > currentBid.price, "< current bid");
            address oldBidder = currentBid.bidder;
            uint256 oldBidPrice = currentBid.price;
            // After backing up the old bid delete them to save gas.
            delete tokenIdToBidId[_tokenContractAddress][_tokenId];
            delete bidIdToTokenBid[currentBidId];
            totalBidAmount = totalBidAmount - oldBidPrice;
            // Return the old bid to the old bidder or to buffer
            transferFunds(oldBidder, oldBidPrice);
        }
        uint256 bidId = _getNextBidId();
        bidIdToTokenBid[bidId] = TokenBid({
            bidder: msg.sender,
            price: bidPrice
        });
        tokenIdToBidId[_tokenContractAddress][_tokenId] = bidId;
        totalBidAmount = totalBidAmount + bidPrice;
        // msg.value is automatically transferred to the contract.
        // No need to explicity move the money
        // https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/
        emit TokenBidCreatedEvent(
            _tokenId,
            _tokenContractAddress,
            bidId,
            bidPrice,
            msg.sender
        );
    }

    /**
     * For a given approved ERC721 token, get the current bid
     */
    function getCurrentBidForToken(
        uint256 _tokenId,
        address _tokenContractAddress
    )
        external
        view
        returns (
            uint256 bidId,
            address bidder,
            uint256 price
        )
    {
        uint256 currentBidId = tokenIdToBidId[_tokenContractAddress][_tokenId];
        if (currentBidId == 0) {
            return (0, address(0), 0);
        } else {
            TokenBid storage currentBid = bidIdToTokenBid[currentBidId];
            return (currentBidId, currentBid.bidder, currentBid.price);
        }
    }

    /**
     * Cancel the current bid for an approved ERC721 token. Only the current bidder
     * or the approvedOBO can call this function. Cancelling the bid will move the
     * funds back to the bidder. A token can be on sale which means the owner will be
     * the sale contract. So we decided to make this approvedOBO call.
     */
    function cancelBid(
        uint256 _tokenId,
        address _tokenContractAddress,
        uint256 _bidId
    ) external nonReentrant {
        uint256 currentBidId = tokenIdToBidId[_tokenContractAddress][_tokenId];
        require(currentBidId != 0, "No bid");
        require(currentBidId == _bidId, "bidId not current");
        TokenBid storage currentBid = bidIdToTokenBid[currentBidId];
        require(
            currentBid.bidder == msg.sender ||
                isValidApprovedOBO(msg.sender) ||
                msg.sender == _ownerOf(_tokenId, _tokenContractAddress),
            "msg.sender not authorized"
        );
        bool isBidder = (currentBid.bidder == msg.sender);
        uint256 price = currentBid.price;
        address bidderAddress = currentBid.bidder;
        delete tokenIdToBidId[_tokenContractAddress][_tokenId];
        delete bidIdToTokenBid[currentBidId];
        totalBidAmount = totalBidAmount - price;
        transferFunds(bidderAddress, price);
        emit TokenBidRemovedEvent(
            _tokenId,
            _tokenContractAddress,
            currentBidId,
            isBidder
        );
    }

    function _getAndDeleteCurrentBid(
        uint256 _tokenId,
        address _tokenContractAddress,
        uint256 _bidId
    ) internal returns (address bidder, uint256 bidPrice) {
        uint256 currentBidId = tokenIdToBidId[_tokenContractAddress][_tokenId];
        require(currentBidId != 0, "No bid");
        require(currentBidId == _bidId, "bidId not current");
        TokenBid storage currentBid = bidIdToTokenBid[currentBidId];
        bidder = currentBid.bidder;
        bidPrice = currentBid.price;

        // Delete the bid to avoid re-entrancy attack
        delete tokenIdToBidId[_tokenContractAddress][_tokenId];
        delete bidIdToTokenBid[currentBidId];
        totalBidAmount = totalBidAmount - bidPrice;

        _cancelSaleIfSaleExists(_tokenId, _tokenContractAddress);
        return (bidder, bidPrice);
    }

    /**
     * Accept the current Bid on a approved ERC721 token. Only the token owner can call
     * this function. The token is immediately transferred to the buyer and payout is
     * performed.
     */
    function acceptBid(
        uint256 _tokenId,
        address _tokenContractAddress,
        uint256 _bidId
    ) external whenNotPaused nonReentrant {
        address seller = _ownerOf(_tokenId, _tokenContractAddress);
        require(msg.sender == seller, "msg.sender != seller");
        require(
            _approvedForEscrow(
                msg.sender,
                _tokenId,
                _tokenContractAddress,
                address(this)
            ),
            "approve/All missing"
        );
        (address currentBidder, uint256 bidPrice) = _getAndDeleteCurrentBid(
            _tokenId,
            _tokenContractAddress,
            _bidId
        );
        _transferFromTo(seller, currentBidder, _tokenId, _tokenContractAddress);
        uint256 thisCommissionPercentage = getCommissionPercentageForToken(
            seller,
            _tokenId,
            _tokenContractAddress
        );
        // Perform payout since seller is not a custodial account and can accept payment
        // This endpoint is called only by the tokenOwner. We decided if the token owner
        // took the pain to call this endpoint we will charge a commission based
        // on if its sold by creator or other.
        uint256 payoutAmount = 0;
        if (_isValidTokenContract(_tokenContractAddress) == true) {
            if (thisCommissionPercentage > 0) {
                payoutAmount = _computePayoutForPrice(
                    bidPrice,
                    thisCommissionPercentage
                );
            }
        } else {
            payoutAmount = _computePayoutForPrice(
                bidPrice,
                thisCommissionPercentage
            );
        }
        if (payoutAmount > 0) {
            transferFunds(seller, payoutAmount);
        }
        emit TokenBidAccepted({
            tokenId: _tokenId,
            tokenAddress: _tokenContractAddress,
            bidId: _bidId,
            bidPrice: bidPrice,
            bidder: currentBidder,
            payoutAddress: seller,
            seller: seller,
            payoutAmount: payoutAmount
        });
    }

    /**
     * Accept the current Bid on a approved ERC721 token. Only the master accounts with
     * isApprovedOBO permission can call this function. Pulls the NFT from SafeBox
     * and transfers to the bidder. No payout is performed in this contract. Its all offline.
     * Goes to safebox for a lockup period, until credit card is resolved.
     * Flow: alice safebox nft -> bob bids onchain -> alice accepts bid -> nights watch calls SaleCore.acceptBidOBO  -> pulls it from SafeBox -> NFT to Bob
     */
    function acceptBidsOBO(OBOAcceptBidStruct[] memory _requests)
        external
        whenNotPaused
        isApprovedOBO
        nonReentrant
    {
        for (uint256 i = 0; i < _requests.length; i++) {
            address tokenAddress = _requests[i].tokenAddress;
            uint256 tokenId = _requests[i].tokenId;
            uint256 bidId = _requests[i].bidId;
            bool useSafebox = _requests[i].useSafebox;
            address seller = _ownerOf(tokenId, tokenAddress);

            (address currentBidder, uint256 bidPrice) = _getAndDeleteCurrentBid(
                tokenId,
                tokenAddress,
                bidId
            );

            if (useSafebox) {
                safebox.singleTransfer(tokenAddress, tokenId, currentBidder);
            } else {
                vaultInterface.approveToken(tokenId, tokenAddress);
                _transferFromTo(seller, currentBidder, tokenId, tokenAddress);
            }

            emit TokenBidAccepted({
                tokenId: tokenId,
                tokenAddress: tokenAddress,
                bidId: bidId,
                bidPrice: bidPrice,
                bidder: currentBidder,
                payoutAddress: address(0),
                seller: seller,
                payoutAmount: 0
            });
        }
    }

    /*
     * An internal function to maintain a sequential identifier for bids
     */
    function _getNextBidId() private returns (uint256) {
        _bidCounter.increment();
        return _bidCounter.current();
    }

    // pause (idempotent)
    function pause() external onlyOwner {
        if (!paused()) {
            _pause();
        }
    }

    // unpause (idempotent)
    function unpause() external onlyOwner {
        if (paused()) {
            _unpause();
        }
    }

    function renounceOwnership() public view override onlyOwner {
        revert("no");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_royaltyRegistryAddress","type":"address"},{"internalType":"address","name":"_safebox","type":"address"},{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"InvalidTokenAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum CommissionControl.CommissionType","name":"commissionType","type":"uint8"},{"indexed":false,"internalType":"uint16","name":"percentage","type":"uint16"},{"indexed":false,"internalType":"bool","name":"committed","type":"bool"}],"name":"CommissionPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"OBOAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"action","type":"bool"}],"name":"NewOBOAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oboAdminAddress","type":"address"}],"name":"NewOBOAdminAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSafeBoxAddress","type":"address"}],"name":"NewSafeBoxInEffect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSafeBoxAddress","type":"address"}],"name":"NewSafeBoxRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVaultAddress","type":"address"}],"name":"NewVaultInEffect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVaultAddress","type":"address"}],"name":"NewVaultRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"OBOSaleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"}],"name":"SaleCanceledEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"acceptFiat","type":"bool"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"SaleCreatedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"payoutAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"SaleSuccessfulEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"address","name":"payoutAddress","type":"address"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"payoutAmount","type":"uint256"}],"name":"TokenBidAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"}],"name":"TokenBidCreatedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isBidder","type":"bool"}],"name":"TokenBidRemovedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"}],"name":"WithdrawAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"widthdrawAddress","type":"address"}],"name":"WithdrawAddressRemoved","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"uint256","name":"_bidId","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"bidId","type":"uint256"},{"internalType":"bool","name":"useSafebox","type":"bool"}],"internalType":"struct DigitalMediaSaleCore.OBOAcceptBidStruct[]","name":"_requests","type":"tuple[]"}],"name":"acceptBidsOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBOAfterDeploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"enum DigitalMediaSaleBase.ContractType","name":"_contractType","type":"uint8"}],"name":"addApprovedTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"addApprovedWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"addApprovedWithdrawAddressAfterDeploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedOBOs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTokenContracts","outputs":[{"internalType":"enum DigitalMediaSaleBase.ContractType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedWithdrawAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"bidOnToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"blockImmediateOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canAddOBOImmediately","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canRoyaltyRegistryChange","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"uint256","name":"_bidId","type":"uint256"}],"name":"cancelBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"cancelSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"acceptFiat","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"}],"internalType":"struct DigitalMediaSaleCore.SaleRequest[]","name":"requests","type":"tuple[]"}],"name":"cancelSalesOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_percentage","type":"uint16"},{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"changeCommissionPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commissionAddressWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"commitCommissionChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"uint256","name":"_priceInWei","type":"uint256"},{"internalType":"bool","name":"_acceptFiat","type":"bool"}],"name":"createSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"deleteCommissionChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"externalSaleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"getCurrentBidForToken","outputs":[{"internalType":"uint256","name":"bidId","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"getSale","outputs":[{"components":[{"internalType":"bool","name":"acceptFiat","type":"bool"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"priceInWei","type":"uint256"},{"internalType":"uint256","name":"commissionPercentage","type":"uint256"}],"internalType":"struct DigitalMediaFixedSale.DigitalMediaSale","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialWithdrawAddressAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"isValidApprovedOBO","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newAddressWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oboAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"paymentInterface","outputs":[{"internalType":"contract PaymentsBufferInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"purchaseOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reSaleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_safebox","type":"address"}],"name":"registerNewSafeBoxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"registerNewVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bufferAddress","type":"address"}],"name":"registerPaymentsBufferAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"removeApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"removeApprovedTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"removeApprovedWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentage","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyStore","outputs":[{"internalType":"contract RoyaltyRegistryInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safebox","outputs":[{"internalType":"contract SafeBoxInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAdmin","type":"address"}],"name":"setOBOAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newPercentage","type":"uint16"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRoyaltyRegistryForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyStore","type":"address"}],"name":"setRoyaltyRegistryStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_safebox","type":"address"}],"name":"setSafeboxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"setVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToSale","outputs":[{"internalType":"bool","name":"acceptFiat","type":"bool"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"priceInWei","type":"uint256"},{"internalType":"uint256","name":"commissionPercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBidAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultInterface","outputs":[{"internalType":"contract VaultCoreInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawApprovalWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_withdrawAddress","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6001805460ff60a01b1916600160a01b179055600380546203e80062ffff00199091161790556105dc6080819052600060a081905260c08190526005805463ffffffff199081169093179055600681905560fa60e081905261010082815261012083905260078054851690921790915560088290556101a060405261014082905261016082905261018082905260098054909316909255600a55600c805461ffff19169091179055348015620000b457600080fd5b5060405162004eeb38038062004eeb833981016040819052620000d7916200065c565b828282620000e53362000162565b6003805460ff19169055620000fa83620001b2565b62000105826200042d565b601480546001600160a01b0319166001600160a01b03929092169190911790556200013081620004ef565b601580546001600160a01b0319166001600160a01b03929092169190911790555050600160165550620007f792505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620001bc620005f5565b6000546001600160a01b0316331480620001e057506001546001600160a01b031633145b620002215760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b137a0b236b4b760a11b60448201526064015b60405180910390fd5b600c5460ff610100909104161515600114620002655760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b604482015260640162000218565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cf9190620006a6565b60ff16600114620003125760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b604482015260640162000218565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000353573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200037d919081019062000707565b6040516020016200038f9190620007bf565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b14620004095760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b604482015260640162000218565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000485573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007dd565b14620004e85760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b604482015260640162000218565b9392505050565b60006001600160a01b0382166200053d5760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b604482015260640162000218565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000594573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ba9190620007dd565b14620004e85760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b604482015260640162000218565b60035460ff16156200063d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000218565b565b80516001600160a01b03811681146200065757600080fd5b919050565b6000806000606084860312156200067257600080fd5b6200067d846200063f565b92506200068d602085016200063f565b91506200069d604085016200063f565b90509250925092565b600060208284031215620006b957600080fd5b815160ff81168114620004e857600080fd5b634e487b7160e01b600052604160045260246000fd5b60005b83811015620006fe578181015183820152602001620006e4565b50506000910152565b6000602082840312156200071a57600080fd5b81516001600160401b03808211156200073257600080fd5b818401915084601f8301126200074757600080fd5b8151818111156200075c576200075c620006cb565b604051601f8201601f19908116603f01168101908382118183101715620007875762000787620006cb565b81604052828152876020848701011115620007a157600080fd5b620007b4836020830160208801620006e1565b979650505050505050565b60008251620007d3818460208701620006e1565b9190910192915050565b600060208284031215620007f057600080fd5b5051919050565b6146e480620008076000396000f3fe6080604052600436106103a25760003560e01c80638da5cb5b116101e7578063c95ab4621161010d578063e6ccc9bd116100a0578063f5e00d761161006f578063f5e00d7614610bc2578063f9d83bb514610be2578063fb12a87614610bf5578063ffa1ad7414610c1557600080fd5b8063e6ccc9bd14610b2f578063ee7a116314610b4f578063f0346c4714610b65578063f2fde38b14610ba257600080fd5b8063d059e0a3116100dc578063d059e0a314610ad7578063d077fa5c14610aee578063d29b93a4146103a7578063d5edf45b14610b0e57600080fd5b8063c95ab46214610a4a578063ca3c80db14610a6a578063cd161d2e14610a8a578063ce2d29ac14610aaa57600080fd5b8063ab05868a11610185578063ae77c23711610154578063ae77c237146109cd578063af8ee37f146109e0578063b4cad1a714610a00578063be8380e014610a2a57600080fd5b8063ab05868a146108ef578063ab23e6fd14610973578063aba48a9314610993578063ae26c1b2146109b357600080fd5b8063a47a2e77116101c1578063a47a2e771461087a578063a4e644681461089a578063a790c0e2146108ba578063a968bf26146108cf57600080fd5b80638da5cb5b1461081257806396ac3649146108305780639f67dd091461085a57600080fd5b80635c975abb116102cc578063788e05431161026a5780638456cb59116102395780638456cb591461078a57806385535cc51461079f5780638a71bb2d146107bf5780638ce87646146107f257600080fd5b8063788e0543146106cc5780637ecb8b44146106ec5780637ff9f6141461074a578063813d2ad81461076a57600080fd5b80636684e9a0116102a65780636684e9a01461065757806368742da614610677578063715018a61461069757806371f4d38c146106ac57600080fd5b80635c975abb146105ff5780635e7785a6146106175780635ea829341461063757600080fd5b806322a2b1ed1161034457806342f176c71161031357806342f176c71461054d5780634564eb381461056d5780634f4385521461058d57806352ce28cf146105bc57600080fd5b806322a2b1ed146104955780633f4ba83a146104e05780633f8a7865146104f557806340bbee521461051557600080fd5b80631ad32562116103805780631ad32562146104135780631b0e3fab146104405780631bc8637e146104605780631fc097171461048057600080fd5b80630c999929146103a7578063188a840f146103d15780631a32de49146103f3575b600080fd5b3480156103b357600080fd5b506103be6201518081565b6040519081526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613db5565b610c3c565b005b3480156103ff57600080fd5b506103f161040e366004613db5565b610cc4565b34801561041f57600080fd5b506103be61042e366004613db5565b60026020526000908152604090205481565b34801561044c57600080fd5b506103f161045b366004613db5565b610d1f565b34801561046c57600080fd5b506103f161047b366004613de2565b610d91565b34801561048c57600080fd5b506103f1610e07565b3480156104a157600080fd5b50600954600a546104bf9161ffff8082169262010000909204169083565b6040805161ffff9485168152939092166020840152908201526060016103c8565b3480156104ec57600080fd5b506103f1610e24565b34801561050157600080fd5b506103f1610510366004613db5565b610e41565b34801561052157600080fd5b50601254610535906001600160a01b031681565b6040516001600160a01b0390911681526020016103c8565b34801561055957600080fd5b506103f1610568366004613dff565b610f4c565b34801561057957600080fd5b506103f1610588366004613ed1565b611104565b34801561059957600080fd5b50600c546105ac90610100900460ff1681565b60405190151581526020016103c8565b3480156105c857600080fd5b506105dc6105d7366004613dff565b611347565b604080519384526001600160a01b039092166020840152908201526060016103c8565b34801561060b57600080fd5b5060035460ff166105ac565b34801561062357600080fd5b506103f1610632366004613db5565b6113bb565b34801561064357600080fd5b50601554610535906001600160a01b031681565b34801561066357600080fd5b50601454610535906001600160a01b031681565b34801561068357600080fd5b506103f1610692366004613db5565b611600565b3480156106a357600080fd5b506103f16116cb565b3480156106b857600080fd5b506103f16106c7366004613fb3565b611700565b3480156106d857600080fd5b50601354610535906001600160a01b031681565b3480156106f857600080fd5b5061070c610707366004613dff565b61191a565b6040516103c891908151151581526020808301516001600160a01b031690820152604080830151908201526060918201519181019190915260800190565b34801561075657600080fd5b506103f1610765366004613db5565b6119c2565b34801561077657600080fd5b506103f1610785366004613dff565b611a53565b34801561079657600080fd5b506103f1611aff565b3480156107ab57600080fd5b506103f16107ba366004613db5565b611b19565b3480156107cb57600080fd5b506003546107df90610100900461ffff1681565b60405161ffff90911681526020016103c8565b3480156107fe57600080fd5b506103f161080d366004613db5565b611c34565b34801561081e57600080fd5b506000546001600160a01b0316610535565b34801561083c57600080fd5b506005546006546104bf9161ffff8082169262010000909204169083565b34801561086657600080fd5b506103f1610875366004613feb565b611c8a565b34801561088657600080fd5b506103f1610895366004613db5565b611d4e565b3480156108a657600080fd5b506103f16108b53660046140d1565b611dde565b3480156108c657600080fd5b506103f1611e10565b3480156108db57600080fd5b506103f16108ea3660046140ec565b611e5e565b3480156108fb57600080fd5b5061094961090a366004614121565b601160209081526000928352604080842090915290825290208054600182015460029092015460ff8216926101009092046001600160a01b0316919084565b6040805194151585526001600160a01b0390931660208501529183015260608201526080016103c8565b34801561097f57600080fd5b506103f161098e36600461414d565b611f88565b34801561099f57600080fd5b506103f16109ae366004614197565b6120dd565b3480156109bf57600080fd5b50600c546105ac9060ff1681565b6103f16109db366004613dff565b612123565b3480156109ec57600080fd5b506103f16109fb366004613fb3565b61235a565b348015610a0c57600080fd5b506007546008546104bf9161ffff8082169262010000909204169083565b348015610a3657600080fd5b506103f1610a453660046140d1565b6124c8565b348015610a5657600080fd5b50600154610535906001600160a01b031681565b348015610a7657600080fd5b506103f1610a85366004613db5565b6125e1565b348015610a9657600080fd5b506103f1610aa5366004613db5565b612645565b348015610ab657600080fd5b506103be610ac5366004613db5565b600b6020526000908152604090205481565b348015610ae357600080fd5b506103be6203f48081565b348015610afa57600080fd5b506103f1610b09366004613db5565b612773565b348015610b1a57600080fd5b506001546105ac90600160a01b900460ff1681565b348015610b3b57600080fd5b506103f1610b4a366004613db5565b61279c565b348015610b5b57600080fd5b506103be60105481565b348015610b7157600080fd5b50610b95610b80366004613db5565b60046020526000908152604090205460ff1681565b6040516103c891906141df565b348015610bae57600080fd5b506103f1610bbd366004613db5565b6127f0565b348015610bce57600080fd5b506103f1610bdd366004613db5565b612866565b6103f1610bf0366004613dff565b61298d565b348015610c0157600080fd5b506105ac610c10366004613db5565b612c5d565b348015610c2157600080fd5b50610c2a600381565b60405160ff90911681526020016103c8565b610c44612c9c565b600c5460ff1615610cab5760405162461bcd60e51b815260206004820152602660248201527f496e697469616c207769746864726177206164647265737320616c726561647960448201526508185919195960d21b60648201526084015b60405180910390fd5b610cb481612cf6565b50600c805460ff19166001179055565b610ccc612c9c565b6001600160a01b0381166000818152600b602090815260409182902042905590519182527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da8991015b60405180910390a150565b610d27612d72565b610d2f612c9c565b610d3881612db8565b600c805462010000600160b01b031916620100006001600160a01b039384160217905542600d5560405190821681527f492248daa73d7944dee204e5f0b712242e10c4e48e492e94f627767fb27bec9390602001610d14565b610d99612d72565b610da1612c9c565b610bb88161ffff161115610de95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420526f79616c747960881b6044820152606401610ca2565b6003805461ffff9092166101000262ffff0019909216919091179055565b610e0f612d72565b610e17612c9c565b600c805461ff0019169055565b610e2c612c9c565b60035460ff1615610e3f57610e3f612e75565b565b610e49612d72565b610e51612c9c565b600c546001600160a01b03828116620100009092041614610ead5760405162461bcd60e51b81526020600482015260166024820152750bee6c2cccac4def040427a40dccaeea6c2cccac4def60531b6044820152606401610ca2565b6202a300600d5442610ebf919061420f565b11610ef55760405162461bcd60e51b8152600401610ca2906020808252600490820152631dd85a5d60e21b604082015260600190565b610efe81612db8565b601480546001600160a01b0319166001600160a01b0392831617905560405190821681527f091f872b99a289ff2eb82d5c9d093e605a598fc74f7973277917f8d99842e97d90602001610d14565b610f54612d72565b610f5d33612c5d565b610f795760405162461bcd60e51b8152600401610ca290614222565b610f81612ec7565b6000610f8d8383612f20565b6001600160a01b03831660009081526011602090815260408083208784529091529020909150610fc08160010154151590565b8015610fdd575080546001600160a01b0383811661010090920416145b8015610fef5750805460ff1615156001145b61102c5760405162461bcd60e51b815260206004820152600e60248201526d1cd85b19481b9bdd081d985b1a5960921b6044820152606401610ca2565b61103882858530612f98565b6110785760405162461bcd60e51b81526020600482015260116024820152701cd85b19481b9bdd08185c1c1c9bdd9959607a1b6044820152606401610ca2565b600181015461108785856130ab565b6014546110a09084906001600160a01b031687876130e9565b601454604080518781526001600160a01b0387811660208301529092168282015260608201839052517f7657ffe1f72297f8773cec737634d73ad5d98a421b9f15dc99f3b792278d13969181900360800190a15050506111006001601655565b5050565b61110c612d72565b61111533612c5d565b6111315760405162461bcd60e51b8152600401610ca290614222565b611139612ec7565b60005b815181101561133957600082828151811061115957611159614251565b6020026020010151600001519050600083838151811061117b5761117b614251565b6020026020010151602001519050600084848151811061119d5761119d614251565b602002602001015160400151905060008585815181106111bf576111bf614251565b602002602001015160600151905060006111d98486612f20565b90506000806111e9868887613161565b91509150831561126657601454604051630608be6d60e11b81526001600160a01b03898116600483015260248201899052848116604483015290911690630c117cda90606401600060405180830381600087803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506112d8565b60155460405163d2180e6160e01b8152600481018890526001600160a01b0389811660248301529091169063d2180e6190604401600060405180830381600087803b1580156112b457600080fd5b505af11580156112c8573d6000803e3d6000fd5b505050506112d88383888a6130e9565b7f1f742344121ee39367760387f62d61b3b3490773d72cd37a18fc135d27babfda86888784866000896000604051611317989796959493929190614267565b60405180910390a1505050505050508080611331906142ad565b91505061113c565b506113446001601655565b50565b6001600160a01b038116600090815260186020908152604080832085845290915281205481908190808203611387576000806000935093509350506113b4565b600081815260196020526040902080546001909101549194506001600160a01b0316925090506113b4565b505b9250925092565b6113c3612d72565b6000546001600160a01b03163314806113e657506001546001600160a01b031633145b6114025760405162461bcd60e51b8152600401610ca2906142c6565b600c5460ff6101009091041615156001146114445760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ca2565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ab91906142ec565b60ff166001146114ec5760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610ca2565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115549190810190614397565b60405160200161156491906143cc565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146115dc5760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610ca2565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b61160933612c5d565b6116255760405162461bcd60e51b8152600401610ca290614222565b61162e81613280565b61167a5760405162461bcd60e51b815260206004820152601a60248201527f756e617070726f766564207769746864726177416464726573730000000000006044820152606401610ca2565b601054479060009061168c908361420f565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f193505050501580156116c5573d6000803e3d6000fd5b50505050565b6116d3612c9c565b60405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ca2565b611708612ec7565b6001600160a01b0382166000908152601860209081526040808320868452909152812054908190036117655760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610ca2565b8181146117a85760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610ca2565b600081815260196020526040902080546001600160a01b03163314806117d257506117d233612c5d565b806117f757506117e28585612f20565b6001600160a01b0316336001600160a01b0316145b6118435760405162461bcd60e51b815260206004820152601960248201527f6d73672e73656e646572206e6f7420617574686f72697a6564000000000000006044820152606401610ca2565b80546001808301546001600160a01b0387811660009081526018602090815260408083208c845282528083208390558883526019909152812080546001600160a01b03191681559093019290925560105492909116338114926118a790839061420f565b6010556118b481836132f1565b604080518981526001600160a01b038916602082015290810186905283151560608201527ff6b89ca1bccc679695ae3b928ee8c9335ecdfd739853cfe9e209a13e40cfacc0906080015b60405180910390a150505050506119156001601655565b505050565b6040805160808101825260008082526020808301829052828401829052606083018290526001600160a01b038516825260118152838220868352905291909120600181015461197b5760405162461bcd60e51b8152600401610ca2906143e8565b60408051608081018252825460ff81161515825261010090046001600160a01b03166020820152600183015491810191909152600290910154606082015290505b92915050565b6000546001600160a01b03163314806119e557506001546001600160a01b031633145b611a015760405162461bcd60e51b8152600401610ca2906142c6565b6001600160a01b03811660008181526002602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b6001600160a01b038116600090815260116020908152604080832085845290915290206001810154611a975760405162461bcd60e51b8152600401610ca2906143e8565b805461010090046001600160a01b03163314611af55760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f7420746f6b656e206f776e6572000000000000006044820152606401610ca2565b611915838361340f565b611b07612c9c565b60035460ff16610e3f57610e3f613457565b611b21612c9c565b6000611b2c82613494565b6015549091506001600160a01b031615611bda57600e546001600160a01b03838116911614611b925760405162461bcd60e51b815260206004820152601260248201527117dd985d5b1d08084f481b995dd5985d5b1d60721b6044820152606401610ca2565b6202a300600f5442611ba4919061420f565b11611bda5760405162461bcd60e51b8152600401610ca2906020808252600490820152631dd85a5d60e21b604082015260600190565b601580546001600160a01b0319166001600160a01b038381169190911790915560405190831681527f55c500d9f010bcb210d8664f602eb160ce8aee716a68ea710302305830e45233906020015b60405180910390a15050565b611c3c612c9c565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001610d14565b611c9333612c5d565b611caf5760405162461bcd60e51b8152600401610ca290614222565b60005b81518163ffffffff161015611100576000828263ffffffff1681518110611cdb57611cdb614251565b60209081029190910181015160608101516001600160a01b031660009081526011835260408082208351835290935291909120909150611d1e8160010154151590565b1515600103611d3957611d398260000151836060015161340f565b50508080611d4690614409565b915050611cb2565b6000546001600160a01b0316331480611d7157506001546001600160a01b031633145b611d8d5760405162461bcd60e51b8152600401610ca2906142c6565b60018054600160a01b900460ff16151514611dd55760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610ca2565b61134481613593565b611de6612d72565b611dee612c9c565b6000611df982613642565b805463ffff00001916815560006001909101555050565b6000546001600160a01b0316331480611e3357506001546001600160a01b031633145b611e4f5760405162461bcd60e51b8152600401610ca2906142c6565b6001805460ff60a01b19169055565b611e66612d72565b611e6e612c9c565b60008261ffff16118015611e8857506127108261ffff1611155b611ec95760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642070657263656e7461676560701b6044820152606401610ca2565b6000611ed482613642565b805490915062010000900461ffff1615611f2a5760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610ca2565b805463ffff000019166201000061ffff8516021781554260018201556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe590611f7b908490869060009061442c565b60405180910390a1505050565b611f90612d72565b6000611f9c8585613690565b905060008311611fda5760405162461bcd60e51b815260206004820152600960248201526807072696365203e20360bc1b6044820152606401610ca2565b6000611fe782878761373c565b6040805160808101825285151581526001600160a01b0380861660208084019182528385018a8152606085018781528c85166000908152601184528781208f82529093529186902085518154945190951661010002610100600160a81b0319951515959095166001600160a81b0319909416939093179390931782559151600182015590516002909101559051919250907f6852391c228e56409f2046f8f5b68af9ab60392697a47efa0910cf05cfbcae42906120cc908990899088908a909384526001600160a01b0392909216602084015215156040830152606082015260800190565b60405180910390a150505050505050565b6120e5612c9c565b6001600160a01b0382166000908152600460205260409020805482919060ff1916600183600281111561211a5761211a6141c9565b02179055505050565b61212b612d72565b612133612ec7565b6000341161216f5760405162461bcd60e51b81526020600482015260096024820152686d73672e76616c756560b81b6044820152606401610ca2565b6001600160a01b0381166000908152601160209081526040808320858452909152902060018101546121b35760405162461bcd60e51b8152600401610ca2906143e8565b8054600182015460028301546101009092046001600160a01b03169160006121db8787612f20565b9050806001600160a01b0316846001600160a01b0316146122335760405162461bcd60e51b815260206004820152601260248201527139b2b63632b910109e903a37b5a7bbb732b960711b6044820152606401610ca2565b61223f84888830612f98565b61228b5760405162461bcd60e51b815260206004820152601960248201527f73616c65636f6e7472616374206e6f7420617070726f766564000000000000006044820152606401610ca2565b61229787878734613918565b506122a4843389896130e9565b60006122af8761397c565b15156001036122d05782156122cb576122c884846139b4565b90505b6122dd565b6122da84846139b4565b90505b80156122ed576122ed85826132f1565b604080518981526001600160a01b0389811660208301523382840152871660608201526080810183905260a0810186905290517f60364304ae1fda694c3be5cac0f507f6fcd2144b5d26870e8a26f7ac17df83bf9181900360c00190a15050505050506111006001601655565b612362612d72565b61236a612ec7565b60006123768484612f20565b9050336001600160a01b038216146123c75760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610ca2565b6123d333858530612f98565b6124155760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610ca2565b600080612423868686613161565b91509150612433838388886130e9565b600061244084888861373c565b9050600061244d8761397c565b151560010361246e5781156124695761246683836139b4565b90505b61247b565b61247883836139b4565b90505b801561248b5761248b85826132f1565b7f1f742344121ee39367760387f62d61b3b3490773d72cd37a18fc135d27babfda88888886888a8b886040516118fe989796959493929190614267565b6124d0612d72565b6124d8612c9c565b60006124e382613642565b805490915062010000900461ffff166125385760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610ca2565b6203f48081600101544261254c919061420f565b1161258d5760405162461bcd60e51b81526020600482015260116024820152701d5b99195c881dd85a5d081c195c9a5bd9607a1b6044820152606401610ca2565b805462010000810461ffff1663ffffffff199091168117825560006001808401919091556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe592611c2892869261442c565b6125e9612c9c565b6125f281613494565b50600e80546001600160a01b0319166001600160a01b03831690811790915542600f556040519081527f66ea39118110b77bdc70c8b8c6c494af2a13414c01a51c05678c67e53c70418990602001610d14565b6000546001600160a01b031633148061266857506001546001600160a01b031633145b6126845760405162461bcd60e51b8152600401610ca2906142c6565b6001600160a01b0381166126cb5760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610ca2565b6001600160a01b038116600090815260026020526040902054156127215760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610ca2565b6001600160a01b03811660008181526002602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b61277b612c9c565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6127a4612c9c565b6001600160a01b0381166000818152600b602090815260408083209290925590519182527fffdbac6a703f8c063588b1b434bac15231b40f4c20b16f797a989d47a56ae8b29101610d14565b6127f8612c9c565b6001600160a01b03811661285d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca2565b611344816139d7565b61286e612c9c565b6012546001600160a01b0316156128b55760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610ca2565b6000819050806001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291c919061445a565b6f36b83830bcb6b2b73a39b13ab33332b960811b1461296a5760405162461bcd60e51b815260206004820152600a6024820152693737ba10313ab33332b960b11b6044820152606401610ca2565b601280546001600160a01b0319166001600160a01b039290921691909117905550565b612995612d72565b61299d612ec7565b34806129dc5760405162461bcd60e51b815260206004820152600e60248201526d73656e64206d73672e76616c756560901b6044820152606401610ca2565b6000826040516331a9108f60e11b8152600481018690529091506000906001600160a01b03831690636352211e90602401602060405180830381865afa158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190614473565b6001600160a01b031603612a925760405162461bcd60e51b815260206004820152600b60248201526a1a5b9d881d1bdad95b925960aa1b6044820152606401610ca2565b6001600160a01b03831660009081526018602090815260408083208784529091529020548015612b8057600081815260196020526040902060018101548411612b0d5760405162461bcd60e51b815260206004820152600d60248201526c0f0818dd5c9c995b9d08189a59609a1b6044820152606401610ca2565b80546001808301546001600160a01b0388811660009081526018602090815260408083208d845282528083208390558883526019909152812080546001600160a01b031916815590930192909255601054919092169190612b6f90829061420f565b601055612b7c82826132f1565b5050505b6000612b8a613a27565b6040805180820182523381526020808201888152600085815260198352848120935184546001600160a01b0319166001600160a01b03918216178555915160019094019390935589168252601881528282208a8352905220819055601054909150612bf6908590614490565b601055604080518781526001600160a01b0387166020820152908101829052606081018590523360808201527f9525a453a215f02f1c5afee7ab8628c140dfa606cd034605e34b8850f2f6ef209060a00160405180910390a1505050506111006001601655565b6001600160a01b038116600090815260026020526040812054808203612c865750600092915050565b62015180612c94824261420f565b119392505050565b6000546001600160a01b03163314610e3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b612cfe612c9c565b6001600160a01b03811615611344576001612d1c620151804261420f565b612d26919061420f565b6001600160a01b0382166000818152600b602090815260409182902093909355519081527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da899101610d14565b60035460ff1615610e3f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ca2565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e33919061445a565b14612e6e5760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b6044820152606401610ca2565b9392505050565b612e7d613a3e565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260165403612f195760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca2565b6002601655565b600080826040516331a9108f60e11b8152600481018690529091506001600160a01b03821690636352211e90602401602060405180830381865afa158015612f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f909190614473565b949350505050565b6000826001600160a01b038681169084161480613022575060405163e985e9c560e01b81526001600160a01b038781166004830152848116602483015282169063e985e9c590604401602060405180830381865afa158015612ffe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302291906144a3565b806130a1575060405163020604bf60e21b8152600481018690526001600160a01b03808516919083169063081812fc90602401602060405180830381865afa158015613072573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130969190614473565b6001600160a01b0316145b9695505050505050565b6001600160a01b0316600090815260116020908152604080832093835292905290812080546001600160a81b03191681556001810182905560020155565b600081604051632142170760e11b81526001600160a01b038781166004830152868116602483015260448201869052919250908216906342842e0e90606401600060405180830381600087803b15801561314257600080fd5b505af1158015613156573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038216600090815260186020908152604080832086845290915281205481908082036131bf5760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610ca2565b8381146132025760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610ca2565b600081815260196020818152604080842080546001820180546001600160a01b038d81168952601887528589208f8a5287529488208890558888529590945281546001600160a01b031916825594909255601054931695509093509061326990849061420f565b6010556132768787613a87565b5050935093915050565b6001600160a01b0381166000908152600b602052604081205480612c865760405162461bcd60e51b815260206004820152602260248201527f77697468647261772061646472657373206973206e6f74207265676973746572604482015261195960f21b6064820152608401610ca2565b6000826001600160a01b03168261138890604051600060405180830381858888f193505050503d8060008114613343576040519150601f19603f3d011682016040523d82523d6000602084013e613348565b606091505b5050905080611915576012546001600160a01b03166133a95760405162461bcd60e51b815260206004820152601e60248201527f7061796d656e74496e746572666163652073686f756c642062652073657400006044820152606401610ca2565b601254604051630a3b0a4f60e01b81526001600160a01b03858116600483015290911690630a3b0a4f9084906024016000604051808303818588803b1580156133f157600080fd5b505af1158015613405573d6000803e3d6000fd5b5050505050505050565b61341982826130ab565b604080518381526001600160a01b03831660208201527fa50b2d6faf84e88de164f615bc8daa8477ab67f677d72aef3a3122d26c6eae289101611c28565b61345f612d72565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612eaa3390565b60006001600160a01b0382166134e05760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b6044820152606401610ca2565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015613536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355a919061445a565b14612e6e5760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b6044820152606401610ca2565b6001600160a01b0381166135d35760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610ca2565b60016135e2620151804261420f565b6135ec919061420f565b6001600160a01b0382166000818152600260209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b6000806001836003811115613659576136596141c9565b03613666575060056119bc565b600283600381111561367a5761367a6141c9565b03613687575060076119bc565b50600992915050565b60008061369d8484612f20565b9050336001600160a01b038216146136ee5760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610ca2565b6136fa33858530612f98565b612e6e5760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610ca2565b60006137478261397c565b1515600003613805576013546040516305fa22e960e11b8152600481018590526001600160a01b0384811660248301526000928392911690630bf445d2906044016040805180830381865afa1580156137a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c891906144c0565b909250905060006137d982846144ef565b61ffff16116137ee5760095461ffff166137f8565b6137f881836144ef565b61ffff1692505050612e6e565b60006138118484613abe565b905060008060006138228487613c21565b9250925092506000886001600160a01b0316846001600160a01b0316036138f3578215156001036138555750600061390c565b6013546040516310cae44560e31b8152600481018790526001600160a01b0389811660248301526000921690638657222890604401602060405180830381865afa1580156138a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cb919061450a565b905060008161ffff16116138e55760055461ffff166138e7565b805b61ffff1691505061390c565b60075461390590839061ffff166144ef565b61ffff1690505b98975050505050505050565b60018201546000908083101561395a5760405162461bcd60e51b81526020600482015260076024820152663c20707269636560c81b6044820152606401610ca2565b61396486866130ab565b6000613970828561420f565b90505095945050505050565b6000806001600160a01b03831660009081526004602052604090205460ff1660028111156139ac576139ac6141c9565b141592915050565b60006127106139c3838261420f565b6139cd9085614527565b612e6e9190614546565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000613a37601780546001019055565b5060175490565b60035460ff16610e3f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ca2565b6001600160a01b0381166000908152601160209081526040808320858452909152902060018101541561191557611915838361340f565b6001600160a01b03811660009081526004602052604081205460ff166001816002811115613aee57613aee6141c9565b03613b6957604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf90602401606060405180830381865afa158015613b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5e919061457c565b9450613c1a92505050565b6002816002811115613b7d57613b7d6141c9565b03613bf657604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf906024016040805180830381865afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec91906145b1565b9350613c1a915050565b604051637330680360e01b81526001600160a01b0384166004820152602401610ca2565b5092915050565b6001600160a01b0381166000908152600460205260408120548190819060ff166001816002811115613c5557613c556141c9565b03613cea576040516355df427560e01b81526004810187905285906001600160a01b038216906355df427590602401600060405180830381865afa158015613ca1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cc991908101906145dd565b5060035490995060009850610100900461ffff1696506113b2945050505050565b6002816002811115613cfe57613cfe6141c9565b03613d7c57604051631e330caf60e21b81526004810187905285906001600160a01b038216906378cc32bc90602401606060405180830381865afa158015613d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6e9190614661565b919650945092506113b29050565b604051637330680360e01b81526001600160a01b0386166004820152602401610ca2565b6001600160a01b038116811461134457600080fd5b600060208284031215613dc757600080fd5b8135612e6e81613da0565b61ffff8116811461134457600080fd5b600060208284031215613df457600080fd5b8135612e6e81613dd2565b60008060408385031215613e1257600080fd5b823591506020830135613e2481613da0565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613e6857613e68613e2f565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613e9757613e97613e2f565b604052919050565b600067ffffffffffffffff821115613eb957613eb9613e2f565b5060051b60200190565b801515811461134457600080fd5b60006020808385031215613ee457600080fd5b823567ffffffffffffffff811115613efb57600080fd5b8301601f81018513613f0c57600080fd5b8035613f1f613f1a82613e9f565b613e6e565b81815260079190911b82018301908381019087831115613f3e57600080fd5b928401925b82841015613fa85760808489031215613f5c5760008081fd5b613f64613e45565b8435613f6f81613da0565b8152848601358682015260408086013590820152606080860135613f9281613ec3565b9082015282526080939093019290840190613f43565b979650505050505050565b600080600060608486031215613fc857600080fd5b833592506020840135613fda81613da0565b929592945050506040919091013590565b60006020808385031215613ffe57600080fd5b823567ffffffffffffffff81111561401557600080fd5b8301601f8101851361402657600080fd5b8035614034613f1a82613e9f565b81815260079190911b8201830190838101908783111561405357600080fd5b928401925b82841015613fa857608084890312156140715760008081fd5b614079613e45565b84358152858501358682015260408086013561409481613ec3565b908201526060858101356140a781613da0565b9082015282526080939093019290840190614058565b8035600481106140cc57600080fd5b919050565b6000602082840312156140e357600080fd5b612e6e826140bd565b600080604083850312156140ff57600080fd5b823561410a81613dd2565b9150614118602084016140bd565b90509250929050565b6000806040838503121561413457600080fd5b823561413f81613da0565b946020939093013593505050565b6000806000806080858703121561416357600080fd5b84359350602085013561417581613da0565b925060408501359150606085013561418c81613ec3565b939692955090935050565b600080604083850312156141aa57600080fd5b82356141b581613da0565b9150602083013560038110613e2457600080fd5b634e487b7160e01b600052602160045260246000fd5b60208101600383106141f3576141f36141c9565b91905290565b634e487b7160e01b600052601160045260246000fd5b818103818111156119bc576119bc6141f9565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b9788526001600160a01b039687166020890152604088019590955260608701939093529084166080860152831660a085015290911660c083015260e08201526101000190565b6000600182016142bf576142bf6141f9565b5060010190565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b6000602082840312156142fe57600080fd5b815160ff81168114612e6e57600080fd5b60005b8381101561432a578181015183820152602001614312565b50506000910152565b600082601f83011261434457600080fd5b815167ffffffffffffffff81111561435e5761435e613e2f565b614371601f8201601f1916602001613e6e565b81815284602083860101111561438657600080fd5b612f9082602083016020870161430f565b6000602082840312156143a957600080fd5b815167ffffffffffffffff8111156143c057600080fd5b612f9084828501614333565b600082516143de81846020870161430f565b9190910192915050565b6020808252600790820152666e6f2073616c6560c81b604082015260600190565b600063ffffffff808316818103614422576144226141f9565b6001019392505050565b6060810160048510614440576144406141c9565b93815261ffff929092166020830152151560409091015290565b60006020828403121561446c57600080fd5b5051919050565b60006020828403121561448557600080fd5b8151612e6e81613da0565b808201808211156119bc576119bc6141f9565b6000602082840312156144b557600080fd5b8151612e6e81613ec3565b600080604083850312156144d357600080fd5b82516144de81613dd2565b6020840151909250613e2481613dd2565b61ffff818116838216019080821115613c1a57613c1a6141f9565b60006020828403121561451c57600080fd5b8151612e6e81613dd2565b6000816000190483118215151615614541576145416141f9565b500290565b60008261456357634e487b7160e01b600052601260045260246000fd5b500490565b805163ffffffff811681146140cc57600080fd5b60008060006060848603121561459157600080fd5b835192506145a160208501614568565b9150604084015190509250925092565b600080604083850312156145c457600080fd5b6145cd83614568565b9150602083015190509250929050565b60008060008060008060c087890312156145f657600080fd5b8651955061460660208801614568565b945061461460408801614568565b935060608701519250608087015161462b81613da0565b60a088015190925067ffffffffffffffff81111561464857600080fd5b61465489828a01614333565b9150509295509295509295565b60008060006060848603121561467657600080fd5b835161468181613da0565b602085015190935061469281613ec3565b60408501519092506146a381613dd2565b80915050925092509256fea2646970667358221220d7c38cbad5ad17b49ea6948f1562d9edb92c34b863a5a6774ff9592c3b4a106664736f6c63430008100033000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64

Deployed Bytecode

0x6080604052600436106103a25760003560e01c80638da5cb5b116101e7578063c95ab4621161010d578063e6ccc9bd116100a0578063f5e00d761161006f578063f5e00d7614610bc2578063f9d83bb514610be2578063fb12a87614610bf5578063ffa1ad7414610c1557600080fd5b8063e6ccc9bd14610b2f578063ee7a116314610b4f578063f0346c4714610b65578063f2fde38b14610ba257600080fd5b8063d059e0a3116100dc578063d059e0a314610ad7578063d077fa5c14610aee578063d29b93a4146103a7578063d5edf45b14610b0e57600080fd5b8063c95ab46214610a4a578063ca3c80db14610a6a578063cd161d2e14610a8a578063ce2d29ac14610aaa57600080fd5b8063ab05868a11610185578063ae77c23711610154578063ae77c237146109cd578063af8ee37f146109e0578063b4cad1a714610a00578063be8380e014610a2a57600080fd5b8063ab05868a146108ef578063ab23e6fd14610973578063aba48a9314610993578063ae26c1b2146109b357600080fd5b8063a47a2e77116101c1578063a47a2e771461087a578063a4e644681461089a578063a790c0e2146108ba578063a968bf26146108cf57600080fd5b80638da5cb5b1461081257806396ac3649146108305780639f67dd091461085a57600080fd5b80635c975abb116102cc578063788e05431161026a5780638456cb59116102395780638456cb591461078a57806385535cc51461079f5780638a71bb2d146107bf5780638ce87646146107f257600080fd5b8063788e0543146106cc5780637ecb8b44146106ec5780637ff9f6141461074a578063813d2ad81461076a57600080fd5b80636684e9a0116102a65780636684e9a01461065757806368742da614610677578063715018a61461069757806371f4d38c146106ac57600080fd5b80635c975abb146105ff5780635e7785a6146106175780635ea829341461063757600080fd5b806322a2b1ed1161034457806342f176c71161031357806342f176c71461054d5780634564eb381461056d5780634f4385521461058d57806352ce28cf146105bc57600080fd5b806322a2b1ed146104955780633f4ba83a146104e05780633f8a7865146104f557806340bbee521461051557600080fd5b80631ad32562116103805780631ad32562146104135780631b0e3fab146104405780631bc8637e146104605780631fc097171461048057600080fd5b80630c999929146103a7578063188a840f146103d15780631a32de49146103f3575b600080fd5b3480156103b357600080fd5b506103be6201518081565b6040519081526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613db5565b610c3c565b005b3480156103ff57600080fd5b506103f161040e366004613db5565b610cc4565b34801561041f57600080fd5b506103be61042e366004613db5565b60026020526000908152604090205481565b34801561044c57600080fd5b506103f161045b366004613db5565b610d1f565b34801561046c57600080fd5b506103f161047b366004613de2565b610d91565b34801561048c57600080fd5b506103f1610e07565b3480156104a157600080fd5b50600954600a546104bf9161ffff8082169262010000909204169083565b6040805161ffff9485168152939092166020840152908201526060016103c8565b3480156104ec57600080fd5b506103f1610e24565b34801561050157600080fd5b506103f1610510366004613db5565b610e41565b34801561052157600080fd5b50601254610535906001600160a01b031681565b6040516001600160a01b0390911681526020016103c8565b34801561055957600080fd5b506103f1610568366004613dff565b610f4c565b34801561057957600080fd5b506103f1610588366004613ed1565b611104565b34801561059957600080fd5b50600c546105ac90610100900460ff1681565b60405190151581526020016103c8565b3480156105c857600080fd5b506105dc6105d7366004613dff565b611347565b604080519384526001600160a01b039092166020840152908201526060016103c8565b34801561060b57600080fd5b5060035460ff166105ac565b34801561062357600080fd5b506103f1610632366004613db5565b6113bb565b34801561064357600080fd5b50601554610535906001600160a01b031681565b34801561066357600080fd5b50601454610535906001600160a01b031681565b34801561068357600080fd5b506103f1610692366004613db5565b611600565b3480156106a357600080fd5b506103f16116cb565b3480156106b857600080fd5b506103f16106c7366004613fb3565b611700565b3480156106d857600080fd5b50601354610535906001600160a01b031681565b3480156106f857600080fd5b5061070c610707366004613dff565b61191a565b6040516103c891908151151581526020808301516001600160a01b031690820152604080830151908201526060918201519181019190915260800190565b34801561075657600080fd5b506103f1610765366004613db5565b6119c2565b34801561077657600080fd5b506103f1610785366004613dff565b611a53565b34801561079657600080fd5b506103f1611aff565b3480156107ab57600080fd5b506103f16107ba366004613db5565b611b19565b3480156107cb57600080fd5b506003546107df90610100900461ffff1681565b60405161ffff90911681526020016103c8565b3480156107fe57600080fd5b506103f161080d366004613db5565b611c34565b34801561081e57600080fd5b506000546001600160a01b0316610535565b34801561083c57600080fd5b506005546006546104bf9161ffff8082169262010000909204169083565b34801561086657600080fd5b506103f1610875366004613feb565b611c8a565b34801561088657600080fd5b506103f1610895366004613db5565b611d4e565b3480156108a657600080fd5b506103f16108b53660046140d1565b611dde565b3480156108c657600080fd5b506103f1611e10565b3480156108db57600080fd5b506103f16108ea3660046140ec565b611e5e565b3480156108fb57600080fd5b5061094961090a366004614121565b601160209081526000928352604080842090915290825290208054600182015460029092015460ff8216926101009092046001600160a01b0316919084565b6040805194151585526001600160a01b0390931660208501529183015260608201526080016103c8565b34801561097f57600080fd5b506103f161098e36600461414d565b611f88565b34801561099f57600080fd5b506103f16109ae366004614197565b6120dd565b3480156109bf57600080fd5b50600c546105ac9060ff1681565b6103f16109db366004613dff565b612123565b3480156109ec57600080fd5b506103f16109fb366004613fb3565b61235a565b348015610a0c57600080fd5b506007546008546104bf9161ffff8082169262010000909204169083565b348015610a3657600080fd5b506103f1610a453660046140d1565b6124c8565b348015610a5657600080fd5b50600154610535906001600160a01b031681565b348015610a7657600080fd5b506103f1610a85366004613db5565b6125e1565b348015610a9657600080fd5b506103f1610aa5366004613db5565b612645565b348015610ab657600080fd5b506103be610ac5366004613db5565b600b6020526000908152604090205481565b348015610ae357600080fd5b506103be6203f48081565b348015610afa57600080fd5b506103f1610b09366004613db5565b612773565b348015610b1a57600080fd5b506001546105ac90600160a01b900460ff1681565b348015610b3b57600080fd5b506103f1610b4a366004613db5565b61279c565b348015610b5b57600080fd5b506103be60105481565b348015610b7157600080fd5b50610b95610b80366004613db5565b60046020526000908152604090205460ff1681565b6040516103c891906141df565b348015610bae57600080fd5b506103f1610bbd366004613db5565b6127f0565b348015610bce57600080fd5b506103f1610bdd366004613db5565b612866565b6103f1610bf0366004613dff565b61298d565b348015610c0157600080fd5b506105ac610c10366004613db5565b612c5d565b348015610c2157600080fd5b50610c2a600381565b60405160ff90911681526020016103c8565b610c44612c9c565b600c5460ff1615610cab5760405162461bcd60e51b815260206004820152602660248201527f496e697469616c207769746864726177206164647265737320616c726561647960448201526508185919195960d21b60648201526084015b60405180910390fd5b610cb481612cf6565b50600c805460ff19166001179055565b610ccc612c9c565b6001600160a01b0381166000818152600b602090815260409182902042905590519182527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da8991015b60405180910390a150565b610d27612d72565b610d2f612c9c565b610d3881612db8565b600c805462010000600160b01b031916620100006001600160a01b039384160217905542600d5560405190821681527f492248daa73d7944dee204e5f0b712242e10c4e48e492e94f627767fb27bec9390602001610d14565b610d99612d72565b610da1612c9c565b610bb88161ffff161115610de95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420526f79616c747960881b6044820152606401610ca2565b6003805461ffff9092166101000262ffff0019909216919091179055565b610e0f612d72565b610e17612c9c565b600c805461ff0019169055565b610e2c612c9c565b60035460ff1615610e3f57610e3f612e75565b565b610e49612d72565b610e51612c9c565b600c546001600160a01b03828116620100009092041614610ead5760405162461bcd60e51b81526020600482015260166024820152750bee6c2cccac4def040427a40dccaeea6c2cccac4def60531b6044820152606401610ca2565b6202a300600d5442610ebf919061420f565b11610ef55760405162461bcd60e51b8152600401610ca2906020808252600490820152631dd85a5d60e21b604082015260600190565b610efe81612db8565b601480546001600160a01b0319166001600160a01b0392831617905560405190821681527f091f872b99a289ff2eb82d5c9d093e605a598fc74f7973277917f8d99842e97d90602001610d14565b610f54612d72565b610f5d33612c5d565b610f795760405162461bcd60e51b8152600401610ca290614222565b610f81612ec7565b6000610f8d8383612f20565b6001600160a01b03831660009081526011602090815260408083208784529091529020909150610fc08160010154151590565b8015610fdd575080546001600160a01b0383811661010090920416145b8015610fef5750805460ff1615156001145b61102c5760405162461bcd60e51b815260206004820152600e60248201526d1cd85b19481b9bdd081d985b1a5960921b6044820152606401610ca2565b61103882858530612f98565b6110785760405162461bcd60e51b81526020600482015260116024820152701cd85b19481b9bdd08185c1c1c9bdd9959607a1b6044820152606401610ca2565b600181015461108785856130ab565b6014546110a09084906001600160a01b031687876130e9565b601454604080518781526001600160a01b0387811660208301529092168282015260608201839052517f7657ffe1f72297f8773cec737634d73ad5d98a421b9f15dc99f3b792278d13969181900360800190a15050506111006001601655565b5050565b61110c612d72565b61111533612c5d565b6111315760405162461bcd60e51b8152600401610ca290614222565b611139612ec7565b60005b815181101561133957600082828151811061115957611159614251565b6020026020010151600001519050600083838151811061117b5761117b614251565b6020026020010151602001519050600084848151811061119d5761119d614251565b602002602001015160400151905060008585815181106111bf576111bf614251565b602002602001015160600151905060006111d98486612f20565b90506000806111e9868887613161565b91509150831561126657601454604051630608be6d60e11b81526001600160a01b03898116600483015260248201899052848116604483015290911690630c117cda90606401600060405180830381600087803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506112d8565b60155460405163d2180e6160e01b8152600481018890526001600160a01b0389811660248301529091169063d2180e6190604401600060405180830381600087803b1580156112b457600080fd5b505af11580156112c8573d6000803e3d6000fd5b505050506112d88383888a6130e9565b7f1f742344121ee39367760387f62d61b3b3490773d72cd37a18fc135d27babfda86888784866000896000604051611317989796959493929190614267565b60405180910390a1505050505050508080611331906142ad565b91505061113c565b506113446001601655565b50565b6001600160a01b038116600090815260186020908152604080832085845290915281205481908190808203611387576000806000935093509350506113b4565b600081815260196020526040902080546001909101549194506001600160a01b0316925090506113b4565b505b9250925092565b6113c3612d72565b6000546001600160a01b03163314806113e657506001546001600160a01b031633145b6114025760405162461bcd60e51b8152600401610ca2906142c6565b600c5460ff6101009091041615156001146114445760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ca2565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ab91906142ec565b60ff166001146114ec5760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610ca2565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115549190810190614397565b60405160200161156491906143cc565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146115dc5760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610ca2565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b61160933612c5d565b6116255760405162461bcd60e51b8152600401610ca290614222565b61162e81613280565b61167a5760405162461bcd60e51b815260206004820152601a60248201527f756e617070726f766564207769746864726177416464726573730000000000006044820152606401610ca2565b601054479060009061168c908361420f565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f193505050501580156116c5573d6000803e3d6000fd5b50505050565b6116d3612c9c565b60405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ca2565b611708612ec7565b6001600160a01b0382166000908152601860209081526040808320868452909152812054908190036117655760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610ca2565b8181146117a85760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610ca2565b600081815260196020526040902080546001600160a01b03163314806117d257506117d233612c5d565b806117f757506117e28585612f20565b6001600160a01b0316336001600160a01b0316145b6118435760405162461bcd60e51b815260206004820152601960248201527f6d73672e73656e646572206e6f7420617574686f72697a6564000000000000006044820152606401610ca2565b80546001808301546001600160a01b0387811660009081526018602090815260408083208c845282528083208390558883526019909152812080546001600160a01b03191681559093019290925560105492909116338114926118a790839061420f565b6010556118b481836132f1565b604080518981526001600160a01b038916602082015290810186905283151560608201527ff6b89ca1bccc679695ae3b928ee8c9335ecdfd739853cfe9e209a13e40cfacc0906080015b60405180910390a150505050506119156001601655565b505050565b6040805160808101825260008082526020808301829052828401829052606083018290526001600160a01b038516825260118152838220868352905291909120600181015461197b5760405162461bcd60e51b8152600401610ca2906143e8565b60408051608081018252825460ff81161515825261010090046001600160a01b03166020820152600183015491810191909152600290910154606082015290505b92915050565b6000546001600160a01b03163314806119e557506001546001600160a01b031633145b611a015760405162461bcd60e51b8152600401610ca2906142c6565b6001600160a01b03811660008181526002602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b6001600160a01b038116600090815260116020908152604080832085845290915290206001810154611a975760405162461bcd60e51b8152600401610ca2906143e8565b805461010090046001600160a01b03163314611af55760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f7420746f6b656e206f776e6572000000000000006044820152606401610ca2565b611915838361340f565b611b07612c9c565b60035460ff16610e3f57610e3f613457565b611b21612c9c565b6000611b2c82613494565b6015549091506001600160a01b031615611bda57600e546001600160a01b03838116911614611b925760405162461bcd60e51b815260206004820152601260248201527117dd985d5b1d08084f481b995dd5985d5b1d60721b6044820152606401610ca2565b6202a300600f5442611ba4919061420f565b11611bda5760405162461bcd60e51b8152600401610ca2906020808252600490820152631dd85a5d60e21b604082015260600190565b601580546001600160a01b0319166001600160a01b038381169190911790915560405190831681527f55c500d9f010bcb210d8664f602eb160ce8aee716a68ea710302305830e45233906020015b60405180910390a15050565b611c3c612c9c565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001610d14565b611c9333612c5d565b611caf5760405162461bcd60e51b8152600401610ca290614222565b60005b81518163ffffffff161015611100576000828263ffffffff1681518110611cdb57611cdb614251565b60209081029190910181015160608101516001600160a01b031660009081526011835260408082208351835290935291909120909150611d1e8160010154151590565b1515600103611d3957611d398260000151836060015161340f565b50508080611d4690614409565b915050611cb2565b6000546001600160a01b0316331480611d7157506001546001600160a01b031633145b611d8d5760405162461bcd60e51b8152600401610ca2906142c6565b60018054600160a01b900460ff16151514611dd55760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610ca2565b61134481613593565b611de6612d72565b611dee612c9c565b6000611df982613642565b805463ffff00001916815560006001909101555050565b6000546001600160a01b0316331480611e3357506001546001600160a01b031633145b611e4f5760405162461bcd60e51b8152600401610ca2906142c6565b6001805460ff60a01b19169055565b611e66612d72565b611e6e612c9c565b60008261ffff16118015611e8857506127108261ffff1611155b611ec95760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642070657263656e7461676560701b6044820152606401610ca2565b6000611ed482613642565b805490915062010000900461ffff1615611f2a5760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610ca2565b805463ffff000019166201000061ffff8516021781554260018201556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe590611f7b908490869060009061442c565b60405180910390a1505050565b611f90612d72565b6000611f9c8585613690565b905060008311611fda5760405162461bcd60e51b815260206004820152600960248201526807072696365203e20360bc1b6044820152606401610ca2565b6000611fe782878761373c565b6040805160808101825285151581526001600160a01b0380861660208084019182528385018a8152606085018781528c85166000908152601184528781208f82529093529186902085518154945190951661010002610100600160a81b0319951515959095166001600160a81b0319909416939093179390931782559151600182015590516002909101559051919250907f6852391c228e56409f2046f8f5b68af9ab60392697a47efa0910cf05cfbcae42906120cc908990899088908a909384526001600160a01b0392909216602084015215156040830152606082015260800190565b60405180910390a150505050505050565b6120e5612c9c565b6001600160a01b0382166000908152600460205260409020805482919060ff1916600183600281111561211a5761211a6141c9565b02179055505050565b61212b612d72565b612133612ec7565b6000341161216f5760405162461bcd60e51b81526020600482015260096024820152686d73672e76616c756560b81b6044820152606401610ca2565b6001600160a01b0381166000908152601160209081526040808320858452909152902060018101546121b35760405162461bcd60e51b8152600401610ca2906143e8565b8054600182015460028301546101009092046001600160a01b03169160006121db8787612f20565b9050806001600160a01b0316846001600160a01b0316146122335760405162461bcd60e51b815260206004820152601260248201527139b2b63632b910109e903a37b5a7bbb732b960711b6044820152606401610ca2565b61223f84888830612f98565b61228b5760405162461bcd60e51b815260206004820152601960248201527f73616c65636f6e7472616374206e6f7420617070726f766564000000000000006044820152606401610ca2565b61229787878734613918565b506122a4843389896130e9565b60006122af8761397c565b15156001036122d05782156122cb576122c884846139b4565b90505b6122dd565b6122da84846139b4565b90505b80156122ed576122ed85826132f1565b604080518981526001600160a01b0389811660208301523382840152871660608201526080810183905260a0810186905290517f60364304ae1fda694c3be5cac0f507f6fcd2144b5d26870e8a26f7ac17df83bf9181900360c00190a15050505050506111006001601655565b612362612d72565b61236a612ec7565b60006123768484612f20565b9050336001600160a01b038216146123c75760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610ca2565b6123d333858530612f98565b6124155760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610ca2565b600080612423868686613161565b91509150612433838388886130e9565b600061244084888861373c565b9050600061244d8761397c565b151560010361246e5781156124695761246683836139b4565b90505b61247b565b61247883836139b4565b90505b801561248b5761248b85826132f1565b7f1f742344121ee39367760387f62d61b3b3490773d72cd37a18fc135d27babfda88888886888a8b886040516118fe989796959493929190614267565b6124d0612d72565b6124d8612c9c565b60006124e382613642565b805490915062010000900461ffff166125385760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610ca2565b6203f48081600101544261254c919061420f565b1161258d5760405162461bcd60e51b81526020600482015260116024820152701d5b99195c881dd85a5d081c195c9a5bd9607a1b6044820152606401610ca2565b805462010000810461ffff1663ffffffff199091168117825560006001808401919091556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe592611c2892869261442c565b6125e9612c9c565b6125f281613494565b50600e80546001600160a01b0319166001600160a01b03831690811790915542600f556040519081527f66ea39118110b77bdc70c8b8c6c494af2a13414c01a51c05678c67e53c70418990602001610d14565b6000546001600160a01b031633148061266857506001546001600160a01b031633145b6126845760405162461bcd60e51b8152600401610ca2906142c6565b6001600160a01b0381166126cb5760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610ca2565b6001600160a01b038116600090815260026020526040902054156127215760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610ca2565b6001600160a01b03811660008181526002602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b61277b612c9c565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6127a4612c9c565b6001600160a01b0381166000818152600b602090815260408083209290925590519182527fffdbac6a703f8c063588b1b434bac15231b40f4c20b16f797a989d47a56ae8b29101610d14565b6127f8612c9c565b6001600160a01b03811661285d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca2565b611344816139d7565b61286e612c9c565b6012546001600160a01b0316156128b55760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610ca2565b6000819050806001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291c919061445a565b6f36b83830bcb6b2b73a39b13ab33332b960811b1461296a5760405162461bcd60e51b815260206004820152600a6024820152693737ba10313ab33332b960b11b6044820152606401610ca2565b601280546001600160a01b0319166001600160a01b039290921691909117905550565b612995612d72565b61299d612ec7565b34806129dc5760405162461bcd60e51b815260206004820152600e60248201526d73656e64206d73672e76616c756560901b6044820152606401610ca2565b6000826040516331a9108f60e11b8152600481018690529091506000906001600160a01b03831690636352211e90602401602060405180830381865afa158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190614473565b6001600160a01b031603612a925760405162461bcd60e51b815260206004820152600b60248201526a1a5b9d881d1bdad95b925960aa1b6044820152606401610ca2565b6001600160a01b03831660009081526018602090815260408083208784529091529020548015612b8057600081815260196020526040902060018101548411612b0d5760405162461bcd60e51b815260206004820152600d60248201526c0f0818dd5c9c995b9d08189a59609a1b6044820152606401610ca2565b80546001808301546001600160a01b0388811660009081526018602090815260408083208d845282528083208390558883526019909152812080546001600160a01b031916815590930192909255601054919092169190612b6f90829061420f565b601055612b7c82826132f1565b5050505b6000612b8a613a27565b6040805180820182523381526020808201888152600085815260198352848120935184546001600160a01b0319166001600160a01b03918216178555915160019094019390935589168252601881528282208a8352905220819055601054909150612bf6908590614490565b601055604080518781526001600160a01b0387166020820152908101829052606081018590523360808201527f9525a453a215f02f1c5afee7ab8628c140dfa606cd034605e34b8850f2f6ef209060a00160405180910390a1505050506111006001601655565b6001600160a01b038116600090815260026020526040812054808203612c865750600092915050565b62015180612c94824261420f565b119392505050565b6000546001600160a01b03163314610e3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b612cfe612c9c565b6001600160a01b03811615611344576001612d1c620151804261420f565b612d26919061420f565b6001600160a01b0382166000818152600b602090815260409182902093909355519081527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da899101610d14565b60035460ff1615610e3f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ca2565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e33919061445a565b14612e6e5760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b6044820152606401610ca2565b9392505050565b612e7d613a3e565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260165403612f195760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca2565b6002601655565b600080826040516331a9108f60e11b8152600481018690529091506001600160a01b03821690636352211e90602401602060405180830381865afa158015612f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f909190614473565b949350505050565b6000826001600160a01b038681169084161480613022575060405163e985e9c560e01b81526001600160a01b038781166004830152848116602483015282169063e985e9c590604401602060405180830381865afa158015612ffe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302291906144a3565b806130a1575060405163020604bf60e21b8152600481018690526001600160a01b03808516919083169063081812fc90602401602060405180830381865afa158015613072573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130969190614473565b6001600160a01b0316145b9695505050505050565b6001600160a01b0316600090815260116020908152604080832093835292905290812080546001600160a81b03191681556001810182905560020155565b600081604051632142170760e11b81526001600160a01b038781166004830152868116602483015260448201869052919250908216906342842e0e90606401600060405180830381600087803b15801561314257600080fd5b505af1158015613156573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038216600090815260186020908152604080832086845290915281205481908082036131bf5760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610ca2565b8381146132025760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610ca2565b600081815260196020818152604080842080546001820180546001600160a01b038d81168952601887528589208f8a5287529488208890558888529590945281546001600160a01b031916825594909255601054931695509093509061326990849061420f565b6010556132768787613a87565b5050935093915050565b6001600160a01b0381166000908152600b602052604081205480612c865760405162461bcd60e51b815260206004820152602260248201527f77697468647261772061646472657373206973206e6f74207265676973746572604482015261195960f21b6064820152608401610ca2565b6000826001600160a01b03168261138890604051600060405180830381858888f193505050503d8060008114613343576040519150601f19603f3d011682016040523d82523d6000602084013e613348565b606091505b5050905080611915576012546001600160a01b03166133a95760405162461bcd60e51b815260206004820152601e60248201527f7061796d656e74496e746572666163652073686f756c642062652073657400006044820152606401610ca2565b601254604051630a3b0a4f60e01b81526001600160a01b03858116600483015290911690630a3b0a4f9084906024016000604051808303818588803b1580156133f157600080fd5b505af1158015613405573d6000803e3d6000fd5b5050505050505050565b61341982826130ab565b604080518381526001600160a01b03831660208201527fa50b2d6faf84e88de164f615bc8daa8477ab67f677d72aef3a3122d26c6eae289101611c28565b61345f612d72565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612eaa3390565b60006001600160a01b0382166134e05760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b6044820152606401610ca2565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015613536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355a919061445a565b14612e6e5760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b6044820152606401610ca2565b6001600160a01b0381166135d35760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610ca2565b60016135e2620151804261420f565b6135ec919061420f565b6001600160a01b0382166000818152600260209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b6000806001836003811115613659576136596141c9565b03613666575060056119bc565b600283600381111561367a5761367a6141c9565b03613687575060076119bc565b50600992915050565b60008061369d8484612f20565b9050336001600160a01b038216146136ee5760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610ca2565b6136fa33858530612f98565b612e6e5760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610ca2565b60006137478261397c565b1515600003613805576013546040516305fa22e960e11b8152600481018590526001600160a01b0384811660248301526000928392911690630bf445d2906044016040805180830381865afa1580156137a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c891906144c0565b909250905060006137d982846144ef565b61ffff16116137ee5760095461ffff166137f8565b6137f881836144ef565b61ffff1692505050612e6e565b60006138118484613abe565b905060008060006138228487613c21565b9250925092506000886001600160a01b0316846001600160a01b0316036138f3578215156001036138555750600061390c565b6013546040516310cae44560e31b8152600481018790526001600160a01b0389811660248301526000921690638657222890604401602060405180830381865afa1580156138a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cb919061450a565b905060008161ffff16116138e55760055461ffff166138e7565b805b61ffff1691505061390c565b60075461390590839061ffff166144ef565b61ffff1690505b98975050505050505050565b60018201546000908083101561395a5760405162461bcd60e51b81526020600482015260076024820152663c20707269636560c81b6044820152606401610ca2565b61396486866130ab565b6000613970828561420f565b90505095945050505050565b6000806001600160a01b03831660009081526004602052604090205460ff1660028111156139ac576139ac6141c9565b141592915050565b60006127106139c3838261420f565b6139cd9085614527565b612e6e9190614546565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000613a37601780546001019055565b5060175490565b60035460ff16610e3f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ca2565b6001600160a01b0381166000908152601160209081526040808320858452909152902060018101541561191557611915838361340f565b6001600160a01b03811660009081526004602052604081205460ff166001816002811115613aee57613aee6141c9565b03613b6957604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf90602401606060405180830381865afa158015613b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5e919061457c565b9450613c1a92505050565b6002816002811115613b7d57613b7d6141c9565b03613bf657604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf906024016040805180830381865afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec91906145b1565b9350613c1a915050565b604051637330680360e01b81526001600160a01b0384166004820152602401610ca2565b5092915050565b6001600160a01b0381166000908152600460205260408120548190819060ff166001816002811115613c5557613c556141c9565b03613cea576040516355df427560e01b81526004810187905285906001600160a01b038216906355df427590602401600060405180830381865afa158015613ca1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cc991908101906145dd565b5060035490995060009850610100900461ffff1696506113b2945050505050565b6002816002811115613cfe57613cfe6141c9565b03613d7c57604051631e330caf60e21b81526004810187905285906001600160a01b038216906378cc32bc90602401606060405180830381865afa158015613d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6e9190614661565b919650945092506113b29050565b604051637330680360e01b81526001600160a01b0386166004820152602401610ca2565b6001600160a01b038116811461134457600080fd5b600060208284031215613dc757600080fd5b8135612e6e81613da0565b61ffff8116811461134457600080fd5b600060208284031215613df457600080fd5b8135612e6e81613dd2565b60008060408385031215613e1257600080fd5b823591506020830135613e2481613da0565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613e6857613e68613e2f565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613e9757613e97613e2f565b604052919050565b600067ffffffffffffffff821115613eb957613eb9613e2f565b5060051b60200190565b801515811461134457600080fd5b60006020808385031215613ee457600080fd5b823567ffffffffffffffff811115613efb57600080fd5b8301601f81018513613f0c57600080fd5b8035613f1f613f1a82613e9f565b613e6e565b81815260079190911b82018301908381019087831115613f3e57600080fd5b928401925b82841015613fa85760808489031215613f5c5760008081fd5b613f64613e45565b8435613f6f81613da0565b8152848601358682015260408086013590820152606080860135613f9281613ec3565b9082015282526080939093019290840190613f43565b979650505050505050565b600080600060608486031215613fc857600080fd5b833592506020840135613fda81613da0565b929592945050506040919091013590565b60006020808385031215613ffe57600080fd5b823567ffffffffffffffff81111561401557600080fd5b8301601f8101851361402657600080fd5b8035614034613f1a82613e9f565b81815260079190911b8201830190838101908783111561405357600080fd5b928401925b82841015613fa857608084890312156140715760008081fd5b614079613e45565b84358152858501358682015260408086013561409481613ec3565b908201526060858101356140a781613da0565b9082015282526080939093019290840190614058565b8035600481106140cc57600080fd5b919050565b6000602082840312156140e357600080fd5b612e6e826140bd565b600080604083850312156140ff57600080fd5b823561410a81613dd2565b9150614118602084016140bd565b90509250929050565b6000806040838503121561413457600080fd5b823561413f81613da0565b946020939093013593505050565b6000806000806080858703121561416357600080fd5b84359350602085013561417581613da0565b925060408501359150606085013561418c81613ec3565b939692955090935050565b600080604083850312156141aa57600080fd5b82356141b581613da0565b9150602083013560038110613e2457600080fd5b634e487b7160e01b600052602160045260246000fd5b60208101600383106141f3576141f36141c9565b91905290565b634e487b7160e01b600052601160045260246000fd5b818103818111156119bc576119bc6141f9565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b9788526001600160a01b039687166020890152604088019590955260608701939093529084166080860152831660a085015290911660c083015260e08201526101000190565b6000600182016142bf576142bf6141f9565b5060010190565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b6000602082840312156142fe57600080fd5b815160ff81168114612e6e57600080fd5b60005b8381101561432a578181015183820152602001614312565b50506000910152565b600082601f83011261434457600080fd5b815167ffffffffffffffff81111561435e5761435e613e2f565b614371601f8201601f1916602001613e6e565b81815284602083860101111561438657600080fd5b612f9082602083016020870161430f565b6000602082840312156143a957600080fd5b815167ffffffffffffffff8111156143c057600080fd5b612f9084828501614333565b600082516143de81846020870161430f565b9190910192915050565b6020808252600790820152666e6f2073616c6560c81b604082015260600190565b600063ffffffff808316818103614422576144226141f9565b6001019392505050565b6060810160048510614440576144406141c9565b93815261ffff929092166020830152151560409091015290565b60006020828403121561446c57600080fd5b5051919050565b60006020828403121561448557600080fd5b8151612e6e81613da0565b808201808211156119bc576119bc6141f9565b6000602082840312156144b557600080fd5b8151612e6e81613ec3565b600080604083850312156144d357600080fd5b82516144de81613dd2565b6020840151909250613e2481613dd2565b61ffff818116838216019080821115613c1a57613c1a6141f9565b60006020828403121561451c57600080fd5b8151612e6e81613dd2565b6000816000190483118215151615614541576145416141f9565b500290565b60008261456357634e487b7160e01b600052601260045260246000fd5b500490565b805163ffffffff811681146140cc57600080fd5b60008060006060848603121561459157600080fd5b835192506145a160208501614568565b9150604084015190509250925092565b600080604083850312156145c457600080fd5b6145cd83614568565b9150602083015190509250929050565b60008060008060008060c087890312156145f657600080fd5b8651955061460660208801614568565b945061461460408801614568565b935060608701519250608087015161462b81613da0565b60a088015190925067ffffffffffffffff81111561464857600080fd5b61465489828a01614333565b9150509295509295509295565b60008060006060848603121561467657600080fd5b835161468181613da0565b602085015190935061469281613ec3565b60408501519092506146a381613dd2565b80915050925092509256fea2646970667358221220d7c38cbad5ad17b49ea6948f1562d9edb92c34b863a5a6774ff9592c3b4a106664736f6c63430008100033

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

000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64

-----Decoded View---------------
Arg [0] : _royaltyRegistryAddress (address): 0x913adD08c2791fa3FFf4b95E94bF9054D3ee4052
Arg [1] : _safebox (address): 0x035da52E7Aa085F7E71764C0c8a1Ce6690e3Dfef
Arg [2] : _vault (address): 0xB7bC86cB0183Af5853274ae4E20D36DE387c4A64

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052
Arg [1] : 000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef
Arg [2] : 000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64


Deployed Bytecode Sourcemap

47733:19894:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18979:53;;;;;;;;;;;;19026:6;18979:53;;;;;160:25:1;;;148:2;133:18;18979:53:0;;;;;;;;17985:373;;;;;;;;;;-1:-1:-1;17985:373:0;;;;;:::i;:::-;;:::i;:::-;;16781:238;;;;;;;;;;-1:-1:-1;16781:238:0;;;;;:::i;:::-;;:::i;19132:47::-;;;;;;;;;;-1:-1:-1;19132:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;35377:293;;;;;;;;;;-1:-1:-1;35377:293:0;;;;;:::i;:::-;;:::i;37028:327::-;;;;;;;;;;-1:-1:-1;37028:327:0;;;;;:::i;:::-;;:::i;38233:121::-;;;;;;;;;;;;;:::i;28074:74::-;;;;;;;;;;-1:-1:-1;28074:74:0;;;;;;;;;;;;;;;;;;;;;;;1164:6:1;1197:15;;;1179:34;;1249:15;;;;1244:2;1229:18;;1222:43;1281:18;;;1274:34;1142:2;1127:18;28074:74:0;956:358:1;67418:107:0;;;;;;;;;;;;;:::i;36600:420::-;;;;;;;;;;-1:-1:-1;36600:420:0;;;;;:::i;:::-;;:::i;33379:47::-;;;;;;;;;;-1:-1:-1;33379:47:0;;;;-1:-1:-1;;;;;33379:47:0;;;;;;-1:-1:-1;;;;;1513:32:1;;;1495:51;;1483:2;1468:18;33379:47:0;1319:233:1;54812:1130:0;;;;;;;;;;-1:-1:-1;54812:1130:0;;;;;:::i;:::-;;:::i;65665:1346::-;;;;;;;;;;-1:-1:-1;65665:1346:0;;;;;:::i;:::-;;:::i;31552:43::-;;;;;;;;;;-1:-1:-1;31552:43:0;;;;;;;;;;;;;;4603:14:1;;4596:22;4578:41;;4566:2;4551:18;31552:43:0;4438:187:1;59757:595:0;;;;;;;;;;-1:-1:-1;59757:595:0;;;;;:::i;:::-;;:::i;:::-;;;;4832:25:1;;;-1:-1:-1;;;;;4893:32:1;;;4888:2;4873:18;;4866:60;4942:18;;;4935:34;4820:2;4805:18;59757:595:0;4630:345:1;12455:86:0;;;;;;;;;;-1:-1:-1;12526:7:0;;;;12455:86;;37363:862;;;;;;;;;;-1:-1:-1;37363:862:0;;;;;:::i;:::-;;:::i;33522:40::-;;;;;;;;;;-1:-1:-1;33522:40:0;;;;-1:-1:-1;;;;;33522:40:0;;;33484:31;;;;;;;;;;-1:-1:-1;33484:31:0;;;;-1:-1:-1;;;;;33484:31:0;;;42087:508;;;;;;;;;;-1:-1:-1;42087:508:0;;;;;:::i;:::-;;:::i;67533:91::-;;;;;;;;;;;;;:::i;60706:1172::-;;;;;;;;;;-1:-1:-1;60706:1172:0;;;;;:::i;:::-;;:::i;33433:44::-;;;;;;;;;;-1:-1:-1;33433:44:0;;;;-1:-1:-1;;;;;33433:44:0;;;56524:333;;;;;;;;;;-1:-1:-1;56524:333:0;;;;;:::i;:::-;;:::i;:::-;;;;;;6578:13:1;;6571:21;6564:29;6546:48;;6654:4;6642:17;;;6636:24;-1:-1:-1;;;;;6632:50:1;6610:20;;;6603:80;6739:4;6727:17;;;6721:24;6699:20;;;6692:54;6802:4;6790:17;;;6784:24;6762:20;;;6755:54;;;;6533:3;6518:19;;6331:484;20131:175:0;;;;;;;;;;-1:-1:-1;20131:175:0;;;;;:::i;:::-;;:::i;56071:386::-;;;;;;;;;;-1:-1:-1;56071:386:0;;;;;:::i;:::-;;:::i;67277:104::-;;;;;;;;;;;;;:::i;35961:631::-;;;;;;;;;;-1:-1:-1;35961:631:0;;;;;:::i;:::-;;:::i;21926:38::-;;;;;;;;;;-1:-1:-1;21926:38:0;;;;;;;;;;;;;;6994:6:1;6982:19;;;6964:38;;6952:2;6937:18;21926:38:0;6820:188:1;19493:148:0;;;;;;;;;;-1:-1:-1;19493:148:0;;;;;:::i;:::-;;:::i;14672:87::-;;;;;;;;;;-1:-1:-1;14718:7:0;14745:6;-1:-1:-1;;;;;14745:6:0;14672:87;;27921:69;;;;;;;;;;-1:-1:-1;27921:69:0;;;;;;;;;;;;;;;;;;;56940:488;;;;;;;;;;-1:-1:-1;56940:488:0;;;;;:::i;:::-;;:::i;20810:218::-;;;;;;;;;;-1:-1:-1;20810:218:0;;;;;:::i;:::-;;:::i;29625:289::-;;;;;;;;;;-1:-1:-1;29625:289:0;;;;;:::i;:::-;;:::i;21036:98::-;;;;;;;;;;;;;:::i;28876:741::-;;;;;;;;;;-1:-1:-1;28876:741:0;;;;;:::i;:::-;;:::i;33297:75::-;;;;;;;;;;-1:-1:-1;33297:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33297:75:0;;;;;;;;;10083:14:1;;10076:22;10058:41;;-1:-1:-1;;;;;10135:32:1;;;10130:2;10115:18;;10108:60;10184:18;;;10177:34;10242:2;10227:18;;10220:34;10045:3;10030:19;33297:75:0;9833:427:1;51616:1024:0;;;;;;;;;;-1:-1:-1;51616:1024:0;;;;;:::i;:::-;;:::i;22440:217::-;;;;;;;;;;-1:-1:-1;22440:217:0;;;;;:::i;:::-;;:::i;16381:49::-;;;;;;;;;;-1:-1:-1;16381:49:0;;;;;;;;52779:1894;;;;;;:::i;:::-;;:::i;62962:2176::-;;;;;;;;;;-1:-1:-1;62962:2176:0;;;;;:::i;:::-;;:::i;27997:70::-;;;;;;;;;;-1:-1:-1;27997:70:0;;;;;;;;;;;;;;;;;;;30029:812;;;;;;;;;;-1:-1:-1;30029:812:0;;;;;:::i;:::-;;:::i;18949:23::-;;;;;;;;;;-1:-1:-1;18949:23:0;;;;-1:-1:-1;;;;;18949:23:0;;;34956:267;;;;;;;;;;-1:-1:-1;34956:267:0;;;;;:::i;:::-;;:::i;19749:312::-;;;;;;;;;;-1:-1:-1;19749:312:0;;;;;:::i;:::-;;:::i;16314:60::-;;;;;;;;;;-1:-1:-1;16314:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;27716;;;;;;;;;;;;27770:6;27716:60;;22770:181;;;;;;;;;;-1:-1:-1;22770:181:0;;;;;:::i;:::-;;:::i;19039:39::-;;;;;;;;;;-1:-1:-1;19039:39:0;;;;-1:-1:-1;;;19039:39:0;;;;;;17745:232;;;;;;;;;;-1:-1:-1;17745:232:0;;;;;:::i;:::-;;:::i;32027:29::-;;;;;;;;;;;;;;;;22226:62;;;;;;;;;;-1:-1:-1;22226:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;15578:201::-;;;;;;;;;;-1:-1:-1;15578:201:0;;;;;:::i;:::-;;:::i;40885:535::-;;;;;;;;;;-1:-1:-1;40885:535:0;;;;;:::i;:::-;;:::i;57790:1878::-;;;;;;:::i;:::-;;:::i;21244:309::-;;;;;;;;;;-1:-1:-1;21244:309:0;;;;;:::i;:::-;;:::i;47871:33::-;;;;;;;;;;;;47903:1;47871:33;;;;;11763:4:1;11751:17;;;11733:36;;11721:2;11706:18;47871:33:0;11591:184:1;17985:373:0;14558:13;:11;:13::i;:::-;18133:29:::1;::::0;::::1;;:38;18111:126;;;::::0;-1:-1:-1;;;18111:126:0;;11982:2:1;18111:126:0::1;::::0;::::1;11964:21:1::0;12021:2;12001:18;;;11994:30;12060:34;12040:18;;;12033:62;-1:-1:-1;;;12111:18:1;;;12104:36;12157:19;;18111:126:0::1;;;;;;;;;18248:55;18286:16;18248:37;:55::i;:::-;-1:-1:-1::0;18314:29:0::1;:36:::0;;-1:-1:-1;;18314:36:0::1;18346:4;18314:36;::::0;;17985:373::o;16781:238::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;16896:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;;16942:15:::1;16896:61:::0;;16973:38;;1495:51:1;;;16973:38:0::1;::::0;1468:18:1;16973:38:0::1;;;;;;;;16781:238:::0;:::o;35377:293::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;35534:33:::2;35558:8;35534:23;:33::i;:::-;35506:17;:62:::0;;-1:-1:-1;;;;;;35506:62:0::2;::::0;-1:-1:-1;;;;;35506:62:0;;::::2;;;::::0;;35601:15:::2;35579:19;:37:::0;35632:30:::2;::::0;1513:32:1;;;1495:51;;35632:30:0::2;::::0;1483:2:1;1468:18;35632:30:0::2;1319:233:1::0;37028:327:0;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;37255:4:::2;37237:14;:22;;;;37192:110;;;::::0;-1:-1:-1;;;37192:110:0;;12389:2:1;37192:110:0::2;::::0;::::2;12371:21:1::0;12428:2;12408:18;;;12401:30;-1:-1:-1;;;12447:18:1;;;12440:45;12502:18;;37192:110:0::2;12187:339:1::0;37192:110:0::2;37313:17;:34:::0;;::::2;::::0;;::::2;;;-1:-1:-1::0;;37313:34:0;;::::2;::::0;;;::::2;::::0;;37028:327::o;38233:121::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;38314:24:::2;:32:::0;;-1:-1:-1;;38314:32:0::2;::::0;;38233:121::o;67418:107::-;14558:13;:11;:13::i;:::-;12526:7;;;;67467:51:::1;;;67496:10;:8;:10::i;:::-;67418:107::o:0;36600:420::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;36741:17:::2;::::0;-1:-1:-1;;;;;36729:29:0;;::::2;36741:17:::0;;;::::2;;36729:29;36721:64;;;::::0;-1:-1:-1;;;36721:64:0;;12733:2:1;36721:64:0::2;::::0;::::2;12715:21:1::0;12772:2;12752:18;;;12745:30;-1:-1:-1;;;12791:18:1;;;12784:52;12853:18;;36721:64:0::2;12531:346:1::0;36721:64:0::2;31521:6;36836:19;;36818:15;:37;;;;:::i;:::-;:64;36796:118;;;;-1:-1:-1::0;;;36796:118:0::2;;;;;;13349:2:1::0;13331:21;;;13388:1;13368:18;;;13361:29;-1:-1:-1;;;13421:2:1;13406:18;;13399:34;13465:2;13450:18;;13147:327;36796:118:0::2;36935:33;36959:8;36935:23;:33::i;:::-;36925:7;:43:::0;;-1:-1:-1;;;;;;36925:43:0::2;-1:-1:-1::0;;;;;36925:43:0;;::::2;;::::0;;36984:28:::2;::::0;1513:32:1;;;1495:51;;36984:28:0::2;::::0;1483:2:1;1468:18;36984:28:0::2;1319:233:1::0;54812:1130:0;12060:19;:17;:19::i;:::-;21704:30:::1;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1::0;;;21696:64:0::1;;;;;;;:::i;:::-;45593:21:::2;:19;:21::i;:::-;54984:14:::3;55001:41;55010:8;55020:21;55001:8;:41::i;:::-;-1:-1:-1::0;;;;;55085:34:0;::::3;55053:29;55085:34:::0;;;:11:::3;:34;::::0;;;;;;;:68;;;;;;;;54984:58;;-1:-1:-1;55186:15:0::3;55085:68:::0;39127:16;;;:20;;;38996:160;55186:15:::3;:40;;;;-1:-1:-1::0;55215:11:0;;-1:-1:-1;;;;;55205:21:0;;::::3;55215:11;::::0;;::::3;;55205:21;55186:40;:67;;;;-1:-1:-1::0;55230:15:0;;::::3;;:23;;:15:::0;:23:::3;55186:67;55164:131;;;::::0;-1:-1:-1;;;55164:131:0;;14031:2:1;55164:131:0::3;::::0;::::3;14013:21:1::0;14070:2;14050:18;;;14043:30;-1:-1:-1;;;14089:18:1;;;14082:44;14143:18;;55164:131:0::3;13829:338:1::0;55164:131:0::3;55328:157;55365:6;55390:8;55417:21;55465:4;55328:18;:157::i;:::-;55306:224;;;::::0;-1:-1:-1;;;55306:224:0;;14374:2:1;55306:224:0::3;::::0;::::3;14356:21:1::0;14413:2;14393:18;;;14386:30;-1:-1:-1;;;14432:18:1;;;14425:47;14489:18;;55306:224:0::3;14172:341:1::0;55306:224:0::3;55562:15;::::0;::::3;::::0;55588:44:::3;55600:8:::0;55610:21;55588:11:::3;:44::i;:::-;55702:7;::::0;55643:137:::3;::::0;55673:6;;-1:-1:-1;;;;;55702:7:0::3;55725:8:::0;55748:21;55643:15:::3;:137::i;:::-;55890:7;::::0;55796:138:::3;::::0;;14749:25:1;;;-1:-1:-1;;;;;14848:15:1;;;14843:2;14828:18;;14821:43;55890:7:0;;::::3;14880:18:1::0;;;14873:43;14947:2;14932:18;;14925:34;;;55796:138:0;::::3;::::0;;;;14736:3:1;55796:138:0;;::::3;54973:969;;;45637:20:::2;45031:1:::0;46157:7;:22;45974:213;45637:20:::2;54812:1130:::0;;:::o;65665:1346::-;12060:19;:17;:19::i;:::-;21704:30:::1;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1::0;;;21696:64:0::1;;;;;;;:::i;:::-;45593:21:::2;:19;:21::i;:::-;65834:9:::3;65829:1175;65853:9;:16;65849:1;:20;65829:1175;;;65891:20;65914:9;65924:1;65914:12;;;;;;;;:::i;:::-;;;;;;;:25;;;65891:48;;65954:15;65972:9;65982:1;65972:12;;;;;;;;:::i;:::-;;;;;;;:20;;;65954:38;;66007:13;66023:9;66033:1;66023:12;;;;;;;;:::i;:::-;;;;;;;:18;;;66007:34;;66056:15;66074:9;66084:1;66074:12;;;;;;;;:::i;:::-;;;;;;;:23;;;66056:41;;66112:14;66129:31;66138:7;66147:12;66129:8;:31::i;:::-;66112:48;;66178:21;66201:16:::0;66221:119:::3;66263:7;66289:12;66320:5;66221:23;:119::i;:::-;66177:163;;;;66361:10;66357:282;;;66392:7;::::0;:60:::3;::::0;-1:-1:-1;;;66392:60:0;;-1:-1:-1;;;;;15360:15:1;;;66392:60:0::3;::::0;::::3;15342:34:1::0;15392:18;;;15385:34;;;15455:15;;;15435:18;;;15428:43;66392:7:0;;::::3;::::0;:22:::3;::::0;15277:18:1;;66392:60:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;66357:282;;;66493:14;::::0;:50:::3;::::0;-1:-1:-1;;;66493:50:0;;::::3;::::0;::::3;15656:25:1::0;;;-1:-1:-1;;;;;15717:32:1;;;15697:18;;;15690:60;66493:14:0;;::::3;::::0;:27:::3;::::0;15629:18:1;;66493:50:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;66562:61;66578:6;66586:13;66601:7;66610:12;66562:15;:61::i;:::-;66660:332;66705:7;66745:12;66783:5;66817:8;66852:13;66907:1;66936:6;66975:1;66660:332;;;;;;;;;;;;;:::i;:::-;;;;;;;;65876:1128;;;;;;;65871:3;;;;;:::i;:::-;;;;65829:1175;;;;45637:20:::2;45031:1:::0;46157:7;:22;45974:213;45637:20:::2;65665:1346:::0;:::o;59757:595::-;-1:-1:-1;;;;;60047:37:0;;59926:13;60047:37;;;:14;:37;;;;;;;;:47;;;;;;;;;59926:13;;;;60109:17;;;60105:240;;60151:1;60162;60166;60143:25;;;;;;;;;60105:240;60201:27;60231:29;;;:15;:29;;;;;60297:17;;;60316:16;;;;60247:12;;-1:-1:-1;;;;;;60297:17:0;;-1:-1:-1;60316:16:0;-1:-1:-1;60275:58:0;;60105:240;60013:339;59757:595;;;;;;:::o;37363:862::-;12060:19;:17;:19::i;:::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23:::1;::::0;:51:::1;;-1:-1:-1::0;19401:8:0::1;::::0;-1:-1:-1;;;;;19401:8:0::1;10648:10:::0;19401:24:::1;19374:51;19352:113;;;;-1:-1:-1::0;;;19352:113:0::1;;;;;;;:::i;:::-;37504:24:::2;::::0;::::2;;::::0;;::::2;;:32;;:24;:32;37496:47;;;::::0;-1:-1:-1;;;37496:47:0;;17210:2:1;37496:47:0::2;::::0;::::2;17192:21:1::0;17249:1;17229:18;;;17222:29;-1:-1:-1;;;17267:18:1;;;17260:32;17309:18;;37496:47:0::2;17008:325:1::0;37496:47:0::2;37554:46;37646:13;37554:120;;37693:21;-1:-1:-1::0;;;;;37693:29:0::2;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;37728:1;37693:36;37685:61;;;::::0;-1:-1:-1;;;37685:61:0;;17818:2:1;37685:61:0::2;::::0;::::2;17800:21:1::0;17857:2;17837:18;;;17830:30;-1:-1:-1;;;17876:18:1;;;17869:42;17928:18;;37685:61:0::2;17616:336:1::0;37685:61:0::2;37757:20;37821:21;-1:-1:-1::0;;;;;37821:36:0::2;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;37821:38:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;37804:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;37780:91;;;;;;37757:114;;38032:12;38065:66;38032:99;;;38010:160;;;::::0;-1:-1:-1;;;38010:160:0;;19565:2:1;38010:160:0::2;::::0;::::2;19547:21:1::0;19604:2;19584:18;;;19577:30;-1:-1:-1;;;19623:18:1;;;19616:41;19674:18;;38010:160:0::2;19363:335:1::0;38010:160:0::2;-1:-1:-1::0;38181:12:0::2;:36:::0;;-1:-1:-1;;;;;;38181:36:0::2;-1:-1:-1::0;;;;;38181:36:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;37363:862:0:o;42087:508::-;21704:30;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1;;;21696:64:0;;;;;;;:::i;:::-;42223:43:::1;42249:16;42223:25;:43::i;:::-;42201:119;;;::::0;-1:-1:-1;;;42201:119:0;;19905:2:1;42201:119:0::1;::::0;::::1;19887:21:1::0;19944:2;19924:18;;;19917:30;19983:28;19963:18;;;19956:56;20029:18;;42201:119:0::1;19703:350:1::0;42201:119:0::1;42518:14;::::0;42357:21:::1;::::0;42331:23:::1;::::0;42500:32:::1;::::0;42357:21;42500:32:::1;:::i;:::-;42543:44;::::0;42472:60;;-1:-1:-1;;;;;;42543:25:0;::::1;::::0;:44;::::1;;;::::0;42472:60;;42543:44:::1;::::0;;;42472:60;42543:25;:44;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42190:405;;42087:508:::0;:::o;67533:91::-;14558:13;:11;:13::i;:::-;67604:12:::1;::::0;-1:-1:-1;;;67604:12:0;;17210:2:1;67604:12:0::1;::::0;::::1;17192:21:1::0;17249:1;17229:18;;;17222:29;-1:-1:-1;;;17267:18:1;;;17260:32;17309:18;;67604:12:0::1;17008:325:1::0;60706:1172:0;45593:21;:19;:21::i;:::-;-1:-1:-1;;;;;60880:37:0;::::1;60857:20;60880:37:::0;;;:14:::1;:37;::::0;;;;;;;:47;;;;;;;;;;60946:17;;;60938:36:::1;;;::::0;-1:-1:-1;;;60938:36:0;;20260:2:1;60938:36:0::1;::::0;::::1;20242:21:1::0;20299:1;20279:18;;;20272:29;-1:-1:-1;;;20317:18:1;;;20310:36;20363:18;;60938:36:0::1;20058:329:1::0;60938:36:0::1;61009:6;60993:12;:22;60985:52;;;::::0;-1:-1:-1;;;60985:52:0;;20594:2:1;60985:52:0::1;::::0;::::1;20576:21:1::0;20633:2;20613:18;;;20606:30;-1:-1:-1;;;20652:18:1;;;20645:47;20709:18;;60985:52:0::1;20392:341:1::0;60985:52:0::1;61048:27;61078:29:::0;;;:15:::1;:29;::::0;;;;61140:17;;-1:-1:-1;;;;;61140:17:0::1;61161:10;61140:31;::::0;:82:::1;;;61192:30;61211:10;61192:18;:30::i;:::-;61140:158;;;;61257:41;61266:8;61276:21;61257:8;:41::i;:::-;-1:-1:-1::0;;;;;61243:55:0::1;:10;-1:-1:-1::0;;;;;61243:55:0::1;;61140:158;61118:233;;;::::0;-1:-1:-1;;;61118:233:0;;20940:2:1;61118:233:0::1;::::0;::::1;20922:21:1::0;20979:2;20959:18;;;20952:30;21018:27;20998:18;;;20991:55;21063:18;;61118:233:0::1;20738:349:1::0;61118:233:0::1;61379:17:::0;;;61438:16;;::::1;::::0;-1:-1:-1;;;;;61524:37:0;;::::1;61362:13;61524:37:::0;;;:14:::1;:37;::::0;;;;;;;:47;;;;;;;;61517:54;;;61589:29;;;:15:::1;:29:::0;;;;;61582:36;;-1:-1:-1;;;;;;61582:36:0::1;::::0;;;;::::1;::::0;;;;61646:14:::1;::::0;61379:17;;;::::1;61400:10;61379:31:::0;::::1;::::0;61646:22:::1;::::0;61438:16;;61646:22:::1;:::i;:::-;61629:14;:39:::0;61679:35:::1;61693:13:::0;61708:5;61679:13:::1;:35::i;:::-;61730:140;::::0;;21317:25:1;;;-1:-1:-1;;;;;21378:32:1;;21373:2;21358:18;;21351:60;21427:18;;;21420:34;;;21497:14;;21490:22;21485:2;21470:18;;21463:50;61730:140:0::1;::::0;21304:3:1;21289:19;61730:140:0::1;;;;;;;;60846:1032;;;;;45637:20:::0;45031:1;46157:7;:22;45974:213;45637:20;60706:1172;;;:::o;56524:333::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56713:34:0;;;;:11;:34;;;;;:68;;;;;;;;;39127:16;;;;56792:35;;;;-1:-1:-1;;;56792:35:0;;;;;;;:::i;:::-;56838:11;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56838:11:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56524:333:0;;;;;:::o;20131:175::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20219:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;20212:32;;;20260:38;;22027:51:1;;;22094:18;;;22087:50;;;;20260:38:0::1;::::0;22000:18:1;20260:38:0::1;21859:284:1::0;56071:386:0;-1:-1:-1;;;;;56206:34:0;;56174:29;56206:34;;;:11;:34;;;;;;;;:68;;;;;;;;39127:16;;;;56285:35;;;;-1:-1:-1;;;56285:35:0;;;;;;;:::i;:::-;56353:11;;;;;-1:-1:-1;;;;;56353:11:0;56339:10;:25;56331:63;;;;-1:-1:-1;;;56331:63:0;;22350:2:1;56331:63:0;;;22332:21:1;22389:2;22369:18;;;22362:30;22428:27;22408:18;;;22401:55;22473:18;;56331:63:0;22148:349:1;56331:63:0;56405:44;56417:8;56427:21;56405:11;:44::i;67277:104::-;14558:13;:11;:13::i;:::-;12526:7;;;;67324:50:::1;;67354:8;:6;:8::i;35961:631::-:0;14558:13;:11;:13::i;:::-;36039:24:::1;36066:36;36088:13;36066:21;:36::i;:::-;36205:14;::::0;36039:63;;-1:-1:-1;;;;;;36205:14:0::1;36197:37:::0;36193:312:::1;;36312:15;::::0;-1:-1:-1;;;;;36295:32:0;;::::1;36312:15:::0;::::1;36295:32;36287:63;;;::::0;-1:-1:-1;;;36287:63:0;;22704:2:1;36287:63:0::1;::::0;::::1;22686:21:1::0;22743:2;22723:18;;;22716:30;-1:-1:-1;;;22762:18:1;;;22755:48;22820:18;;36287:63:0::1;22502:342:1::0;36287:63:0::1;31521:6;36409:17;;36391:15;:35;;;;:::i;:::-;:62;36365:128;;;;-1:-1:-1::0;;;36365:128:0::1;;;;;;13349:2:1::0;13331:21;;;13388:1;13368:18;;;13361:29;-1:-1:-1;;;13421:2:1;13406:18;;13399:34;13465:2;13450:18;;13147:327;36365:128:0::1;36515:14;:22:::0;;-1:-1:-1;;;;;;36515:22:0::1;-1:-1:-1::0;;;;;36515:22:0;;::::1;::::0;;;::::1;::::0;;;36553:31:::1;::::0;1513:32:1;;;1495:51;;36553:31:0::1;::::0;1483:2:1;1468:18;36553:31:0::1;;;;;;;;36028:564;35961:631:::0;:::o;19493:148::-;14558:13;:11;:13::i;:::-;19563:8:::1;:20:::0;;-1:-1:-1;;;;;;19563:20:0::1;-1:-1:-1::0;;;;;19563:20:0;::::1;::::0;;::::1;::::0;;;19599:34:::1;::::0;1495:51:1;;;19599:34:0::1;::::0;1483:2:1;1468:18;19599:34:0::1;1319:233:1::0;56940:488:0;21704:30;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1;;;21696:64:0;;;;;;;:::i;:::-;57057:8:::1;57052:369;57075:8;:15;57071:1;:19;;;57052:369;;;57112:26;57141:8;57150:1;57141:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;57211:20:::1;::::0;::::1;::::0;-1:-1:-1;;;;;57199:33:0::1;57167:29;57199:33:::0;;;:11:::1;:33:::0;;;;;;57251:15;;57199:82;;;;;;;;;57141:11;;-1:-1:-1;57300:15:0::1;57199:82:::0;39127:16;;;:20;;;38996:160;57300:15:::1;:23;;57319:4;57300:23:::0;57296:114:::1;;57344:50;57356:7;:15;;;57373:7;:20;;;57344:11;:50::i;:::-;57097:324;;57092:3;;;;;:::i;:::-;;;;57052:369;;20810:218:::0;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;20930:20:::1;::::0;;-1:-1:-1;;;20930:20:0;::::1;;;:28;;;20922:49;;;::::0;-1:-1:-1;;;20922:49:0;;23257:2:1;20922:49:0::1;::::0;::::1;23239:21:1::0;23296:1;23276:18;;;23269:29;-1:-1:-1;;;23314:18:1;;;23307:38;23362:18;;20922:49:0::1;23055:331:1::0;20922:49:0::1;20982:38;21008:11;20982:25;:38::i;29625:289::-:0;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;29756:35:::2;29794:29;29816:6;29794:21;:29::i;:::-;29834:37:::0;;-1:-1:-1;;29834:37:0::2;::::0;;29870:1:::2;-1:-1:-1::0;29882:20:0;;::::2;:24:::0;-1:-1:-1;;29625:289:0:o;21036:98::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;21098:20:::1;:28:::0;;-1:-1:-1;;;;21098:28:0::1;::::0;;21036:98::o;28876:741::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;29060:1:::2;29046:11;:15;;;:48;;;;;28198:5;29065:11;:29;;;;29046:48;29024:116;;;::::0;-1:-1:-1;;;29024:116:0;;23593:2:1;29024:116:0::2;::::0;::::2;23575:21:1::0;23632:2;23612:18;;;23605:30;-1:-1:-1;;;23651:18:1;;;23644:48;23709:18;;29024:116:0::2;23391:342:1::0;29024:116:0::2;29151:35;29189:29;29211:6;29189:21;:29::i;:::-;29251:33:::0;;;;-1:-1:-1;29251:33:0;;::::2;;;:38:::0;29229:111:::2;;;::::0;-1:-1:-1;;;29229:111:0;;23940:2:1;29229:111:0::2;::::0;::::2;23922:21:1::0;23979:2;23959:18;;;23952:30;-1:-1:-1;;;23998:18:1;;;23991:53;24061:18;;29229:111:0::2;23738:347:1::0;29229:111:0::2;29351:47:::0;;-1:-1:-1;;29351:47:0::2;::::0;::::2;::::0;::::2;;;::::0;;29432:15:::2;-1:-1:-1::0;29409:20:0;::::2;:38:::0;29463:146:::2;::::0;::::2;::::0;::::2;::::0;29522:6;;29351:47;;-1:-1:-1;;29463:146:0::2;:::i;:::-;;;;;;;;29013:604;28876:741:::0;;:::o;51616:1024::-;12060:19;:17;:19::i;:::-;51801:14:::1;51818:92;51855:8;51878:21;51818:22;:92::i;:::-;51801:109;;51943:1;51929:11;:15;51921:37;;;::::0;-1:-1:-1;;;51921:37:0;;24710:2:1;51921:37:0::1;::::0;::::1;24692:21:1::0;24749:1;24729:18;;;24722:29;-1:-1:-1;;;24767:18:1;;;24760:39;24816:18;;51921:37:0::1;24508:332:1::0;51921:37:0::1;52048:28;52079:122;52125:6;52146:8;52169:21;52079:31;:122::i;:::-;52281:135;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;52281:135:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;52427:34;;::::1;52250:28;52427:34:::0;;;:11:::1;:34:::0;;;;;:44;;;;;;;;;;:51;;;;;;;;::::1;;;-1:-1:-1::0;;;;;;52427:51:0;::::1;;::::0;;;;-1:-1:-1;;;;;;52427:51:0;;;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;52494:138;;52048:153;;-1:-1:-1;52281:135:0;52494:138:::1;::::0;::::1;::::0;52462:8;;52439:21;;52312:11;;52359;;25070:25:1;;;-1:-1:-1;;;;;25131:32:1;;;;25126:2;25111:18;;25104:60;25207:14;25200:22;25195:2;25180:18;;25173:50;25254:2;25239:18;;25232:34;25057:3;25042:19;;24845:427;52494:138:0::1;;;;;;;;51790:850;;;51616:1024:::0;;;;:::o;22440:217::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;22588:45:0;::::1;;::::0;;;:22:::1;:45;::::0;;;;:61;;22636:13;;22588:45;-1:-1:-1;;22588:61:0::1;::::0;22636:13;22588:61:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;22440:217:::0;;:::o;52779:1894::-;12060:19;:17;:19::i;:::-;45593:21:::1;:19;:21::i;:::-;52962:1:::2;52950:9;:13;52942:35;;;::::0;-1:-1:-1;;;52942:35:0;;25479:2:1;52942:35:0::2;::::0;::::2;25461:21:1::0;25518:1;25498:18;;;25491:29;-1:-1:-1;;;25536:18:1;;;25529:39;25585:18;;52942:35:0::2;25277:332:1::0;52942:35:0::2;-1:-1:-1::0;;;;;53020:34:0;::::2;52988:29;53020:34:::0;;;:11:::2;:34;::::0;;;;;;;:68;;;;;;;;39127:16;;;;53099:35:::2;;;;-1:-1:-1::0;;;53099:35:0::2;;;;;;;:::i;:::-;53162:11:::0;;::::2;53200:15:::0;::::2;::::0;53261:25:::2;::::0;::::2;::::0;53162:11:::2;::::0;;::::2;-1:-1:-1::0;;;;;53162:11:0::2;::::0;53145:14:::2;53318:41;53327:8:::0;53337:21;53318:8:::2;:41::i;:::-;53297:62;;53388:10;-1:-1:-1::0;;;;;53378:20:0::2;:6;-1:-1:-1::0;;;;;53378:20:0::2;;53370:51;;;::::0;-1:-1:-1;;;53370:51:0;;25816:2:1;53370:51:0::2;::::0;::::2;25798:21:1::0;25855:2;25835:18;;;25828:30;-1:-1:-1;;;25874:18:1;;;25867:48;25932:18;;53370:51:0::2;25614:342:1::0;53370:51:0::2;53454:157;53491:6;53516:8;53543:21;53591:4;53454:18;:157::i;:::-;53432:232;;;::::0;-1:-1:-1;;;53432:232:0;;26163:2:1;53432:232:0::2;::::0;::::2;26145:21:1::0;26202:2;26182:18;;;26175:30;26241:27;26221:18;;;26214:55;26286:18;;53432:232:0::2;25961:349:1::0;53432:232:0::2;53675:59;53685:8;53695:21;53718:4;53724:9;53675;:59::i;:::-;;53745:68;53761:6;53769:10;53781:8;53791:21;53745:15;:68::i;:::-;53824:20;53942:44;53964:21;53942;:44::i;:::-;:52;;53990:4;53942:52:::0;53938:436:::2;;54015:28:::0;;54011:200:::2;;54079:116;54124:5;54152:24;54079:22;:116::i;:::-;54064:131;;54011:200;53938:436;;;54258:104;54299:5;54323:24;54258:22;:104::i;:::-;54243:119;;53938:436;54388:16:::0;;54384:84:::2;;54421:35;54435:6;54443:12;54421:13;:35::i;:::-;54483:182;::::0;;26602:25:1;;;-1:-1:-1;;;;;26701:15:1;;;26696:2;26681:18;;26674:43;54576:10:0::2;26733:18:1::0;;;26726:43;26805:15;;26800:2;26785:18;;26778:43;26852:3;26837:19;;26830:35;;;26654:3;26881:19;;26874:35;;;54483:182:0;;::::2;::::0;;;;26589:3:1;54483:182:0;;::::2;52931:1742;;;;;;45637:20:::1;45031:1:::0;46157:7;:22;45974:213;62962:2176;12060:19;:17;:19::i;:::-;45593:21:::1;:19;:21::i;:::-;63127:14:::2;63144:41;63153:8;63163:21;63144:8;:41::i;:::-;63127:58:::0;-1:-1:-1;63204:10:0::2;-1:-1:-1::0;;;;;63204:20:0;::::2;;63196:53;;;::::0;-1:-1:-1;;;63196:53:0;;27122:2:1;63196:53:0::2;::::0;::::2;27104:21:1::0;27161:2;27141:18;;;27134:30;-1:-1:-1;;;27180:18:1;;;27173:50;27240:18;;63196:53:0::2;26920:344:1::0;63196:53:0::2;63282:161;63319:10;63348:8;63375:21;63423:4;63282:18;:161::i;:::-;63260:230;;;::::0;-1:-1:-1;;;63260:230:0;;27471:2:1;63260:230:0::2;::::0;::::2;27453:21:1::0;27510:2;27490:18;;;27483:30;-1:-1:-1;;;27529:18:1;;;27522:49;27588:18;;63260:230:0::2;27269:343:1::0;63260:230:0::2;63502:21;63525:16:::0;63545:114:::2;63583:8;63606:21;63642:6;63545:23;:114::i;:::-;63501:158;;;;63670:71;63686:6;63694:13;63709:8;63719:21;63670:15;:71::i;:::-;63752:32;63787:122;63833:6;63854:8;63877:21;63787:31;:122::i;:::-;63752:157;;64230:20;64269:44;64291:21;64269;:44::i;:::-;:52;;64317:4;64269:52:::0;64265:442:::2;;64342:28:::0;;64338:203:::2;;64406:119;64451:8;64482:24;64406:22;:119::i;:::-;64391:134;;64338:203;64265:442;;;64588:107;64629:8;64656:24;64588:22;:107::i;:::-;64573:122;;64265:442;64721:16:::0;;64717:84:::2;;64754:35;64768:6;64776:12;64754:13;:35::i;:::-;64816:314;64857:8;64894:21;64937:6;64968:8;64999:13;65042:6;65071;65106:12;64816:314;;;;;;;;;;;;;:::i;30029:812::-:0;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;30160:35:::2;30198:29;30220:6;30198:21;:29::i;:::-;30260:33:::0;;;;-1:-1:-1;30260:33:0;;::::2;;;30238:110;;;::::0;-1:-1:-1;;;30238:110:0;;23940:2:1;30238:110:0::2;::::0;::::2;23922:21:1::0;23979:2;23959:18;;;23952:30;-1:-1:-1;;;23998:18:1;;;23991:53;24061:18;;30238:110:0::2;23738:347:1::0;30238:110:0::2;27770:6;30399:10;:20;;;30381:15;:38;;;;:::i;:::-;:85;30359:152;;;::::0;-1:-1:-1;;;30359:152:0;;28577:2:1;30359:152:0::2;::::0;::::2;28559:21:1::0;28616:2;28596:18;;;28589:30;-1:-1:-1;;;28635:18:1;;;28628:47;28692:18;;30359:152:0::2;28375:341:1::0;30359:152:0::2;30546:33:::0;;;;::::2;;;-1:-1:-1::0;;30590:37:0;;;;;;;-1:-1:-1;;30638:20:0;;::::2;:24:::0;;;;30678:155:::2;::::0;::::2;::::0;::::2;::::0;30737:6;;30678:155:::2;:::i;34956:267::-:0;14558:13;:11;:13::i;:::-;35042:36:::1;35064:13;35042:21;:36::i;:::-;-1:-1:-1::0;35089:15:0::1;:31:::0;;-1:-1:-1;;;;;;35089:31:0::1;-1:-1:-1::0;;;;;35089:31:0;::::1;::::0;;::::1;::::0;;;35151:15:::1;35131:17;:35:::0;35182:33:::1;::::0;1495:51:1;;;35182:33:0::1;::::0;1483:2:1;1468:18;35182:33:0::1;1319:233:1::0;19749:312:0;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19835:25:0;::::1;19827:52;;;::::0;-1:-1:-1;;;19827:52:0;;28923:2:1;19827:52:0::1;::::0;::::1;28905:21:1::0;28962:2;28942:18;;;28935:30;-1:-1:-1;;;28981:18:1;;;28974:44;29035:18;;19827:52:0::1;28721:338:1::0;19827:52:0::1;-1:-1:-1::0;;;;;19898:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;:30;19890:56:::1;;;::::0;-1:-1:-1;;;19890:56:0;;29266:2:1;19890:56:0::1;::::0;::::1;29248:21:1::0;29305:2;29285:18;;;29278:30;-1:-1:-1;;;29324:18:1;;;29317:43;29377:18;;19890:56:0::1;29064:337:1::0;19890:56:0::1;-1:-1:-1::0;;;;;19957:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;;19985:15:::1;19957:43:::0;;20016:37;;22027:51:1;;;20048:4:0::1;22094:18:1::0;;;22087:50;20016:37:0::1;::::0;22000:18:1;20016:37:0::1;21859:284:1::0;22770:181:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;22898:45:0::1;;::::0;;;:22:::1;:45;::::0;;;;22891:52;;-1:-1:-1;;22891:52:0::1;::::0;;22770:181::o;17745:232::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;17870:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;17863:50;;;;17929:40;;1495:51:1;;;17929:40:0::1;::::0;1468:18:1;17929:40:0::1;1319:233:1::0;15578:201:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;15667:22:0;::::1;15659:73;;;::::0;-1:-1:-1;;;15659:73:0;;29608:2:1;15659:73:0::1;::::0;::::1;29590:21:1::0;29647:2;29627:18;;;29620:30;29686:34;29666:18;;;29659:62;-1:-1:-1;;;29737:18:1;;;29730:36;29783:19;;15659:73:0::1;29406:402:1::0;15659:73:0::1;15743:28;15762:8;15743:18;:28::i;40885:535::-:0;14558:13;:11;:13::i;:::-;41017:16:::1;::::0;-1:-1:-1;;;;;41017:16:0::1;41009:39:::0;41001:63:::1;;;::::0;-1:-1:-1;;;41001:63:0;;30015:2:1;41001:63:0::1;::::0;::::1;29997:21:1::0;30054:2;30034:18;;;30027:30;-1:-1:-1;;;30073:18:1;;;30066:41;30124:18;;41001:63:0::1;29813:335:1::0;41001:63:0::1;41075:38;41154:14;41075:104;;41212:14;-1:-1:-1::0;;;;;41212:29:0::1;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;41212:118:0::1;41190:178;;;::::0;-1:-1:-1;;;41190:178:0;;30544:2:1;41190:178:0::1;::::0;::::1;30526:21:1::0;30583:2;30563:18;;;30556:30;-1:-1:-1;;;30602:18:1;;;30595:40;30652:18;;41190:178:0::1;30342:334:1::0;41190:178:0::1;41379:16;:33:::0;;-1:-1:-1;;;;;;41379:33:0::1;-1:-1:-1::0;;;;;41379:33:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;40885:535:0:o;57790:1878::-;12060:19;:17;:19::i;:::-;45593:21:::1;:19;:21::i;:::-;57974:9:::2;58002:12:::0;57994:39:::2;;;::::0;-1:-1:-1;;;57994:39:0;;30883:2:1;57994:39:0::2;::::0;::::2;30865:21:1::0;30922:2;30902:18;;;30895:30;-1:-1:-1;;;30941:18:1;;;30934:44;30995:18;;57994:39:0::2;30681:338:1::0;57994:39:0::2;58044:21;58086::::0;58127:31:::2;::::0;-1:-1:-1;;;58127:31:0;;::::2;::::0;::::2;160:25:1::0;;;58044:64:0;;-1:-1:-1;58170:1:0::2;::::0;-1:-1:-1;;;;;58127:21:0;::::2;::::0;::::2;::::0;133:18:1;;58127:31:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58127:45:0::2;::::0;58119:69:::2;;;::::0;-1:-1:-1;;;58119:69:0;;31482:2:1;58119:69:0::2;::::0;::::2;31464:21:1::0;31521:2;31501:18;;;31494:30;-1:-1:-1;;;31540:18:1;;;31533:41;31591:18;;58119:69:0::2;31280:335:1::0;58119:69:0::2;-1:-1:-1::0;;;;;58281:37:0;::::2;58258:20;58281:37:::0;;;:14:::2;:37;::::0;;;;;;;:47;;;;;;;;;58343:17;;58339:650:::2;;58377:27;58407:29:::0;;;:15:::2;:29;::::0;;;;58470:16:::2;::::0;::::2;::::0;58459:27;::::2;58451:53;;;::::0;-1:-1:-1;;;58451:53:0;;31822:2:1;58451:53:0::2;::::0;::::2;31804:21:1::0;31861:2;31841:18;;;31834:30;-1:-1:-1;;;31880:18:1;;;31873:43;31933:18;;58451:53:0::2;31620:337:1::0;58451:53:0::2;58539:17:::0;;;58593:16;;::::2;::::0;-1:-1:-1;;;;;58701:37:0;;::::2;58519:17;58701:37:::0;;;:14:::2;:37;::::0;;;;;;;:47;;;;;;;;58694:54;;;58770:29;;;:15:::2;:29:::0;;;;;58763:36;;-1:-1:-1;;;;;;58763:36:0::2;::::0;;;;::::2;::::0;;;;58831:14:::2;::::0;58539:17;;;::::2;::::0;58593:16;58831:28:::2;::::0;58593:16;;58831:28:::2;:::i;:::-;58814:14;:45:::0;58940:37:::2;58954:9:::0;58965:11;58940:13:::2;:37::i;:::-;58362:627;;;58339:650;58999:13;59015:15;:13;:15::i;:::-;59066:84;::::0;;;;::::2;::::0;;59098:10:::2;59066:84:::0;;::::2;::::0;;::::2;::::0;;;-1:-1:-1;59041:22:0;;;:15:::2;:22:::0;;;;;:109;;;;-1:-1:-1;;;;;;59041:109:0::2;-1:-1:-1::0;;;;;59041:109:0;;::::2;;::::0;;;;-1:-1:-1;59041:109:0;;::::2;::::0;;;;59161:37;::::2;::::0;;:14:::2;:37:::0;;;;;:47;;;;;;:55;;;59244:14:::2;::::0;59041:22;;-1:-1:-1;59244:25:0::2;::::0;59066:84;;59244:25:::2;:::i;:::-;59227:14;:42:::0;59502:158:::2;::::0;;32351:25:1;;;-1:-1:-1;;;;;32450:15:1;;32445:2;32430:18;;32423:43;32482:18;;;32475:34;;;32540:2;32525:18;;32518:34;;;59639:10:0::2;32583:3:1::0;32568:19;;32561:44;59502:158:0::2;::::0;32338:3:1;32323:19;59502:158:0::2;;;;;;;57944:1724;;;;45637:20:::1;45031:1:::0;46157:7;:22;45974:213;21244:309;-1:-1:-1;;;;;21383:25:0;;21341:4;21383:25;;;:12;:25;;;;;;21423:14;;;21419:59;;-1:-1:-1;21461:5:0;;21244:309;-1:-1:-1;;21244:309:0:o;21419:59::-;19026:6;21495:27;21513:9;21495:15;:27;:::i;:::-;:50;;21244:309;-1:-1:-1;;;21244:309:0:o;14837:132::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;14901:23;14893:68;;;;-1:-1:-1;;;14893:68:0;;32818:2:1;14893:68:0;;;32800:21:1;;;32837:18;;;32830:30;32896:34;32876:18;;;32869:62;32948:18;;14893:68:0;32616:356:1;17182:482:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;17312:30:0;::::1;::::0;17308:349:::1;;17586:1;17505:61;16573:6;17505:15;:61;:::i;:::-;:82;;;;:::i;:::-;-1:-1:-1::0;;;;;17442:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;;:145;;;;17607:38;1495:51:1;;;17607:38:0::1;::::0;1468:18:1;17607:38:0::1;1319:233:1::0;12614:108:0;12526:7;;;;12684:9;12676:38;;;;-1:-1:-1;;;12676:38:0;;33179:2:1;12676:38:0;;;33161:21:1;33218:2;33198:18;;;33191:30;-1:-1:-1;;;33237:18:1;;;33230:46;33293:18;;12676:38:0;32977:340:1;34360:445:0;34461:16;34557:20;-1:-1:-1;;;34557:89:0;;;;34659:19;34698:8;34659:48;;34749:12;34726:2;-1:-1:-1;;;;;34726:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;34718:59;;;;-1:-1:-1;;;34718:59:0;;33524:2:1;34718:59:0;;;33506:21:1;33563:2;33543:18;;;33536:30;-1:-1:-1;;;33582:18:1;;;33575:41;33633:18;;34718:59:0;33322:335:1;34718:59:0;34795:2;34360:445;-1:-1:-1;;;34360:445:0:o;13310:120::-;12319:16;:14;:16::i;:::-;13369:7:::1;:15:::0;;-1:-1:-1;;13369:15:0::1;::::0;;13400:22:::1;10648:10:::0;13409:12:::1;13400:22;::::0;-1:-1:-1;;;;;1513:32:1;;;1495:51;;1483:2;1468:18;13400:22:0::1;;;;;;;13310:120::o:0;45673:293::-;45075:1;45807:7;;:19;45799:63;;;;-1:-1:-1;;;45799:63:0;;33864:2:1;45799:63:0;;;33846:21:1;33903:2;33883:18;;;33876:30;33942:33;33922:18;;;33915:61;33993:18;;45799:63:0;33662:355:1;45799:63:0;45075:1;45940:7;:18;45673:293::o;23867:263::-;23984:7;;24051:21;24091:31;;-1:-1:-1;;;24091:31:0;;;;;160:25:1;;;24009:64:0;;-1:-1:-1;;;;;;24091:21:0;;;;;133:18:1;;24091:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24084:38;23867:263;-1:-1:-1;;;;23867:263:0:o;24277:529::-;24461:4;24520:21;-1:-1:-1;;;;;24630:25:0;;;;;;;;:97;;-1:-1:-1;24672:55:0;;-1:-1:-1;;;24672:55:0;;-1:-1:-1;;;;;34252:15:1;;;24672:55:0;;;34234:34:1;34304:15;;;34284:18;;;34277:43;24672:30:0;;;;;34169:18:1;;24672:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24630:167;;;-1:-1:-1;24744:35:0;;-1:-1:-1;;;24744:35:0;;;;;160:25:1;;;-1:-1:-1;;;;;24744:53:0;;;;:25;;;;;;133:18:1;;24744:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24744:53:0;;24630:167;24622:176;24277:529;-1:-1:-1;;;;;;24277:529:0:o;38727:163::-;-1:-1:-1;;;;;38838:34:0;;;;;:11;:34;;;;;;;;:44;;;;;;;;;38831:51;;-1:-1:-1;;;;;;38831:51:0;;;;;;;;;;;;38727:163::o;24953:316::-;25126:21;25168;25201:60;;-1:-1:-1;;;25201:60:0;;-1:-1:-1;;;;;34839:15:1;;;25201:60:0;;;34821:34:1;34891:15;;;34871:18;;;34864:43;34923:18;;;34916:34;;;25126:64:0;;-1:-1:-1;25201:30:0;;;;;;34756:18:1;;25201:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25115:154;24953:316;;;;:::o;61886:855::-;-1:-1:-1;;;;;62104:37:0;;62036:14;62104:37;;;:14;:37;;;;;;;;:47;;;;;;;;;62036:14;;62170:17;;;62162:36;;;;-1:-1:-1;;;62162:36:0;;20260:2:1;62162:36:0;;;20242:21:1;20299:1;20279:18;;;20272:29;-1:-1:-1;;;20317:18:1;;;20310:36;20363:18;;62162:36:0;20058:329:1;62162:36:0;62233:6;62217:12;:22;62209:52;;;;-1:-1:-1;;;62209:52:0;;20594:2:1;62209:52:0;;;20576:21:1;20633:2;20613:18;;;20606:30;-1:-1:-1;;;20652:18:1;;;20645:47;20709:18;;62209:52:0;20392:341:1;62209:52:0;62272:27;62302:29;;;:15;:29;;;;;;;;62351:17;;;62390:16;;;;-1:-1:-1;;;;;62481:37:0;;;;;:14;:37;;;;;:47;;;;;;;;62474:54;;;62546:29;;;;;;;62539:36;;-1:-1:-1;;;;;;62539:36:0;;;;;;;62603:14;;62351:17;;;-1:-1:-1;62390:16:0;;-1:-1:-1;62302:29:0;62603:25;;62390:16;;62603:25;:::i;:::-;62586:14;:42;62641:56;62665:8;62675:21;62641:23;:56::i;:::-;62708:25;;61886:855;;;;;;:::o;18486:358::-;-1:-1:-1;;;;;18642:43:0;;18597:4;18642:43;;;:25;:43;;;;;;18704:16;18696:63;;;;-1:-1:-1;;;18696:63:0;;35163:2:1;18696:63:0;;;35145:21:1;35202:2;35182:18;;;35175:30;35241:34;35221:18;;;35214:62;-1:-1:-1;;;35292:18:1;;;35285:32;35334:19;;18696:63:0;34961:398:1;41607:389:0;41687:9;41702:10;-1:-1:-1;;;;;41702:15:0;41725:6;41738:4;41702:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41686:61;;;41763:4;41758:231;;41818:16;;-1:-1:-1;;;;;41818:16:0;41784:131;;;;-1:-1:-1;;;41784:131:0;;35776:2:1;41784:131:0;;;35758:21:1;35815:2;35795:18;;;35788:30;35854:32;35834:18;;;35827:60;35904:18;;41784:131:0;35574:354:1;41784:131:0;41930:16;;:47;;-1:-1:-1;;;41930:47:0;;-1:-1:-1;;;;;1513:32:1;;;41930:47:0;;;1495:51:1;41930:16:0;;;;:20;;41958:6;;1468:18:1;;41930:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41675:321;41607:389;;:::o;38441:222::-;38545:44;38557:8;38567:21;38545:11;:44::i;:::-;38605:50;;;15656:25:1;;;-1:-1:-1;;;;;15717:32:1;;15712:2;15697:18;;15690:60;38605:50:0;;15629:18:1;38605:50:0;15482:274:1;13051:118:0;12060:19;:17;:19::i;:::-;13111:7:::1;:14:::0;;-1:-1:-1;;13111:14:0::1;13121:4;13111:14;::::0;;13141:20:::1;13148:12;10648:10:::0;;10568:98;33884:468;33988:18;-1:-1:-1;;;;;34032:27:0;;34024:57;;;;-1:-1:-1;;;34024:57:0;;36135:2:1;34024:57:0;;;36117:21:1;36174:2;36154:18;;;36147:30;-1:-1:-1;;;36193:18:1;;;36186:47;36250:18;;34024:57:0;35933:341:1;34024:57:0;34092:18;-1:-1:-1;;;34092:87:0;;;;34192:24;34238:13;34192:60;;34297:10;34271:5;-1:-1:-1;;;;;34271:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;34263:58;;;;-1:-1:-1;;;34263:58:0;;36481:2:1;34263:58:0;;;36463:21:1;36520:1;36500:18;;;36493:29;-1:-1:-1;;;36538:18:1;;;36531:39;36587:18;;34263:58:0;36279:332:1;20460:342:0;-1:-1:-1;;;;;20544:25:0;;20536:45;;;;-1:-1:-1;;;20536:45:0;;36818:2:1;20536:45:0;;;36800:21:1;36857:1;36837:18;;;36830:29;-1:-1:-1;;;36875:18:1;;;36868:37;36922:18;;20536:45:0;36616:330:1;20536:45:0;20740:1;20699:38;19026:6;20699:15;:38;:::i;:::-;:42;;;;:::i;:::-;-1:-1:-1;;;;;20671:25:0;;;;;;:12;:25;;;;;;;;;:70;;;;20757:37;;22027:51:1;;;20789:4:0;22094:18:1;;;22087:50;;;;20757:37:0;;22000:18:1;20757:37:0;21859:284:1;28212:446:0;28316:24;;28409:23;28399:6;:33;;;;;;;;:::i;:::-;;28395:237;;-1:-1:-1;28453:14:0;28395:237;;;28499:25;28489:6;:35;;;;;;;;:::i;:::-;;28485:147;;-1:-1:-1;28545:16:0;28485:147;;;-1:-1:-1;28598:22:0;28649:1;28212:446;-1:-1:-1;;28212:446:0:o;42697:544::-;42826:7;42846:14;42863:41;42872:8;42882:21;42863:8;:41::i;:::-;42846:58;-1:-1:-1;42923:10:0;-1:-1:-1;;;;;42923:20:0;;;42915:53;;;;-1:-1:-1;;;42915:53:0;;27122:2:1;42915:53:0;;;27104:21:1;27161:2;27141:18;;;27134:30;-1:-1:-1;;;27180:18:1;;;27173:50;27240:18;;42915:53:0;26920:344:1;42915:53:0;43001:161;43038:10;43067:8;43094:21;43142:4;43001:18;:161::i;:::-;42979:230;;;;-1:-1:-1;;;42979:230:0;;27471:2:1;42979:230:0;;;27453:21:1;27510:2;27490:18;;;27483:30;-1:-1:-1;;;27529:18:1;;;27522:49;27588:18;;42979:230:0;27269:343:1;49571:1787:0;49735:7;49851:44;49873:21;49851;:44::i;:::-;:53;;49899:5;49851:53;49847:414;;49971:12;;:90;;-1:-1:-1;;;49971:90:0;;;;;15656:25:1;;;-1:-1:-1;;;;;15717:32:1;;;15697:18;;;15690:60;49922:23:0;;;;49971:12;;;:57;;15629:18:1;;49971:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49921:140;;-1:-1:-1;49921:140:0;-1:-1:-1;50135:1:0;50100:32;49921:140;;50100:32;:::i;:::-;:36;;;:149;;50216:22;:33;;;50100:149;;;50160:32;50179:13;50160:16;:32;:::i;:::-;50076:173;;;;;;;;49847:414;50271:22;50296:85;50326:8;50349:21;50296:15;:85::i;:::-;50271:110;;50393:15;50410:17;50429:14;50447:91;50477:14;50506:21;50447:15;:91::i;:::-;50392:146;;;;;;50549:28;50603:7;-1:-1:-1;;;;;50592:18:0;:7;-1:-1:-1;;;;;50592:18:0;;50588:725;;50709:20;;;50725:4;50709:20;50705:440;;-1:-1:-1;50773:1:0;50588:725;;50705:440;50841:12;;:137;;-1:-1:-1;;;50841:137:0;;;;;15656:25:1;;;-1:-1:-1;;;;;15717:32:1;;;15697:18;;;15690:60;50815:23:0;;50841:12;;:37;;15629:18:1;;50841:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50815:163;;51039:1;51020:16;:20;;;:109;;51104:14;:25;;;51020:109;;;51064:16;51020:109;50997:132;;;;50796:349;50588:725;;;51264:16;:27;:37;;51294:7;;51264:27;;:37;:::i;:::-;51241:60;;;;50588:725;51330:20;49571:1787;-1:-1:-1;;;;;;;;49571:1787:0:o;40119:718::-;40416:15;;;;40303:7;;40450:23;;;;40442:43;;;;-1:-1:-1;;;40442:43:0;;37966:2:1;40442:43:0;;;37948:21:1;38005:1;37985:18;;;37978:29;-1:-1:-1;;;38023:18:1;;;38016:37;38070:18;;40442:43:0;37764:330:1;40442:43:0;40586:44;40598:8;40608:21;40586:11;:44::i;:::-;40641:21;40665:22;40682:5;40665:14;:22;:::i;:::-;40641:46;-1:-1:-1;;40824:5:0;40119:718;-1:-1:-1;;;;;40119:718:0:o;23063:248::-;23175:4;;-1:-1:-1;;;;;23217:45:0;;;;;;:22;:45;;;;;;;;:86;;;;;;;;:::i;:::-;;;;23063:248;-1:-1:-1;;23063:248:0:o;30951:272::-;31084:7;28198:5;31139:41;31156:24;28198:5;31139:41;:::i;:::-;31125:57;;:9;:57;:::i;:::-;31124:91;;;;:::i;15939:191::-;16013:16;16032:6;;-1:-1:-1;;;;;16049:17:0;;;-1:-1:-1;;;;;;16049:17:0;;;;;;16082:40;;16032:6;;;;;;;16082:40;;16013:16;16082:40;16002:128;15939:191;:::o;67110:132::-;67152:7;67172:23;:11;47277:19;;47295:1;47277:19;;;47188:127;67172:23;-1:-1:-1;67213:11:0;47158:14;;67110:132::o;12799:108::-;12526:7;;;;12858:41;;;;-1:-1:-1;;;12858:41:0;;38696:2:1;12858:41:0;;;38678:21:1;38735:2;38715:18;;;38708:30;-1:-1:-1;;;38754:18:1;;;38747:50;38814:18;;12858:41:0;38494:344:1;39272:337:0;-1:-1:-1;;;;;39431:34:0;;39399:29;39431:34;;;:11;:34;;;;;;;;:68;;;;;;;;39127:16;;;;:20;39510:92;;39546:44;39558:8;39568:21;39546:11;:44::i;26399:861::-;-1:-1:-1;;;;;26569:37:0;;26515:15;26569:37;;;:22;:37;;;;;;;;;26621:5;:35;;;;;;;;:::i;:::-;;26617:636;;26830:46;;-1:-1:-1;;;26830:46:0;;;;;160:25:1;;;26767:13:0;;-1:-1:-1;;;;;26830:36:0;;;;;133:18:1;;26830:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26814:62;-1:-1:-1;26617:636:0;;-1:-1:-1;;;26617:636:0;;26907:26;26898:5;:35;;;;;;;;:::i;:::-;;26894:359;;27105:46;;-1:-1:-1;;;27105:46:0;;;;;160:25:1;;;27044:13:0;;-1:-1:-1;;;;;27105:36:0;;;;;133:18:1;;27105:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27091:60;-1:-1:-1;26894:359:0;;-1:-1:-1;;26894:359:0;;27191:50;;-1:-1:-1;;;27191:50:0;;-1:-1:-1;;;;;1513:32:1;;27191:50:0;;;1495:51:1;1468:18;;27191:50:0;1319:233:1;26894:359:0;26537:723;26399:861;;;;:::o;25277:1114::-;-1:-1:-1;;;;;25539:37:0;;25414:15;25539:37;;;:22;:37;;;;;;25414:15;;;;25539:37;;;25591:5;:35;;;;;;;;:::i;:::-;;25587:797;;25806:78;;-1:-1:-1;;;25806:78:0;;;;;160:25:1;;;25737:13:0;;-1:-1:-1;;;;;25806:29:0;;;;;133:18:1;;25806:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25806:78:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25944:17:0;;25784:100;;-1:-1:-1;25914:5:0;;-1:-1:-1;25944:17:0;;;;;;-1:-1:-1;25587:797:0;;-1:-1:-1;;;;;25587:797:0;;25992:26;25983:5;:35;;;;;;;;:::i;:::-;;25979:405;;26211:71;;-1:-1:-1;;;26211:71:0;;;;;160:25:1;;;26129:13:0;;-1:-1:-1;;;;;26211:54:0;;;;;133:18:1;;26211:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26176:106;;-1:-1:-1;26176:106:0;-1:-1:-1;26176:106:0;-1:-1:-1;25979:405:0;;-1:-1:-1;25979:405:0;;26322:50;;-1:-1:-1;;;26322:50:0;;-1:-1:-1;;;;;1513:32:1;;26322:50:0;;;1495:51:1;1468:18;;26322:50:0;1319:233:1;196:131;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;332:247;391:6;444:2;432:9;423:7;419:23;415:32;412:52;;;460:1;457;450:12;412:52;499:9;486:23;518:31;543:5;518:31;:::i;584:117::-;669:6;662:5;658:18;651:5;648:29;638:57;;691:1;688;681:12;706:245;764:6;817:2;805:9;796:7;792:23;788:32;785:52;;;833:1;830;823:12;785:52;872:9;859:23;891:30;915:5;891:30;:::i;1557:315::-;1625:6;1633;1686:2;1674:9;1665:7;1661:23;1657:32;1654:52;;;1702:1;1699;1692:12;1654:52;1738:9;1725:23;1715:33;;1798:2;1787:9;1783:18;1770:32;1811:31;1836:5;1811:31;:::i;:::-;1861:5;1851:15;;;1557:315;;;;;:::o;1877:127::-;1938:10;1933:3;1929:20;1926:1;1919:31;1969:4;1966:1;1959:15;1993:4;1990:1;1983:15;2009:253;2081:2;2075:9;2123:4;2111:17;;2158:18;2143:34;;2179:22;;;2140:62;2137:88;;;2205:18;;:::i;:::-;2241:2;2234:22;2009:253;:::o;2267:275::-;2338:2;2332:9;2403:2;2384:13;;-1:-1:-1;;2380:27:1;2368:40;;2438:18;2423:34;;2459:22;;;2420:62;2417:88;;;2485:18;;:::i;:::-;2521:2;2514:22;2267:275;;-1:-1:-1;2267:275:1:o;2547:201::-;2625:4;2658:18;2650:6;2647:30;2644:56;;;2680:18;;:::i;:::-;-1:-1:-1;2725:1:1;2721:14;2737:4;2717:25;;2547:201::o;2753:118::-;2839:5;2832:13;2825:21;2818:5;2815:32;2805:60;;2861:1;2858;2851:12;2876:1557;2996:6;3027:2;3070;3058:9;3049:7;3045:23;3041:32;3038:52;;;3086:1;3083;3076:12;3038:52;3126:9;3113:23;3159:18;3151:6;3148:30;3145:50;;;3191:1;3188;3181:12;3145:50;3214:22;;3267:4;3259:13;;3255:27;-1:-1:-1;3245:55:1;;3296:1;3293;3286:12;3245:55;3332:2;3319:16;3355:78;3371:61;3429:2;3371:61;:::i;:::-;3355:78;:::i;:::-;3467:15;;;3549:1;3545:10;;;;3537:19;;3533:28;;;3498:12;;;;3573:19;;;3570:39;;;3605:1;3602;3595:12;3570:39;3629:11;;;;3649:754;3665:6;3660:3;3657:15;3649:754;;;3747:4;3741:3;3732:7;3728:17;3724:28;3721:118;;;3793:1;3822:2;3818;3811:14;3721:118;3865:22;;:::i;:::-;3928:3;3915:17;3945:33;3970:7;3945:33;:::i;:::-;3991:22;;4062:12;;;4049:26;4033:14;;;4026:50;4099:2;4150:12;;;4137:26;4121:14;;;4114:50;4187:2;4230:12;;;4217:26;4256:30;4217:26;4256:30;:::i;:::-;4306:14;;;4299:31;4343:18;;3691:4;3682:14;;;;;4381:12;;;;3649:754;;;4422:5;2876:1557;-1:-1:-1;;;;;;;2876:1557:1:o;5704:383::-;5781:6;5789;5797;5850:2;5838:9;5829:7;5825:23;5821:32;5818:52;;;5866:1;5863;5856:12;5818:52;5902:9;5889:23;5879:33;;5962:2;5951:9;5947:18;5934:32;5975:31;6000:5;5975:31;:::i;:::-;5704:383;;6025:5;;-1:-1:-1;;;6077:2:1;6062:18;;;;6049:32;;5704:383::o;7221:1550::-;7334:6;7365:2;7408;7396:9;7387:7;7383:23;7379:32;7376:52;;;7424:1;7421;7414:12;7376:52;7464:9;7451:23;7497:18;7489:6;7486:30;7483:50;;;7529:1;7526;7519:12;7483:50;7552:22;;7605:4;7597:13;;7593:27;-1:-1:-1;7583:55:1;;7634:1;7631;7624:12;7583:55;7670:2;7657:16;7693:78;7709:61;7767:2;7709:61;:::i;7693:78::-;7805:15;;;7887:1;7883:10;;;;7875:19;;7871:28;;;7836:12;;;;7911:19;;;7908:39;;;7943:1;7940;7933:12;7908:39;7967:11;;;;7987:754;8003:6;7998:3;7995:15;7987:754;;;8085:4;8079:3;8070:7;8066:17;8062:28;8059:118;;;8131:1;8160:2;8156;8149:14;8059:118;8203:22;;:::i;:::-;8265:3;8252:17;8245:5;8238:32;8328:2;8323:3;8319:12;8306:26;8301:2;8294:5;8290:14;8283:50;8356:2;8408;8403:3;8399:12;8386:26;8425:30;8447:7;8425:30;:::i;:::-;8475:14;;;8468:31;8522:2;8565:12;;;8552:26;8591:33;8552:26;8591:33;:::i;:::-;8644:14;;;8637:31;8681:18;;8029:4;8020:14;;;;;8719:12;;;;7987:754;;8776:155;8856:20;;8905:1;8895:12;;8885:40;;8921:1;8918;8911:12;8885:40;8776:155;;;:::o;8936:217::-;9014:6;9067:2;9055:9;9046:7;9042:23;9038:32;9035:52;;;9083:1;9080;9073:12;9035:52;9106:41;9137:9;9106:41;:::i;9158:350::-;9244:6;9252;9305:2;9293:9;9284:7;9280:23;9276:32;9273:52;;;9321:1;9318;9311:12;9273:52;9360:9;9347:23;9379:30;9403:5;9379:30;:::i;:::-;9428:5;-1:-1:-1;9452:50:1;9498:2;9483:18;;9452:50;:::i;:::-;9442:60;;9158:350;;;;;:::o;9513:315::-;9581:6;9589;9642:2;9630:9;9621:7;9617:23;9613:32;9610:52;;;9658:1;9655;9648:12;9610:52;9697:9;9684:23;9716:31;9741:5;9716:31;:::i;:::-;9766:5;9818:2;9803:18;;;;9790:32;;-1:-1:-1;;;9513:315:1:o;10265:519::-;10348:6;10356;10364;10372;10425:3;10413:9;10404:7;10400:23;10396:33;10393:53;;;10442:1;10439;10432:12;10393:53;10478:9;10465:23;10455:33;;10538:2;10527:9;10523:18;10510:32;10551:31;10576:5;10551:31;:::i;:::-;10601:5;-1:-1:-1;10653:2:1;10638:18;;10625:32;;-1:-1:-1;10709:2:1;10694:18;;10681:32;10722:30;10681:32;10722:30;:::i;:::-;10265:519;;;;-1:-1:-1;10265:519:1;;-1:-1:-1;;10265:519:1:o;10789:413::-;10873:6;10881;10934:2;10922:9;10913:7;10909:23;10905:32;10902:52;;;10950:1;10947;10940:12;10902:52;10989:9;10976:23;11008:31;11033:5;11008:31;:::i;:::-;11058:5;-1:-1:-1;11115:2:1;11100:18;;11087:32;11150:1;11138:14;;11128:42;;11166:1;11163;11156:12;11207:127;11268:10;11263:3;11259:20;11256:1;11249:31;11299:4;11296:1;11289:15;11323:4;11320:1;11313:15;11339:247;11487:2;11472:18;;11520:1;11509:13;;11499:47;;11526:18;;:::i;:::-;11555:25;;;11339:247;:::o;12882:127::-;12943:10;12938:3;12934:20;12931:1;12924:31;12974:4;12971:1;12964:15;12998:4;12995:1;12988:15;13014:128;13081:9;;;13102:11;;;13099:37;;;13116:18;;:::i;13479:345::-;13681:2;13663:21;;;13720:2;13700:18;;;13693:30;-1:-1:-1;;;13754:2:1;13739:18;;13732:51;13815:2;13800:18;;13479:345::o;14970:127::-;15031:10;15026:3;15022:20;15019:1;15012:31;15062:4;15059:1;15052:15;15086:4;15083:1;15076:15;15761:761;16112:25;;;-1:-1:-1;;;;;16211:15:1;;;16206:2;16191:18;;16184:43;16258:2;16243:18;;16236:34;;;;16301:2;16286:18;;16279:34;;;;16350:15;;;16344:3;16329:19;;16322:44;16403:15;;16164:3;16382:19;;16375:44;16456:15;;;16450:3;16435:19;;16428:44;16503:3;16488:19;;16481:35;16099:3;16084:19;;15761:761::o;16527:135::-;16566:3;16587:17;;;16584:43;;16607:18;;:::i;:::-;-1:-1:-1;16654:1:1;16643:13;;16527:135::o;16667:336::-;16869:2;16851:21;;;16908:2;16888:18;;;16881:30;-1:-1:-1;;;16942:2:1;16927:18;;16920:42;16994:2;16979:18;;16667:336::o;17338:273::-;17406:6;17459:2;17447:9;17438:7;17434:23;17430:32;17427:52;;;17475:1;17472;17465:12;17427:52;17507:9;17501:16;17557:4;17550:5;17546:16;17539:5;17536:27;17526:55;;17577:1;17574;17567:12;17957:250;18042:1;18052:113;18066:6;18063:1;18060:13;18052:113;;;18142:11;;;18136:18;18123:11;;;18116:39;18088:2;18081:10;18052:113;;;-1:-1:-1;;18199:1:1;18181:16;;18174:27;17957:250::o;18212:510::-;18266:5;18319:3;18312:4;18304:6;18300:17;18296:27;18286:55;;18337:1;18334;18327:12;18286:55;18366:6;18360:13;18392:18;18388:2;18385:26;18382:52;;;18414:18;;:::i;:::-;18458:55;18501:2;18482:13;;-1:-1:-1;;18478:27:1;18507:4;18474:38;18458:55;:::i;:::-;18538:2;18529:7;18522:19;18584:3;18577:4;18572:2;18564:6;18560:15;18556:26;18553:35;18550:55;;;18601:1;18598;18591:12;18550:55;18614:77;18688:2;18681:4;18672:7;18668:18;18661:4;18653:6;18649:17;18614:77;:::i;18727:337::-;18807:6;18860:2;18848:9;18839:7;18835:23;18831:32;18828:52;;;18876:1;18873;18866:12;18828:52;18909:9;18903:16;18942:18;18934:6;18931:30;18928:50;;;18974:1;18971;18964:12;18928:50;18997:61;19050:7;19041:6;19030:9;19026:22;18997:61;:::i;19069:289::-;19200:3;19238:6;19232:13;19254:66;19313:6;19308:3;19301:4;19293:6;19289:17;19254:66;:::i;:::-;19336:16;;;;;19069:289;-1:-1:-1;;19069:289:1:o;21524:330::-;21726:2;21708:21;;;21765:1;21745:18;;;21738:29;-1:-1:-1;;;21798:2:1;21783:18;;21776:37;21845:2;21830:18;;21524:330::o;22849:201::-;22887:3;22915:10;22960:2;22953:5;22949:14;22987:2;22978:7;22975:15;22972:41;;22993:18;;:::i;:::-;23042:1;23029:15;;22849:201;-1:-1:-1;;;22849:201:1:o;24090:413::-;24289:2;24274:18;;24322:1;24311:13;;24301:47;;24328:18;;:::i;:::-;24357:25;;;24430:6;24418:19;;;;24413:2;24398:18;;24391:47;24481:14;24474:22;24469:2;24454:18;;;24447:50;24090:413;:::o;30153:184::-;30223:6;30276:2;30264:9;30255:7;30251:23;30247:32;30244:52;;;30292:1;30289;30282:12;30244:52;-1:-1:-1;30315:16:1;;30153:184;-1:-1:-1;30153:184:1:o;31024:251::-;31094:6;31147:2;31135:9;31126:7;31122:23;31118:32;31115:52;;;31163:1;31160;31153:12;31115:52;31195:9;31189:16;31214:31;31239:5;31214:31;:::i;31962:125::-;32027:9;;;32048:10;;;32045:36;;;32061:18;;:::i;34331:245::-;34398:6;34451:2;34439:9;34430:7;34426:23;34422:32;34419:52;;;34467:1;34464;34457:12;34419:52;34499:9;34493:16;34518:28;34540:5;34518:28;:::i;36951:381::-;37028:6;37036;37089:2;37077:9;37068:7;37064:23;37060:32;37057:52;;;37105:1;37102;37095:12;37057:52;37137:9;37131:16;37156:30;37180:5;37156:30;:::i;:::-;37255:2;37240:18;;37234:25;37205:5;;-1:-1:-1;37268:32:1;37234:25;37268:32;:::i;37337:168::-;37404:6;37430:10;;;37442;;;37426:27;;37465:11;;;37462:37;;;37479:18;;:::i;37510:249::-;37579:6;37632:2;37620:9;37611:7;37607:23;37603:32;37600:52;;;37648:1;37645;37638:12;37600:52;37680:9;37674:16;37699:30;37723:5;37699:30;:::i;38099:168::-;38139:7;38205:1;38201;38197:6;38193:14;38190:1;38187:21;38182:1;38175:9;38168:17;38164:45;38161:71;;;38212:18;;:::i;:::-;-1:-1:-1;38252:9:1;;38099:168::o;38272:217::-;38312:1;38338;38328:132;;38382:10;38377:3;38373:20;38370:1;38363:31;38417:4;38414:1;38407:15;38445:4;38442:1;38435:15;38328:132;-1:-1:-1;38474:9:1;;38272:217::o;38843:167::-;38921:13;;38974:10;38963:22;;38953:33;;38943:61;;39000:1;38997;38990:12;39015:328;39102:6;39110;39118;39171:2;39159:9;39150:7;39146:23;39142:32;39139:52;;;39187:1;39184;39177:12;39139:52;39216:9;39210:16;39200:26;;39245:48;39289:2;39278:9;39274:18;39245:48;:::i;:::-;39235:58;;39333:2;39322:9;39318:18;39312:25;39302:35;;39015:328;;;;;:::o;39348:267::-;39426:6;39434;39487:2;39475:9;39466:7;39462:23;39458:32;39455:52;;;39503:1;39500;39493:12;39455:52;39526:39;39555:9;39526:39;:::i;:::-;39516:49;;39605:2;39594:9;39590:18;39584:25;39574:35;;39348:267;;;;;:::o;39620:756::-;39743:6;39751;39759;39767;39775;39783;39836:3;39824:9;39815:7;39811:23;39807:33;39804:53;;;39853:1;39850;39843:12;39804:53;39882:9;39876:16;39866:26;;39911:48;39955:2;39944:9;39940:18;39911:48;:::i;:::-;39901:58;;39978:48;40022:2;40011:9;40007:18;39978:48;:::i;:::-;39968:58;;40066:2;40055:9;40051:18;40045:25;40035:35;;40113:3;40102:9;40098:19;40092:26;40127:31;40152:5;40127:31;:::i;:::-;40226:3;40211:19;;40205:26;40177:5;;-1:-1:-1;40254:18:1;40243:30;;40240:50;;;40286:1;40283;40276:12;40240:50;40309:61;40362:7;40353:6;40342:9;40338:22;40309:61;:::i;:::-;40299:71;;;39620:756;;;;;;;;:::o;40381:511::-;40465:6;40473;40481;40534:2;40522:9;40513:7;40509:23;40505:32;40502:52;;;40550:1;40547;40540:12;40502:52;40582:9;40576:16;40601:31;40626:5;40601:31;:::i;:::-;40701:2;40686:18;;40680:25;40651:5;;-1:-1:-1;40714:30:1;40680:25;40714:30;:::i;:::-;40815:2;40800:18;;40794:25;40763:7;;-1:-1:-1;40828:32:1;40794:25;40828:32;:::i;:::-;40879:7;40869:17;;;40381:511;;;;;:::o

Swarm Source

ipfs://d7c38cbad5ad17b49ea6948f1562d9edb92c34b863a5a6774ff9592c3b4a1066

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  ]
[ 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.