ETH Price: $3,409.64 (+2.94%)

Contract

0x1eC6B294902d42FeE964D29FA962e5976e71e67D
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Nft Own...166080092023-02-11 20:48:47651 days ago1676148527IN
Emblem Vault: Handler
0 ETH0.0005366514.72668625
Buy With Signatu...166080012023-02-11 20:47:11651 days ago1676148431IN
Emblem Vault: Handler
0 ETH0.0060005515.00824726
Buy With Signatu...166080012023-02-11 20:47:11651 days ago1676148431IN
Emblem Vault: Handler
0 ETH0.0087963422
Buy With Signatu...166079952023-02-11 20:45:59651 days ago1676148359IN
Emblem Vault: Handler
0 ETH0.0061219915.32043146
Buy With Signatu...166079592023-02-11 20:38:35651 days ago1676147915IN
Emblem Vault: Handler
0 ETH0.0062434915.72532856
Buy With Signatu...166079182023-02-11 20:30:23651 days ago1676147423IN
Emblem Vault: Handler
0 ETH0.0069720817.56041052
Buy With Signatu...166079082023-02-11 20:28:23651 days ago1676147303IN
Emblem Vault: Handler
0 ETH0.0067314716.9748897
Buy With Signatu...166078452023-02-11 20:15:47651 days ago1676146547IN
Emblem Vault: Handler
0 ETH0.008823622.0684487
Buy With Signatu...166078352023-02-11 20:13:47651 days ago1676146427IN
Emblem Vault: Handler
0 ETH0.0092747123.19740907
Buy With Signatu...166077972023-02-11 20:06:11651 days ago1676145971IN
Emblem Vault: Handler
0 ETH0.0123875930.98184123
Buy With Signatu...166077962023-02-11 20:05:59651 days ago1676145959IN
Emblem Vault: Handler
0 ETH0.0111869927.98195676
Buy With Signatu...166077922023-02-11 20:05:11651 days ago1676145911IN
Emblem Vault: Handler
0 ETH0.0120655330.17763264
Buy With Signatu...166077862023-02-11 20:03:59651 days ago1676145839IN
Emblem Vault: Handler
0 ETH0.0127244932.05121252
Buy With Signatu...166077842023-02-11 20:03:35651 days ago1676145815IN
Emblem Vault: Handler
0 ETH0.0137392734.36389887
Buy With Signatu...166077602023-02-11 19:58:47651 days ago1676145527IN
Emblem Vault: Handler
0 ETH0.0079313420
Buy With Signatu...166077482023-02-11 19:56:23651 days ago1676145383IN
Emblem Vault: Handler
0 ETH0.0082184620.69965587
Buy With Signatu...166077342023-02-11 19:53:35651 days ago1676145215IN
Emblem Vault: Handler
0 ETH0.0067488817
Buy With Signatu...166077252023-02-11 19:51:47651 days ago1676145107IN
Emblem Vault: Handler
0 ETH0.0058353414.59503352
Buy With Signatu...166077192023-02-11 19:50:35651 days ago1676145035IN
Emblem Vault: Handler
0 ETH0.0063686315.9284087
Buy With Signatu...166077192023-02-11 19:50:35651 days ago1676145035IN
Emblem Vault: Handler
0 ETH0.0063239215.9284087
Buy With Signatu...166076702023-02-11 19:40:47651 days ago1676144447IN
Emblem Vault: Handler
0 ETH0.006116215.29797688
Buy With Signatu...166076612023-02-11 19:38:59651 days ago1676144339IN
Emblem Vault: Handler
0 ETH0.0069208817.3294316
Buy With Signatu...166076582023-02-11 19:38:23651 days ago1676144303IN
Emblem Vault: Handler
0 ETH0.0071042417.7685213
Buy With Signatu...166076472023-02-11 19:36:11651 days ago1676144171IN
Emblem Vault: Handler
0 ETH0.0063386115.87166074
Buy With Signatu...166075792023-02-11 19:22:35651 days ago1676143355IN
Emblem Vault: Handler
0 ETH0.0064429916.11466678
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VaultHandlerV7

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-14
*/

// ___________      ___.   .__                                          
// \_   _____/ _____\_ |__ |  |   ____   _____                          
//  |    __)_ /     \| __ \|  | _/ __ \ /     \                         
//  |        \  Y Y  \ \_\ \  |_\  ___/|  Y Y  \                        
// /_______  /__|_|  /___  /____/\___  >__|_|  /                        
//         \/      \/    \/          \/      \/                         
//     ____   ____            .__   __                                  
//     \   \ /   /____   __ __|  |_/  |_                                
//      \   Y   /\__  \ |  |  \  |\   __\                               
//       \     /  / __ \|  |  /  |_|  |                                 
//       \___/  (____  /____/|____/__|                                 
//                   \/                                                
//   ___ ___                    .___.__                          _________
//  /   |   \_____    ____    __| _/|  |   ___________  ___  __ |  ____  /
// /    ~    \__  \  /    \  / __ | |  | _/ __ \_  __ \ \  \/   /    / /
// \    Y    // __ \|   |  \/ /_/ | |  |_\  ___/|  | \/  \    /    / /
//  \___|_  /(____  /___|  /\____ | |____/\___  >__|      \_/    /_/
//       \/      \/     \/      \/           \/                     

  
// File: browser/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

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

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

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: browser/IERC20Token.sol

pragma solidity ^0.6.11;
interface IERC20Token {
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: browser/SafeMath.sol

pragma solidity ^0.6.11;

/**
 * @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, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
// File: browser/VaultHandler_v4.sol

pragma experimental ABIEncoderV2;
pragma solidity ^0.6.11;


interface IERC721 {
    function burn(uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    function mint( address _to, uint256 _tokenId, string calldata _uri, string calldata _payload) external;
    function changeName(string calldata name, string calldata symbol) external;
    function updateTokenUri(uint256 _tokenId,string memory _uri) external;
    function tokenPayload(uint256 _tokenId) external view returns (string memory);
    function ownerOf(uint256 _tokenId) external returns (address _owner);
    function getApproved(uint256 _tokenId) external returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
}

interface Ownable {
    function transferOwnership(address newOwner) external;
}

interface BasicERC20 {
    function burn(uint256 value) external;
    function mint(address account, uint256 amount) external;
    function decimals() external view returns (uint8);
}

contract Context {
    constructor() internal {}

    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }
}


contract Bridged is Context {
    using SafeMath for uint256;
    using SafeMath for uint8;
    using SafeMath for uint;

    address public paymentAddress;
    
    mapping(uint => bool) public chainIds;
    mapping(uint => uint256) public chainBalances;
    
    constructor () public {
        chainIds[1] = true;
        chainBalances[1] = 200000000000000000;
        chainIds[137] = true;
        chainBalances[137] = 200000000000000000;
        chainIds[80001] = true;
        chainBalances[80001] = 200000000000000000;
        chainIds[100] = true;
        chainBalances[100] = 200000000000000000;
        chainIds[56] = true;
        chainBalances[56] = 200000000000000000;
        chainIds[250] = true;
        chainBalances[250] = 200000000000000000;
    }
    
    function transferToChain(uint chainId, uint256 amount) public returns (bool) {
        require(chainIds[chainId], 'Invalid Chain ID');
        IERC20Token paymentToken = IERC20Token(paymentAddress);
        require(paymentToken.allowance(_msgSender(), address(this)) >= amount, 'Handler unable to spend ');
        require(paymentToken.transferFrom(_msgSender(), address(this), amount), 'Transfer ERROR');
        BasicERC20(paymentAddress).burn(amount);
        chainBalances[chainId] = chainBalances[chainId].add(amount);
        emit BridgeDeposit(_msgSender(), amount, chainId);
        
        return true;
    }
    
    function _transferFromChain(address _to, uint chainId, uint256 amount) internal returns (bool) {
        require(chainBalances[chainId] >= amount, 'Can not transfer more than deposited');
        require(chainIds[chainId], 'Invalid Chain ID');
        BasicERC20 paymentToken = BasicERC20(paymentAddress);
        paymentToken.mint(_to, amount);
        chainBalances[chainId] = chainBalances[chainId].sub(amount);
        emit BridgeWithdrawal(_msgSender(), amount, chainId);
        
        return true;
    }
    
    event BridgeDeposit(address indexed sender, uint256 indexed amount, uint chainId);
    event BridgeWithdrawal(address indexed sender, uint256 indexed amount, uint chainId);
    
    function _addChainId(uint chainId) internal returns (bool) {
        chainIds[chainId] = true;
        return true;
    }
    
    function _removeChainId(uint chainId) internal returns (bool) {
        chainIds[chainId] = false;
        return true;
    }
    
}

contract VaultHandlerV7 is ReentrancyGuard, Bridged {
    
    using SafeMath for uint256;
    using SafeMath for uint8;
    address payable private owner;
    string public metadataBaseUri;
    bool public initialized;
    address public nftAddress;
    address public recipientAddress;
    // address public couponAddress;
    uint256 public price;
    // uint256 public offerPrice = 0;
    // bool public payToAcceptOffer = false;
    // bool public payToMakeOffer = false;
    bool public shouldBurn = false;
    
    struct PreMint {
        string payload;
        bytes32 preImage;
    }
    
    struct PreTransfer {
        string payload;
        bytes32 preImage;
        address _from;
    }
    
    struct Offer {
        uint tokenId;
        address _from;
    }

    
    // mapping(uint => PreMint) public tokenIdToPreMint;
    mapping(address => mapping(uint => PreMint)) preMints;
    mapping(address => mapping(uint => PreMint)) preMintsByIndex;
    mapping(address => uint) preMintCounts;
    
    mapping(uint => PreTransfer) preTransfers;
    mapping(uint => mapping(uint => PreTransfer)) preTransfersByIndex;
    mapping(uint => uint) preTransferCounts;
    
    mapping(uint => Offer[]) offers;
    mapping(uint => Offer[]) rejected;
    mapping(address => mapping(uint => Offer)) offered;
    
    mapping(address => bool) public witnesses;
    mapping(uint256 => bool) usedNonces;
    
    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    // modifier to check if caller is owner
    modifier isOwner() {
        // If the first argument of 'require' evaluates to 'false', execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use 'require' to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }
    
    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function transferOwnership(address payable newOwner) public isOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }
    
    /**
     * @dev Return owner address 
     * @return address of owner
     */
    function getOwner() external view returns (address) {
        return owner;
    }
    
    constructor(address _nftAddress, address _paymentAddress, address _recipientAddress, uint256 _price) public {
        owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
        addWitness(owner);
        metadataBaseUri = "https://api.emblemvault.io/s:evmetadata/meta/";
        nftAddress = _nftAddress;
        paymentAddress = _paymentAddress;
        recipientAddress = _recipientAddress;
        initialized = true;
        uint decimals = BasicERC20(paymentAddress).decimals();
        price = _price * 10 ** decimals;
    }
    
    function claim(uint256 tokenId) public isOwner {
        IERC721 token = IERC721(nftAddress);
        token.burn(tokenId);
    }
    
    function buyWithPaymentOnly(address _to, uint256 _tokenId, string calldata image) public payable {
        IERC20Token paymentToken = IERC20Token(paymentAddress);
        IERC721 nftToken = IERC721(nftAddress);
        PreMint memory preMint = preMints[msg.sender][_tokenId];
        require(preMint.preImage == sha256(abi.encodePacked(image)), 'Payload does not match'); // Payload should match
        if (shouldBurn) {
            require(paymentToken.transferFrom(msg.sender, address(this), price), 'Transfer ERROR'); // Payment sent to recipient
            BasicERC20(paymentAddress).burn(price);
        } else {
            require(paymentToken.transferFrom(msg.sender, address(recipientAddress), price), 'Transfer ERROR'); // Payment sent to recipient
        }
        string memory _uri = concat(metadataBaseUri, uintToStr(_tokenId));
        nftToken.mint(_to, _tokenId, _uri, preMint.payload);
        delete preMintsByIndex[msg.sender][preMintCounts[msg.sender]];
        delete preMints[msg.sender][_tokenId];
        preMintCounts[msg.sender] = preMintCounts[msg.sender].sub(1);
    }
    
    function buyWithSignature(address _to, uint256 _tokenId, string calldata _payload, uint256 _nonce, bytes calldata _signature) public payable {
        IERC20Token paymentToken = IERC20Token(paymentAddress);
        IERC721 nftToken = IERC721(nftAddress);
        if (shouldBurn) {
            require(paymentToken.transferFrom(msg.sender, address(this), price), 'Transfer ERROR'); // Payment sent to recipient
            BasicERC20(paymentAddress).burn(price);
        } else {
            require(paymentToken.transferFrom(msg.sender, address(recipientAddress), price), 'Transfer ERROR'); // Payment sent to recipient
        }
        
        address signer = getAddressFromSignature(_tokenId, _nonce, _payload, _signature);
        require(witnesses[signer], 'Not Witnessed');
        usedNonces[_nonce] = true;
        string memory _uri = concat(metadataBaseUri, uintToStr(_tokenId));
        nftToken.mint(_to, _tokenId, _uri, _payload);
    }
    
    
    function addPreMint(address _for, string calldata _payload, uint256 _tokenId, bytes32 preImage) public isOwner {
        try IERC721(nftAddress).tokenPayload(_tokenId) returns (string memory) {
            revert('NFT Exists with this ID');
        } catch {
            require(!_duplicatePremint(_for, _tokenId), 'Duplicate PreMint');
            preMintCounts[_for] = preMintCounts[_for].add(1);
            preMints[_for][_tokenId] = PreMint(_payload, preImage);
            preMintsByIndex[_for][preMintCounts[_for]] = preMints[_for][_tokenId];
        }
    }
    
    function _duplicatePremint(address _for, uint256 _tokenId) internal view returns (bool) {
        string memory data = preMints[_for][_tokenId].payload;
        bytes32 NULL = keccak256(bytes(''));
        return keccak256(bytes(data)) != NULL;
    }
    
    function deletePreMint(address _for, uint256 _tokenId) public isOwner {
        delete preMintsByIndex[_for][preMintCounts[_for]];
        preMintCounts[_for] = preMintCounts[_for].sub(1);
        delete preMints[_for][_tokenId];
    }
    
    function getPreMint(address _for, uint256 _tokenId) public view returns (PreMint memory) {
        return preMints[_for][_tokenId];
    }
    
    function checkPreMintImage(string memory image, bytes32 preImage) public pure returns (bytes32, bytes32, bool) {
        bytes32 calculated = sha256(abi.encodePacked(image));
        bytes32 preBytes = preImage;
        return (calculated, preBytes, calculated == preBytes);
    }
    
    function getPreMintCount(address _for) public view returns (uint length) {
        return preMintCounts[_for];
    }
    
    function getPreMintByIndex(address _for, uint index) public view returns (PreMint memory) {
        return preMintsByIndex[_for][index];
    }
    
    function toggleShouldBurn() public {
        shouldBurn = !shouldBurn;
    }
    
    /* Transfer with code */
    function addWitness(address _witness) public isOwner {
        witnesses[_witness] = true;
    }

    function removeWitness(address _witness) public isOwner {
        witnesses[_witness] = false;
    }
    
    function getAddressFromSignature(uint256 _tokenId, uint256 _nonce, bytes memory signature) public view returns (address) {
        require(!usedNonces[_nonce]);
        bytes32 hash = keccak256(abi.encodePacked(concat(uintToStr(_tokenId), uintToStr(_nonce))));
        address addressFromSig = recoverSigner(hash, signature);
        return addressFromSig;
    }
    
    function getAddressFromSignature(uint256 _tokenId, uint256 _nonce, string calldata payload, bytes memory signature) public view returns (address) {
        require(!usedNonces[_nonce]);
        string memory combined = concat(uintToStr(_tokenId), payload);
        bytes32 hash = keccak256(abi.encodePacked(concat(combined, uintToStr(_nonce))));
        address addressFromSig = recoverSigner(hash, signature);
        return addressFromSig;
    }
    
    function getAddressFromSignature(bytes32 _hash, bytes calldata signature) public pure returns (address) {
        address addressFromSig = recoverSigner(_hash, signature);
        return addressFromSig;
    }
    
    function getHash(string calldata _payload) public pure returns (bytes32) {
        bytes32 hash = keccak256(abi.encodePacked(_payload));
        return hash;
    }
    
