ETH Price: $3,396.90 (+1.79%)
Gas: 6 Gwei

Contract

0x53Fac57Dc8DC816008070822Ab50F44c00E6EEaE
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy Now201279102024-06-19 19:35:3526 days ago1718825735IN
0x53Fac57D...c00E6EEaE
0.52 ETH0.001109468.66450342
Buy Now198848442024-05-16 20:12:3560 days ago1715890355IN
0x53Fac57D...c00E6EEaE
1 ETH0.000435734.35276554
Buy Now198848352024-05-16 20:10:4760 days ago1715890247IN
0x53Fac57D...c00E6EEaE
1 ETH0.000483334.82831397
Buy Now198845382024-05-16 19:11:1160 days ago1715886671IN
0x53Fac57D...c00E6EEaE
1 ETH0.000665825.68084625
Buy Now197918052024-05-03 19:54:3573 days ago1714766075IN
0x53Fac57D...c00E6EEaE
0.3 ETH0.000562445.06947761
Buy Now197284672024-04-24 23:20:2382 days ago1714000823IN
0x53Fac57D...c00E6EEaE
10 ETH0.001013538.46816738
Buy Now197260672024-04-24 15:17:1182 days ago1713971831IN
0x53Fac57D...c00E6EEaE
10 ETH0.0022204118.55171124
Buy Now197257412024-04-24 14:10:2382 days ago1713967823IN
0x53Fac57D...c00E6EEaE
10 ETH0.0035694229.82277263
Buy Now197244512024-04-24 9:49:3583 days ago1713952175IN
0x53Fac57D...c00E6EEaE
1.5 ETH0.001456213.42782422
Buy Now197244502024-04-24 9:49:2383 days ago1713952163IN
0x53Fac57D...c00E6EEaE
1.5 ETH0.0014523213.39199448
Buy Now197244472024-04-24 9:48:4783 days ago1713952127IN
0x53Fac57D...c00E6EEaE
1.5 ETH0.0015070112.00356766
Buy Now197192942024-04-23 16:30:2383 days ago1713889823IN
0x53Fac57D...c00E6EEaE
1.5 ETH0.0021032316.75257415
Buy Now196627142024-04-15 18:31:4791 days ago1713205907IN
0x53Fac57D...c00E6EEaE
1.5 ETH0.0026016823.99042369
Transfer Ownersh...196315042024-04-11 9:31:3596 days ago1712827895IN
0x53Fac57D...c00E6EEaE
0 ETH0.0006039620.80549984
Set Beneficiary196314592024-04-11 9:22:3596 days ago1712827355IN
0x53Fac57D...c00E6EEaE
0 ETH0.0006108921.03492778
Schedule196185422024-04-09 14:00:3597 days ago1712671235IN
0x53Fac57D...c00E6EEaE
0 ETH0.0034188447.46688133
Buy Now187786212023-12-13 17:05:11215 days ago1702487111IN
0x53Fac57D...c00E6EEaE
10 ETH0.0069148254.87214314
Settle Auction184866412023-11-02 20:01:47256 days ago1698955307IN
0x53Fac57D...c00E6EEaE
0 ETH0.0036928435.66692218
Buy Now184865732023-11-02 19:48:11256 days ago1698954491IN
0x53Fac57D...c00E6EEaE
10 ETH0.0031613425.08666372
Bid184803292023-11-01 22:46:47257 days ago1698878807IN
0x53Fac57D...c00E6EEaE
22 ETH0.001818637.69137693
Bid184794342023-11-01 19:46:47257 days ago1698868007IN
0x53Fac57D...c00E6EEaE
20 ETH0.0022626938.44001443
Buy Now184786242023-11-01 17:03:59257 days ago1698858239IN
0x53Fac57D...c00E6EEaE
10 ETH0.0101306280.39097737
Buy Now184786072023-11-01 17:00:35257 days ago1698858035IN
0x53Fac57D...c00E6EEaE
10 ETH0.0048054838.13359049
Change Split Mul...184775502023-11-01 13:28:23257 days ago1698845303IN
0x53Fac57D...c00E6EEaE
0 ETH0.0045687938.4459042
Schedule Multipl...184710802023-10-31 15:43:59258 days ago1698767039IN
0x53Fac57D...c00E6EEaE
0 ETH0.022885934.55728867
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
201279102024-06-19 19:35:3526 days ago1718825735
0x53Fac57D...c00E6EEaE
0.13 ETH
201279102024-06-19 19:35:3526 days ago1718825735
0x53Fac57D...c00E6EEaE
0.39 ETH
198848442024-05-16 20:12:3560 days ago1715890355
0x53Fac57D...c00E6EEaE
0.25 ETH
198848442024-05-16 20:12:3560 days ago1715890355
0x53Fac57D...c00E6EEaE
0.75 ETH
198848352024-05-16 20:10:4760 days ago1715890247
0x53Fac57D...c00E6EEaE
0.25 ETH
198848352024-05-16 20:10:4760 days ago1715890247
0x53Fac57D...c00E6EEaE
0.75 ETH
198845382024-05-16 19:11:1160 days ago1715886671
0x53Fac57D...c00E6EEaE
0.25 ETH
198845382024-05-16 19:11:1160 days ago1715886671
0x53Fac57D...c00E6EEaE
0.75 ETH
197918052024-05-03 19:54:3573 days ago1714766075
0x53Fac57D...c00E6EEaE
0.075 ETH
197918052024-05-03 19:54:3573 days ago1714766075
0x53Fac57D...c00E6EEaE
0.225 ETH
197284672024-04-24 23:20:2382 days ago1714000823
0x53Fac57D...c00E6EEaE
2 ETH
197284672024-04-24 23:20:2382 days ago1714000823
0x53Fac57D...c00E6EEaE
8 ETH
197260672024-04-24 15:17:1182 days ago1713971831
0x53Fac57D...c00E6EEaE
2 ETH
197260672024-04-24 15:17:1182 days ago1713971831
0x53Fac57D...c00E6EEaE
8 ETH
197257412024-04-24 14:10:2382 days ago1713967823
0x53Fac57D...c00E6EEaE
2 ETH
197257412024-04-24 14:10:2382 days ago1713967823
0x53Fac57D...c00E6EEaE
8 ETH
197244512024-04-24 9:49:3583 days ago1713952175
0x53Fac57D...c00E6EEaE
0.375 ETH
197244512024-04-24 9:49:3583 days ago1713952175
0x53Fac57D...c00E6EEaE
1.125 ETH
197244502024-04-24 9:49:2383 days ago1713952163
0x53Fac57D...c00E6EEaE
0.375 ETH
197244502024-04-24 9:49:2383 days ago1713952163
0x53Fac57D...c00E6EEaE
1.125 ETH
197244472024-04-24 9:48:4783 days ago1713952127
0x53Fac57D...c00E6EEaE
0.375 ETH
197244472024-04-24 9:48:4783 days ago1713952127
0x53Fac57D...c00E6EEaE
1.125 ETH
197192942024-04-23 16:30:2383 days ago1713889823
0x53Fac57D...c00E6EEaE
0.375 ETH
197192942024-04-23 16:30:2383 days ago1713889823
0x53Fac57D...c00E6EEaE
1.125 ETH
196627142024-04-15 18:31:4791 days ago1713205907
0x53Fac57D...c00E6EEaE
0.375 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ArtMarketplace

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion, MIT license
File 1 of 1 : ArtMarketplace.sol
// File: contracts/libs/SafeTransferLib.sol


pragma solidity >=0.8.4;

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
///
/// @dev Note:
/// - For ETH transfers, please use `forceSafeTransferETH` for gas griefing protection.
/// - For ERC20s, this implementation won't check that a token has code,
/// responsibility is delegated to the caller.
library SafeTransferLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ETH transfer has failed.
    error ETHTransferFailed();

    /// @dev The ERC20 `transferFrom` has failed.
    error TransferFromFailed();

    /// @dev The ERC20 `transfer` has failed.
    error TransferFailed();

    /// @dev The ERC20 `approve` has failed.
    error ApproveFailed();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Suggested gas stipend for contract receiving ETH
    /// that disallows any storage writes.
    uint256 internal constant _GAS_STIPEND_NO_STORAGE_WRITES = 2300;

    /// @dev Suggested gas stipend for contract receiving ETH to perform a few
    /// storage reads and writes, but low enough to prevent griefing.
    /// Multiply by a small constant (e.g. 2), if needed.
    uint256 internal constant _GAS_STIPEND_NO_GRIEF = 100000;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       ETH OPERATIONS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Sends `amount` (in wei) ETH to `to`.
    /// Reverts upon failure.
    ///
    /// Note: This implementation does NOT protect against gas griefing.
    /// Please use `forceSafeTransferETH` for gas griefing protection.
    function safeTransferETH(address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and check if it succeeded or not.
            if iszero(call(gas(), to, amount, 0, 0, 0, 0)) {
                // Store the function selector of `ETHTransferFailed()`.
                mstore(0x00, 0xb12d13eb)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Force sends `amount` (in wei) ETH to `to`, with a `gasStipend`.
    /// The `gasStipend` can be set to a low enough value to prevent
    /// storage writes or gas griefing.
    ///
    /// If sending via the normal procedure fails, force sends the ETH by
    /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH.
    ///
    /// Reverts if the current contract has insufficient balance.
    function forceSafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal {
        /// @solidity memory-safe-assembly
        assembly {
            // If insufficient balance, revert.
            if lt(selfbalance(), amount) {
                // Store the function selector of `ETHTransferFailed()`.
                mstore(0x00, 0xb12d13eb)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Transfer the ETH and check if it succeeded or not.
            if iszero(call(gasStipend, to, amount, 0, 0, 0, 0)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                // We can directly use `SELFDESTRUCT` in the contract creation.
                // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758
                if iszero(create(amount, 0x0b, 0x16)) {
                    // To coerce gas estimation to provide enough gas for the `create` above.
                    if iszero(gt(gas(), 1000000)) { revert(0, 0) }
                }
            }
        }
    }

    /// @dev Force sends `amount` (in wei) ETH to `to`, with a gas stipend
    /// equal to `_GAS_STIPEND_NO_GRIEF`. This gas stipend is a reasonable default
    /// for 99% of cases and can be overridden with the three-argument version of this
    /// function if necessary.
    ///
    /// If sending via the normal procedure fails, force sends the ETH by
    /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH.
    ///
    /// Reverts if the current contract has insufficient balance.
    function forceSafeTransferETH(address to, uint256 amount) internal {
        // Manually inlined because the compiler doesn't inline functions with branches.
        /// @solidity memory-safe-assembly
        assembly {
            // If insufficient balance, revert.
            if lt(selfbalance(), amount) {
                // Store the function selector of `ETHTransferFailed()`.
                mstore(0x00, 0xb12d13eb)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Transfer the ETH and check if it succeeded or not.
            if iszero(call(_GAS_STIPEND_NO_GRIEF, to, amount, 0, 0, 0, 0)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                // We can directly use `SELFDESTRUCT` in the contract creation.
                // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758
                if iszero(create(amount, 0x0b, 0x16)) {
                    // To coerce gas estimation to provide enough gas for the `create` above.
                    if iszero(gt(gas(), 1000000)) { revert(0, 0) }
                }
            }
        }
    }

    /// @dev Sends `amount` (in wei) ETH to `to`, with a `gasStipend`.
    /// The `gasStipend` can be set to a low enough value to prevent
    /// storage writes or gas griefing.
    ///
    /// Simply use `gasleft()` for `gasStipend` if you don't need a gas stipend.
    ///
    /// Note: Does NOT revert upon failure.
    /// Returns whether the transfer of ETH is successful instead.
    function trySafeTransferETH(address to, uint256 amount, uint256 gasStipend)
        internal
        returns (bool success)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and check if it succeeded or not.
            success := call(gasStipend, to, amount, 0, 0, 0, 0)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      ERC20 OPERATIONS                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to`.
    /// Reverts upon failure.
    ///
    /// The `from` account must have at least `amount` approved for
    /// the current contract to manage.
    function safeTransferFrom(address token, address from, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.

            mstore(0x60, amount) // Store the `amount` argument.
            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(96, from)) // Store the `from` argument.
            // Store the function selector of `transferFrom(address,address,uint256)`.
            mstore(0x0c, 0x23b872dd000000000000000000000000)

            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
                )
            ) {
                // Store the function selector of `TransferFromFailed()`.
                mstore(0x00, 0x7939f424)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Sends all of ERC20 `token` from `from` to `to`.
    /// Reverts upon failure.
    ///
    /// The `from` account must have their entire balance approved for
    /// the current contract to manage.
    function safeTransferAllFrom(address token, address from, address to)
        internal
        returns (uint256 amount)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.

            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(96, from)) // Store the `from` argument.
            // Store the function selector of `balanceOf(address)`.
            mstore(0x0c, 0x70a08231000000000000000000000000)
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                    staticcall(gas(), token, 0x1c, 0x24, 0x60, 0x20)
                )
            ) {
                // Store the function selector of `TransferFromFailed()`.
                mstore(0x00, 0x7939f424)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            // Store the function selector of `transferFrom(address,address,uint256)`.
            mstore(0x00, 0x23b872dd)
            // The `amount` argument is already written to the memory word at 0x60.
            amount := mload(0x60)

            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
                )
            ) {
                // Store the function selector of `TransferFromFailed()`.
                mstore(0x00, 0x7939f424)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`.
    /// Reverts upon failure.
    function safeTransfer(address token, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            // Store the function selector of `transfer(address,uint256)`.
            mstore(0x00, 0xa9059cbb000000000000000000000000)

            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                )
            ) {
                // Store the function selector of `TransferFailed()`.
                mstore(0x00, 0x90b8ec18)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Restore the part of the free memory pointer that was overwritten.
            mstore(0x34, 0)
        }
    }

    /// @dev Sends all of ERC20 `token` from the current contract to `to`.
    /// Reverts upon failure.
    function safeTransferAll(address token, address to) internal returns (uint256 amount) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, 0x70a08231) // Store the function selector of `balanceOf(address)`.
            mstore(0x20, address()) // Store the address of the current contract.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                    staticcall(gas(), token, 0x1c, 0x24, 0x34, 0x20)
                )
            ) {
                // Store the function selector of `TransferFailed()`.
                mstore(0x00, 0x90b8ec18)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            mstore(0x14, to) // Store the `to` argument.
            // The `amount` argument is already written to the memory word at 0x34.
            amount := mload(0x34)
            // Store the function selector of `transfer(address,uint256)`.
            mstore(0x00, 0xa9059cbb000000000000000000000000)

            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                )
            ) {
                // Store the function selector of `TransferFailed()`.
                mstore(0x00, 0x90b8ec18)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Restore the part of the free memory pointer that was overwritten.
            mstore(0x34, 0)
        }
    }

    /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract.
    /// Reverts upon failure.
    function safeApprove(address token, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            // Store the function selector of `approve(address,uint256)`.
            mstore(0x00, 0x095ea7b3000000000000000000000000)

            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                )
            ) {
                // Store the function selector of `ApproveFailed()`.
                mstore(0x00, 0x3e3f8f73)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Restore the part of the free memory pointer that was overwritten.
            mstore(0x34, 0)
        }
    }

    /// @dev Returns the amount of ERC20 `token` owned by `account`.
    /// Returns zero if the `token` does not exist.
    function balanceOf(address token, address account) internal view returns (uint256 amount) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, account) // Store the `account` argument.
            // Store the function selector of `balanceOf(address)`.
            mstore(0x00, 0x70a08231000000000000000000000000)
            amount :=
                mul(
                    mload(0x20),
                    and( // The arguments of `and` are evaluated from right to left.
                        gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                        staticcall(gas(), token, 0x10, 0x24, 0x20, 0x20)
                    )
                )
        }
    }
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.3/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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: contracts/ArtMarketplace.sol


