Token Art Blocks

Art Blocks NFT  
 
 
Loading
[ Download CSV Export  ] 
Loading
Loading

OVERVIEW

Generative content minted and hosted on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x796b5a7c734b21594b09778da75c7c0045108e5c

Contract Name:
GenArt721

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-27
*/

// Sources flattened with buidler v1.4.7 https://buidler.dev

// File contracts/libs/IERC165.sol

// File: openzeppelin-solidity/contracts/introspection/IERC165.sol
pragma solidity ^0.5.0;

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


// File contracts/libs/ERC165.sol

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

pragma solidity ^0.5.0;



/**
 * @dev Implementation of the `IERC165` interface.
 *
 * Contracts may inherit from this and call `_registerInterface` to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See `IERC165.supportsInterface`.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See `IERC165.supportsInterface`.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


// File contracts/libs/IERC721.sol

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.5.0;



/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either `approve` or `setApproveForAll`.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either `approve` or `setApproveForAll`.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}


// File contracts/libs/SafeMath.sol

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, 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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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-solidity/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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}


// File contracts/libs/Address.sol

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.5.0;

/**
 * @dev Collection of functions related to the address type,
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}


// File contracts/libs/Counters.sol

// File: openzeppelin-solidity/contracts/drafts/Counters.sol

pragma solidity ^0.5.0;



/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}


// File contracts/libs/IERC721Receiver.sol

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.5.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}


// File contracts/libs/ERC721.sol

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.5.0;







/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping (uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;
    
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }


    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }

    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }

    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender, "ERC721: approve to caller");

        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(address from, address to, uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }

    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
    internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}


// File contracts/libs/IERC721Enumerable.sol

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Enumerable.sol

pragma solidity ^0.5.0;



/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) public view returns (uint256);
}


// File contracts/libs/ERC721Enumerable.sol

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol

pragma solidity ^0.5.0;







/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    constructor () public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the _ownedTokensIndex mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length.sub(1);
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        _allTokens.length--;
        _allTokensIndex[tokenId] = 0;
    }
}


// File contracts/libs/CustomERC721Metadata.sol

// File: contracts/CustomERC721Metadata.sol

pragma solidity ^0.5.0;






/**
 * ERC721 base contract without the concept of tokenUri as this is managed by the parent
 */
contract CustomERC721Metadata is ERC165, ERC721, ERC721Enumerable {

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

}


// File contracts/libs/Strings.sol

// File: contracts/Strings.sol

pragma solidity ^0.5.0;

//https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
library Strings {

    function strConcat(string memory _a, string memory _b) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, "", "", "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory _concatenatedString) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        uint i = 0;
        for (i = 0; i < _ba.length; i++) {
            babcde[k++] = _ba[i];
        }
        for (i = 0; i < _bb.length; i++) {
            babcde[k++] = _bb[i];
        }
        for (i = 0; i < _bc.length; i++) {
            babcde[k++] = _bc[i];
        }
        for (i = 0; i < _bd.length; i++) {
            babcde[k++] = _bd[i];
        }
        for (i = 0; i < _be.length; i++) {
            babcde[k++] = _be[i];
        }
        return string(babcde);
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }
}


// File contracts/GenArt721.sol

// File: contracts/GenArt721.sol
pragma solidity ^0.5.0;




contract GenArt721 is CustomERC721Metadata {
    using SafeMath for uint256;

    event Mint(
        address indexed _to,
        uint256 indexed _tokenId,
        uint256 indexed _projectId,
        uint256 _invocations,
        uint256 _value
    );

    struct Project {
        string name;
        string artist;
        string description;
        string website;
        string license;
        bool dynamic;
        address payable artistAddress;
        address payable additionalPayee;
        uint256 additionalPayeePercentage;
        uint256 secondMarketRoyalty;
        uint256 pricePerTokenInWei;
        string projectBaseURI;
        string projectBaseIpfsURI;
        uint256 invocations;
        uint256 maxInvocations;
        string scriptJSON;
        mapping(uint256 => string) scripts;
        uint scriptCount;
        string ipfsHash;
        uint256 hashes;
        bool useIpfs;
        bool active;
        bool locked;
        bool paused;
    }

    uint256 constant ONE_MILLION = 1_000_000;
    mapping(uint256 => Project) projects;

    address payable public artblocksAddress;
    uint256 public artblocksPercentage = 10;

    mapping(uint256 => string) public staticIpfsImageLink;
    mapping(uint256 => uint256) public tokenIdToProjectId;
    mapping(uint256 => uint256[]) internal projectIdToTokenIds;
    mapping(uint256 => bytes32[]) internal tokenIdToHashes;
    mapping(bytes32 => uint256) public hashToTokenId;

    address public admin;
    mapping(address => bool) public isWhitelisted;

    uint256 public nextProjectId;

    modifier onlyValidTokenId(uint256 _tokenId) {
        require(_exists(_tokenId), "Token ID does not exist");
        _;
    }

    modifier onlyUnlocked(uint256 _projectId) {
        require(!projects[_projectId].locked, "Only if unlocked");
        _;
    }

    modifier onlyArtist(uint256 _projectId) {
        require(msg.sender == projects[_projectId].artistAddress, "Only artist");
        _;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "Only admin");
        _;
    }

    modifier onlyWhitelisted() {
        require(isWhitelisted[msg.sender], "Only whitelisted");
        _;
    }

    modifier onlyArtistOrWhitelisted(uint256 _projectId) {
        require(isWhitelisted[msg.sender] || msg.sender == projects[_projectId].artistAddress, "Only artist or whitelisted");
        _;
    }

    constructor(string memory _tokenName, string memory _tokenSymbol) CustomERC721Metadata(_tokenName, _tokenSymbol) public {
        admin = msg.sender;
        isWhitelisted[msg.sender] = true;
        artblocksAddress = msg.sender;
    }

    function purchase(uint256 _projectId) public payable returns (uint256 _tokenId) {
        return purchaseTo(msg.sender, _projectId);
    }

    function purchaseTo(address _to, uint256 _projectId) public payable returns (uint256 _tokenId) {
        require(msg.value >= projects[_projectId].pricePerTokenInWei, "Must send at least pricePerTokenInWei");
        require(projects[_projectId].invocations.add(1) <= projects[_projectId].maxInvocations, "Must not exceed max invocations");
        require(projects[_projectId].active || msg.sender == projects[_projectId].artistAddress, "Project must exist and be active");
        require(!projects[_projectId].paused || msg.sender == projects[_projectId].artistAddress, "Purchases are paused.");

        uint256 tokenId = _mintToken(_to, _projectId);

        _splitFunds(_projectId);

        return tokenId;
    }

    function _mintToken(address _to, uint256 _projectId) internal returns (uint256 _tokenId) {

        uint256 tokenIdToBe = (_projectId * ONE_MILLION) + projects[_projectId].invocations;

        projects[_projectId].invocations = projects[_projectId].invocations.add(1);

        for (uint256 i = 0; i < projects[_projectId].hashes; i++) {
            bytes32 hash = keccak256(abi.encodePacked(projects[_projectId].invocations, block.number.add(i), msg.sender));
            tokenIdToHashes[tokenIdToBe].push(hash);
            hashToTokenId[hash] = tokenIdToBe;
        }

        _mint(_to, tokenIdToBe);

        tokenIdToProjectId[tokenIdToBe] = _projectId;
        projectIdToTokenIds[_projectId].push(tokenIdToBe);

        emit Mint(_to, tokenIdToBe, _projectId, projects[_projectId].invocations, projects[_projectId].pricePerTokenInWei);

        return tokenIdToBe;
    }

    function _splitFunds(uint256 _projectId) internal {
        if (msg.value > 0) {

            uint256 pricePerTokenInWei = projects[_projectId].pricePerTokenInWei;
            uint256 refund = msg.value.sub(projects[_projectId].pricePerTokenInWei);

            if (refund > 0) {
                msg.sender.transfer(refund);
            }

            uint256 foundationAmount = pricePerTokenInWei.div(100).mul(artblocksPercentage);
            if (foundationAmount > 0) {
                artblocksAddress.transfer(foundationAmount);
            }

            uint256 projectFunds = pricePerTokenInWei.sub(foundationAmount);

            uint256 additionalPayeeAmount;
            if (projects[_projectId].additionalPayeePercentage > 0) {
                additionalPayeeAmount = projectFunds.div(100).mul(projects[_projectId].additionalPayeePercentage);
                if (additionalPayeeAmount > 0) {
                    projects[_projectId].additionalPayee.transfer(additionalPayeeAmount);
                }
            }

            uint256 creatorFunds = projectFunds.sub(additionalPayeeAmount);
            if (creatorFunds > 0) {
                projects[_projectId].artistAddress.transfer(creatorFunds);
            }
        }
    }

    function updateArtblocksAddress(address payable _artblocksAddress) public onlyAdmin {
        artblocksAddress = _artblocksAddress;
    }

    function updateArtblocksPercentage(uint256 _artblocksPercentage) public onlyAdmin {
        require(_artblocksPercentage <= 25, "Max of 25%");
        artblocksPercentage = _artblocksPercentage;
    }

    function addWhitelisted(address _address) public onlyAdmin {
        isWhitelisted[_address] = true;
    }

    function removeWhitelisted(address _address) public onlyAdmin {
        isWhitelisted[_address] = false;
    }

    
    function toggleProjectIsLocked(uint256 _projectId) public onlyWhitelisted onlyUnlocked(_projectId) {
        projects[_projectId].locked = true;
    }

    function toggleProjectIsActive(uint256 _projectId) public onlyWhitelisted {
        projects[_projectId].active = !projects[_projectId].active;
    }

    function updateProjectArtistAddress(uint256 _projectId, address payable _artistAddress) public onlyArtistOrWhitelisted(_projectId) {
        projects[_projectId].artistAddress = _artistAddress;
    }

    function toggleProjectIsPaused(uint256 _projectId) public onlyArtist(_projectId) {
        projects[_projectId].paused = !projects[_projectId].paused;
    }

    function addProject(uint256 _pricePerTokenInWei, bool _dynamic) public onlyWhitelisted {

        uint256 projectId = nextProjectId;
        projects[projectId].artistAddress = msg.sender;
        projects[projectId].pricePerTokenInWei = _pricePerTokenInWei;
        projects[projectId].paused=true;
        projects[projectId].dynamic=_dynamic;
        projects[projectId].maxInvocations = ONE_MILLION;
        if (!_dynamic) {
            projects[projectId].hashes = 0;
        } else {
            projects[projectId].hashes = 1;
        }
        nextProjectId = nextProjectId.add(1);
    }

    function updateProjectPricePerTokenInWei(uint256 _projectId, uint256 _pricePerTokenInWei) onlyArtist(_projectId) public {
        projects[_projectId].pricePerTokenInWei = _pricePerTokenInWei;
    }

    function updateProjectName(uint256 _projectId, string memory _projectName) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        projects[_projectId].name = _projectName;
    }

    function updateProjectArtistName(uint256 _projectId, string memory _projectArtistName) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        projects[_projectId].artist = _projectArtistName;
    }

    function updateProjectAdditionalPayeeInfo(uint256 _projectId, address payable _additionalPayee, uint256 _additionalPayeePercentage) onlyArtist(_projectId) public {
        require(_additionalPayeePercentage <= 100, "Max of 100%");
        projects[_projectId].additionalPayee = _additionalPayee;
        projects[_projectId].additionalPayeePercentage = _additionalPayeePercentage;
    }

    function updateProjectSecondaryMarketRoyaltyPercentage(uint256 _projectId, uint256 _secondMarketRoyalty) onlyArtist(_projectId) public {
        require(_secondMarketRoyalty <= 100, "Max of 100%");
        projects[_projectId].secondMarketRoyalty = _secondMarketRoyalty;
    }

    function updateProjectDescription(uint256 _projectId, string memory _projectDescription) onlyArtist(_projectId) public {
        projects[_projectId].description = _projectDescription;
    }

    function updateProjectWebsite(uint256 _projectId, string memory _projectWebsite) onlyArtist(_projectId) public {
        projects[_projectId].website = _projectWebsite;
    }

    function updateProjectLicense(uint256 _projectId, string memory _projectLicense) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        projects[_projectId].license = _projectLicense;
    }

    function updateProjectMaxInvocations(uint256 _projectId, uint256 _maxInvocations) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        require(_maxInvocations > projects[_projectId].invocations, "You must set max invocations greater than current invocations");
        require(_maxInvocations <= ONE_MILLION, "Cannot exceed 1,000,000");
        projects[_projectId].maxInvocations = _maxInvocations;
    }

    function updateProjectHashesGenerated(uint256 _projectId, uint256 _hashes) onlyUnlocked(_projectId) onlyWhitelisted() public {
        require(projects[_projectId].invocations == 0, "Can not modify hashes generated after a token is minted.");
        require(projects[_projectId].dynamic, "Can only modify hashes on dynamic projects.");
        require(_hashes <= 100 && _hashes >= 0, "Hashes generated must be a positive integer and max hashes per invocation are 100");
        projects[_projectId].hashes = _hashes;
    }

    function addProjectScript(uint256 _projectId, string memory _script) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        projects[_projectId].scripts[projects[_projectId].scriptCount] = _script;
        projects[_projectId].scriptCount = projects[_projectId].scriptCount.add(1);
    }

    function updateProjectScript(uint256 _projectId, uint256 _scriptId, string memory _script) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        require(_scriptId < projects[_projectId].scriptCount, "scriptId out of range");
        projects[_projectId].scripts[_scriptId] = _script;
    }

    function removeProjectLastScript(uint256 _projectId) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        require(projects[_projectId].scriptCount > 0, "there are no scripts to remove");
        delete projects[_projectId].scripts[projects[_projectId].scriptCount - 1];
        projects[_projectId].scriptCount = projects[_projectId].scriptCount.sub(1);
    }

    function updateProjectScriptJSON(uint256 _projectId, string memory _projectScriptJSON) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        projects[_projectId].scriptJSON = _projectScriptJSON;
    }

    function updateProjectIpfsHash(uint256 _projectId, string memory _ipfsHash) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
        projects[_projectId].ipfsHash = _ipfsHash;
    }

    function updateProjectBaseURI(uint256 _projectId, string memory _newBaseURI) onlyArtist(_projectId) public {
        projects[_projectId].projectBaseURI = _newBaseURI;
    }

    function updateProjectBaseIpfsURI(uint256 _projectId, string memory _projectBaseIpfsURI) onlyArtist(_projectId) public {
        projects[_projectId].projectBaseIpfsURI = _projectBaseIpfsURI;
    }

    function toggleProjectUseIpfsForStatic(uint256 _projectId) onlyArtist(_projectId) public {
        require(!projects[_projectId].dynamic, "can only set static IPFS hash for static projects");
        projects[_projectId].useIpfs = !projects[_projectId].useIpfs;
    }

    function toggleProjectIsDynamic(uint256 _projectId) onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) public {
      require(projects[_projectId].invocations == 0, "Can not switch after a token is minted.");
        if (projects[_projectId].dynamic) {
            projects[_projectId].hashes = 0;
        } else {
            projects[_projectId].hashes = 1;
        }
        projects[_projectId].dynamic = !projects[_projectId].dynamic;
    }

    function overrideTokenDynamicImageWithIpfsLink(uint256 _tokenId, string memory _ipfsHash) onlyArtist(tokenIdToProjectId[_tokenId]) public {
        staticIpfsImageLink[_tokenId] = _ipfsHash;
    }

    function clearTokenIpfsImageUri(uint256 _tokenId) onlyArtist(tokenIdToProjectId[_tokenId]) public {
        delete staticIpfsImageLink[tokenIdToProjectId[_tokenId]];
    }

    function projectDetails(uint256 _projectId) view public returns (string memory projectName, string memory artist, string memory description, string memory website, string memory license, bool dynamic) {
        projectName = projects[_projectId].name;
        artist = projects[_projectId].artist;
        description = projects[_projectId].description;
        website = projects[_projectId].website;
        license = projects[_projectId].license;
        dynamic = projects[_projectId].dynamic;
    }

    function projectTokenInfo(uint256 _projectId) view public returns (address artistAddress, uint256 pricePerTokenInWei, uint256 invocations, uint256 maxInvocations, bool active, address additionalPayee, uint256 additionalPayeePercentage) {
        artistAddress = projects[_projectId].artistAddress;
        pricePerTokenInWei = projects[_projectId].pricePerTokenInWei;
        invocations = projects[_projectId].invocations;
        maxInvocations = projects[_projectId].maxInvocations;
        active = projects[_projectId].active;
        additionalPayee = projects[_projectId].additionalPayee;
        additionalPayeePercentage = projects[_projectId].additionalPayeePercentage;
    }

    function projectScriptInfo(uint256 _projectId) view public returns (string memory scriptJSON, uint256 scriptCount, uint256 hashes, string memory ipfsHash, bool locked, bool paused) {
        scriptJSON = projects[_projectId].scriptJSON;
        scriptCount = projects[_projectId].scriptCount;
        hashes = projects[_projectId].hashes;
        ipfsHash = projects[_projectId].ipfsHash;
        locked = projects[_projectId].locked;
        paused = projects[_projectId].paused;
    }

    function projectScriptByIndex(uint256 _projectId, uint256 _index) view public returns (string memory){
        return projects[_projectId].scripts[_index];
    }

    function projectURIInfo(uint256 _projectId) view public returns (string memory projectBaseURI, string memory projectBaseIpfsURI, bool useIpfs) {
        projectBaseURI = projects[_projectId].projectBaseURI;
        projectBaseIpfsURI = projects[_projectId].projectBaseIpfsURI;
        useIpfs = projects[_projectId].useIpfs;
    }

    function projectShowAllTokens(uint _projectId) public view returns (uint256[] memory){
        return projectIdToTokenIds[_projectId];
    }

    function showTokenHashes(uint _tokenId) public view returns (bytes32[] memory){
        return tokenIdToHashes[_tokenId];
    }

    function tokensOfOwner(address owner) external view returns (uint256[] memory) {
        return _tokensOfOwner(owner);
    }

    function getRoyaltyData(uint256 _tokenId) public view returns (address artistAddress, address additionalPayee, uint256 additionalPayeePercentage, uint256 royaltyFeeByID) {
        artistAddress = projects[tokenIdToProjectId[_tokenId]].artistAddress;
        additionalPayee = projects[tokenIdToProjectId[_tokenId]].additionalPayee;
        additionalPayeePercentage = projects[tokenIdToProjectId[_tokenId]].additionalPayeePercentage;
        royaltyFeeByID = projects[tokenIdToProjectId[_tokenId]].secondMarketRoyalty;
    }

    function tokenURI(uint256 _tokenId) external view onlyValidTokenId(_tokenId) returns (string memory) {
        if (bytes(staticIpfsImageLink[_tokenId]).length > 0) {
            return Strings.strConcat(projects[tokenIdToProjectId[_tokenId]].projectBaseIpfsURI, staticIpfsImageLink[_tokenId]);
        }

        if (!projects[tokenIdToProjectId[_tokenId]].dynamic && projects[tokenIdToProjectId[_tokenId]].useIpfs) {
            return Strings.strConcat(projects[tokenIdToProjectId[_tokenId]].projectBaseIpfsURI, projects[tokenIdToProjectId[_tokenId]].ipfsHash);
        }

        return Strings.strConcat(projects[tokenIdToProjectId[_tokenId]].projectBaseURI, Strings.uint2str(_tokenId));
    }
}