    function transferWithCode(uint256 _tokenId, string calldata code, address _to, uint256 _nonce,  bytes memory signature) public payable {
        require(witnesses[getAddressFromSignature(_tokenId, _nonce, signature)], 'Not Witnessed');
        IERC721 nftToken = IERC721(nftAddress);
        PreTransfer memory preTransfer = preTransfers[_tokenId];
        require(preTransfer.preImage == sha256(abi.encodePacked(code)), 'Code does not match'); // Payload should match
        nftToken.transferFrom(preTransfer._from, _to,  _tokenId);
        delete preTransfers[_tokenId];
        delete preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]];
        preTransferCounts[_tokenId] = preTransferCounts[_tokenId].sub(1);
        usedNonces[_nonce] = true;
    }
    
    function addPreTransfer(uint256 _tokenId, bytes32 preImage) public {
        require(!_duplicatePretransfer(_tokenId), 'Duplicate PreTransfer');
        preTransferCounts[_tokenId] = preTransferCounts[_tokenId].add(1);
        preTransfers[_tokenId] = PreTransfer("payload", preImage, msg.sender);
        preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]] = preTransfers[_tokenId];
    }
    
    function _duplicatePretransfer(uint256 _tokenId) internal view returns (bool) {
        string memory data = preTransfers[_tokenId].payload;
        bytes32 NULL = keccak256(bytes(''));
        return keccak256(bytes(data)) != NULL;
    }
    
    function deletePreTransfer(uint256 _tokenId) public {
        require(preTransfers[_tokenId]._from == msg.sender, 'PreTransfer does not belong to sender');
        delete preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]];
        preTransferCounts[_tokenId] = preTransferCounts[_tokenId].sub(1);
        delete preTransfers[_tokenId];
    }
    
    function getPreTransfer(uint256 _tokenId) public view returns (PreTransfer memory) {
        return preTransfers[_tokenId];
    }
    
    function checkPreTransferImage(string memory image, bytes32 preImage) public pure returns (bytes32, bytes32, bool) {
        bytes32 calculated = sha256(abi.encodePacked(image));
        bytes32 preBytes = preImage;
        return (calculated, preBytes, calculated == preBytes);
    }
    
    function getPreTransferCount(uint256 _tokenId) public view returns (uint length) {
        return preTransferCounts[_tokenId];
    }
    
    function getPreTransferByIndex(uint256 _tokenId, uint index) public view returns (PreTransfer memory) {
        return preTransfersByIndex[_tokenId][index];
    }
    
    function changeMetadataBaseUri(string calldata _uri) public isOwner {
        metadataBaseUri = _uri;
    }
    
    function transferPaymentOwnership(address newOwner) external isOwner {
        Ownable paymentToken = Ownable(paymentAddress);
        paymentToken.transferOwnership(newOwner);
    }
    
    function transferNftOwnership(address newOwner) external isOwner {
        Ownable nftToken = Ownable(nftAddress);
        nftToken.transferOwnership(newOwner);
    }
    
    function mint( address _to, uint256 _tokenId, string calldata _uri, string calldata _payload) external isOwner {
        IERC721 nftToken = IERC721(nftAddress);
        nftToken.mint(_to, _tokenId, _uri, _payload);
    }
    
    function changeName(string calldata name, string calldata symbol) external isOwner {
        IERC721 nftToken = IERC721(nftAddress);
        nftToken.changeName(name, symbol);
    }
    
    function updateTokenUri(uint256 _tokenId,string memory _uri) external isOwner {
        IERC721 nftToken = IERC721(nftAddress);
        nftToken.updateTokenUri(_tokenId, _uri);
    }
    
    function getPaymentDecimals() public view returns (uint8){
        BasicERC20 token = BasicERC20(paymentAddress);
        return token.decimals();
    }
    
    function changePayment(address payment) public isOwner {
       paymentAddress = payment;
    }
    
    // function changeCoupon(address coupon) public isOwner {
    //   couponAddress = coupon;
    // }
    
    function changeRecipient(address _recipient) public isOwner {
       recipientAddress = _recipient;
    }
    
    function changeNft(address token) public isOwner {
        nftAddress = token;
    }
    
    function changePrice(uint256 _price) public isOwner {
        uint decimals = BasicERC20(paymentAddress).decimals();
        price = _price * 10 ** decimals;
    }
    
    // function changeOfferPrice(uint256 _price) public isOwner {
    //     uint decimals = BasicERC20(couponAddress).decimals();
    //     offerPrice = _price * 10 ** decimals;
    // }
    
    function addChainId(uint chainId) public isOwner returns (bool) {
        return (_addChainId(chainId));
    }
    
    function removeChainId(uint chainId) public isOwner returns (bool) {
        return (_removeChainId(chainId));
    }
    
    function transferFromChain(address _to, uint chainId, uint256 amount) public isOwner returns (bool) {
        return _transferFromChain(_to, chainId, amount);
    }
    
    function concat(string memory a, string memory b) internal pure returns (string memory) {
        return string(abi.encodePacked(a, b));
    }
    /**
    * @dev Recover signer address from a message by using their signature
    * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
    * @param sig bytes signature, the signature is generated using web3.eth.sign(). Inclusive "0x..."
    */
    function recoverSigner(bytes32 hash, bytes memory sig) internal pure returns (address) {
        require(sig.length == 65, "Require correct length");

        bytes32 r;
        bytes32 s;
        uint8 v;

        // Divide the signature in r, s and v variables
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }

        // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
        if (v < 27) {
            v += 27;
        }

        require(v == 27 || v == 28, "Signature version not match");

        return recoverSigner2(hash, v, r, s);
    }

    function recoverSigner2(bytes32 h, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, h));
        address addr = ecrecover(prefixedHash, v, r, s);

        return addr;
    }
    
    /// @notice converts number to string
    /// @dev source: https://github.com/provable-things/ethereum-api/blob/master/oraclizeAPI_0.5.sol#L1045
    /// @param _i integer to convert
    /// @return _uintAsString
    function uintToStr(uint _i) internal pure returns (string memory _uintAsString) {
        uint number = _i;
        if (number == 0) {
            return "0";
        }
        uint j = number;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (number != 0) {
            bstr[k--] = byte(uint8(48 + number % 10));
            number /= 10;
        }
        return string(bstr);
    }
    
    function stringToBytes32(string memory source) internal pure returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }
    
        assembly {
            result := mload(add(source, 32))
        }
    }
    function bytes32ToStr(bytes32 _bytes32) internal pure returns (string memory) {

        // string memory str = string(_bytes32);
        // TypeError: Explicit type conversion not allowed from "bytes32" to "string storage pointer"
        // thus we should fist convert bytes32 to bytes (to dynamically-sized byte array)
    
        bytes memory bytesArray = new bytes(32);
        for (uint256 i; i < 32; i++) {
            bytesArray[i] = _bytes32[i];
            }
        return string(bytesArray);
    }
    function asciiToInteger(bytes32 x) public pure returns (uint256) {
        uint256 y;
        for (uint256 i = 0; i < 32; i++) {
            uint256 c = (uint256(x) >> (i * 8)) & 0xff;
            if (48 <= c && c <= 57)
                y += (c - 48) * 10 ** i;
            else
                break;
        }
        return y;
    }
    function toString(address account) public pure returns(string memory) {
        return toString(abi.encodePacked(account));
    }
    
    function toString(uint256 value) public pure returns(string memory) {
        return toString(abi.encodePacked(value));
    }
    
    function toString(bytes32 value) public pure returns(string memory) {
        return toString(abi.encodePacked(value));
    }
    
    function toString(bytes memory data) public pure returns(string memory) {
        bytes memory alphabet = "0123456789abcdef";
    
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint i = 0; i < data.length; i++) {
            str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"address","name":"_paymentAddress","type":"address"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"BridgeDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"BridgeWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","type":"event"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"addChainId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"string","name":"_payload","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"addPreMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"addPreTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_witness","type":"address"}],"name":"addWitness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"x","type":"bytes32"}],"name":"asciiToInteger","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"image","type":"string"}],"name":"buyWithPaymentOnly","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_payload","type":"string"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"buyWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"changeMetadataBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"changeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payment","type":"address"}],"name":"changePayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"changeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"image","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"checkPreMintImage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"image","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"checkPreTransferImage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deletePreMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deletePreTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_payload","type":"string"}],"name":"getHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaymentDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreMint","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"internalType":"struct VaultHandlerV7.PreMint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPreMintByIndex","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"internalType":"struct VaultHandlerV7.PreMint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"}],"name":"getPreMintCount","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreTransfer","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"}],"internalType":"struct VaultHandlerV7.PreTransfer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPreTransferByIndex","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"}],"internalType":"struct VaultHandlerV7.PreTransfer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreTransferCount","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataBaseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_payload","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipientAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"removeChainId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_witness","type":"address"}],"name":"removeWitness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"toggleShouldBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferNftOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferPaymentOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"code","type":"string"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"transferWithCode","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"witnesses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526009805460ff191690553480156200001b57600080fd5b506040516200485e3803806200485e8339810160408190526200003e91620004b7565b600160008181557fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805460ff1990811684179091556702c68af0bb1400007fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c8190557f0cb0be258cd4e0f89ef5514ec447dd8846b0cf865c7d0d8ea82ff58a1eae81a180548316851790557f0f7c2a22036bfa20acc9ee73aa9ab92bebf1413ecc0991a7c2b4d6178e9838ed8190557f2af04f721798314fc694a46b3db9f8005ee5d928ceb0c93e438e01e3ac240ed480548316851790557fdcb06883458ea50914626defda05e41b08347a7ab71dc9fa1dc89dada3554b9c8190557f7673bcbb3401a7cbae68f81d40eea2cf35afdaf7ecd016ebf3f02857fcc1260a80548316851790557f6b16ef514f22b74729cbea5cc7babfecbdc2309e530ca716643d11fe929eed2e8190557f7235287a5cb1908d23369905908658187d8d258d18d7ad15bcb288795998bcba80548316851790557f22848320af6c4894685e387cf97d56ba798f5dabcd8f3a2db70374776f0f2f9381905560fa83527f2246e3a745c1df3cc2a1c7eecb7d02c255de440492ab220c839a47c0ff0ff61f8054909216909317905560036020527fd1a8b09c64a23b2afda8cd351fe2756c44d7cad4fe3cb981d9b54c00cc07ebbc91909155600480546001600160a01b0319163317908190556040516001600160a01b039190911691907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a36004546200028e906001600160a01b0316620003a3565b6040518060600160405280602d815260200162004831602d91398051620002be91600591602090910190620003fd565b5060068054600180546001600160a01b03199081166001600160a01b03888116919091178084556007805490931688831617909255610100600160a81b0319909316610100898516021760ff19169091179092556040805163313ce56760e01b815290516000939092169163313ce56791600480820192602092909190829003018186803b1580156200035057600080fd5b505afa15801562000365573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038b91906200050b565b60ff16600a0a91909102600855506200056c92505050565b6004546001600160a01b03163314620003d95760405162461bcd60e51b8152600401620003d09062000535565b60405180910390fd5b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200044057805160ff191683800117855562000470565b8280016001018555821562000470579182015b828111156200047057825182559160200191906001019062000453565b506200047e92915062000482565b5090565b5b808211156200047e576000815560010162000483565b80516001600160a01b0381168114620004b157600080fd5b92915050565b60008060008060808587031215620004cd578384fd5b620004d9868662000499565b9350620004ea866020870162000499565b9250620004fb866040870162000499565b6060959095015193969295505050565b6000602082840312156200051d578081fd5b815160ff811681146200052e578182fd5b9392505050565b60208082526013908201527f43616c6c6572206973206e6f74206f776e657200000000000000000000000000604082015260600190565b6142b5806200057c6000396000f3fe6080604052600436106103505760003560e01c80637224bb92116101c6578063bc2bf73e116100f7578063d81fba1611610095578063ee2f13cd1161006f578063ee2f13cd14610962578063f2fde38b14610982578063fad80169146109a2578063fc9a85b1146109b557610350565b8063d81fba16146104ce578063df4a529d1461092f578063e94b77061461094f57610350565b8063d02b1153116100d1578063d02b1153146108ad578063d0569c22146108cd578063d2b64472146108ed578063d31af4841461090f57610350565b8063bc2bf73e14610840578063bd54c89c1461086d578063c5eeb8af1461088d57610350565b806399b2c1c711610164578063a035b1fe1161013e578063a035b1fe146107eb578063a111fbae14610800578063a2b40d1914610820578063b11a19e81461067657610350565b806399b2c1c71461078b5780639d75afc7146107ab5780639eaa5626146107cb57610350565b8063893d20e8116101a0578063893d20e8146107165780638ddc20201461072b57806392c2bcb41461074b578063945cfe1f1461076b57610350565b80637224bb92146106b657806379d33606146106d657806386575e40146106f657610350565b80633b442cdb116102a05780635aff59991161023e5780635e1bd52a116102185780635e1bd52a14610641578063633423be146106615780636900a3ae1461067657806371aad10d1461069657610350565b80635aff5999146105ea5780635b6beeb9146105ff5780635bf8633a1461062c57610350565b806356ca623e1161027a57806356ca623e1461056a578063582f1da21461058a57806359e26be1146105aa5780635aaf27b7146105ca57610350565b80633b442cdb146104fd5780633debbbc01461052a578063528204d01461054a57610350565b806331726da11161030d57806332ca2c00116102e757806332ca2c001461045f57806336864adb1461048c578063379607f5146104ae57806339f6c85e146104ce57610350565b806331726da11461040a57806331b480551461042a578063321c3cf61461043f57610350565b80630d7def9514610355578063158ef93e1461036c57806321d93090146103975780632754902f146103b75780632fb102cf146103ca57806330e6822c146103ea575b600080fd5b34801561036157600080fd5b5061036a6109d5565b005b34801561037857600080fd5b506103816109e9565b60405161038e9190613de4565b60405180910390f35b3480156103a357600080fd5b506103816103b23660046137f2565b6109f2565b61036a6103c5366004613a04565b610a07565b3480156103d657600080fd5b5061036a6103e5366004613684565b610cf7565b3480156103f657600080fd5b5061038161040536600461379e565b610d9c565b34801561041657600080fd5b5061036a610425366004613580565b610ddc565b34801561043657600080fd5b50610381610e6e565b34801561044b57600080fd5b5061038161045a366004613580565b610e77565b34801561046b57600080fd5b5061047f61047a3660046137f2565b610e8c565b60405161038e9190614183565b34801561049857600080fd5b506104a1610f61565b60405161038e9190613e4c565b3480156104ba57600080fd5b5061036a6104c93660046137f2565b610fef565b3480156104da57600080fd5b506104ee6104e93660046139a1565b61104f565b60405161038e93929190613def565b34801561050957600080fd5b5061051d610518366004613b21565b6110d1565b60405161038e9190613cb4565b34801561053657600080fd5b5061036a610545366004613580565b61118e565b34801561055657600080fd5b5061036a6105653660046139e3565b6111ee565b34801561057657600080fd5b506104a1610585366004613580565b611346565b34801561059657600080fd5b506103816105a53660046137f2565b611376565b3480156105b657600080fd5b5061036a6105c5366004613580565b6113ac565b3480156105d657600080fd5b5061036a6105e5366004613580565b6113fa565b3480156105f657600080fd5b5061051d611446565b34801561060b57600080fd5b5061061f61061a36600461389d565b611455565b60405161038e9190613c2e565b34801561063857600080fd5b5061051d61148b565b34801561064d57600080fd5b5061038161065c3660046139e3565b61149f565b34801561066d57600080fd5b5061051d6116f6565b34801561068257600080fd5b506104a16106913660046137f2565b611705565b3480156106a257600080fd5b506104a16106b136600461386b565b61171b565b3480156106c257600080fd5b5061061f6106d13660046137f2565b6118c4565b3480156106e257600080fd5b5061051d6106f1366004613822565b6118d6565b34801561070257600080fd5b5061036a6107113660046138dc565b611922565b34801561072257600080fd5b5061051d6119c1565b34801561073757600080fd5b5061036a610746366004613580565b6119d0565b34801561075757600080fd5b5061036a610766366004613580565b611a22565b34801561077757600080fd5b5061047f6107863660046139e3565b611a6e565b34801561079757600080fd5b5061061f6107a63660046137f2565b611b4a565b3480156107b757600080fd5b5061036a6107c6366004613600565b611ba2565b3480156107d757600080fd5b5061051d6107e6366004613ad4565b611c72565b3480156107f757600080fd5b5061061f611ce3565b34801561080c57600080fd5b5061061f61081b3660046137f2565b611ce9565b34801561082c57600080fd5b5061036a61083b3660046137f2565b611cfb565b34801561084c57600080fd5b5061086061085b366004613600565b611db2565b60405161038e9190614151565b34801561087957600080fd5b5061036a61088836600461389d565b611e83565b34801561089957600080fd5b506103816108a83660046137f2565b611ebe565b3480156108b957600080fd5b5061036a6108c836600461359c565b611ef4565b3480156108d957600080fd5b5061061f6108e8366004613580565b612117565b3480156108f957600080fd5b50610902612132565b60405161038e91906141e3565b34801561091b57600080fd5b5061036a61092a366004613a90565b6121b8565b34801561093b57600080fd5b5061036a61094a3660046137f2565b612251565b61036a61095d36600461370c565b61232c565b34801561096e57600080fd5b5061036a61097d366004613580565b6126ae565b34801561098e57600080fd5b5061036a61099d366004613580565b6126f9565b61036a6109b036600461362b565b61277f565b3480156109c157600080fd5b506108606109d0366004613600565b612c3e565b6009805460ff19811660ff90911615179055565b60065460ff1681565b60026020526000908152604090205460ff1681565b60136000610a16888585611c72565b6001600160a01b0316815260208101919091526040016000205460ff16610a585760405162461bcd60e51b8152600401610a4f90614021565b60405180910390fd5b60065461010090046001600160a01b0316610a716132f2565b6000888152600d60209081526040918290208251815460026001821615610100026000190190911604601f81018490049093028101608090810190945260608101838152909391928492849190840182828015610b0f5780601f10610ae457610100808354040283529160200191610b0f565b820191906000526020600020905b815481529060010190602001808311610af257829003601f168201915b505050918352505060018201546020808301919091526002928301546001600160a01b031660409283015290519293509091610b4f918a918a9101613c75565b60408051601f1981840301815290829052610b6991613c37565b602060405180830381855afa158015610b86573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610ba9919061380a565b816020015114610bcb5760405162461bcd60e51b8152600401610a4f90614070565b60408082015190516323b872dd60e01b81526001600160a01b038416916323b872dd91610bff919089908d90600401613ce2565b600060405180830381600087803b158015610c1957600080fd5b505af1158015610c2d573d6000803e3d6000fd5b5050506000898152600d602052604081209150610c4a8282613312565b50600060018201819055600290910180546001600160a01b0319169055888152600e60209081526040808320600f8352818420548452909152812090610c908282613312565b5060006001828101829055600290920180546001600160a01b0319169055898152600f6020526040902054610cc491612cc9565b6000988952600f60209081526040808b20929092559489526014909452505050909320805460ff19166001179055505050565b6004546001600160a01b03163314610d215760405162461bcd60e51b8152600401610a4f90613ee8565b600654604051632fb102cf60e01b81526101009091046001600160a01b0316908190632fb102cf90610d61908a908a908a908a908a908a90600401613d1f565b600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b5050505050505050505050565b6004546000906001600160a01b03163314610dc95760405162461bcd60e51b8152600401610a4f90613ee8565b610dd4848484612d12565b949350505050565b6004546001600160a01b03163314610e065760405162461bcd60e51b8152600401610a4f90613ee8565b60015460405163f2fde38b60e01b81526001600160a01b0390911690819063f2fde38b90610e38908590600401613cb4565b600060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b505050505050565b60095460ff1681565b60136020526000908152604090205460ff1681565b610e946132f2565b6000828152600d60209081526040918290208251815460026001821615610100026000190190911604601f81018490049093028101608090810190945260608101838152909391928492849190840182828015610f325780601f10610f0757610100808354040283529160200191610f32565b820191906000526020600020905b815481529060010190602001808311610f1557829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b031660409091015290505b919050565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fe75780601f10610fbc57610100808354040283529160200191610fe7565b820191906000526020600020905b815481529060010190602001808311610fca57829003601f168201915b505050505081565b6004546001600160a01b031633146110195760405162461bcd60e51b8152600401610a4f90613ee8565b600654604051630852cd8d60e31b81526101009091046001600160a01b03169081906342966c6890610e38908590600401613c2e565b6000806000806002866040516020016110689190613c37565b60408051601f198184030181529082905261108291613c37565b602060405180830381855afa15801561109f573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110c2919061380a565b96949550505083851492915050565b60008481526014602052604081205460ff16156110ed57600080fd5b60606111376110fb88612e50565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f2a92505050565b9050600061114d8261114889612e50565b612f2a565b60405160200161115d9190613c37565b60405160208183030381529060405280519060200120905060006111818286612f56565b9998505050505050505050565b6004546001600160a01b031633146111b85760405162461bcd60e51b8152600401610a4f90613ee8565b60065460405163f2fde38b60e01b81526101009091046001600160a01b031690819063f2fde38b90610e38908590600401613cb4565b6111f782612fd5565b156112145760405162461bcd60e51b8152600401610a4f90613e89565b6000828152600f602052604090205461122e9060016130af565b6000838152600f6020908152604080832093909355825160a081018452600760608201908152661c185e5b1bd85960ca1b608083015281528082018590523381850152858352600d82529290912082518051919261129192849290910190613359565b50602082810151600180840191909155604093840151600293840180546001600160a01b039092166001600160a01b03199092169190911790556000868152600d8352848120600e8452858220600f8552868320548352909352939093208154919390926113129284928692908216156101000260001901909116046133d7565b5060018281015490820155600291820154910180546001600160a01b0319166001600160a01b039092169190911790555050565b60606113708260405160200161135c9190613c11565b60405160208183030381529060405261171b565b92915050565b6004546000906001600160a01b031633146113a35760405162461bcd60e51b8152600401610a4f90613ee8565b611370826130d4565b6004546001600160a01b031633146113d65760405162461bcd60e51b8152600401610a4f90613ee8565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b6004546001600160a01b031633146114245760405162461bcd60e51b8152600401610a4f90613ee8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b600080838360405160200161146b929190613c75565b60408051808303601f190181529190528051602090910120949350505050565b60065461010090046001600160a01b031681565b60008281526002602052604081205460ff166114cd5760405162461bcd60e51b8152600401610a4f90613e5f565b6001546001600160a01b0316828163dd62ed3e6114e86130f3565b306040518363ffffffff1660e01b8152600401611506929190613cc8565b60206040518083038186803b15801561151e57600080fd5b505afa158015611532573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611556919061380a565b10156115745760405162461bcd60e51b8152600401610a4f90613fea565b806001600160a01b03166323b872dd61158b6130f3565b30866040518463ffffffff1660e01b81526004016115ab93929190613ce2565b602060405180830381600087803b1580156115c557600080fd5b505af11580156115d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fd91906137d2565b6116195760405162461bcd60e51b8152600401610a4f90614048565b600154604051630852cd8d60e31b81526001600160a01b03909116906342966c6890611649908690600401613c2e565b600060405180830381600087803b15801561166357600080fd5b505af1158015611677573d6000803e3d6000fd5b5050506000858152600360205260409020546116949150846130af565b600085815260036020526040902055826116ac6130f3565b6001600160a01b03167fed2432d91de9329ae454049df81fd5d6b856c4470096ca37a29c1fe111f57f0c866040516116e49190613c2e565b60405180910390a35060019392505050565b6001546001600160a01b031681565b60606113708260405160200161135c9190613c2e565b6060806040518060400160405280601081526020016f181899199a1a9b1b9c1cb0b131b232b360811b8152509050606083516002026002016001600160401b038111801561176857600080fd5b506040519080825280601f01601f191660200182016040528015611793576020820181803683370190505b509050600360fc1b816000815181106117a857fe5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117d157fe5b60200101906001600160f81b031916908160001a90535060005b84518110156118bc5782600486838151811061180357fe5b016020015182516001600160f81b031990911690911c60f81c90811061182557fe5b602001015160f81c60f81b82826002026002018151811061184257fe5b60200101906001600160f81b031916908160001a9053508285828151811061186657fe5b602091010151815160f89190911c600f1690811061188057fe5b602001015160f81c60f81b82826002026003018151811061189d57fe5b60200101906001600160f81b031916908160001a9053506001016117eb565b509392505050565b60036020526000908152604090205481565b6000806119198585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f5692505050565b95945050505050565b6004546001600160a01b0316331461194c5760405162461bcd60e51b8152600401610a4f90613ee8565b6006546040516302195d7960e61b81526101009091046001600160a01b03169081906386575e4090611988908890889088908890600401613e25565b600060405180830381600087803b1580156119a257600080fd5b505af11580156119b6573d6000803e3d6000fd5b505050505050505050565b6004546001600160a01b031690565b6004546001600160a01b031633146119fa5760405162461bcd60e51b8152600401610a4f90613ee8565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6004546001600160a01b03163314611a4c5760405162461bcd60e51b8152600401610a4f90613ee8565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611a766132f2565b6000838152600e602090815260408083208584528252918290208251815460026001821615610100026000190190911604601f81018490049093028101608090810190945260608101838152909391928492849190840182828015611b1c5780601f10611af157610100808354040283529160200191611b1c565b820191906000526020600020905b815481529060010190602001808311611aff57829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b03166040909101529392505050565b60008060005b6020811015611b9b5760ff6008820285901c1660308110801590611b75575060398111155b15611b8c5781600a0a603082030283019250611b92565b50611b9b565b50600101611b50565b5092915050565b6004546001600160a01b03163314611bcc5760405162461bcd60e51b8152600401610a4f90613ee8565b6001600160a01b0382166000908152600b60209081526040808320600c8352818420548452909152812090611c018282613312565b50600060019182018190556001600160a01b0384168152600c6020526040902054611c2b91612cc9565b6001600160a01b0383166000908152600c6020908152604080832093909355600a8152828220848352905290812090611c648282613312565b600182016000905550505050565b60008281526014602052604081205460ff1615611c8e57600080fd5b6000611ca5611c9c86612e50565b61114886612e50565b604051602001611cb59190613c37565b6040516020818303038152906040528051906020012090506000611cd98285612f56565b9695505050505050565b60085481565b6000908152600f602052604090205490565b6004546001600160a01b03163314611d255760405162461bcd60e51b8152600401610a4f90613ee8565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b158015611d6a57600080fd5b505afa158015611d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da29190613b9a565b60ff16600a0a9190910260085550565b611dba61344c565b6001600160a01b0383166000908152600b602090815260408083208584528252918290208251815460026001821615610100026000190190911604601f8101849004909302810160609081018552938101838152909391928492849190840182828015611e685780601f10611e3d57610100808354040283529160200191611e68565b820191906000526020600020905b815481529060010190602001808311611e4b57829003601f168201915b50505050508152602001600182015481525050905092915050565b6004546001600160a01b03163314611ead5760405162461bcd60e51b8152600401610a4f90613ee8565b611eb960058383613464565b505050565b6004546000906001600160a01b03163314611eeb5760405162461bcd60e51b8152600401610a4f90613ee8565b611370826130f7565b6004546001600160a01b03163314611f1e5760405162461bcd60e51b8152600401610a4f90613ee8565b600654604051634d6ca91960e11b81526101009091046001600160a01b031690639ad9523290611f52908590600401613c2e565b60006040518083038186803b158015611f6a57600080fd5b505afa925050508015611f9f57506040513d6000823e601f3d908101601f19168201604052611f9c9190810190613938565b60015b6120f857611fad8583613112565b15611fca5760405162461bcd60e51b8152600401610a4f906140e2565b6001600160a01b0385166000908152600c6020526040902054611fee9060016130af565b6001600160a01b0386166000908152600c6020908152604091829020929092558051601f860183900490920282016060908101825290820185815282918790879081908501838280828437600092018290525093855250505060209182018490526001600160a01b0388168152600a825260408082208683528352902082518051919261208092849290910190613359565b506020918201516001918201556001600160a01b0387166000818152600a845260408082208783528552808220928252600b8552808220600c865281832054835290945292909220825490916120e99183918591600291811615610100026000190116046133d7565b50600191820154910155612110565b60405162461bcd60e51b8152600401610a4f90613fb3565b5050505050565b6001600160a01b03166000908152600c602052604090205490565b6001546040805163313ce56760e01b815290516000926001600160a01b031691829163313ce56791600480820192602092909190829003018186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b29190613b9a565b91505090565b6004546001600160a01b031633146121e25760405162461bcd60e51b8152600401610a4f90613ee8565b6006546040516334c6bd2160e21b81526101009091046001600160a01b031690819063d31af4849061221a90869086906004016141ca565b600060405180830381600087803b15801561223457600080fd5b505af1158015612248573d6000803e3d6000fd5b50505050505050565b6000818152600d60205260409020600201546001600160a01b0316331461228a5760405162461bcd60e51b8152600401610a4f9061409d565b6000818152600e60209081526040808320600f83528184205484529091528120906122b58282613312565b5060006001828101829055600290920180546001600160a01b0319169055828152600f60205260409020546122e991612cc9565b6000828152600f6020908152604080832093909355600d9052908120906123108282613312565b506000600182015560020180546001600160a01b031916905550565b6001546006546009546001600160a01b03928316926101009092049091169060ff161561245b576008546040516323b872dd60e01b81526001600160a01b038416916323b872dd91612385913391309190600401613ce2565b602060405180830381600087803b15801561239f57600080fd5b505af11580156123b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d791906137d2565b6123f35760405162461bcd60e51b8152600401610a4f90614048565b600154600854604051630852cd8d60e31b81526001600160a01b03909216916342966c689161242491600401613c2e565b600060405180830381600087803b15801561243e57600080fd5b505af1158015612452573d6000803e3d6000fd5b50505050612500565b6007546008546040516323b872dd60e01b81526001600160a01b03858116936323b872dd9361249293339390921691600401613ce2565b602060405180830381600087803b1580156124ac57600080fd5b505af11580156124c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e491906137d2565b6125005760405162461bcd60e51b8152600401610a4f90614048565b600061254589878a8a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110d192505050565b6001600160a01b03811660009081526013602052604090205490915060ff166125805760405162461bcd60e51b8152600401610a4f90614021565b600086815260146020908152604091829020805460ff19166001908117909155600580548451601f6002600019958416156101000295909501909216939093049081018490048402830184019094528382526060936126389383018282801561262a5780601f106125ff5761010080835404028352916020019161262a565b820191906000526020600020905b81548152906001019060200180831161260d57829003601f168201915b50505050506111488c612e50565b604051632fb102cf60e01b81529091506001600160a01b03841690632fb102cf9061266f908e908e9086908f908f90600401613d5a565b600060405180830381600087803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b505050505050505050505050505050565b6004546001600160a01b031633146126d85760405162461bcd60e51b8152600401610a4f90613ee8565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6004546001600160a01b031633146127235760405162461bcd60e51b8152600401610a4f90613ee8565b6004546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001546006546001600160a01b0391821691610100909104166127a061344c565b336000908152600a602090815260408083208984528252918290208251815460026001821615610100026000190190911604601f81018490049093028101606090810185529381018381529093919284928491908401828280156128455780601f1061281a57610100808354040283529160200191612845565b820191906000526020600020905b81548152906001019060200180831161282857829003601f168201915b5050505050815260200160018201548152505090506002858560405160200161286f929190613c75565b60408051601f198184030181529082905261288991613c37565b602060405180830381855afa1580156128a6573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906128c9919061380a565b8160200151146128eb5760405162461bcd60e51b8152600401610a4f90613f83565b60095460ff16156129fe576008546040516323b872dd60e01b81526001600160a01b038516916323b872dd91612928913391309190600401613ce2565b602060405180830381600087803b15801561294257600080fd5b505af1158015612956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297a91906137d2565b6129965760405162461bcd60e51b8152600401610a4f90614048565b600154600854604051630852cd8d60e31b81526001600160a01b03909216916342966c68916129c791600401613c2e565b600060405180830381600087803b1580156129e157600080fd5b505af11580156129f5573d6000803e3d6000fd5b50505050612aa3565b6007546008546040516323b872dd60e01b81526001600160a01b03868116936323b872dd93612a3593339390921691600401613ce2565b602060405180830381600087803b158015612a4f57600080fd5b505af1158015612a63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8791906137d2565b612aa35760405162461bcd60e51b8152600401610a4f90614048565b6005805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152606093612b409391929091830182828015612b325780601f10612b0757610100808354040283529160200191612b32565b820191906000526020600020905b815481529060010190602001808311612b1557829003601f168201915b505050505061114889612e50565b8251604051632fb102cf60e01b81529192506001600160a01b03851691632fb102cf91612b76918c918c91879190600401613da0565b600060405180830381600087803b158015612b9057600080fd5b505af1158015612ba4573d6000803e3d6000fd5b5050336000908152600b60209081526040808320600c8352818420548452909152812092509050612bd58282613312565b506000600191909101819055338152600a602090815260408083208a8452909152812090612c038282613312565b5060006001918201819055338152600c6020526040902054612c2491612cc9565b336000908152600c60205260409020555050505050505050565b612c4661344c565b6001600160a01b0383166000908152600a602090815260408083208584528252918290208251815460026001821615610100026000190190911604601f8101849004909302810160609081018552938101838152909391928492849190840182828015611e685780601f10611e3d57610100808354040283529160200191611e68565b6000612d0b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131ff565b9392505050565b600082815260036020526040812054821115612d405760405162461bcd60e51b8152600401610a4f9061410d565b60008381526002602052604090205460ff16612d6e5760405162461bcd60e51b8152600401610a4f90613e5f565b6001546040516340c10f1960e01b81526001600160a01b039091169081906340c10f1990612da29088908790600401613d06565b600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b505050600085815260036020526040902054612ded915084612cc9565b60008581526003602052604090205582612e056130f3565b6001600160a01b03167fdfb36617677d4721feefea07d11b2d1aca3d4ea49facf2bae87fbc8db4ecc91386604051612e3d9190613c2e565b60405180910390a3506001949350505050565b60608180612e775750506040805180820190915260018152600360fc1b6020820152610f5c565b8060005b8115612e8f57600101600a82049150612e7b565b6060816001600160401b0381118015612ea757600080fd5b506040519080825280601f01601f191660200182016040528015612ed2576020820181803683370190505b50905060001982015b8415612f2057600a850660300160f81b82828060019003935081518110612efe57fe5b60200101906001600160f81b031916908160001a905350600a85049450612edb565b5095945050505050565b60608282604051602001612f3f929190613c85565b604051602081830303815290604052905092915050565b60008151604114612f795760405162461bcd60e51b8152600401610a4f90613eb8565b60208201516040830151606084015160001a601b811015612f9857601b015b8060ff16601b1480612fad57508060ff16601c145b612fc95760405162461bcd60e51b8152600401610a4f90613f4c565b611cd98682858561322b565b6000818152600d6020908152604080832080548251601f600260001961010060018616150201909316929092049182018590048502810185019093528083526060938301828280156130685780601f1061303d57610100808354040283529160200191613068565b820191906000526020600020905b81548152906001019060200180831161304b57829003601f168201915b50506040805160208082019092526000905284519401939093207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47014159695505050505050565b600082820183811015612d0b5760405162461bcd60e51b8152600401610a4f90613f15565b6000908152600260205260409020805460ff1916600190811790915590565b3390565b6000908152600260205260409020805460ff19169055600190565b6001600160a01b0382166000908152600a60209081526040808320848452825280832080548251601f600260001961010060018616150201909316929092049182018590048502810185019093528083526060938301828280156131b75780601f1061318c576101008083540402835291602001916131b7565b820191906000526020600020905b81548152906001019060200180831161319a57829003601f168201915b50506040805160208082019092526000905284519401939093207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701415979650505050505050565b600081848411156132235760405162461bcd60e51b8152600401610a4f9190613e4c565b505050900390565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818760405160200161327c929190613c53565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516132b99493929190613e07565b6020604051602081039080840390855afa1580156132db573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b604080516060808201835281526000602082018190529181019190915290565b50805460018160011615610100020316600290046000825580601f106133385750613356565b601f01602090049060005260206000209081019061335691906134d2565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061339a57805160ff19168380011785556133c7565b828001600101855582156133c7579182015b828111156133c75782518255916020019190600101906133ac565b506133d39291506134d2565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061341057805485556133c7565b828001600101855582156133c757600052602060002091601f016020900482015b828111156133c7578254825591600101919060010190613431565b60408051808201909152606081526000602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134a55782800160ff198235161785556133c7565b828001600101855582156133c7579182015b828111156133c75782358255916020019190600101906134b7565b5b808211156133d357600081556001016134d3565b60008083601f8401126134f8578182fd5b5081356001600160401b0381111561350e578182fd5b60208301915083602082850101111561352657600080fd5b9250929050565b600082601f83011261353d578081fd5b813561355061354b82614217565b6141f1565b915080825283602082850101111561356757600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215613591578081fd5b8135612d0b8161426a565b6000806000806000608086880312156135b3578081fd5b85356135be8161426a565b945060208601356001600160401b038111156135d8578182fd5b6135e4888289016134e7565b9699909850959660408101359660609091013595509350505050565b60008060408385031215613612578182fd5b823561361d8161426a565b946020939093013593505050565b60008060008060608587031215613640578384fd5b843561364b8161426a565b93506020850135925060408501356001600160401b0381111561366c578283fd5b613678878288016134e7565b95989497509550505050565b6000806000806000806080878903121561369c578081fd5b86356136a78161426a565b95506020870135945060408701356001600160401b03808211156136c9578283fd5b6136d58a838b016134e7565b909650945060608901359150808211156136ed578283fd5b506136fa89828a016134e7565b979a9699509497509295939492505050565b600080600080600080600060a0888a031215613726578081fd5b87356137318161426a565b96506020880135955060408801356001600160401b0380821115613753578283fd5b61375f8b838c016134e7565b909750955060608a0135945060808a013591508082111561377e578283fd5b5061378b8a828b016134e7565b989b979a50959850939692959293505050565b6000806000606084860312156137b2578283fd5b83356137bd8161426a565b95602085013595506040909401359392505050565b6000602082840312156137e3578081fd5b81518015158114612d0b578182fd5b600060208284031215613803578081fd5b5035919050565b60006020828403121561381b578081fd5b5051919050565b600080600060408486031215613836578081fd5b8335925060208401356001600160401b03811115613852578182fd5b61385e868287016134e7565b9497909650939450505050565b60006020828403121561387c578081fd5b81356001600160401b03811115613891578182fd5b610dd48482850161352d565b600080602083850312156138af578182fd5b82356001600160401b038111156138c4578283fd5b6138d0858286016134e7565b90969095509350505050565b600080600080604085870312156138f1578182fd5b84356001600160401b0380821115613907578384fd5b613913888389016134e7565b9096509450602087013591508082111561392b578384fd5b50613678878288016134e7565b600060208284031215613949578081fd5b81516001600160401b0381111561395e578182fd5b8201601f8101841361396e578182fd5b805161397c61354b82614217565b818152856020838501011115613990578384fd5b61191982602083016020860161423a565b600080604083850312156139b3578182fd5b82356001600160401b038111156139c8578283fd5b6139d48582860161352d565b95602094909401359450505050565b600080604083850312156139f5578182fd5b50508035926020909101359150565b60008060008060008060a08789031215613a1c578384fd5b8635955060208701356001600160401b0380821115613a39578586fd5b613a458a838b016134e7565b909750955060408901359150613a5a8261426a565b9093506060880135925060808801359080821115613a76578283fd5b50613a8389828a0161352d565b9150509295509295509295565b60008060408385031215613aa2578182fd5b8235915060208301356001600160401b03811115613abe578182fd5b613aca8582860161352d565b9150509250929050565b600080600060608486031215613ae8578081fd5b833592506020840135915060408401356001600160401b03811115613b0b578182fd5b613b178682870161352d565b9150509250925092565b600080600080600060808688031215613b38578283fd5b853594506020860135935060408601356001600160401b0380821115613b5c578485fd5b613b6889838a016134e7565b90955093506060880135915080821115613b80578283fd5b50613b8d8882890161352d565b9150509295509295909350565b600060208284031215613bab578081fd5b815160ff81168114612d0b578182fd5b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452613bfd81602086016020860161423a565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008251613c4981846020870161423a565b9190910192915050565b60008351613c6581846020880161423a565b9190910191825250602001919050565b6000828483379101908152919050565b60008351613c9781846020880161423a565b835190830190613cab81836020880161423a565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038816825286602083015260806040830152613d47608083018688613bbb565b8281036060840152611181818587613bbb565b600060018060a01b038716825285602083015260806040830152613d816080830186613be5565b8281036060840152613d94818587613bbb565b98975050505050505050565b600060018060a01b038616825284602083015260806040830152613dc76080830185613be5565b8281036060840152613dd98185613be5565b979650505050505050565b901515815260200190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b600060408252613e39604083018688613bbb565b8281036020840152613dd9818587613bbb565b600060208252612d0b6020830184613be5565b60208082526010908201526f125b9d985b1a590810da185a5b88125160821b604082015260600190565b602080825260159082015274223ab83634b1b0ba3290283932aa3930b739b332b960591b604082015260600190565b6020808252601690820152750a4cae2ead2e4ca40c6dee4e4cac6e840d8cadccee8d60531b604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601b908201527f5369676e61747572652076657273696f6e206e6f74206d617463680000000000604082015260600190565b6020808252601690820152750a0c2f2d8dec2c840c8decae640dcdee840dac2e8c6d60531b604082015260600190565b60208082526017908201527f4e46542045786973747320776974682074686973204944000000000000000000604082015260600190565b60208082526018908201527f48616e646c657220756e61626c6520746f207370656e64200000000000000000604082015260600190565b6020808252600d908201526c139bdd0815da5d1b995cdcd959609a1b604082015260600190565b6020808252600e908201526d2a3930b739b332b91022a92927a960911b604082015260600190565b602080825260139082015272086dec8ca40c8decae640dcdee840dac2e8c6d606b1b604082015260600190565b60208082526025908201527f5072655472616e7366657220646f6573206e6f742062656c6f6e6720746f207360408201526432b73232b960d91b606082015260800190565b602080825260119082015270111d5c1b1a58d85d1948141c99535a5b9d607a1b604082015260600190565b60208082526024908201527f43616e206e6f74207472616e73666572206d6f7265207468616e206465706f736040820152631a5d195960e21b606082015260800190565b60006020825282516040602084015261416d6060840182613be5565b9050602084015160408401528091505092915050565b60006020825282516060602084015261419f6080840182613be5565b6020850151604085810191909152909401516001600160a01b03166060909301929092525090919050565b600083825260406020830152610dd46040830184613be5565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561420f57600080fd5b604052919050565b60006001600160401b0382111561422c578081fd5b50601f01601f191660200190565b60005b8381101561425557818101518382015260200161423d565b83811115614264576000848401525b50505050565b6001600160a01b038116811461335657600080fdfea2646970667358221220df0a71af19a3779eec6b00292761fb6798319030f62f7b2b752b25bb20df44ac64736f6c634300060c003368747470733a2f2f6170692e656d626c656d7661756c742e696f2f733a65766d657461646174612f6d6574612f00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a31901000000000000000000000000000000000000000000000000000000000000012c