pragma solidity ^0.8.21;



contract ArtMarketplace is Ownable {
  uint256 private constant BPS = 10_000;
  uint256 private constant BID_INCREASE_THRESHOLD = 0.2 ether;
  uint256 private constant DEFAULT_SPLIT = 7_500;
  uint256 private constant EXTENSION_TIME = 10 minutes;
  uint256 private constant INIT_AUCTION_DURATION = 24 hours;
  uint256 private constant MIN_BID = 0.01 ether;
  uint256 private constant MIN_BID_INCREASE_PRE = 2_000;
  uint256 private constant MIN_BID_INCREASE_POST = 1_000;
  uint256 private constant SAFE_GAS_LIMIT = 30_000;

  address public beneficiary;
  bool public paused;

  struct Auction {
    uint24 offsetFromEnd;
    uint72 amount;
    address bidder;
  }

  struct AuctionConfig {
    address artist;
    uint16 split;
    uint80 buyNowStartTime;
    uint80 auctionStartTime;
    uint88 buyNowPrice;
    uint88 reservePrice;
  }

  mapping(uint256 => AuctionConfig) public auctionConfig;
  mapping(uint256 => Auction) public auctionIdToAuction;
  
  event BidMade(
    uint256 indexed auctionId,
    address indexed collectionAddress,
    uint256 indexed tokenId,
    address bidder,
    uint256 amount,
    uint256 timestamp
  );

  event Settled(
    uint256 indexed auctionId,
    address indexed collectionAddress,
    uint256 indexed tokenId,
    uint256 timestamp
  );

  function bid(
    uint256 auctionId
  ) external payable {
    require(!paused, 'Bidding is paused');

    if (auctionConfig[auctionId].auctionStartTime == type(uint80).max) {
      auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp);
    }

    require(
      isAuctionActive(auctionId)
      && block.timestamp >= auctionConfig[auctionId].buyNowStartTime,
      'Auction Inactive'
    );

    Auction memory highestBid = auctionIdToAuction[auctionId];
    uint256 bidIncrease = highestBid.amount >= BID_INCREASE_THRESHOLD
      ? MIN_BID_INCREASE_POST : MIN_BID_INCREASE_PRE;

    require(
      msg.value >= (highestBid.amount * (BPS + bidIncrease) / BPS)
      && msg.value >= reservePrice(auctionId),
      'Bid not high enough'
    );

    uint256 refundAmount;
    address refundBidder;
    uint256 offset = highestBid.offsetFromEnd;
    uint256 endTime = getAuctionEndTime(auctionId);

    if (highestBid.amount > 0) {
      refundAmount = highestBid.amount;
      refundBidder = highestBid.bidder;
    }

    if (endTime - block.timestamp < EXTENSION_TIME) {
      offset += block.timestamp + EXTENSION_TIME - endTime;
    }

    auctionIdToAuction[auctionId] = Auction(uint24(offset), uint72(msg.value), msg.sender);

    emit BidMade(
      auctionId,
      getCollectionFromId(auctionId),
      getArtTokenIdFromId(auctionId),
      msg.sender,
      msg.value,
      block.timestamp
    );

    if (refundAmount > 0) {
      SafeTransferLib.forceSafeTransferETH(refundBidder, refundAmount, SAFE_GAS_LIMIT);
    }
  }

  function bidOnFavs(
    uint256[] calldata favorites,
    uint256[] calldata expectedPrices
  ) external payable {
    require(!paused, 'Bidding is paused');
    require(favorites.length == expectedPrices.length);

    uint256 totalFailed; uint256 expectedTotal;
    for(uint256 i; i < favorites.length; ++i) {
      uint256 auctionId = favorites[i];
      uint256 expectedPrice = expectedPrices[i];
      expectedTotal += expectedPrice;
      AuctionConfig memory config = auctionConfig[auctionId];

      if (config.auctionStartTime == type(uint80).max) {
        auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp);
      }

      if(!isAuctionActive(auctionId) || block.timestamp < config.buyNowStartTime) {
        totalFailed += expectedPrice;
        continue;
      }

      Auction memory highestBid = auctionIdToAuction[auctionId];
      uint256 bidIncrease = highestBid.amount >= BID_INCREASE_THRESHOLD
        ? MIN_BID_INCREASE_POST : MIN_BID_INCREASE_PRE;

      if (
        expectedPrice >= (highestBid.amount * (BPS + bidIncrease) / BPS)
        && expectedPrice >= reservePrice(auctionId)
      ) {
        uint256 refundAmount;
        address refundBidder;
        uint256 offset = highestBid.offsetFromEnd;
        uint256 endTime = getAuctionEndTime(auctionId);

        if (highestBid.amount > 0) {
          refundAmount = highestBid.amount;
          refundBidder = highestBid.bidder;
        }

        if (endTime - block.timestamp < EXTENSION_TIME) {
          offset += block.timestamp + EXTENSION_TIME - endTime;
        }

        auctionIdToAuction[auctionId] = Auction(uint24(offset), uint72(expectedPrice), msg.sender);

        emit BidMade(
          auctionId,
          getCollectionFromId(auctionId),
          getArtTokenIdFromId(auctionId),
          msg.sender,
          expectedPrice,
          block.timestamp
        );

        if (refundAmount > 0) {
          SafeTransferLib.forceSafeTransferETH(refundBidder, refundAmount, SAFE_GAS_LIMIT);
        }
      } else{
        totalFailed += expectedPrice;
      }
    }

    require(msg.value == expectedTotal, 'Incorrect amount of ETH sent');
    if (totalFailed > 0) {
      SafeTransferLib.forceSafeTransferETH(msg.sender, totalFailed, SAFE_GAS_LIMIT);
    }
  }

  function buyNow(
    uint256 auctionId
  ) external payable {
    AuctionConfig memory config = auctionConfig[auctionId];
    uint256 amountToPay = config.buyNowPrice;
    require(!paused, 'Buying is paused');
    require(block.timestamp >= config.buyNowStartTime, 'Can not buy now yet.');
    require(config.auctionStartTime > block.timestamp, 'Auction already started.');
    require(amountToPay != 0 && msg.value == amountToPay, 'Incorrect ETH sent.');

    auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp - INIT_AUCTION_DURATION);
    auctionIdToAuction[auctionId] = Auction(0, uint72(msg.value), msg.sender);
    _mint(msg.sender, auctionId);

    emit Settled(
      auctionId,
      getCollectionFromId(auctionId),
      getArtTokenIdFromId(auctionId),
      block.timestamp
    );

    uint256 split = config.split;
    if (split == 0) {
      split = DEFAULT_SPLIT;
    }
    uint256 amountForArtist = amountToPay * split / 10_000;
    SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT);
    SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT);
  }

  function buyNowMultiple(
    uint256[] calldata auctionIds
  ) external payable {
    require(!paused, 'Buying is paused');

    uint256 totalFailed; uint256 totalPrice;
    for(uint256 i; i < auctionIds.length; ++i) {
      uint256 auctionId = auctionIds[i];
      AuctionConfig memory config = auctionConfig[auctionId];
      uint256 amountToPay = config.buyNowPrice;

      if (
        (block.timestamp < config.buyNowStartTime)
        ||(config.auctionStartTime <= block.timestamp)
        || amountToPay == 0
      ) {
        totalFailed += amountToPay;
        continue;
      }

      auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp - INIT_AUCTION_DURATION);
      auctionIdToAuction[auctionId] = Auction(0, uint72(amountToPay), msg.sender);
      totalPrice += amountToPay;
      _mint(msg.sender, auctionId);

      emit Settled(
        auctionId,
        getCollectionFromId(auctionId),
        getArtTokenIdFromId(auctionId),
        block.timestamp
      );

      uint256 split = config.split;
      if (split == 0) {
        split = DEFAULT_SPLIT;
      }
      uint256 amountForArtist = amountToPay * split / 10_000;
      SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT);
      SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT);
    }

    require(totalPrice == msg.value, 'Incorrect ETH amount sent.');
    if (totalFailed > 0) {
      SafeTransferLib.forceSafeTransferETH(msg.sender, totalFailed, SAFE_GAS_LIMIT);
    }
  }

  function settleAuction(
    uint256 auctionId
  ) external payable {
    Auction memory highestBid = auctionIdToAuction[auctionId];
    AuctionConfig memory config = auctionConfig[auctionId];
    require(isAuctionOver(auctionId), 'Auction is still active');

    uint256 amountToPay = highestBid.amount;
    if (amountToPay > 0) {
      _mint(highestBid.bidder, auctionId);
    } else {
      require(msg.value == reservePrice(auctionId), 'Incorrect funds sent for unclaimed');
      amountToPay = msg.value;

      _mint(owner(), auctionId);
    }

    emit Settled(
      auctionId,
      getCollectionFromId(auctionId),
      getArtTokenIdFromId(auctionId),
      block.timestamp
    );

    uint256 split = config.split;
    if (split == 0) {
      split = DEFAULT_SPLIT;
    }
    uint256 amountForArtist = amountToPay * split / 10_000;
    SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT);
    SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT);
  }

  function settleMultipleAuctions(
    uint256[] calldata auctionIds
  ) external payable {
    uint256 unclaimedCost; uint256 amountForBene;
    for (uint256 i; i < auctionIds.length; ++i) {
      uint256 auctionId = auctionIds[i];
      Auction memory highestBid = auctionIdToAuction[auctionId];
      require(isAuctionOver(auctionId), 'Auction is still active');

      uint256 amountToPay = highestBid.amount;
      if (amountToPay > 0) {
        _mint(highestBid.bidder, auctionId);
      } else {
        amountToPay = reservePrice(auctionId);
        unclaimedCost += amountToPay;
        _mint(owner(), auctionId);
      }

      emit Settled(
        auctionId,
        getCollectionFromId(auctionId),
        getArtTokenIdFromId(auctionId),
        block.timestamp
      );

      AuctionConfig memory config = auctionConfig[auctionId];
      uint256 split = config.split;
      if (split == 0) {
        split = DEFAULT_SPLIT;
      }
      uint256 amountForArtist = amountToPay * split / 10_000;
      SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT);

      amountForBene += amountToPay - amountForArtist;
    }

    require(msg.value == unclaimedCost, 'Incorrect funds sent for unclaimed');
    SafeTransferLib.forceSafeTransferETH(beneficiary, amountForBene, SAFE_GAS_LIMIT);
  }

  function _mint(
    address to,
    uint256 auctionId
  ) internal {
    address collection = getCollectionFromId(auctionId);
    uint256 tokenId = getArtTokenIdFromId(auctionId);
    try INFT(collection).ownerOf(tokenId) returns (address _owner) {
      if (_owner == address(0)) {
        INFT(collection).mint(to, tokenId);
      } else {
        INFT(collection).transferFrom(_owner, to, tokenId);
      }
    } catch {
      INFT(collection).mint(to, tokenId);
    }
  }

  function _changePrices(
    address collectionAddress,
    uint256 tokenId,
    uint256 newBuyNowPrice,
    uint256 newReservePrice
  ) internal {
    uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId);
    require(auctionConfig[auctionId].auctionStartTime > block.timestamp);

    auctionConfig[auctionId].buyNowPrice = uint88(newBuyNowPrice);
    auctionConfig[auctionId].reservePrice = uint88(newReservePrice);
  }

  function _changeSplit(
    address collectionAddress,
    uint256 tokenId,
    address artist,
    uint256 newSplit
  ) internal {
    uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId);
    if (artist != address(0)) {
      auctionConfig[auctionId].artist = artist;
    }
    auctionConfig[auctionId].split = uint16(newSplit);
  }

  function _reschedule(
    address collectionAddress,
    uint256 tokenId,
    uint256 newBuyNowStartTime,
    uint256 newAuctionStartTime
  ) internal {
    uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId);
    require(auctionConfig[auctionId].auctionStartTime > block.timestamp);
    require(newBuyNowStartTime <= newAuctionStartTime);

    auctionConfig[auctionId].buyNowStartTime = uint80(newBuyNowStartTime);
    auctionConfig[auctionId].auctionStartTime = uint80(newAuctionStartTime);
  }

  function _schedule(
    address collectionAddress,
    uint256 tokenId,
    uint256 buyNowStartTime,
    uint256 auctionStartTime,
    address artist,
    uint256 split,
    uint256 buyNowPrice,
    uint256 reserve
  ) internal {
    uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId);
    require(auctionConfig[auctionId].auctionStartTime == 0);

    uint256 adjAucStartTime = auctionStartTime;
    if (adjAucStartTime == 0) {
      adjAucStartTime = type(uint80).max;
    }
    auctionConfig[auctionId] = AuctionConfig(
      artist,
      uint16(split),
      uint80(buyNowStartTime),
      uint80(adjAucStartTime),
      uint88(buyNowPrice),
      uint88(reserve)
    );
  }

  // ONLY OWNER

  function changePrices(
    address collectionAddress,
    uint256 tokenId,
    uint256 newBuyNowPrice,
    uint256 newReservePrice
  ) external onlyOwner {
    _changePrices(collectionAddress, tokenId, newBuyNowPrice, newReservePrice);
  }

  function changePricesMultiple(
    address[] calldata collections,
    uint256[] calldata tokenIds,
    uint256[] calldata newBuyNowPrices,
    uint256[] calldata newReservePrices
  ) external onlyOwner {
    require(
      collections.length == tokenIds.length && tokenIds.length == newBuyNowPrices.length
      && newBuyNowPrices.length == newReservePrices.length,
      'Array length mismatch'
    );
    for(uint256 i; i < collections.length; ++i) {
      _changePrices(collections[i], tokenIds[i], newBuyNowPrices[i], newReservePrices[i]);
    }
  }

  function changeSplit(
    address collectionAddress,
    uint256 tokenId,
    address artist,
    uint256 split
  ) external onlyOwner {
    _changeSplit(collectionAddress, tokenId, artist, split);
  }

  function changeSplitMultiple(
    address[] calldata collections,
    uint256[] calldata tokenIds,
    address[] calldata artists,
    uint256[] calldata splits
  ) external onlyOwner {
    require(
      collections.length == tokenIds.length && tokenIds.length == artists.length
      && artists.length == splits.length,
      'Array length mismatch'
    );
    for(uint256 i; i < collections.length; ++i) {
      _changeSplit(collections[i], tokenIds[i], artists[i], splits[i]);
    }
  }

  function reschedule(
    address collectionAddress,
    uint256 tokenId,
    uint256 newBuyNowStartTime,
    uint256 newAuctionStartTime
  ) external onlyOwner {
    _reschedule(collectionAddress, tokenId, newBuyNowStartTime, newAuctionStartTime);
  }

  function rescheduleMultiple(
    address[] calldata collections,
    uint256[] calldata tokenIds,
    uint256[] calldata newBuyNowStartTimes,
    uint256[] calldata newAuctionStartTimes
  ) external onlyOwner {
    require(
      collections.length == tokenIds.length && tokenIds.length == newBuyNowStartTimes.length
      && newBuyNowStartTimes.length == newAuctionStartTimes.length,
      'Array length mismatch'
    );
    for(uint256 i; i < collections.length; ++i) {
      _reschedule(collections[i], tokenIds[i], newBuyNowStartTimes[i], newAuctionStartTimes[i]);
    }
  }

  function schedule(
    address collectionAddress,
    uint256 tokenId,
    uint256 buyNowStartTime,
    uint256 auctionStartTime,
    address artist,
    uint256 split,
    uint256 buyNowPrice,
    uint256 reserve
  ) external onlyOwner {
    _schedule(
      collectionAddress,
      tokenId,
      buyNowStartTime,
      auctionStartTime,
      artist,
      split,
      buyNowPrice,
      reserve
    );
  }

  function scheduleMultiple(
    address[] calldata collections,
    uint256[] calldata tokenIds,
    uint256[] calldata buyNowStartTimes,
    uint256[] calldata auctionStartTimes,
    address[] calldata artists,
    uint256[] calldata splits,
    uint256[] calldata buyNowPrices,
    uint256[] calldata reservePrices
  ) external onlyOwner {
    require(
      collections.length == tokenIds.length && tokenIds.length == buyNowStartTimes.length &&
      buyNowStartTimes.length == auctionStartTimes.length && auctionStartTimes.length == artists.length
      && artists.length == splits.length && splits.length == buyNowPrices.length &&
      buyNowPrices.length == reservePrices.length,
      'Array length mismatch'
    );
    for(uint256 i; i < collections.length; ++i) {
      _schedule(
        collections[i],
        tokenIds[i],
        buyNowStartTimes[i],
        auctionStartTimes[i],
        artists[i],
        splits[i],
        buyNowPrices[i],
        reservePrices[i]
      );
    }
  }

  function setBeneficiary(
    address _beneficiary
  ) external onlyOwner {
    beneficiary = _beneficiary;
  }

  function setPaused(
    bool _paused
  ) external onlyOwner {
    paused = _paused;
  }

  // GETTERS

  function artTokentoAuctionId(
    address collection,
    uint256 tokenId
  ) public pure returns (uint256) {
    return (uint256(uint160(collection)) << 96) | uint96(tokenId);
  }

  function isAuctionActive(
    uint256 auctionId
  ) public view returns (bool) {
    uint256 startTime = auctionConfig[auctionId].auctionStartTime;
    uint256 endTime = getAuctionEndTime(auctionId);
    return (startTime > 0 && block.timestamp >= startTime && block.timestamp < endTime);
  }

  function isAuctionOver(
    uint256 auctionId
  ) public view returns (bool) {
    uint256 startTime = auctionConfig[auctionId].auctionStartTime;
    uint256 endTime = getAuctionEndTime(auctionId);
    return (startTime > 0 && block.timestamp >= endTime);
  }

  function getAuctionEndTime(
    uint256 auctionId
  ) public view returns (uint256) {
    return auctionConfig[auctionId].auctionStartTime + INIT_AUCTION_DURATION + auctionIdToAuction[auctionId].offsetFromEnd;
  }

  function getAuctionStartTime(
    uint256 auctionId
  ) external view returns (uint256) {
    return auctionConfig[auctionId].auctionStartTime;
  }

  function getCollectionFromId(
    uint256 id
  ) public pure returns (address) {
    return address(uint160(id >> 96));
  }

  function getArtTokenIdFromId(
    uint256 id
  ) public pure returns (uint256) {
    return uint256(uint96(id));
  }

  function reservePrice(
    uint256 auctionId
  ) public view returns (uint256) {
    uint256 reserve = auctionConfig[auctionId].reservePrice;
    return reserve != 0 ? reserve : MIN_BID;
  }
}