// File contracts/mock/ERC721ReceiverMock.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.5.0;


contract ERC721ReceiverMock is IERC721Receiver {
    bytes4 private _retval;
    bool private _reverts;

    event Received(address operator, address from, uint256 tokenId, bytes data, uint256 gas);

    constructor (bytes4 retval, bool reverts) public {
        _retval = retval;
        _reverts = reverts;
    }

    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4)
    {
        require(!_reverts, "ERC721ReceiverMock: reverting");
        emit Received(operator, from, tokenId, data, gasleft());
        return _retval;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_invocations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"},{"internalType":"bool","name":"_dynamic","type":"bool"}],"name":"addProject","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"}],"name":"addProjectScript","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"artblocksAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"artblocksPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"clearTokenIpfsImageUri","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRoyaltyData","outputs":[{"internalType":"address","name":"artistAddress","type":"address"},{"internalType":"address","name":"additionalPayee","type":"address"},{"internalType":"uint256","name":"additionalPayeePercentage","type":"uint256"},{"internalType":"uint256","name":"royaltyFeeByID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"hashToTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"overrideTokenDynamicImageWithIpfsLink","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectDetails","outputs":[{"internalType":"string","name":"projectName","type":"string"},{"internalType":"string","name":"artist","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"website","type":"string"},{"internalType":"string","name":"license","type":"string"},{"internalType":"bool","name":"dynamic","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"projectScriptByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectScriptInfo","outputs":[{"internalType":"string","name":"scriptJSON","type":"string"},{"internalType":"uint256","name":"scriptCount","type":"uint256"},{"internalType":"uint256","name":"hashes","type":"uint256"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"bool","name":"locked","type":"bool"},{"internalType":"bool","name":"paused","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectShowAllTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectTokenInfo","outputs":[{"internalType":"address","name":"artistAddress","type":"address"},{"internalType":"uint256","name":"pricePerTokenInWei","type":"uint256"},{"internalType":"uint256","name":"invocations","type":"uint256"},{"internalType":"uint256","name":"maxInvocations","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"additionalPayee","type":"address"},{"internalType":"uint256","name":"additionalPayeePercentage","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectURIInfo","outputs":[{"internalType":"string","name":"projectBaseURI","type":"string"},{"internalType":"string","name":"projectBaseIpfsURI","type":"string"},{"internalType":"bool","name":"useIpfs","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchase","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchaseTo","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"removeProjectLastScript","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"showTokenHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"staticIpfsImageLink","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsActive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsDynamic","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsLocked","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectUseIpfsForStatic","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_artblocksAddress","type":"address"}],"name":"updateArtblocksAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_artblocksPercentage","type":"uint256"}],"name":"updateArtblocksPercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address payable","name":"_additionalPayee","type":"address"},{"internalType":"uint256","name":"_additionalPayeePercentage","type":"uint256"}],"name":"updateProjectAdditionalPayeeInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address payable","name":"_artistAddress","type":"address"}],"name":"updateProjectArtistAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectArtistName","type":"string"}],"name":"updateProjectArtistName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectBaseIpfsURI","type":"string"}],"name":"updateProjectBaseIpfsURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"updateProjectBaseURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectDescription","type":"string"}],"name":"updateProjectDescription","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_hashes","type":"uint256"}],"name":"updateProjectHashesGenerated","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"updateProjectIpfsHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectLicense","type":"string"}],"name":"updateProjectLicense","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"}],"name":"updateProjectMaxInvocations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectName","type":"string"}],"name":"updateProjectName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"updateProjectPricePerTokenInWei","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_scriptId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"}],"name":"updateProjectScript","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectScriptJSON","type":"string"}],"name":"updateProjectScriptJSON","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_secondMarketRoyalty","type":"uint256"}],"name":"updateProjectSecondaryMarketRoyaltyPercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectWebsite","type":"string"}],"name":"updateProjectWebsite","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600a600d553480156200001657600080fd5b50604051620062d6380380620062d6833981810160405260408110156200003c57600080fd5b81019080805160405193929190846401000000008211156200005d57600080fd5b9083019060208201858111156200007357600080fd5b82516401000000008111828201881017156200008e57600080fd5b82525081516020918201929091019080838360005b83811015620000bd578181015183820152602001620000a3565b50505050905090810190601f168015620000eb5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010f57600080fd5b9083019060208201858111156200012557600080fd5b82516401000000008111828201881017156200014057600080fd5b82525081516020918201929091019080838360005b838110156200016f57818101518382015260200162000155565b50505050905090810190601f1680156200019d5780820380516001836020036101000a031916815260200191505b5060405250839150829050620001c36301ffc9a760e01b6001600160e01b036200028616565b620001de6380ac58cd60e01b6001600160e01b036200028616565b620001f963780e9d6360e01b6001600160e01b036200028616565b81516200020e9060099060208501906200030b565b5080516200022490600a9060208401906200030b565b5062000240635b5e139f60e01b6001600160e01b036200028616565b505060138054336001600160a01b031991821681179092556000828152601460205260409020805460ff19166001179055600c8054909116909117905550620003b09050565b6001600160e01b03198082161415620002e6576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200034e57805160ff19168380011785556200037e565b828001600101855582156200037e579182015b828111156200037e57825182559160200191906001019062000361565b506200038c92915062000390565b5090565b620003ad91905b808211156200038c576000815560010162000397565b90565b615f1680620003c06000396000f3fe6080604052600436106103ce5760003560e01c806370a08231116101fd578063acad012411610118578063d03c390c116100ab578063e985e9c51161007a578063e985e9c514611afb578063ed6df98214611b36578063efef39a114611b60578063f51f74a914611b7d578063f851a44014611ba7576103ce565b8063d03c390c14611a53578063db2ff86114611a7d578063e13208b414611aa7578063e935b7b114611ae6576103ce565b8063bee04f9c116100e7578063bee04f9c14611917578063c34a03b514611941578063c6d7323114611971578063c87b56dd14611a29576103ce565b8063acad012414611619578063b1656ba3146116d1578063b7b04fae1461178e578063b88d4fde14611846576103ce565b80638dd91a5611610190578063a11ec70a1161015f578063a11ec70a146114a0578063a22cb465146114ca578063a3b2cca614611505578063a65ff74c146115bd576103ce565b80638dd91a561461115e57806393961c66146113a357806395d89b411461145b57806397dc86cf14611470576103ce565b8063891407c0116101cc578063891407c0146110625780638ba8f14d1461108e5780638c2c3622146110b85780638c3c9cdd1461112e576103ce565b806370a0823114610f9c57806377444f6214610fcf578063826fc39114610fff5780638462151c1461102f576103ce565b80632f745c59116102ed5780634aa6d417116102805780635c088dcc1161024f5780635c088dcc14610e575780636352211e14610e8157806369d14faf14610eab5780636bd5d59114610ee4576103ce565b80634aa6d41714610cba5780634ac03ec214610de65780634f029c3914610e185780634f6ccce714610e2d576103ce565b80633bdbd5c4116102bc5780633bdbd5c414610add5780633e48e84814610b075780633fef6c2a14610bbf57806342842e0e14610c77576103ce565b80632f745c59146109a457806337859963146109dd5780633949f90614610a955780633af32abf14610aaa576103ce565b80631b689c0b11610365578063271aaab411610334578063271aaab4146107ba5780632790182214610834578063291d95491461085e5780632d9c020514610891576103ce565b80631b689c0b1461066b57806323b872dd1461069557806325b75d68146106d8578063261eb4e514610790576103ce565b8063095ea7b3116103a1578063095ea7b3146105205780630d1706731461055957806310154bad1461061157806318160ddd14610644576103ce565b806301ffc9a7146103d357806306e1db171461041b57806306fdde0314610450578063081812fc146104da575b600080fd5b3480156103df57600080fd5b50610407600480360360208110156103f657600080fd5b50356001600160e01b031916611bbc565b604080519115158252519081900360200190f35b34801561042757600080fd5b5061044e6004803603602081101561043e57600080fd5b50356001600160a01b0316611bdf565b005b34801561045c57600080fd5b50610465611c4d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049f578181015183820152602001610487565b50505050905090810190601f1680156104cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e657600080fd5b50610504600480360360208110156104fd57600080fd5b5035611ce4565b604080516001600160a01b039092168252519081900360200190f35b34801561052c57600080fd5b5061044e6004803603604081101561054357600080fd5b506001600160a01b038135169060200135611d46565b34801561056557600080fd5b5061044e6004803603604081101561057c57600080fd5b81359190810190604081016020820135600160201b81111561059d57600080fd5b8201836020820111156105af57600080fd5b803590602001918460018302840111600160201b831117156105d057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e57945050505050565b34801561061d57600080fd5b5061044e6004803603602081101561063457600080fd5b50356001600160a01b0316611f5c565b34801561065057600080fd5b50610659611fcc565b60408051918252519081900360200190f35b34801561067757600080fd5b506106596004803603602081101561068e57600080fd5b5035611fd2565b3480156106a157600080fd5b5061044e600480360360608110156106b857600080fd5b506001600160a01b03813581169160208101359091169060400135611fe4565b3480156106e457600080fd5b5061044e600480360360408110156106fb57600080fd5b81359190810190604081016020820135600160201b81111561071c57600080fd5b82018360208201111561072e57600080fd5b803590602001918460018302840111600160201b8311171561074f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612039945050505050565b34801561079c57600080fd5b50610465600480360360208110156107b357600080fd5b503561213d565b3480156107c657600080fd5b506107e4600480360360208110156107dd57600080fd5b50356121d8565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610820578181015183820152602001610808565b505050509050019250505060405180910390f35b34801561084057600080fd5b5061044e6004803603602081101561085757600080fd5b503561223a565b34801561086a57600080fd5b5061044e6004803603602081101561088157600080fd5b50356001600160a01b03166122d2565b34801561089d57600080fd5b506108bb600480360360208110156108b457600080fd5b503561233f565b60405180806020018060200184151515158152602001838103835286818151815260200191508051906020019080838360005b838110156109065781810151838201526020016108ee565b50505050905090810190601f1680156109335780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561096657818101518382015260200161094e565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b3480156109b057600080fd5b50610659600480360360408110156109c757600080fd5b506001600160a01b03813516906020013561249f565b3480156109e957600080fd5b5061044e60048036036040811015610a0057600080fd5b81359190810190604081016020820135600160201b811115610a2157600080fd5b820183602082011115610a3357600080fd5b803590602001918460018302840111600160201b83111715610a5457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061251f945050505050565b348015610aa157600080fd5b506105046125ad565b348015610ab657600080fd5b5061040760048036036020811015610acd57600080fd5b50356001600160a01b03166125bc565b348015610ae957600080fd5b5061044e60048036036020811015610b0057600080fd5b50356125d1565b348015610b1357600080fd5b5061044e60048036036040811015610b2a57600080fd5b81359190810190604081016020820135600160201b811115610b4b57600080fd5b820183602082011115610b5d57600080fd5b803590602001918460018302840111600160201b83111715610b7e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061276b945050505050565b348015610bcb57600080fd5b5061044e60048036036040811015610be257600080fd5b81359190810190604081016020820135600160201b811115610c0357600080fd5b820183602082011115610c1557600080fd5b803590602001918460018302840111600160201b83111715610c3657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506127f3945050505050565b348015610c8357600080fd5b5061044e60048036036060811015610c9a57600080fd5b506001600160a01b038135811691602081013590911690604001356128f7565b348015610cc657600080fd5b50610ce460048036036020811015610cdd57600080fd5b5035612912565b6040518080602001878152602001868152602001806020018515151515815260200184151515158152602001838103835289818151815260200191508051906020019080838360005b83811015610d45578181015183820152602001610d2d565b50505050905090810190601f168015610d725780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610da5578181015183820152602001610d8d565b50505050905090810190601f168015610dd25780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b348015610df257600080fd5b5061044e60048036036040811015610e0957600080fd5b50803590602001351515612a9b565b348015610e2457600080fd5b50610659612b9b565b348015610e3957600080fd5b5061065960048036036020811015610e5057600080fd5b5035612ba1565b348015610e6357600080fd5b5061044e60048036036020811015610e7a57600080fd5b5035612c07565b348015610e8d57600080fd5b5061050460048036036020811015610ea457600080fd5b5035612cdf565b348015610eb757600080fd5b5061044e60048036036040811015610ece57600080fd5b50803590602001356001600160a01b0316612d33565b348015610ef057600080fd5b5061044e60048036036040811015610f0757600080fd5b81359190810190604081016020820135600160201b811115610f2857600080fd5b820183602082011115610f3a57600080fd5b803590602001918460018302840111600160201b83111715610f5b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612de9945050505050565b348015610fa857600080fd5b5061065960048036036020811015610fbf57600080fd5b50356001600160a01b0316612e71565b348015610fdb57600080fd5b5061044e60048036036040811015610ff257600080fd5b5080359060200135612ed9565b34801561100b57600080fd5b5061044e6004803603604081101561102257600080fd5b5080359060200135613090565b34801561103b57600080fd5b506107e46004803603602081101561105257600080fd5b50356001600160a01b031661322d565b6106596004803603604081101561107857600080fd5b506001600160a01b03813516906020013561328c565b34801561109a57600080fd5b5061044e600480360360208110156110b157600080fd5b503561349a565b3480156110c457600080fd5b506110e2600480360360208110156110db57600080fd5b5035613576565b604080516001600160a01b0398891681526020810197909752868101959095526060860193909352901515608085015290931660a083015260c082019290925290519081900360e00190f35b34801561113a57600080fd5b506104656004803603604081101561115157600080fd5b50803590602001356135d0565b34801561116a57600080fd5b506111886004803603602081101561118157600080fd5b503561367d565b6040518080602001806020018060200180602001806020018715151515815260200186810386528c818151815260200191508051906020019080838360005b838110156111df5781810151838201526020016111c7565b50505050905090810190601f16801561120c5780820380516001836020036101000a031916815260200191505b5086810385528b5181528b516020918201918d019080838360005b8381101561123f578181015183820152602001611227565b50505050905090810190601f16801561126c5780820380516001836020036101000a031916815260200191505b5086810384528a5181528a516020918201918c019080838360005b8381101561129f578181015183820152602001611287565b50505050905090810190601f1680156112cc5780820380516001836020036101000a031916815260200191505b5086810383528951815289516020918201918b019080838360005b838110156112ff5781810151838201526020016112e7565b50505050905090810190601f16801561132c5780820380516001836020036101000a031916815260200191505b5086810382528851815288516020918201918a019080838360005b8381101561135f578181015183820152602001611347565b50505050905090810190601f16801561138c5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390f35b3480156113af57600080fd5b5061044e600480360360408110156113c657600080fd5b81359190810190604081016020820135600160201b8111156113e757600080fd5b8201836020820111156113f957600080fd5b803590602001918460018302840111600160201b8311171561141a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506139d2945050505050565b34801561146757600080fd5b50610465613a61565b34801561147c57600080fd5b5061044e6004803603604081101561149357600080fd5b5080359060200135613ac2565b3480156114ac57600080fd5b5061044e600480360360208110156114c357600080fd5b5035613b3b565b3480156114d657600080fd5b5061044e600480360360408110156114ed57600080fd5b506001600160a01b0381351690602001351515613bcf565b34801561151157600080fd5b5061044e6004803603604081101561152857600080fd5b81359190810190604081016020820135600160201b81111561154957600080fd5b82018360208201111561155b57600080fd5b803590602001918460018302840111600160201b8311171561157c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613c9b945050505050565b3480156115c957600080fd5b506115e7600480360360208110156115e057600080fd5b5035613d23565b604080516001600160a01b03958616815293909416602084015282840191909152606082015290519081900360800190f35b34801561162557600080fd5b5061044e6004803603604081101561163c57600080fd5b81359190810190604081016020820135600160201b81111561165d57600080fd5b82018360208201111561166f57600080fd5b803590602001918460018302840111600160201b8311171561169057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613d6c945050505050565b3480156116dd57600080fd5b5061044e600480360360608110156116f457600080fd5b813591602081013591810190606081016040820135600160201b81111561171a57600080fd5b82018360208201111561172c57600080fd5b803590602001918460018302840111600160201b8311171561174d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613eb8945050505050565b34801561179a57600080fd5b5061044e600480360360408110156117b157600080fd5b81359190810190604081016020820135600160201b8111156117d257600080fd5b8201836020820111156117e457600080fd5b803590602001918460018302840111600160201b8311171561180557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550614026945050505050565b34801561185257600080fd5b5061044e6004803603608081101561186957600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156118a357600080fd5b8201836020820111156118b557600080fd5b803590602001918460018302840111600160201b831117156118d657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061412a945050505050565b34801561192357600080fd5b506107e46004803603602081101561193a57600080fd5b503561417c565b34801561194d57600080fd5b5061044e6004803603604081101561196457600080fd5b50803590602001356141dc565b34801561197d57600080fd5b5061044e6004803603604081101561199457600080fd5b81359190810190604081016020820135600160201b8111156119b557600080fd5b8201836020820111156119c757600080fd5b803590602001918460018302840111600160201b831117156119e857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550614299945050505050565b348015611a3557600080fd5b5061046560048036036020811015611a4c57600080fd5b503561439d565b348015611a5f57600080fd5b5061044e60048036036020811015611a7657600080fd5b503561479b565b348015611a8957600080fd5b5061044e60048036036020811015611aa057600080fd5b503561481e565b348015611ab357600080fd5b5061044e60048036036060811015611aca57600080fd5b508035906001600160a01b0360208201351690604001356149ca565b348015611af257600080fd5b50610659614aaa565b348015611b0757600080fd5b5061040760048036036040811015611b1e57600080fd5b506001600160a01b0381358116916020013516614ab0565b348015611b4257600080fd5b5061044e60048036036020811015611b5957600080fd5b5035614ade565b61065960048036036020811015611b7657600080fd5b5035614b72565b348015611b8957600080fd5b5061065960048036036020811015611ba057600080fd5b5035614b7e565b348015611bb357600080fd5b50610504614b90565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6013546001600160a01b03163314611c2b576040805162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611cd95780601f10611cae57610100808354040283529160200191611cd9565b820191906000526020600020905b815481529060010190602001808311611cbc57829003601f168201915b505050505090505b90565b6000611cef82614b9f565b611d2a5760405162461bcd60e51b815260040180806020018281038252602c815260200180615d92602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000611d5182612cdf565b9050806001600160a01b0316836001600160a01b03161415611da45760405162461bcd60e51b8152600401808060200182810382526021815260200180615de76021913960400191505060405180910390fd5b336001600160a01b0382161480611dc05750611dc08133614ab0565b611dfb5760405162461bcd60e51b8152600401808060200182810382526038815260200180615ca96038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000828152600b6020526040902060130154829062010000900460ff1615611eb9576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054839060ff1680611ef757506000818152600b602052604090206005015461010090046001600160a01b031633145b611f36576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000848152600b602090815260409091208451611f5592860190615a2b565b5050505050565b6013546001600160a01b03163314611fa8576040805162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b60075490565b600f6020526000908152604090205481565b611fee3382614bbc565b6120295760405162461bcd60e51b8152600401808060200182810382526031815260200180615e086031913960400191505060405180910390fd5b612034838383614c60565b505050565b6000828152600b6020526040902060130154829062010000900460ff161561209b576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054839060ff16806120d957506000818152600b602052604090206005015461010090046001600160a01b031633145b612118576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000848152600b602090815260409091208451611f5592600490920191860190615a2b565b600e6020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156121d05780601f106121a5576101008083540402835291602001916121d0565b820191906000526020600020905b8154815290600101906020018083116121b357829003601f168201915b505050505081565b60008181526011602090815260409182902080548351818402810184019094528084526060939283018282801561222e57602002820191906000526020600020905b81548152602001906001019080831161221a575b50505050509050919050565b6000818152600f6020908152604080832054808452600b9092529091206005015461010090046001600160a01b031633146122aa576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6000828152600f60209081526040808320548352600e90915281206122ce91615aa9565b5050565b6013546001600160a01b0316331461231e576040805162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6001600160a01b03166000908152601460205260409020805460ff19169055565b6000818152600b60209081526040808320600a0180548251601f60026000196101006001861615020190931692909204918201859004850281018501909352808352606094859490939291908301828280156123dc5780601f106123b1576101008083540402835291602001916123dc565b820191906000526020600020905b8154815290600101906020018083116123bf57829003601f168201915b5050506000878152600b60208181526040928390209091018054835160026001831615610100026000190190921691909104601f8101849004840282018401909452838152959850935090915083018282801561247a5780601f1061244f5761010080835404028352916020019161247a565b820191906000526020600020905b81548152906001019060200180831161245d57829003601f168201915b50505060009687525050600b602052604090942060130154929460ff90931692915050565b60006124aa83612e71565b82106124e75760405162461bcd60e51b815260040180806020018281038252602b815260200180615b28602b913960400191505060405180910390fd5b6001600160a01b038316600090815260056020526040902080548390811061250b57fe5b906000526020600020015490505b92915050565b6000828152600b6020526040902060050154829061010090046001600160a01b03163314612582576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6000838152600b6020908152604090912083516125a792600390920191850190615a2b565b50505050565b600c546001600160a01b031681565b60146020526000908152604090205460ff1681565b6000818152600b6020526040902060130154819062010000900460ff1615612633576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054829060ff168061267157506000818152600b602052604090206005015461010090046001600160a01b031633145b6126b0576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000838152600b60205260409020600c0154156126fe5760405162461bcd60e51b8152600401808060200182810382526027815260200180615e656027913960400191505060405180910390fd5b6000838152600b602052604090206005015460ff161561272f576000838152600b6020526040812060120155612746565b6000838152600b6020526040902060016012909101555b50506000908152600b60205260409020600501805460ff19811660ff90911615179055565b6000828152600b6020526040902060050154829061010090046001600160a01b031633146127ce576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6000838152600b6020908152604090912083516125a792600a90920191850190615a2b565b6000828152600b6020526040902060130154829062010000900460ff1615612855576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054839060ff168061289357506000818152600b602052604090206005015461010090046001600160a01b031633145b6128d2576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000848152600b602090815260409091208451611f5592601190920191860190615a2b565b6120348383836040518060200160405280600081525061412a565b6000818152600b60209081526040808320600e0180548251601f600260001961010060018616150201909316929092049182018590048502810185019093528083526060949384938693859384938301828280156129b15780601f10612986576101008083540402835291602001916129b1565b820191906000526020600020905b81548152906001019060200180831161299457829003601f168201915b50505060008a8152600b60209081526040918290206010810154601282015460119092018054855160026001831615610100026000190190921691909104601f8101869004860282018601909652858152979d50909b509099509350909150830182828015612a615780601f10612a3657610100808354040283529160200191612a61565b820191906000526020600020905b815481529060010190602001808311612a4457829003601f168201915b5050506000998a525050600b602052604090972060130154959794969395939460ff62010000860481169563010000009004169350915050565b3360009081526014602052604090205460ff16612af2576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481dda1a5d195b1a5cdd195960821b604482015290519081900360640190fd5b6015546000818152600b6020526040902060058101805460098301869055601383018054630100000063ff00000019909116179055610100600160a81b03191633610100021760ff1916841515179055620f4240600d9091015581612b68576000818152600b6020526040812060120155612b7f565b6000818152600b6020526040902060016012909101555b601554612b9390600163ffffffff614c7f16565b601555505050565b600d5481565b6000612bab611fcc565b8210612be85760405162461bcd60e51b815260040180806020018281038252602c815260200180615e39602c913960400191505060405180910390fd5b60078281548110612bf557fe5b90600052602060002001549050919050565b6000818152600b6020526040902060050154819061010090046001600160a01b03163314612c6a576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6000828152600b602052604090206005015460ff1615612cbb5760405162461bcd60e51b8152600401808060200182810382526031815260200180615e8c6031913960400191505060405180910390fd5b506000908152600b60205260409020601301805460ff19811660ff90911615179055565b6000818152600160205260408120546001600160a01b0316806125195760405162461bcd60e51b8152600401808060200182810382526029815260200180615d0b6029913960400191505060405180910390fd5b33600090815260146020526040902054829060ff1680612d7157506000818152600b602052604090206005015461010090046001600160a01b031633145b612db0576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b506000918252600b602052604090912060050180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000828152600b6020526040902060050154829061010090046001600160a01b03163314612e4c576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6000838152600b6020818152604090922084516125a793919092019190850190615a2b565b60006001600160a01b038216612eb85760405162461bcd60e51b815260040180806020018281038252602a815260200180615ce1602a913960400191505060405180910390fd5b6001600160a01b038216600090815260036020526040902061251990614cd9565b6000828152600b6020526040902060130154829062010000900460ff1615612f3b576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b3360009081526014602052604090205460ff16612f92576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481dda1a5d195b1a5cdd195960821b604482015290519081900360640190fd5b6000838152600b60205260409020600c015415612fe05760405162461bcd60e51b8152600401808060200182810382526038815260200180615bb06038913960400191505060405180910390fd5b6000838152600b602052604090206005015460ff166130305760405162461bcd60e51b815260040180806020018281038252602b815260200180615b85602b913960400191505060405180910390fd5b6064821115801561303f575060015b61307a5760405162461bcd60e51b8152600401808060200182810382526051815260200180615c0c6051913960600191505060405180910390fd5b506000918252600b602052604090912060120155565b6000828152600b6020526040902060130154829062010000900460ff16156130f2576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054839060ff168061313057506000818152600b602052604090206005015461010090046001600160a01b031633145b61316f576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000848152600b60205260409020600c015483116131be5760405162461bcd60e51b815260040180806020018281038252603d815260200180615d34603d913960400191505060405180910390fd5b620f4240831115613216576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f742065786365656420312c3030302c303030000000000000000000604482015290519081900360640190fd5b50506000918252600b6020526040909120600d0155565b606061323882614cdd565b80548060200260200160405190810160405280929190818152602001828054801561222e576020028201919060005260206000209081548152602001906001019080831161221a5750505050509050919050565b6000818152600b60205260408120600901543410156132dc5760405162461bcd60e51b8152600401808060200182810382526025815260200180615ebd6025913960400191505060405180910390fd5b6000828152600b60205260409020600d810154600c9091015461330690600163ffffffff614c7f16565b1115613359576040805162461bcd60e51b815260206004820152601f60248201527f4d757374206e6f7420657863656564206d617820696e766f636174696f6e7300604482015290519081900360640190fd5b6000828152600b6020526040902060130154610100900460ff168061339c57506000828152600b602052604090206005015461010090046001600160a01b031633145b6133ed576040805162461bcd60e51b815260206004820181905260248201527f50726f6a656374206d75737420657869737420616e6420626520616374697665604482015290519081900360640190fd5b6000828152600b60205260409020601301546301000000900460ff16158061343357506000828152600b602052604090206005015461010090046001600160a01b031633145b61347c576040805162461bcd60e51b8152602060048201526015602482015274283ab931b430b9b2b99030b932903830bab9b2b21760591b604482015290519081900360640190fd5b60006134888484614cf7565b905061349383614e83565b9392505050565b3360009081526014602052604090205460ff166134f1576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481dda1a5d195b1a5cdd195960821b604482015290519081900360640190fd5b6000818152600b6020526040902060130154819062010000900460ff1615613553576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b506000908152600b60205260409020601301805462ff0000191662010000179055565b6000908152600b6020526040902060058101546009820154600c830154600d84015460138501546006860154600790960154610100958690046001600160a01b03908116989597949693959390920460ff16939190911691565b6000828152600b60209081526040808320848452600f0182529182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156136705780601f1061364557610100808354040283529160200191613670565b820191906000526020600020905b81548152906001019060200180831161365357829003601f168201915b5050505050905092915050565b6000818152600b602090815260408083208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815260609485948594859485949290919083018282801561371b5780601f106136f05761010080835404028352916020019161371b565b820191906000526020600020905b8154815290600101906020018083116136fe57829003601f168201915b50505050509550600b60008881526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156137cc5780601f106137a1576101008083540402835291602001916137cc565b820191906000526020600020905b8154815290600101906020018083116137af57829003601f168201915b50505060008a8152600b60209081526040918290206002908101805484516001821615610100026000190190911692909204601f8101849004840283018401909452838252959a5094935090915083018282801561386b5780601f106138405761010080835404028352916020019161386b565b820191906000526020600020905b81548152906001019060200180831161384e57829003601f168201915b50505060008a8152600b60209081526040918290206003018054835160026001831615610100026000190190921691909104601f810184900484028201840190945283815295995093509091508301828280156139095780601f106138de57610100808354040283529160200191613909565b820191906000526020600020905b8154815290600101906020018083116138ec57829003601f168201915b50505060008a8152600b60209081526040918290206004018054835160026001831615610100026000190190921691909104601f810184900484028201840190945283815295985093509091508301828280156139a75780601f1061397c576101008083540402835291602001916139a7565b820191906000526020600020905b81548152906001019060200180831161398a57829003601f168201915b5050506000998a525050600b602052604090972060050154959794969395929460ff90931692915050565b6000828152600f6020908152604080832054808452600b9092529091206005015461010090046001600160a01b03163314613a42576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6000838152600e6020908152604090912083516125a792850190615a2b565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611cd95780601f10611cae57610100808354040283529160200191611cd9565b6000828152600b6020526040902060050154829061010090046001600160a01b03163314613b25576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b506000918252600b602052604090912060090155565b6000818152600b6020526040902060050154819061010090046001600160a01b03163314613b9e576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b506000908152600b60205260409020601301805463ff00000019811663010000009182900460ff1615909102179055565b6001600160a01b038216331415613c2d576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000828152600b6020526040902060050154829061010090046001600160a01b03163314613cfe576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6000838152600b6020908152604090912083516125a792600290920191850190615a2b565b6000908152600f60209081526040808320548352600b90915290206005810154600682015460078301546008909301546101009092046001600160a01b03908116949116929190565b6000828152600b6020526040902060130154829062010000900460ff1615613dce576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054839060ff1680613e0c57506000818152600b602052604090206005015461010090046001600160a01b031633145b613e4b576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000848152600b6020908152604080832060108101548452600f0182529091208451613e7992860190615a2b565b506000848152600b6020526040902060100154613e9d90600163ffffffff614c7f16565b6000948552600b602052604090942060100193909355505050565b6000838152600b6020526040902060130154839062010000900460ff1615613f1a576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054849060ff1680613f5857506000818152600b602052604090206005015461010090046001600160a01b031633145b613f97576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000858152600b60205260409020601001548410613ff4576040805162461bcd60e51b81526020600482015260156024820152747363726970744964206f7574206f662072616e676560581b604482015290519081900360640190fd5b6000858152600b60209081526040808320878452600f018252909120845161401e92860190615a2b565b505050505050565b6000828152600b6020526040902060130154829062010000900460ff1615614088576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054839060ff16806140c657506000818152600b602052604090206005015461010090046001600160a01b031633145b614105576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000848152600b602090815260409091208451611f5592600190920191860190615a2b565b614135848484611fe4565b61414184848484615064565b6125a75760405162461bcd60e51b8152600401808060200182810382526032815260200180615b536032913960400191505060405180910390fd5b60008181526010602090815260409182902080548351818402810184019094528084526060939283018282801561222e576020028201919060005260206000209081548152602001906001019080831161221a5750505050509050919050565b6000828152600b6020526040902060050154829061010090046001600160a01b0316331461423f576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6064821115614283576040805162461bcd60e51b815260206004820152600b60248201526a4d6178206f66203130302560a81b604482015290519081900360640190fd5b506000918252600b602052604090912060080155565b6000828152600b6020526040902060130154829062010000900460ff16156142fb576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054839060ff168061433957506000818152600b602052604090206005015461010090046001600160a01b031633145b614378576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000848152600b602090815260409091208451611f5592600e90920191860190615a2b565b6060816143a981614b9f565b6143fa576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604482015290519081900360640190fd5b6000838152600e6020526040902054600260001961010060018416150201909116041561456d576000838152600f60209081526040808320548352600b8083529281902090920180548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845261456693928301828280156144c55780601f1061449a576101008083540402835291602001916144c5565b820191906000526020600020905b8154815290600101906020018083116144a857829003601f168201915b5050506000878152600e60209081526040918290208054835160026001831615610100026000190190921691909104601f81018490048402820184019094528381529450925083018282801561455c5780601f106145315761010080835404028352916020019161455c565b820191906000526020600020905b81548152906001019060200180831161453f57829003601f168201915b5050505050615197565b9150614795565b6000838152600f60209081526040808320548352600b90915290206005015460ff161580156145ba57506000838152600f60209081526040808320548352600b90915290206013015460ff165b156146dc576000838152600f60209081526040808320548352600b8083529281902090920180548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845261456693928301828280156146635780601f1061463857610100808354040283529160200191614663565b820191906000526020600020905b81548152906001019060200180831161464657829003601f168201915b5050506000878152600f60209081526040808320548352600b8252918290206011018054835160026001831615610100026000190190921691909104601f81018490048402820184019094528381529450925083018282801561455c5780601f106145315761010080835404028352916020019161455c565b6000838152600f60209081526040808320548352600b825291829020600a0180548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452614792939283018282801561477f5780601f106147545761010080835404028352916020019161477f565b820191906000526020600020905b81548152906001019060200180831161476257829003601f168201915b505050505061478d856151d3565b615197565b91505b50919050565b3360009081526014602052604090205460ff166147f2576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481dda1a5d195b1a5cdd195960821b604482015290519081900360640190fd5b6000908152600b60205260409020601301805461ff001981166101009182900460ff1615909102179055565b6000818152600b6020526040902060130154819062010000900460ff1615614880576040805162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881d5b9b1bd8dad95960821b604482015290519081900360640190fd5b33600090815260146020526040902054829060ff16806148be57506000818152600b602052604090206005015461010090046001600160a01b031633145b6148fd576040805162461bcd60e51b815260206004820152601a6024820152600080516020615c89833981519152604482015290519081900360640190fd5b6000838152600b6020526040902060100154614960576040805162461bcd60e51b815260206004820152601e60248201527f746865726520617265206e6f207363726970747320746f2072656d6f76650000604482015290519081900360640190fd5b6000838152600b602090815260408083206010810154600019018452600f01909152812061498d91615aa9565b6000838152600b60205260409020601001546149b090600163ffffffff61529416565b6000938452600b6020526040909320601001929092555050565b6000838152600b6020526040902060050154839061010090046001600160a01b03163314614a2d576040805162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b604482015290519081900360640190fd5b6064821115614a71576040805162461bcd60e51b815260206004820152600b60248201526a4d6178206f66203130302560a81b604482015290519081900360640190fd5b506000928352600b60205260409092206006810180546001600160a01b0319166001600160a01b03939093169290921790915560070155565b60155481565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6013546001600160a01b03163314614b2a576040805162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6019811115614b6d576040805162461bcd60e51b815260206004820152600a6024820152694d6178206f662032352560b01b604482015290519081900360640190fd5b600d55565b6000612519338361328c565b60126020526000908152604090205481565b6013546001600160a01b031681565b6000908152600160205260409020546001600160a01b0316151590565b6000614bc782614b9f565b614c025760405162461bcd60e51b815260040180806020018281038252602c815260200180615c5d602c913960400191505060405180910390fd5b6000614c0d83612cdf565b9050806001600160a01b0316846001600160a01b03161480614c485750836001600160a01b0316614c3d84611ce4565b6001600160a01b0316145b80614c585750614c588185614ab0565b949350505050565b614c6b8383836152f1565b614c758382615435565b6120348282615523565b600082820183811015613493576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b5490565b6001600160a01b0316600090815260056020526040902090565b6000818152600b60205260408120600c0154620f42408302810190614d2390600163ffffffff614c7f16565b6000848152600b60205260408120600c01919091555b6000848152600b6020526040902060120154811015614de3576000848152600b60205260408120600c0154614d74438463ffffffff614c7f16565b604080516020808201949094528082019290925233606090811b9083015280516054818403018152607490920181528151918301919091206000868152601184528281208054600181810183559183528583200183905591815260129093529120849055919091019050614d39565b50614dee8482615561565b6000818152600f6020908152604080832086905585835260108252808320805460018101825590845282842001849055858352600b825291829020600c8101546009909101548351918252918101919091528151859284926001600160a01b038916927f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa6669929181900390910190a49392505050565b3415615061576000818152600b602052604081206009015490614eac348363ffffffff61529416565b90508015614ee357604051339082156108fc029083906000818181858888f19350505050158015614ee1573d6000803e3d6000fd5b505b600d54600090614f0a90614efe85606463ffffffff61557e16565b9063ffffffff6155e816565b90508015614f4e57600c546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015614f4c573d6000803e3d6000fd5b505b6000614f60848363ffffffff61529416565b6000868152600b60205260408120600701549192509015614ff3576000868152600b6020526040902060070154614fa290614efe84606463ffffffff61557e16565b90508015614ff3576000868152600b60205260408082206006015490516001600160a01b039091169183156108fc02918491818181858888f19350505050158015614ff1573d6000803e3d6000fd5b505b6000615005838363ffffffff61529416565b9050801561505a576000878152600b60205260408082206005015490516101009091046001600160a01b0316916108fc841502918491818181858888f19350505050158015615058573d6000803e3d6000fd5b505b5050505050505b50565b6000615078846001600160a01b0316615641565b61508457506001614c58565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b838110156150fe5781810151838201526020016150e6565b50505050905090810190601f16801561512b5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561514d57600080fd5b505af1158015615161573d6000803e3d6000fd5b505050506040513d602081101561517757600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b60606134938383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250615647565b6060816151f857506040805180820190915260018152600360fc1b6020820152611bda565b8160005b811561521057600101600a820491506151fc565b6060816040519080825280601f01601f19166020018201604052801561523d576020820181803883390190505b50905060001982015b851561528b57600a860660300160f81b8282806001900393508151811061526957fe5b60200101906001600160f81b031916908160001a905350600a86049550615246565b50949350505050565b6000828211156152eb576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b826001600160a01b031661530482612cdf565b6001600160a01b0316146153495760405162461bcd60e51b8152600401808060200182810382526029815260200180615dbe6029913960400191505060405180910390fd5b6001600160a01b03821661538e5760405162461bcd60e51b8152600401808060200182810382526024815260200180615be86024913960400191505060405180910390fd5b6153978161585b565b6001600160a01b03831660009081526003602052604090206153b890615896565b6001600160a01b03821660009081526003602052604090206153d9906158ad565b60008181526001602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03821660009081526005602052604081205461545f90600163ffffffff61529416565b6000838152600660205260409020549091508082146154fa576001600160a01b038416600090815260056020526040812080548490811061549c57fe5b906000526020600020015490508060056000876001600160a01b03166001600160a01b0316815260200190815260200160002083815481106154da57fe5b600091825260208083209091019290925591825260069052604090208190555b6001600160a01b0384166000908152600560205260409020805490611f55906000198301615aed565b6001600160a01b0390911660009081526005602081815260408084208054868652600684529185208290559282526001810183559183529091200155565b61556b82826158b6565b6155758282615523565b6122ce816159e7565b60008082116155d4576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816155df57fe5b04949350505050565b6000826155f757506000612519565b8282028284828161560457fe5b04146134935760405162461bcd60e51b8152600401808060200182810382526021815260200180615d716021913960400191505060405180910390fd5b3b151590565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f19166020018201604052801561569b576020820181803883390190505b509050806000805b88518110156156f4578881815181106156b857fe5b602001015160f81c60f81b8383806001019450815181106156d557fe5b60200101906001600160f81b031916908160001a9053506001016156a3565b5060005b87518110156157495787818151811061570d57fe5b602001015160f81c60f81b83838060010194508151811061572a57fe5b60200101906001600160f81b031916908160001a9053506001016156f8565b5060005b865181101561579e5786818151811061576257fe5b602001015160f81c60f81b83838060010194508151811061577f57fe5b60200101906001600160f81b031916908160001a90535060010161574d565b5060005b85518110156157f3578581815181106157b757fe5b602001015160f81c60f81b8383806001019450815181106157d457fe5b60200101906001600160f81b031916908160001a9053506001016157a2565b5060005b84518110156158485784818151811061580c57fe5b602001015160f81c60f81b83838060010194508151811061582957fe5b60200101906001600160f81b031916908160001a9053506001016157f7565b50909d9c50505050505050505050505050565b6000818152600260205260409020546001600160a01b03161561506157600090815260026020526040902080546001600160a01b0319169055565b80546158a990600163ffffffff61529416565b9055565b80546001019055565b6001600160a01b038216615911576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61591a81614b9f565b1561596c576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260016020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600390915290206159ab906158ad565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880155565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615a6c57805160ff1916838001178555615a99565b82800160010185558215615a99579182015b82811115615a99578251825591602001919060010190615a7e565b50615aa5929150615b0d565b5090565b50805460018160011615610100020316600290046000825580601f10615acf5750615061565b601f0160209004906000526020600020908101906150619190615b0d565b815481835581811115612034576000838152602090206120349181019083015b611ce191905b80821115615aa55760008155600101615b1356fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e74657243616e206f6e6c79206d6f6469667920686173686573206f6e2064796e616d69632070726f6a656374732e43616e206e6f74206d6f64696679206861736865732067656e657261746564206166746572206120746f6b656e206973206d696e7465642e4552433732313a207472616e7366657220746f20746865207a65726f20616464726573734861736865732067656e657261746564206d757374206265206120706f73697469766520696e746567657220616e64206d6178206861736865732070657220696e766f636174696f6e20617265203130304552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4f6e6c7920617274697374206f722077686974656c69737465640000000000004552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e596f75206d75737420736574206d617820696e766f636174696f6e732067726561746572207468616e2063757272656e7420696e766f636174696f6e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e647343616e206e6f7420737769746368206166746572206120746f6b656e206973206d696e7465642e63616e206f6e6c7920736574207374617469632049504653206861736820666f72207374617469632070726f6a656374734d7573742073656e64206174206c65617374207072696365506572546f6b656e496e576569a265627a7a72315820976d360951652974035ad71f15bebdd3d7a273fb75f6638b988debb52e8f476f64736f6c6343000511003200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a41727420426c6f636b73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006424c4f434b530000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

