false
false

Contract Address Details

0xf965237c6b3f89f8c62b45b94097899e3562a830

Contract Name
RaribleExchangeWrapper
Creator
0x256eff–71d85b at 0x7ce40e–97d42a
Balance
0 Xai ($0.00 USD)
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
94520505
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
RaribleExchangeWrapper




Optimization enabled
true
Compiler version
v0.7.6+commit.7338295f




Optimization runs
200
EVM Version
istanbul




Verified at
2024-02-09T13:56:08.594991Z

Constructor Arguments

0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005faf16a85028be138a7178b222dec98092feef9700000000000000000000000000000000006c3852cbef3e08e8df289169ede58100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000248b46beb66b3078d771a9e7e5a0a0216d0d07ba
              

@rarible/exchange-wrapper/contracts/RaribleExchangeWrapper.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/transfer-manager/contracts/lib/LibTransfer.sol";
import "@rarible/lib-bp/contracts/BpLibrary.sol";
import "@rarible/lib-part/contracts/LibPart.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721Holder.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import "./interfaces/IWyvernExchange.sol";
import "./interfaces/IExchangeV2.sol";
import "./interfaces/ISeaPort.sol";
import "./interfaces/Ix2y2.sol";
import "./interfaces/ILooksRare.sol";
import "./interfaces/IBlur.sol";
import "./libraries/IsPausable.sol";
contract RaribleExchangeWrapper is Ownable, ERC721Holder, ERC1155Holder, IsPausable {
using LibTransfer for address;
using BpLibrary for uint;
using SafeMath for uint;
//marketplaces
address public immutable wyvernExchange;
address public immutable exchangeV2;
address public immutable seaPort_1_1;
address public immutable x2y2;
address public immutable looksRare;
address public immutable sudoswap;
address public immutable seaPort_1_4;
address public immutable looksRareV2;
address public immutable blur;
address public immutable seaPort_1_5;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/libraries/LibOrderDataV2.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibOrderDataV2 {
bytes4 constant public V2 = bytes4(keccak256("V2"));
struct DataV2 {
LibPart.Part[] payouts;
LibPart.Part[] originFees;
bool isMakeFill;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/libraries/LibOrderDataV3.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
/// @dev deprecated
library LibOrderDataV3 {
bytes4 constant public V3_SELL = bytes4(keccak256("V3_SELL"));
bytes4 constant public V3_BUY = bytes4(keccak256("V3_BUY"));
struct DataV3_SELL {
uint payouts;
uint originFeeFirst;
uint originFeeSecond;
uint maxFeesBasePoint;
bytes32 marketplaceMarker;
}
struct DataV3_BUY {
uint payouts;
uint originFeeFirst;
uint originFeeSecond;
bytes32 marketplaceMarker;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-manager/contracts/lib/LibTransfer.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
library LibTransfer {
function transferEth(address to, uint value) internal {
(bool success,) = to.call{ value: value }("");
require(success, "transfer failed");
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/lib-part/contracts/LibPart.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
library LibPart {
bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)");
struct Part {
address payable account;
uint96 value;
}
function hash(Part memory part) internal pure returns (bytes32) {
return keccak256(abi.encode(TYPE_HASH, part.account, part.value));
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/ExchangeV2.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "./ExchangeV2Core.sol";
import "@rarible/transfer-manager/contracts/RaribleTransferManager.sol";
contract ExchangeV2 is ExchangeV2Core, RaribleTransferManager {
function __ExchangeV2_init(
address _transferProxy,
address _erc20TransferProxy,
uint newProtocolFee,
address newDefaultFeeReceiver,
IRoyaltiesProvider newRoyaltiesProvider
) external initializer {
__Context_init_unchained();
__Ownable_init_unchained();
__TransferExecutor_init_unchained(_transferProxy, _erc20TransferProxy);
__RaribleTransferManager_init_unchained(newProtocolFee, newDefaultFeeReceiver, newRoyaltiesProvider);
__OrderValidator_init_unchained();
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/royalties-registry/contracts/RoyaltiesRegistry.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@rarible/exchange-interfaces/contracts/IRoyaltiesProvider.sol";
import "@rarible/royalties/contracts/LibRoyaltiesV2.sol";
import "@rarible/royalties/contracts/LibRoyaltiesV1.sol";
import "@rarible/royalties/contracts/LibRoyalties2981.sol";
import "@rarible/royalties/contracts/RoyaltiesV1.sol";
import "@rarible/royalties/contracts/RoyaltiesV2.sol";
import "@rarible/royalties/contracts/IERC2981.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
contract RoyaltiesRegistry is IRoyaltiesProvider, OwnableUpgradeable {
/// @dev deprecated
event RoyaltiesSetForToken(address indexed token, uint indexed tokenId, LibPart.Part[] royalties);
/// @dev emitted when royalties set for token in
event RoyaltiesSetForContract(address indexed token, LibPart.Part[] royalties);
/// @dev struct to store royalties in royaltiesByToken
struct RoyaltiesSet {
bool initialized;
LibPart.Part[] royalties;
}
/// @dev deprecated
mapping(bytes32 => RoyaltiesSet) public royaltiesByTokenAndTokenId;
/// @dev stores royalties for token contract, set in setRoyaltiesByToken() method
mapping(address => RoyaltiesSet) public royaltiesByToken;
/// @dev stores external provider and royalties type for token contract
mapping(address => uint) public royaltiesProviders;
/// @dev total amount or supported royalties types
// 0 - royalties type is unset
// 1 - royaltiesByToken, 2 - v2, 3 - v1,
// 4 - external provider, 5 - EIP-2981
// 6 - unsupported/nonexistent royalties type
uint constant royaltiesTypesAmount = 6;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-proxy/contracts/proxy/ERC20TransferProxy.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
import "@rarible/role-operator/contracts/OperatorRole.sol";
import "@rarible/exchange-interfaces/contracts/IERC20TransferProxy.sol";
contract ERC20TransferProxy is IERC20TransferProxy, Initializable, OperatorRole {
function __ERC20TransferProxy_init() external initializer {
__Ownable_init();
}
function erc20safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) override external onlyOperator {
require(token.transferFrom(from, to, value), "failure while transferring");
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/introspection/IERC165.sol

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

@rarible/exchange-interfaces/contracts/ITransferProxy.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "@rarible/lib-asset/contracts/LibAsset.sol";
interface ITransferProxy {
function transfer(LibAsset.Asset calldata asset, address from, address to) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./ERC1155Receiver.sol";
/**
* @dev _Available since v3.1._
*/
contract ERC1155Holder is ERC1155Receiver {
function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <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 GSN 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 payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-interfaces/contracts/IRoyaltiesProvider.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
interface IRoyaltiesProvider {
function getRoyalties(address token, uint tokenId) external returns (LibPart.Part[] memory);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/libraries/LibSeaPort.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
library LibSeaPort {
/**
* @dev For basic orders involving ETH / native / ERC20 <=> ERC721 / ERC1155
* matching, a group of six functions may be called that only requires a
* subset of the usual order arguments. Note the use of a "basicOrderType"
* enum; this represents both the usual order type as well as the "route"
* of the basic order (a simple derivation function for the basic order
* type is `basicOrderType = orderType + (4 * basicOrderRoute)`.)
*/
struct BasicOrderParameters {
address considerationToken; // 0x24
uint256 considerationIdentifier; // 0x44
uint256 considerationAmount; // 0x64
address payable offerer; // 0x84
address zone; // 0xa4
address offerToken; // 0xc4
uint256 offerIdentifier; // 0xe4
uint256 offerAmount; // 0x104
BasicOrderType basicOrderType; // 0x124
uint256 startTime; // 0x144
uint256 endTime; // 0x164
bytes32 zoneHash; // 0x184
uint256 salt; // 0x1a4
bytes32 offererConduitKey; // 0x1c4
bytes32 fulfillerConduitKey; // 0x1e4
uint256 totalOriginalAdditionalRecipients; // 0x204
AdditionalRecipient[] additionalRecipients; // 0x224
bytes signature; // 0x244
}
/**
* @dev Basic orders can supply any number of additional recipients, with the
* implied assumption that they are supplied from the offered ETH (or other
* native token) or ERC20 token for the order.
*/
struct AdditionalRecipient {
uint256 amount;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol

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

@rarible/exchange-interfaces/contracts/INftTransferProxy.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol";
interface INftTransferProxy {
function erc721safeTransferFrom(IERC721Upgradeable token, address from, address to, uint256 tokenId) external;
function erc1155safeTransferFrom(IERC1155Upgradeable token, address from, address to, uint256 id, uint256 value, bytes calldata data) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/role-operator/contracts/OperatorRole.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
contract OperatorRole is OwnableUpgradeable {
mapping (address => bool) operators;
function __OperatorRole_init() external initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function addOperator(address operator) external onlyOwner {
operators[operator] = true;
}
function removeOperator(address operator) external onlyOwner {
operators[operator] = false;
}
modifier onlyOperator() {
require(operators[_msgSender()], "OperatorRole: caller is not the operator");
_;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/libraries/LibOrder.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@rarible/lib-asset/contracts/LibAsset.sol";
import "./LibMath.sol";
import "./LibOrderDataV3.sol";
import "./LibOrderDataV2.sol";
import "./LibOrderDataV1.sol";
library LibOrder {
using SafeMathUpgradeable for uint;
bytes32 constant ORDER_TYPEHASH = keccak256(
"Order(address maker,Asset makeAsset,address taker,Asset takeAsset,uint256 salt,uint256 start,uint256 end,bytes4 dataType,bytes data)Asset(AssetType assetType,uint256 value)AssetType(bytes4 assetClass,bytes data)"
);
bytes4 constant DEFAULT_ORDER_TYPE = 0xffffffff;
struct Order {
address maker;
LibAsset.Asset makeAsset;
address taker;
LibAsset.Asset takeAsset;
uint salt;
uint start;
uint end;
bytes4 dataType;
bytes data;
}
/**
* @dev Calculate remaining make and take values of the order (after partial filling real make and take decrease)
* @param order initial order to calculate remaining values for
* @param fill current fill of the left order (0 if order is unfilled)
* @param isMakeFill true if order fill is calculated from the make side, false if from the take side
* @return makeValue remaining make value of the order. if fill = 0 then it's order's make value
* @return takeValue remaining take value of the order. if fill = 0 then it's order's take value
*/
function calculateRemaining(Order memory order, uint fill, bool isMakeFill) internal pure returns (uint makeValue, uint takeValue) {
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/royalties/contracts/RoyaltiesV1.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
interface RoyaltiesV1 {
event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps);
function getFeeRecipients(uint256 id) external view returns (address payable[] memory);
function getFeeBps(uint256 id) external view returns (uint[] memory);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/proxy/Initializable.sol

// SPDX-License-Identifier: MIT
// solhint-disable-next-line compiler-version
pragma solidity >=0.4.24 <0.8.0;
import "../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/lib-signature/contracts/LibSignature.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
library LibSignature {
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature)
internal
pure
returns (address)
{
// Check the signature length
if (signature.length != 65) {
revert("ECDSA: invalid signature length");
}
// Divide the signature in r, s and v variables
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solhint-disable-next-line no-inline-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/libraries/LibLooksRare.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
library LibLooksRare {
struct MakerOrder {
bool isOrderAsk; // true --> ask / false --> bid
address signer; // signer of the maker order
address collection; // collection address
uint256 price; // price (used as )
uint256 tokenId; // id of the token
uint256 amount; // amount of tokens to sell/purchase (must be 1 for ERC721, 1+ for ERC1155)
address strategy; // strategy for trade execution (e.g., DutchAuction, StandardSaleForFixedPrice)
address currency; // currency (e.g., WETH)
uint256 nonce; // order nonce (must be unique unless new maker order is meant to override existing one e.g., lower ask price)
uint256 startTime; // startTime in timestamp
uint256 endTime; // endTime in timestamp
uint256 minPercentageToAsk; // slippage protection (9000 --> 90% of the final price must return to ask)
bytes params; // additional parameters
uint8 v; // v: parameter (27 or 28)
bytes32 r; // r: parameter
bytes32 s; // s: parameter
}
struct TakerOrder {
bool isOrderAsk; // true --> ask / false --> bid
address taker; // msg.sender
uint256 price; // final price for the purchase
uint256 tokenId;
uint256 minPercentageToAsk; // // slippage protection (9000 --> 90% of the final price must return to ask)
bytes params; // other params (e.g., tokenId)
}
/**
* @notice CollectionType is used in OrderStructs.Maker's collectionType to determine the collection type being traded.
*/
enum CollectionType {
ERC721,
ERC1155
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/libraries/IsPausable.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@openzeppelin/contracts/access/Ownable.sol";
abstract contract IsPausable is Ownable {
bool public paused;
event Paused(bool paused);
function pause(bool _paused) external onlyOwner {
paused = _paused;
emit Paused(_paused);
}
function requireNotPaused() internal view {
require (!paused, "the contract is paused");
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/interfaces/Ix2y2.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
interface Ix2y2 {
struct OrderItem {
uint256 price;
bytes data;
}
struct Pair721 {
address token;
uint256 tokenId;
}
struct Pair1155 {
address token;
uint256 tokenId;
uint256 amount;
}
struct Order {
uint256 salt;
address user;
uint256 network;
uint256 intent;
uint256 delegateType;
uint256 deadline;
address currency;
bytes dataMask;
OrderItem[] items;
// signature
bytes32 r;
bytes32 s;
uint8 v;
uint8 signVersion;
}
struct Fee {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/royalties/contracts/LibRoyaltiesV1.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
library LibRoyaltiesV1 {
/*
* bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f
* bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb
*
* => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584
*/
bytes4 constant _INTERFACE_ID_FEES = 0xb7799584;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-manager/contracts/TransferExecutor.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/exchange-interfaces/contracts/ITransferProxy.sol";
import "@rarible/exchange-interfaces/contracts/INftTransferProxy.sol";
import "@rarible/exchange-interfaces/contracts/IERC20TransferProxy.sol";
import "./interfaces/ITransferExecutor.sol";
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "./lib/LibTransfer.sol";
abstract contract TransferExecutor is Initializable, OwnableUpgradeable, ITransferExecutor {
using LibTransfer for address;
mapping (bytes4 => address) internal proxies;
event ProxyChange(bytes4 indexed assetType, address proxy);
function __TransferExecutor_init_unchained(address transferProxy, address erc20TransferProxy) internal {
proxies[LibAsset.ERC20_ASSET_CLASS] = address(erc20TransferProxy);
proxies[LibAsset.ERC721_ASSET_CLASS] = address(transferProxy);
proxies[LibAsset.ERC1155_ASSET_CLASS] = address(transferProxy);
}
function setTransferProxy(bytes4 assetType, address proxy) external onlyOwner {
proxies[assetType] = proxy;
emit ProxyChange(assetType, proxy);
}
function transfer(
LibAsset.Asset memory asset,
address from,
address to,
address proxy
) internal override {
if (asset.assetType.assetClass == LibAsset.ERC721_ASSET_CLASS) {
//not using transfer proxy when transfering from this contract
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-manager/contracts/interfaces/ITransferManager.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "../lib/LibDeal.sol";
import "./ITransferExecutor.sol";
abstract contract ITransferManager is ITransferExecutor {
function doTransfers(
LibDeal.DealSide memory left,
LibDeal.DealSide memory right,
LibFeeSide.FeeSide feeSide
) internal virtual returns (uint totalMakeValue, uint totalTakeValue);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/interfaces/IBlur.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
interface IBlur {
enum Side { Buy, Sell }
enum SignatureVersion { Single, Bulk }
enum AssetType { ERC721, ERC1155 }
struct Fee {
uint16 rate;
address payable recipient;
}
struct Order {
address trader;
Side side;
address matchingPolicy;
address collection;
uint256 tokenId;
uint256 amount;
address paymentToken;
uint256 price;
uint256 listingTime;
/* Order expiration timestamp - 0 for oracle cancellations. */
uint256 expirationTime;
Fee[] fees;
uint256 salt;
bytes extraParams;
}
struct Input {
Order order;
uint8 v;
bytes32 r;
bytes32 s;
bytes extraSignature;
SignatureVersion signatureVersion;
uint256 blockNumber;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/libraries/LibDirectTransfer.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@rarible/lib-asset/contracts/LibAsset.sol";
library LibDirectTransfer { //LibDirectTransfers
/*All buy parameters need for create buyOrder and sellOrder*/
struct Purchase {
address sellOrderMaker; //
uint256 sellOrderNftAmount;
bytes4 nftAssetClass;
bytes nftData;
uint256 sellOrderPaymentAmount;
address paymentToken;
uint256 sellOrderSalt;
uint sellOrderStart;
uint sellOrderEnd;
bytes4 sellOrderDataType;
bytes sellOrderData;
bytes sellOrderSignature;
uint256 buyOrderPaymentAmount;
uint256 buyOrderNftAmount;
bytes buyOrderData;
}
/*All accept bid parameters need for create buyOrder and sellOrder*/
struct AcceptBid {
address bidMaker; //
uint256 bidNftAmount;
bytes4 nftAssetClass;
bytes nftData;
uint256 bidPaymentAmount;
address paymentToken;
uint256 bidSalt;
uint bidStart;
uint bidEnd;
bytes4 bidDataType;
bytes bidData;
bytes bidSignature;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/lib-bp/contracts/BpLibrary.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
library BpLibrary {
using SafeMathUpgradeable for uint;
function bp(uint value, uint bpValue) internal pure returns (uint) {
return value.mul(bpValue).div(10000);
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../proxy/Initializable.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
*
* The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
* they need in their contracts using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* _Available since v3.4._
*/
abstract contract EIP712Upgradeable is Initializable {
/* solhint-disable var-name-mixedcase */
bytes32 private _HASHED_NAME;
bytes32 private _HASHED_VERSION;
bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
/* solhint-enable var-name-mixedcase */
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/lib-asset/contracts/LibAsset.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
library LibAsset {
bytes4 constant public ETH_ASSET_CLASS = bytes4(keccak256("ETH"));
bytes4 constant public ERC20_ASSET_CLASS = bytes4(keccak256("ERC20"));
bytes4 constant public ERC721_ASSET_CLASS = bytes4(keccak256("ERC721"));
bytes4 constant public ERC1155_ASSET_CLASS = bytes4(keccak256("ERC1155"));
bytes4 constant public COLLECTION = bytes4(keccak256("COLLECTION"));
bytes4 constant public CRYPTO_PUNKS = bytes4(keccak256("CRYPTO_PUNKS"));
bytes32 constant ASSET_TYPE_TYPEHASH = keccak256(
"AssetType(bytes4 assetClass,bytes data)"
);
bytes32 constant ASSET_TYPEHASH = keccak256(
"Asset(AssetType assetType,uint256 value)AssetType(bytes4 assetClass,bytes data)"
);
struct AssetType {
bytes4 assetClass;
bytes data;
}
struct Asset {
AssetType assetType;
uint value;
}
function hash(AssetType memory assetType) internal pure returns (bytes32) {
return keccak256(abi.encode(
ASSET_TYPE_TYPEHASH,
assetType.assetClass,
keccak256(assetType.data)
));
}
function hash(Asset memory asset) internal pure returns (bytes32) {
return keccak256(abi.encode(
ASSET_TYPEHASH,
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMathUpgradeable {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/lazy-mint/contracts/erc-721/LibERC721LazyMint.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibERC721LazyMint {
bytes4 constant public ERC721_LAZY_ASSET_CLASS = bytes4(keccak256("ERC721_LAZY"));
bytes4 constant _INTERFACE_ID_MINT_AND_TRANSFER = 0x8486f69f;
struct Mint721Data {
uint tokenId;
string tokenURI;
LibPart.Part[] creators;
LibPart.Part[] royalties;
bytes[] signatures;
}
bytes32 public constant MINT_AND_TRANSFER_TYPEHASH = keccak256("Mint721(uint256 tokenId,string tokenURI,Part[] creators,Part[] royalties)Part(address account,uint96 value)");
function hash(Mint721Data memory data) internal pure returns (bytes32) {
bytes32[] memory royaltiesBytes = new bytes32[](data.royalties.length);
for (uint i = 0; i < data.royalties.length; ++i) {
royaltiesBytes[i] = LibPart.hash(data.royalties[i]);
}
bytes32[] memory creatorsBytes = new bytes32[](data.creators.length);
for (uint i = 0; i < data.creators.length; ++i) {
creatorsBytes[i] = LibPart.hash(data.creators[i]);
}
return keccak256(abi.encode(
MINT_AND_TRANSFER_TYPEHASH,
data.tokenId,
keccak256(bytes(data.tokenURI)),
keccak256(abi.encodePacked(creatorsBytes)),
keccak256(abi.encodePacked(royaltiesBytes))
));
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/royalties/contracts/LibRoyalties2981.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibRoyalties2981 {
/*
* https://eips.ethereum.org/EIPS/eip-2981: bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
*/
bytes4 constant _INTERFACE_ID_ROYALTIES = 0x2a55205a;
uint96 constant _WEIGHT_VALUE = 1000000;
/*Method for converting amount to percent and forming LibPart*/
function calculateRoyalties(address to, uint256 amount) internal view returns (LibPart.Part[] memory) {
LibPart.Part[] memory result;
if (amount == 0) {
return result;
}
uint256 percent = amount * 10000 / _WEIGHT_VALUE;
require(percent < 10000, "Royalties 2981 exceeds 100%");
result = new LibPart.Part[](1);
result[0].account = payable(to);
result[0].value = uint96(percent);
return result;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/interfaces/IExchangeV2.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "@rarible/exchange-v2/contracts/ExchangeV2.sol";
import {RoyaltiesRegistry} from "@rarible/royalties-registry/contracts/RoyaltiesRegistry.sol";
import {TransferProxy} from "@rarible/transfer-proxy/contracts/proxy/TransferProxy.sol";
import {ERC20TransferProxy} from "@rarible/transfer-proxy/contracts/proxy/ERC20TransferProxy.sol";
interface IExchangeV2 {
function matchOrders(
LibOrder.Order memory orderLeft,
bytes memory signatureLeft,
LibOrder.Order memory orderRight,
bytes memory signatureRight
) external payable;
function directPurchase(
LibDirectTransfer.Purchase calldata direct
) external payable;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/lib-signature/contracts/IERC1271.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
interface IERC1271 {
/**
* @dev Should return whether the signature provided is valid for the provided data
* @param _hash Hash of the data signed on the behalf of address(this)
* @param _signature Signature byte array associated with _data
*
* MUST return the bytes4 magic value 0x1626ba7e when function passes.
* MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)
* MUST allow external calls
*/
function isValidSignature(bytes32 _hash, bytes calldata _signature) virtual external view returns (bytes4 magicValue);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/libraries/LibFill.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "./LibOrder.sol";
library LibFill {
struct FillResult {
uint leftValue;
uint rightValue;
}
struct IsMakeFill {
bool leftMake;
bool rightMake;
}
/**
* @dev Should return filled values
* @param leftOrder left order
* @param rightOrder right order
* @param leftOrderFill current fill of the left order (0 if order is unfilled)
* @param rightOrderFill current fill of the right order (0 if order is unfilled)
* @param leftIsMakeFill true if left orders fill is calculated from the make side, false if from the take side
* @param rightIsMakeFill true if right orders fill is calculated from the make side, false if from the take side
* @return tuple representing fill of both assets
*/
function fillOrder(LibOrder.Order memory leftOrder, LibOrder.Order memory rightOrder, uint leftOrderFill, uint rightOrderFill, bool leftIsMakeFill, bool rightIsMakeFill) internal pure returns (FillResult memory) {
(uint leftMakeValue, uint leftTakeValue) = LibOrder.calculateRemaining(leftOrder, leftOrderFill, leftIsMakeFill);
(uint rightMakeValue, uint rightTakeValue) = LibOrder.calculateRemaining(rightOrder, rightOrderFill, rightIsMakeFill);
//We have 3 cases here:
if (rightTakeValue > leftMakeValue || (rightTakeValue == leftMakeValue && leftMakeValue == 0)) { //1nd: left order should be fully filled
return fillLeft(leftMakeValue, leftTakeValue, rightOrder.makeAsset.value, rightOrder.takeAsset.value);
}//2st: right order should be fully filled or 3d: both should be fully filled if required values are the same
return fillRight(leftOrder.makeAsset.value, leftOrder.takeAsset.value, rightMakeValue, rightTakeValue);
}
function fillRight(uint leftMakeValue, uint leftTakeValue, uint rightMakeValue, uint rightTakeValue) internal pure returns (FillResult memory result) {
uint makerValue = LibMath.safeGetPartialAmountFloor(rightTakeValue, leftMakeValue, leftTakeValue);
require(makerValue <= rightMakeValue, "fillRight: unable to fill");
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/libraries/LibOrderData.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "./LibOrder.sol";
library LibOrderData {
struct GenericOrderData {
LibPart.Part[] payouts;
LibPart.Part[] originFees;
bool isMakeFill;
}
function parse(LibOrder.Order memory order) pure internal returns (GenericOrderData memory dataOrder) {
if (order.dataType == LibOrderDataV1.V1) {
LibOrderDataV1.DataV1 memory data = abi.decode(order.data, (LibOrderDataV1.DataV1));
dataOrder.payouts = data.payouts;
dataOrder.originFees = data.originFees;
} else if (order.dataType == LibOrderDataV2.V2) {
LibOrderDataV2.DataV2 memory data = abi.decode(order.data, (LibOrderDataV2.DataV2));
dataOrder.payouts = data.payouts;
dataOrder.originFees = data.originFees;
dataOrder.isMakeFill = data.isMakeFill;
} else if (order.dataType == 0xffffffff) {
} else {
revert("Unknown Order data type");
}
if (dataOrder.payouts.length == 0) {
dataOrder.payouts = payoutSet(order.maker);
}
}
function payoutSet(address orderAddress) pure internal returns (LibPart.Part[] memory) {
LibPart.Part[] memory payout = new LibPart.Part[](1);
payout[0].account = payable(orderAddress);
payout[0].value = 10000;
return payout;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/lazy-mint/contracts/erc-1155/LibERC1155LazyMint.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibERC1155LazyMint {
bytes4 constant public ERC1155_LAZY_ASSET_CLASS = bytes4(keccak256("ERC1155_LAZY"));
bytes4 constant _INTERFACE_ID_MINT_AND_TRANSFER = 0x6db15a0f;
struct Mint1155Data {
uint tokenId;
string tokenURI;
uint supply;
LibPart.Part[] creators;
LibPart.Part[] royalties;
bytes[] signatures;
}
bytes32 public constant MINT_AND_TRANSFER_TYPEHASH = keccak256("Mint1155(uint256 tokenId,uint256 supply,string tokenURI,Part[] creators,Part[] royalties)Part(address account,uint96 value)");
function hash(Mint1155Data memory data) internal pure returns (bytes32) {
bytes32[] memory royaltiesBytes = new bytes32[](data.royalties.length);
for (uint i = 0; i < data.royalties.length; ++i) {
royaltiesBytes[i] = LibPart.hash(data.royalties[i]);
}
bytes32[] memory creatorsBytes = new bytes32[](data.creators.length);
for (uint i = 0; i < data.creators.length; ++i) {
creatorsBytes[i] = LibPart.hash(data.creators[i]);
}
return keccak256(abi.encode(
MINT_AND_TRANSFER_TYPEHASH,
data.tokenId,
data.supply,
keccak256(bytes(data.tokenURI)),
keccak256(abi.encodePacked(creatorsBytes)),
keccak256(abi.encodePacked(royaltiesBytes))
));
}
}
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../../introspection/IERC165.sol";
/**
* _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
@dev Handles the receipt of a single ERC1155 token type. This function is
called at the end of a `safeTransferFrom` after the balance has been updated.
To accept the transfer, this must return
`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
(i.e. 0xf23a6e61, or its own function selector).
@param operator The address which initiated the transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param id The ID of the token being transferred
@param value The amount of tokens being transferred
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
/**
@dev Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a `safeBatchTransferFrom` after the balances have
been updated. To accept the transfer(s), this must return
`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
(i.e. 0xbc197c81, or its own function selector).
@param operator The address which initiated the batch transfer (i.e. msg.sender)
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/ExchangeV2Core.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "./libraries/LibFill.sol";
import "./libraries/LibOrderData.sol";
import "./libraries/LibDirectTransfer.sol";
import "./OrderValidator.sol";
import "./AssetMatcher.sol";
import "@rarible/transfer-manager/contracts/TransferExecutor.sol";
import "@rarible/transfer-manager/contracts/interfaces/ITransferManager.sol";
import "@rarible/transfer-manager/contracts/lib/LibDeal.sol";
abstract contract ExchangeV2Core is Initializable, OwnableUpgradeable, AssetMatcher, TransferExecutor, OrderValidator, ITransferManager {
using SafeMathUpgradeable for uint;
using LibTransfer for address;
uint256 private constant UINT256_MAX = type(uint256).max;
//state of the orders
mapping(bytes32 => uint) public fills;
//events
event Cancel(bytes32 hash);
event Match(bytes32 leftHash, bytes32 rightHash, uint newLeftFill, uint newRightFill);
function cancel(LibOrder.Order memory order) external {
require(_msgSender() == order.maker, "not a maker");
require(order.salt != 0, "0 salt can't be used");
bytes32 orderKeyHash = LibOrder.hashKey(order);
fills[orderKeyHash] = UINT256_MAX;
emit Cancel(orderKeyHash);
}
/**
* @dev function, generate sellOrder and buyOrder from parameters and call validateAndMatch() for purchase transaction
*/
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "../../introspection/IERC165Upgradeable.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/ERC721Holder.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC721Receiver.sol";
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-manager/contracts/lib/LibFeeSide.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@rarible/lib-asset/contracts/LibAsset.sol";
library LibFeeSide {
enum FeeSide {NONE, LEFT, RIGHT}
function getFeeSide(bytes4 leftClass, bytes4 rightClass) internal pure returns (FeeSide) {
if (leftClass == LibAsset.ETH_ASSET_CLASS) {
return FeeSide.LEFT;
}
if (rightClass == LibAsset.ETH_ASSET_CLASS) {
return FeeSide.RIGHT;
}
if (leftClass == LibAsset.ERC20_ASSET_CLASS) {
return FeeSide.LEFT;
}
if (rightClass == LibAsset.ERC20_ASSET_CLASS) {
return FeeSide.RIGHT;
}
if (leftClass == LibAsset.ERC1155_ASSET_CLASS) {
return FeeSide.LEFT;
}
if (rightClass == LibAsset.ERC1155_ASSET_CLASS) {
return FeeSide.RIGHT;
}
return FeeSide.NONE;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/libraries/LibMath.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
library LibMath {
using SafeMathUpgradeable for uint;
/// @dev Calculates partial value given a numerator and denominator rounded down.
/// Reverts if rounding error is >= 0.1%
/// @param numerator Numerator.
/// @param denominator Denominator.
/// @param target Value to calculate partial of.
/// @return partialAmount value of target rounded down.
function safeGetPartialAmountFloor(
uint256 numerator,
uint256 denominator,
uint256 target
) internal pure returns (uint256 partialAmount) {
if (isRoundingErrorFloor(numerator, denominator, target)) {
revert("rounding error");
}
partialAmount = numerator.mul(target).div(denominator);
}
/// @dev Checks if rounding error >= 0.1% when rounding down.
/// @param numerator Numerator.
/// @param denominator Denominator.
/// @param target Value to multiply with numerator/denominator.
/// @return isError Rounding error is present.
function isRoundingErrorFloor(
uint256 numerator,
uint256 denominator,
uint256 target
) internal pure returns (bool isError) {
if (denominator == 0) {
revert("division by zero");
}
// The absolute rounding error is the difference between the rounded
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/interfaces/ILooksRare.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "../libraries/LibLooksRare.sol";
interface ILooksRare {
function matchAskWithTakerBidUsingETHAndWETH(LibLooksRare.TakerOrder calldata takerBid, LibLooksRare.MakerOrder calldata makerAsk) external payable;
/**
* @notice This function allows a user to execute a taker bid (against a maker ask).
* @param takerBid Taker bid struct
* @param makerAsk Maker ask struct
* @param makerSignature Maker signature
* @param merkleTree Merkle tree struct (if the signature contains multiple maker orders)
* @param affiliate Affiliate address
*/
function executeTakerBid(LibLooksRare.Taker calldata takerBid, LibLooksRare.Maker calldata makerAsk, bytes calldata makerSignature, LibLooksRare.MerkleTree calldata merkleTree, address affiliate) external payable;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../proxy/Initializable.sol";
/*
* @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 GSN 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 ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
uint256[50] private __gap;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-interfaces/contracts/IAssetMatcher.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-asset/contracts/LibAsset.sol";
interface IAssetMatcher {
function matchAssets(
LibAsset.AssetType memory leftAssetType,
LibAsset.AssetType memory rightAssetType
) external view returns (LibAsset.AssetType memory);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/royalties/contracts/IERC2981.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
///
/// @dev Interface for the NFT Royalty Standard
///
//interface IERC2981 is IERC165 {
interface IERC2981 {
/// ERC165 bytes to add to interface array - set in parent contract
/// implementing this standard
///
/// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
/// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
/// _registerInterface(_INTERFACE_ID_ERC2981);
/// @notice Called with the sale price to determine how much royalty
// is owed and to whom.
/// @param _tokenId - the NFT asset queried for royalty information
/// @param _salePrice - the sale price of the NFT asset specified by _tokenId
/// @return receiver - address of who should be sent the royalty payment
/// @return royaltyAmount - the royalty payment amount for _salePrice
function royaltyInfo(
uint256 _tokenId,
uint256 _salePrice
) external view returns (
address receiver,
uint256 royaltyAmount
);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/libraries/LibOrderDataV1.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibOrderDataV1 {
bytes4 constant public V1 = bytes4(keccak256("V1"));
struct DataV1 {
LibPart.Part[] payouts;
LibPart.Part[] originFees;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/OrderValidator.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "./libraries/LibOrder.sol";
import "@rarible/lib-signature/contracts/IERC1271.sol";
import "@rarible/lib-signature/contracts/LibSignature.sol";
import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol";
abstract contract OrderValidator is Initializable, ContextUpgradeable, EIP712Upgradeable {
using LibSignature for bytes32;
using AddressUpgradeable for address;
bytes4 constant internal MAGICVALUE = 0x1626ba7e;
function __OrderValidator_init_unchained() internal initializer {
__EIP712_init_unchained("Exchange", "2");
}
function validate(LibOrder.Order memory order, bytes memory signature) internal view {
if (order.salt == 0) {
if (order.maker != address(0)) {
require(_msgSender() == order.maker, "maker is not tx sender");
}
} else {
if (_msgSender() != order.maker) {
bytes32 hash = LibOrder.hash(order);
// if maker is contract checking ERC1271 signature
if (order.maker.isContract()) {
require(
IERC1271(order.maker).isValidSignature(_hashTypedDataV4(hash), signature) == MAGICVALUE,
"contract order signature verification error"
);
} else {
// if maker is not contract then checking ECDSA signature
if (_hashTypedDataV4(hash).recover(signature) != order.maker) {
revert("order signature verification error");
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/interfaces/IWyvernExchange.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
interface IWyvernExchange {
function atomicMatch_(
address[14] memory addrs,
uint[18] memory uints,
uint8[8] memory feeMethodsSidesKindsHowToCalls,
bytes memory calldataBuy,
bytes memory calldataSell,
bytes memory replacementPatternBuy,
bytes memory replacementPatternSell,
bytes memory staticExtradataBuy,
bytes memory staticExtradataSell,
uint8[2] memory vs,
bytes32[5] memory rssMetadata)
external
payable;
enum Side {
Buy,
Sell
}
enum SaleKind {
FixedPrice,
DutchAuction
}
function calculateFinalPrice(
Side side,
SaleKind saleKind,
uint256 basePrice,
uint256 extra,
uint256 listingTime,
uint256 expirationTime
) external view returns (uint256);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-manager/contracts/interfaces/ITransferExecutor.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-asset/contracts/LibAsset.sol";
abstract contract ITransferExecutor {
function transfer(
LibAsset.Asset memory asset,
address from,
address to,
address proxy
) internal virtual;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/introspection/ERC165.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165 is IERC165 {
/*
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
*/
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
constructor () internal {
// Derived contracts need only register support for their own interfaces,
// we register support for ERC165 itself here
_registerInterface(_INTERFACE_ID_ERC165);
}
/**
* @dev See {IERC165-supportsInterface}.
*
* Time complexity O(1), guaranteed to always use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return _supportedInterfaces[interfaceId];
}
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-interfaces/contracts/IERC20TransferProxy.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
interface IERC20TransferProxy {
function erc20safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-manager/contracts/RaribleTransferManager.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@rarible/lazy-mint/contracts/erc-721/LibERC721LazyMint.sol";
import "@rarible/lazy-mint/contracts/erc-1155/LibERC1155LazyMint.sol";
import "@rarible/exchange-interfaces/contracts/IRoyaltiesProvider.sol";
import "@rarible/lib-bp/contracts/BpLibrary.sol";
import "./interfaces/ITransferManager.sol";
abstract contract RaribleTransferManager is OwnableUpgradeable, ITransferManager {
using BpLibrary for uint;
using SafeMathUpgradeable for uint;
ProtocolFeeData public protocolFee;
IRoyaltiesProvider public royaltiesRegistry;
//deprecated
address private defaultFeeReceiver;
// deprecated
mapping(address => address) private feeReceivers;
/// @dev event that's emitted when ProtocolFeeData buyerAmount changes
event BuyerFeeAmountChanged(uint oldValue, uint newValue);
/// @dev event that's emitted when ProtocolFeeData sellerAmount changes
event SellerFeeAmountChanged(uint oldValue, uint newValue);
/// @dev event that's emitted when ProtocolFeeData receiver changes
event FeeReceiverChanged(address oldValue, address newValue);
/// @dev struct to store protocol fee - receiver address, buyer fee amount (in bp), seller fee amount (in bp)
struct ProtocolFeeData {
address receiver;
uint48 buyerAmount;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/royalties/contracts/LibRoyaltiesV2.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
library LibRoyaltiesV2 {
/*
* bytes4(keccak256('getRaribleV2Royalties(uint256)')) == 0xcad96cca
*/
bytes4 constant _INTERFACE_ID_ROYALTIES = 0xcad96cca;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-v2/contracts/AssetMatcher.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/exchange-interfaces/contracts/IAssetMatcher.sol";
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
abstract contract AssetMatcher is Initializable, OwnableUpgradeable {
bytes constant EMPTY = "";
mapping(bytes4 => address) internal matchers;
event MatcherChange(bytes4 indexed assetType, address matcher);
function setAssetMatcher(bytes4 assetType, address matcher) external onlyOwner {
matchers[assetType] = matcher;
emit MatcherChange(assetType, matcher);
}
function matchAssets(LibAsset.AssetType memory leftAssetType, LibAsset.AssetType memory rightAssetType) internal view returns (LibAsset.AssetType memory) {
LibAsset.AssetType memory result = matchAssetOneSide(leftAssetType, rightAssetType);
if (result.assetClass == 0) {
return matchAssetOneSide(rightAssetType, leftAssetType);
} else {
return result;
}
}
function matchAssetOneSide(LibAsset.AssetType memory leftAssetType, LibAsset.AssetType memory rightAssetType) private view returns (LibAsset.AssetType memory) {
bytes4 classLeft = leftAssetType.assetClass;
bytes4 classRight = rightAssetType.assetClass;
if (classLeft == LibAsset.ETH_ASSET_CLASS) {
if (classRight == LibAsset.ETH_ASSET_CLASS) {
return leftAssetType;
}
return LibAsset.AssetType(0, EMPTY);
}
if (classLeft == LibAsset.ERC20_ASSET_CLASS) {
if (classRight == LibAsset.ERC20_ASSET_CLASS) {
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "../../introspection/IERC165Upgradeable.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC1155Receiver.sol";
import "../../introspection/ERC165.sol";
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
constructor() internal {
_registerInterface(
ERC1155Receiver(address(0)).onERC1155Received.selector ^
ERC1155Receiver(address(0)).onERC1155BatchReceived.selector
);
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-manager/contracts/lib/LibDeal.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
import "@rarible/lib-asset/contracts/LibAsset.sol";
import "./LibFeeSide.sol";
library LibDeal {
struct DealSide {
LibAsset.Asset asset;
LibPart.Part[] payouts;
LibPart.Part[] originFees;
address proxy;
address from;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/transfer-proxy/contracts/proxy/TransferProxy.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
import "@rarible/role-operator/contracts/OperatorRole.sol";
import "@rarible/exchange-interfaces/contracts/INftTransferProxy.sol";
contract TransferProxy is INftTransferProxy, Initializable, OperatorRole {
function __TransferProxy_init() external initializer {
__Ownable_init();
}
function erc721safeTransferFrom(IERC721Upgradeable token, address from, address to, uint256 tokenId) override external onlyOperator {
token.safeTransferFrom(from, to, tokenId);
}
function erc1155safeTransferFrom(IERC1155Upgradeable token, address from, address to, uint256 id, uint256 value, bytes calldata data) override external onlyOperator {
token.safeTransferFrom(from, to, id, value, data);
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/exchange-wrapper/contracts/interfaces/ISeaPort.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "../libraries/LibSeaPort.sol";
interface ISeaPort {
function fulfillAdvancedOrder(
LibSeaPort.AdvancedOrder calldata advancedOrder,
LibSeaPort.CriteriaResolver[] calldata criteriaResolvers,
bytes32 fulfillerConduitKey,
address recipient
) external payable returns (bool fulfilled);
function fulfillAvailableAdvancedOrders(
LibSeaPort.AdvancedOrder[] memory advancedOrders,
LibSeaPort.CriteriaResolver[] calldata criteriaResolvers,
LibSeaPort.FulfillmentComponent[][] calldata offerFulfillments,
LibSeaPort.FulfillmentComponent[][] calldata considerationFulfillments,
bytes32 fulfillerConduitKey,
address recipient,
uint256 maximumFulfilled
) external payable returns (bool[] memory availableOrders, LibSeaPort.Execution[] memory executions);
function fulfillBasicOrder(LibSeaPort.BasicOrderParameters calldata parameters)
external
payable
returns (bool fulfilled);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@rarible/royalties/contracts/RoyaltiesV2.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
interface RoyaltiesV2 {
event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties);
function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":true,"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address[10]","name":"marketplaces","internalType":"address[10]"},{"type":"address","name":"_weth","internalType":"address"},{"type":"address[]","name":"transferProxies","internalType":"address[]"}]},{"type":"event","name":"Execution","inputs":[{"type":"bool","name":"result","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"bool","name":"paused","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approveWETH","inputs":[{"type":"address[]","name":"transferProxies","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"blur","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"bulkPurchase","inputs":[{"type":"tuple[]","name":"purchaseDetails","internalType":"struct RaribleExchangeWrapper.PurchaseDetails[]","components":[{"type":"uint8","name":"marketId","internalType":"enum RaribleExchangeWrapper.Markets"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"fees","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"address","name":"feeRecipientFirst","internalType":"address"},{"type":"address","name":"feeRecipientSecond","internalType":"address"},{"type":"bool","name":"allowFail","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"exchangeV2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"looksRare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"looksRareV2","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"onERC1155BatchReceived","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"onERC1155Received","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"onERC721Received","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[{"type":"bool","name":"_paused","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"seaPort_1_1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"seaPort_1_4","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"seaPort_1_5","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"singlePurchase","inputs":[{"type":"tuple","name":"purchaseDetails","internalType":"struct RaribleExchangeWrapper.PurchaseDetails","components":[{"type":"uint8","name":"marketId","internalType":"enum RaribleExchangeWrapper.Markets"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"fees","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"address","name":"feeRecipientFirst","internalType":"address"},{"type":"address","name":"feeRecipientSecond","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sudoswap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"weth","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"wyvernExchange","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"x2y2","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x6101e06040523480156200001257600080fd5b5060405162004cd538038062004cd5833981016040819052620000359162000344565b60006200004162000210565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200009d6301ffc9a760e01b62000214565b620000af630271189760e51b62000214565b82516001600160601b0319606091821b811660809081526020860151831b821660a09081526040870151841b831660c090815284880151851b841660e090815292880151851b841661010090815291880151851b841661012090815290880151851b84166101405291870151841b831661016052860151831b821661018052850151821b81166101a0529083901b166101c05260005b815181101562000206576001600160a01b03831615620001fd57826001600160a01b031663095ea7b38383815181106200017b57fe5b60200260200101516000196040518363ffffffff1660e01b8152600401620001a592919062000429565b602060405180830381600087803b158015620001c057600080fd5b505af1158015620001d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fb919062000400565b505b60010162000145565b5050505062000466565b3390565b6001600160e01b0319808216141562000274576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b80516001600160a01b0381168114620002b457600080fd5b919050565b600082601f830112620002ca578081fd5b815160206001600160401b03821115620002e057fe5b808202620002f082820162000442565b8381528281019086840183880185018910156200030b578687fd5b8693505b85841015620003385762000323816200029c565b8352600193909301929184019184016200030f565b50979650505050505050565b600080600061018084860312156200035a578283fd5b84601f85011262000369578283fd5b610140620003778162000442565b908501908086888411156200038a578687fd5b865b600a811015620003b757620003a1826200029c565b845260209384019391909101906001016200038c565b50508095505050620003c9816200029c565b61016086015190935090506001600160401b03811115620003e8578182fd5b620003f686828701620002b9565b9150509250925092565b60006020828403121562000412578081fd5b8151801515811462000422578182fd5b9392505050565b6001600160a01b03929092168252602082015260400190565b6040518181016001600160401b03811182821017156200045e57fe5b604052919050565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c6101605160601c6101805160601c6101a05160601c6101c05160601c61475f62000576600039806104f7528061060f528061082c528061099f52806121fd52806122b452806123435250806104af5280611cd852806120c5525080610c355280611af35280611b8d5250806104d352806119e9525080610bed52806119175280611ff5525080610524528061184552508061090b528061161952806116b3525080610d6c52806111c052806112565250806103af5280610f0e5280611e4a52508061092f52806110bd5280611f25525080610c115280610feb525061475f6000f3fe6080604052600436106101435760003560e01c806386dcbd27116100b6578063bd4486ee1161006f578063bd4486ee14610319578063c9f0a2fa1461032e578063df6c255814610343578063f23a6e6114610358578063f2fde38b14610378578063fc40c9c7146103985761014a565b806386dcbd27146102875780638da5cb5b146102a75780639110c777146102bc578063a05f32dc146102d1578063b94ee332146102e6578063bc197c81146102f95761014a565b80633733b82b116101085780633733b82b1461020b5780633fc8cef3146102205780635c975abb146102355780635ea1e4c91461024a578063715018a61461025f57806386496e7a146102745761014a565b80628534f71461014f57806301ffc9a71461017a57806302329a29146101a7578063150b7a02146101c9578063349d6a85146101f65761014a565b3661014a57005b600080fd5b34801561015b57600080fd5b506101646103ad565b6040516101719190613e85565b60405180910390f35b34801561018657600080fd5b5061019a6101953660046136e6565b6103d1565b6040516101719190613f0e565b3480156101b357600080fd5b506101c76101c23660046136ae565b6103f4565b005b3480156101d557600080fd5b506101e96101e4366004613318565b61049d565b6040516101719190613f19565b34801561020257600080fd5b506101646104ad565b34801561021757600080fd5b506101646104d1565b34801561022c57600080fd5b506101646104f5565b34801561024157600080fd5b5061019a610519565b34801561025657600080fd5b50610164610522565b34801561026b57600080fd5b506101c7610546565b6101c761028236600461386a565b6105f2565b34801561029357600080fd5b506101c76102a23660046133e7565b6107bd565b3480156102b357600080fd5b506101646108fa565b3480156102c857600080fd5b50610164610909565b3480156102dd57600080fd5b5061016461092d565b6101c76102f43660046135f3565b610951565b34801561030557600080fd5b506101e961031436600461326f565b610bda565b34801561032557600080fd5b50610164610beb565b34801561033a57600080fd5b50610164610c0f565b34801561034f57600080fd5b50610164610c33565b34801561036457600080fd5b506101e9610373366004613381565b610c57565b34801561038457600080fd5b506101c7610393366004613253565b610c68565b3480156103a457600080fd5b50610164610d6a565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b6103fc610d8e565b6001600160a01b031661040d6108fa565b6001600160a01b031614610456576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b6002805482151560ff19909116811790915560408051918252517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29181900360200190a150565b630a85bd0160e11b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b61054e610d8e565b6001600160a01b031661055f6108fa565b6001600160a01b0316146105a8576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6105fa610d92565b600061060584610de5565b905080156106b8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd610644610d8e565b30846040518463ffffffff1660e01b815260040161066493929190613e99565b602060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906136ca565b505b60006106c78560400151610eb0565b905060008080808460018111156106da57fe5b141561070b576106eb886000610ecc565b919450925090506106fc8288611de2565b6107068187611de2565b610766565b600184600181111561071957fe5b14156107455761072a886000611e0d565b9194509250905061073b82886121c9565b61070681876121c9565b60405162461bcd60e51b815260040161075d906140a2565b60405180910390fd5b7fcc54b89ca2d75d5612023b14f0a477212b0e08bc0c5b8ad2804e2f8e2e401fc0836040516107959190613f0e565b60405180910390a16107a5612286565b84156107b3576107b361229a565b5050505050505050565b6107c5610d8e565b6001600160a01b03166107d66108fa565b6001600160a01b03161461081f576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b60005b818110156108f5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b384848481811061086557fe5b905060200201602081019061087a9190613253565b6000196040518363ffffffff1660e01b815260040161089a929190613ef5565b602060405180830381600087803b1580156108b457600080fd5b505af11580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec91906136ca565b50600101610822565b505050565b6000546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610959610d92565b60008060008060008060005b8a518110156109965761098a8b828151811061097d57fe5b6020026020010151610de5565b90910190600101610965565b508015610a48577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd6109d4610d8e565b30846040518463ffffffff1660e01b81526004016109f493929190613e99565b602060405180830381600087803b158015610a0e57600080fd5b505af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4691906136ca565b505b60005b8a51811015610b72576000610a768c8381518110610a6557fe5b602002602001015160400151610eb0565b90506000808080846001811115610a8957fe5b1415610ad057610aac8f8681518110610a9e57fe5b60200260200101518d610ecc565b91945092509050610abd8b836123e8565b9a50610ac98a826123e8565b9950610b21565b6001846001811115610ade57fe5b141561074557610b018f8681518110610af357fe5b60200260200101518d611e0d565b91945092509050610b1289836123e8565b9850610b1e88826123e8565b97505b8680610b2a5750825b96507fcc54b89ca2d75d5612023b14f0a477212b0e08bc0c5b8ad2804e2f8e2e401fc083604051610b5b9190613f0e565b60405180910390a150505050806001019050610a4b565b5081610b905760405162461bcd60e51b815260040161075d906142b3565b610b9a868a611de2565b610ba48589611de2565b610bae848a6121c9565b610bb883896121c9565b610bc0612286565b8015610bce57610bce61229a565b50505050505050505050565b63bc197c8160e01b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b63f23a6e6160e01b95945050505050565b610c70610d8e565b6001600160a01b0316610c816108fa565b6001600160a01b031614610cca576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b6001600160a01b038116610d0f5760405162461bcd60e51b81526004018080602001828103825260268152602001806146c36026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b3390565b60025460ff1615610de3576040805162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b565b600080600090506000610dfb8460400151610eb0565b90506001816001811115610e0b57fe5b1415610ea95760208401516040850151928101926000918291610e2d91612449565b91509150808285010193506000610e5187606001518860400151896000015161247a565b91505060005b8151811015610ea457600060a0838381518110610e7057fe5b6020026020010151901c90506000610e95828b6020015161253390919063ffffffff16565b97909701965050600101610e57565b505050505b5092915050565b6000603082901c61ffff166001811115610ec657fe5b92915050565b6000806000806000610eeb87606001518860400151896000015161247a565b60208901519193509150600288516009811115610f0457fe5b1415610fd25760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168285604051610f459190613e69565b60006040518083038185875af1925050503d8060008114610f82576040519150601f19603f3d011682016040523d82523d6000602084013e610f87565b606091505b505090508715610faf5780610faa57600080600096509650965050505050611ddb565b610fcc565b80610fcc5760405162461bcd60e51b815260040161075d90614108565b50611da9565b600188516009811115610fe157fe5b14156110a45760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682856040516110229190613e69565b60006040518083038185875af1925050503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b5050905087156110875780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90613f98565b6000885160098111156110b357fe5b14156111765760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682856040516110f49190613e69565b60006040518083038185875af1925050503d8060008114611131576040519150601f19603f3d011682016040523d82523d6000602084013e611136565b606091505b5050905087156111595780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90614006565b60038851600981111561118557fe5b14156115c8576000838060200190518101906111a191906138c0565b9050871561123f5760405163357a150b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063357a150b9084906111f7908590600401614318565b6000604051808303818588803b15801561121057600080fd5b505af193505050508015611222575060015b61123a57600080600096509650965050505050611ddb565b6112c0565b60405163357a150b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063357a150b90849061128d908590600401614318565b6000604051808303818588803b1580156112a657600080fd5b505af11580156112ba573d6000803e3d6000fd5b50505050505b60005b8160200151518110156115c1576000826020015182815181106112e257fe5b602002602001015160200151905060008360200151838151811061130257fe5b602002602001015160400151905060008460000151838151811061132257fe5b60200260200101516101000151828151811061133a57fe5b602002602001015160200151905060008560000151848151811061135a57fe5b602002602001015160e0015151118015611390575060008560200151858151811061138157fe5b602002602001015160c0015151115b156113d6576113d681866020015186815181106113a957fe5b602002602001015160c00151876000015186815181106113c557fe5b602002602001015160e0015161254b565b84518051849081106113e457fe5b602002602001015160800151600114156114b95760008180602001905181019061140e9190613532565b905060005b81518110156114b257600082828151811061142a57fe5b6020026020010151905080600001516001600160a01b03166342842e0e30611450610d8e565b84602001516040518463ffffffff1660e01b815260040161147393929190613e99565b600060405180830381600087803b15801561148d57600080fd5b505af11580156114a1573d6000803e3d6000fd5b505060019093019250611413915050565b50506115b3565b84518051849081106114c757fe5b6020026020010151608001516002141561159b576000818060200190518101906114f19190613455565b905060005b81518110156114b257600082828151811061150d57fe5b6020026020010151905080600001516001600160a01b031663f242432a30611533610d8e565b846020015185604001516040518563ffffffff1660e01b815260040161155c9493929190613ebd565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b5050600190930192506114f6915050565b60405162461bcd60e51b815260040161075d906141e2565b5050508060010190506112c3565b5050611da9565b6004885160098111156115d757fe5b141561182c576000806000858060200190518101906115f69190613988565b925092509250891561169c57604051635a72594b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4e4b296908690611652908790879060040161449f565b6000604051808303818588803b15801561166b57600080fd5b505af19350505050801561167d575060015b611697576000806000985098509850505050505050611ddb565b61171f565b604051635a72594b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4e4b2969086906116ec908790879060040161449f565b6000604051808303818588803b15801561170557600080fd5b505af1158015611719573d6000803e3d6000fd5b50505050505b6001600160e01b031981166339d690a360e11b14156117ae5781604001516001600160a01b03166342842e0e30611754610d8e565b85608001516040518463ffffffff1660e01b815260040161177793929190613e99565b600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b50505050611824565b6001600160e01b0319811663025ceed960e61b141561180c5781604001516001600160a01b031663f242432a306117e3610d8e565b85608001518660a001516040518563ffffffff1660e01b81526004016117779493929190613ebd565b60405162461bcd60e51b815260040161075d90614250565b505050611da9565b60058851600981111561183b57fe5b14156118fe5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316828560405161187c9190613e69565b60006040518083038185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b5050905087156118e15780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d906141ab565b60068851600981111561190d57fe5b14156119d05760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316828560405161194e9190613e69565b60006040518083038185875af1925050503d806000811461198b576040519150601f19603f3d011682016040523d82523d6000602084013e611990565b606091505b5050905087156119b35780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90613fcf565b6007885160098111156119df57fe5b1415611aa25760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168285604051611a209190613e69565b60006040518083038185875af1925050503d8060008114611a5d576040519150601f19603f3d011682016040523d82523d6000602084013e611a62565b606091505b505090508715611a855780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90614219565b600888516009811115611ab157fe5b1415611cbf57600080600085806020019051810190611ad091906137f6565b9250925092508915611b7657604051639a1fc3a760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a1fc3a7908690611b2c90879087906004016142ea565b6000604051808303818588803b158015611b4557600080fd5b505af193505050508015611b57575060015b611b71576000806000985098509850505050505050611ddb565b611bf9565b604051639a1fc3a760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a1fc3a7908690611bc690879087906004016142ea565b6000604051808303818588803b158015611bdf57600080fd5b505af1158015611bf3573d6000803e3d6000fd5b50505050505b6001600160e01b031981166339d690a360e11b1415611c58578251606001516001600160a01b03166342842e0e30611c2f610d8e565b8651608001516040516001600160e01b031960e086901b16815261177793929190600401613e99565b6001600160e01b0319811663025ceed960e61b141561180c578251606001516001600160a01b031663f242432a30611c8e610d8e565b8651608081015160a0909101516040516001600160e01b031960e087901b1681526117779493929190600401613ebd565b600988516009811115611cce57fe5b1415611d915760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168285604051611d0f9190613e69565b60006040518083038185875af1925050503d8060008114611d4c576040519150601f19603f3d011682016040523d82523d6000602084013e611d51565b606091505b505090508715611d745780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d9061413f565b60405162461bcd60e51b815260040161075d90614074565b611db78289602001516125dc565b600080611dcc8a604001518b60200151612449565b60019950909750955050505050505b9250925092565b600082118015611dfa57506001600160a01b03811615155b15611e0957611e098183612665565b5050565b6000806000806000611e2c87606001518860400151896000015161247a565b9092509050600287516009811115611e4057fe5b1415611f0c5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031683604051611e809190613e69565b6000604051808303816000865af19150503d8060008114611ebd576040519150601f19603f3d011682016040523d82523d6000602084013e611ec2565b606091505b505090508615611ee95780611ee4576000806000955095509550505050611ddb565b611f06565b80611f065760405162461bcd60e51b815260040161075d90614176565b50612194565b600087516009811115611f1b57fe5b1415611fdc5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031683604051611f5b9190613e69565b6000604051808303816000865af19150503d8060008114611f98576040519150601f19603f3d011682016040523d82523d6000602084013e611f9d565b606091505b505090508615611fbf5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d9061403d565b600687516009811115611feb57fe5b14156120ac5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168360405161202b9190613e69565b6000604051808303816000865af19150503d8060008114612068576040519150601f19603f3d011682016040523d82523d6000602084013e61206d565b606091505b50509050861561208f5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d90613f2e565b6009875160098111156120bb57fe5b141561217c5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836040516120fb9190613e69565b6000604051808303816000865af19150503d8060008114612138576040519150601f19603f3d011682016040523d82523d6000602084013e61213d565b606091505b50509050861561215f5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d90613f63565b60405162461bcd60e51b815260040161075d906140d9565b6121a28188602001516126fd565b6000806121b789604001518a60200151612449565b60019b919a5098509650505050505050565b6000821180156121e157506001600160a01b03811615155b15611e095760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906122349084908690600401613ef5565b602060405180830381600087803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f591906136ca565b478015612297576122973382612665565b50565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906122e9903090600401613e85565b60206040518083038186803b15801561230157600080fd5b505afa158015612315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123399190613a75565b90508015612297577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612378610d8e565b836040518363ffffffff1660e01b8152600401612396929190613ef5565b602060405180830381600087803b1580156123b057600080fd5b505af11580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0991906136ca565b600082820183811015612442576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008061ffff601085901c81169085166124638583612533565b61246d8683612533565b9350935050509250929050565b6060806000602085901c61ffff16600181111561249357fe5b9050606060008260018111156124a557fe5b14156124b757869350915061252b9050565b60018260018111156124c557fe5b1415612513576000878060200190518101906124e19190613702565b90506124ec86612786565b1561250757806000015181602001519450945050505061252b565b519350915061252b9050565b60405162461bcd60e51b815260040161075d9061427c565b935093915050565b600061244261271061254585856127d8565b90612831565b815183511461255957600080fd5b805183511461256757600080fd5b60005b83518110156125d65781818151811061257f57fe5b01602001516001600160f81b031916156125ce5782818151811061259f57fe5b602001015160f81c60f81b8482815181106125b657fe5b60200101906001600160f81b031916908160001a9053505b60010161256a565b50505050565b60005b82518110156108f55760008382815181106125f657fe5b6020026020010151111561265d57600083828151811061261257fe5b60200260200101519050600060a085848151811061262c57fe5b6020026020010151901c9050600061264d828661253390919063ffffffff16565b90506126598184611de2565b5050505b6001016125df565b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146126b0576040519150601f19603f3d011682016040523d82523d6000602084013e6126b5565b606091505b50509050806108f5576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60005b82518110156108f557600083828151811061271757fe5b6020026020010151111561277e57600083828151811061273357fe5b60200260200101519050600060a085848151811061274d57fe5b6020026020010151901c9050600061276e828661253390919063ffffffff16565b905061277a81846121c9565b5050505b600101612700565b6000600582600981111561279657fe5b14806127ad575060048260098111156127ab57fe5b145b806127c3575060078260098111156127c157fe5b145b156127d0575060016103ef565b506000919050565b6000826127e757506000610ec6565b828202828482816127f457fe5b04146124425760405162461bcd60e51b81526004018080602001828103825260218152602001806146e96021913960400191505060405180910390fd5b6000808211612887576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161289057fe5b049392505050565b80356103ef81614689565b80516103ef81614689565b600082601f8301126128be578081fd5b815160206128d36128ce8361461f565b6145fc565b828152818101908583016040808602880185018910156128f1578687fd5b865b8681101561295b5781838b031215612909578788fd5b81518281018181106001600160401b038211171561292357fe5b8352835161ffff8116811461293657898afd5b81528387015161294581614689565b81880152855293850193918101916001016128f3565b509198975050505050505050565b600082601f830112612979578081fd5b815160206129896128ce8361461f565b828152818101908583016040808602880185018910156129a7578687fd5b865b8681101561295b5781838b0312156129bf578788fd5b81518281018181106001600160401b03821117156129d957fe5b835283518152868401516129ec81614689565b81880152855293850193918101916001016129a9565b600082601f830112612a12578081fd5b81516020612a226128ce8361461f565b82815281810190858301855b85811015612aab5781518801604080601f19838d03011215612a4e578889fd5b80518181016001600160401b038282108183111715612a6957fe5b818452848a01518352928401519280841115612a83578b8cfd5b5050612a938c8984860101612df9565b81890152865250509284019290840190600101612a2e565b5090979650505050505050565b600082601f830112612ac8578081fd5b81516020612ad86128ce8361461f565b82815281810190858301855b85811015612aab57815188016101a080601f19838d03011215612b05578889fd5b612b0e816145fc565b878301518152612b20604084016128a3565b88820152606083015160408201526080830151606082015260a0830151608082015260c083015160a0820152612b5860e084016128a3565b60c08201526101008301516001600160401b0380821115612b77578b8cfd5b612b858e8b84880101612df9565b60e084015261012091508185015181811115612b9f578c8dfd5b612bad8f8c83890101612a02565b610100850152505061014080850151828401526101609150818501518184015250610180612bdc818601613242565b82840152612beb848601613242565b9083015250865250509284019290840190600101612ae4565b600082601f830112612c14578081fd5b81516020612c246128ce8361461f565b82815281810190858301855b85811015612aab578151880161016080601f19838d03011215612c51578889fd5b612c5a816145fc565b612c65888401612e44565b815260408084015189830152606080850151828401526080915081850151818401525060a0808501518284015260c09150612ca18286016128a3565b9083015260e08401516001600160401b0380821115612cbe578c8dfd5b612ccc8f8c84890101612df9565b8385015261010092508286015160e0850152610120915081860151838501526101409250828601518285015284860151945080851115612d0a578c8dfd5b5050612d1a8d8a85870101612969565b90820152865250509284019290840190600101612c30565b600082601f830112612d42578081fd5b81356020612d526128ce8361461f565b8281528181019085830183850287018401881015612d6e578586fd5b855b85811015612aab57813584529284019290840190600101612d70565b80356103ef8161469e565b80516103ef8161469e565b80516103ef816146ac565b600082601f830112612dbd578081fd5b8135612dcb6128ce8261463c565b818152846020838601011115612ddf578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112612e09578081fd5b8151612e176128ce8261463c565b818152846020838601011115612e2b578283fd5b612e3c82602083016020870161465d565b949350505050565b8051600881106103ef57600080fd5b8051600281106103ef57600080fd5b600060e08284031215612e73578081fd5b612e7d60e06145fc565b905081516001600160401b0380821115612e9657600080fd5b612ea285838601613026565b8352612eb060208501613242565b602084015260408401516040840152606084015160608401526080840151915080821115612edd57600080fd5b50612eea84828501612df9565b608083015250612efc60a08301612e53565b60a082015260c082015160c082015292915050565b6000610200808385031215612f24578182fd5b612f2d816145fc565b915050612f3982612d97565b8152612f47602083016128a3565b6020820152612f58604083016128a3565b6040820152606082015160608201526080820151608082015260a082015160a0820152612f8760c083016128a3565b60c0820152612f9860e083016128a3565b60e08201526101008281015190820152610120808301519082015261014080830151908201526101608083015190820152610180808301516001600160401b03811115612fe457600080fd5b612ff085828601612df9565b8284015250506101a0613004818401613242565b908201526101c082810151908201526101e09182015191810191909152919050565b60006101a0808385031215613039578182fd5b613042816145fc565b91505061304e826128a3565b815261305c60208301612e53565b602082015261306d604083016128a3565b604082015261307e606083016128a3565b60608201526080820151608082015260a082015160a08201526130a360c083016128a3565b60c082015260e0828101519082015261010080830151908201526101208083015190820152610140808301516001600160401b03808211156130e457600080fd5b6130f0868387016128ae565b838501526101609250828501518385015261018092508285015191508082111561311957600080fd5b5061312685828601612df9565b82840152505092915050565b600060808284031215613143578081fd5b604051608081016001600160401b03828210818311171561316057fe5b8160405282935084359150600a821061317857600080fd5b818352602085013560208401526040850135604084015260608501359150808211156131a357600080fd5b506131b085828601612dad565b6060830152505092915050565b600060c082840312156131ce578081fd5b60405160c081018181106001600160401b03821117156131ea57fe5b806040525080915082518152602083015160208201526040830151604082015260608301516060820152608083015161322281614689565b608082015260a08301516132358161469e565b60a0919091015292915050565b805160ff811681146103ef57600080fd5b600060208284031215613264578081fd5b813561244281614689565b600080600080600060a08688031215613286578081fd5b853561329181614689565b945060208601356132a181614689565b935060408601356001600160401b03808211156132bc578283fd5b6132c889838a01612d32565b945060608801359150808211156132dd578283fd5b6132e989838a01612d32565b935060808801359150808211156132fe578283fd5b5061330b88828901612dad565b9150509295509295909350565b6000806000806080858703121561332d578182fd5b843561333881614689565b9350602085013561334881614689565b92506040850135915060608501356001600160401b03811115613369578182fd5b61337587828801612dad565b91505092959194509250565b600080600080600060a08688031215613398578283fd5b85356133a381614689565b945060208601356133b381614689565b9350604086013592506060860135915060808601356001600160401b038111156133db578182fd5b61330b88828901612dad565b600080602083850312156133f9578182fd5b82356001600160401b038082111561340f578384fd5b818501915085601f830112613422578384fd5b813581811115613430578485fd5b8660208083028501011115613443578485fd5b60209290920196919550909350505050565b60006020808385031215613467578182fd5b82516001600160401b038082111561347d578384fd5b818501915085601f830112613490578384fd5b815161349e6128ce8261461f565b818152848101908486016060808502870188018b10156134bc578889fd5b8896505b848710156135235780828c0312156134d6578889fd5b6040805182810181811089821117156134eb57fe5b825283516134f881614689565b8152838a01518a820152818401519181019190915284526001969096019592870192908101906134c0565b50909998505050505050505050565b60006020808385031215613544578182fd5b82516001600160401b038082111561355a578384fd5b818501915085601f83011261356d578384fd5b815161357b6128ce8261461f565b818152848101908486016040808502870188018b1015613599578889fd5b8896505b848710156135235780828c0312156135b3578889fd5b805181810181811088821117156135c657fe5b825282516135d381614689565b81528289015189820152845260019690960195928701929081019061359d565b60008060008060808587031215613608578182fd5b84356001600160401b0381111561361d578283fd5b8501601f8101871361362d578283fd5b8035602061363d6128ce8361461f565b82815281810190848301875b85811015613672576136608d8684358a0101613132565b84529284019290840190600101613649565b50508098505050613684818901612898565b955050505061369560408601612898565b91506136a360608601612d8c565b905092959194509250565b6000602082840312156136bf578081fd5b81356124428161469e565b6000602082840312156136db578081fd5b81516124428161469e565b6000602082840312156136f7578081fd5b8135612442816146ac565b60006020808385031215613714578182fd5b82516001600160401b038082111561372a578384fd5b908401906040828703121561373d578384fd5b60405160408101818110838211171561375257fe5b604052825182811115613763578586fd5b61376f88828601612df9565b8252508383015182811115613782578586fd5b80840193505086601f840112613796578485fd5b825191506137a66128ce8361461f565b82815284810190848601868502860187018a10156137c2578788fd5b8795505b848610156137e45780518352600195909501949186019186016137c6565b50948201949094529695505050505050565b60008060006060848603121561380a578081fd5b83516001600160401b0380821115613820578283fd5b61382c87838801612e62565b94506020860151915080821115613841578283fd5b5061384e86828701612e62565b925050604084015161385f816146ac565b809150509250925092565b60008060006060848603121561387e578081fd5b83356001600160401b03811115613893578182fd5b61389f86828701613132565b93505060208401356138b081614689565b9150604084013561385f81614689565b6000602082840312156138d1578081fd5b81516001600160401b03808211156138e7578283fd5b9083019061016082860312156138fb578283fd5b61390560c06145fc565b825182811115613913578485fd5b61391f87828601612ab8565b825250602083015182811115613933578485fd5b61393f87828601612c04565b60208301525061395286604085016131bd565b60408201526101008301516060820152610120830151608082015261397a6101408401613242565b60a082015295945050505050565b60008060006060848603121561399c578081fd5b83516001600160401b03808211156139b2578283fd5b9085019060c082880312156139c5578283fd5b60405160c0810181811083821117156139da57fe5b6040526139e683612d97565b81526139f4602084016128a3565b602082015260408301516040820152606083015160608201526080830151608082015260a083015182811115613a28578485fd5b613a3489828601612df9565b60a0830152506020870151909550915080821115613a50578283fd5b50613a5d86828701612f11565b925050613a6c60408501612da2565b90509250925092565b600060208284031215613a86578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015613ae1578151805161ffff1688528301516001600160a01b03168388015260409096019590820190600101613aad565b509495945050505050565b6000815180845260208085019450808401835b83811015613ae1578151805188528301516001600160a01b03168388015260409096019590820190600101613aff565b60008282518085526020808601955080818302840101818601855b84811015612aab57858303601f190189528151805184528401516040858501819052613b7881860183613c7e565b9a86019a9450505090830190600101613b4a565b6000815180845260208085018081965082840281019150828601855b85811015613c6b5782840389528151610160613bc5868351613caa565b818701518688015260408083015190870152606080830151908701526080808301519087015260a080830151613bfd82890182613a8d565b505060c0808301518282890152613c1683890182613c7e565b60e085810151908a015261010080860151908a015261012080860151908a015261014094850151898203958a01959095529250613c57915082905083613aec565b9a87019a9550505090840190600101613ba8565b5091979650505050505050565b15159052565b60008151808452613c9681602086016020860161465d565b601f01601f19169290920160200192915050565b60088110613cb457fe5b9052565b60028110613cb457fe5b6000815160e08452613cd860e085018251613a8d565b6020810151610100613cec81870183613cb8565b60408301519150610120613d0281880184613a8d565b60608401519250610140613d1881890185613a8d565b6080850151935061016084818a015260a0860151945061018085818b015260c087015195506101a0613d4c818c0188613a8d565b60e08801516101c08c0152858801516101e08c0152848801516102008c0152838801519650806102208c015250613d876102808b0187613a9a565b918701516102408b01529095015188860360df19016102608a0152949350613db59250839150849050613c7e565b9150506020830151613dca6020860182613e62565b50604083015160408501526060830151606085015260808301518482036080860152613df68282613c7e565b91505060a0830151613e0b60a0860182613cb8565b5060c083015160c08501528091505092915050565b805182526020808201519083015260408082015190830152606080820151908301526080808201516001600160a01b03169083015260a0908101511515910152565b60ff169052565b60008251613e7b81846020870161465d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6001600160e01b031991909116815260200190565b6020808252818101527f507572636861736520536561506f72745f315f34206661696c65642057455448604082015260600190565b6020808252818101527f507572636861736520536561506f72745f315f35206661696c65642057455448604082015260600190565b6020808252601e908201527f50757263686173652077797665726e45786368616e6765206661696c65640000604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f34206661696c65640000000000604082015260600190565b60208082526017908201527f50757263686173652072617269626c65206661696c6564000000000000000000604082015260600190565b6020808252601c908201527f50757263686173652072617269626c65206661696c6564205745544800000000604082015260600190565b6020808252601490820152730aadcd6dcdeeedc40dac2e4d6cae892c8408aa8960631b604082015260600190565b60208082526019908201527f556e6b6e6f776e2070757263686173652063757272656e637900000000000000604082015260600190565b6020808252601590820152740aadcd6dcdeeedc40dac2e4d6cae892c840ae8aa89605b1b604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f31206661696c65640000000000604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f35206661696c65640000000000604082015260600190565b6020808252818101527f507572636861736520536561506f72745f315f31206661696c65642057455448604082015260600190565b60208082526018908201527f5075726368617365207375646f73776170206661696c65640000000000000000604082015260600190565b60208082526019908201527f756e6b6e6f776e2064656c656761746554797065207832793200000000000000604082015260600190565b6020808252601b908201527f5075726368617365204c6f6f6b73526172655632206661696c65640000000000604082015260600190565b602080825260129082015271556e6b6e6f776e20746f6b656e207479706560701b604082015260600190565b6020808252601a908201527f756e6b6e6f776e206164646974696f6e616c4461746154797065000000000000604082015260600190565b60208082526018908201527f6e6f207375636365737366756c20657865637574696f6e730000000000000000604082015260600190565b6000604082526142fd6040830185613cc2565b828103602084015261430f8185613cc2565b95945050505050565b60006020808352610180808401855161016080858801528282518085526101a094508489019150848782028a01018785019450885b82811015614435578a820361019f19018452855180518352898101516143758b850182613a8d565b5060408181015190840152606080820151908401526080808201519084015260a0808201519084015260c0808201516143b082860182613a8d565b505060e08082015189828601526143c98a860182613c7e565b91505061010080830151858303828701526143e48382613b2f565b925050506101208083015181860152506101408083015181860152508682015161441088860182613e62565b509089015190614422848b0183613e62565b968a0196948a019492505060010161434d565b50968a0151898803601f190160408b0152966144518189613b8c565b97505050506040880151935061446a6060880185613e20565b6060880151610120880152608088015161014088015260a0880151935061449381880185613e62565b50929695505050505050565b60006040825261010084511515604084015260018060a01b03602086015116606084015260408501516080840152606085015160a0840152608085015160c084015260a085015160c060e08501526144f982850182613c7e565b90508381036020850152610200614511828751613c78565b60208601516145236020840182613a8d565b5060408601516145366040840182613a8d565b50606086015160608301526080860151608083015260a086015160a083015260c086015161456760c0840182613a8d565b5060e086015161457a60e0840182613a8d565b508583015192820192909252610120808601519082015261014080860151908201526101608086015190820152610180808601518183018490529092906145c382840182613c7e565b935050506101a0808601516145da82840182613e62565b50506101c085810151908201526101e094850151940193909352509092915050565b6040518181016001600160401b038111828210171561461757fe5b604052919050565b60006001600160401b0382111561463257fe5b5060209081020190565b60006001600160401b0382111561464f57fe5b50601f01601f191660200190565b60005b83811015614678578181015183820152602001614660565b838111156125d65750506000910152565b6001600160a01b038116811461229757600080fd5b801515811461229757600080fd5b6001600160e01b03198116811461229757600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212200757283dc07c411443b1e1b6d7a36c58c05c1c146251b1933ac518ad9dd4f82064736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000005faf16a85028be138a7178b222dec98092feef9700000000000000000000000000000000006c3852cbef3e08e8df289169ede58100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000248b46beb66b3078d771a9e7e5a0a0216d0d07ba

Deployed ByteCode

0x6080604052600436106101435760003560e01c806386dcbd27116100b6578063bd4486ee1161006f578063bd4486ee14610319578063c9f0a2fa1461032e578063df6c255814610343578063f23a6e6114610358578063f2fde38b14610378578063fc40c9c7146103985761014a565b806386dcbd27146102875780638da5cb5b146102a75780639110c777146102bc578063a05f32dc146102d1578063b94ee332146102e6578063bc197c81146102f95761014a565b80633733b82b116101085780633733b82b1461020b5780633fc8cef3146102205780635c975abb146102355780635ea1e4c91461024a578063715018a61461025f57806386496e7a146102745761014a565b80628534f71461014f57806301ffc9a71461017a57806302329a29146101a7578063150b7a02146101c9578063349d6a85146101f65761014a565b3661014a57005b600080fd5b34801561015b57600080fd5b506101646103ad565b6040516101719190613e85565b60405180910390f35b34801561018657600080fd5b5061019a6101953660046136e6565b6103d1565b6040516101719190613f0e565b3480156101b357600080fd5b506101c76101c23660046136ae565b6103f4565b005b3480156101d557600080fd5b506101e96101e4366004613318565b61049d565b6040516101719190613f19565b34801561020257600080fd5b506101646104ad565b34801561021757600080fd5b506101646104d1565b34801561022c57600080fd5b506101646104f5565b34801561024157600080fd5b5061019a610519565b34801561025657600080fd5b50610164610522565b34801561026b57600080fd5b506101c7610546565b6101c761028236600461386a565b6105f2565b34801561029357600080fd5b506101c76102a23660046133e7565b6107bd565b3480156102b357600080fd5b506101646108fa565b3480156102c857600080fd5b50610164610909565b3480156102dd57600080fd5b5061016461092d565b6101c76102f43660046135f3565b610951565b34801561030557600080fd5b506101e961031436600461326f565b610bda565b34801561032557600080fd5b50610164610beb565b34801561033a57600080fd5b50610164610c0f565b34801561034f57600080fd5b50610164610c33565b34801561036457600080fd5b506101e9610373366004613381565b610c57565b34801561038457600080fd5b506101c7610393366004613253565b610c68565b3480156103a457600080fd5b50610164610d6a565b7f00000000000000000000000000000000006c3852cbef3e08e8df289169ede58181565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b6103fc610d8e565b6001600160a01b031661040d6108fa565b6001600160a01b031614610456576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b6002805482151560ff19909116811790915560408051918252517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29181900360200190a150565b630a85bd0160e11b949350505050565b7f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc81565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b61054e610d8e565b6001600160a01b031661055f6108fa565b6001600160a01b0316146105a8576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6105fa610d92565b600061060584610de5565b905080156106b8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd610644610d8e565b30846040518463ffffffff1660e01b815260040161066493929190613e99565b602060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906136ca565b505b60006106c78560400151610eb0565b905060008080808460018111156106da57fe5b141561070b576106eb886000610ecc565b919450925090506106fc8288611de2565b6107068187611de2565b610766565b600184600181111561071957fe5b14156107455761072a886000611e0d565b9194509250905061073b82886121c9565b61070681876121c9565b60405162461bcd60e51b815260040161075d906140a2565b60405180910390fd5b7fcc54b89ca2d75d5612023b14f0a477212b0e08bc0c5b8ad2804e2f8e2e401fc0836040516107959190613f0e565b60405180910390a16107a5612286565b84156107b3576107b361229a565b5050505050505050565b6107c5610d8e565b6001600160a01b03166107d66108fa565b6001600160a01b03161461081f576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b60005b818110156108f5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b384848481811061086557fe5b905060200201602081019061087a9190613253565b6000196040518363ffffffff1660e01b815260040161089a929190613ef5565b602060405180830381600087803b1580156108b457600080fd5b505af11580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec91906136ca565b50600101610822565b505050565b6000546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000005faf16a85028be138a7178b222dec98092feef9781565b610959610d92565b60008060008060008060005b8a518110156109965761098a8b828151811061097d57fe5b6020026020010151610de5565b90910190600101610965565b508015610a48577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd6109d4610d8e565b30846040518463ffffffff1660e01b81526004016109f493929190613e99565b602060405180830381600087803b158015610a0e57600080fd5b505af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4691906136ca565b505b60005b8a51811015610b72576000610a768c8381518110610a6557fe5b602002602001015160400151610eb0565b90506000808080846001811115610a8957fe5b1415610ad057610aac8f8681518110610a9e57fe5b60200260200101518d610ecc565b91945092509050610abd8b836123e8565b9a50610ac98a826123e8565b9950610b21565b6001846001811115610ade57fe5b141561074557610b018f8681518110610af357fe5b60200260200101518d611e0d565b91945092509050610b1289836123e8565b9850610b1e88826123e8565b97505b8680610b2a5750825b96507fcc54b89ca2d75d5612023b14f0a477212b0e08bc0c5b8ad2804e2f8e2e401fc083604051610b5b9190613f0e565b60405180910390a150505050806001019050610a4b565b5081610b905760405162461bcd60e51b815260040161075d906142b3565b610b9a868a611de2565b610ba48589611de2565b610bae848a6121c9565b610bb883896121c9565b610bc0612286565b8015610bce57610bce61229a565b50505050505050505050565b63bc197c8160e01b95945050505050565b7f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b63f23a6e6160e01b95945050505050565b610c70610d8e565b6001600160a01b0316610c816108fa565b6001600160a01b031614610cca576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b6001600160a01b038116610d0f5760405162461bcd60e51b81526004018080602001828103825260268152602001806146c36026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b3390565b60025460ff1615610de3576040805162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b565b600080600090506000610dfb8460400151610eb0565b90506001816001811115610e0b57fe5b1415610ea95760208401516040850151928101926000918291610e2d91612449565b91509150808285010193506000610e5187606001518860400151896000015161247a565b91505060005b8151811015610ea457600060a0838381518110610e7057fe5b6020026020010151901c90506000610e95828b6020015161253390919063ffffffff16565b97909701965050600101610e57565b505050505b5092915050565b6000603082901c61ffff166001811115610ec657fe5b92915050565b6000806000806000610eeb87606001518860400151896000015161247a565b60208901519193509150600288516009811115610f0457fe5b1415610fd25760007f00000000000000000000000000000000006c3852cbef3e08e8df289169ede5816001600160a01b03168285604051610f459190613e69565b60006040518083038185875af1925050503d8060008114610f82576040519150601f19603f3d011682016040523d82523d6000602084013e610f87565b606091505b505090508715610faf5780610faa57600080600096509650965050505050611ddb565b610fcc565b80610fcc5760405162461bcd60e51b815260040161075d90614108565b50611da9565b600188516009811115610fe157fe5b14156110a45760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682856040516110229190613e69565b60006040518083038185875af1925050503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b5050905087156110875780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90613f98565b6000885160098111156110b357fe5b14156111765760007f0000000000000000000000005faf16a85028be138a7178b222dec98092feef976001600160a01b031682856040516110f49190613e69565b60006040518083038185875af1925050503d8060008114611131576040519150601f19603f3d011682016040523d82523d6000602084013e611136565b606091505b5050905087156111595780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90614006565b60038851600981111561118557fe5b14156115c8576000838060200190518101906111a191906138c0565b9050871561123f5760405163357a150b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063357a150b9084906111f7908590600401614318565b6000604051808303818588803b15801561121057600080fd5b505af193505050508015611222575060015b61123a57600080600096509650965050505050611ddb565b6112c0565b60405163357a150b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063357a150b90849061128d908590600401614318565b6000604051808303818588803b1580156112a657600080fd5b505af11580156112ba573d6000803e3d6000fd5b50505050505b60005b8160200151518110156115c1576000826020015182815181106112e257fe5b602002602001015160200151905060008360200151838151811061130257fe5b602002602001015160400151905060008460000151838151811061132257fe5b60200260200101516101000151828151811061133a57fe5b602002602001015160200151905060008560000151848151811061135a57fe5b602002602001015160e0015151118015611390575060008560200151858151811061138157fe5b602002602001015160c0015151115b156113d6576113d681866020015186815181106113a957fe5b602002602001015160c00151876000015186815181106113c557fe5b602002602001015160e0015161254b565b84518051849081106113e457fe5b602002602001015160800151600114156114b95760008180602001905181019061140e9190613532565b905060005b81518110156114b257600082828151811061142a57fe5b6020026020010151905080600001516001600160a01b03166342842e0e30611450610d8e565b84602001516040518463ffffffff1660e01b815260040161147393929190613e99565b600060405180830381600087803b15801561148d57600080fd5b505af11580156114a1573d6000803e3d6000fd5b505060019093019250611413915050565b50506115b3565b84518051849081106114c757fe5b6020026020010151608001516002141561159b576000818060200190518101906114f19190613455565b905060005b81518110156114b257600082828151811061150d57fe5b6020026020010151905080600001516001600160a01b031663f242432a30611533610d8e565b846020015185604001516040518563ffffffff1660e01b815260040161155c9493929190613ebd565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b5050600190930192506114f6915050565b60405162461bcd60e51b815260040161075d906141e2565b5050508060010190506112c3565b5050611da9565b6004885160098111156115d757fe5b141561182c576000806000858060200190518101906115f69190613988565b925092509250891561169c57604051635a72594b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4e4b296908690611652908790879060040161449f565b6000604051808303818588803b15801561166b57600080fd5b505af19350505050801561167d575060015b611697576000806000985098509850505050505050611ddb565b61171f565b604051635a72594b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4e4b2969086906116ec908790879060040161449f565b6000604051808303818588803b15801561170557600080fd5b505af1158015611719573d6000803e3d6000fd5b50505050505b6001600160e01b031981166339d690a360e11b14156117ae5781604001516001600160a01b03166342842e0e30611754610d8e565b85608001516040518463ffffffff1660e01b815260040161177793929190613e99565b600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b50505050611824565b6001600160e01b0319811663025ceed960e61b141561180c5781604001516001600160a01b031663f242432a306117e3610d8e565b85608001518660a001516040518563ffffffff1660e01b81526004016117779493929190613ebd565b60405162461bcd60e51b815260040161075d90614250565b505050611da9565b60058851600981111561183b57fe5b14156118fe5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316828560405161187c9190613e69565b60006040518083038185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b5050905087156118e15780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d906141ab565b60068851600981111561190d57fe5b14156119d05760007f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd66001600160a01b0316828560405161194e9190613e69565b60006040518083038185875af1925050503d806000811461198b576040519150601f19603f3d011682016040523d82523d6000602084013e611990565b606091505b5050905087156119b35780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90613fcf565b6007885160098111156119df57fe5b1415611aa25760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168285604051611a209190613e69565b60006040518083038185875af1925050503d8060008114611a5d576040519150601f19603f3d011682016040523d82523d6000602084013e611a62565b606091505b505090508715611a855780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90614219565b600888516009811115611ab157fe5b1415611cbf57600080600085806020019051810190611ad091906137f6565b9250925092508915611b7657604051639a1fc3a760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a1fc3a7908690611b2c90879087906004016142ea565b6000604051808303818588803b158015611b4557600080fd5b505af193505050508015611b57575060015b611b71576000806000985098509850505050505050611ddb565b611bf9565b604051639a1fc3a760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a1fc3a7908690611bc690879087906004016142ea565b6000604051808303818588803b158015611bdf57600080fd5b505af1158015611bf3573d6000803e3d6000fd5b50505050505b6001600160e01b031981166339d690a360e11b1415611c58578251606001516001600160a01b03166342842e0e30611c2f610d8e565b8651608001516040516001600160e01b031960e086901b16815261177793929190600401613e99565b6001600160e01b0319811663025ceed960e61b141561180c578251606001516001600160a01b031663f242432a30611c8e610d8e565b8651608081015160a0909101516040516001600160e01b031960e087901b1681526117779493929190600401613ebd565b600988516009811115611cce57fe5b1415611d915760007f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc6001600160a01b03168285604051611d0f9190613e69565b60006040518083038185875af1925050503d8060008114611d4c576040519150601f19603f3d011682016040523d82523d6000602084013e611d51565b606091505b505090508715611d745780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d9061413f565b60405162461bcd60e51b815260040161075d90614074565b611db78289602001516125dc565b600080611dcc8a604001518b60200151612449565b60019950909750955050505050505b9250925092565b600082118015611dfa57506001600160a01b03811615155b15611e0957611e098183612665565b5050565b6000806000806000611e2c87606001518860400151896000015161247a565b9092509050600287516009811115611e4057fe5b1415611f0c5760007f00000000000000000000000000000000006c3852cbef3e08e8df289169ede5816001600160a01b031683604051611e809190613e69565b6000604051808303816000865af19150503d8060008114611ebd576040519150601f19603f3d011682016040523d82523d6000602084013e611ec2565b606091505b505090508615611ee95780611ee4576000806000955095509550505050611ddb565b611f06565b80611f065760405162461bcd60e51b815260040161075d90614176565b50612194565b600087516009811115611f1b57fe5b1415611fdc5760007f0000000000000000000000005faf16a85028be138a7178b222dec98092feef976001600160a01b031683604051611f5b9190613e69565b6000604051808303816000865af19150503d8060008114611f98576040519150601f19603f3d011682016040523d82523d6000602084013e611f9d565b606091505b505090508615611fbf5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d9061403d565b600687516009811115611feb57fe5b14156120ac5760007f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd66001600160a01b03168360405161202b9190613e69565b6000604051808303816000865af19150503d8060008114612068576040519150601f19603f3d011682016040523d82523d6000602084013e61206d565b606091505b50509050861561208f5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d90613f2e565b6009875160098111156120bb57fe5b141561217c5760007f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc6001600160a01b0316836040516120fb9190613e69565b6000604051808303816000865af19150503d8060008114612138576040519150601f19603f3d011682016040523d82523d6000602084013e61213d565b606091505b50509050861561215f5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d90613f63565b60405162461bcd60e51b815260040161075d906140d9565b6121a28188602001516126fd565b6000806121b789604001518a60200151612449565b60019b919a5098509650505050505050565b6000821180156121e157506001600160a01b03811615155b15611e095760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906122349084908690600401613ef5565b602060405180830381600087803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f591906136ca565b478015612297576122973382612665565b50565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906122e9903090600401613e85565b60206040518083038186803b15801561230157600080fd5b505afa158015612315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123399190613a75565b90508015612297577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612378610d8e565b836040518363ffffffff1660e01b8152600401612396929190613ef5565b602060405180830381600087803b1580156123b057600080fd5b505af11580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0991906136ca565b600082820183811015612442576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008061ffff601085901c81169085166124638583612533565b61246d8683612533565b9350935050509250929050565b6060806000602085901c61ffff16600181111561249357fe5b9050606060008260018111156124a557fe5b14156124b757869350915061252b9050565b60018260018111156124c557fe5b1415612513576000878060200190518101906124e19190613702565b90506124ec86612786565b1561250757806000015181602001519450945050505061252b565b519350915061252b9050565b60405162461bcd60e51b815260040161075d9061427c565b935093915050565b600061244261271061254585856127d8565b90612831565b815183511461255957600080fd5b805183511461256757600080fd5b60005b83518110156125d65781818151811061257f57fe5b01602001516001600160f81b031916156125ce5782818151811061259f57fe5b602001015160f81c60f81b8482815181106125b657fe5b60200101906001600160f81b031916908160001a9053505b60010161256a565b50505050565b60005b82518110156108f55760008382815181106125f657fe5b6020026020010151111561265d57600083828151811061261257fe5b60200260200101519050600060a085848151811061262c57fe5b6020026020010151901c9050600061264d828661253390919063ffffffff16565b90506126598184611de2565b5050505b6001016125df565b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146126b0576040519150601f19603f3d011682016040523d82523d6000602084013e6126b5565b606091505b50509050806108f5576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60005b82518110156108f557600083828151811061271757fe5b6020026020010151111561277e57600083828151811061273357fe5b60200260200101519050600060a085848151811061274d57fe5b6020026020010151901c9050600061276e828661253390919063ffffffff16565b905061277a81846121c9565b5050505b600101612700565b6000600582600981111561279657fe5b14806127ad575060048260098111156127ab57fe5b145b806127c3575060078260098111156127c157fe5b145b156127d0575060016103ef565b506000919050565b6000826127e757506000610ec6565b828202828482816127f457fe5b04146124425760405162461bcd60e51b81526004018080602001828103825260218152602001806146e96021913960400191505060405180910390fd5b6000808211612887576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161289057fe5b049392505050565b80356103ef81614689565b80516103ef81614689565b600082601f8301126128be578081fd5b815160206128d36128ce8361461f565b6145fc565b828152818101908583016040808602880185018910156128f1578687fd5b865b8681101561295b5781838b031215612909578788fd5b81518281018181106001600160401b038211171561292357fe5b8352835161ffff8116811461293657898afd5b81528387015161294581614689565b81880152855293850193918101916001016128f3565b509198975050505050505050565b600082601f830112612979578081fd5b815160206129896128ce8361461f565b828152818101908583016040808602880185018910156129a7578687fd5b865b8681101561295b5781838b0312156129bf578788fd5b81518281018181106001600160401b03821117156129d957fe5b835283518152868401516129ec81614689565b81880152855293850193918101916001016129a9565b600082601f830112612a12578081fd5b81516020612a226128ce8361461f565b82815281810190858301855b85811015612aab5781518801604080601f19838d03011215612a4e578889fd5b80518181016001600160401b038282108183111715612a6957fe5b818452848a01518352928401519280841115612a83578b8cfd5b5050612a938c8984860101612df9565b81890152865250509284019290840190600101612a2e565b5090979650505050505050565b600082601f830112612ac8578081fd5b81516020612ad86128ce8361461f565b82815281810190858301855b85811015612aab57815188016101a080601f19838d03011215612b05578889fd5b612b0e816145fc565b878301518152612b20604084016128a3565b88820152606083015160408201526080830151606082015260a0830151608082015260c083015160a0820152612b5860e084016128a3565b60c08201526101008301516001600160401b0380821115612b77578b8cfd5b612b858e8b84880101612df9565b60e084015261012091508185015181811115612b9f578c8dfd5b612bad8f8c83890101612a02565b610100850152505061014080850151828401526101609150818501518184015250610180612bdc818601613242565b82840152612beb848601613242565b9083015250865250509284019290840190600101612ae4565b600082601f830112612c14578081fd5b81516020612c246128ce8361461f565b82815281810190858301855b85811015612aab578151880161016080601f19838d03011215612c51578889fd5b612c5a816145fc565b612c65888401612e44565b815260408084015189830152606080850151828401526080915081850151818401525060a0808501518284015260c09150612ca18286016128a3565b9083015260e08401516001600160401b0380821115612cbe578c8dfd5b612ccc8f8c84890101612df9565b8385015261010092508286015160e0850152610120915081860151838501526101409250828601518285015284860151945080851115612d0a578c8dfd5b5050612d1a8d8a85870101612969565b90820152865250509284019290840190600101612c30565b600082601f830112612d42578081fd5b81356020612d526128ce8361461f565b8281528181019085830183850287018401881015612d6e578586fd5b855b85811015612aab57813584529284019290840190600101612d70565b80356103ef8161469e565b80516103ef8161469e565b80516103ef816146ac565b600082601f830112612dbd578081fd5b8135612dcb6128ce8261463c565b818152846020838601011115612ddf578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112612e09578081fd5b8151612e176128ce8261463c565b818152846020838601011115612e2b578283fd5b612e3c82602083016020870161465d565b949350505050565b8051600881106103ef57600080fd5b8051600281106103ef57600080fd5b600060e08284031215612e73578081fd5b612e7d60e06145fc565b905081516001600160401b0380821115612e9657600080fd5b612ea285838601613026565b8352612eb060208501613242565b602084015260408401516040840152606084015160608401526080840151915080821115612edd57600080fd5b50612eea84828501612df9565b608083015250612efc60a08301612e53565b60a082015260c082015160c082015292915050565b6000610200808385031215612f24578182fd5b612f2d816145fc565b915050612f3982612d97565b8152612f47602083016128a3565b6020820152612f58604083016128a3565b6040820152606082015160608201526080820151608082015260a082015160a0820152612f8760c083016128a3565b60c0820152612f9860e083016128a3565b60e08201526101008281015190820152610120808301519082015261014080830151908201526101608083015190820152610180808301516001600160401b03811115612fe457600080fd5b612ff085828601612df9565b8284015250506101a0613004818401613242565b908201526101c082810151908201526101e09182015191810191909152919050565b60006101a0808385031215613039578182fd5b613042816145fc565b91505061304e826128a3565b815261305c60208301612e53565b602082015261306d604083016128a3565b604082015261307e606083016128a3565b60608201526080820151608082015260a082015160a08201526130a360c083016128a3565b60c082015260e0828101519082015261010080830151908201526101208083015190820152610140808301516001600160401b03808211156130e457600080fd5b6130f0868387016128ae565b838501526101609250828501518385015261018092508285015191508082111561311957600080fd5b5061312685828601612df9565b82840152505092915050565b600060808284031215613143578081fd5b604051608081016001600160401b03828210818311171561316057fe5b8160405282935084359150600a821061317857600080fd5b818352602085013560208401526040850135604084015260608501359150808211156131a357600080fd5b506131b085828601612dad565b6060830152505092915050565b600060c082840312156131ce578081fd5b60405160c081018181106001600160401b03821117156131ea57fe5b806040525080915082518152602083015160208201526040830151604082015260608301516060820152608083015161322281614689565b608082015260a08301516132358161469e565b60a0919091015292915050565b805160ff811681146103ef57600080fd5b600060208284031215613264578081fd5b813561244281614689565b600080600080600060a08688031215613286578081fd5b853561329181614689565b945060208601356132a181614689565b935060408601356001600160401b03808211156132bc578283fd5b6132c889838a01612d32565b945060608801359150808211156132dd578283fd5b6132e989838a01612d32565b935060808801359150808211156132fe578283fd5b5061330b88828901612dad565b9150509295509295909350565b6000806000806080858703121561332d578182fd5b843561333881614689565b9350602085013561334881614689565b92506040850135915060608501356001600160401b03811115613369578182fd5b61337587828801612dad565b91505092959194509250565b600080600080600060a08688031215613398578283fd5b85356133a381614689565b945060208601356133b381614689565b9350604086013592506060860135915060808601356001600160401b038111156133db578182fd5b61330b88828901612dad565b600080602083850312156133f9578182fd5b82356001600160401b038082111561340f578384fd5b818501915085601f830112613422578384fd5b813581811115613430578485fd5b8660208083028501011115613443578485fd5b60209290920196919550909350505050565b60006020808385031215613467578182fd5b82516001600160401b038082111561347d578384fd5b818501915085601f830112613490578384fd5b815161349e6128ce8261461f565b818152848101908486016060808502870188018b10156134bc578889fd5b8896505b848710156135235780828c0312156134d6578889fd5b6040805182810181811089821117156134eb57fe5b825283516134f881614689565b8152838a01518a820152818401519181019190915284526001969096019592870192908101906134c0565b50909998505050505050505050565b60006020808385031215613544578182fd5b82516001600160401b038082111561355a578384fd5b818501915085601f83011261356d578384fd5b815161357b6128ce8261461f565b818152848101908486016040808502870188018b1015613599578889fd5b8896505b848710156135235780828c0312156135b3578889fd5b805181810181811088821117156135c657fe5b825282516135d381614689565b81528289015189820152845260019690960195928701929081019061359d565b60008060008060808587031215613608578182fd5b84356001600160401b0381111561361d578283fd5b8501601f8101871361362d578283fd5b8035602061363d6128ce8361461f565b82815281810190848301875b85811015613672576136608d8684358a0101613132565b84529284019290840190600101613649565b50508098505050613684818901612898565b955050505061369560408601612898565b91506136a360608601612d8c565b905092959194509250565b6000602082840312156136bf578081fd5b81356124428161469e565b6000602082840312156136db578081fd5b81516124428161469e565b6000602082840312156136f7578081fd5b8135612442816146ac565b60006020808385031215613714578182fd5b82516001600160401b038082111561372a578384fd5b908401906040828703121561373d578384fd5b60405160408101818110838211171561375257fe5b604052825182811115613763578586fd5b61376f88828601612df9565b8252508383015182811115613782578586fd5b80840193505086601f840112613796578485fd5b825191506137a66128ce8361461f565b82815284810190848601868502860187018a10156137c2578788fd5b8795505b848610156137e45780518352600195909501949186019186016137c6565b50948201949094529695505050505050565b60008060006060848603121561380a578081fd5b83516001600160401b0380821115613820578283fd5b61382c87838801612e62565b94506020860151915080821115613841578283fd5b5061384e86828701612e62565b925050604084015161385f816146ac565b809150509250925092565b60008060006060848603121561387e578081fd5b83356001600160401b03811115613893578182fd5b61389f86828701613132565b93505060208401356138b081614689565b9150604084013561385f81614689565b6000602082840312156138d1578081fd5b81516001600160401b03808211156138e7578283fd5b9083019061016082860312156138fb578283fd5b61390560c06145fc565b825182811115613913578485fd5b61391f87828601612ab8565b825250602083015182811115613933578485fd5b61393f87828601612c04565b60208301525061395286604085016131bd565b60408201526101008301516060820152610120830151608082015261397a6101408401613242565b60a082015295945050505050565b60008060006060848603121561399c578081fd5b83516001600160401b03808211156139b2578283fd5b9085019060c082880312156139c5578283fd5b60405160c0810181811083821117156139da57fe5b6040526139e683612d97565b81526139f4602084016128a3565b602082015260408301516040820152606083015160608201526080830151608082015260a083015182811115613a28578485fd5b613a3489828601612df9565b60a0830152506020870151909550915080821115613a50578283fd5b50613a5d86828701612f11565b925050613a6c60408501612da2565b90509250925092565b600060208284031215613a86578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015613ae1578151805161ffff1688528301516001600160a01b03168388015260409096019590820190600101613aad565b509495945050505050565b6000815180845260208085019450808401835b83811015613ae1578151805188528301516001600160a01b03168388015260409096019590820190600101613aff565b60008282518085526020808601955080818302840101818601855b84811015612aab57858303601f190189528151805184528401516040858501819052613b7881860183613c7e565b9a86019a9450505090830190600101613b4a565b6000815180845260208085018081965082840281019150828601855b85811015613c6b5782840389528151610160613bc5868351613caa565b818701518688015260408083015190870152606080830151908701526080808301519087015260a080830151613bfd82890182613a8d565b505060c0808301518282890152613c1683890182613c7e565b60e085810151908a015261010080860151908a015261012080860151908a015261014094850151898203958a01959095529250613c57915082905083613aec565b9a87019a9550505090840190600101613ba8565b5091979650505050505050565b15159052565b60008151808452613c9681602086016020860161465d565b601f01601f19169290920160200192915050565b60088110613cb457fe5b9052565b60028110613cb457fe5b6000815160e08452613cd860e085018251613a8d565b6020810151610100613cec81870183613cb8565b60408301519150610120613d0281880184613a8d565b60608401519250610140613d1881890185613a8d565b6080850151935061016084818a015260a0860151945061018085818b015260c087015195506101a0613d4c818c0188613a8d565b60e08801516101c08c0152858801516101e08c0152848801516102008c0152838801519650806102208c015250613d876102808b0187613a9a565b918701516102408b01529095015188860360df19016102608a0152949350613db59250839150849050613c7e565b9150506020830151613dca6020860182613e62565b50604083015160408501526060830151606085015260808301518482036080860152613df68282613c7e565b91505060a0830151613e0b60a0860182613cb8565b5060c083015160c08501528091505092915050565b805182526020808201519083015260408082015190830152606080820151908301526080808201516001600160a01b03169083015260a0908101511515910152565b60ff169052565b60008251613e7b81846020870161465d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6001600160e01b031991909116815260200190565b6020808252818101527f507572636861736520536561506f72745f315f34206661696c65642057455448604082015260600190565b6020808252818101527f507572636861736520536561506f72745f315f35206661696c65642057455448604082015260600190565b6020808252601e908201527f50757263686173652077797665726e45786368616e6765206661696c65640000604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f34206661696c65640000000000604082015260600190565b60208082526017908201527f50757263686173652072617269626c65206661696c6564000000000000000000604082015260600190565b6020808252601c908201527f50757263686173652072617269626c65206661696c6564205745544800000000604082015260600190565b6020808252601490820152730aadcd6dcdeeedc40dac2e4d6cae892c8408aa8960631b604082015260600190565b60208082526019908201527f556e6b6e6f776e2070757263686173652063757272656e637900000000000000604082015260600190565b6020808252601590820152740aadcd6dcdeeedc40dac2e4d6cae892c840ae8aa89605b1b604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f31206661696c65640000000000604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f35206661696c65640000000000604082015260600190565b6020808252818101527f507572636861736520536561506f72745f315f31206661696c65642057455448604082015260600190565b60208082526018908201527f5075726368617365207375646f73776170206661696c65640000000000000000604082015260600190565b60208082526019908201527f756e6b6e6f776e2064656c656761746554797065207832793200000000000000604082015260600190565b6020808252601b908201527f5075726368617365204c6f6f6b73526172655632206661696c65640000000000604082015260600190565b602080825260129082015271556e6b6e6f776e20746f6b656e207479706560701b604082015260600190565b6020808252601a908201527f756e6b6e6f776e206164646974696f6e616c4461746154797065000000000000604082015260600190565b60208082526018908201527f6e6f207375636365737366756c20657865637574696f6e730000000000000000604082015260600190565b6000604082526142fd6040830185613cc2565b828103602084015261430f8185613cc2565b95945050505050565b60006020808352610180808401855161016080858801528282518085526101a094508489019150848782028a01018785019450885b82811015614435578a820361019f19018452855180518352898101516143758b850182613a8d565b5060408181015190840152606080820151908401526080808201519084015260a0808201519084015260c0808201516143b082860182613a8d565b505060e08082015189828601526143c98a860182613c7e565b91505061010080830151858303828701526143e48382613b2f565b925050506101208083015181860152506101408083015181860152508682015161441088860182613e62565b509089015190614422848b0183613e62565b968a0196948a019492505060010161434d565b50968a0151898803601f190160408b0152966144518189613b8c565b97505050506040880151935061446a6060880185613e20565b6060880151610120880152608088015161014088015260a0880151935061449381880185613e62565b50929695505050505050565b60006040825261010084511515604084015260018060a01b03602086015116606084015260408501516080840152606085015160a0840152608085015160c084015260a085015160c060e08501526144f982850182613c7e565b90508381036020850152610200614511828751613c78565b60208601516145236020840182613a8d565b5060408601516145366040840182613a8d565b50606086015160608301526080860151608083015260a086015160a083015260c086015161456760c0840182613a8d565b5060e086015161457a60e0840182613a8d565b508583015192820192909252610120808601519082015261014080860151908201526101608086015190820152610180808601518183018490529092906145c382840182613c7e565b935050506101a0808601516145da82840182613e62565b50506101c085810151908201526101e094850151940193909352509092915050565b6040518181016001600160401b038111828210171561461757fe5b604052919050565b60006001600160401b0382111561463257fe5b5060209081020190565b60006001600160401b0382111561464f57fe5b50601f01601f191660200190565b60005b83811015614678578181015183820152602001614660565b838111156125d65750506000910152565b6001600160a01b038116811461229757600080fd5b801515811461229757600080fd5b6001600160e01b03198116811461229757600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212200757283dc07c411443b1e1b6d7a36c58c05c1c146251b1933ac518ad9dd4f82064736f6c63430007060033