interface INFT {
  function mint(address to, uint256 tokenId) external;
  function ownerOf(uint256 tokenId) external view returns (address);
  function transferFrom(address from, address to, uint256 tokenId) external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "viaIR": true,
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BidMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Settled","type":"event"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"artTokentoAuctionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionConfig","outputs":[{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint16","name":"split","type":"uint16"},{"internalType":"uint80","name":"buyNowStartTime","type":"uint80"},{"internalType":"uint80","name":"auctionStartTime","type":"uint80"},{"internalType":"uint88","name":"buyNowPrice","type":"uint88"},{"internalType":"uint88","name":"reservePrice","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionIdToAuction","outputs":[{"internalType":"uint24","name":"offsetFromEnd","type":"uint24"},{"internalType":"uint72","name":"amount","type":"uint72"},{"internalType":"address","name":"bidder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"favorites","type":"uint256[]"},{"internalType":"uint256[]","name":"expectedPrices","type":"uint256[]"}],"name":"bidOnFavs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"buyNow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"auctionIds","type":"uint256[]"}],"name":"buyNowMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newBuyNowPrice","type":"uint256"},{"internalType":"uint256","name":"newReservePrice","type":"uint256"}],"name":"changePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newBuyNowPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"newReservePrices","type":"uint256[]"}],"name":"changePricesMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"split","type":"uint256"}],"name":"changeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"splits","type":"uint256[]"}],"name":"changeSplitMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getArtTokenIdFromId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getAuctionEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getAuctionStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCollectionFromId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"isAuctionActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"isAuctionOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newBuyNowStartTime","type":"uint256"},{"internalType":"uint256","name":"newAuctionStartTime","type":"uint256"}],"name":"reschedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newBuyNowStartTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"newAuctionStartTimes","type":"uint256[]"}],"name":"rescheduleMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"reservePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"buyNowStartTime","type":"uint256"},{"internalType":"uint256","name":"auctionStartTime","type":"uint256"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"split","type":"uint256"},{"internalType":"uint256","name":"buyNowPrice","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"name":"schedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"buyNowStartTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"auctionStartTimes","type":"uint256[]"},{"internalType":"address[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"splits","type":"uint256[]"},{"internalType":"uint256[]","name":"buyNowPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"reservePrices","type":"uint256[]"}],"name":"scheduleMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"settleAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"auctionIds","type":"uint256[]"}],"name":"settleMultipleAuctions","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080806040523461005a575f8054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3612406908161005f8239f35b5f80fdfe6102a0806040526004361015610013575f80fd5b5f3560e01c9081630254837614611a045750806302ffbaba1461180e578063089c584b146117ec57806308a0f32f146115c65780631033a663146111e15780631107a8fc1461116a57806316c38b3c146111255780631ae03271146110885780631c31f71014611045578063210bb50214610fb45780632c104a9214610f965780632e99361114610dff57806337fee62514610d6657806338af3eed14610d3e578063454a2ab314610a63578063469847fd1461074e57806359aab2421461072c5780635c975abb146107075780636892b714146104805780637100dd871461043c578063715018a6146103e55780638624e7df1461039f5780638c77cc09146103795780638da5cb5b14610352578063919e84f51461031c578063930e79f1146102fe57806395657db0146102de578063e361c5a8146102b8578063e71f7b1514610290578063f2fde38b146101cf5763ff6f95bc14610172575f80fd5b346101cb576101003660031901126101cb5761018c611a7b565b608435906001600160a01b03821682036101cb576101c9916101ac611b40565b60e4359160c4359160a4359160643590604435906024359061214b565b005b5f80fd5b346101cb5760203660031901126101cb576101e8611a7b565b6101f0611b40565b6001600160a01b0390811690811561023c575f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101cb5760203660031901126101cb5760206102ae6004356122cb565b6040519015158152f35b346101cb5760203660031901126101cb5760206102d66004356123a7565b604051908152f35b346101cb5760203660031901126101cb57602060405160043560601c8152f35b346101cb5760203660031901126101cb5760206102d660043561234a565b346101cb5760203660031901126101cb576004355f52600260205260206001600160501b03600160405f20015416604051908152f35b346101cb575f3660031901126101cb575f546040516001600160a01b039091168152602090f35b346101cb5760203660031901126101cb5760206040516001600160601b03600435168152f35b346101cb5760803660031901126101cb576103b8611a7b565b604435906001600160a01b03821682036101cb576101c9916103d8611b40565b606435916024359061204c565b346101cb575f3660031901126101cb576103fd611b40565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101cb5760403660031901126101cb576020610457611a7b565b60405160609190911b6bffffffffffffffffffffffff19166024356001600160601b0316178152f35b346101cb576101003660031901126101cb5767ffffffffffffffff6004358181116101cb576104b3903690600401611a4a565b61018052610160526024358181116101cb576104d3903690600401611a4a565b6102005260c0526044358181116101cb576104f2903690600401611a4a565b6101e052610120526064358181116101cb57610512903690600401611a4a565b6101c05260a0526084358181116101cb57610531903690600401611a4a565b6102805260e05260a4358181116101cb57610550903690600401611a4a565b610240526101005260c4358181116101cb57610570903690600401611a4a565b610260526101405260e435116101cb5761058f3660e435600401611a4a565b610220526101a05261059f611b40565b610200516101805114806106f8575b806106e9575b806106da575b806106cb575b806106bc575b806106ad575b6105d590611ff4565b5f6080525b61018051608051106105e857005b61069a6106066106016080516101805161016051611cc6565b612038565b6106186080516102005160c051611cc6565b3561062c6080516101e05161012051611cc6565b3561063f6080516101c05160a051611cc6565b356106556106016080516102805160e051611cc6565b906106696080516102405161010051611cc6565b359261067e6080516102605161014051611cc6565b3594610693608051610220516101a051611cc6565b359661214b565b6106a5608051611cb8565b6080526105da565b506102205161026051146105cc565b506102605161024051146105c6565b506102405161028051146105c0565b50610280516101c051146105ba565b506101c0516101e051146105b4565b506101e05161020051146105ae565b346101cb575f3660031901126101cb57602060ff60015460a01c166040519015158152f35b346101cb576101c961073d36611a91565b92610749929192611b40565b6120d0565b60203660031901126101cb5760043567ffffffffffffffff81116101cb5761077a903690600401611a4a565b9061078d60ff60015460a01c1615611cea565b5f9182918291426201517f1901905b80841061080157858534036107bc57806107b257005b6101c99033611c64565b60405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742045544820616d6f756e742073656e742e0000000000006044820152606490fd5b90919293610810858386611cc6565b3594855f52600260205260405f206040519061082b82611c07565b60018154818060a01b038116845261ffff8160a01c16602085015260b01c918260408501520154906001600160501b038216908160608501526001600160581b038360501c1660808501528260a81c60a08501524210908115610a58575b508015610a44575b610a1e57428611610a0a576109ee6109f49261094a6109f9968b5f526002602052600160405f20016001600160501b038b166001600160501b03198254161790556040516108de81611bd7565b5f81528c602082016001600160481b038860501c16815260408301913383525f5260036020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b1691171790556001600160581b038560501c1690611c37565b996109558133611dcc565b6040514281526001600160601b038216917f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a4160208260601c93a461ffff6020820151168015610a01575b6127106109bb6109d0926001600160581b038760501c16611c44565b925192049182906001600160a01b0316611c64565b6001546001600160a01b03169260501c6001600160581b0316611c57565b90611c64565b611cb8565b92919061079c565b50611d4c61099f565b634e487b7160e01b5f52601160045260245ffd5b6109f9939750610a3e929891506001600160581b039060501c1690611c37565b95611cb8565b506001600160581b038160501c1615610891565b90504210158a610889565b6020806003193601126101cb5760043590610a8660ff60015460a01c1615611b97565b815f5260028152600160405f200180546001600160501b038080831614610d26575b505050610ab4826122cb565b80610d0e575b15610cd757815f526003815260405f209160405192610ad884611bd7565b5462ffffff9283821685526001600160481b03808360181c169482870195808752604088019460601c85526702c68af0bb1400008110155f14610cce576103e8905b612710918201808311610a0a57610b3091611c44565b0434101580610cbc575b15610c81575f95815f9851169483610b518861234a565b92511680610c6b575b505061025880610b6a4284611c57565b10610c36575b5050806bffffffffffffffffff0000009160405195610b8e87611bd7565b168552838501923416835260036040860194338652875f525260405f20945116915160181b16916001600160601b0319905160601b1691171790556040516001600160601b038216917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b8160601c9280610c2342343384604091949392606082019560018060a01b0316825260208201520152565b0390a480610c2d57005b6101c991611c64565b949194420191824211610a0a57610c5d610c63926bffffffffffffffffff00000094611c57565b90611c37565b939088610b70565b90516001600160a01b0316985096508880610b5a565b60405162461bcd60e51b8152600481018490526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606490fd5b50610cc6856123a7565b341015610b3a565b6107d090610b1a565b6064906040519062461bcd60e51b82526004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152fd5b50815f526002815260405f205460b01c421015610aba565b4216906001600160501b031916179055828080610aa8565b346101cb575f3660031901126101cb576001546040516001600160a01b039091168152602090f35b346101cb57610d7436611abf565b9596610d8595949593929193611b40565b85881480610df6575b80610ded575b610d9d90611ff4565b5f5b888110610da857005b806109f4610dbd610601610de8948d87611cc6565b8a610dc9848c8c611cc6565b35610de185610dd9818b8d611cc6565b35938c611cc6565b35926120d0565b610d9f565b50818714610d94565b50818614610d8e565b6020806003193601126101cb576101c990600435805f526003825260405f2060405190610e2b82611bd7565b549162ffffff831682526001600160481b03604085840193828660181c168552019360601c8452815f526002855260405f209460405192610e6b84611c07565b86549260018060a01b03958685168652600161ffff99858801968b8160a01c16885260b01c604089015201546001600160501b03811660608801526001600160581b038160501c16608088015260a81c60a0870152610ed1610ecc84612313565b611d29565b5116958615610f61579285949282610ef46109ee999a9488610f4e985116611dcc565b604051904282527f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a416001600160601b038216938260601c93a451168015610f58575b610f436127109188611c44565b049384915116611c64565b6001541692611c57565b50611d4c610f36565b50956109ee9550610f4e92859492610f82610f7b8a6123a7565b3414611d75565b3498610f9181885f5416611dcc565b610ef4565b346101cb5760203660031901126101cb5760206102ae600435612313565b346101cb57610fc236611abf565b9596610fd395949593929193611b40565b8588148061103c575b80611033575b610feb90611ff4565b5f5b888110610ff657005b806109f461100b61060161102e948d87611cc6565b8a611017848c8c611cc6565b3561102785610dd9818b8d611cc6565b3592611f61565b610fed565b50818714610fe2565b50818614610fdc565b346101cb5760203660031901126101cb5761105e611a7b565b611066611b40565b600180546001600160a01b0319166001600160a01b0392909216919091179055005b346101cb5761109636611abf565b9594939092916110a4611b40565b8186148061111c575b80611113575b6110bc90611ff4565b5f5b8681106110c757005b806109f4878a87611107858f6106018f998b6110f9828f6110f361110e9f83610601916111009a611cc6565b9b611cc6565b3596611cc6565b938c611cc6565b359261204c565b6110be565b508087146110b3565b508082146110ad565b346101cb5760203660031901126101cb576004358015158091036101cb5761114b611b40565b6001805460ff60a01b191660a09290921b60ff60a01b16919091179055005b346101cb5760203660031901126101cb576004355f52600260205260c060405f20600181549101546040519160018060a01b038116835261ffff8160a01c16602084015260b01c60408301526001600160501b03811660608301526001600160581b038160501c16608083015260a81c60a0820152f35b60403660031901126101cb5767ffffffffffffffff6004358181116101cb5761120e903690600401611a4a565b916024359081116101cb57611227903690600401611a4a565b929061123b60ff60015460a01c1615611b97565b8382036101cb575f935f925f5b8181106112a3578685340361125e57806107b257005b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b6112ae818388611cc6565b35906112c66112be828688611cc6565b358097611c37565b95825f5260028060205260405f20906001600160501b036001604051936112ec85611c07565b8054828060a01b038116865261ffff8160a01c16602087015260b01c60408601520154818116908160608601526001600160581b038160501c16608086015260a81c60a08501521461159a575b50611343846122cb565b15908115611583575b5061157457825f52600360205260405f20926040519361136b85611bd7565b5462ffffff81168552601881901c6001600160481b031660208601819052606082901c60408701526702c68af0bb1400001161156c576103e85b61271001908161271011610a0a57612710916001600160481b036113cc9260181c16611c44565b048210158061155a575b15611544575f905f9262ffffff8651166113ef8361234a565b966001600160481b036020820151168061152a575b505061025896876114154283611c57565b10611508575b506114f3965062ffffff6040519161143283611bd7565b168152602081016001600160481b03831681526040820190338252845f5260036020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055604051917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b6001600160601b03821693806114e38460601c9542903384604091949392606082019560018060a01b0316825260208201520152565b0390a4806114f8575b5050611cb8565b611248565b61150191611c64565b88806114ec565b908742014211610a0a57610c5d611524926114f3994201611c57565b8d61141b565b6040909101516001600160a01b0316955093508d80611404565b506114f392506115549198611c37565b96611cb8565b50611564816123a7565b8210156113d6565b6107d06113a5565b6114f392506115549198611c37565b6001600160501b039150604001511642108a61134c565b845f52602052600160405f20016001600160501b0342166001600160501b03198254161790558a611339565b6020806003193601126101cb57600435805f526002825260405f2090604051916115ef83611c07565b80549060018060a01b0391828116855261ffff94600187820193878460a01c168552604083019360b01c84520154956001600160501b0392836060840191818a1683526001600160581b038a60501c16998a608087015260a81c60a086015261166060ff60015460a01c1615611cea565b511642106117b0578342915116111561176b5786151580611762575b15611727576201517f19420193428511610a0a576101c998878796610f4e966109ee9a5f5260028452600160405f200191166001600160501b03198254161790556040516116c981611bd7565b5f81528281016001600160481b03341681526040820190338252835f52600385526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055610ef48133611dcc565b60405162461bcd60e51b815260048101899052601360248201527224b731b7b93932b1ba1022aa241039b2b73a1760691b6044820152606490fd5b5086341461167c565b60405162461bcd60e51b815260048101899052601860248201527f41756374696f6e20616c726561647920737461727465642e00000000000000006044820152606490fd5b60405162461bcd60e51b8152600481018a9052601460248201527321b0b7103737ba10313abc903737bb903cb2ba1760611b6044820152606490fd5b346101cb576101c96117fd36611a91565b92611809929192611b40565b611f61565b6020806003193601126101cb5760043567ffffffffffffffff81116101cb5761183b903690600401611a4a565b5f92915f925f925b80841061186a576101c985611859883414611d75565b6001546001600160a01b0316611c64565b90919293611879858386611cc6565b35805f526003845260405f20906040519161189383611bd7565b549062ffffff821683526001600160481b03868401818460181c16815260406060950193851c84526118c7610ecc84612313565b51169182156119c857926119b79492826118f1610c5d946119b19760018060a01b03905116611dcc565b6040514281526001600160601b03821690827f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a418c82881c93a45f52600288526119ac60405f2092896040519161194683611c07565b8554906001808060a01b0397888416865260a09361ffff81861c16809688015260b01c60408701520154906001600160501b038216908501526001600160581b038160501c16608085015260a81c9083015280156119bf575b610f436127109185611c44565b611c57565b94611cb8565b929190611843565b50611d4c61199f565b50976119b79391506119b192610c5d916119eb6119e48c6123a7565b8092611c37565b9a6119ff8160018060a01b035f5416611dcc565b6118f1565b346101cb5760203660031901126101cb576060906004355f52600360205260405f205462ffffff811682526001600160481b038160181c166020830152821c6040820152f35b9181601f840112156101cb5782359167ffffffffffffffff83116101cb576020808501948460051b0101116101cb57565b600435906001600160a01b03821682036101cb57565b60809060031901126101cb576004356001600160a01b03811681036101cb5790602435906044359060643590565b60806003198201126101cb5767ffffffffffffffff906004358281116101cb5781611aec91600401611a4a565b939093926024358181116101cb5783611b0791600401611a4a565b939093926044358381116101cb5782611b2291600401611a4a565b939093926064359182116101cb57611b3c91600401611a4a565b9091565b5f546001600160a01b03163303611b5357565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b15611b9e57565b60405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606490fd5b6060810190811067ffffffffffffffff821117611bf357604052565b634e487b7160e01b5f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117611bf357604052565b67ffffffffffffffff8111611bf357604052565b91908201809211610a0a57565b81810292918115918404141715610a0a57565b91908203918211610a0a57565b90804710611cab575f91828080808585617530f115611c8257505050565b601691600b9184526073825360ff602053f015611c9d575b50565b620f42405a11611c9a575b80fd5b63b12d13eb5f526004601cfd5b5f198114610a0a5760010190565b9190811015611cd65760051b0190565b634e487b7160e01b5f52603260045260245ffd5b15611cf157565b60405162461bcd60e51b815260206004820152601060248201526f109d5e5a5b99c81a5cc81c185d5cd95960821b6044820152606490fd5b15611d3057565b60405162461bcd60e51b815260206004820152601760248201527f41756374696f6e206973207374696c6c206163746976650000000000000000006044820152606490fd5b15611d7c57565b60405162461bcd60e51b815260206004820152602260248201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604482015261195960f21b6064820152608490fd5b6001600160601b038260601c92169060409182516331a9108f60e11b8152816004820152602081602481885afa80915f91611ef3575b5090611e645750833b156101cb5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481015b03925af1908115611e5b5750611e5257505b565b611e5090611c23565b513d5f823e3d90fd5b6001600160a01b0390811680611eaf575050833b156101cb5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f90839081838160448101611e3e565b8591959392933b156101cb575f6064928195875198899687956323b872dd60e01b8752600487015216602485015260448401525af1908115611e5b5750611e525750565b60203d8111611f5a575b601f8101601f1916820167ffffffffffffffff811183821017611f46576020918391895281010312611f425751906001600160a01b0382168203611ca857505f611e02565b5080fd5b634e487b7160e01b84526041600452602484fd5b503d611efd565b906001600160601b0316906001600160601b03199060601b16175f526002602052600160405f2001906001600160501b038254164210156101cb5781546affffffffffffffffffffff60501b191660509190911b6affffffffffffffffffffff60501b16178155611e50916001600160581b039082546001600160a81b0316911660a81b6001600160a81b031916179055565b15611ffb57565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b356001600160a01b03811681036101cb5790565b9161ffff926001600160601b03611e50959316906001600160601b03199060601b16179060018060a01b0316806120ac575b505f908152600260205260409020805461ffff60a01b19169290911660a01b61ffff60a01b16919091179055565b815f52600260205260405f20906001600160601b0360a01b8254161790555f61207e565b929091926001600160601b035f9316906001600160601b03199060601b1617825260026020526040822060018101936001600160501b039384865416421015611ca857838211611ca8575081546001600160b01b031690841660b01b6001600160b01b031916179055166001600160501b0319825416179055565b60601b6bffffffffffffffffffffffff19166001600160601b03909116175f818152600260205260408120600101546001600160501b0398919791969295919493929089166122c7579188939291849284156122be575b61ffff916001600160581b039a8b99604051976121be89611c07565b600160a01b6001900380941689528560208a01951685528760408a0197168752606089019e8f911690528a608089019a168a528a60a089019c168c5281526002602052604090209551166001600160601b0360a01b865416178555511661223d90849081549061ffff60a01b9060a01b169061ffff60a01b1916179055565b5182546001600160b01b0316911660b01b6001600160b01b0319161781556001019551166001600160501b0319865416178555511661229e9084908154906001600160581b0360501b9060501b16906001600160581b0360501b1916179055565b5182546001600160a81b0316911660a81b6001600160a81b031916179055565b935082936121a2565b8780fd5b805f5260026020526122ed6001600160501b03600160405f200154169161234a565b8115159182612308575b5081612301575090565b9050421090565b42101591505f6122f7565b805f5260026020526123356001600160501b03600160405f200154169161234a565b9015159081612342575090565b905042101590565b905f9180835260026020526001600160501b03600160408520015416906201518082018092116123935760408462ffffff92612390959652600360205220541690611c37565b90565b634e487b7160e01b84526011600452602484fd5b5f9081526002602052604090206001015460a81c80156123c45790565b50662386f26fc100009056fea26469706673582212209eb44b425fef9950b2d08a3557d06e8d2e4de1647775c6834c49146f12492c2464736f6c63430008150033