30068:17546:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1983:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1983:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1983:135:0;-1:-1:-1;;;;;;1983:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;35872:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35872:139:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35872:139:0;-1:-1:-1;;;;;35872:139:0;;:::i;:::-;;27340:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27340:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27340:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13250:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13250:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13250:204:0;;:::i;:::-;;;;-1:-1:-1;;;;;13250:204:0;;;;;;;;;;;;;;12821:421;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12821:421:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12821:421:0;;;;;;;;:::i;37991:202::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37991:202:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37991:202:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37991:202:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37991:202:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;37991:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37991:202:0;;-1:-1:-1;37991:202:0;;-1:-1:-1;;;;;37991:202:0:i;36230:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36230:108:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36230:108:0;-1:-1:-1;;;;;36230:108:0;;:::i;19691:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19691:96:0;;;:::i;:::-;;;;;;;;;;;;;;;;31334:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31334:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31334:53:0;;:::i;13873:290::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13873:290:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13873:290:0;;;;;;;;;;;;;;;;;:::i;39500:214::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39500:214:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39500:214:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;39500:214:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39500:214:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39500:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39500:214:0;;-1:-1:-1;39500:214:0;;-1:-1:-1;;;;;39500:214:0:i;31274:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31274:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31274:53:0;;:::i;46096:129::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46096:129:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46096:129:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46096:129:0;;;;;;;;;;;;;;;;;43532:173;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43532:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43532:173:0;;:::i;36346:112::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36346:112:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36346:112:0;-1:-1:-1;;;;;36346:112:0;;:::i;45604:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45604:334:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45604:334:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45604:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45604:334:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45604:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19300:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19300:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19300:232:0;;;;;;;;:::i;39316:176::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39316:176:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39316:176:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;39316:176:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39316:176:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39316:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39316:176:0;;-1:-1:-1;39316:176:0;;-1:-1:-1;;;;;39316:176:0:i;31180:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31180:39:0;;;:::i;31604:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31604:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31604:45:0;-1:-1:-1;;;;;31604:45:0;;:::i;42855:463::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42855:463:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42855:463:0;;:::i;42187:175::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42187:175:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42187:175:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;42187:175:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42187:175:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42187:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42187:175:0;;-1:-1:-1;42187:175:0;;-1:-1:-1;;;;;42187:175:0:i;41975:204::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41975:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41975:204:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41975:204:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41975:204:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41975:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41975:204:0;;-1:-1:-1;41975:204:0;;-1:-1:-1;;;;;41975:204:0:i;14171:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14171:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14171:134:0;;;;;;;;;;;;;;;;;:::i;44932:493::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44932:493:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44932:493:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44932:493:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44932:493:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44932:493:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37166:609;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37166:609:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37166:609:0;;;;;;;;;:::i;31226:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31226:39:0;;;:::i;20133:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20133:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20133:199:0;;:::i;42577:270::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42577:270:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42577:270:0;;:::i;12585:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12585:228:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12585:228:0;;:::i;36791:201::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36791:201:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36791:201:0;;;;;;-1:-1:-1;;;;;36791:201:0;;:::i;42370:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42370:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42370:199:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;42370:199:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42370:199:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42370:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42370:199:0;;-1:-1:-1;42370:199:0;;-1:-1:-1;;;;;42370:199:0:i;12366:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12366:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12366:211:0;-1:-1:-1;;;;;12366:211:0;;:::i;40164:528::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40164:528:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40164:528:0;;;;;;;:::i;39722:434::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39722:434:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39722:434:0;;;;;;;:::i;46233:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46233:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46233:126:0;-1:-1:-1;;;;;46233:126:0;;:::i;32946:730::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;32946:730:0;;;;;;;;:::i;36472:152::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36472:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36472:152:0;;:::i;44231:693::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44231:693:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44231:693:0;;:::i;:::-;;;;-1:-1:-1;;;;;44231:693:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45433:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45433:163:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45433:163:0;;;;;;;:::i;43713:510::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43713:510:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43713:510:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43713:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43713:510:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43713:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43713:510:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43713:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43713:510:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43713:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43713:510:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43713:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43326:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43326:198:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43326:198:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;43326:198:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43326:198:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;43326:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43326:198:0;;-1:-1:-1;43326:198:0;;-1:-1:-1;;;;;43326:198:0:i;27539:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27539:89:0;;;:::i;37783:200::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37783:200:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37783:200:0;;;;;;;:::i;37000:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37000:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37000:158:0;;:::i;13462:248::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13462:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13462:248:0;;;;;;;;;;:::i;39116:192::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39116:192:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39116:192:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;39116:192:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39116:192:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39116:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39116:192:0;;-1:-1:-1;39116:192:0;;-1:-1:-1;;;;;39116:192:0:i;46367:529::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46367:529:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46367:529:0;;:::i;:::-;;;;-1:-1:-1;;;;;46367:529:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40700:313;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40700:313:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40700:313:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;40700:313:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40700:313:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40700:313:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40700:313:0;;-1:-1:-1;40700:313:0;;-1:-1:-1;;;;;40700:313:0:i;41021:316::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41021:316:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41021:316:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41021:316:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41021:316:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41021:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41021:316:0;;-1:-1:-1;41021:316:0;;-1:-1:-1;;;;;41021:316:0:i;38201:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38201:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38201:222:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;38201:222:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38201:222:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38201:222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38201:222:0;;-1:-1:-1;38201:222:0;;-1:-1:-1;;;;;38201:222:0:i;14313:268::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14313:268:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;14313:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;14313:268:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14313:268:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14313:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;14313:268:0;;-1:-1:-1;14313:268:0;;-1:-1:-1;;;;;14313:268:0:i;45946:142::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45946:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45946:142:0;;:::i;38829:279::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38829:279:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38829:279:0;;;;;;;:::i;41741:226::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41741:226:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41741:226:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41741:226:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41741:226:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41741:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41741:226:0;;-1:-1:-1;41741:226:0;;-1:-1:-1;;;;;41741:226:0:i;46904:707::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46904:707:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46904:707:0;;:::i;36632:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36632:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36632:151:0;;:::i;41345:388::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41345:388:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41345:388:0;;:::i;38431:390::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38431:390:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38431:390:0;;;-1:-1:-1;;;;;38431:390:0;;;;;;;;;;:::i;31658:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31658:28:0;;;:::i;13718:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13718:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13718:147:0;;;;;;;;;;:::i;36019:203::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36019:203:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36019:203:0;;:::i;32798:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32798:140:0;;:::i;31520:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31520:48:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31520:48:0;;:::i;31577:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31577:20:0;;;:::i;1983:135::-;-1:-1:-1;;;;;;2077:33:0;;2053:4;2077:33;;;;;;;;;;;;;1983:135;;;;:::o;35872:139::-;32174:5;;-1:-1:-1;;;;;32174:5:0;32160:10;:19;32152:42;;;;;-1:-1:-1;;;32152:42:0;;;;;;;;;;;;-1:-1:-1;;;32152:42:0;;;;;;;;;;;;;;;35967:16;:36;;-1:-1:-1;;;;;;35967:36:0;-1:-1:-1;;;;;35967:36:0;;;;;;;;;;35872:139::o;27340:85::-;27412:5;27405:12;;;;;;;;-1:-1:-1;;27405:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27379:13;;27405:12;;27412:5;;27405:12;;27412:5;27405:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27340:85;;:::o;13250:204::-;13309:7;13337:16;13345:7;13337;:16::i;:::-;13329:73;;;;-1:-1:-1;;;13329:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13422:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;13422:24:0;;13250:204::o;12821:421::-;12885:13;12901:16;12909:7;12901;:16::i;:::-;12885:32;;12942:5;-1:-1:-1;;;;;12936:11:0;:2;-1:-1:-1;;;;;12936:11:0;;;12928:57;;;;-1:-1:-1;;;12928:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13006:10;-1:-1:-1;;;;;13006:19:0;;;;:58;;;13029:35;13046:5;13053:10;13029:16;:35::i;:::-;12998:150;;;;-1:-1:-1;;;12998:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13161:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;13161:29:0;-1:-1:-1;;;;;13161:29:0;;;;;;;;;13206:28;;13161:24;;13206:28;;;;;;;12821:421;;;:::o;37991:202::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;38115:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;38145:20;;;;:8;:20;;;;;;;;:40;;;;;;;;:::i;:::-;;31952:1;37991:202;;;:::o;36230:108::-;32174:5;;-1:-1:-1;;;;;32174:5:0;32160:10;:19;32152:42;;;;;-1:-1:-1;;;32152:42:0;;;;;;;;;;;;-1:-1:-1;;;32152:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36300:23:0;;;;;:13;:23;;;;;:30;;-1:-1:-1;;36300:30:0;36326:4;36300:30;;;36230:108::o;19691:96::-;19762:10;:17;19691:96;:::o;31334:53::-;;;;;;;;;;;;;:::o;13873:290::-;14017:39;14036:10;14048:7;14017:18;:39::i;:::-;14009:101;;;;-1:-1:-1;;;14009:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14123:32;14137:4;14143:2;14147:7;14123:13;:32::i;:::-;13873:290;;;:::o;39500:214::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;39630:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;39660:20;;;;:8;:20;;;;;;;;:46;;;;:28;;;;;:46;;;;:::i;31274:53::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31274:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46096:129::-;46192:25;;;;:15;:25;;;;;;;;;46185:32;;;;;;;;;;;;;;;;;46157:16;;46185:32;;;46192:25;46185:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46096:129;;;:::o;43532:173::-;43593:28;;;;:18;:28;;;;;;;;;32042:20;;;:8;:20;;;;;;:34;;;;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;43648:49;43668:28;;;:18;:28;;;;;;;;;43648:49;;:19;:49;;;;;43641:56;;;:::i;:::-;43532:173;;:::o;36346:112::-;32174:5;;-1:-1:-1;;;;;32174:5:0;32160:10;:19;32152:42;;;;;-1:-1:-1;;;32152:42:0;;;;;;;;;;;;-1:-1:-1;;;32152:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36419:23:0;36445:5;36419:23;;;:13;:23;;;;;:31;;-1:-1:-1;;36419:31:0;;;36346:112::o;45604:334::-;45733:12;45775:20;;;:8;:20;;;;;;;;:35;;45758:52;;;;;;-1:-1:-1;;45758:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45669:28;;;;45733:12;;45758:52;45775:35;45758:52;;;45775:35;45758:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45842:20:0;;;;:8;:20;;;;;;;;;:39;;;45821:60;;;;;;;;;;;-1:-1:-1;;45821:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;45758:52;;-1:-1:-1;45842:39:0;-1:-1:-1;45821:60:0;;-1:-1:-1;45821:60:0;;45842:39;45821:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45902:20:0;;;;-1:-1:-1;;45902:8:0;:20;;;;;;:28;;;45604:334;;45902:28;;;;;45604:334;-1:-1:-1;;45604:334:0:o;19300:232::-;19380:7;19416:16;19426:5;19416:9;:16::i;:::-;19408:5;:24;19400:80;;;;-1:-1:-1;;;19400:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19498:19:0;;;;;;:12;:19;;;;;:26;;19518:5;;19498:26;;;;;;;;;;;;;;19491:33;;19300:232;;;;;:::o;39316:176::-;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;39438:20;;;;:8;:20;;;;;;;;:46;;;;:28;;;;;:46;;;;:::i;:::-;;39316:176;;;:::o;31180:39::-;;;-1:-1:-1;;;;;31180:39:0;;:::o;31604:45::-;;;;;;;;;;;;;;;:::o;42855:463::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;42956:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;42992:20;;;;:8;:20;;;;;:32;;;:37;42984:89;;;;-1:-1:-1;;;42984:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43088:20;;;;:8;:20;;;;;:28;;;;;43084:156;;;43163:1;43133:20;;;:8;:20;;;;;:27;;:31;43084:156;;;43197:20;;;;:8;:20;;;;;43227:1;43197:27;;;;:31;43084:156;-1:-1:-1;;43282:20:0;;;;:8;:20;;;;;:28;;;;-1:-1:-1;;43250:60:0;;43282:28;;;;43281:29;43250:60;;;42855:463::o;42187:175::-;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;42305:20;;;;:8;:20;;;;;;;;:49;;;;:35;;;;;:49;;;;:::i;41975:204::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;42100:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;42130:20;;;;:8;:20;;;;;;;;:41;;;;:29;;;;;:41;;;;:::i;14171:134::-;14258:39;14275:4;14281:2;14285:7;14258:39;;;;;;;;;;;;:16;:39::i;44932:493::-;45026:19;45137:20;;;:8;:20;;;;;;;;:31;;45124:44;;;;;;-1:-1:-1;;45124:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45000:24;;45026:19;;;45000:24;;45026:19;;;;45124:44;;45137:31;45124:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45193:20:0;;;;:8;:20;;;;;;;;;:32;;;;45245:27;;;;45294:29;;;;45283:40;;;;;;;;;;;-1:-1:-1;;45283:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;45124:44;;-1:-1:-1;45193:32:0;;-1:-1:-1;45245:27:0;;-1:-1:-1;45294:29:0;-1:-1:-1;45283:40:0;;-1:-1:-1;45283:40:0;;45294:29;45283:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45343:20:0;;;;-1:-1:-1;;45343:8:0;:20;;;;;;:27;;;44932:493;;;;;;45283:40;;45343:27;;;;;;;45390;;;;;-1:-1:-1;44932:493:0;-1:-1:-1;;44932:493:0:o;37166:609::-;32282:10;32268:25;;;;:13;:25;;;;;;;;32260:54;;;;;-1:-1:-1;;;32260:54:0;;;;;;;;;;;;-1:-1:-1;;;32260:54:0;;;;;;;;;;;;;;;37286:13;;37266:17;37310:19;;;:8;:19;;;;;:33;;;:46;;37367:38;;;:60;;;37438:26;;;:31;;;-1:-1:-1;;37438:31:0;;;;;;-1:-1:-1;;;;;;37310:46:0;37346:10;37310:46;;;-1:-1:-1;;37480:36:0;;;;;;;31119:9;37527:34;;;;:48;37480:36;37586:135;;37645:1;37616:19;;;:8;:19;;;;;:26;;:30;37586:135;;;37679:19;;;;:8;:19;;;;;37708:1;37679:26;;;;:30;37586:135;37747:13;;:20;;37765:1;37747:20;:17;:20;:::i;:::-;37731:13;:36;-1:-1:-1;;;37166:609:0:o;31226:39::-;;;;:::o;20133:199::-;20191:7;20227:13;:11;:13::i;:::-;20219:5;:21;20211:78;;;;-1:-1:-1;;;20211:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20307:10;20318:5;20307:17;;;;;;;;;;;;;;;;20300:24;;20133:199;;;:::o;42577:270::-;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;42686:20;;;;:8;:20;;;;;:28;;;;;42685:29;42677:91;;;;-1:-1:-1;;;42677:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42811:20:0;;;;:8;:20;;;;;:28;;;;-1:-1:-1;;42779:60:0;;42811:28;;;;42810:29;42779:60;;;42577:270::o;12585:228::-;12640:7;12676:20;;;:11;:20;;;;;;-1:-1:-1;;;;;12676:20:0;12715:19;12707:73;;;;-1:-1:-1;;;12707:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36791:201;32428:10;32414:25;;;;:13;:25;;;;;;36910:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;-1:-1:-1;36933:20:0;;;;:8;:20;;;;;;:34;;:51;;-1:-1:-1;;;;;36933:51:0;;;;;-1:-1:-1;;;;;;36933:51:0;;;;;;;;;36791:201::o;42370:199::-;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;42500:20;;;;:8;:20;;;;;;;;:61;;;;:39;;;;;:61;;;;;:::i;12366:211::-;12421:7;-1:-1:-1;;;;;12449:19:0;;12441:74;;;;-1:-1:-1;;;12441:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12535:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;40164:528::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32282:10;32268:25;;;;:13;:25;;;;;;;;32260:54;;;;;-1:-1:-1;;;32260:54:0;;;;;;;;;;;;-1:-1:-1;;;32260:54:0;;;;;;;;;;;;;;;40308:20;;;;:8;:20;;;;;:32;;;:37;40300:106;;;;-1:-1:-1;;;40300:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40425:20;;;;:8;:20;;;;;:28;;;;;40417:84;;;;-1:-1:-1;;;40417:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40531:3;40520:7;:14;;:30;;;;-1:-1:-1;40538:12:0;40520:30;40512:124;;;;-1:-1:-1;;;40512:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40647:20:0;;;;:8;:20;;;;;;:27;;:37;40164:528::o;39722:434::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;39853:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;39909:20;;;;:8;:20;;;;;:32;;;39891:50;;39883:124;;;;-1:-1:-1;;;39883:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31119:9;40026:15;:30;;40018:66;;;;;-1:-1:-1;;;40018:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40095:20:0;;;;:8;:20;;;;;;:35;;:53;39722:434::o;46233:126::-;46294:16;46330:21;46345:5;46330:14;:21::i;:::-;46323:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46233:126;;;:::o;32946:730::-;33023:16;33073:20;;;:8;:20;;;;;:39;;;33060:9;:52;;33052:102;;;;-1:-1:-1;;;33052:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33216:20;;;;:8;:20;;;;;:35;;;;33173:32;;;;;:39;;33210:1;33173:39;:36;:39;:::i;:::-;:78;;33165:122;;;;;-1:-1:-1;;;33165:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33306:20;;;;:8;:20;;;;;:27;;;;;;;;;:79;;-1:-1:-1;33351:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;33351:34:0;33337:10;:48;33306:79;33298:124;;;;;-1:-1:-1;;;33298:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33442:20;;;;:8;:20;;;;;:27;;;;;;;;33441:28;;:80;;-1:-1:-1;33487:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;33487:34:0;33473:10;:48;33441:80;33433:114;;;;;-1:-1:-1;;;33433:114:0;;;;;;;;;;;;-1:-1:-1;;;33433:114:0;;;;;;;;;;;;;;;33560:15;33578:27;33589:3;33594:10;33578;:27::i;:::-;33560:45;;33618:23;33630:10;33618:11;:23::i;:::-;33661:7;32946:730;-1:-1:-1;;;32946:730:0:o;36472:152::-;32282:10;32268:25;;;;:13;:25;;;;;;;;32260:54;;;;;-1:-1:-1;;;32260:54:0;;;;;;;;;;;;-1:-1:-1;;;32260:54:0;;;;;;;;;;;;;;;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;-1:-1:-1;36582:20:0;;;;:8;:20;;;;;:27;;:34;;-1:-1:-1;;36582:34:0;;;;;36472:152::o;44231:693::-;44298:21;44494:20;;;:8;:20;;;;;:34;;;;44560:39;;;;44624:32;;;;44684:35;;;;44739:27;;;;44795:36;;;;44870:46;;;;;44494:34;;;;;-1:-1:-1;;;;;44494:34:0;;;;44560:39;;44624:32;;44684:35;;44739:27;;;;;;;44795:36;;;;;44231:693::o;45433:163::-;45552:20;;;;:8;:20;;;;;;;;:36;;;:28;;:36;;;;;;45545:43;;;;;;-1:-1:-1;;45545:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45520:13;;45545:43;;;45552:36;45545:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45433:163;;;;:::o;43713:510::-;43900:12;43939:20;;;:8;:20;;;;;;;;43925:39;;;;;;;;;;;-1:-1:-1;;43925:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;43778:25;;;;;;;;;;43925:39;43939:20;;43925:39;;;43939:20;43925:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43984:8;:20;43993:10;43984:20;;;;;;;;;;;:27;;43975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44036:20:0;;;;:8;:20;;;;;;;;;:32;;;;44022:46;;;;;;;;;;-1:-1:-1;;44022:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;43975:36;;-1:-1:-1;44022:46:0;44036:32;-1:-1:-1;44022:46:0;;-1:-1:-1;44022:46:0;;44036:32;44022:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44089:20:0;;;;:8;:20;;;;;;;;;:28;;44079:38;;;;;;;;;;;-1:-1:-1;;44079:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;44022:46;;-1:-1:-1;44089:28:0;-1:-1:-1;44079:38:0;;-1:-1:-1;44079:38:0;;44089:28;44079:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44138:20:0;;;;:8;:20;;;;;;;;;:28;;44128:38;;;;;;;;;;;-1:-1:-1;;44128:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;44079;;-1:-1:-1;44138:28:0;-1:-1:-1;44128:38:0;;-1:-1:-1;44128:38:0;;44138:28;44128:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44187:20:0;;;;-1:-1:-1;;44187:8:0;:20;;;;;;:28;;;43713:510;;;;;;;;44187:28;;;;;43713:510;-1:-1:-1;;43713:510:0:o;43326:198::-;43427:28;;;;:18;:28;;;;;;;;;32042:20;;;:8;:20;;;;;;:34;;;;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;43475:29;;;;:19;:29;;;;;;;;:41;;;;;;;;:::i;27539:89::-;27613:7;27606:14;;;;;;;;-1:-1:-1;;27606:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27580:13;;27606:14;;27613:7;;27606:14;;27613:7;27606:14;;;;;;;;;;;;;;;;;;;;;;;;37783:200;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;-1:-1:-1;37914:20:0;;;;:8;:20;;;;;;:39;;:61;37783:200::o;37000:158::-;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;-1:-1:-1;37123:20:0;;;;:8;:20;;;;;:27;;;;-1:-1:-1;;37092:58:0;;37123:27;;;;;;;37122:28;37092:58;;;;;;37000:158::o;13462:248::-;-1:-1:-1;;;;;13542:16:0;;13548:10;13542:16;;13534:54;;;;;-1:-1:-1;;;13534:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13620:10;13601:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;13601:34:0;;;;;;;;;;;;:45;;-1:-1:-1;;13601:45:0;;;;;;;;;;13662:40;;;;;;;13601:34;;13620:10;13662:40;;;;;;;;;;;13462:248;;:::o;39116:192::-;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;39246:20;;;;:8;:20;;;;;;;;:54;;;;:32;;;;;:54;;;;:::i;46367:529::-;46430:21;46573:28;;;:18;:28;;;;;;;;;46564:38;;:8;:38;;;;;:52;;;;46645:54;;;;46738:64;;;;46830:58;;;;;46564:52;;;;-1:-1:-1;;;;;46564:52:0;;;;46645:54;;;46738:64;46830:58;46367:529::o;40700:313::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;40818:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;40848:20;;;;:8;:20;;;;;;;;40877:32;;;;40848:62;;:28;;:62;;;;;:72;;;;;;;;:::i;:::-;-1:-1:-1;40966:20:0;;;;:8;:20;;;;;:32;;;:39;;41003:1;40966:39;:36;:39;:::i;:::-;40931:20;;;;:8;:20;;;;;;:32;;:74;;;;-1:-1:-1;;;40700:313:0:o;41021:316::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;41161:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;41211:20;;;;:8;:20;;;;;:32;;;41199:44;;41191:78;;;;;-1:-1:-1;;;41191:78:0;;;;;;;;;;;;-1:-1:-1;;;41191:78:0;;;;;;;;;;;;;;;41280:20;;;;:8;:20;;;;;;;;:39;;;:28;;:39;;;;;:49;;;;;;;;:::i;:::-;;31952:1;41021:316;;;;:::o;38201:222::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;38337:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;38367:20;;;;:8;:20;;;;;;;;:48;;;;:27;;;;;:48;;;;:::i;14313:268::-;14420:31;14433:4;14439:2;14443:7;14420:12;:31::i;:::-;14470:48;14493:4;14499:2;14503:7;14512:5;14470:22;:48::i;:::-;14462:111;;;;-1:-1:-1;;;14462:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45946:142;46049:31;;;;:19;:31;;;;;;;;;46042:38;;;;;;;;;;;;;;;;;46014:16;;46042:38;;;46049:31;46042:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45946:142;;;:::o;38829:279::-;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;39007:3;38983:20;:27;;38975:51;;;;;-1:-1:-1;;;38975:51:0;;;;;;;;;;;;-1:-1:-1;;;38975:51:0;;;;;;;;;;;;;;;-1:-1:-1;39037:20:0;;;;:8;:20;;;;;;:40;;:63;38829:279::o;41741:226::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;41877:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;41907:20;;;;:8;:20;;;;;;;;:52;;;;:31;;;;;:52;;;;:::i;46904:707::-;46990:13;46971:8;31758:17;31766:8;31758:7;:17::i;:::-;31750:53;;;;;-1:-1:-1;;;31750:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47066:1;47026:29;;;:19;:29;;;;;47020:43;;-1:-1:-1;;47020:43:0;;;;;;;;;;;:47;47016:194;;47109:38;47118:28;;;:18;:28;;;;;;;;;47109:38;;:8;:38;;;;;;;:57;;;47091:107;;;;;;-1:-1:-1;;47091:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47109:57;47091:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47168:29:0;;;;:19;:29;;;;;;;;;47091:107;;;;;;;;;;;-1:-1:-1;;47091:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47168:29:0;-1:-1:-1;47091:107:0;;47168:29;47091:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:107::i;:::-;47084:114;;;;47016:194;47227:38;47236:28;;;:18;:28;;;;;;;;;47227:38;;:8;:38;;;;;:46;;;;;47226:47;:97;;;;-1:-1:-1;47277:38:0;47286:28;;;:18;:28;;;;;;;;;47277:38;;:8;:38;;;;;:46;;;;;47226:97;47222:262;;;47365:38;47374:28;;;:18;:28;;;;;;;;;47365:38;;:8;:38;;;;;;;:57;;;47347:125;;;;;;-1:-1:-1;;47347:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47365:57;47347:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47424:38:0;47433:28;;;:18;:28;;;;;;;;;47424:38;;:8;:38;;;;;;:47;;47347:125;;;;;;;;;;;-1:-1:-1;;47347:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47424:47:0;-1:-1:-1;47347:125:0;;47424:47;47347:125;;;;;;;;;;;;;;;;;;;;;;;;47222:262;47521:38;47530:28;;;:18;:28;;;;;;;;;47521:38;;:8;:38;;;;;;:53;;47503:100;;;;;;-1:-1:-1;;47503:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47521:53;47503:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47576:26;47593:8;47576:16;:26::i;:::-;47503:17;:100::i;:::-;47496:107;;31814:1;46904:707;;;;:::o;36632:151::-;32282:10;32268:25;;;;:13;:25;;;;;;;;32260:54;;;;;-1:-1:-1;;;32260:54:0;;;;;;;;;;;;-1:-1:-1;;;32260:54:0;;;;;;;;;;;;;;;36748:20;;;;:8;:20;;;;;:27;;;;-1:-1:-1;;36717:58:0;;36748:27;;;;;;;36747:28;36717:58;;;;;;36632:151::o;41345:388::-;31893:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;31892:28;31884:57;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;-1:-1:-1;;;31884:57:0;;;;;;;;;;;;;;;32428:10;32414:25;;;;:13;:25;;;;;;41447:10;;32414:25;;;:77;;-1:-1:-1;32457:20:0;;;;:8;:20;;;;;:34;;;;;;-1:-1:-1;;;;;32457:34:0;32443:10;:48;32414:77;32406:116;;;;;-1:-1:-1;;;32406:116:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32406:116:0;;;;;;;;;;;;;;;41520:1;41485:20;;;:8;:20;;;;;:32;;;41477:79;;;;;-1:-1:-1;;;41477:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41574:20;;;;:8;:20;;;;;;;;41603:32;;;;-1:-1:-1;;41603:36:0;41574:66;;:28;;:66;;;;;41567:73;;;:::i;:::-;41686:20;;;;:8;:20;;;;;:32;;;:39;;41723:1;41686:39;:36;:39;:::i;:::-;41651:20;;;;:8;:20;;;;;;:32;;:74;;;;-1:-1:-1;;41345:388:0:o;38431:390::-;32042:20;;;;:8;:20;;;;;:34;;;:20;;:34;;;-1:-1:-1;;;;;32042:34:0;32028:10;:48;32020:72;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;-1:-1:-1;;;32020:72:0;;;;;;;;;;;;;;;38642:3;38612:26;:33;;38604:57;;;;;-1:-1:-1;;;38604:57:0;;;;;;;;;;;;-1:-1:-1;;;38604:57:0;;;;;;;;;;;;;;;-1:-1:-1;38672:20:0;;;;:8;:20;;;;;;:36;;;:55;;-1:-1:-1;;;;;;38672:55:0;-1:-1:-1;;;;;38672:55:0;;;;;;;;;;;38738:46;;:75;38431:390::o;31658:28::-;;;;:::o;13718:147::-;-1:-1:-1;;;;;13822:25:0;;;13798:4;13822:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;13718:147::o;36019:203::-;32174:5;;-1:-1:-1;;;;;32174:5:0;32160:10;:19;32152:42;;;;;-1:-1:-1;;;32152:42:0;;;;;;;;;;;;-1:-1:-1;;;32152:42:0;;;;;;;;;;;;;;;36144:2;36120:20;:26;;36112:49;;;;;-1:-1:-1;;;36112:49:0;;;;;;;;;;;;-1:-1:-1;;;36112:49:0;;;;;;;;;;;;;;;36172:19;:42;36019:203::o;32798:140::-;32860:16;32896:34;32907:10;32919;32896;:34::i;31520:48::-;;;;;;;;;;;;;:::o;31577:20::-;;;-1:-1:-1;;;;;31577:20:0;;:::o;14589:155::-;14646:4;14679:20;;;:11;:20;;;;;;-1:-1:-1;;;;;14679:20:0;14717:19;;;14589:155::o;14752:333::-;14837:4;14862:16;14870:7;14862;:16::i;:::-;14854:73;;;;-1:-1:-1;;;14854:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14938:13;14954:16;14962:7;14954;:16::i;:::-;14938:32;;15000:5;-1:-1:-1;;;;;14989:16:0;:7;-1:-1:-1;;;;;14989:16:0;;:51;;;;15033:7;-1:-1:-1;;;;;15009:31:0;:20;15021:7;15009:11;:20::i;:::-;-1:-1:-1;;;;;15009:31:0;;14989:51;:87;;;;15044:32;15061:5;15068:7;15044:16;:32::i;:::-;14981:96;14752:333;-1:-1:-1;;;;14752:333:0:o;20716:245::-;20802:38;20822:4;20828:2;20832:7;20802:19;:38::i;:::-;20853:47;20886:4;20892:7;20853:32;:47::i;:::-;20913:40;20941:2;20945:7;20913:27;:40::i;5772:181::-;5830:7;5862:5;;;5886:6;;;;5878:46;;;;;-1:-1:-1;;;5878:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10193:114;10285:14;;10193:114::o;22296:126::-;-1:-1:-1;;;;;22395:19:0;22358:17;22395:19;;;:12;:19;;;;;;22296:126::o;33684:899::-;33755:16;33837:20;;;:8;:20;;;;;:32;;;31119:9;33809:24;;33808:61;;;33917:39;;33954:1;33917:39;:36;:39;:::i;:::-;33882:20;;;;:8;:20;;;;;:32;;:74;;;;33969:296;33993:20;;;;:8;:20;;;;;:27;;;33989:31;;33969:296;;;34042:12;34084:20;;;:8;:20;;;;;:32;;;34118:19;:12;34135:1;34118:19;:16;:19;:::i;:::-;34067:83;;;;;;;;;;;;;;;;;;34139:10;34067:83;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;34067:83:0;;;;;;34057:94;;;;;;;;;-1:-1:-1;34166:28:0;;;:15;:28;;;;;27:10:-1;;39:1;23:18;;;45:23;;34166:39:0;;;;;;;;;;34220:19;;;:13;:19;;;;;:33;;;34022:3;;;;;-1:-1:-1;33969:296:0;;;;34277:23;34283:3;34288:11;34277:5;:23::i;:::-;34313:31;;;;:18;:31;;;;;;;;:44;;;34368:31;;;:19;:31;;;;;27:10:-1;;39:1;23:18;;45:23;;34368:49:0;;;;;;;;;;34470:20;;;:8;:20;;;;;;:32;;;;34504:39;;;;;34435:109;;;;;;;;;;;;;;34347:10;;34332:11;;-1:-1:-1;;;;;34435:109:0;;;;;;;;;;;;;;34564:11;33684:899;-1:-1:-1;;;33684:899:0:o;34591:1273::-;34656:9;:13;34652:1205;;34688:26;34717:20;;;:8;:20;;;;;:39;;;;34788:54;:9;34717:39;34788:54;:13;:54;:::i;:::-;34771:71;-1:-1:-1;34863:10:0;;34859:78;;34894:27;;:10;;:27;;;;;34914:6;;34894:27;;;;34914:6;34894:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34894:27:0;34859:78;35012:19;;34953:24;;34980:52;;:27;:18;35003:3;34980:27;:22;:27;:::i;:::-;:31;:52;:31;:52;:::i;:::-;34953:79;-1:-1:-1;35051:20:0;;35047:104;;35092:16;;:43;;-1:-1:-1;;;;;35092:16:0;;;;:43;;;;;35118:16;;35092;:43;:16;:43;35118:16;35092;:43;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35092:43:0;35047:104;35167:20;35190:40;:18;35213:16;35190:40;:22;:40;:::i;:::-;35247:29;35295:20;;;:8;:20;;;;;:46;;;35167:63;;-1:-1:-1;35247:29:0;35295:50;35291:348;;35416:20;;;;:8;:20;;;;;:46;;;35390:73;;:21;:12;35407:3;35390:21;:16;:21;:::i;:73::-;35366:97;-1:-1:-1;35486:25:0;;35482:142;;35536:20;;;;:8;:20;;;;;;:36;;;:68;;-1:-1:-1;;;;;35536:36:0;;;;:68;;;;;35582:21;;35536:68;:20;:68;35582:21;35536:36;:68;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35536:68:0;35482:142;35655:20;35678:39;:12;35695:21;35678:39;:16;:39;:::i;:::-;35655:62;-1:-1:-1;35736:16:0;;35732:114;;35773:20;;;;:8;:20;;;;;;:34;;;:57;;:34;;;;-1:-1:-1;;;;;35773:34:0;;:57;;;;;;;;:20;:57;;:34;:57;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35773:57:0;35732:114;34652:1205;;;;;;;34591:1273;:::o;16344:352::-;16462:4;16489:15;:2;-1:-1:-1;;;;;16489:13:0;;:15::i;:::-;16484:60;;-1:-1:-1;16528:4:0;16521:11;;16484:60;16572:70;;-1:-1:-1;;;16572:70:0;;16609:10;16572:70;;;;;;-1:-1:-1;;;;;16572:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16556:13;;16572:36;;;;;;16609:10;;16621:4;;16627:7;;16636:5;;16572:70;;;;;;;;;;;16556:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;16572:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16572:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16572:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16572:70:0;-1:-1:-1;;;;;;16661:26:0;-1:-1:-1;;;16661:26:0;;-1:-1:-1;;16344:352:0;;;;;;:::o;27839:168::-;27917:33;27970:29;27980:2;27984;27970:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;29475:482::-;29525:27;29569:7;29565:50;;-1:-1:-1;29593:10:0;;;;;;;;;;;;-1:-1:-1;;;29593:10:0;;;;;;29565:50;29634:2;29625:6;29666:69;29673:6;;29666:69;;29696:5;;29721:2;29716:7;;;;29666:69;;;29745:17;29775:3;29765:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;29765:14:0;87:34:-1;135:17;;-1:-1;29765:14:0;-1:-1:-1;29745:34:0;-1:-1:-1;;;29799:7:0;;29817:103;29824:7;;29817:103;;29881:2;29876;:7;29871:2;:12;29860:25;;29848:4;29853:3;;;;;;;29848:9;;;;;;;;;;;:37;-1:-1:-1;;;;;29848:37:0;;;;;;;;-1:-1:-1;29906:2:0;29900:8;;;;29817:103;;;-1:-1:-1;29944:4:0;29475:482;-1:-1:-1;;;;29475:482:0:o;6228:184::-;6286:7;6319:1;6314;:6;;6306:49;;;;;-1:-1:-1;;;6306:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6378:5:0;;;6228:184::o;15877:459::-;15991:4;-1:-1:-1;;;;;15971:24:0;:16;15979:7;15971;:16::i;:::-;-1:-1:-1;;;;;15971:24:0;;15963:78;;;;-1:-1:-1;;;15963:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16060:16:0;;16052:65;;;;-1:-1:-1;;;16052:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16130:23;16145:7;16130:14;:23::i;:::-;-1:-1:-1;;;;;16166:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;16212:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;16258:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;16258:25:0;-1:-1:-1;;;;;16258:25:0;;;;;;;;;16301:27;;16258:20;;16301:27;;;;;;;15877:459;;;:::o;23899:1148::-;-1:-1:-1;;;;;24190:18:0;;24165:22;24190:18;;;:12;:18;;;;;:25;:32;;24220:1;24190:32;:29;:32;:::i;:::-;24233:18;24254:26;;;:17;:26;;;;;;24165:57;;-1:-1:-1;24387:28:0;;;24383:328;;-1:-1:-1;;;;;24454:18:0;;24432:19;24454:18;;;:12;:18;;;;;:34;;24473:14;;24454:34;;;;;;;;;;;;;;24432:56;;24538:11;24505:12;:18;24518:4;-1:-1:-1;;;;;24505:18:0;-1:-1:-1;;;;;24505:18:0;;;;;;;;;;;;24524:10;24505:30;;;;;;;;;;;;;;;;;;;:44;;;;24622:30;;;:17;:30;;;;;:43;;;24383:328;-1:-1:-1;;;;;24800:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;24800:27:0;;;:::i;22723:186::-;-1:-1:-1;;;;;22837:16:0;;;;;;;:12;:16;;;;;;;;:23;;22808:26;;;:17;:26;;;;;:52;;;22871:16;;;39:1:-1;23:18;;45:23;;22871:30:0;;;;;;;;22723:186::o;21226:202::-;21290:24;21302:2;21306:7;21290:11;:24::i;:::-;21327:40;21355:2;21359:7;21327:27;:40::i;:::-;21380;21412:7;21380:31;:40::i;7601:333::-;7659:7;7758:1;7754;:5;7746:44;;;;;-1:-1:-1;;;7746:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7801:9;7817:1;7813;:5;;;;;;;7601:333;-1:-1:-1;;;;7601:333:0:o;6663:470::-;6721:7;6965:6;6961:47;;-1:-1:-1;6995:1:0;6988:8;;6961:47;7032:5;;;7036:1;7032;:5;:1;7056:5;;;;;:10;7048:56;;;;-1:-1:-1;;;7048:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8601:422;8968:20;9007:8;;;8601:422::o;28421:1046::-;28553:33;28599:16;28624:2;28599:28;;28638:16;28663:2;28638:28;;28677:16;28702:2;28677:28;;28716:16;28741:2;28716:28;;28755:16;28780:2;28755:28;;28794:19;28879:3;:10;28866:3;:10;28853:3;:10;28840:3;:10;28827:3;:10;:23;:36;:49;:62;28816:74;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;28816:74:0;87:34:-1;135:17;;-1:-1;28816:74:0;-1:-1:-1;28794:96:0;-1:-1:-1;28794:96:0;28946:6;;28988:80;29004:3;:10;29000:1;:14;28988:80;;;29050:3;29054:1;29050:6;;;;;;;;;;;;;;;;29036;29043:3;;;;;;29036:11;;;;;;;;;;;:20;-1:-1:-1;;;;;29036:20:0;;;;;;;;-1:-1:-1;29016:3:0;;28988:80;;;-1:-1:-1;29087:1:0;29078:80;29094:3;:10;29090:1;:14;29078:80;;;29140:3;29144:1;29140:6;;;;;;;;;;;;;;;;29126;29133:3;;;;;;29126:11;;;;;;;;;;;:20;-1:-1:-1;;;;;29126:20:0;;;;;;;;-1:-1:-1;29106:3:0;;29078:80;;;-1:-1:-1;29177:1:0;29168:80;29184:3;:10;29180:1;:14;29168:80;;;29230:3;29234:1;29230:6;;;;;;;;;;;;;;;;29216;29223:3;;;;;;29216:11;;;;;;;;;;;:20;-1:-1:-1;;;;;29216:20:0;;;;;;;;-1:-1:-1;29196:3:0;;29168:80;;;-1:-1:-1;29267:1:0;29258:80;29274:3;:10;29270:1;:14;29258:80;;;29320:3;29324:1;29320:6;;;;;;;;;;;;;;;;29306;29313:3;;;;;;29306:11;;;;;;;;;;;:20;-1:-1:-1;;;;;29306:20:0;;;;;;;;-1:-1:-1;29286:3:0;;29258:80;;;-1:-1:-1;29357:1:0;29348:80;29364:3;:10;29360:1;:14;29348:80;;;29410:3;29414:1;29410:6;;;;;;;;;;;;;;;;29396;29403:3;;;;;;29396:11;;;;;;;;;;;:20;-1:-1:-1;;;;;29396:20:0;;;;;;;;-1:-1:-1;29376:3:0;;29348:80;;;-1:-1:-1;29452:6:0;;28421:1046;-1:-1:-1;;;;;;;;;;;;;28421:1046:0:o;16704:175::-;16804:1;16768:24;;;:15;:24;;;;;;-1:-1:-1;;;;;16768:24:0;:38;16764:108;;16858:1;16823:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;16823:37:0;;;16704:175::o;10414:110::-;10495:14;;:21;;10514:1;10495:21;:18;:21;:::i;:::-;10478:38;;10414:110::o;10315:91::-;10379:19;;10397:1;10379:19;;;10315:91::o;15093:335::-;-1:-1:-1;;;;;15165:16:0;;15157:61;;;;;-1:-1:-1;;;15157:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15238:16;15246:7;15238;:16::i;:::-;15237:17;15229:58;;;;;-1:-1:-1;;;15229:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15300:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;15300:25:0;-1:-1:-1;;;;;15300:25:0;;;;;;;;15336:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;15387;;15412:7;;-1:-1:-1;;;;;15387:33:0;;;15404:1;;15387:33;;15404:1;;15387:33;15093:335;;:::o;23110:164::-;23214:10;:17;;23187:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;23242:24:0;;;;;;;23110:164::o;30068:17546::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30068:17546:0;;;-1:-1:-1;30068:17546:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://976d360951652974035ad71f15bebdd3d7a273fb75f6638b988debb52e8f476f

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.