Deployed Bytecode

0x6080604052600436106103505760003560e01c80637224bb92116101c6578063bc2bf73e116100f7578063d81fba1611610095578063ee2f13cd1161006f578063ee2f13cd14610962578063f2fde38b14610982578063fad80169146109a2578063fc9a85b1146109b557610350565b8063d81fba16146104ce578063df4a529d1461092f578063e94b77061461094f57610350565b8063d02b1153116100d1578063d02b1153146108ad578063d0569c22146108cd578063d2b64472146108ed578063d31af4841461090f57610350565b8063bc2bf73e14610840578063bd54c89c1461086d578063c5eeb8af1461088d57610350565b806399b2c1c711610164578063a035b1fe1161013e578063a035b1fe146107eb578063a111fbae14610800578063a2b40d1914610820578063b11a19e81461067657610350565b806399b2c1c71461078b5780639d75afc7146107ab5780639eaa5626146107cb57610350565b8063893d20e8116101a0578063893d20e8146107165780638ddc20201461072b57806392c2bcb41461074b578063945cfe1f1461076b57610350565b80637224bb92146106b657806379d33606146106d657806386575e40146106f657610350565b80633b442cdb116102a05780635aff59991161023e5780635e1bd52a116102185780635e1bd52a14610641578063633423be146106615780636900a3ae1461067657806371aad10d1461069657610350565b80635aff5999146105ea5780635b6beeb9146105ff5780635bf8633a1461062c57610350565b806356ca623e1161027a57806356ca623e1461056a578063582f1da21461058a57806359e26be1146105aa5780635aaf27b7146105ca57610350565b80633b442cdb146104fd5780633debbbc01461052a578063528204d01461054a57610350565b806331726da11161030d57806332ca2c00116102e757806332ca2c001461045f57806336864adb1461048c578063379607f5146104ae57806339f6c85e146104ce57610350565b806331726da11461040a57806331b480551461042a578063321c3cf61461043f57610350565b80630d7def9514610355578063158ef93e1461036c57806321d93090146103975780632754902f146103b75780632fb102cf146103ca57806330e6822c146103ea575b600080fd5b34801561036157600080fd5b5061036a6109d5565b005b34801561037857600080fd5b506103816109e9565b60405161038e9190613de4565b60405180910390f35b3480156103a357600080fd5b506103816103b23660046137f2565b6109f2565b61036a6103c5366004613a04565b610a07565b3480156103d657600080fd5b5061036a6103e5366004613684565b610cf7565b3480156103f657600080fd5b5061038161040536600461379e565b610d9c565b34801561041657600080fd5b5061036a610425366004613580565b610ddc565b34801561043657600080fd5b50610381610e6e565b34801561044b57600080fd5b5061038161045a366004613580565b610e77565b34801561046b57600080fd5b5061047f61047a3660046137f2565b610e8c565b60405161038e9190614183565b34801561049857600080fd5b506104a1610f61565b60405161038e9190613e4c565b3480156104ba57600080fd5b5061036a6104c93660046137f2565b610fef565b3480156104da57600080fd5b506104ee6104e93660046139a1565b61104f565b60405161038e93929190613def565b34801561050957600080fd5b5061051d610518366004613b21565b6110d1565b60405161038e9190613cb4565b34801561053657600080fd5b5061036a610545366004613580565b61118e565b34801561055657600080fd5b5061036a6105653660046139e3565b6111ee565b34801561057657600080fd5b506104a1610585366004613580565b611346565b34801561059657600080fd5b506103816105a53660046137f2565b611376565b3480156105b657600080fd5b5061036a6105c5366004613580565b6113ac565b3480156105d657600080fd5b5061036a6105e5366004613580565b6113fa565b3480156105f657600080fd5b5061051d611446565b34801561060b57600080fd5b5061061f61061a36600461389d565b611455565b60405161038e9190613c2e565b34801561063857600080fd5b5061051d61148b565b34801561064d57600080fd5b5061038161065c3660046139e3565b61149f565b34801561066d57600080fd5b5061051d6116f6565b34801561068257600080fd5b506104a16106913660046137f2565b611705565b3480156106a257600080fd5b506104a16106b136600461386b565b61171b565b3480156106c257600080fd5b5061061f6106d13660046137f2565b6118c4565b3480156106e257600080fd5b5061051d6106f1366004613822565b6118d6565b34801561070257600080fd5b5061036a6107113660046138dc565b611922565b34801561072257600080fd5b5061051d6119c1565b34801561073757600080fd5b5061036a610746366004613580565b6119d0565b34801561075757600080fd5b5061036a610766366004613580565b611a22565b34801561077757600080fd5b5061047f6107863660046139e3565b611a6e565b34801561079757600080fd5b5061061f6107a63660046137f2565b611b4a565b3480156107b757600080fd5b5061036a6107c6366004613600565b611ba2565b3480156107d757600080fd5b5061051d6107e6366004613ad4565b611c72565b3480156107f757600080fd5b5061061f611ce3565b34801561080c57600080fd5b5061061f61081b3660046137f2565b611ce9565b34801561082c57600080fd5b5061036a61083b3660046137f2565b611cfb565b34801561084c57600080fd5b5061086061085b366004613600565b611db2565b60405161038e9190614151565b34801561087957600080fd5b5061036a61088836600461389d565b611e83565b34801561089957600080fd5b506103816108a83660046137f2565b611ebe565b3480156108b957600080fd5b5061036a6108c836600461359c565b611ef4565b3480156108d957600080fd5b5061061f6108e8366004613580565b612117565b3480156108f957600080fd5b50610902612132565b60405161038e91906141e3565b34801561091b57600080fd5b5061036a61092a366004613a90565b6121b8565b34801561093b57600080fd5b5061036a61094a3660046137f2565b612251565b61036a61095d36600461370c565b61232c565b34801561096e57600080fd5b5061036a61097d366004613580565b6126ae565b34801561098e57600080fd5b5061036a61099d366004613580565b6126f9565b61036a6109b036600461362b565b61277f565b3480156109c157600080fd5b506108606109d0366004613600565b612c3e565b6009805460ff19811660ff90911615179055565b60065460ff1681565b60026020526000908152604090205460ff1681565b60136000610a16888585611c72565b6001600160a01b0316815260208101919091526040016000205460ff16610a585760405162461bcd60e51b8152600401610a4f90614021565b60405180910390fd5b60065461010090046001600160a01b0316610a716132f2565b6000888152600d60209081526040918290208251815460026001821615610100026000190190911604601f81018490049093028101608090810190945260608101838152909391928492849190840182828015610b0f5780601f10610ae457610100808354040283529160200191610b0f565b820191906000526020600020905b815481529060010190602001808311610af257829003601f168201915b505050918352505060018201546020808301919091526002928301546001600160a01b031660409283015290519293509091610b4f918a918a9101613c75565b60408051601f1981840301815290829052610b6991613c37565b602060405180830381855afa158015610b86573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610ba9919061380a565b816020015114610bcb5760405162461bcd60e51b8152600401610a4f90614070565b60408082015190516323b872dd60e01b81526001600160a01b038416916323b872dd91610bff919089908d90600401613ce2565b600060405180830381600087803b158015610c1957600080fd5b505af1158015610c2d573d6000803e3d6000fd5b5050506000898152600d602052604081209150610c4a8282613312565b50600060018201819055600290910180546001600160a01b0319169055888152600e60209081526040808320600f8352818420548452909152812090610c908282613312565b5060006001828101829055600290920180546001600160a01b0319169055898152600f6020526040902054610cc491612cc9565b6000988952600f60209081526040808b20929092559489526014909452505050909320805460ff19166001179055505050565b6004546001600160a01b03163314610d215760405162461bcd60e51b8152600401610a4f90613ee8565b600654604051632fb102cf60e01b81526101009091046001600160a01b0316908190632fb102cf90610d61908a908a908a908a908a908a90600401613d1f565b600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b5050505050505050505050565b6004546000906001600160a01b03163314610dc95760405162461bcd60e51b8152600401610a4f90613ee8565b610dd4848484612d12565b949350505050565b6004546001600160a01b03163314610e065760405162461bcd60e51b8152600401610a4f90613ee8565b60015460405163f2fde38b60e01b81526001600160a01b0390911690819063f2fde38b90610e38908590600401613cb4565b600060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b505050505050565b60095460ff1681565b60136020526000908152604090205460ff1681565b610e946132f2565b6000828152600d60209081526040918290208251815460026001821615610100026000190190911604601f81018490049093028101608090810190945260608101838152909391928492849190840182828015610f325780601f10610f0757610100808354040283529160200191610f32565b820191906000526020600020905b815481529060010190602001808311610f1557829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b031660409091015290505b919050565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610fe75780601f10610fbc57610100808354040283529160200191610fe7565b820191906000526020600020905b815481529060010190602001808311610fca57829003601f168201915b505050505081565b6004546001600160a01b031633146110195760405162461bcd60e51b8152600401610a4f90613ee8565b600654604051630852cd8d60e31b81526101009091046001600160a01b03169081906342966c6890610e38908590600401613c2e565b6000806000806002866040516020016110689190613c37565b60408051601f198184030181529082905261108291613c37565b602060405180830381855afa15801561109f573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110c2919061380a565b96949550505083851492915050565b60008481526014602052604081205460ff16156110ed57600080fd5b60606111376110fb88612e50565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f2a92505050565b9050600061114d8261114889612e50565b612f2a565b60405160200161115d9190613c37565b60405160208183030381529060405280519060200120905060006111818286612f56565b9998505050505050505050565b6004546001600160a01b031633146111b85760405162461bcd60e51b8152600401610a4f90613ee8565b60065460405163f2fde38b60e01b81526101009091046001600160a01b031690819063f2fde38b90610e38908590600401613cb4565b6111f782612fd5565b156112145760405162461bcd60e51b8152600401610a4f90613e89565b6000828152600f602052604090205461122e9060016130af565b6000838152600f6020908152604080832093909355825160a081018452600760608201908152661c185e5b1bd85960ca1b608083015281528082018590523381850152858352600d82529290912082518051919261129192849290910190613359565b50602082810151600180840191909155604093840151600293840180546001600160a01b039092166001600160a01b03199092169190911790556000868152600d8352848120600e8452858220600f8552868320548352909352939093208154919390926113129284928692908216156101000260001901909116046133d7565b5060018281015490820155600291820154910180546001600160a01b0319166001600160a01b039092169190911790555050565b60606113708260405160200161135c9190613c11565b60405160208183030381529060405261171b565b92915050565b6004546000906001600160a01b031633146113a35760405162461bcd60e51b8152600401610a4f90613ee8565b611370826130d4565b6004546001600160a01b031633146113d65760405162461bcd60e51b8152600401610a4f90613ee8565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b6004546001600160a01b031633146114245760405162461bcd60e51b8152600401610a4f90613ee8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b600080838360405160200161146b929190613c75565b60408051808303601f190181529190528051602090910120949350505050565b60065461010090046001600160a01b031681565b60008281526002602052604081205460ff166114cd5760405162461bcd60e51b8152600401610a4f90613e5f565b6001546001600160a01b0316828163dd62ed3e6114e86130f3565b306040518363ffffffff1660e01b8152600401611506929190613cc8565b60206040518083038186803b15801561151e57600080fd5b505afa158015611532573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611556919061380a565b10156115745760405162461bcd60e51b8152600401610a4f90613fea565b806001600160a01b03166323b872dd61158b6130f3565b30866040518463ffffffff1660e01b81526004016115ab93929190613ce2565b602060405180830381600087803b1580156115c557600080fd5b505af11580156115d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fd91906137d2565b6116195760405162461bcd60e51b8152600401610a4f90614048565b600154604051630852cd8d60e31b81526001600160a01b03909116906342966c6890611649908690600401613c2e565b600060405180830381600087803b15801561166357600080fd5b505af1158015611677573d6000803e3d6000fd5b5050506000858152600360205260409020546116949150846130af565b600085815260036020526040902055826116ac6130f3565b6001600160a01b03167fed2432d91de9329ae454049df81fd5d6b856c4470096ca37a29c1fe111f57f0c866040516116e49190613c2e565b60405180910390a35060019392505050565b6001546001600160a01b031681565b60606113708260405160200161135c9190613c2e565b6060806040518060400160405280601081526020016f181899199a1a9b1b9c1cb0b131b232b360811b8152509050606083516002026002016001600160401b038111801561176857600080fd5b506040519080825280601f01601f191660200182016040528015611793576020820181803683370190505b509050600360fc1b816000815181106117a857fe5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117d157fe5b60200101906001600160f81b031916908160001a90535060005b84518110156118bc5782600486838151811061180357fe5b016020015182516001600160f81b031990911690911c60f81c90811061182557fe5b602001015160f81c60f81b82826002026002018151811061184257fe5b60200101906001600160f81b031916908160001a9053508285828151811061186657fe5b602091010151815160f89190911c600f1690811061188057fe5b602001015160f81c60f81b82826002026003018151811061189d57fe5b60200101906001600160f81b031916908160001a9053506001016117eb565b509392505050565b60036020526000908152604090205481565b6000806119198585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f5692505050565b95945050505050565b6004546001600160a01b0316331461194c5760405162461bcd60e51b8152600401610a4f90613ee8565b6006546040516302195d7960e61b81526101009091046001600160a01b03169081906386575e4090611988908890889088908890600401613e25565b600060405180830381600087803b1580156119a257600080fd5b505af11580156119b6573d6000803e3d6000fd5b505050505050505050565b6004546001600160a01b031690565b6004546001600160a01b031633146119fa5760405162461bcd60e51b8152600401610a4f90613ee8565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6004546001600160a01b03163314611a4c5760405162461bcd60e51b8152600401610a4f90613ee8565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611a766132f2565b6000838152600e602090815260408083208584528252918290208251815460026001821615610100026000190190911604601f81018490049093028101608090810190945260608101838152909391928492849190840182828015611b1c5780601f10611af157610100808354040283529160200191611b1c565b820191906000526020600020905b815481529060010190602001808311611aff57829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b03166040909101529392505050565b60008060005b6020811015611b9b5760ff6008820285901c1660308110801590611b75575060398111155b15611b8c5781600a0a603082030283019250611b92565b50611b9b565b50600101611b50565b5092915050565b6004546001600160a01b03163314611bcc5760405162461bcd60e51b8152600401610a4f90613ee8565b6001600160a01b0382166000908152600b60209081526040808320600c8352818420548452909152812090611c018282613312565b50600060019182018190556001600160a01b0384168152600c6020526040902054611c2b91612cc9565b6001600160a01b0383166000908152600c6020908152604080832093909355600a8152828220848352905290812090611c648282613312565b600182016000905550505050565b60008281526014602052604081205460ff1615611c8e57600080fd5b6000611ca5611c9c86612e50565b61114886612e50565b604051602001611cb59190613c37565b6040516020818303038152906040528051906020012090506000611cd98285612f56565b9695505050505050565b60085481565b6000908152600f602052604090205490565b6004546001600160a01b03163314611d255760405162461bcd60e51b8152600401610a4f90613ee8565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b158015611d6a57600080fd5b505afa158015611d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da29190613b9a565b60ff16600a0a9190910260085550565b611dba61344c565b6001600160a01b0383166000908152600b602090815260408083208584528252918290208251815460026001821615610100026000190190911604601f8101849004909302810160609081018552938101838152909391928492849190840182828015611e685780601f10611e3d57610100808354040283529160200191611e68565b820191906000526020600020905b815481529060010190602001808311611e4b57829003601f168201915b50505050508152602001600182015481525050905092915050565b6004546001600160a01b03163314611ead5760405162461bcd60e51b8152600401610a4f90613ee8565b611eb960058383613464565b505050565b6004546000906001600160a01b03163314611eeb5760405162461bcd60e51b8152600401610a4f90613ee8565b611370826130f7565b6004546001600160a01b03163314611f1e5760405162461bcd60e51b8152600401610a4f90613ee8565b600654604051634d6ca91960e11b81526101009091046001600160a01b031690639ad9523290611f52908590600401613c2e565b60006040518083038186803b158015611f6a57600080fd5b505afa925050508015611f9f57506040513d6000823e601f3d908101601f19168201604052611f9c9190810190613938565b60015b6120f857611fad8583613112565b15611fca5760405162461bcd60e51b8152600401610a4f906140e2565b6001600160a01b0385166000908152600c6020526040902054611fee9060016130af565b6001600160a01b0386166000908152600c6020908152604091829020929092558051601f860183900490920282016060908101825290820185815282918790879081908501838280828437600092018290525093855250505060209182018490526001600160a01b0388168152600a825260408082208683528352902082518051919261208092849290910190613359565b506020918201516001918201556001600160a01b0387166000818152600a845260408082208783528552808220928252600b8552808220600c865281832054835290945292909220825490916120e99183918591600291811615610100026000190116046133d7565b50600191820154910155612110565b60405162461bcd60e51b8152600401610a4f90613fb3565b5050505050565b6001600160a01b03166000908152600c602052604090205490565b6001546040805163313ce56760e01b815290516000926001600160a01b031691829163313ce56791600480820192602092909190829003018186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b29190613b9a565b91505090565b6004546001600160a01b031633146121e25760405162461bcd60e51b8152600401610a4f90613ee8565b6006546040516334c6bd2160e21b81526101009091046001600160a01b031690819063d31af4849061221a90869086906004016141ca565b600060405180830381600087803b15801561223457600080fd5b505af1158015612248573d6000803e3d6000fd5b50505050505050565b6000818152600d60205260409020600201546001600160a01b0316331461228a5760405162461bcd60e51b8152600401610a4f9061409d565b6000818152600e60209081526040808320600f83528184205484529091528120906122b58282613312565b5060006001828101829055600290920180546001600160a01b0319169055828152600f60205260409020546122e991612cc9565b6000828152600f6020908152604080832093909355600d9052908120906123108282613312565b506000600182015560020180546001600160a01b031916905550565b6001546006546009546001600160a01b03928316926101009092049091169060ff161561245b576008546040516323b872dd60e01b81526001600160a01b038416916323b872dd91612385913391309190600401613ce2565b602060405180830381600087803b15801561239f57600080fd5b505af11580156123b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d791906137d2565b6123f35760405162461bcd60e51b8152600401610a4f90614048565b600154600854604051630852cd8d60e31b81526001600160a01b03909216916342966c689161242491600401613c2e565b600060405180830381600087803b15801561243e57600080fd5b505af1158015612452573d6000803e3d6000fd5b50505050612500565b6007546008546040516323b872dd60e01b81526001600160a01b03858116936323b872dd9361249293339390921691600401613ce2565b602060405180830381600087803b1580156124ac57600080fd5b505af11580156124c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e491906137d2565b6125005760405162461bcd60e51b8152600401610a4f90614048565b600061254589878a8a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110d192505050565b6001600160a01b03811660009081526013602052604090205490915060ff166125805760405162461bcd60e51b8152600401610a4f90614021565b600086815260146020908152604091829020805460ff19166001908117909155600580548451601f6002600019958416156101000295909501909216939093049081018490048402830184019094528382526060936126389383018282801561262a5780601f106125ff5761010080835404028352916020019161262a565b820191906000526020600020905b81548152906001019060200180831161260d57829003601f168201915b50505050506111488c612e50565b604051632fb102cf60e01b81529091506001600160a01b03841690632fb102cf9061266f908e908e9086908f908f90600401613d5a565b600060405180830381600087803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b505050505050505050505050505050565b6004546001600160a01b031633146126d85760405162461bcd60e51b8152600401610a4f90613ee8565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6004546001600160a01b031633146127235760405162461bcd60e51b8152600401610a4f90613ee8565b6004546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001546006546001600160a01b0391821691610100909104166127a061344c565b336000908152600a602090815260408083208984528252918290208251815460026001821615610100026000190190911604601f81018490049093028101606090810185529381018381529093919284928491908401828280156128455780601f1061281a57610100808354040283529160200191612845565b820191906000526020600020905b81548152906001019060200180831161282857829003601f168201915b5050505050815260200160018201548152505090506002858560405160200161286f929190613c75565b60408051601f198184030181529082905261288991613c37565b602060405180830381855afa1580156128a6573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906128c9919061380a565b8160200151146128eb5760405162461bcd60e51b8152600401610a4f90613f83565b60095460ff16156129fe576008546040516323b872dd60e01b81526001600160a01b038516916323b872dd91612928913391309190600401613ce2565b602060405180830381600087803b15801561294257600080fd5b505af1158015612956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297a91906137d2565b6129965760405162461bcd60e51b8152600401610a4f90614048565b600154600854604051630852cd8d60e31b81526001600160a01b03909216916342966c68916129c791600401613c2e565b600060405180830381600087803b1580156129e157600080fd5b505af11580156129f5573d6000803e3d6000fd5b50505050612aa3565b6007546008546040516323b872dd60e01b81526001600160a01b03868116936323b872dd93612a3593339390921691600401613ce2565b602060405180830381600087803b158015612a4f57600080fd5b505af1158015612a63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8791906137d2565b612aa35760405162461bcd60e51b8152600401610a4f90614048565b6005805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152606093612b409391929091830182828015612b325780601f10612b0757610100808354040283529160200191612b32565b820191906000526020600020905b815481529060010190602001808311612b1557829003601f168201915b505050505061114889612e50565b8251604051632fb102cf60e01b81529192506001600160a01b03851691632fb102cf91612b76918c918c91879190600401613da0565b600060405180830381600087803b158015612b9057600080fd5b505af1158015612ba4573d6000803e3d6000fd5b5050336000908152600b60209081526040808320600c8352818420548452909152812092509050612bd58282613312565b506000600191909101819055338152600a602090815260408083208a8452909152812090612c038282613312565b5060006001918201819055338152600c6020526040902054612c2491612cc9565b336000908152600c60205260409020555050505050505050565b612c4661344c565b6001600160a01b0383166000908152600a602090815260408083208584528252918290208251815460026001821615610100026000190190911604601f8101849004909302810160609081018552938101838152909391928492849190840182828015611e685780601f10611e3d57610100808354040283529160200191611e68565b6000612d0b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131ff565b9392505050565b600082815260036020526040812054821115612d405760405162461bcd60e51b8152600401610a4f9061410d565b60008381526002602052604090205460ff16612d6e5760405162461bcd60e51b8152600401610a4f90613e5f565b6001546040516340c10f1960e01b81526001600160a01b039091169081906340c10f1990612da29088908790600401613d06565b600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b505050600085815260036020526040902054612ded915084612cc9565b60008581526003602052604090205582612e056130f3565b6001600160a01b03167fdfb36617677d4721feefea07d11b2d1aca3d4ea49facf2bae87fbc8db4ecc91386604051612e3d9190613c2e565b60405180910390a3506001949350505050565b60608180612e775750506040805180820190915260018152600360fc1b6020820152610f5c565b8060005b8115612e8f57600101600a82049150612e7b565b6060816001600160401b0381118015612ea757600080fd5b506040519080825280601f01601f191660200182016040528015612ed2576020820181803683370190505b50905060001982015b8415612f2057600a850660300160f81b82828060019003935081518110612efe57fe5b60200101906001600160f81b031916908160001a905350600a85049450612edb565b5095945050505050565b60608282604051602001612f3f929190613c85565b604051602081830303815290604052905092915050565b60008151604114612f795760405162461bcd60e51b8152600401610a4f90613eb8565b60208201516040830151606084015160001a601b811015612f9857601b015b8060ff16601b1480612fad57508060ff16601c145b612fc95760405162461bcd60e51b8152600401610a4f90613f4c565b611cd98682858561322b565b6000818152600d6020908152604080832080548251601f600260001961010060018616150201909316929092049182018590048502810185019093528083526060938301828280156130685780601f1061303d57610100808354040283529160200191613068565b820191906000526020600020905b81548152906001019060200180831161304b57829003601f168201915b50506040805160208082019092526000905284519401939093207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47014159695505050505050565b600082820183811015612d0b5760405162461bcd60e51b8152600401610a4f90613f15565b6000908152600260205260409020805460ff1916600190811790915590565b3390565b6000908152600260205260409020805460ff19169055600190565b6001600160a01b0382166000908152600a60209081526040808320848452825280832080548251601f600260001961010060018616150201909316929092049182018590048502810185019093528083526060938301828280156131b75780601f1061318c576101008083540402835291602001916131b7565b820191906000526020600020905b81548152906001019060200180831161319a57829003601f168201915b50506040805160208082019092526000905284519401939093207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701415979650505050505050565b600081848411156132235760405162461bcd60e51b8152600401610a4f9190613e4c565b505050900390565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818760405160200161327c929190613c53565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516132b99493929190613e07565b6020604051602081039080840390855afa1580156132db573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b604080516060808201835281526000602082018190529181019190915290565b50805460018160011615610100020316600290046000825580601f106133385750613356565b601f01602090049060005260206000209081019061335691906134d2565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061339a57805160ff19168380011785556133c7565b828001600101855582156133c7579182015b828111156133c75782518255916020019190600101906133ac565b506133d39291506134d2565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061341057805485556133c7565b828001600101855582156133c757600052602060002091601f016020900482015b828111156133c7578254825591600101919060010190613431565b60408051808201909152606081526000602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134a55782800160ff198235161785556133c7565b828001600101855582156133c7579182015b828111156133c75782358255916020019190600101906134b7565b5b808211156133d357600081556001016134d3565b60008083601f8401126134f8578182fd5b5081356001600160401b0381111561350e578182fd5b60208301915083602082850101111561352657600080fd5b9250929050565b600082601f83011261353d578081fd5b813561355061354b82614217565b6141f1565b915080825283602082850101111561356757600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215613591578081fd5b8135612d0b8161426a565b6000806000806000608086880312156135b3578081fd5b85356135be8161426a565b945060208601356001600160401b038111156135d8578182fd5b6135e4888289016134e7565b9699909850959660408101359660609091013595509350505050565b60008060408385031215613612578182fd5b823561361d8161426a565b946020939093013593505050565b60008060008060608587031215613640578384fd5b843561364b8161426a565b93506020850135925060408501356001600160401b0381111561366c578283fd5b613678878288016134e7565b95989497509550505050565b6000806000806000806080878903121561369c578081fd5b86356136a78161426a565b95506020870135945060408701356001600160401b03808211156136c9578283fd5b6136d58a838b016134e7565b909650945060608901359150808211156136ed578283fd5b506136fa89828a016134e7565b979a9699509497509295939492505050565b600080600080600080600060a0888a031215613726578081fd5b87356137318161426a565b96506020880135955060408801356001600160401b0380821115613753578283fd5b61375f8b838c016134e7565b909750955060608a0135945060808a013591508082111561377e578283fd5b5061378b8a828b016134e7565b989b979a50959850939692959293505050565b6000806000606084860312156137b2578283fd5b83356137bd8161426a565b95602085013595506040909401359392505050565b6000602082840312156137e3578081fd5b81518015158114612d0b578182fd5b600060208284031215613803578081fd5b5035919050565b60006020828403121561381b578081fd5b5051919050565b600080600060408486031215613836578081fd5b8335925060208401356001600160401b03811115613852578182fd5b61385e868287016134e7565b9497909650939450505050565b60006020828403121561387c578081fd5b81356001600160401b03811115613891578182fd5b610dd48482850161352d565b600080602083850312156138af578182fd5b82356001600160401b038111156138c4578283fd5b6138d0858286016134e7565b90969095509350505050565b600080600080604085870312156138f1578182fd5b84356001600160401b0380821115613907578384fd5b613913888389016134e7565b9096509450602087013591508082111561392b578384fd5b50613678878288016134e7565b600060208284031215613949578081fd5b81516001600160401b0381111561395e578182fd5b8201601f8101841361396e578182fd5b805161397c61354b82614217565b818152856020838501011115613990578384fd5b61191982602083016020860161423a565b600080604083850312156139b3578182fd5b82356001600160401b038111156139c8578283fd5b6139d48582860161352d565b95602094909401359450505050565b600080604083850312156139f5578182fd5b50508035926020909101359150565b60008060008060008060a08789031215613a1c578384fd5b8635955060208701356001600160401b0380821115613a39578586fd5b613a458a838b016134e7565b909750955060408901359150613a5a8261426a565b9093506060880135925060808801359080821115613a76578283fd5b50613a8389828a0161352d565b9150509295509295509295565b60008060408385031215613aa2578182fd5b8235915060208301356001600160401b03811115613abe578182fd5b613aca8582860161352d565b9150509250929050565b600080600060608486031215613ae8578081fd5b833592506020840135915060408401356001600160401b03811115613b0b578182fd5b613b178682870161352d565b9150509250925092565b600080600080600060808688031215613b38578283fd5b853594506020860135935060408601356001600160401b0380821115613b5c578485fd5b613b6889838a016134e7565b90955093506060880135915080821115613b80578283fd5b50613b8d8882890161352d565b9150509295509295909350565b600060208284031215613bab578081fd5b815160ff81168114612d0b578182fd5b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452613bfd81602086016020860161423a565b601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b60008251613c4981846020870161423a565b9190910192915050565b60008351613c6581846020880161423a565b9190910191825250602001919050565b6000828483379101908152919050565b60008351613c9781846020880161423a565b835190830190613cab81836020880161423a565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038816825286602083015260806040830152613d47608083018688613bbb565b8281036060840152611181818587613bbb565b600060018060a01b038716825285602083015260806040830152613d816080830186613be5565b8281036060840152613d94818587613bbb565b98975050505050505050565b600060018060a01b038616825284602083015260806040830152613dc76080830185613be5565b8281036060840152613dd98185613be5565b979650505050505050565b901515815260200190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b600060408252613e39604083018688613bbb565b8281036020840152613dd9818587613bbb565b600060208252612d0b6020830184613be5565b60208082526010908201526f125b9d985b1a590810da185a5b88125160821b604082015260600190565b602080825260159082015274223ab83634b1b0ba3290283932aa3930b739b332b960591b604082015260600190565b6020808252601690820152750a4cae2ead2e4ca40c6dee4e4cac6e840d8cadccee8d60531b604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601b908201527f5369676e61747572652076657273696f6e206e6f74206d617463680000000000604082015260600190565b6020808252601690820152750a0c2f2d8dec2c840c8decae640dcdee840dac2e8c6d60531b604082015260600190565b60208082526017908201527f4e46542045786973747320776974682074686973204944000000000000000000604082015260600190565b60208082526018908201527f48616e646c657220756e61626c6520746f207370656e64200000000000000000604082015260600190565b6020808252600d908201526c139bdd0815da5d1b995cdcd959609a1b604082015260600190565b6020808252600e908201526d2a3930b739b332b91022a92927a960911b604082015260600190565b602080825260139082015272086dec8ca40c8decae640dcdee840dac2e8c6d606b1b604082015260600190565b60208082526025908201527f5072655472616e7366657220646f6573206e6f742062656c6f6e6720746f207360408201526432b73232b960d91b606082015260800190565b602080825260119082015270111d5c1b1a58d85d1948141c99535a5b9d607a1b604082015260600190565b60208082526024908201527f43616e206e6f74207472616e73666572206d6f7265207468616e206465706f736040820152631a5d195960e21b606082015260800190565b60006020825282516040602084015261416d6060840182613be5565b9050602084015160408401528091505092915050565b60006020825282516060602084015261419f6080840182613be5565b6020850151604085810191909152909401516001600160a01b03166060909301929092525090919050565b600083825260406020830152610dd46040830184613be5565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561420f57600080fd5b604052919050565b60006001600160401b0382111561422c578081fd5b50601f01601f191660200190565b60005b8381101561425557818101518382015260200161423d565b83811115614264576000848401525b50505050565b6001600160a01b038116811461335657600080fdfea2646970667358221220df0a71af19a3779eec6b00292761fb6798319030f62f7b2b752b25bb20df44ac64736f6c634300060c0033

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