Deployed Bytecode

0x6102a0806040526004361015610013575f80fd5b5f3560e01c9081630254837614611a045750806302ffbaba1461180e578063089c584b146117ec57806308a0f32f146115c65780631033a663146111e15780631107a8fc1461116a57806316c38b3c146111255780631ae03271146110885780631c31f71014611045578063210bb50214610fb45780632c104a9214610f965780632e99361114610dff57806337fee62514610d6657806338af3eed14610d3e578063454a2ab314610a63578063469847fd1461074e57806359aab2421461072c5780635c975abb146107075780636892b714146104805780637100dd871461043c578063715018a6146103e55780638624e7df1461039f5780638c77cc09146103795780638da5cb5b14610352578063919e84f51461031c578063930e79f1146102fe57806395657db0146102de578063e361c5a8146102b8578063e71f7b1514610290578063f2fde38b146101cf5763ff6f95bc14610172575f80fd5b346101cb576101003660031901126101cb5761018c611a7b565b608435906001600160a01b03821682036101cb576101c9916101ac611b40565b60e4359160c4359160a4359160643590604435906024359061214b565b005b5f80fd5b346101cb5760203660031901126101cb576101e8611a7b565b6101f0611b40565b6001600160a01b0390811690811561023c575f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101cb5760203660031901126101cb5760206102ae6004356122cb565b6040519015158152f35b346101cb5760203660031901126101cb5760206102d66004356123a7565b604051908152f35b346101cb5760203660031901126101cb57602060405160043560601c8152f35b346101cb5760203660031901126101cb5760206102d660043561234a565b346101cb5760203660031901126101cb576004355f52600260205260206001600160501b03600160405f20015416604051908152f35b346101cb575f3660031901126101cb575f546040516001600160a01b039091168152602090f35b346101cb5760203660031901126101cb5760206040516001600160601b03600435168152f35b346101cb5760803660031901126101cb576103b8611a7b565b604435906001600160a01b03821682036101cb576101c9916103d8611b40565b606435916024359061204c565b346101cb575f3660031901126101cb576103fd611b40565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101cb5760403660031901126101cb576020610457611a7b565b60405160609190911b6bffffffffffffffffffffffff19166024356001600160601b0316178152f35b346101cb576101003660031901126101cb5767ffffffffffffffff6004358181116101cb576104b3903690600401611a4a565b61018052610160526024358181116101cb576104d3903690600401611a4a565b6102005260c0526044358181116101cb576104f2903690600401611a4a565b6101e052610120526064358181116101cb57610512903690600401611a4a565b6101c05260a0526084358181116101cb57610531903690600401611a4a565b6102805260e05260a4358181116101cb57610550903690600401611a4a565b610240526101005260c4358181116101cb57610570903690600401611a4a565b610260526101405260e435116101cb5761058f3660e435600401611a4a565b610220526101a05261059f611b40565b610200516101805114806106f8575b806106e9575b806106da575b806106cb575b806106bc575b806106ad575b6105d590611ff4565b5f6080525b61018051608051106105e857005b61069a6106066106016080516101805161016051611cc6565b612038565b6106186080516102005160c051611cc6565b3561062c6080516101e05161012051611cc6565b3561063f6080516101c05160a051611cc6565b356106556106016080516102805160e051611cc6565b906106696080516102405161010051611cc6565b359261067e6080516102605161014051611cc6565b3594610693608051610220516101a051611cc6565b359661214b565b6106a5608051611cb8565b6080526105da565b506102205161026051146105cc565b506102605161024051146105c6565b506102405161028051146105c0565b50610280516101c051146105ba565b506101c0516101e051146105b4565b506101e05161020051146105ae565b346101cb575f3660031901126101cb57602060ff60015460a01c166040519015158152f35b346101cb576101c961073d36611a91565b92610749929192611b40565b6120d0565b60203660031901126101cb5760043567ffffffffffffffff81116101cb5761077a903690600401611a4a565b9061078d60ff60015460a01c1615611cea565b5f9182918291426201517f1901905b80841061080157858534036107bc57806107b257005b6101c99033611c64565b60405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742045544820616d6f756e742073656e742e0000000000006044820152606490fd5b90919293610810858386611cc6565b3594855f52600260205260405f206040519061082b82611c07565b60018154818060a01b038116845261ffff8160a01c16602085015260b01c918260408501520154906001600160501b038216908160608501526001600160581b038360501c1660808501528260a81c60a08501524210908115610a58575b508015610a44575b610a1e57428611610a0a576109ee6109f49261094a6109f9968b5f526002602052600160405f20016001600160501b038b166001600160501b03198254161790556040516108de81611bd7565b5f81528c602082016001600160481b038860501c16815260408301913383525f5260036020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b1691171790556001600160581b038560501c1690611c37565b996109558133611dcc565b6040514281526001600160601b038216917f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a4160208260601c93a461ffff6020820151168015610a01575b6127106109bb6109d0926001600160581b038760501c16611c44565b925192049182906001600160a01b0316611c64565b6001546001600160a01b03169260501c6001600160581b0316611c57565b90611c64565b611cb8565b92919061079c565b50611d4c61099f565b634e487b7160e01b5f52601160045260245ffd5b6109f9939750610a3e929891506001600160581b039060501c1690611c37565b95611cb8565b506001600160581b038160501c1615610891565b90504210158a610889565b6020806003193601126101cb5760043590610a8660ff60015460a01c1615611b97565b815f5260028152600160405f200180546001600160501b038080831614610d26575b505050610ab4826122cb565b80610d0e575b15610cd757815f526003815260405f209160405192610ad884611bd7565b5462ffffff9283821685526001600160481b03808360181c169482870195808752604088019460601c85526702c68af0bb1400008110155f14610cce576103e8905b612710918201808311610a0a57610b3091611c44565b0434101580610cbc575b15610c81575f95815f9851169483610b518861234a565b92511680610c6b575b505061025880610b6a4284611c57565b10610c36575b5050806bffffffffffffffffff0000009160405195610b8e87611bd7565b168552838501923416835260036040860194338652875f525260405f20945116915160181b16916001600160601b0319905160601b1691171790556040516001600160601b038216917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b8160601c9280610c2342343384604091949392606082019560018060a01b0316825260208201520152565b0390a480610c2d57005b6101c991611c64565b949194420191824211610a0a57610c5d610c63926bffffffffffffffffff00000094611c57565b90611c37565b939088610b70565b90516001600160a01b0316985096508880610b5a565b60405162461bcd60e51b8152600481018490526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606490fd5b50610cc6856123a7565b341015610b3a565b6107d090610b1a565b6064906040519062461bcd60e51b82526004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152fd5b50815f526002815260405f205460b01c421015610aba565b4216906001600160501b031916179055828080610aa8565b346101cb575f3660031901126101cb576001546040516001600160a01b039091168152602090f35b346101cb57610d7436611abf565b9596610d8595949593929193611b40565b85881480610df6575b80610ded575b610d9d90611ff4565b5f5b888110610da857005b806109f4610dbd610601610de8948d87611cc6565b8a610dc9848c8c611cc6565b35610de185610dd9818b8d611cc6565b35938c611cc6565b35926120d0565b610d9f565b50818714610d94565b50818614610d8e565b6020806003193601126101cb576101c990600435805f526003825260405f2060405190610e2b82611bd7565b549162ffffff831682526001600160481b03604085840193828660181c168552019360601c8452815f526002855260405f209460405192610e6b84611c07565b86549260018060a01b03958685168652600161ffff99858801968b8160a01c16885260b01c604089015201546001600160501b03811660608801526001600160581b038160501c16608088015260a81c60a0870152610ed1610ecc84612313565b611d29565b5116958615610f61579285949282610ef46109ee999a9488610f4e985116611dcc565b604051904282527f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a416001600160601b038216938260601c93a451168015610f58575b610f436127109188611c44565b049384915116611c64565b6001541692611c57565b50611d4c610f36565b50956109ee9550610f4e92859492610f82610f7b8a6123a7565b3414611d75565b3498610f9181885f5416611dcc565b610ef4565b346101cb5760203660031901126101cb5760206102ae600435612313565b346101cb57610fc236611abf565b9596610fd395949593929193611b40565b8588148061103c575b80611033575b610feb90611ff4565b5f5b888110610ff657005b806109f461100b61060161102e948d87611cc6565b8a611017848c8c611cc6565b3561102785610dd9818b8d611cc6565b3592611f61565b610fed565b50818714610fe2565b50818614610fdc565b346101cb5760203660031901126101cb5761105e611a7b565b611066611b40565b600180546001600160a01b0319166001600160a01b0392909216919091179055005b346101cb5761109636611abf565b9594939092916110a4611b40565b8186148061111c575b80611113575b6110bc90611ff4565b5f5b8681106110c757005b806109f4878a87611107858f6106018f998b6110f9828f6110f361110e9f83610601916111009a611cc6565b9b611cc6565b3596611cc6565b938c611cc6565b359261204c565b6110be565b508087146110b3565b508082146110ad565b346101cb5760203660031901126101cb576004358015158091036101cb5761114b611b40565b6001805460ff60a01b191660a09290921b60ff60a01b16919091179055005b346101cb5760203660031901126101cb576004355f52600260205260c060405f20600181549101546040519160018060a01b038116835261ffff8160a01c16602084015260b01c60408301526001600160501b03811660608301526001600160581b038160501c16608083015260a81c60a0820152f35b60403660031901126101cb5767ffffffffffffffff6004358181116101cb5761120e903690600401611a4a565b916024359081116101cb57611227903690600401611a4a565b929061123b60ff60015460a01c1615611b97565b8382036101cb575f935f925f5b8181106112a3578685340361125e57806107b257005b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b6112ae818388611cc6565b35906112c66112be828688611cc6565b358097611c37565b95825f5260028060205260405f20906001600160501b036001604051936112ec85611c07565b8054828060a01b038116865261ffff8160a01c16602087015260b01c60408601520154818116908160608601526001600160581b038160501c16608086015260a81c60a08501521461159a575b50611343846122cb565b15908115611583575b5061157457825f52600360205260405f20926040519361136b85611bd7565b5462ffffff81168552601881901c6001600160481b031660208601819052606082901c60408701526702c68af0bb1400001161156c576103e85b61271001908161271011610a0a57612710916001600160481b036113cc9260181c16611c44565b048210158061155a575b15611544575f905f9262ffffff8651166113ef8361234a565b966001600160481b036020820151168061152a575b505061025896876114154283611c57565b10611508575b506114f3965062ffffff6040519161143283611bd7565b168152602081016001600160481b03831681526040820190338252845f5260036020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055604051917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b6001600160601b03821693806114e38460601c9542903384604091949392606082019560018060a01b0316825260208201520152565b0390a4806114f8575b5050611cb8565b611248565b61150191611c64565b88806114ec565b908742014211610a0a57610c5d611524926114f3994201611c57565b8d61141b565b6040909101516001600160a01b0316955093508d80611404565b506114f392506115549198611c37565b96611cb8565b50611564816123a7565b8210156113d6565b6107d06113a5565b6114f392506115549198611c37565b6001600160501b039150604001511642108a61134c565b845f52602052600160405f20016001600160501b0342166001600160501b03198254161790558a611339565b6020806003193601126101cb57600435805f526002825260405f2090604051916115ef83611c07565b80549060018060a01b0391828116855261ffff94600187820193878460a01c168552604083019360b01c84520154956001600160501b0392836060840191818a1683526001600160581b038a60501c16998a608087015260a81c60a086015261166060ff60015460a01c1615611cea565b511642106117b0578342915116111561176b5786151580611762575b15611727576201517f19420193428511610a0a576101c998878796610f4e966109ee9a5f5260028452600160405f200191166001600160501b03198254161790556040516116c981611bd7565b5f81528281016001600160481b03341681526040820190338252835f52600385526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055610ef48133611dcc565b60405162461bcd60e51b815260048101899052601360248201527224b731b7b93932b1ba1022aa241039b2b73a1760691b6044820152606490fd5b5086341461167c565b60405162461bcd60e51b815260048101899052601860248201527f41756374696f6e20616c726561647920737461727465642e00000000000000006044820152606490fd5b60405162461bcd60e51b8152600481018a9052601460248201527321b0b7103737ba10313abc903737bb903cb2ba1760611b6044820152606490fd5b346101cb576101c96117fd36611a91565b92611809929192611b40565b611f61565b6020806003193601126101cb5760043567ffffffffffffffff81116101cb5761183b903690600401611a4a565b5f92915f925f925b80841061186a576101c985611859883414611d75565b6001546001600160a01b0316611c64565b90919293611879858386611cc6565b35805f526003845260405f20906040519161189383611bd7565b549062ffffff821683526001600160481b03868401818460181c16815260406060950193851c84526118c7610ecc84612313565b51169182156119c857926119b79492826118f1610c5d946119b19760018060a01b03905116611dcc565b6040514281526001600160601b03821690827f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a418c82881c93a45f52600288526119ac60405f2092896040519161194683611c07565b8554906001808060a01b0397888416865260a09361ffff81861c16809688015260b01c60408701520154906001600160501b038216908501526001600160581b038160501c16608085015260a81c9083015280156119bf575b610f436127109185611c44565b611c57565b94611cb8565b929190611843565b50611d4c61199f565b50976119b79391506119b192610c5d916119eb6119e48c6123a7565b8092611c37565b9a6119ff8160018060a01b035f5416611dcc565b6118f1565b346101cb5760203660031901126101cb576060906004355f52600360205260405f205462ffffff811682526001600160481b038160181c166020830152821c6040820152f35b9181601f840112156101cb5782359167ffffffffffffffff83116101cb576020808501948460051b0101116101cb57565b600435906001600160a01b03821682036101cb57565b60809060031901126101cb576004356001600160a01b03811681036101cb5790602435906044359060643590565b60806003198201126101cb5767ffffffffffffffff906004358281116101cb5781611aec91600401611a4a565b939093926024358181116101cb5783611b0791600401611a4a565b939093926044358381116101cb5782611b2291600401611a4a565b939093926064359182116101cb57611b3c91600401611a4a565b9091565b5f546001600160a01b03163303611b5357565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b15611b9e57565b60405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606490fd5b6060810190811067ffffffffffffffff821117611bf357604052565b634e487b7160e01b5f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117611bf357604052565b67ffffffffffffffff8111611bf357604052565b91908201809211610a0a57565b81810292918115918404141715610a0a57565b91908203918211610a0a57565b90804710611cab575f91828080808585617530f115611c8257505050565b601691600b9184526073825360ff602053f015611c9d575b50565b620f42405a11611c9a575b80fd5b63b12d13eb5f526004601cfd5b5f198114610a0a5760010190565b9190811015611cd65760051b0190565b634e487b7160e01b5f52603260045260245ffd5b15611cf157565b60405162461bcd60e51b815260206004820152601060248201526f109d5e5a5b99c81a5cc81c185d5cd95960821b6044820152606490fd5b15611d3057565b60405162461bcd60e51b815260206004820152601760248201527f41756374696f6e206973207374696c6c206163746976650000000000000000006044820152606490fd5b15611d7c57565b60405162461bcd60e51b815260206004820152602260248201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604482015261195960f21b6064820152608490fd5b6001600160601b038260601c92169060409182516331a9108f60e11b8152816004820152602081602481885afa80915f91611ef3575b5090611e645750833b156101cb5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481015b03925af1908115611e5b5750611e5257505b565b611e5090611c23565b513d5f823e3d90fd5b6001600160a01b0390811680611eaf575050833b156101cb5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f90839081838160448101611e3e565b8591959392933b156101cb575f6064928195875198899687956323b872dd60e01b8752600487015216602485015260448401525af1908115611e5b5750611e525750565b60203d8111611f5a575b601f8101601f1916820167ffffffffffffffff811183821017611f46576020918391895281010312611f425751906001600160a01b0382168203611ca857505f611e02565b5080fd5b634e487b7160e01b84526041600452602484fd5b503d611efd565b906001600160601b0316906001600160601b03199060601b16175f526002602052600160405f2001906001600160501b038254164210156101cb5781546affffffffffffffffffffff60501b191660509190911b6affffffffffffffffffffff60501b16178155611e50916001600160581b039082546001600160a81b0316911660a81b6001600160a81b031916179055565b15611ffb57565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b356001600160a01b03811681036101cb5790565b9161ffff926001600160601b03611e50959316906001600160601b03199060601b16179060018060a01b0316806120ac575b505f908152600260205260409020805461ffff60a01b19169290911660a01b61ffff60a01b16919091179055565b815f52600260205260405f20906001600160601b0360a01b8254161790555f61207e565b929091926001600160601b035f9316906001600160601b03199060601b1617825260026020526040822060018101936001600160501b039384865416421015611ca857838211611ca8575081546001600160b01b031690841660b01b6001600160b01b031916179055166001600160501b0319825416179055565b60601b6bffffffffffffffffffffffff19166001600160601b03909116175f818152600260205260408120600101546001600160501b0398919791969295919493929089166122c7579188939291849284156122be575b61ffff916001600160581b039a8b99604051976121be89611c07565b600160a01b6001900380941689528560208a01951685528760408a0197168752606089019e8f911690528a608089019a168a528a60a089019c168c5281526002602052604090209551166001600160601b0360a01b865416178555511661223d90849081549061ffff60a01b9060a01b169061ffff60a01b1916179055565b5182546001600160b01b0316911660b01b6001600160b01b0319161781556001019551166001600160501b0319865416178555511661229e9084908154906001600160581b0360501b9060501b16906001600160581b0360501b1916179055565b5182546001600160a81b0316911660a81b6001600160a81b031916179055565b935082936121a2565b8780fd5b805f5260026020526122ed6001600160501b03600160405f200154169161234a565b8115159182612308575b5081612301575090565b9050421090565b42101591505f6122f7565b805f5260026020526123356001600160501b03600160405f200154169161234a565b9015159081612342575090565b905042101590565b905f9180835260026020526001600160501b03600160408520015416906201518082018092116123935760408462ffffff92612390959652600360205220541690611c37565b90565b634e487b7160e01b84526011600452602484fd5b5f9081526002602052604090206001015460a81c80156123c45790565b50662386f26fc100009056fea26469706673582212209eb44b425fef9950b2d08a3557d06e8d2e4de1647775c6834c49146f12492c2464736f6c63430008150033

Deployed Bytecode Sourcemap

20452:18230:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;35886:7;18830:62;;;:::i;:::-;20452:18230;;;;;;;;;;;;;;;;;35886:7;;:::i;:::-;20452:18230;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;:::i;:::-;18830:62;;:::i;:::-;-1:-1:-1;;;;;20452:18230:0;;;;19929:22;;20452:18230;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;20333:40;20452:18230;20333:40;;20452:18230;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;38357:2;20452:18230;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;38193:13;20452:18230;;;-1:-1:-1;;;;;20452:18230:0;;;;38193:41;20452:18230;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;34147:5;18830:62;;;:::i;:::-;20452:18230;;;;;34147:5;;:::i;20452:18230::-;;;;;;-1:-1:-1;;20452:18230:0;;;;18830:62;;:::i;:::-;20452:18230;;;-1:-1:-1;;;;;;20452:18230:0;;;;-1:-1:-1;;;;;20452:18230:0;20333:40;20452:18230;;20333:40;20452:18230;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;:::i;:::-;;;37286:2;20452:18230;;;;-1:-1:-1;;20452:18230:0;;;-1:-1:-1;;;;;20452:18230:0;37253:54;20452:18230;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;18830:62;;:::i;:::-;36268:37;;;;;:83;;;20452:18230;36268:144;;;20452:18230;36268:190;;;20452:18230;36268:231;;;20452:18230;36268:271;;;20452:18230;36268:324;;;20452:18230;36253:376;;;:::i;:::-;20452:18230;36639:9;;36650:22;;;;;;;;20452:18230;36674:3;36874:16;36706:14;;;;;;;;;:::i;:::-;;:::i;:::-;36730:11;;;;;;;;:::i;:::-;20452:18230;36751:19;;;;;;;;:::i;:::-;20452:18230;36780:20;;;;;;;;:::i;:::-;20452:18230;36810:10;;;;;;;;;:::i;:::-;36830:9;;;;;;;;;:::i;:::-;20452:18230;36849:15;;;;;;;;;:::i;:::-;20452:18230;36874:16;;;;;;;;;:::i;:::-;20452:18230;36874:16;;:::i;:::-;36674:3;;;;:::i;:::-;;;36639:9;;36268:324;-1:-1:-1;36572:20:0;;36549:43;;;36268:324;;:271;36520:19;;;36503:36;;;36268:271;;:231;36486:13;;;36468:31;;;36268:231;;:190;36444:14;;;36416:42;;;36268:190;;:144;36388:24;;;36361:51;;;36268:144;;:83;36328:23;;;36309:42;;;36268:83;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;21009:18;20452:18230;;;;;;;;;;;;;;;;34882:19;20452:18230;;;:::i;:::-;18830:62;;;;;;:::i;:::-;34882:19;:::i;20452:18230::-;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;;;;;:::i;:::-;;26817:36;20452:18230;26826:6;20452:18230;;;;26825:7;26817:36;:::i;:::-;20452:18230;;;;;;27122:15;-1:-1:-1;;20522:6:0;;26920:21;;;;;;28115:9;;;28101:23;20452:18230;;28165:15;28161:113;;20452:18230;28161:113;28252:14;27489:10;;28252:14;:::i;20452:18230::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;26943:3;26976:13;;;;;;;;;:::i;:::-;20452:18230;;;;;27027:13;20452:18230;;;;;;;;;;;:::i;:::-;26826:6;20452:18230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;27122:15;:40;27121:97;;;;;26943:3;27121:125;;;;;26943:3;27108:210;;27122:15;20522:6;;;;28034:29;28065:14;20452:18230;27508:25;26943:3;20452:18230;;;;27027:13;20452:18230;;26826:6;20452:18230;;;27326:41;-1:-1:-1;;;;;20452:18230:0;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;:::i;:::-;;;;27457:43;20452:18230;27457:43;;-1:-1:-1;;;;;20452:18230:0;;;;;;;27457:43;;27489:10;;20452:18230;;;;27425:18;20452:18230;;20687:10;20452:18230;;;;20522:6;;20452:18230;;;20687:10;;;;-1:-1:-1;;;;;20687:10:0;20522:6;;20452:18230;20687:10;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;27508:25;;:::i;:::-;27489:10;27559:9;27489:10;;27559:9;:::i;:::-;20452:18230;;27122:15;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;27583:139;20452:18230;;;;27583:139;;20452:18230;;;;20750:8;20452:18230;27771:10;;27767:56;;26943:3;27878:6;27856:19;27961:14;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;27856:19;:::i;:::-;20522:6;;;;;;;-1:-1:-1;;;;;20452:18230:0;27961:14;:::i;:::-;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;-1:-1:-1;;;;;20452:18230:0;28034:29;:::i;:::-;28065:14;;:::i;:::-;26943:3;:::i;:::-;26909:9;;;;;27767:56;-1:-1:-1;20636:5:0;27767:56;;20522:6;;;;20452:18230;20522:6;;20452:18230;20522:6;;20452:18230;20522:6;27108:210;26943:3;20452:18230;;;27265:26;20452:18230;;;;-1:-1:-1;;;;;20452:18230:0;;;;27265:26;;:::i;:::-;27301:8;26943:3;:::i;27121:125::-;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;27230:16;27121:125;;:97;27122:15;;;-1:-1:-1;27175:42:0;27121:97;;;20452:18230;;;;;;;;;;;;;21804:37;20452:18230;;;;;;21812:7;21804:37;:::i;:::-;20452:18230;;;21852:13;20452:18230;;;;;;21852:41;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;21852:61;21848:149;;20452:18230;22018:26;;;;;;:::i;:::-;:95;;;20452:18230;;;;;;;22180:18;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;20582:9;22237:43;;;:96;20582:9;;;20917:5;22237:96;;20522:6;;;;;;;;;22369:39;;;:::i;:::-;20522:6;22355:9;:60;;:106;;;22237:96;20522:6;;;20452:18230;22529:20;;20452:18230;20522:6;;20452:18230;22620:28;;;;;:::i;:::-;20452:18230;;;22659:21;22655:114;;22237:96;20687:10;;;22789:15;22779:25;22789:15;22779:25;;:::i;:::-;:42;22775:115;;22237:96;20452:18230;;;20687:10;20452:18230;;;;;;;:::i;:::-;;;;22928:54;;;22355:9;;20452:18230;;;22180:18;20452:18230;22928:54;;22971:10;;20452:18230;;;;;;;;;20522:6;;20452:18230;;;;20687:10;;;-1:-1:-1;;;;;20687:10:0;20522:6;;20452:18230;20687:10;;;;;;;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;22994:164;20452:18230;;;22789:15;;22994:164;22789:15;22355:9;22971:10;22994:164;20687:10;;;;;;;;20452:18230;;;;;;;;;20687:10;;;20452:18230;20687:10;20452:18230;20687:10;22994:164;;;;23169:16;23165:117;;20452:18230;23165:117;23260:14;;;:::i;22775:115::-;22789:15;;;;20522:6;22789:15;;;20522:6;;;22841:42;22831:52;22841:42;20687:10;22841:42;;:::i;:::-;22831:52;;:::i;:::-;22775:115;;;;;22655:114;20522:6;;-1:-1:-1;;;;;20452:18230:0;;-1:-1:-1;22690:32:0;-1:-1:-1;22655:114:0;;;;20522:6;20452:18230;;-1:-1:-1;;;20522:6:0;;20452:18230;20522:6;;;;;;;;;20452:18230;-1:-1:-1;;;20452:18230:0;;;20522:6;;;;22355:106;22438:23;;;;:::i;:::-;22355:9;22425:36;;22355:106;;22237:96;20859:5;22237:96;;;20452:18230;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;22018:95;20452:18230;;;;21852:13;20452:18230;;;;;;;;22054:15;:59;;22018:95;;21848:149;21974:15;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;;21848:149;;;;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;:::i;:::-;18830:62;;;;;;;;;;;:::i;:::-;35141:37;;;:86;;;20452:18230;35141:153;;;20452:18230;35126:205;;;:::i;:::-;20452:18230;35352:22;;;;;;20452:18230;35376:3;35401:14;35454:23;35401:14;;35376:3;35401:14;;;;:::i;:::-;35417:11;;;;;;:::i;:::-;20452:18230;35454:23;35430:22;;;;;;:::i;:::-;20452:18230;35454:23;;;:::i;:::-;20452:18230;35454:23;;:::i;35376:3::-;35341:9;;35141:153;-1:-1:-1;35237:57:0;;;35141:153;;:86;35182:45;;;;35141:86;;20452:18230;;;;;;;;;;29299:14;20452:18230;;;;;;28383:18;20452:18230;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;28448:13;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;28478:60;28486:24;;;:::i;:::-;28478:60;:::i;:::-;20452:18230;;;28594:15;;;;20522:6;;;;;28644:9;29268:29;20522:6;;;;29197:14;20522:6;;20452:18230;28644:9;:::i;:::-;20452:18230;;28949:15;;20452:18230;;28841:129;-1:-1:-1;;;;;20452:18230:0;;;;;;28841:129;;20750:8;20452:18230;29015:10;;29011:52;;28590:240;29094:19;29116:6;29094:19;;;:::i;:::-;20522:6;;;;;20452:18230;29197:14;:::i;:::-;20452:18230;;;29268:29;;:::i;29011:52::-;-1:-1:-1;20636:5:0;29011:52;;28590:240;28696:23;;29268:29;28696:23;;29197:14;28696:23;;;;28675:83;28696:23;;;:::i;:::-;28683:9;:36;28675:83;:::i;:::-;28683:9;20452:18230;28813:9;20452:18230;;;;;28813:9;:::i;:::-;28590:240;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;18830:62;;;;;;;;;;;:::i;:::-;33623:37;;;:82;;;20452:18230;33623:141;;;20452:18230;33608:193;;;:::i;:::-;20452:18230;33822:22;;;;;;20452:18230;33846:3;33873:14;33922:19;33873:14;;33846:3;33873:14;;;;:::i;:::-;33889:11;;;;;;:::i;:::-;20452:18230;33922:19;33902:18;;;;;;:::i;33922:19::-;20452:18230;33922:19;;:::i;33846:3::-;33811:9;;33623:141;-1:-1:-1;33715:49:0;;;33623:141;;:82;33664:41;;;;33623:82;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;:::i;:::-;18830:62;;:::i;:::-;20452:18230;;;-1:-1:-1;;;;;;20452:18230:0;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;:::i;:::-;18830:62;;;;;;;;:::i;:::-;34367:37;;;:74;;;20452:18230;34367:115;;;20452:18230;34352:167;;;:::i;:::-;20452:18230;34540:22;;;;;;20452:18230;34564:3;34590:14;34631:9;34590:14;;;34631:9;34590:14;;34619:10;34590:14;;;34606:11;34590:14;;;34564:3;34590:14;;;;34619:10;34590:14;;:::i;:::-;34606:11;;:::i;:::-;20452:18230;34619:10;;:::i;:::-;34631:9;;;:::i;:::-;20452:18230;34631:9;;:::i;34564:3::-;34529:9;;34367:115;-1:-1:-1;34451:31:0;;;34367:115;;:74;34408:33;;;;34367:74;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;18830:62;;:::i;:::-;37093:16;20452:18230;;-1:-1:-1;;;;20452:18230:0;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;21295:54;20452:18230;;;;;;;;;21295:54;;20452:18230;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;23409:37;20452:18230;23418:6;20452:18230;;;;23417:7;23409:37;:::i;:::-;23460:41;;;20452:18230;;;23530:21;20452:18230;23561:9;20452:18230;23572:20;;;;;;25386:9;;;:26;20452:18230;;25455:15;25451:113;;20452:18230;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;23594:3;23627:12;;;;;:::i;:::-;20452:18230;23671:17;23696:30;23671:17;;;;;:::i;:::-;20452:18230;23696:30;;;:::i;:::-;20452:18230;;;;23764:13;20452:18230;;;;;;;-1:-1:-1;;;;;23418:6:0;20452:18230;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;23801:43;23797:135;;23594:3;23944:26;;;;:::i;:::-;23943:27;20452:18230;;;23943:71;;23594:3;23940:141;;;20452:18230;;;24117:18;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;20582:9;-1:-1:-1;20582:9:0;;20917:5;24176:98;20522:6;;;;;;;;;20452:18230;-1:-1:-1;;;;;24314:39:0;20452:18230;;;;24314:39;:::i;:::-;20522:6;24296:64;;;:116;;;24176:98;24283:1083;;;20452:18230;24461:20;20452:18230;20522:6;20452:18230;20522:6;;20452:18230;24560:28;;;:::i;:::-;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;;24603:21;24599:126;;24283:1083;20687:10;;;24749:15;;24739:25;24749:15;24739:25;;:::i;:::-;:42;24735:123;;24283:1083;20452:18230;23594:3;20452:18230;;;;;;;;;:::i;:::-;;;;;24900:58;;-1:-1:-1;;;;;20452:18230:0;;;;;24900:58;;24947:10;;20452:18230;;;;;24117:18;20452:18230;;20687:10;20452:18230;;;;20522:6;;20452:18230;;;;20687:10;;;-1:-1:-1;;;;;20687:10:0;20522:6;;20452:18230;20687:10;;;;;;;20452:18230;;;24974:196;-1:-1:-1;;;;;20452:18230:0;;;;24974:196;20452:18230;;;24749:15;;24947:10;;24974:196;20687:10;;;;;;;;20452:18230;;;;;;;;;20687:10;;;20452:18230;20687:10;20452:18230;20687:10;24974:196;;;;25185:16;25181:125;;24283:1083;;;23594:3;:::i;:::-;23561:9;;25181:125;25280:14;;;:::i;:::-;25181:125;;;;24735:123;24749:15;;;20522:6;24749:15;20522:6;;;24805:42;24795:52;24749:15;23594:3;24749:15;;20522:6;24805:42;:::i;24795:52::-;24735:123;;;24599:126;20452:18230;;;;20522:6;-1:-1:-1;;;;;20452:18230:0;;-1:-1:-1;24638:32:0;-1:-1:-1;24599:126:0;;;;24283:1083;25329:28;23594:3;25329:28;;;;;;:::i;:::-;24283:1083;26943:3;:::i;24296:116::-;24389:23;;;;:::i;:::-;24372:40;;;24296:116;;24176:98;20859:5;24176:98;;23940:141;23594:3;24026:28;;;;;;:::i;23943:71::-;-1:-1:-1;;;;;20452:18230:0;;;;;;23974:15;:40;23943:71;;;23797:135;20452:18230;;;;;23418:6;20452:18230;;;23856:41;-1:-1:-1;;;;;23907:15:0;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;;;;23797:135;;;20452:18230;;;;;;;;;;;;;;;25668:13;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;25744:36;20452:18230;;;;;;25752:7;25744:36;:::i;:::-;20452:18230;;25794:15;:41;20452:18230;;25794:15;;20452:18230;;;25874:41;20452:18230;;;25958:16;;;:44;;;20452:18230;;;;20522:6;;25794:15;20522:6;25794:15;;20522:6;;;;26707:14;20452:18230;;;;26605:14;20452:18230;26676:29;20452:18230;;;25668:13;20452:18230;;;;;;26033:41;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;:::i;:::-;;;;26162:41;;;-1:-1:-1;;;;;26180:9:0;20452:18230;;;;26162:41;;26192:10;;20452:18230;;;;;26130:18;20452:18230;;20687:10;20452:18230;;;;20522:6;;20452:18230;;;20687:10;;;;-1:-1:-1;;;;;20687:10:0;20522:6;;20452:18230;20687:10;;;;;;;26227:9;26192:10;;26227:9;:::i;20452:18230::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;25958:44;25978:9;;;:24;25958:44;;20452:18230;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;33374:15;20452:18230;;;:::i;:::-;18830:62;;;;;;:::i;:::-;33374:15;:::i;20452:18230::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29417:21;;20452:18230;29472:9;20452:18230;29467:1014;29483:21;;;;;;30631:14;30495:9;30487:73;30495:9;;:26;30487:73;:::i;:::-;20452:18230;;-1:-1:-1;;;;;20452:18230:0;30631:14;:::i;29506:3::-;29539:13;;;;;;;;;:::i;:::-;20452:18230;;;;29588:18;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;;29625:60;29633:24;;;:::i;29625:60::-;20452:18230;;;29745:15;;;;20452:18230;29506:3;20452:18230;;;29797:9;30445:29;20452:18230;30428:46;20452:18230;;;;;;20522:6;;20452:18230;29797:9;:::i;:::-;20452:18230;;30080:15;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;29964:139;20452:18230;;;;29964:139;;20452:18230;;30142:13;20452:18230;;30404:14;20452:18230;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;30174:28;30214:10;30210:56;;29741:210;30299:19;30321:6;30299:19;;;:::i;30404:14::-;30445:29;:::i;30428:46::-;29506:3;;:::i;:::-;29472:9;;;;;30210:56;-1:-1:-1;20636:5:0;30210:56;;29741:210;29846:23;;29506:3;29846:23;;;30428:46;29846:23;30445:29;29846:23;29879:28;29846:23;;;:::i;:::-;29879:28;;;:::i;:::-;20452:18230;29932:9;20452:18230;;;;;;;;;29932:9;:::i;:::-;29741:210;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;21353:53;20452:18230;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;19126:130::-;19040:6;20452:18230;-1:-1:-1;;;;;20452:18230:0;17597:10;19189:23;20452:18230;;19126:130::o;20452:18230::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;20522:6;;;20452:18230;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;20522:6::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;3386:1204::-;;3526:1058;;;;;;;;;;;;;20968:6;3526:1058;;;;3386:1204;;;:::o;3526:1058::-;;;;;;;;;;;;;;;;;;3386:1204;:::o;3526:1058::-;;;;;;;;;;;;;;;;20452:18230;-1:-1:-1;;20452:18230:0;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;20522:6;;;20452:18230;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;30655:475;-1:-1:-1;;;;;20452:18230:0;38357:2;20452:18230;;;;;;;;;;;30843:33;;;;;;20452:18230;30843:33;;20452:18230;30843:33;;;;;;-1:-1:-1;30843:33:0;;;30655:475;-1:-1:-1;30839:287:0;;;31085:34;;;;;;20452:18230;;-1:-1:-1;;;31085:34:0;;-1:-1:-1;;;;;20452:18230:0;;;30843:33;31085:34;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;-1:-1:-1;20452:18230:0;;;;31085:34;;;;;;;;;;;;;30839:287;;30655:475::o;31085:34::-;;;;:::i;:::-;20452:18230;;-1:-1:-1;20452:18230:0;;;;;30839:287;-1:-1:-1;;;;;20452:18230:0;;;30914:20;20452:18230;;30946:34;;;;;;;20452:18230;;-1:-1:-1;;;30946:34:0;;-1:-1:-1;;;;;20452:18230:0;;;30843:33;30946:34;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;-1:-1:-1;20452:18230:0;;;;30946:34;20452:18230;30910:154;31005:50;;;;;;;;;;-1:-1:-1;20452:18230:0;;;;;;;;;;;;;;31005:50;;30843:33;31005:50;;20452:18230;;;;;;;;;;31005:50;;;;;;;;;;30910:154;30655:475::o;30843:33::-;;;;;;;;20452:18230;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;30843:33;20452:18230;;;;;30843:33;;20452:18230;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;30843:33;;;;20452:18230;;;;;-1:-1:-1;;;20452:18230:0;;;30843:33;20452:18230;;20522:6;20452:18230;30843:33;;;;;31134:434;;-1:-1:-1;;;;;20452:18230:0;20687:10;-1:-1:-1;;;;;20687:10:0;20452:18230;37286:2;20452:18230;;37253:54;-1:-1:-1;20452:18230:0;31366:13;20452:18230;;31366:41;20452:18230;-1:-1:-1;20452:18230:0;31366:41;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;31410:15;-1:-1:-1;20452:18230:0;;;;;-1:-1:-1;;;;20452:18230:0;;;;;;-1:-1:-1;;;20452:18230:0;;;;31500:63;;-1:-1:-1;;;;;20452:18230:0;;;-1:-1:-1;;;;;20452:18230:0;;;;;-1:-1:-1;;;;;;20452:18230:0;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;:::o;31572:348::-;;20452:18230;31572:348;-1:-1:-1;;;;;31866:49:0;31572:348;;20452:18230;20687:10;-1:-1:-1;;;;;20687:10:0;20452:18230;37286:2;20452:18230;;37253:54;20452:18230;;;;;;;31784:20;31780:81;;31572:348;-1:-1:-1;;20452:18230:0;;;31866:13;20452:18230;;;;;;;-1:-1:-1;;;;20452:18230:0;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;31780:81;20452:18230;-1:-1:-1;20452:18230:0;31814:13;20452:18230;;;-1:-1:-1;20452:18230:0;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;31780:81;;;31924:512;;;;;-1:-1:-1;;;;;;20452:18230:0;;20687:10;-1:-1:-1;;;;;20687:10:0;20452:18230;37286:2;20452:18230;;37253:54;20452:18230;;32162:13;20452:18230;;;;;32162:41;;;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;;32206:15;-1:-1:-1;20452:18230:0;;;32236:41;;;20452:18230;;-1:-1:-1;20452:18230:0;;-1:-1:-1;;;;;20452:18230:0;;;;;;-1:-1:-1;;;;;;20452:18230:0;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;31924:512::o;32440:695::-;37286:2;20452:18230;-1:-1:-1;;20452:18230:0;-1:-1:-1;;;;;20452:18230:0;;;37253:54;-1:-1:-1;20452:18230:0;;;32755:13;20452:18230;;;;;32755:41;;20452:18230;-1:-1:-1;;;;;20452:18230:0;-1:-1:-1;;32440:695:0;;37253:54;;32440:695;;;;;20452:18230;;;;32809:42;;;;;;;;32861:20;32857:75;;32440:695;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;32964:166;20452:18230;32964:166;;20452:18230;;;;32964:166;20452:18230;32964:166;;20452:18230;;;;37286:2;32964:166;;20452:18230;;;;;;32964:166;;;;20452:18230;;;;32964:166;;;;20452:18230;;;;;;32755:13;20452:18230;;;;;20522:6;;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;;;;;20750:8;20452:18230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;-1:-1:-1;;;;;;20452:18230:0;;;;32755:41;20452:18230;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;-1:-1:-1;;;;;;20452:18230:0;;;;30655:475::o;32857:75::-;32891:34;;;32857:75;;;20452:18230;;;;37316:292;20452:18230;-1:-1:-1;20452:18230:0;37421:13;20452:18230;;37486:28;-1:-1:-1;;;;;37421:41:0;20452:18230;-1:-1:-1;20452:18230:0;37421:41;20452:18230;;37486:28;;:::i;:::-;37528:13;;;:45;;;;37316:292;37528:74;;;;37520:83;37316:292;:::o;37528:74::-;37577:15;;;:25;37316:292;:::o;37528:45::-;37545:15;:28;;;-1:-1:-1;37528:45:0;;;37612:259;20452:18230;-1:-1:-1;20452:18230:0;37715:13;20452:18230;;37780:28;-1:-1:-1;;;;;37715:41:0;20452:18230;-1:-1:-1;20452:18230:0;37715:41;20452:18230;;37780:28;;:::i;:::-;37822:13;;;:43;;;;37814:52;37612:259;:::o;37822:43::-;37839:15;;;:26;;37612:259;:::o;37875:213::-;;-1:-1:-1;20452:18230:0;;;;37972:13;20452:18230;;-1:-1:-1;;;;;37972:41:0;20452:18230;;;37972:41;20452:18230;;20522:6;20750:8;20522:6;;;;;;;20452:18230;;;;37972:111;20452:18230;;;38040:18;20452:18230;;;;;37972:111;;:::i;:::-;37875:213;:::o;20522:6::-;-1:-1:-1;;;20522:6:0;;;;;;;;38490:190;-1:-1:-1;20452:18230:0;;;38593:13;20452:18230;;;;;38593:37;;20452:18230;;;38643:12;;;;38490:190;:::o;38643:32::-;;20797:10;38490:190;:::o

Swarm Source

ipfs://9eb44b425fef9950b2d08a3557d06e8d2e4de1647775c6834c49146f12492c24

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.