00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a31901000000000000000000000000000000000000000000000000000000000000012c

-----Decoded View---------------
Arg [0] : _nftAddress (address): 0x82C7a8f707110f5FBb16184A5933E9F78a34c6ab
Arg [1] : _paymentAddress (address): 0x3D658390460295FB963f54dC0899cfb1c30776Df
Arg [2] : _recipientAddress (address): 0x2272ECf43A7481088FA2d4Ba9109804ED5A31901
Arg [3] : _price (uint256): 300

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab
Arg [1] : 0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df
Arg [2] : 0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a31901
Arg [3] : 000000000000000000000000000000000000000000000000000000000000012c


Deployed Bytecode Sourcemap

13879:18394:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21209:78;;;;;;;;;;;;;:::i;:::-;;14080:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11616:37;;;;;;;;;;-1:-1:-1;11616:37:0;;;;;:::i;:::-;;:::i;22794:773::-;;;;;;:::i;:::-;;:::i;25876:223::-;;;;;;;;;;-1:-1:-1;25876:223:0;;;;;:::i;:::-;;:::i;27741:166::-;;;;;;;;;;-1:-1:-1;27741:166:0;;;;;:::i;:::-;;:::i;25498:185::-;;;;;;;;;;-1:-1:-1;25498:185:0;;;;;:::i;:::-;;:::i;14374:30::-;;;;;;;;;;;;;:::i;15250:41::-;;;;;;;;;;-1:-1:-1;15250:41:0;;;;;:::i;:::-;;:::i;24612:131::-;;;;;;;;;;-1:-1:-1;24612:131:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14044:29::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17118:131::-;;;;;;;;;;-1:-1:-1;17118:131:0;;;;;:::i;:::-;;:::i;24755:288::-;;;;;;;;;;-1:-1:-1;24755:288:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;21928:453::-;;;;;;;;;;-1:-1:-1;21928:453:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25695:169::-;;;;;;;;;;-1:-1:-1;25695:169:0;;;;;:::i;:::-;;:::i;23579:401::-;;;;;;;;;;-1:-1:-1;23579:401:0;;;;;:::i;:::-;;:::i;31386:131::-;;;;;;;;;;-1:-1:-1;31386:131:0;;;;;:::i;:::-;;:::i;27487:112::-;;;;;;;;;;-1:-1:-1;27487:112:0;;;;;:::i;:::-;;:::i;21329:98::-;;;;;;;;;;-1:-1:-1;21329:98:0;;;;;:::i;:::-;;:::i;26671:97::-;;;;;;;;;;-1:-1:-1;26671:97:0;;;;;:::i;:::-;;:::i;14142:31::-;;;;;;;;;;;;;:::i;22616:166::-;;;;;;;;;;-1:-1:-1;22616:166:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14110:25::-;;;;;;;;;;;;;:::i;12244:628::-;;;;;;;;;;-1:-1:-1;12244:628:0;;;;;:::i;:::-;;:::i;11574:29::-;;;;;;;;;;;;;:::i;31529:127::-;;;;;;;;;;-1:-1:-1;31529:127:0;;;;;:::i;:::-;;:::i;31807:463::-;;;;;;;;;;-1:-1:-1;31807:463:0;;;;;:::i;:::-;;:::i;11660:45::-;;;;;;;;;;-1:-1:-1;11660:45:0;;;;;:::i;:::-;;:::i;22393:211::-;;;;;;;;;;-1:-1:-1;22393:211:0;;;;;:::i;:::-;;:::i;26111:184::-;;;;;;;;;;-1:-1:-1;26111:184:0;;;;;:::i;:::-;;:::i;16380:83::-;;;;;;;;;;;;;:::i;27012:86::-;;;;;;;;;;-1:-1:-1;27012:86:0;;;;;:::i;:::-;;:::i;26893:107::-;;;;;;;;;;-1:-1:-1;26893:107:0;;;;;:::i;:::-;;:::i;25201:164::-;;;;;;;;;;-1:-1:-1;25201:164:0;;;;;:::i;:::-;;:::i;31035:345::-;;;;;;;;;;-1:-1:-1;31035:345:0;;;;;:::i;:::-;;:::i;20225:239::-;;;;;;;;;;-1:-1:-1;20225:239:0;;;;;:::i;:::-;;:::i;21549:367::-;;;;;;;;;;-1:-1:-1;21549:367:0;;;;;:::i;:::-;;:::i;14218:20::-;;;;;;;;;;;;;:::i;25055:134::-;;;;;;;;;;-1:-1:-1;25055:134:0;;;;;:::i;:::-;;:::i;27110:166::-;;;;;;;;;;-1:-1:-1;27110:166:0;;;;;:::i;:::-;;:::i;21053:144::-;;;;;;;;;;-1:-1:-1;21053:144:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25377:109::-;;;;;;;;;;-1:-1:-1;25377:109:0;;;;;:::i;:::-;;:::i;27611:118::-;;;;;;;;;;-1:-1:-1;27611:118:0;;;;;:::i;:::-;;:::i;19373:574::-;;;;;;;;;;-1:-1:-1;19373:574:0;;;;;:::i;:::-;;:::i;20923:118::-;;;;;;;;;;-1:-1:-1;20923:118:0;;;;;:::i;:::-;;:::i;26504:155::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26307:185::-;;;;;;;;;;-1:-1:-1;26307:185:0;;;;;:::i;:::-;;:::i;24246:354::-;;;;;;;;;;-1:-1:-1;24246:354:0;;;;;:::i;:::-;;:::i;18389:966::-;;;;;;:::i;:::-;;:::i;21435:102::-;;;;;;;;;;-1:-1:-1;21435:102:0;;;;;:::i;:::-;;:::i;16138:144::-;;;;;;;;;;-1:-1:-1;16138:144:0;;;;;:::i;:::-;;:::i;17261:1116::-;;;;;;:::i;:::-;;:::i;20476:139::-;;;;;;;;;;-1:-1:-1;20476:139:0;;;;;:::i;:::-;;:::i;21209:78::-;21269:10;;;-1:-1:-1;;21255:24:0;;21269:10;;;;21268:11;21255:24;;;21209:78::o;14080:23::-;;;;;;:::o;11616:37::-;;;;;;;;;;;;;;;:::o;22794:773::-;22948:9;:63;22958:52;22982:8;22992:6;23000:9;22958:23;:52::i;:::-;-1:-1:-1;;;;;22948:63:0;;;;;;;;;;;;-1:-1:-1;22948:63:0;;;;22940:89;;;;-1:-1:-1;;;22940:89:0;;;;;;;:::i;:::-;;;;;;;;;23067:10;;;;;-1:-1:-1;;;;;23067:10:0;23089:30;;:::i;:::-;23122:22;;;;:12;:22;;;;;;;;;23089:55;;;;;;;;;;;-1:-1:-1;;23089:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23122:22;;23089:55;;23122:22;;23089:55;;;23122:22;23089:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23089:55:0;;;-1:-1:-1;;23089:55:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23089:55:0;;;;;;23194:22;;23089:55;;-1:-1:-1;23089:55:0;;23194:22;;23211:4;;;;23194:22;;:::i;:::-;;;;-1:-1:-1;;23194:22:0;;;;;;;;;;23187:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23163:11;:20;;;:54;23155:86;;;;-1:-1:-1;;;23155:86:0;;;;;;;:::i;:::-;23298:17;;;;;23276:56;;-1:-1:-1;;;23276:56:0;;-1:-1:-1;;;;;23276:21:0;;;;;:56;;23298:17;23317:3;;23323:8;;23276:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23350:22:0;;;;:12;:22;;;;;;-1:-1:-1;23343:29:0;23350:22;;23343:29;:::i;:::-;-1:-1:-1;23343:29:0;;;;;;;;;;;;;-1:-1:-1;;;;;;23343:29:0;;;23390;;;:19;:29;;;;;;;;23420:17;:27;;;;;;23390:58;;;;;;;;23383:65;23390:58;23343:29;23383:65;:::i;:::-;-1:-1:-1;23383:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;23383:65:0;;;23489:27;;;:17;:27;;;;;;:34;;:31;:34::i;:::-;23459:27;;;;:17;:27;;;;;;;;:64;;;;23534:18;;;:10;:18;;;-1:-1:-1;;;23534:18:0;;;:25;;-1:-1:-1;;23534:25:0;23555:4;23534:25;;;-1:-1:-1;;;22794:773:0:o;25876:223::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;26025:10:::1;::::0;26047:44:::1;::::0;-1:-1:-1;;;26047:44:0;;26025:10:::1;::::0;;::::1;-1:-1:-1::0;;;;;26025:10:0::1;::::0;;;26047:13:::1;::::0;:44:::1;::::0;26061:3;;26066:8;;26076:4;;;;26082:8;;;;26047:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16028:1;25876:223:::0;;;;;;:::o;27741:166::-;15988:5;;27835:4;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;27859:40:::1;27878:3;27883:7;27892:6;27859:18;:40::i;:::-;27852:47:::0;27741:166;-1:-1:-1;;;;27741:166:0:o;25498:185::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;25609:14:::1;::::0;25635:40:::1;::::0;-1:-1:-1;;;25635:40:0;;-1:-1:-1;;;;;25609:14:0;;::::1;::::0;;;25635:30:::1;::::0;:40:::1;::::0;25666:8;;25635:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16028:1;25498:185:::0;:::o;14374:30::-;;;;;;:::o;15250:41::-;;;;;;;;;;;;;;;:::o;24612:131::-;24675:18;;:::i;:::-;24713:22;;;;:12;:22;;;;;;;;;24706:29;;;;;;;;;;;-1:-1:-1;;24706:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24713:22;;24706:29;;24713:22;;24706:29;;;24713:22;24706:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24706:29:0;;;-1:-1:-1;;24706:29:0;;;;;;;;;;;;;-1:-1:-1;;;;;24706:29:0;;;;;;;-1:-1:-1;24612:131:0;;;;:::o;14044:29::-;;;;;;;;;;;;;;;-1:-1:-1;;14044:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17118:131::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;17200:10:::1;::::0;17222:19:::1;::::0;-1:-1:-1;;;17222:19:0;;17200:10:::1;::::0;;::::1;-1:-1:-1::0;;;;;17200:10:0::1;::::0;;;17222::::1;::::0;:19:::1;::::0;17233:7;;17222:19:::1;;;:::i;24755:288::-:0;24846:7;24855;24864:4;24881:18;24902:31;24926:5;24909:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24909:23:0;;;;;;;;;;24902:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24881:52;24963:8;;-1:-1:-1;;;25012:22:0;;;;24755:288;-1:-1:-1;;24755:288:0:o;21928:453::-;22065:7;22094:18;;;:10;:18;;;;;;;;22093:19;22085:28;;;;;;22124:22;22149:36;22156:19;22166:8;22156:9;:19::i;:::-;22177:7;;22149:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22149:6:0;;-1:-1:-1;;;22149:36:0:i;:::-;22124:61;;22196:12;22238:35;22245:8;22255:17;22265:6;22255:9;:17::i;:::-;22238:6;:35::i;:::-;22221:53;;;;;;;;:::i;:::-;;;;;;;;;;;;;22211:64;;;;;;22196:79;;22286:22;22311:30;22325:4;22331:9;22311:13;:30::i;:::-;22286:55;21928:453;-1:-1:-1;;;;;;;;;21928:453:0:o;25695:169::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;25798:10:::1;::::0;25820:36:::1;::::0;-1:-1:-1;;;25820:36:0;;25798:10:::1;::::0;;::::1;-1:-1:-1::0;;;;;25798:10:0::1;::::0;;;25820:26:::1;::::0;:36:::1;::::0;25847:8;;25820:36:::1;;;:::i;23579:401::-:0;23666:31;23688:8;23666:21;:31::i;:::-;23665:32;23657:66;;;;-1:-1:-1;;;23657:66:0;;;;;;;:::i;:::-;23764:27;;;;:17;:27;;;;;;:34;;23796:1;23764:31;:34::i;:::-;23734:27;;;;:17;:27;;;;;;;;:64;;;;23834:44;;;;;;;;;;;;;;-1:-1:-1;;;23834:44:0;;;;;;;;;;;;23867:10;23834:44;;;;23809:22;;;:12;:22;;;;;;:69;;;;:22;;:69;;:22;;:69;;;;;:::i;:::-;-1:-1:-1;23809:69:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23809:69:0;;;-1:-1:-1;;;;;;23809:69:0;;;;;;;;;;23950:22;;;:12;:22;;;;;23889:19;:29;;;;;23919:17;:27;;;;;;23889:58;;;;;;;;;:83;;23950:22;;23889:58;;:83;;:58;;23950:22;;23889:83;;;;23809:69;23889:83;-1:-1:-1;;23889:83:0;;;;;;:::i;:::-;-1:-1:-1;23889:83:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23889:83:0;-1:-1:-1;;;;;23889:83:0;;;;;;;;;-1:-1:-1;;23579:401:0:o;31386:131::-;31441:13;31474:35;31500:7;31483:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;31474:8;:35::i;:::-;31467:42;31386:131;-1:-1:-1;;31386:131:0:o;27487:112::-;15988:5;;27545:4;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;27570:20:::1;27582:7;27570:11;:20::i;21329:98::-:0;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21393:19:0::1;;::::0;;;:9:::1;:19;::::0;;;;:26;;-1:-1:-1;;21393:26:0::1;21415:4;21393:26;::::0;;21329:98::o;26671:97::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;26736:14:::1;:24:::0;;-1:-1:-1;;;;;;26736:24:0::1;-1:-1:-1::0;;;;;26736:24:0;;;::::1;::::0;;;::::1;::::0;;26671:97::o;14142:31::-;;;-1:-1:-1;;;;;14142:31:0;;:::o;22616:166::-;22680:7;22700:12;22742:8;;22725:26;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;22725:26:0;;;;;;22715:37;;22725:26;22715:37;;;;;22616:166;-1:-1:-1;;;;22616:166:0:o;14110:25::-;;;;;;-1:-1:-1;;;;;14110:25:0;;:::o;12244:628::-;12315:4;12340:17;;;:8;:17;;;;;;;;12332:46;;;;-1:-1:-1;;;12332:46:0;;;;;;;:::i;:::-;12428:14;;-1:-1:-1;;;;;12428:14:0;12517:6;12428:14;12462:22;12485:12;:10;:12::i;:::-;12507:4;12462:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;12454:98;;;;-1:-1:-1;;;12454:98:0;;;;;;;:::i;:::-;12571:12;-1:-1:-1;;;;;12571:25:0;;12597:12;:10;:12::i;:::-;12619:4;12626:6;12571:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12563:89;;;;-1:-1:-1;;;12563:89:0;;;;;;;:::i;:::-;12674:14;;12663:39;;-1:-1:-1;;;12663:39:0;;-1:-1:-1;;;;;12674:14:0;;;;12663:31;;:39;;12695:6;;12663:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12738:22:0;;;;:13;:22;;;;;;:34;;-1:-1:-1;12765:6:0;12738:26;:34::i;:::-;12713:22;;;;:13;:22;;;;;:59;12816:6;12802:12;:10;:12::i;:::-;-1:-1:-1;;;;;12788:44:0;;12824:7;12788:44;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;12860:4:0;;12244:628;-1:-1:-1;;;12244:628:0:o;11574:29::-;;;-1:-1:-1;;;;;11574:29:0;;:::o;31529:127::-;31582:13;31615:33;31641:5;31624:23;;;;;;;;:::i;31807:463::-;31864:13;31890:21;:42;;;;;;;;;;;;;-1:-1:-1;;;31890:42:0;;;;;31949:16;31982:4;:11;31996:1;31982:15;31978:1;:19;-1:-1:-1;;;;;31968:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31968:30:0;;31949:49;;-1:-1:-1;;;32009:3:0;32013:1;32009:6;;;;;;;;;;;:12;-1:-1:-1;;;;;32009:12:0;;;;;;;;;-1:-1:-1;;;32032:3:0;32036:1;32032:6;;;;;;;;;;;:12;-1:-1:-1;;;;;32032:12:0;;;;;;;;;32060:6;32055:179;32076:4;:11;32072:1;:15;32055:179;;;32122:8;32153:1;32142:4;32147:1;32142:7;;;;;;;;;;;;32122:35;;-1:-1:-1;;;;;;32142:7:0;;;:12;;;:7;32136:19;;32122:35;;;;;;;;;;;;;;32109:3;32115:1;32117;32115:3;32113:1;:5;32109:10;;;;;;;;;;;:48;-1:-1:-1;;;;;32109:48:0;;;;;;;;;32185:8;32205:4;32210:1;32205:7;;;;;;;;;;;;;32185:37;;32205:7;;;;;32215:4;32199:21;;32185:37;;;;;;;;;;;;;;32172:3;32178:1;32180;32178:3;32176:1;:5;32172:10;;;;;;;;;;;:50;-1:-1:-1;;;;;32172:50:0;;;;;;;;-1:-1:-1;32089:3:0;;32055:179;;;-1:-1:-1;32258:3:0;31807:463;-1:-1:-1;;;31807:463:0:o;11660:45::-;;;;;;;;;;;;;:::o;22393:211::-;22488:7;22508:22;22533:31;22547:5;22554:9;;22533:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22533:13:0;;-1:-1:-1;;;22533:31:0:i;:::-;22508:56;22393:211;-1:-1:-1;;;;;22393:211:0:o;26111:184::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;26232:10:::1;::::0;26254:33:::1;::::0;-1:-1:-1;;;26254:33:0;;26232:10:::1;::::0;;::::1;-1:-1:-1::0;;;;;26232:10:0::1;::::0;;;26254:19:::1;::::0;:33:::1;::::0;26274:4;;;;26280:6;;;;26254:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16028:1;26111:184:::0;;;;:::o;16380:83::-;16450:5;;-1:-1:-1;;;;;16450:5:0;16380:83;:::o;27012:86::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;27072:10:::1;:18:::0;;-1:-1:-1;;;;;27072:18:0;;::::1;;;-1:-1:-1::0;;;;;;27072:18:0;;::::1;::::0;;;::::1;::::0;;27012:86::o;26893:107::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;26963:16:::1;:29:::0;;-1:-1:-1;;;;;;26963:29:0::1;-1:-1:-1::0;;;;;26963:29:0;;;::::1;::::0;;;::::1;::::0;;26893:107::o;25201:164::-;25283:18;;:::i;:::-;25321:29;;;;:19;:29;;;;;;;;:36;;;;;;;;;25314:43;;;;;;;;;;;-1:-1:-1;;25314:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25321:36;;25314:43;;25321:36;;25314:43;;;25321:36;25314:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25314:43:0;;;-1:-1:-1;;25314:43:0;;;;;;;;;;;;;-1:-1:-1;;;;;25314:43:0;;;;;;;25201:164;-1:-1:-1;;;25201:164:0:o;31035:345::-;31091:7;31111:9;31136;31131:223;31155:2;31151:1;:6;31131:223;;;31217:4;31211:1;31207:5;;31192:21;;;31191:30;31240:2;:7;-1:-1:-1;31240:7:0;;;:18;;;31256:2;31251:1;:7;;31240:18;31236:106;;;31299:1;31293:2;:7;31287:2;31283:1;:6;31282:18;31277:23;;;;31236:106;;;31337:5;;;31236:106;-1:-1:-1;31159:3:0;;31131:223;;;-1:-1:-1;31371:1:0;31035:345;-1:-1:-1;;31035:345:0:o;20225:239::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20313:21:0;::::1;;::::0;;;:15:::1;:21;::::0;;;;;;;20335:13:::1;:19:::0;;;;;;20313:42;;;;;;;;20306:49:::1;20313:42:::0;:21;20306:49:::1;:::i;:::-;-1:-1:-1::0;20306:49:0::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;20388:19:0;::::1;::::0;;:13:::1;:19;::::0;;;;;:26:::1;::::0;:23:::1;:26::i;:::-;-1:-1:-1::0;;;;;20366:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;;;:48;;;;20432:8:::1;:14:::0;;;;;:24;;;;;;;;;20425:31:::1;20432:24:::0;20366:19;20425:31:::1;:::i;:::-;;;;;;;;;20225:239:::0;;:::o;21549:367::-;21661:7;21690:18;;;:10;:18;;;;;;;;21689:19;21681:28;;;;;;21720:12;21762:46;21769:19;21779:8;21769:9;:19::i;:::-;21790:17;21800:6;21790:9;:17::i;21762:46::-;21745:64;;;;;;;;:::i;:::-;;;;;;;;;;;;;21735:75;;;;;;21720:90;;21821:22;21846:30;21860:4;21866:9;21846:13;:30::i;:::-;21821:55;21549:367;-1:-1:-1;;;;;;21549:367:0:o;14218:20::-;;;;:::o;25055:134::-;25123:11;25154:27;;;:17;:27;;;;;;;25055:134::o;27110:166::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;27200:14:::1;::::0;27189:37:::1;::::0;;-1:-1:-1;;;27189:37:0;;;;27173:13:::1;::::0;-1:-1:-1;;;;;27200:14:0::1;::::0;27189:35:::1;::::0;:37:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;27200:14;27189:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27173:53;;27254:2;:14;27245:23:::0;;;::::1;27237:5;:31:::0;-1:-1:-1;27110:166:0:o;21053:144::-;21127:14;;:::i;:::-;-1:-1:-1;;;;;21161:21:0;;;;;;:15;:21;;;;;;;;:28;;;;;;;;;21154:35;;;;;;;;;;;-1:-1:-1;;21154:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21161:28;;21154:35;;21161:28;;21154:35;;;21161:28;21154:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21053:144;;;;:::o;25377:109::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;25456:22:::1;:15;25474:4:::0;;25456:22:::1;:::i;:::-;;25377:109:::0;;:::o;27611:118::-;15988:5;;27672:4;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;27697:23:::1;27712:7;27697:14;:23::i;19373:574::-:0;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;19507:10:::1;::::0;19499:42:::1;::::0;-1:-1:-1;;;19499:42:0;;19507:10:::1;::::0;;::::1;-1:-1:-1::0;;;;;19507:10:0::1;::::0;19499:32:::1;::::0;:42:::1;::::0;19532:8;;19499:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;19499:42:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;;19495:445;;19657:33;19675:4;19681:8;19657:17;:33::i;:::-;19656:34;19648:64;;;;-1:-1:-1::0;;;19648:64:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19749:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;:26:::1;::::0;19773:1:::1;19749:23;:26::i;:::-;-1:-1:-1::0;;;;;19727:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;;;;:48;;;;19817:27;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;;;;19825:8;;19817:27;;;;;;19825:8;19817:27;;19825:8;19817:27;::::1;;::::0;::::1;::::0;;;-1:-1:-1;19817:27:0;;;-1:-1:-1;;;19817:27:0::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;19790:14:0;::::1;::::0;;:8:::1;:14:::0;;;;;;:24;;;;;;;:54;;;;:24;;:54:::1;::::0;:24;;:54;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;19790:54:0::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;19904:14:0;::::1;;::::0;;;:8:::1;:14:::0;;;;;;:24;;;;;;;;19859:21;;;:15:::1;:21:::0;;;;;19881:13:::1;:19:::0;;;;;;19859:42;;;;;;;;;:69;;:42;;:69:::1;::::0;:42;;19904:24;;19859:69:::1;::::0;;::::1;;;;-1:-1:-1::0;;19859:69:0;::::1;;;:::i;:::-;-1:-1:-1::0;19859:69:0::1;::::0;;::::1;::::0;;::::1;::::0;19495:445:::1;;;19581:33;;-1:-1:-1::0;;;19581:33:0::1;;;;;;;:::i;19495:445::-;19373:574:::0;;;;;:::o;20923:118::-;-1:-1:-1;;;;;21014:19:0;20983:11;21014:19;;;:13;:19;;;;;;;20923:118::o;26504:155::-;26602:14;;26635:16;;;-1:-1:-1;;;26635:16:0;;;;26555:5;;-1:-1:-1;;;;;26602:14:0;;;;26635;;:16;;;;;;;;;;;;;;;26602:14;26635:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26628:23;;;26504:155;:::o;26307:185::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;26423:10:::1;::::0;26445:39:::1;::::0;-1:-1:-1;;;26445:39:0;;26423:10:::1;::::0;;::::1;-1:-1:-1::0;;;;;26423:10:0::1;::::0;;;26445:23:::1;::::0;:39:::1;::::0;26469:8;;26479:4;;26445:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16028:1;26307:185:::0;;:::o;24246:354::-;24317:22;;;;:12;:22;;;;;:28;;;-1:-1:-1;;;;;24317:28:0;24349:10;24317:42;24309:92;;;;-1:-1:-1;;;24309:92:0;;;;;;;:::i;:::-;24419:29;;;;:19;:29;;;;;;;;24449:17;:27;;;;;;24419:58;;;;;;;;24412:65;24419:58;:29;24412:65;:::i;:::-;-1:-1:-1;24412:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;24412:65:0;;;24518:27;;;:17;:27;;;;;;:34;;:31;:34::i;:::-;24488:27;;;;:17;:27;;;;;;;;:64;;;;24570:12;:22;;;;;;24563:29;24570:22;24488:27;24563:29;:::i;:::-;-1:-1:-1;24563:29:0;;;;;;;;;-1:-1:-1;;;;;;24563:29:0;;;-1:-1:-1;24246:354:0:o;18389:966::-;18580:14;;18633:10;;18659;;-1:-1:-1;;;;;18580:14:0;;;;;18633:10;;;;;;;18659;;18655:371;;;18747:5;;18694:59;;-1:-1:-1;;;18694:59:0;;-1:-1:-1;;;;;18694:25:0;;;;;:59;;18720:10;;18740:4;;18747:5;18694:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18686:86;;;;-1:-1:-1;;;18686:86:0;;;;;;;:::i;:::-;18827:14;;18848:5;;18816:38;;-1:-1:-1;;;18816:38:0;;-1:-1:-1;;;;;18827:14:0;;;;18816:31;;:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18655:371;;;18941:16;;18960:5;;18895:71;;-1:-1:-1;;;18895:71:0;;-1:-1:-1;;;;;18895:25:0;;;;;;:71;;18921:10;;18941:16;;;;18895:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18887:98;;;;-1:-1:-1;;;18887:98:0;;;;;;;:::i;:::-;19046:14;19063:63;19087:8;19097:6;19105:8;;19115:10;;19063:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19063:23:0;;-1:-1:-1;;;19063:63:0:i;:::-;-1:-1:-1;;;;;19145:17:0;;;;;;:9;:17;;;;;;19046:80;;-1:-1:-1;19145:17:0;;19137:43;;;;-1:-1:-1;;;19137:43:0;;;;;;;:::i;:::-;19191:18;;;;:10;:18;;;;;;;;;:25;;-1:-1:-1;;19191:25:0;19212:4;19191:25;;;;;;19255:15;19248:44;;;;;;-1:-1:-1;;19248:44:0;;;;19191:25;19248:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19227:18;;19248:44;;;;19255:15;19248:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19272:19;19282:8;19272:9;:19::i;19248:44::-;19303;;-1:-1:-1;;;19303:44:0;;19227:65;;-1:-1:-1;;;;;;19303:13:0;;;;;:44;;19317:3;;19322:8;;19227:65;;19338:8;;;;19303:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18389:966;;;;;;;;;;;:::o;21435:102::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21502:19:0::1;21524:5;21502:19:::0;;;:9:::1;:19;::::0;;;;:27;;-1:-1:-1;;21502:27:0::1;::::0;;21435:102::o;16138:144::-;15988:5;;-1:-1:-1;;;;;15988:5:0;15974:10;:19;15966:51;;;;-1:-1:-1;;;15966:51:0;;;;;;;:::i;:::-;16231:5:::1;::::0;16222:25:::1;::::0;-1:-1:-1;;;;;16222:25:0;;::::1;::::0;16231:5:::1;::::0;16222:25:::1;::::0;16231:5:::1;::::0;16222:25:::1;16258:5;:16:::0;;-1:-1:-1;;;;;;16258:16:0::1;-1:-1:-1::0;;;;;16258:16:0;;;::::1;::::0;;;::::1;::::0;;16138:144::o;17261:1116::-;17408:14;;17461:10;;-1:-1:-1;;;;;17408:14:0;;;;;17461:10;;;;17483:22;;:::i;:::-;17517:10;17508:20;;;;:8;:20;;;;;;;;:30;;;;;;;;;17483:55;;;;;;;;;;;-1:-1:-1;;17483:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17508:30;;17483:55;;17508:30;;17483:55;;;17508:30;17483:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17577:31;17601:5;;17584:23;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;17584:23:0;;;;;;;;;;17577:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17557:7;:16;;;:51;17549:86;;;;-1:-1:-1;;;17549:86:0;;;;;;;:::i;:::-;17674:10;;;;17670:371;;;17762:5;;17709:59;;-1:-1:-1;;;17709:59:0;;-1:-1:-1;;;;;17709:25:0;;;;;:59;;17735:10;;17755:4;;17762:5;17709:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17701:86;;;;-1:-1:-1;;;17701:86:0;;;;;;;:::i;:::-;17842:14;;17863:5;;17831:38;;-1:-1:-1;;;17831:38:0;;-1:-1:-1;;;;;17842:14:0;;;;17831:31;;:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17670:371;;;17956:16;;17975:5;;17910:71;;-1:-1:-1;;;17910:71:0;;-1:-1:-1;;;;;17910:25:0;;;;;;:71;;17936:10;;17956:16;;;;17910:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17902:98;;;;-1:-1:-1;;;17902:98:0;;;;;;;:::i;:::-;18079:15;18072:44;;;;;;;;;;;;;-1:-1:-1;;18072:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;18051:18;;18072:44;;;;18079:15;;18072:44;;18079:15;18072:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18096:19;18106:8;18096:9;:19::i;18072:44::-;18162:15;;18127:51;;-1:-1:-1;;;18127:51:0;;18051:65;;-1:-1:-1;;;;;;18127:13:0;;;;;:51;;18141:3;;18146:8;;18051:65;;18162:15;18127:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18212:10:0;18196:27;;;;:15;:27;;;;;;;;18224:13;:25;;;;;;18196:54;;;;;;;;-1:-1:-1;18196:27:0;-1:-1:-1;18189:61:0;18196:54;:27;18189:61;:::i;:::-;-1:-1:-1;18189:61:0;;;;;;;;;18277:10;18268:20;;:8;:20;;;;;;;;:30;;;;;;;;;18261:37;18268:30;18189:61;18261:37;:::i;:::-;-1:-1:-1;18261:37:0;;;;;;;;18351:10;18337:25;;:13;:25;;;;;;:32;;:29;:32::i;:::-;18323:10;18309:25;;;;:13;:25;;;;;:60;-1:-1:-1;;;;;;;;17261:1116:0:o;20476:139::-;20549:14;;:::i;:::-;-1:-1:-1;;;;;20583:14:0;;;;;;:8;:14;;;;;;;;:24;;;;;;;;;20576:31;;;;;;;;;;;-1:-1:-1;;20576:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20583:24;;20576:31;;20583:24;;20576:31;;;20583:24;20576:31;;;;;;;;;;;;;;;;;;;;;;;;6111:136;6169:7;6196:43;6200:1;6203;6196:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6189:50;6111:136;-1:-1:-1;;;6111:136:0:o;12884:521::-;12973:4;12998:22;;;:13;:22;;;;;;:32;-1:-1:-1;12998:32:0;12990:81;;;;-1:-1:-1;;;12990:81:0;;;;;;;:::i;:::-;13090:17;;;;:8;:17;;;;;;;;13082:46;;;;-1:-1:-1;;;13082:46:0;;;;;;;:::i;:::-;13176:14;;13202:30;;-1:-1:-1;;;13202:30:0;;-1:-1:-1;;;;;13176:14:0;;;;;;13202:17;;:30;;13220:3;;13225:6;;13202:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13268:22:0;;;;:13;:22;;;;;;:34;;-1:-1:-1;13295:6:0;13268:26;:34::i;:::-;13243:22;;;;:13;:22;;;;;:59;13349:6;13335:12;:10;:12::i;:::-;-1:-1:-1;;;;;13318:47:0;;13357:7;13318:47;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;13393:4:0;;12884:521;-1:-1:-1;;;;12884:521:0:o;29640:530::-;29691:27;29745:2;29762:11;29758:54;;-1:-1:-1;;29790:10:0;;;;;;;;;;;;-1:-1:-1;;;29790:10:0;;;;;;29758:54;29831:6;29822;29867:69;29874:6;;29867:69;;29897:5;;29922:2;29917:7;;;;29867:69;;;29946:17;29976:3;-1:-1:-1;;;;;29966:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29966:14:0;-1:-1:-1;29946:34:0;-1:-1:-1;;;30000:7:0;;30018:115;30025:11;;30018:115;;30090:2;30081:6;:11;30076:2;:16;30065:29;;30053:4;30058:3;;;;;;;30053:9;;;;;;;;;;;:41;-1:-1:-1;;;;;30053:41:0;;;;;;;;-1:-1:-1;30119:2:0;30109:12;;;;30018:115;;;-1:-1:-1;30157:4:0;29640:530;-1:-1:-1;;;;;29640:530:0:o;27919:144::-;27992:13;28049:1;28052;28032:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28018:37;;27919:144;;;;:::o;28373:700::-;28451:7;28479:3;:10;28493:2;28479:16;28471:51;;;;-1:-1:-1;;;28471:51:0;;;;;;;:::i;:::-;28696:2;28687:12;;28681:19;28734:2;28725:12;;28719:19;28780:2;28771:12;;28765:19;28535:9;28757:28;28908:2;28904:6;;28900:46;;;28932:2;28927:7;28900:46;28966:1;:7;;28971:2;28966:7;:18;;;;28977:1;:7;;28982:2;28977:7;28966:18;28958:58;;;;-1:-1:-1;;;28958:58:0;;;;;;;:::i;:::-;29036:29;29051:4;29057:1;29060;29063;29036:14;:29::i;23992:242::-;24064:4;24102:22;;;:12;:22;;;;;;;;24081:51;;;;;;-1:-1:-1;;24081:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;:51;;24102:22;24081:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24168:9:0;;;;;;;;;;-1:-1:-1;24168:9:0;;24196:22;;;;;;;;24158:20;24196:30;;;23992:242;-1:-1:-1;;;;;;23992:242:0:o;5647:181::-;5705:7;5737:5;;;5761:6;;;;5753:46;;;;-1:-1:-1;;;5753:46:0;;;;;;;:::i;13602:124::-;13655:4;13672:17;;;:8;:17;;;;;:24;;-1:-1:-1;;13672:24:0;13692:4;13672:24;;;;;;13692:4;13602:124::o;11336:98::-;11416:10;11336:98;:::o;13738:128::-;13794:4;13811:17;;;:8;:17;;;;;:25;;-1:-1:-1;;13811:25:0;;;-1:-1:-1;;13738:128:0:o;19959:254::-;-1:-1:-1;;;;;20079:14:0;;20041:4;20079:14;;;:8;:14;;;;;;;;:24;;;;;;;;20058:53;;;;;;-1:-1:-1;;20058:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;:53;;20079:24;20058:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20147:9:0;;;;;;;;;;-1:-1:-1;20147:9:0;;20175:22;;;;;;;;20137:20;20175:30;;;19959:254;-1:-1:-1;;;;;;;19959:254:0:o;6550:192::-;6636:7;6672:12;6664:6;;;;6656:29;;;;-1:-1:-1;;;6656:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;6708:5:0;;;6550:192::o;29081:327::-;29170:7;29190:19;:56;;;;;;;;;;;;;;;;;;;29257:20;29307:6;29315:1;29290:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29280:38;;;;;;29257:61;;29329:12;29344:32;29354:12;29368:1;29371;29374;29344:32;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29344:32:0;;-1:-1:-1;;29344:32:0;;;29081:327;-1:-1:-1;;;;;;;;;29081:327:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;722:336;;;836:3;829:4;821:6;817:17;813:27;803:2;;-1:-1;;844:12;803:2;-1:-1;874:20;;-1:-1;;;;;903:30;;900:2;;;-1:-1;;936:12;900:2;980:4;972:6;968:17;956:29;;1031:3;980:4;1011:17;972:6;997:32;;994:41;991:2;;;1048:1;;1038:12;991:2;796:262;;;;;:::o;1067:440::-;;1168:3;1161:4;1153:6;1149:17;1145:27;1135:2;;-1:-1;;1176:12;1135:2;1223:6;1210:20;1245:64;1260:48;1301:6;1260:48;:::i;:::-;1245:64;:::i;:::-;1236:73;;1329:6;1322:5;1315:21;1433:3;1365:4;1424:6;1357;1415:16;;1412:25;1409:2;;;1450:1;;1440:12;1409:2;45668:6;1365:4;1357:6;1353:17;1365:4;1391:5;1387:16;45645:30;45724:1;45706:16;;;1365:4;45706:16;45699:27;1391:5;1128:379;-1:-1;;1128:379::o;3194:241::-;;3298:2;3286:9;3277:7;3273:23;3269:32;3266:2;;;-1:-1;;3304:12;3266:2;85:6;72:20;97:33;124:5;97:33;:::i;3706:743::-;;;;;;3881:3;3869:9;3860:7;3856:23;3852:33;3849:2;;;-1:-1;;3888:12;3849:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3940:63;-1:-1;4068:2;4053:18;;4040:32;-1:-1;;;;;4081:30;;4078:2;;;-1:-1;;4114:12;4078:2;4152:65;4209:7;4200:6;4189:9;4185:22;4152:65;:::i;:::-;3843:606;;4134:83;;-1:-1;4134:83;;4254:2;4293:22;;2846:20;;4362:2;4401:22;;;497:20;;-1:-1;3843:606;-1:-1;;;;3843:606::o;4456:366::-;;;4577:2;4565:9;4556:7;4552:23;4548:32;4545:2;;;-1:-1;;4583:12;4545:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4635:63;4735:2;4774:22;;;;2846:20;;-1:-1;;;4539:283::o;4829:617::-;;;;;4987:2;4975:9;4966:7;4962:23;4958:32;4955:2;;;-1:-1;;4993:12;4955:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5045:63;-1:-1;5145:2;5184:22;;2846:20;;-1:-1;5281:2;5266:18;;5253:32;-1:-1;;;;;5294:30;;5291:2;;;-1:-1;;5327:12;5291:2;5365:65;5422:7;5413:6;5402:9;5398:22;5365:65;:::i;:::-;4949:497;;;;-1:-1;5347:83;-1:-1;;;;4949:497::o;5453:869::-;;;;;;;5648:3;5636:9;5627:7;5623:23;5619:33;5616:2;;;-1:-1;;5655:12;5616:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5707:63;-1:-1;5807:2;5846:22;;2846:20;;-1:-1;5943:2;5928:18;;5915:32;-1:-1;;;;;5956:30;;;5953:2;;;-1:-1;;5989:12;5953:2;6027:65;6084:7;6075:6;6064:9;6060:22;6027:65;:::i;:::-;6009:83;;-1:-1;6009:83;-1:-1;6157:2;6142:18;;6129:32;;-1:-1;6170:30;;;6167:2;;;-1:-1;;6203:12;6167:2;;6241:65;6298:7;6289:6;6278:9;6274:22;6241:65;:::i;:::-;5610:712;;;;-1:-1;5610:712;;-1:-1;5610:712;;6223:83;;5610:712;-1:-1;;;5610:712::o;6329:993::-;;;;;;;;6540:3;6528:9;6519:7;6515:23;6511:33;6508:2;;;-1:-1;;6547:12;6508:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6599:63;-1:-1;6699:2;6738:22;;2846:20;;-1:-1;6835:2;6820:18;;6807:32;-1:-1;;;;;6848:30;;;6845:2;;;-1:-1;;6881:12;6845:2;6919:65;6976:7;6967:6;6956:9;6952:22;6919:65;:::i;:::-;6901:83;;-1:-1;6901:83;-1:-1;7021:2;7060:22;;2846:20;;-1:-1;7157:3;7142:19;;7129:33;;-1:-1;7171:30;;;7168:2;;;-1:-1;;7204:12;7168:2;;7242:64;7298:7;7289:6;7278:9;7274:22;7242:64;:::i;:::-;6502:820;;;;-1:-1;6502:820;;-1:-1;6502:820;;;;7224:82;;-1:-1;;;6502:820::o;7329:491::-;;;;7467:2;7455:9;7446:7;7442:23;7438:32;7435:2;;;-1:-1;;7473:12;7435:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7525:63;7625:2;7664:22;;2846:20;;-1:-1;7733:2;7772:22;;;2846:20;;7429:391;-1:-1;;;7429:391::o;7827:257::-;;7939:2;7927:9;7918:7;7914:23;7910:32;7907:2;;;-1:-1;;7945:12;7907:2;376:6;370:13;46929:5;44807:13;44800:21;46907:5;46904:32;46894:2;;-1:-1;;46940:12;8091:241;;8195:2;8183:9;8174:7;8170:23;8166:32;8163:2;;;-1:-1;;8201:12;8163:2;-1:-1;497:20;;8157:175;-1:-1;8157:175::o;8339:263::-;;8454:2;8442:9;8433:7;8429:23;8425:32;8422:2;;;-1:-1;;8460:12;8422:2;-1:-1;645:13;;8416:186;-1:-1;8416:186::o;8609:490::-;;;;8749:2;8737:9;8728:7;8724:23;8720:32;8717:2;;;-1:-1;;8755:12;8717:2;510:6;497:20;8807:63;;8935:2;8924:9;8920:18;8907:32;-1:-1;;;;;8951:6;8948:30;8945:2;;;-1:-1;;8981:12;8945:2;9019:64;9075:7;9066:6;9055:9;9051:22;9019:64;:::i;:::-;8711:388;;9001:82;;-1:-1;9001:82;;-1:-1;;;;8711:388::o;9106:345::-;;9219:2;9207:9;9198:7;9194:23;9190:32;9187:2;;;-1:-1;;9225:12;9187:2;9283:17;9270:31;-1:-1;;;;;9313:6;9310:30;9307:2;;;-1:-1;;9343:12;9307:2;9373:62;9427:7;9418:6;9407:9;9403:22;9373:62;:::i;9458:367::-;;;9582:2;9570:9;9561:7;9557:23;9553:32;9550:2;;;-1:-1;;9588:12;9550:2;9646:17;9633:31;-1:-1;;;;;9676:6;9673:30;9670:2;;;-1:-1;;9706:12;9670:2;9744:65;9801:7;9792:6;9781:9;9777:22;9744:65;:::i;:::-;9726:83;;;;-1:-1;9544:281;-1:-1;;;;9544:281::o;9832:618::-;;;;;9993:2;9981:9;9972:7;9968:23;9964:32;9961:2;;;-1:-1;;9999:12;9961:2;10057:17;10044:31;-1:-1;;;;;10095:18;10087:6;10084:30;10081:2;;;-1:-1;;10117:12;10081:2;10155:65;10212:7;10203:6;10192:9;10188:22;10155:65;:::i;:::-;10137:83;;-1:-1;10137:83;-1:-1;10285:2;10270:18;;10257:32;;-1:-1;10298:30;;;10295:2;;;-1:-1;;10331:12;10295:2;;10369:65;10426:7;10417:6;10406:9;10402:22;10369:65;:::i;10457:362::-;;10582:2;10570:9;10561:7;10557:23;10553:32;10550:2;;;-1:-1;;10588:12;10550:2;10639:17;10633:24;-1:-1;;;;;10669:6;10666:30;10663:2;;;-1:-1;;10699:12;10663:2;10771:22;;2433:4;2421:17;;2417:27;-1:-1;2407:2;;-1:-1;;2448:12;2407:2;2488:6;2482:13;2510:65;2525:49;2567:6;2525:49;:::i;2510:65::-;2595:6;2588:5;2581:21;2699:3;10582:2;2690:6;2623;2681:16;;2678:25;2675:2;;;-1:-1;;2706:12;2675:2;2726:39;2758:6;10582:2;2657:5;2653:16;10582:2;2623:6;2619:17;2726:39;:::i;10826:472::-;;;10957:2;10945:9;10936:7;10932:23;10928:32;10925:2;;;-1:-1;;10963:12;10925:2;11021:17;11008:31;-1:-1;;;;;11051:6;11048:30;11045:2;;;-1:-1;;11081:12;11045:2;11111:63;11166:7;11157:6;11146:9;11142:22;11111:63;:::i;:::-;11101:73;11211:2;11250:22;;;;497:20;;-1:-1;;;;10919:379::o;11823:366::-;;;11944:2;11932:9;11923:7;11919:23;11915:32;11912:2;;;-1:-1;;11950:12;11912:2;-1:-1;;2846:20;;;12102:2;12141:22;;;497:20;;-1:-1;11906:283::o;12196:973::-;;;;;;;12397:3;12385:9;12376:7;12372:23;12368:33;12365:2;;;-1:-1;;12404:12;12365:2;2859:6;2846:20;12456:63;;12584:2;12573:9;12569:18;12556:32;-1:-1;;;;;12608:18;12600:6;12597:30;12594:2;;;-1:-1;;12630:12;12594:2;12668:65;12725:7;12716:6;12705:9;12701:22;12668:65;:::i;:::-;12650:83;;-1:-1;12650:83;-1:-1;12770:2;12809:22;;72:20;;-1:-1;97:33;72:20;97:33;:::i;:::-;12778:63;;-1:-1;12878:2;12917:22;;2846:20;;-1:-1;13014:3;12999:19;;12986:33;;13028:30;;;13025:2;;;-1:-1;;13061:12;13025:2;;13091:62;13145:7;13136:6;13125:9;13121:22;13091:62;:::i;:::-;13081:72;;;12359:810;;;;;;;;:::o;13176:472::-;;;13307:2;13295:9;13286:7;13282:23;13278:32;13275:2;;;-1:-1;;13313:12;13275:2;2859:6;2846:20;13365:63;;13493:2;13482:9;13478:18;13465:32;-1:-1;;;;;13509:6;13506:30;13503:2;;;-1:-1;;13539:12;13503:2;13569:63;13624:7;13615:6;13604:9;13600:22;13569:63;:::i;:::-;13559:73;;;13269:379;;;;;:::o;14028:595::-;;;;14175:2;14163:9;14154:7;14150:23;14146:32;14143:2;;;-1:-1;;14181:12;14143:2;2859:6;2846:20;14233:63;;14333:2;14376:9;14372:22;2846:20;14341:63;;14469:2;14458:9;14454:18;14441:32;-1:-1;;;;;14485:6;14482:30;14479:2;;;-1:-1;;14515:12;14479:2;14545:62;14599:7;14590:6;14579:9;14575:22;14545:62;:::i;:::-;14535:72;;;14137:486;;;;;:::o;14630:847::-;;;;;;14814:3;14802:9;14793:7;14789:23;14785:33;14782:2;;;-1:-1;;14821:12;14782:2;2859:6;2846:20;14873:63;;14973:2;15016:9;15012:22;2846:20;14981:63;;15109:2;15098:9;15094:18;15081:32;-1:-1;;;;;15133:18;15125:6;15122:30;15119:2;;;-1:-1;;15155:12;15119:2;15193:65;15250:7;15241:6;15230:9;15226:22;15193:65;:::i;:::-;15175:83;;-1:-1;15175:83;-1:-1;15323:2;15308:18;;15295:32;;-1:-1;15336:30;;;15333:2;;;-1:-1;;15369:12;15333:2;;15399:62;15453:7;15444:6;15433:9;15429:22;15399:62;:::i;:::-;15389:72;;;14776:701;;;;;;;;:::o;15484:259::-;;15597:2;15585:9;15576:7;15572:23;15568:32;15565:2;;;-1:-1;;15603:12;15565:2;3139:6;3133:13;45190:4;47297:5;45179:16;47274:5;47271:33;47261:2;;-1:-1;;47308:12;17176:300;;44155:6;44150:3;44143:19;45668:6;45663:3;44192:4;44187:3;44183:14;45645:30;-1:-1;44192:4;45715:6;44187:3;45706:16;;45699:27;44192:4;46461:7;;46465:2;17462:6;46445:14;46441:28;44187:3;17431:39;;17424:46;;17278:198;;;;;:::o;17830:327::-;;17965:5;43726:12;44155:6;44150:3;44143:19;18049:52;18094:6;44192:4;44187:3;44183:14;44192:4;18075:5;18071:16;18049:52;:::i;:::-;46461:7;46445:14;-1:-1;;46441:28;18113:39;;;;44192:4;18113:39;;17912:245;-1:-1;;17912:245::o;25799:253::-;46556:2;46552:14;;;;-1:-1;;46552:14;16218:58;;26024:2;26015:12;;25915:137::o;26059:253::-;16460:37;;;26284:2;26275:12;;26175:137::o;26319:271::-;;16948:5;43726:12;17059:52;17104:6;17099:3;17092:4;17085:5;17081:16;17059:52;:::i;:::-;17123:16;;;;;26453:137;-1:-1;;26453:137::o;26597:410::-;;16948:5;43726:12;17059:52;17104:6;17099:3;17092:4;17085:5;17081:16;17059:52;:::i;:::-;17123:16;;;;16460:37;;;-1:-1;17092:4;26970:12;;26759:248;-1:-1;26759:248::o;27014:295::-;;45668:6;45663:3;45658;45645:30;45706:16;;45699:27;;;45706:16;27160:149;-1:-1;27160:149::o;27598:436::-;;16948:5;43726:12;17059:52;17104:6;17099:3;17092:4;17085:5;17081:16;17059:52;:::i;:::-;43726:12;;17123:16;;;;17059:52;43726:12;17123:16;17092:4;17081:16;;17059:52;:::i;:::-;17123:16;;27782:252;-1:-1;;;;27782:252::o;28301:222::-;-1:-1;;;;;44974:54;;;;15960:37;;28428:2;28413:18;;28399:124::o;28530:349::-;-1:-1;;;;;44974:54;;;15829:58;;44974:54;;28865:2;28850:18;;15960:37;28693:2;28678:18;;28664:215::o;28886:460::-;-1:-1;;;;;44974:54;;;15829:58;;44974:54;;;;29249:2;29234:18;;15960:37;29332:2;29317:18;;16460:37;;;;29077:2;29062:18;;29048:298::o;29804:333::-;-1:-1;;;;;44974:54;;;;15960:37;;30123:2;30108:18;;16460:37;29959:2;29944:18;;29930:207::o;30144:772::-;;914:18;;46552:14;;;15990:5;44974:54;15967:3;15960:37;16490:5;30580:2;30569:9;30565:18;16460:37;30415:3;30617:2;30606:9;30602:18;30595:48;30657:88;30415:3;30404:9;30400:19;30731:6;30723;30657:88;:::i;:::-;30793:9;30787:4;30783:20;30778:2;30767:9;30763:18;30756:48;30818:88;30901:4;30892:6;30884;30818:88;:::i;30923:752::-;;914:18;;46552:14;;;15990:5;44974:54;15967:3;15960:37;16490:5;31349:2;31338:9;31334:18;16460:37;31184:3;31386:2;31375:9;31371:18;31364:48;31426:78;31184:3;31173:9;31169:19;31490:6;31426:78;:::i;:::-;31552:9;31546:4;31542:20;31537:2;31526:9;31522:18;31515:48;31577:88;31660:4;31651:6;31643;31577:88;:::i;:::-;31569:96;31155:520;-1:-1;;;;;;;;31155:520::o;31682:732::-;;914:18;;46552:14;;;44978:5;44974:54;15967:3;15960:37;16490:5;32098:2;32087:9;32083:18;16460:37;31933:3;32135:2;32124:9;32120:18;32113:48;32175:78;31933:3;31922:9;31918:19;32239:6;32175:78;:::i;:::-;32301:9;32295:4;32291:20;32286:2;32275:9;32271:18;32264:48;32326:78;32399:4;32390:6;32326:78;:::i;:::-;32318:86;31904:510;-1:-1;;;;;;;31904:510::o;32421:210::-;44807:13;;44800:21;16353:34;;32542:2;32527:18;;32513:118::o;32867:432::-;16460:37;;;33208:2;33193:18;;16460:37;;;;44807:13;44800:21;33285:2;33270:18;;16353:34;33044:2;33029:18;;33015:284::o;33306:548::-;16460:37;;;45190:4;45179:16;;;;33674:2;33659:18;;25752:35;33757:2;33742:18;;16460:37;33840:2;33825:18;;16460:37;33513:3;33498:19;;33484:370::o;33861:549::-;;34076:2;34097:17;34090:47;34151:88;34076:2;34065:9;34061:18;34225:6;34217;34151:88;:::i;:::-;34287:9;34281:4;34277:20;34272:2;34261:9;34257:18;34250:48;34312:88;34395:4;34386:6;34378;34312:88;:::i;34417:310::-;;34564:2;34585:17;34578:47;34639:78;34564:2;34553:9;34549:18;34703:6;34639:78;:::i;34734:416::-;34934:2;34948:47;;;19110:2;34919:18;;;44143:19;-1:-1;;;44183:14;;;19126:39;19184:12;;;34905:245::o;35157:416::-;35357:2;35371:47;;;19435:2;35342:18;;;44143:19;-1:-1;;;44183:14;;;19451:44;19514:12;;;35328:245::o;35580:416::-;35780:2;35794:47;;;19765:2;35765:18;;;44143:19;-1:-1;;;44183:14;;;19781:45;19845:12;;;35751:245::o;36003:416::-;36203:2;36217:47;;;20096:2;36188:18;;;44143:19;-1:-1;;;44183:14;;;20112:42;20173:12;;;36174:245::o;36426:416::-;36626:2;36640:47;;;20424:2;36611:18;;;44143:19;20460:29;44183:14;;;20440:50;20509:12;;;36597:245::o;36849:416::-;37049:2;37063:47;;;20760:2;37034:18;;;44143:19;20796:29;44183:14;;;20776:50;20845:12;;;37020:245::o;37272:416::-;37472:2;37486:47;;;21096:2;37457:18;;;44143:19;-1:-1;;;44183:14;;;21112:45;21176:12;;;37443:245::o;37695:416::-;37895:2;37909:47;;;21427:2;37880:18;;;44143:19;21463:25;44183:14;;;21443:46;21508:12;;;37866:245::o;38118:416::-;38318:2;38332:47;;;21759:2;38303:18;;;44143:19;21795:26;44183:14;;;21775:47;21841:12;;;38289:245::o;38541:416::-;38741:2;38755:47;;;22092:2;38726:18;;;44143:19;-1:-1;;;44183:14;;;22108:36;22163:12;;;38712:245::o;38964:416::-;39164:2;39178:47;;;22414:2;39149:18;;;44143:19;-1:-1;;;44183:14;;;22430:37;22486:12;;;39135:245::o;39387:416::-;39587:2;39601:47;;;22737:2;39572:18;;;44143:19;-1:-1;;;44183:14;;;22753:42;22814:12;;;39558:245::o;39810:416::-;40010:2;40024:47;;;23065:2;39995:18;;;44143:19;23101:34;44183:14;;;23081:55;-1:-1;;;23156:12;;;23149:29;23197:12;;;39981:245::o;40233:416::-;40433:2;40447:47;;;23448:2;40418:18;;;44143:19;-1:-1;;;44183:14;;;23464:40;23523:12;;;40404:245::o;40656:416::-;40856:2;40870:47;;;23774:2;40841:18;;;44143:19;23810:34;44183:14;;;23790:55;-1:-1;;;23865:12;;;23858:28;23905:12;;;40827:245::o;41079:366::-;;41254:2;41275:17;41268:47;24224:16;24218:23;24149:4;41254:2;41243:9;41239:18;24254:38;24307:73;24140:14;41243:9;24140:14;24361:12;24307:73;:::i;:::-;24299:81;;41254:2;24462:5;24458:16;24452:23;24149:4;41243:9;24529:14;16460:37;41321:114;;;;41225:220;;;;:::o;41452:382::-;;41635:2;41656:17;41649:47;24892:16;24886:23;24817:4;41635:2;41624:9;41620:18;24922:38;24975:73;24808:14;41624:9;24808:14;25029:12;24975:73;:::i;:::-;41635:2;25126:16;;25120:23;25197:14;;;;16460:37;;;;25281:16;;;25275:23;-1:-1;;;;;44974:54;24817:4;25352:14;;;15960:37;;;;-1:-1;24967:81;;41606:228;-1:-1;41606:228::o;42070:421::-;;16490:5;16467:3;16460:37;42245:2;42363;42352:9;42348:18;42341:48;42403:78;42245:2;42234:9;42230:18;42467:6;42403:78;:::i;42498:214::-;45190:4;45179:16;;;;25752:35;;42621:2;42606:18;;42592:120::o;42719:256::-;42781:2;42775:9;42807:17;;;-1:-1;;;;;42867:34;;42903:22;;;42864:62;42861:2;;;42939:1;;42929:12;42861:2;42781;42948:22;42759:216;;-1:-1;42759:216::o;42982:321::-;;-1:-1;;;;;43117:6;43114:30;43111:2;;;-1:-1;;43147:12;43111:2;-1:-1;46461:7;43201:17;-1:-1;;43197:33;43288:4;43278:15;;43048:255::o;45741:268::-;45806:1;45813:101;45827:6;45824:1;45821:13;45813:101;;;45894:11;;;45888:18;45875:11;;;45868:39;45849:2;45842:10;45813:101;;;45929:6;45926:1;45923:13;45920:2;;;45806:1;45985:6;45980:3;45976:16;45969:27;45920:2;;45790:219;;;:::o;46584:117::-;-1:-1;;;;;44974:54;;46643:35;;46633:2;;46692:1;;46682:12

Swarm Source

ipfs://df0a71af19a3779eec6b00292761fb6798319030f62f7b2b752b25bb20df44ac

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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