Contract 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe

 

TxHash Block Age From To Value [TxFee]
0x7ccf1e23bffc41ef06e1a261ed69cdfa149bcc6e736ee9dfbb08a8452b69d26d(pending)9 secs ago0x33bf13999f39ec252c6afea84c246c45594c08d9 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001003 Ether(Pending)
0x6155c6857da60503c57821d483f2cef5346c942a6c97c4a2f8096254ffe3e10f(pending)52 mins ago0xddca59f0f2d0362043549e9b2a779cc1db9e99a8 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)
0xbf639b3e9b6a0431281c1df51b2147d33eb886fdbb18574b274a282534bd09ac(pending)1 hr 11 mins ago0xf7d31f6098297a9cdc4cd3008aca721d4a386901 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001192 Ether(Pending)
0xf81a09b28b9baeb543c911d6b07959480ae9ac52f1e75f88738090ce453a1cba(pending)1 hr 15 mins ago0x19844cd6868edc2ec0543aa359cdbcac4106e00f IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)
0x21e9e7fc9ec0b9723d48b68e09243020b5893750a9b9c2d4ae9962f07a539144(pending)1 hr 16 mins ago0x40798e0df7735425d266db8542d19f3a4ca80f0c IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001012 Ether(Pending)
0xebfc6abb0d5ecb74ba3a2a0399b4ef6bfcc085c2fd9fc93ef3a07fe8cbb46f5e(pending)1 hr 50 mins ago0x1b8a59d276dbfa0edf3a677f9b7fe3afbfc2b750 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001 Ether(Pending)
0x065eef6a5f26287cb26c5324ff35cc4b1ac590538dcf105d274f60d5093988fc(pending)6 hrs 21 mins ago0xdb62d8ac8ad36171de04fb69b99c4a00db1b30a1 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001048 Ether(Pending)
0x9a1c91bfb945a507fb9c129f754ced07cbaf78a4953d44f451ec10861ff53643(pending)9 hrs 47 mins ago0x37b2199f06ce7c100bb2a4c45bfc0bd895bd5c00 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001027 Ether(Pending)
0x0f9f5542796c67d3fa66d2852c1cd81145cce79253e760b7921d794cc4061b5b(pending)11 hrs 20 mins ago0x37b2199f06ce7c100bb2a4c45bfc0bd895bd5c00 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001027 Ether(Pending)
0x8e15dc4d22b23bcdbad63ae7a5000e773244debaf57b8ed0d9fe77d8fa3b9d92(pending)11 hrs 23 mins ago0x37b2199f06ce7c100bb2a4c45bfc0bd895bd5c00 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001012 Ether(Pending)
0x72657aa5975241db6f333840f165efcd35de85ff88517c2192e297163397d966(pending)13 hrs 9 mins ago0x28be29aba5a322a21342b6b4ced7aa3e4d655ed1 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001012 Ether(Pending)
0xf776f05289abe532a80b0552f149de2b9f763b921392e36e8e484ad1e3ee5488(pending)19 hrs 33 mins ago0x743cb4e8fbe7e8a4990a4362a77ead1c61445f30 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001003 Ether(Pending)
0x3859d778ef346e09818991e54ef951bc035dab2958808aecb40fe893af3cbb8c(pending)1 day 1 hr ago0xddca59f0f2d0362043549e9b2a779cc1db9e99a8 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)
0x1b2e1bcc1b454d16bbce2c81974f188df6a86745720023640bbe1826b26b25fd(pending)1 day 1 hr ago0xddca59f0f2d0362043549e9b2a779cc1db9e99a8 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)
0x166c8519140ddc8c269fb3f2918209fa3ca15be9c54c8624ba8097f5ecb5c0b9(pending)1 day 7 hrs ago0x55fce8c5cab9b804b09192004f75321e82e6c648 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.00001 Ether(Pending)
0xb242ab2602301b7547147dbc989590073d6e5655ef5b378f3af0c4a95d09abd4(pending)1 day 11 hrs ago0xb398eb199f46fe72d147c9038dd80c1d9f768485 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001588 Ether(Pending)
0xadc95b7f8d8795a17ca0b260b3cc6164b5c71ce7a033cf0706f16dd8d5729c4c(pending)1 day 14 hrs ago0x9f0aa1e1c9121321aadb899308d27d460cc4e6ba IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001243 Ether(Pending)
0x5fa88d895bdd4d430228734e77ae887b1fa00ad1bad17d85db7ffe9dbd4ace99(pending)1 day 15 hrs ago0xb398eb199f46fe72d147c9038dd80c1d9f768485 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)
0x85f19295b6fd978f79652f2d728cee753cbce53a47d01e92496fb1289b8ddb48(pending)1 day 16 hrs ago0xddca59f0f2d0362043549e9b2a779cc1db9e99a8 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)
0xa2dd6ccf069bf3c0f7c848b5c1c1add3bd89af86e735009b9e48c10e6c4c75d1(pending)1 day 17 hrs ago0x3f207debcdba756d836e833b3643905dd37835e5 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001012 Ether(Pending)
0xe3db8fdad29e966888806597eda4e3e88123c6df305e3e098ac6b91630c40235(pending)1 day 22 hrs ago0x6014a2c9a774b33f4ae698d793685cc0731b7d23 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.001012 Ether(Pending)
0xac34d503ca450dbc50654af6871f56aec94558953b5c427db192e7ba598758c7(pending)3 days 1 hr ago0x28241193382c25b654fbb372366f90fa33d2e21c IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)
0xe70b17463c09e61b3874d07357c2448ac54fbc553f6fbb05f5aac7e4b4e6f377(pending)3 days 15 hrs ago0x3cc5d3f2d9b2f17070b39022fffbf1b277f2d722 IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)
0x6c4d26cfca43c4fc5ff4ba25d2e8374efbc9f7b9d36b6356a5e67fc5c402e096(pending)6 days 21 hrs ago0x4cd96b348fa69a68eeebdcee5c140c96a7de7b5f IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0.00075 Ether(Pending)
0xff8dd1f9e4561b867b5e3b53890cd3190d3a6c44090f258e89c24405412ac4c0(pending)6 days 21 hrs ago0xf1d4993e5d0d88c48d55bb0887411650807d2dce IN 0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0 Ether(Pending)

Latest 25 Internal Transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0xf971166a7be9dd3aae3fea2693bc50d0d1e2b63eec85e1ebf5751bda3abf7de5725067350 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005 Ether
0x79ea9cafce26b687c26c7498d27577c3f54fecb6b0dd573b485442668211d1b6725066053 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005796000000000001 Ether
0x1dab116c7332953a3c78d796ac0185a01d8bcfd3052860e8d5bc84b75833a392725065855 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005 Ether
0x2c93616ba98a2983e0115b656581f2e1b9da8bbc26bade5538817525eab9461f725065356 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005 Ether
0x185002d38654d70bd572331c6507310ae66e1ca803f8ed428b5da2c42a060757725065158 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005 Ether
0x11f2f145884606bc7ba214507ae437a805ab1442b21a951e017359a9cc1f2f36725064959 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005 Ether
0x759a1182644f6c080503262891f26073733508df9eb32126071b824fbe6d97c172505311 hr 45 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005 Ether
0x393c08553a0341763ae3e53159ab33a46373147db2a03308dd8952f2d41e99cd72504522 hrs 13 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005 Ether
0x414d2cdb83162601e50cb277b8f2dbf3a86fcd86130a46603befacd19a9c0a9c72503332 hrs 56 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x19fdd6eeccdf4bc30f363f63af44981c1f6a75c40.0095 Ether
0x275f64c644174562d0d55f91b0763d602a390fb5888f9f511a8b2a46925c57d272500144 hrs 34 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.001 Ether
0xa75b4d9aa0d9f08cdb4c54dbfcf574421accea0b8e8d2ae17f098e371aa0391e72499634 hrs 49 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.001 Ether
0x20efb10f7df6f0c7297b81954e528369ef26cfb4b2089907c00ea2a9a953429c72498985 hrs 10 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.001 Ether
0x6c2a7fc8fb1e494e39395e8e342ce64a55eef3ea4c925791ab03d4bb076236a572495437 hrs 7 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.008800000000000001 Ether
0xf109672b833857d43a9c44506d6f43b08a588ec8d41e90228d1231603900702572495337 hrs 9 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.006 Ether
0x709e4a48b1cc1020fd70f51a7cb19a80e25921dc3e1836c5c54f8f9e10e87fd872495337 hrs 9 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.01188 Ether
0x33929bcc26667bcf973f0687ff22ab06f06a3059e0ff8d0318c9672a8747c4a372495167 hrs 16 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.032300000000000004 Ether
0xa6906881a95b2b16c5672bdb48ddaa43229f8b29280d2d19d0dbfee04f5ca22872494857 hrs 30 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x20c81ae5a7cf1c5a3f8293313692474f8d6b808b0.005 Ether
0x84f4c2b712e4c83bb85008f476777fcafc5d1a70dd7590019eacd703feddf57572494367 hrs 42 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.003 Ether
0xac2ea9e004b693e2bc67329243bb2532feaf5bbae9a3d8a6b887e9b7e53f5591724888210 hrs 57 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.01 Ether
0xf9b80ec7c14ae66320f463c17e248e5560c86c081083d617b0d46c46a7c426d0724868512 hrs 8 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.00801 Ether
0x20205e4c8bd2fa0252103422d2890150650926e3a4c43ca59be21cb55a11ab14724867912 hrs 9 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.005 Ether
0x91bc0a41df171f1c1f1bd9604e1d4e23cfe37aeea4d59e127085ad468647de21724839613 hrs 44 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.001 Ether
0xd3f482695e5136709ac0b505b4c242994a2aff289427d08e2ae7ec7a5a3cf736724812415 hrs 16 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.00054 Ether
0x4ddbba08eb1728962994899b10528b779c0c7e5d6ebf876fb11bd857a948401c724805015 hrs 42 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.0039 Ether
0x591dc2199270b4276674e39c093bd9894aad1444fc7ebb03859979a8e479d5f2724804315 hrs 45 mins ago0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe0x33914fa445969ded631bf4c33d8882c2253866200.0032 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity), NestedArrayFunctionCallDecoder (medium-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: BlockchainCutiesCore
Compiler Version: v0.4.21+commit.dfe3193c
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.20;

/// BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// https://blockchaincuties.co/


/// @title defined the interface that will be referenced in main Cutie contract
contract GeneMixerInterface {
    /// @dev simply a boolean to indicate this is the contract we expect to be
    function isGeneMixer() external pure returns (bool);

    /// @dev given genes of cutie 1 & 2, return a genetic combination - may have a random factor
    /// @param genes1 genes of mom
    /// @param genes2 genes of dad
    /// @return the genes that are supposed to be passed down the child
    function mixGenes(uint256 genes1, uint256 genes2) public view returns (uint256);

    function canBreed(uint40 momId, uint256 genes1, uint40 dadId, uint256 genes2) public view returns (bool);
}



/// @author https://BlockChainArchitect.iocontract Bank is CutiePluginBase
contract PluginInterface
{
    /// @dev simply a boolean to indicate this is the contract we expect to be
    function isPluginInterface() public pure returns (bool);

    function onRemove() public;

    /// @dev Begins new feature.
    /// @param _cutieId - ID of token to auction, sender must be owner.
    /// @param _parameter - arbitrary parameter
    /// @param _seller - Old owner, if not the message sender
    function run(
        uint40 _cutieId,
        uint256 _parameter,
        address _seller
    ) 
    public
    payable;

    /// @dev Begins new feature, approved and signed by COO.
    /// @param _cutieId - ID of token to auction, sender must be owner.
    /// @param _parameter - arbitrary parameter
    function runSigned(
        uint40 _cutieId,
        uint256 _parameter,
        address _owner
    )
    external
    payable;

    function withdraw() public;
}



/// @title Auction Market for Blockchain Cuties.
/// @author https://BlockChainArchitect.io
contract MarketInterface 
{
    function withdrawEthFromBalance() external;    

    function createAuction(uint40 _cutieId, uint128 _startPrice, uint128 _endPrice, uint40 _duration, address _seller) public payable;

    function bid(uint40 _cutieId) public payable;

    function cancelActiveAuctionWhenPaused(uint40 _cutieId) public;

	function getAuctionInfo(uint40 _cutieId)
        public
        view
        returns
    (
        address seller,
        uint128 startPrice,
        uint128 endPrice,
        uint40 duration,
        uint40 startedAt,
        uint128 featuringFee
    );
}



/// @title BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// @author https://BlockChainArchitect.io
/// @dev This is the BlockchainCuties configuration. It can be changed redeploying another version.
contract ConfigInterface
{
    function isConfig() public pure returns (bool);

    function getCooldownIndexFromGeneration(uint16 _generation) public view returns (uint16);
    
    function getCooldownEndTimeFromIndex(uint16 _cooldownIndex) public view returns (uint40);

    function getCooldownIndexCount() public view returns (uint256);
    
    function getBabyGen(uint16 _momGen, uint16 _dadGen) public pure returns (uint16);

    function getTutorialBabyGen(uint16 _dadGen) public pure returns (uint16);

    function getBreedingFee(uint40 _momId, uint40 _dadId) public pure returns (uint256);
}



/// @dev Note: the ERC-165 identifier for this interface is 0xf0b9e5ba
interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. This function MUST use 50,000 gas or less. Return of other
    ///  than the magic value MUST result in the transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _from The sending address 
    /// @param _tokenId The NFT identifier which is being transfered
    /// @param data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
}


/// @title BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// @author https://BlockChainArchitect.io
/// @dev This is the main BlockchainCuties contract. For separated logical sections the code is divided in 
// several separately-instantiated sibling contracts that handle auctions and the genetic combination algorithm. 
// By keeping auctions separate it is possible to upgrade them without disrupting the main contract that tracks
// the ownership of the cutie. The genetic combination algorithm is kept separate so that all of the rest of the 
// code can be open-sourced.
// The contracts:
//
//      - BlockchainCuties: The fundamental code, including main data storage, constants and data types, as well as
//             internal functions for managing these items ans ERC-721 implementation.
//             Various addresses and constraints for operations can be executed only by specific roles - 
//             Owner, Operator and Parties.
//             Methods for interacting with additional features (Plugins).
//             The methods for breeding and keeping track of breeding offers, relies on external genetic combination 
//             contract.
//             Public methods for auctioning or bidding or breeding. 
//
//      - SaleMarket and BreedingMarket: The actual auction functionality is handled in two sibling contracts - one
//             for sales and one for breeding. Auction creation and bidding is mostly mediated through this side of 
//             the core contract.
//
//      - Effects: Contracts allow to use item effects on cuties, implemented as plugins. Items are not stored in 
//             blockchain to not overload Ethereum network. Operator generates signatures, and Plugins check it
//             and perform effect.
//
//      - ItemMarket: Plugin contract used to transfer money from buyer to seller.
//
//      - Bank: Plugin contract used to receive payments for payed features.

contract BlockchainCutiesCore /*is ERC721, CutieCoreInterface*/
{
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external pure returns (string _name) 
    {
        return "BlockchainCuties"; 
    }

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external pure returns (string _symbol)
    {
        return "BC";
    }
    
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external pure returns (bool)
    {
        return
            interfaceID == 0x6466353c || 
            interfaceID == bytes4(keccak256('supportsInterface(bytes4)'));
    }

    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @dev The Birth event is fired as soon as a new cutie is created. This
    ///  is any time a cutie comes into existence through the giveBirth method, as well as
    ///  when a new gen0 cutie is created.
    event Birth(address indexed owner, uint40 cutieId, uint40 momId, uint40 dadId, uint256 genes);

    /// @dev This struct represents a blockchain Cutie. It was ensured that struct fits well into
    ///  exactly two 256-bit words. The order of the members in this structure
    ///  matters because of the Ethereum byte-packing rules.
    ///  Reference: http://solidity.readthedocs.io/en/develop/miscellaneous.html
    struct Cutie
    {
        // The Cutie's genetic code is in these 256-bits. Cutie's genes never change.
        uint256 genes;

        // The timestamp from the block when this cutie was created.
        uint40 birthTime;

        // The minimum timestamp after which the cutie can start breeding
        // again.
        uint40 cooldownEndTime;

        // The cutie's parents ID is set to 0 for gen0 cuties.
        // Because of using 32-bit unsigned integers the limit is 4 billion cuties. 
        // Current Ethereum annual limit is about 500 million transactions.
        uint40 momId;
        uint40 dadId;

        // Set the index in the cooldown array (see below) that means
        // the current cooldown duration for this Cutie. Starts at 0
        // for gen0 cats, and is initialized to floor(generation/2) for others.
        // Incremented by one for each successful breeding, regardless
        // of being cutie mom or cutie dad.
        uint16 cooldownIndex;

        // The "generation number" of the cutie. Cutioes minted by the contract
        // for sale are called "gen0" with generation number of 0. All other cuties' 
        // generation number is the larger of their parents' two generation
        // numbers, plus one (i.e. max(mom.generation, dad.generation) + 1)
        uint16 generation;

        // Some optional data used by external contracts
        // Cutie struct is 2x256 bits long.
        uint64 optional;
    }

    /// @dev An array containing the Cutie struct for all Cuties in existence. The ID
    ///  of each cutie is actually an index into this array. ID 0 is the parent 
    /// of all generation 0 cats, and both parents to itself. It is an invalid genetic code.
    Cutie[] public cuties;

    /// @dev A mapping from cutie IDs to the address that owns them. All cuties have
    ///  some valid owner address, even gen0 cuties are created with a non-zero owner.
    mapping (uint40 => address) public cutieIndexToOwner;

    // @dev A mapping from owner address to count of tokens that address owns.
    //  Used internally inside balanceOf() to resolve ownership count.
    mapping (address => uint256) ownershipTokenCount;

    /// @dev A mapping from CutieIDs to an address that has been approved to call
    ///  transferFrom(). A Cutie can have one approved address for transfer
    ///  at any time. A zero value means that there is no outstanding approval.
    mapping (uint40 => address) public cutieIndexToApproved;

    /// @dev A mapping from CutieIDs to an address that has been approved to use
    ///  this Cutie for breeding via breedWith(). A Cutie can have one approved
    ///  address for breeding at any time. A zero value means that there is no outstanding approval.
    mapping (uint40 => address) public sireAllowedToAddress;


    /// @dev The address of the Market contract used to sell cuties. This
    ///  contract used both peer-to-peer sales and the gen0 sales that are
    ///  initiated each 15 minutes.
    MarketInterface public saleMarket;

    /// @dev The address of a custom Market subclassed contract used for breeding
    ///  auctions. Is to be separated from saleMarket as the actions taken on success
    ///  after a sales and breeding auction are quite different.
    MarketInterface public breedingMarket;


    // Modifiers to check that inputs can be safely stored with a certain
    // number of bits.
    modifier canBeStoredIn40Bits(uint256 _value) {
        require(_value <= 0xFFFFFFFFFF);
        _;
    }    

    /// @notice Returns the total number of Cuties in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() external view returns (uint256)
    {
        return cuties.length - 1;
    }

    /// @notice Returns the total number of Cuties in existence.
    /// @dev Required for ERC-721 compliance.
    function _totalSupply() internal view returns (uint256)
    {
        return cuties.length - 1;
    }
    
    // Internal utility functions assume that their input arguments
    // are valid. Public methods sanitize their inputs and follow
    // the required logic.

    /// @dev Checks if a given address is the current owner of a certain Cutie.
    /// @param _claimant the address we are validating against.
    /// @param _cutieId cutie id, only valid when > 0
    function _isOwner(address _claimant, uint40 _cutieId) internal view returns (bool)
    {
        return cutieIndexToOwner[_cutieId] == _claimant;
    }

    /// @dev Checks if a given address currently has transferApproval for a certain Cutie.
    /// @param _claimant the address we are confirming the cutie is approved for.
    /// @param _cutieId cutie id, only valid when > 0
    function _approvedFor(address _claimant, uint40 _cutieId) internal view returns (bool)
    {
        return cutieIndexToApproved[_cutieId] == _claimant;
    }

    /// @dev Marks an address as being approved for transferFrom(), overwriting any previous
    ///  approval. Setting _approved to address(0) clears all transfer approval.
    ///  NOTE: _approve() does NOT send the Approval event. This is done on purpose:
    ///  _approve() and transferFrom() are used together for putting Cuties on auction. 
    ///  There is no value in spamming the log with Approval events in that case.
    function _approve(uint40 _cutieId, address _approved) internal
    {
        cutieIndexToApproved[_cutieId] = _approved;
    }

    /// @notice Returns the number of Cuties owned by a specific address.
    /// @param _owner The owner address to check.
    /// @dev Required for ERC-721 compliance
    function balanceOf(address _owner) external view returns (uint256 count)
    {
        return ownershipTokenCount[_owner];
    }

    /// @notice Transfers a Cutie to another address. When transferring to a smart
    ///  contract, ensure that it is aware of ERC-721 (or
    ///  BlockchainCuties specifically), otherwise the Cutie may be lost forever.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _cutieId The ID of the Cutie to transfer.
    /// @dev Required for ERC-721 compliance.
    function transfer(address _to, uint256 _cutieId) external whenNotPaused canBeStoredIn40Bits(_cutieId)
    {
        // You can only send your own cutie.
        require(_isOwner(msg.sender, uint40(_cutieId)));

        // Reassign ownership, clear pending approvals, emit Transfer event.
        _transfer(msg.sender, _to, uint40(_cutieId));
    }

    /// @notice Grant another address the right to transfer a perticular Cutie via transferFrom().
    /// This flow is preferred for transferring NFTs to contracts.
    /// @param _to The address to be granted transfer approval. Pass address(0) to clear all approvals.
    /// @param _cutieId The ID of the Cutie that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    function approve(address _to, uint256 _cutieId) external whenNotPaused canBeStoredIn40Bits(_cutieId)
    {
        // Only cutie's owner can grant transfer approval.
        require(_isOwner(msg.sender, uint40(_cutieId)));

        // Registering approval replaces any previous approval.
        _approve(uint40(_cutieId), _to);

        // Emit approval event.
        emit Approval(msg.sender, _to, _cutieId);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address.
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId)
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleMarket));
        require(_to != address(breedingMarket));
       
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
        ERC721TokenReceiver (_to).onERC721Received(_from, _tokenId, data);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to ""
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId)
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleMarket));
        require(_to != address(breedingMarket));
       
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
    }

    /// @notice Transfer a Cutie owned by another address, for which the calling address
    ///  has been granted transfer approval by the owner.
    /// @param _from The address that owns the Cutie to be transfered.
    /// @param _to Any address, including the caller address, can take ownership of the Cutie.
    /// @param _tokenId The ID of the Cutie to be transferred.
    /// @dev Required for ERC-721 compliance.
    function transferFrom(address _from, address _to, uint256 _tokenId) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId) 
    {
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
    }

    /// @notice Returns the address currently assigned ownership of a given Cutie.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _cutieId)
        external
        view
        canBeStoredIn40Bits(_cutieId)
        returns (address owner)
    {
        owner = cutieIndexToOwner[uint40(_cutieId)];

        require(owner != address(0));
    }

    /// @notice Returns the nth Cutie assigned to an address, with n specified by the
    ///  _index argument.
    /// @param _owner The owner of the Cuties we are interested in.
    /// @param _index The zero-based index of the cutie within the owner's list of cuties.
    ///  Must be less than balanceOf(_owner).
    /// @dev This method must not be called by smart contract code. It will almost
    ///  certainly blow past the block gas limit once there are a large number of
    ///  Cuties in existence. Exists only to allow off-chain queries of ownership.
    ///  Optional method for ERC-721.
    function tokenOfOwnerByIndex(address _owner, uint256 _index)
        external
        view
        returns (uint256 cutieId)
    {
        uint40 count = 0;
        for (uint40 i = 1; i <= _totalSupply(); ++i) {
            if (cutieIndexToOwner[i] == _owner) {
                if (count == _index) {
                    return i;
                } else {
                    count++;
                }
            }
        }
        revert();
    }

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external pure returns (uint256)
    {
        return _index;
    }

    /// @dev A mapping from Cuties owner (account) to an address that has been approved to call
    ///  transferFrom() for all cuties, owned by owner.
    ///  Only one approved address is permitted for each account for transfer
    ///  at any time. A zero value means there is no outstanding approval.
    mapping (address => address) public addressToApprovedAll;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all your asset.
    /// @dev Emits the ApprovalForAll event
    /// @param _operator Address to add to the set of authorized operators.
    /// @param _approved True if the operators is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external
    {
        if (_approved)
        {
            addressToApprovedAll[msg.sender] = _operator;
        }
        else
        {
            delete addressToApprovedAll[msg.sender];
        }
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) 
        external view canBeStoredIn40Bits(_tokenId) 
        returns (address)
    {
        require(_tokenId <= _totalSupply());

        if (cutieIndexToApproved[uint40(_tokenId)] != address(0))
        {
            return cutieIndexToApproved[uint40(_tokenId)];
        }

        address owner = cutieIndexToOwner[uint40(_tokenId)];
        return addressToApprovedAll[owner];
    }

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool)
    {
        return addressToApprovedAll[_owner] == _operator;
    }

    function _isApprovedForAll(address _owner, address _operator) internal view returns (bool)
    {
        return addressToApprovedAll[_owner] == _operator;
    }

    ConfigInterface public config;

    /// @dev Update the address of the config contract.
    /// @param _address An address of a ConfigInterface contract instance to be used from this point forward.
    function setConfigAddress(address _address) public onlyOwner
    {
        ConfigInterface candidateContract = ConfigInterface(_address);

        require(candidateContract.isConfig());

        // Set the new contract address
        config = candidateContract;
    }

    function getCooldownIndexFromGeneration(uint16 _generation) internal view returns (uint16)
    {
        return config.getCooldownIndexFromGeneration(_generation);
    }

    /// @dev An internal method that creates a new cutie and stores it. This
    ///  method does not check anything and should only be called when the
    ///  input data is valid for sure. Will generate both a Birth event
    ///  and a Transfer event.
    /// @param _momId The cutie ID of the mom of this cutie (zero for gen0)
    /// @param _dadId The cutie ID of the dad of this cutie (zero for gen0)
    /// @param _generation The generation number of this cutie, must be computed by caller.
    /// @param _genes The cutie's genetic code.
    /// @param _owner The initial owner of this cutie, must be non-zero (except for the unCutie, ID 0)
    function _createCutie(
        uint40 _momId,
        uint40 _dadId,
        uint16 _generation,
        uint16 _cooldownIndex,
        uint256 _genes,
        address _owner,
        uint40 _birthTime
    )
        internal
        returns (uint40)
    {
        Cutie memory _cutie = Cutie({
            genes: _genes, 
            birthTime: _birthTime, 
            cooldownEndTime: 0, 
            momId: _momId, 
            dadId: _dadId, 
            cooldownIndex: _cooldownIndex, 
            generation: _generation,
            optional: 0
        });
        uint256 newCutieId256 = cuties.push(_cutie) - 1;

        // Check if id can fit into 40 bits
        require(newCutieId256 <= 0xFFFFFFFFFF);

        uint40 newCutieId = uint40(newCutieId256);

        // emit the birth event
        emit Birth(_owner, newCutieId, _cutie.momId, _cutie.dadId, _cutie.genes);

        // This will assign ownership, as well as emit the Transfer event as
        // per ERC721 draft
        _transfer(0, _owner, newCutieId);

        return newCutieId;
    }
  
    /// @notice Returns all the relevant information about a certain cutie.
    /// @param _id The ID of the cutie of interest.
    function getCutie(uint40 _id)
        external
        view
        returns (
        uint256 genes,
        uint40 birthTime,
        uint40 cooldownEndTime,
        uint40 momId,
        uint40 dadId,
        uint16 cooldownIndex,
        uint16 generation
    ) {
        Cutie storage cutie = cuties[_id];

        genes = cutie.genes;
        birthTime = cutie.birthTime;
        cooldownEndTime = cutie.cooldownEndTime;
        momId = cutie.momId;
        dadId = cutie.dadId;
        cooldownIndex = cutie.cooldownIndex;
        generation = cutie.generation;
    }    
    
    /// @dev Assigns ownership of a particular Cutie to an address.
    function _transfer(address _from, address _to, uint40 _cutieId) internal {
        // since the number of cuties is capped to 2^40
        // there is no way to overflow this
        ownershipTokenCount[_to]++;
        // transfer ownership
        cutieIndexToOwner[_cutieId] = _to;
        // When creating new cuties _from is 0x0, but we cannot account that address.
        if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            // once the cutie is transferred also clear breeding allowances
            delete sireAllowedToAddress[_cutieId];
            // clear any previously approved ownership exchange
            delete cutieIndexToApproved[_cutieId];
        }
        // Emit the transfer event.
        emit Transfer(_from, _to, _cutieId);
    }

    /// @dev For transferring a cutie owned by this contract to the specified address.
    ///  Used to rescue lost cuties. (There is no "proper" flow where this contract
    ///  should be the owner of any Cutie. This function exists for us to reassign
    ///  the ownership of Cuties that users may have accidentally sent to our address.)
    /// @param _cutieId - ID of cutie
    /// @param _recipient - Address to send the cutie to
    function restoreCutieToAddress(uint40 _cutieId, address _recipient) public onlyOperator whenNotPaused {
        require(_isOwner(this, _cutieId));
        _transfer(this, _recipient, _cutieId);
    }

    address ownerAddress;
    address operatorAddress;

    bool public paused = false;

    modifier onlyOwner()
    {
        require(msg.sender == ownerAddress);
        _;
    }

    function setOwner(address _newOwner) public onlyOwner
    {
        require(_newOwner != address(0));

        ownerAddress = _newOwner;
    }

    modifier onlyOperator() {
        require(msg.sender == operatorAddress || msg.sender == ownerAddress);
        _;
    }

    function setOperator(address _newOperator) public onlyOwner {
        require(_newOperator != address(0));

        operatorAddress = _newOperator;
    }

    modifier whenNotPaused()
    {
        require(!paused);
        _;
    }

    modifier whenPaused
    {
        require(paused);
        _;
    }

    function pause() public onlyOwner whenNotPaused
    {
        paused = true;
    }

    string public metadataUrlPrefix = "https://blockchaincuties.co/cutie/";
    string public metadataUrlSuffix = ".svg";

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string infoUrl)
    {
        return 
            concat(toSlice(metadataUrlPrefix), 
                toSlice(concat(toSlice(uintToString(_tokenId)), toSlice(metadataUrlSuffix))));
    }

    function setMetadataUrl(string _metadataUrlPrefix, string _metadataUrlSuffix) public onlyOwner
    {
        metadataUrlPrefix = _metadataUrlPrefix;
        metadataUrlSuffix = _metadataUrlSuffix;
    }


    mapping(address => PluginInterface) public plugins;
    PluginInterface[] public pluginsArray;
    mapping(uint40 => address) public usedSignes;
    uint40 public minSignId;

    event GenesChanged(uint40 indexed cutieId, uint256 oldValue, uint256 newValue);
    event CooldownEndTimeChanged(uint40 indexed cutieId, uint40 oldValue, uint40 newValue);
    event CooldownIndexChanged(uint40 indexed cutieId, uint16 ololdValue, uint16 newValue);
    event GenerationChanged(uint40 indexed cutieId, uint16 oldValue, uint16 newValue);
    event OptionalChanged(uint40 indexed cutieId, uint64 oldValue, uint64 newValue);
    event SignUsed(uint40 signId, address sender);
    event MinSignSet(uint40 signId);

    /// @dev Sets the reference to the plugin contract.
    /// @param _address - Address of plugin contract.
    function addPlugin(address _address) public onlyOwner
    {
        PluginInterface candidateContract = PluginInterface(_address);

        // verify that a contract is what we expect
        require(candidateContract.isPluginInterface());

        // Set the new contract address
        plugins[_address] = candidateContract;
        pluginsArray.push(candidateContract);
    }

    /// @dev Remove plugin and calls onRemove to cleanup
    function removePlugin(address _address) public onlyOwner
    {
        plugins[_address].onRemove();
        delete plugins[_address];

        uint256 kindex = 0;
        while (kindex < pluginsArray.length)
        {
            if (address(pluginsArray[kindex]) == _address)
            {
                pluginsArray[kindex] = pluginsArray[pluginsArray.length-1];
                pluginsArray.length--;
            }
            else
            {
                kindex++;
            }
        }
    }

    /// @dev Put a cutie up for plugin feature.
    function runPlugin(
        address _pluginAddress,
        uint40 _cutieId,
        uint256 _parameter
    )
        public
        whenNotPaused
        payable
    {
        // If cutie is already on any auction or in adventure, this will throw
        // because it will be owned by the other contract.
        // If _cutieId is 0, then cutie is not used on this feature.
        require(_cutieId == 0 || _isOwner(msg.sender, _cutieId));
        require(address(plugins[_pluginAddress]) != address(0));
        if (_cutieId > 0)
        {
            _approve(_cutieId, _pluginAddress);
        }

        // Plugin contract throws if inputs are invalid and clears
        // transfer after escrowing the cutie.
        plugins[_pluginAddress].run.value(msg.value)(
            _cutieId,
            _parameter,
            msg.sender
        );
    }

    /// @dev Called from plugin contract when using items as effect
    function getGenes(uint40 _id)
        public
        view
        returns (
        uint256 genes
    )
    {
        Cutie storage cutie = cuties[_id];
        genes = cutie.genes;
    }

    /// @dev Called from plugin contract when using items as effect
    function changeGenes(
        uint40 _cutieId,
        uint256 _genes)
        public
        whenNotPaused
    {
        // if caller is registered plugin contract
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.genes != _genes)
        {
            emit GenesChanged(_cutieId, cutie.genes, _genes);
            cutie.genes = _genes;
        }
    }

    function getCooldownEndTime(uint40 _id)
        public
        view
        returns (
        uint40 cooldownEndTime
    ) {
        Cutie storage cutie = cuties[_id];

        cooldownEndTime = cutie.cooldownEndTime;
    }

    function changeCooldownEndTime(
        uint40 _cutieId,
        uint40 _cooldownEndTime)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.cooldownEndTime != _cooldownEndTime)
        {
            emit CooldownEndTimeChanged(_cutieId, cutie.cooldownEndTime, _cooldownEndTime);
            cutie.cooldownEndTime = _cooldownEndTime;
        }
    }

    function getCooldownIndex(uint40 _id)
        public
        view
        returns (
        uint16 cooldownIndex
    ) {
        Cutie storage cutie = cuties[_id];

        cooldownIndex = cutie.cooldownIndex;
    }

    function changeCooldownIndex(
        uint40 _cutieId,
        uint16 _cooldownIndex)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.cooldownIndex != _cooldownIndex)
        {
            emit CooldownIndexChanged(_cutieId, cutie.cooldownIndex, _cooldownIndex);
            cutie.cooldownIndex = _cooldownIndex;
        }
    }

    function changeGeneration(
        uint40 _cutieId,
        uint16 _generation)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.generation != _generation)
        {
            emit GenerationChanged(_cutieId, cutie.generation, _generation);
            cutie.generation = _generation;
        }
    }

    function getGeneration(uint40 _id)
        public
        view
        returns (uint16 generation)
    {
        Cutie storage cutie = cuties[_id];
        generation = cutie.generation;
    }

    function changeOptional(
        uint40 _cutieId,
        uint64 _optional)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.optional != _optional)
        {
            emit OptionalChanged(_cutieId, cutie.optional, _optional);
            cutie.optional = _optional;
        }
    }

    function getOptional(uint40 _id)
        public
        view
        returns (uint64 optional)
    {
        Cutie storage cutie = cuties[_id];
        optional = cutie.optional;
    }

    /// @dev Common function to be used also in backend
    function hashArguments(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter)
        public pure returns (bytes32 msgHash)
    {
        msgHash = keccak256(_pluginAddress, _signId, _cutieId, _value, _parameter);
    }

    /// @dev Common function to be used also in backend
    function getSigner(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
        )
        public pure returns (address)
    {
        bytes32 msgHash = hashArguments(_pluginAddress, _signId, _cutieId, _value, _parameter);
        return ecrecover(msgHash, _v, _r, _s);
    }

    /// @dev Common function to be used also in backend
    function isValidSignature(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
        )
        public
        view
        returns (bool)
    {
        return getSigner(_pluginAddress, _signId, _cutieId, _value, _parameter, _v, _r, _s) == operatorAddress;
    }

    /// @dev Put a cutie up for plugin feature with signature.
    ///  Can be used for items equip, item sales and other features.
    ///  Signatures are generated by Operator role.
    function runPluginSigned(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        public
        whenNotPaused
        payable
    {
        // If cutie is already on any auction or in adventure, this will throw
        // as it will be owned by the other contract.
        // If _cutieId is 0, then cutie is not used on this feature.
        require(_cutieId == 0 || _isOwner(msg.sender, _cutieId));
    
        require(address(plugins[_pluginAddress]) != address(0));    

        require (usedSignes[_signId] == address(0));
        require (_signId >= minSignId);
        // value can also be zero for free calls
        require (_value <= msg.value);

        require (isValidSignature(_pluginAddress, _signId, _cutieId, _value, _parameter, _v, _r, _s));
        
        usedSignes[_signId] = msg.sender;
        emit SignUsed(_signId, msg.sender);

        // Plugin contract throws if inputs are invalid and clears
        // transfer after escrowing the cutie.
        plugins[_pluginAddress].runSigned.value(_value)(
            _cutieId,
            _parameter,
            msg.sender
        );
    }

    /// @dev Sets minimal signId, than can be used.
    ///       All unused signatures less than signId will be cancelled on off-chain server
    ///       and unused items will be transfered back to owner.
    function setMinSign(uint40 _newMinSignId)
        public
        onlyOperator
    {
        require (_newMinSignId > minSignId);
        minSignId = _newMinSignId;
        emit MinSignSet(minSignId);
    }


    event BreedingApproval(address indexed _owner, address indexed _approved, uint256 _tokenId);

    // Set in case the core contract is broken and an upgrade is required
    address public upgradedContractAddress;

    function isCutieCore() pure public returns (bool) { return true; }

    /// @notice Creates the main BlockchainCuties smart contract instance.
    function BlockchainCutiesCore() public
    {
        // Starts paused.
        paused = true;

        // the creator of the contract is the initial owner
        ownerAddress = msg.sender;

        // the creator of the contract is also the initial operator
        operatorAddress = msg.sender;

        // start with the mythical cutie 0 - so there are no generation-0 parent issues
        _createCutie(0, 0, 0, 0, uint256(-1), address(0), 0);
    }

    event ContractUpgrade(address newContract);

    /// @dev Aimed to mark the smart contract as upgraded if there is a crucial
    ///  bug. This keeps track of the new contract and indicates that the new address is set. 
    /// Updating to the new contract address is up to the clients. (This contract will
    ///  be paused indefinitely if such an upgrade takes place.)
    /// @param _newAddress new address
    function setUpgradedAddress(address _newAddress) public onlyOwner whenPaused
    {
        require(_newAddress != address(0));
        upgradedContractAddress = _newAddress;
        emit ContractUpgrade(upgradedContractAddress);
    }

    /// @dev Import cuties from previous version of Core contract.
    /// @param _oldAddress Old core contract address
    /// @param _fromIndex (inclusive)
    /// @param _toIndex (inclusive)
    function migrate(address _oldAddress, uint40 _fromIndex, uint40 _toIndex) public onlyOwner whenPaused
    {
        require(_totalSupply() + 1 == _fromIndex);

        BlockchainCutiesCore old = BlockchainCutiesCore(_oldAddress);

        for (uint40 i = _fromIndex; i <= _toIndex; i++)
        {
            uint256 genes;
            uint40 birthTime;
            uint40 cooldownEndTime;
            uint40 momId;
            uint40 dadId;
            uint16 cooldownIndex;
            uint16 generation;            
            (genes, birthTime, cooldownEndTime, momId, dadId, cooldownIndex, generation) = old.getCutie(i);

            Cutie memory _cutie = Cutie({
                genes: genes, 
                birthTime: birthTime, 
                cooldownEndTime: cooldownEndTime, 
                momId: momId, 
                dadId: dadId, 
                cooldownIndex: cooldownIndex, 
                generation: generation,
                optional: 0
            });
            cuties.push(_cutie);
        }
    }

    /// @dev Import cuties from previous version of Core contract (part 2).
    /// @param _oldAddress Old core contract address
    /// @param _fromIndex (inclusive)
    /// @param _toIndex (inclusive)
    function migrate2(address _oldAddress, uint40 _fromIndex, uint40 _toIndex, address saleAddress, address breedingAddress) public onlyOwner whenPaused
    {
        BlockchainCutiesCore old = BlockchainCutiesCore(_oldAddress);
        MarketInterface oldSaleMarket = MarketInterface(saleAddress);
        MarketInterface oldBreedingMarket = MarketInterface(breedingAddress);

        for (uint40 i = _fromIndex; i <= _toIndex; i++)
        {
            address owner = old.ownerOf(i);

            if (owner == saleAddress)
            {
                (owner,,,,,) = oldSaleMarket.getAuctionInfo(i);
            }

            if (owner == breedingAddress)
            {
                (owner,,,,,) = oldBreedingMarket.getAuctionInfo(i);
            }
            _transfer(0, owner, i);
        }
    }

    /// @dev Override unpause so it requires upgradedContractAddress not set, because then the contract was upgraded.
    function unpause() public onlyOwner whenPaused
    {
        require(upgradedContractAddress == address(0));

        paused = false;
    }

    // Counts the number of cuties the contract owner has created.
    uint40 public promoCutieCreatedCount;
    uint40 public gen0CutieCreatedCount;
    uint40 public gen0Limit = 50000;
    uint40 public promoLimit = 5000;

    /// @dev Creates a new gen0 cutie with the given genes and
    ///  creates an auction for it.
    function createGen0Auction(uint256 _genes, uint128 startPrice, uint128 endPrice, uint40 duration) public onlyOperator
    {
        require(gen0CutieCreatedCount < gen0Limit);
        uint40 cutieId = _createCutie(0, 0, 0, 0, _genes, address(this), uint40(now));
        _approve(cutieId, saleMarket);

        saleMarket.createAuction(
            cutieId,
            startPrice,
            endPrice,
            duration,
            address(this)
        );

        gen0CutieCreatedCount++;
    }

    function createPromoCutie(uint256 _genes, address _owner) public onlyOperator
    {
        require(promoCutieCreatedCount < promoLimit);
        if (_owner == address(0)) {
             _owner = operatorAddress;
        }
        promoCutieCreatedCount++;
        gen0CutieCreatedCount++;
        _createCutie(0, 0, 0, 0, _genes, _owner, uint40(now));
    }

    /// @dev Put a cutie up for auction to be dad.
    ///  Performs checks to ensure the cutie can be dad, then
    ///  delegates to reverse auction.
    ///  Optional money amount can be sent to contract to feature auction.
    ///  Pricea are available on web.
    function createBreedingAuction(
        uint40 _cutieId,
        uint128 _startPrice,
        uint128 _endPrice,
        uint40 _duration
    )
        public
        whenNotPaused
        payable
    {
        // Auction contract checks input sizes
        // If cutie is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_isOwner(msg.sender, _cutieId));
        require(canBreed(_cutieId));
        _approve(_cutieId, breedingMarket);
        // breeding auction function is called if inputs are invalid and clears
        // transfer and sire approval after escrowing the cutie.
        breedingMarket.createAuction.value(msg.value)(
            _cutieId,
            _startPrice,
            _endPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev Sets the reference to the breeding auction.
    /// @param _breedingAddress - Address of breeding market contract.
    /// @param _saleAddress - Address of sale market contract.
    function setMarketAddress(address _breedingAddress, address _saleAddress) public onlyOwner
    {
        //require(address(breedingMarket) == address(0));
        //require(address(saleMarket) == address(0));

        breedingMarket = MarketInterface(_breedingAddress);
        saleMarket = MarketInterface(_saleAddress);
    }

    /// @dev Completes a breeding auction by bidding.
    ///  Immediately breeds the winning mom with the dad on auction.
    /// @param _dadId - ID of the dad on auction.
    /// @param _momId - ID of the mom owned by the bidder.
    function bidOnBreedingAuction(
        uint40 _dadId,
        uint40 _momId
    )
        public
        payable
        whenNotPaused
        returns (uint256)
    {
        // Auction contract checks input sizes
        require(_isOwner(msg.sender, _momId));
        require(canBreed(_momId));
        require(_canMateViaMarketplace(_momId, _dadId));
        // Take breeding fee
        uint256 fee = getBreedingFee(_momId, _dadId);
        require(msg.value >= fee);

        // breeding auction will throw if the bid fails.
        breedingMarket.bid.value(msg.value - fee)(_dadId);
        return _breedWith(_momId, _dadId);
    }

    /// @dev Put a cutie up for auction.
    ///  Does some ownership trickery for creating auctions in one transaction.
    ///  Optional money amount can be sent to contract to feature auction.
    ///  Pricea are available on web.
    function createSaleAuction(
        uint40 _cutieId,
        uint128 _startPrice,
        uint128 _endPrice,
        uint40 _duration
    )
        public
        whenNotPaused
        payable
    {
        // Auction contract checks input sizes
        // If cutie is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_isOwner(msg.sender, _cutieId));
        _approve(_cutieId, saleMarket);
        // Sale auction throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the cutie.
        saleMarket.createAuction.value(msg.value)(
            _cutieId,
            _startPrice,
            _endPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev The address of the sibling contract that is used to implement the genetic combination algorithm.
    GeneMixerInterface geneMixer;

    /// @dev Check if dad has authorized breeding with the mom. True if both dad
    ///  and mom have the same owner, or if the dad has given breeding permission to
    ///  the mom's owner (via approveBreeding()).
    function _isBreedingPermitted(uint40 _dadId, uint40 _momId) internal view returns (bool)
    {
        address momOwner = cutieIndexToOwner[_momId];
        address dadOwner = cutieIndexToOwner[_dadId];

        // Breeding is approved if they have same owner, or if the mom's owner was given
        // permission to breed with the dad.
        return (momOwner == dadOwner || sireAllowedToAddress[_dadId] == momOwner);
    }

    /// @dev Update the address of the genetic contract.
    /// @param _address An address of a GeneMixer contract instance to be used from this point forward.
    function setGeneMixerAddress(address _address) public onlyOwner
    {
        GeneMixerInterface candidateContract = GeneMixerInterface(_address);

        require(candidateContract.isGeneMixer());

        // Set the new contract address
        geneMixer = candidateContract;
    }

    /// @dev Checks that a given cutie is able to breed. Requires that the
    ///  current cooldown is finished (for dads)
    function _canBreed(Cutie _cutie) internal view returns (bool)
    {
        return _cutie.cooldownEndTime <= now;
    }

    /// @notice Grants approval to another user to sire with one of your Cuties.
    /// @param _addr The address that will be able to sire with your Cutie. Set to
    ///  address(0) to clear all breeding approvals for this Cutie.
    /// @param _dadId A Cutie that you own that _addr will now be able to dad with.
    function approveBreeding(address _addr, uint40 _dadId) public whenNotPaused
    {
        require(_isOwner(msg.sender, _dadId));
        sireAllowedToAddress[_dadId] = _addr;
        emit BreedingApproval(msg.sender, _addr, _dadId);
    }

    /// @dev Set the cooldownEndTime for the given Cutie, based on its current cooldownIndex.
    ///  Also increments the cooldownIndex (unless it has hit the cap).
    /// @param _cutie A reference to the Cutie in storage which needs its timer started.
    function _triggerCooldown(uint40 _cutieId, Cutie storage _cutie) internal
    {
        // Compute the end of the cooldown time, based on current cooldownIndex
        uint40 oldValue = _cutie.cooldownIndex;
        _cutie.cooldownEndTime = config.getCooldownEndTimeFromIndex(_cutie.cooldownIndex);
        emit CooldownEndTimeChanged(_cutieId, oldValue, _cutie.cooldownEndTime);

        // Increment the breeding count.
        if (_cutie.cooldownIndex + 1 < config.getCooldownIndexCount()) {
            uint16 oldValue2 = _cutie.cooldownIndex;
            _cutie.cooldownIndex++;
            emit CooldownIndexChanged(_cutieId, oldValue2, _cutie.cooldownIndex);
        }
    }

    /// @notice Checks that a certain cutie is not
    ///  in the middle of a breeding cooldown and is able to breed.
    /// @param _cutieId reference the id of the cutie, any user can inquire about it
    function canBreed(uint40 _cutieId)
        public
        view
        returns (bool)
    {
        require(_cutieId > 0);
        Cutie storage cutie = cuties[_cutieId];
        return _canBreed(cutie);
    }

    /// @dev Check if given mom and dad are a valid mating pair.
    function _canPairMate(
        Cutie storage _mom,
        uint40 _momId,
        Cutie storage _dad,
        uint40 _dadId
    )
        private
        view
        returns(bool)
    {
        // A Cutie can't breed with itself.
        if (_dadId == _momId) { 
            return false; 
        }

        // Cuties can't breed with their parents.
        if (_mom.momId == _dadId) {
            return false;
        }
        if (_mom.dadId == _dadId) {
            return false;
        }

        if (_dad.momId == _momId) {
            return false;
        }
        if (_dad.dadId == _momId) {
            return false;
        }

        // We can short circuit the sibling check (below) if either cat is
        // gen zero (has a mom ID of zero).
        if (_dad.momId == 0) {
            return true;
        }
        if (_mom.momId == 0) {
            return true;
        }

        // Cuties can't breed with full or half siblings.
        if (_dad.momId == _mom.momId) {
            return false;
        }
        if (_dad.momId == _mom.dadId) {
            return false;
        }
        if (_dad.dadId == _mom.momId) {
            return false;
        }
        if (_dad.dadId == _mom.dadId) {
            return false;
        }

        if (geneMixer.canBreed(_momId, _mom.genes, _dadId, _dad.genes)) {
            return true;
        }
        return false;
    }

    /// @notice Checks to see if two cuties can breed together (checks both
    ///  ownership and breeding approvals, but does not check if both cuties are ready for
    ///  breeding).
    /// @param _momId The ID of the proposed mom.
    /// @param _dadId The ID of the proposed dad.
    function canBreedWith(uint40 _momId, uint40 _dadId)
        public
        view
        returns(bool)
    {
        require(_momId > 0);
        require(_dadId > 0);
        Cutie storage mom = cuties[_momId];
        Cutie storage dad = cuties[_dadId];
        return _canPairMate(mom, _momId, dad, _dadId) && _isBreedingPermitted(_dadId, _momId);
    }
    
    /// @dev Internal check to see if a given dad and mom are a valid mating pair for
    ///  breeding via market (this method doesn't check ownership and if mating is allowed).
    function _canMateViaMarketplace(uint40 _momId, uint40 _dadId)
        internal
        view
        returns (bool)
    {
        Cutie storage mom = cuties[_momId];
        Cutie storage dad = cuties[_dadId];
        return _canPairMate(mom, _momId, dad, _dadId);
    }

    function getBreedingFee(uint40 _momId, uint40 _dadId)
        public
        view
        returns (uint256)
    {
        return config.getBreedingFee(_momId, _dadId);
    }


    /// @notice Breed cuties that you own, or for which you
    ///  have previously been given Breeding approval. Will either make your cutie give birth, or will
    ///  fail.
    /// @param _momId The ID of the Cutie acting as mom (will end up give birth if successful)
    /// @param _dadId The ID of the Cutie acting as dad (will begin its breeding cooldown if successful)
    function breedWith(uint40 _momId, uint40 _dadId) 
        public
        whenNotPaused
        payable
        returns (uint40)
    {
        // Caller must own the mom.
        require(_isOwner(msg.sender, _momId));

        // Neither dad nor mom can be on auction during
        // breeding.
        // For mom: The caller of this function can't be the owner of the mom
        //   because the owner of a Cutie on auction is the auction house, and the
        //   auction house will never call breedWith().
        // For dad: Similarly, a dad on auction will be owned by the auction house
        //   and the act of transferring ownership will have cleared any outstanding
        //   breeding approval.
        // Thus we don't need check if either cutie
        // is on auction.

        // Check that mom and dad are both owned by caller, or that the dad
        // has given breeding permission to caller (i.e. mom's owner).
        // Will fail for _dadId = 0
        require(_isBreedingPermitted(_dadId, _momId));

        // Check breeding fee
        require(getBreedingFee(_momId, _dadId) <= msg.value);

        // Grab a reference to the potential mom
        Cutie storage mom = cuties[_momId];

        // Make sure mom's cooldown isn't active, or in the middle of a breeding cooldown
        require(_canBreed(mom));

        // Grab a reference to the potential dad
        Cutie storage dad = cuties[_dadId];

        // Make sure dad cooldown isn't active, or in the middle of a breeding cooldown
        require(_canBreed(dad));

        // Test that these cuties are a valid mating pair.
        require(_canPairMate(
            mom,
            _momId,
            dad,
            _dadId
        ));

        return _breedWith(_momId, _dadId);
    }

    /// @dev Internal utility function to start breeding, assumes that all breeding
    ///  requirements have been checked.
    function _breedWith(uint40 _momId, uint40 _dadId) internal returns (uint40)
    {
        // Grab a reference to the Cuties from storage.
        Cutie storage dad = cuties[_dadId];
        Cutie storage mom = cuties[_momId];

        // Trigger the cooldown for both parents.
        _triggerCooldown(_dadId, dad);
        _triggerCooldown(_momId, mom);

        // Clear breeding permission for both parents.
        delete sireAllowedToAddress[_momId];
        delete sireAllowedToAddress[_dadId];

        // Check that the mom is a valid cutie.
        require(mom.birthTime != 0);

        // Determine the higher generation number of the two parents
        uint16 babyGen = config.getBabyGen(mom.generation, dad.generation);

        // Call the gene mixing operation.
        uint256 childGenes = geneMixer.mixGenes(mom.genes, dad.genes);

        // Make the new cutie
        address owner = cutieIndexToOwner[_momId];
        uint40 cutieId = _createCutie(_momId, _dadId, babyGen, getCooldownIndexFromGeneration(babyGen), childGenes, owner, mom.cooldownEndTime);

        // return the new cutie's ID
        return cutieId;
    }

    mapping(address => uint40) isTutorialPetUsed;

    /// @dev Completes a breeding tutorial cutie (non existing in blockchain)
    ///  with auction by bidding. Immediately breeds with dad on auction.
    /// @param _dadId - ID of the dad on auction.
    function bidOnBreedingAuctionTutorial(
        uint40 _dadId
    )
        public
        payable
        whenNotPaused
        returns (uint)
    {
        require(isTutorialPetUsed[msg.sender] == 0);

        // Take breeding fee
        uint256 fee = getBreedingFee(0, _dadId);
        require(msg.value >= fee);

        // breeding auction will throw if the bid fails.
        breedingMarket.bid.value(msg.value - fee)(_dadId);

        // Grab a reference to the Cuties from storage.
        Cutie storage dad = cuties[_dadId];

        // Trigger the cooldown for parent.
        _triggerCooldown(_dadId, dad);

        // Clear breeding permission for parent.
        delete sireAllowedToAddress[_dadId];

        uint16 babyGen = config.getTutorialBabyGen(dad.generation);

        // tutorial pet genome is zero
        uint256 childGenes = geneMixer.mixGenes(0x0, dad.genes);

        // tutorial pet id is zero
        uint40 cutieId = _createCutie(0, _dadId, babyGen, getCooldownIndexFromGeneration(babyGen), childGenes, msg.sender, 12);

        isTutorialPetUsed[msg.sender] = cutieId;

        // return the new cutie's ID
        return cutieId;
    }

    address party1address;
    address party2address;
    address party3address;
    address party4address;
    address party5address;

    /// @dev Setup project owners
    function setParties(address _party1, address _party2, address _party3, address _party4, address _party5) public onlyOwner
    {
        require(_party1 != address(0));
        require(_party2 != address(0));
        require(_party3 != address(0));
        require(_party4 != address(0));
        require(_party5 != address(0));

        party1address = _party1;
        party2address = _party2;
        party3address = _party3;
        party4address = _party4;
        party5address = _party5;
    }

    /// @dev Reject all Ether which is not from game contracts from being sent here.
    function() external payable {
        require(
            msg.sender == address(saleMarket) ||
            msg.sender == address(breedingMarket) ||
            address(plugins[msg.sender]) != address(0)
        );
    }

    /// @dev The balance transfer from the market and plugins contract
    /// to the CutieCore contract.
    function withdrawBalances() external
    {
        require(
            msg.sender == ownerAddress || 
            msg.sender == operatorAddress);

        saleMarket.withdrawEthFromBalance();
        breedingMarket.withdrawEthFromBalance();
        for (uint32 i = 0; i < pluginsArray.length; ++i)        
        {
            pluginsArray[i].withdraw();
        }
    }

    /// @dev The balance transfer from CutieCore contract to project owners
    function withdrawEthFromBalance() external
    {
        require(
            msg.sender == party1address ||
            msg.sender == party2address ||
            msg.sender == party3address ||
            msg.sender == party4address ||
            msg.sender == party5address ||
            msg.sender == ownerAddress || 
            msg.sender == operatorAddress);

        require(party1address != 0);
        require(party2address != 0);
        require(party3address != 0);
        require(party4address != 0);
        require(party5address != 0);

        uint256 total = address(this).balance;

        party1address.transfer(total*105/1000);
        party2address.transfer(total*105/1000);
        party3address.transfer(total*140/1000);
        party4address.transfer(total*140/1000);
        party5address.transfer(total*510/1000);
    }

/*
 * @title String & slice utility library for Solidity contracts.
 * @author Nick Johnson <[email protected]>
 *
 * @dev Functionality in this library is largely implemented using an
 *      abstraction called a 'slice'. A slice represents a part of a string -
 *      anything from the entire string to a single character, or even no
 *      characters at all (a 0-length slice). Since a slice only has to specify
 *      an offset and a length, copying and manipulating slices is a lot less
 *      expensive than copying and manipulating the strings they reference.
 *
 *      To further reduce gas costs, most functions on slice that need to return
 *      a slice modify the original one instead of allocating a new one; for
 *      instance, `s.split(".")` will return the text up to the first '.',
 *      modifying s to only contain the remainder of the string after the '.'.
 *      In situations where you do not want to modify the original slice, you
 *      can make a copy first with `.copy()`, for example:
 *      `s.copy().split(".")`. Try and avoid using this idiom in loops; since
 *      Solidity has no memory management, it will result in allocating many
 *      short-lived slices that are later discarded.
 *
 *      Functions that return two slices come in two versions: a non-allocating
 *      version that takes the second slice as an argument, modifying it in
 *      place, and an allocating version that allocates and returns the second
 *      slice; see `nextRune` for example.
 *
 *      Functions that have to copy string data will return strings rather than
 *      slices; these can be cast back to slices for further processing if
 *      required.
 *
 *      For convenience, some functions are provided with non-modifying
 *      variants that create a new slice and return both; for instance,
 *      `s.splitNew('.')` leaves s unmodified, and returns two values
 *      corresponding to the left and right parts of the string.
 */

    struct slice
    {
        uint _len;
        uint _ptr;
    }

    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string self) internal pure returns (slice)
    {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    function memcpy(uint dest, uint src, uint len) private pure
    {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    /*
     * @dev Returns a newly allocated string containing the concatenation of
     *      `self` and `other`.
     * @param self The first slice to concatenate.
     * @param other The second slice to concatenate.
     * @return The concatenation of the two strings.
     */
    function concat(slice self, slice other) internal pure returns (string)
    {
        string memory ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }


    function uintToString(uint256 a) internal pure returns (string result)
    {
        string memory r = "";
        do
        {
            uint b = a % 10;
            a /= 10;

            string memory c = "";

            if (b == 0) c = "0";
            else if (b == 1) c = "1";
            else if (b == 2) c = "2";
            else if (b == 3) c = "3";
            else if (b == 4) c = "4";
            else if (b == 5) c = "5";
            else if (b == 6) c = "6";
            else if (b == 7) c = "7";
            else if (b == 8) c = "8";
            else if (b == 9) c = "9";

            r = concat(toSlice(c), toSlice(r));
        }
        while (a > 0);
        result = r;
    }
}

Contract ABI
[{"constant":true,"inputs":[],"name":"gen0CutieCreatedCount","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_cutieId","type":"uint40"}],"name":"canBreed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_party1","type":"address"},{"name":"_party2","type":"address"},{"name":"_party3","type":"address"},{"name":"_party4","type":"address"},{"name":"_party5","type":"address"}],"name":"setParties","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_cutieId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradedContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressToApprovedAll","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"cutieIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dadId","type":"uint40"}],"name":"bidOnBreedingAuctionTutorial","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createPromoCutie","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCooldownIndex","outputs":[{"name":"cooldownIndex","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"cutieId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getOptional","outputs":[{"name":"optional","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newMinSignId","type":"uint40"}],"name":"setMinSign","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_breedingAddress","type":"address"},{"name":"_saleAddress","type":"address"}],"name":"setMarketAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"isValidSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"plugins","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isCutieCore","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_startPrice","type":"uint128"},{"name":"_endPrice","type":"uint128"},{"name":"_duration","type":"uint40"}],"name":"createSaleAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"sireAllowedToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"breedingMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_generation","type":"uint16"}],"name":"changeGeneration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setUpgradedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_cutieId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"getBreedingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_optional","type":"uint64"}],"name":"changeOptional","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEthFromBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_startPrice","type":"uint128"},{"name":"_endPrice","type":"uint128"},{"name":"_duration","type":"uint40"}],"name":"createBreedingAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_metadataUrlPrefix","type":"string"},{"name":"_metadataUrlSuffix","type":"string"}],"name":"setMetadataUrl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_fromIndex","type":"uint40"},{"name":"_toIndex","type":"uint40"},{"name":"saleAddress","type":"address"},{"name":"breedingAddress","type":"address"}],"name":"migrate2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setConfigAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_cutieId","type":"uint40"},{"name":"_parameter","type":"uint256"}],"name":"runPlugin","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"promoLimit","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minSignId","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"getSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getGenes","outputs":[{"name":"genes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"runPluginSigned","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getGeneration","outputs":[{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"startPrice","type":"uint128"},{"name":"endPrice","type":"uint128"},{"name":"duration","type":"uint40"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removePlugin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_recipient","type":"address"}],"name":"restoreCutieToAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_cutieId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"cutieIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOperator","type":"address"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"usedSignes","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"}],"name":"hashArguments","outputs":[{"name":"msgHash","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"breedWith","outputs":[{"name":"","type":"uint40"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cuties","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint40"},{"name":"cooldownEndTime","type":"uint40"},{"name":"momId","type":"uint40"},{"name":"dadId","type":"uint40"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"},{"name":"optional","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_cooldownEndTime","type":"uint40"}],"name":"changeCooldownEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"metadataUrlPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"infoUrl","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_cooldownIndex","type":"uint16"}],"name":"changeCooldownIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"metadataUrlSuffix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addPlugin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"promoCutieCreatedCount","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_genes","type":"uint256"}],"name":"changeGenes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGeneMixerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCutie","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint40"},{"name":"cooldownEndTime","type":"uint40"},{"name":"momId","type":"uint40"},{"name":"dadId","type":"uint40"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0Limit","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_fromIndex","type":"uint40"},{"name":"_toIndex","type":"uint40"}],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"pluginsArray","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dadId","type":"uint40"},{"name":"_momId","type":"uint40"}],"name":"bidOnBreedingAuction","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCooldownEndTime","outputs":[{"name":"cooldownEndTime","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_dadId","type":"uint40"}],"name":"approveBreeding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"momId","type":"uint40"},{"indexed":false,"name":"dadId","type":"uint40"},{"indexed":false,"name":"genes","type":"uint256"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint256"},{"indexed":false,"name":"newValue","type":"uint256"}],"name":"GenesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint40"},{"indexed":false,"name":"newValue","type":"uint40"}],"name":"CooldownEndTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"ololdValue","type":"uint16"},{"indexed":false,"name":"newValue","type":"uint16"}],"name":"CooldownIndexChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint16"},{"indexed":false,"name":"newValue","type":"uint16"}],"name":"GenerationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint64"},{"indexed":false,"name":"newValue","type":"uint64"}],"name":"OptionalChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signId","type":"uint40"},{"indexed":false,"name":"sender","type":"address"}],"name":"SignUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signId","type":"uint40"}],"name":"MinSignSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"BreedingApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

Contract Creation Code
60606040818152600a805460a060020a60ff02191690555190810160405280602281526020017f68747470733a2f2f626c6f636b636861696e6375746965732e636f2f6375746981526020017f652f000000000000000000000000000000000000000000000000000000000000815250600b90805162000084929160200190620004e0565b5060408051908101604052600481527f2e737667000000000000000000000000000000000000000000000000000000006020820152600c908051620000ce929160200190620004e0565b506011805469ffffffffff0000000000191666c350000000000017605060020a64ffffffffff0219166b13880000000000000000000017905534156200011357600080fd5b600a805460098054600160a060020a033316600160a060020a0319918216811790925560a060020a60ff02199092167401000000000000000000000000000000000000000017919091161790556200018260008080806000198180640100000000620047076200018982021704565b5062000620565b60006200019562000565565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e082018190528054919450600191808301620001fe8382620005a9565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff92909216780100000000000000000000000000000000000000000000000002600160c060020a039092169190911790555003915064ffffffffff8211156200035257600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a2620003db6000878364010000000062004975620003e982021704565b9a9950505050505050505050565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a03191690911790558316156200048c57600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200052357805160ff191683800117855562000553565b8280016001018555821562000553579182015b828111156200055357825182559160200191906001019062000536565b5062000561929150620005dd565b5090565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b815481835581811511620005d857600202816002028360005260206000209182019101620005d89190620005fd565b505050565b620005fa91905b80821115620005615760008155600101620005e4565b90565b620005fa91905b8082111562000561576000808255600182015560020162000604565b61551e80620006306000396000f3006060604052600436106103ac5763ffffffff60e060020a60003504166219a46b811461040857806301ffc9a71461043557806305910b911461047e57806306fdde031461049b578063081812fc1461052557806308ba7ee714610557578063095ea7b31461058e5780630da2e088146105b05780630dca63e8146105c357806310e9678b146105e257806313af4035146105ff57806318160ddd1461061e5780631bbfce0e14610643578063210fcbf61461065557806323b872dd146106775780632917f1621461069f5780632f745c59146106d35780633e6d4e12146106f55780633f4ba83a1461072f57806340a92f0f1461074257806342842e0e1461075f578063430c73c51461078757806345c7a092146107ac5780634b12e643146107f65780634d6a813a146108155780634f6ccce71461082857806350bc6bba1461083e578063551799131461086b5780635a390a5f146108885780635a3f88f01461089b5780635c975abb146108bf5780635f24f6fe146108d25780636352211e146108f157806366dc860a146109075780636c2959361461092a5780636ccbb0ab1461095457806370a0823114610967578063776247c41461098657806378a6c6d21461099957806379502c55146109c657806379edfa7d146109d9578063839daf1d14610a6c57806383a12de914610aaa5780638456cb5914610ac9578063887e0c0714610adc578063889231c114610afd5780638f9a57ef14610b1057806394e50e7a14610b2357806395d89b4114610b6d578063999d394714610b805780639ad73f2014610b9d5780639c91ae2014610bdc5780639de8302f14610bf9578063a22cb46514610c2b578063a4d95b6414610c4f578063a86ee74614610c6e578063a9059cbb14610c97578063b1d9549714610cb9578063b3ab15fb14610cd6578063b5113bf614610cf5578063b88d4fde14610d12578063bdad811214610d49578063c30bc5ef14610d87578063c44f217414610d9f578063c479142114610e16578063c7047fa714610e39578063c87b56dd14610e4c578063cf7e69f814610e62578063d4d6d36614610e86578063d8867fc814610e99578063d997933f14610eb8578063e09ef83e14610edb578063e1af915d14610eee578063e205842414610f0e578063e33607da14610f2d578063e39bdfab14610f40578063e515a4d114610fab578063e985e9c514610fbe578063edc9f18214610fe3578063f3ca087314611012578063f3cb180514611028578063f6dfcff714611040578063fb43b2a21461105d575b60055433600160a060020a03908116911614806103d7575060065433600160a060020a039081169116145b806103fb5750600160a060020a033381166000908152600d60205260409020541615155b151561040657600080fd5b005b341561041357600080fd5b61041b611086565b60405164ffffffffff909116815260200160405180910390f35b341561044057600080fd5b61046a7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516611093565b604051901515815260200160405180910390f35b341561048957600080fd5b61046a64ffffffffff60043516611155565b34156104a657600080fd5b6104ae61122e565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156104ea5780820151838201526020016104d2565b50505050905090810190601f1680156105175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053057600080fd5b61053b600435611270565b604051600160a060020a03909116815260200160405180910390f35b341561056257600080fd5b610406600160a060020a0360043581169060243581169060443581169060643581169060843516611325565b341561059957600080fd5b610406600160a060020a0360043516602435611408565b34156105bb57600080fd5b61053b61149d565b34156105ce57600080fd5b61053b600160a060020a03600435166114b5565b34156105ed57600080fd5b61053b64ffffffffff600435166114d0565b341561060a57600080fd5b610406600160a060020a03600435166114eb565b341561062957600080fd5b61063161153d565b60405190815260200160405180910390f35b61063164ffffffffff60043516611547565b341561066057600080fd5b610406600435600160a060020a03602435166117a0565b341561068257600080fd5b610406600160a060020a03600435811690602435166044356118c2565b34156106aa57600080fd5b6106bc64ffffffffff60043516611937565b60405161ffff909116815260200160405180910390f35b34156106de57600080fd5b610631600160a060020a0360043516602435611976565b341561070057600080fd5b61071264ffffffffff600435166119f5565b60405167ffffffffffffffff909116815260200160405180910390f35b341561073a57600080fd5b610406611a3a565b341561074d57600080fd5b61040664ffffffffff60043516611aac565b341561076a57600080fd5b610406600160a060020a0360043581169060243516604435611b57565b341561079257600080fd5b610406600160a060020a0360043581169060243516611bed565b34156107b757600080fd5b61046a600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435611c36565b341561080157600080fd5b61053b600160a060020a0360043516611c6c565b341561082057600080fd5b61046a611c87565b341561083357600080fd5b61063160043561126d565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516611c8c565b341561087657600080fd5b61053b64ffffffffff60043516611d67565b341561089357600080fd5b61053b611d82565b34156108a657600080fd5b61040664ffffffffff6004351661ffff60243516611d91565b34156108ca57600080fd5b61046a611ea2565b34156108dd57600080fd5b610406600160a060020a0360043516611eb2565b34156108fc57600080fd5b61053b600435611f78565b341561091257600080fd5b61063164ffffffffff60043581169060243516611fbb565b341561093557600080fd5b61040664ffffffffff6004351667ffffffffffffffff60243516612031565b341561095f57600080fd5b610406612159565b341561097257600080fd5b610631600160a060020a03600435166122c0565b341561099157600080fd5b6104066122db565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516612533565b34156109d157600080fd5b61053b61260b565b34156109e457600080fd5b61040660046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061261a95505050505050565b3415610a7757600080fd5b610406600160a060020a0360043581169064ffffffffff602435811691604435909116906064358116906084351661265c565b3415610ab557600080fd5b610406600160a060020a0360043516612886565b3415610ad457600080fd5b610406612928565b610406600160a060020a036004351664ffffffffff60243516604435612980565b3415610b0857600080fd5b61041b612a8e565b3415610b1b57600080fd5b61041b612aa2565b3415610b2e57600080fd5b61053b600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612aaf565b3415610b7857600080fd5b6104ae612b30565b3415610b8b57600080fd5b61063164ffffffffff60043516612b71565b610406600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612ba2565b3415610be757600080fd5b6106bc64ffffffffff60043516612d91565b3415610c0457600080fd5b6104066004356001608060020a036024358116906044351664ffffffffff60643516612dd0565b3415610c3657600080fd5b610406600160a060020a03600435166024351515612f0a565b3415610c5a57600080fd5b610406600160a060020a0360043516612fb8565b3415610c7957600080fd5b61040664ffffffffff60043516600160a060020a0360243516613125565b3415610ca257600080fd5b610406600160a060020a0360043516602435613192565b3415610cc457600080fd5b61053b64ffffffffff600435166131dc565b3415610ce157600080fd5b610406600160a060020a03600435166131f7565b3415610d0057600080fd5b61053b64ffffffffff60043516613249565b3415610d1d57600080fd5b610406600160a060020a0360048035821691602480359091169160443591606435908101910135613264565b3415610d5457600080fd5b610631600160a060020a036004351664ffffffffff602435811690604435166001608060020a03606435166084356133db565b61041b64ffffffffff60043581169060243516613478565b3415610daa57600080fd5b610db5600435613688565b60405197885264ffffffffff9687166020890152948616604080890191909152938616606088015291909416608086015261ffff93841660a086015290921660c084015267ffffffffffffffff1660e0830152610100909101905180910390f35b3415610e2157600080fd5b61040664ffffffffff60043581169060243516613709565b3415610e4457600080fd5b6104ae61381a565b3415610e5757600080fd5b6104ae6004356138b8565b3415610e6d57600080fd5b61040664ffffffffff6004351661ffff602435166139f0565b3415610e9157600080fd5b6104ae613aff565b3415610ea457600080fd5b610406600160a060020a0360043516613b6a565b3415610ec357600080fd5b61046a64ffffffffff60043581169060243516613c56565b3415610ee657600080fd5b61041b613cea565b3415610ef957600080fd5b61040664ffffffffff60043516602435613d14565b3415610f1957600080fd5b610406600160a060020a0360043516613dd0565b3415610f3857600080fd5b61053b613e72565b3415610f4b57600080fd5b610f5d64ffffffffff60043516613e81565b60405196875264ffffffffff958616602088015293851660408088019190915292851660608701529316608085015261ffff92831660a0850152911660c083015260e0909101905180910390f35b3415610fb657600080fd5b61041b613f0b565b3415610fc957600080fd5b61046a600160a060020a0360043581169060243516613f21565b3415610fee57600080fd5b610406600160a060020a036004351664ffffffffff60243581169060443516613f43565b341561101d57600080fd5b61053b600435614230565b61063164ffffffffff60043581169060243516614258565b341561104b57600080fd5b61041b64ffffffffff60043516614347565b341561106857600080fd5b610406600160a060020a036004351664ffffffffff6024351661438b565b60115464ffffffffff1681565b60007f6466353c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198316148061114f57506040517f737570706f727473496e74657266616365286279746573342900000000000000815260190160405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b92915050565b60008064ffffffffff831681901161116c57600080fd5b6000805464ffffffffff851690811061118157fe5b906000526020600020906002020190506112258161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b91505b50919050565b61123661537d565b60408051908101604052601081527f426c6f636b636861696e43757469657300000000000000000000000000000000602082015290505b90565b6000808264ffffffffff81111561128657600080fd5b61128e61153d565b84111561129a57600080fd5b64ffffffffff8416600090815260036020526040902054600160a060020a0316156112e65764ffffffffff8416600090815260036020526040902054600160a060020a0316925061131e565b64ffffffffff8416600090815260016020908152604080832054600160a060020a039081168085526007909352922054909116935091505b5050919050565b60095433600160a060020a0390811691161461134057600080fd5b600160a060020a038516151561135557600080fd5b600160a060020a038416151561136a57600080fd5b600160a060020a038316151561137f57600080fd5b600160a060020a038216151561139457600080fd5b600160a060020a03811615156113a957600080fd5b60148054600160a060020a0319908116600160a060020a03978816179091556015805482169587169590951790945560168054851693861693909317909255601780548416918516919091179055601880549092169216919091179055565b600a5460a060020a900460ff161561141f57600080fd5b8064ffffffffff81111561143257600080fd5b61143c3383614448565b151561144757600080fd5b611451828461446f565b82600160a060020a031633600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a3505050565b601054650100000000009004600160a060020a031681565b600760205260009081526040902054600160a060020a031681565b600360205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461150657600080fd5b600160a060020a038116151561151b57600080fd5b60098054600160a060020a031916600160a060020a0392909216919091179055565b6000546000190190565b600080600080600080600a60149054906101000a900460ff1615151561156c57600080fd5b600160a060020a03331660009081526013602052604090205464ffffffffff161561159657600080fd5b6115a1600088611fbb565b945034859010156115b157600080fd5b600654600160a060020a031663c170fd54348790038960405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561160257600080fd5b5af1151561160f57600080fd5b5050505060008764ffffffffff1681548110151561162957fe5b9060005260206000209060020201935061164387856144a6565b64ffffffffff8716600090815260046020526040908190208054600160a060020a03191690556008546001860154600160a060020a039091169163656e8d6f9160b060020a900461ffff16905160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156116c657600080fd5b5af115156116d357600080fd5b50505060405180516012548654919550600160a060020a03169150638d8b1b889060009060405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561173257600080fd5b5af1151561173f57600080fd5b5050506040518051905091506117646000888561175b8761469d565b8633600c614707565b33600160a060020a03166000908152601360205260409020805464ffffffffff191664ffffffffff929092169182179055979650505050505050565b600a5433600160a060020a03908116911614806117cb575060095433600160a060020a039081169116145b15156117d657600080fd5b601154601054605060020a90910464ffffffffff908116790100000000000000000000000000000000000000000000000000909204161061181657600080fd5b600160a060020a03811615156118345750600a54600160a060020a03165b60108054600164ffffffffff790100000000000000000000000000000000000000000000000000808404821683018216027fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179092556011805480831690930190911664ffffffffff199092169190911790556118bd6000808080868642614707565b505050565b600a5460a060020a900460ff16156118d957600080fd5b8064ffffffffff8111156118ec57600080fd5b6118f6338361494e565b8061190657506119068433613f21565b151561191157600080fd5b61191b8483614448565b151561192657600080fd5b611931848484614975565b50505050565b60008060008364ffffffffff1681548110151561195057fe5b600091825260209091206002909102016001015460a060020a900461ffff169392505050565b60008060015b61198461153d565b64ffffffffff8216116119e85764ffffffffff8116600090815260016020526040902054600160a060020a03868116911614156119e057838264ffffffffff1614156119d9578064ffffffffff1692506119ed565b6001909101905b60010161197c565b600080fd5b505092915050565b60008060008364ffffffffff16815481101515611a0e57fe5b600091825260209091206002909102016001015460c060020a900467ffffffffffffffff169392505050565b60095433600160a060020a03908116911614611a5557600080fd5b600a5460a060020a900460ff161515611a6d57600080fd5b601054650100000000009004600160a060020a031615611a8c57600080fd5b600a805474ff000000000000000000000000000000000000000019169055565b600a5433600160a060020a0390811691161480611ad7575060095433600160a060020a039081169116145b1515611ae257600080fd5b60105464ffffffffff90811690821611611afb57600080fd5b6010805464ffffffffff191664ffffffffff83811691909117918290557f61adbe79b14a8cd89d2e6b327307808e258e0e9a9da800e5c9c5cf5b20efc91c911660405164ffffffffff909116815260200160405180910390a150565b600a5460a060020a900460ff1615611b6e57600080fd5b8064ffffffffff811115611b8157600080fd5b600160a060020a0383161515611b9657600080fd5b30600160a060020a031683600160a060020a031614151515611bb757600080fd5b600554600160a060020a0384811691161415611bd257600080fd5b600654600160a060020a03848116911614156118ec57600080fd5b60095433600160a060020a03908116911614611c0857600080fd5b60068054600160a060020a03938416600160a060020a03199182161790915560058054929093169116179055565b600a54600090600160a060020a0316611c558a8a8a8a8a8a8a8a612aaf565b600160a060020a0316149998505050505050505050565b600d60205260009081526040902054600160a060020a031681565b600190565b600a5460a060020a900460ff1615611ca357600080fd5b611cad3385614448565b1515611cb857600080fd5b600554611ccf908590600160a060020a031661446f565b600554600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b5af11515611d5d57600080fd5b5050505050505050565b600460205260009081526040902054600160a060020a031681565b600654600160a060020a031681565b600a5460009060a060020a900460ff1615611dab57600080fd5b600160a060020a033381166000908152600d6020526040902054161515611dd157600080fd5b6000805464ffffffffff8516908110611de657fe5b60009182526020909120600290910201600181015490915061ffff83811660b060020a90920416146118bd57600181015464ffffffffff8416907f253c1885cda0cc3462691396c0720f0b8d26a408db39c442f6cba580aa2bacbe9060b060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660b060020a0277ffff0000000000000000000000000000000000000000000019909116179055505050565b600a5460a060020a900460ff1681565b60095433600160a060020a03908116911614611ecd57600080fd5b600a5460a060020a900460ff161515611ee557600080fd5b600160a060020a0381161515611efa57600080fd5b6010805478ffffffffffffffffffffffffffffffffffffffff0000000000191665010000000000600160a060020a03848116820292909217928390557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305920416604051600160a060020a03909116815260200160405180910390a150565b60008164ffffffffff811115611f8d57600080fd5b64ffffffffff8316600090815260016020526040902054600160a060020a0316915081151561122857600080fd5b600854600090600160a060020a03166366dc860a848460405160e060020a63ffffffff851602815264ffffffffff928316600482015291166024820152604401602060405180830381600087803b151561201457600080fd5b5af1151561202157600080fd5b5050506040518051949350505050565b600a5460009060a060020a900460ff161561204b57600080fd5b600160a060020a033381166000908152600d602052604090205416151561207157600080fd5b6000805464ffffffffff851690811061208657fe5b60009182526020909120600290910201600181015490915067ffffffffffffffff83811660c060020a90920416146118bd57600181015464ffffffffff8416907f0e4fadd6d53b262b076fce73fbf5c344b680a42f10f095326782f42d56b9beb29060c060020a900467ffffffffffffffff168460405167ffffffffffffffff9283168152911660208201526040908101905180910390a260018101805467ffffffffffffffff841660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff909116179055505050565b60095460009033600160a060020a03908116911614806121875750600a5433600160a060020a039081169116145b151561219257600080fd5b600554600160a060020a031663776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156121d157600080fd5b5af115156121de57600080fd5b5050600654600160a060020a0316905063776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561222157600080fd5b5af1151561222e57600080fd5b505050600090505b600e5463ffffffff821610156122bd57600e805463ffffffff831690811061225a57fe5b600091825260209091200154600160a060020a0316633ccfd60b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156122a257600080fd5b5af115156122af57600080fd5b505050806001019050612236565b50565b600160a060020a031660009081526002602052604090205490565b60145460009033600160a060020a0390811691161480612309575060155433600160a060020a039081169116145b80612322575060165433600160a060020a039081169116145b8061233b575060175433600160a060020a039081169116145b80612354575060185433600160a060020a039081169116145b8061236d575060095433600160a060020a039081169116145b806123865750600a5433600160a060020a039081169116145b151561239157600080fd5b601454600160a060020a031615156123a857600080fd5b601554600160a060020a031615156123bf57600080fd5b601654600160a060020a031615156123d657600080fd5b601754600160a060020a031615156123ed57600080fd5b601854600160a060020a0316151561240457600080fd5b50601454600160a060020a033081163191166108fc6103e860698402049081150290604051600060405180830381858888f19350505050151561244657600080fd5b601554600160a060020a03166103e8606983020480156108fc0290604051600060405180830381858888f19350505050151561248157600080fd5b601654600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124bc57600080fd5b601754600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124f757600080fd5b601854600160a060020a03166103e86101fe83020480156108fc0290604051600060405180830381858888f1935050505015156122bd57600080fd5b600a5460a060020a900460ff161561254a57600080fd5b6125543385614448565b151561255f57600080fd5b61256884611155565b151561257357600080fd5b60065461258a908590600160a060020a031661446f565b600654600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b600854600160a060020a031681565b60095433600160a060020a0390811691161461263557600080fd5b600b82805161264892916020019061538f565b50600c8180516118bd92916020019061538f565b600954600090819081908190819033600160a060020a0390811691161461268257600080fd5b600a5460a060020a900460ff16151561269a57600080fd5b8994508693508592508891505b64ffffffffff8089169083161161287a5784600160a060020a0316636352211e8360405160e060020a63ffffffff841602815264ffffffffff9091166004820152602401602060405180830381600087803b151561270457600080fd5b5af1151561271157600080fd5b50505060405180519050905086600160a060020a031681600160a060020a031614156127c05783600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561278357600080fd5b5af1151561279057600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b85600160a060020a031681600160a060020a031614156128635782600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561282657600080fd5b5af1151561283357600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b61286f60008284614975565b6001909101906126a7565b50505050505050505050565b60095460009033600160a060020a039081169116146128a457600080fd5b5080600160a060020a03811663dcb31b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156128e357600080fd5b5af115156128f057600080fd5b50505060405180519050151561290557600080fd5b60088054600160a060020a031916600160a060020a039290921691909117905550565b60095433600160a060020a0390811691161461294357600080fd5b600a5460a060020a900460ff161561295a57600080fd5b600a805474ff0000000000000000000000000000000000000000191660a060020a179055565b600a5460a060020a900460ff161561299757600080fd5b64ffffffffff821615806129b057506129b03383614448565b15156129bb57600080fd5b600160a060020a038381166000908152600d60205260409020541615156129e157600080fd5b60008264ffffffffff1611156129fb576129fb828461446f565b600160a060020a038084166000908152600d602052604090819020549091169063a055d4559034908590859033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612a7857600080fd5b5af11515612a8557600080fd5b50505050505050565b601154605060020a900464ffffffffff1681565b60105464ffffffffff1681565b600080612abf8a8a8a8a8a6133db565b90506001818686866040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515612b1957600080fd5b5050602060405103519a9950505050505050505050565b612b3861537d565b60408051908101604052600281527f42430000000000000000000000000000000000000000000000000000000000006020820152905090565b60008060008364ffffffffff16815481101515612b8a57fe5b60009182526020909120600290910201549392505050565b600a5460a060020a900460ff1615612bb957600080fd5b64ffffffffff86161580612bd25750612bd23387614448565b1515612bdd57600080fd5b600160a060020a038881166000908152600d6020526040902054161515612c0357600080fd5b64ffffffffff87166000908152600f6020526040902054600160a060020a031615612c2d57600080fd5b60105464ffffffffff9081169088161015612c4757600080fd5b346001608060020a0386161115612c5d57600080fd5b612c6d8888888888888888611c36565b1515612c7857600080fd5b64ffffffffff87166000908152600f6020526040908190208054600160a060020a03191633600160a060020a038116919091179091557f3b213e544d7183ac9b8a682aa7ad1d52d0b2c05c7aba9bf7bc025d7b3847b63e918991905164ffffffffff9092168252600160a060020a031660208201526040908101905180910390a1600160a060020a038089166000908152600d6020526040908190205490911690639652713e9087908990889033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612d7657600080fd5b5af11515612d8357600080fd5b505050505050505050505050565b60008060008364ffffffffff16815481101515612daa57fe5b600091825260209091206002909102016001015460b060020a900461ffff169392505050565b600a5460009033600160a060020a0390811691161480612dfe575060095433600160a060020a039081169116145b1515612e0957600080fd5b60115464ffffffffff6501000000000082048116911610612e2957600080fd5b612e3a600080600080893042614707565b600554909150612e54908290600160a060020a031661446f565b600554600160a060020a031663c1d1faf3828686863060405160e060020a63ffffffff881602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a401600060405180830381600087803b1515612ed557600080fd5b5af11515612ee257600080fd5b50506011805464ffffffffff8082166001011664ffffffffff19909116179055505050505050565b8015612f445733600160a060020a0390811660009081526007602052604090208054600160a060020a031916918416919091179055612f6b565b600160a060020a03331660009081526007602052604090208054600160a060020a03191690555b81600160a060020a031633600160a060020a03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051901515815260200160405180910390a35050565b60095460009033600160a060020a03908116911614612fd657600080fd5b600160a060020a038083166000908152600d6020526040908190205490911690631195236990518163ffffffff1660e060020a028152600401600060405180830381600087803b151561302857600080fd5b5af1151561303557600080fd5b50505050600160a060020a0381166000908152600d602052604081208054600160a060020a03191690555b600e548110156131215781600160a060020a0316600e8281548110151561308357fe5b600091825260209091200154600160a060020a0316141561311857600e805460001981019081106130b057fe5b600091825260209091200154600e8054600160a060020a0390921691839081106130d657fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600e80549061311290600019830161540d565b5061311c565b6001015b613060565b5050565b600a5433600160a060020a0390811691161480613150575060095433600160a060020a039081169116145b151561315b57600080fd5b600a5460a060020a900460ff161561317257600080fd5b61317c3083614448565b151561318757600080fd5b613121308284614975565b600a5460a060020a900460ff16156131a957600080fd5b8064ffffffffff8111156131bc57600080fd5b6131c63383614448565b15156131d157600080fd5b6118bd338484614975565b600160205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461321257600080fd5b600160a060020a038116151561322757600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600f60205260009081526040902054600160a060020a031681565b600a5460a060020a900460ff161561327b57600080fd5b8264ffffffffff81111561328e57600080fd5b600160a060020a03851615156132a357600080fd5b30600160a060020a031685600160a060020a0316141515156132c457600080fd5b600554600160a060020a03868116911614156132df57600080fd5b600654600160a060020a03868116911614156132fa57600080fd5b613304338561494e565b8061331457506133148633613f21565b151561331f57600080fd5b6133298685614448565b151561333457600080fd5b61333f868686614975565b84600160a060020a031663f0b9e5ba8786868660405160e060020a63ffffffff8716028152600160a060020a0385166004820190815260248201859052606060448301908152606483018490529091608401848480828437820191505095505050505050602060405180830381600087803b15156133bc57600080fd5b5af115156133c957600080fd5b50505060405180515050505050505050565b60008585858585604051600160a060020a03959095166c0100000000000000000000000002855264ffffffffff9384167b0100000000000000000000000000000000000000000000000000000090810260148701529290931690910260198401526001608060020a031670010000000000000000000000000000000002601e830152602e820152604e016040518091039020905095945050505050565b600a546000908190819060a060020a900460ff161561349657600080fd5b6134a03386614448565b15156134ab57600080fd5b6134b58486614a6b565b15156134c057600080fd5b346134cb8686611fbb565b11156134d657600080fd5b6000805464ffffffffff87169081106134eb57fe5b9060005260206000209060020201915061358f8261010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561359a57600080fd5b6000805464ffffffffff86169081106135af57fe5b906000526020600020906002020190506136538161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561365e57600080fd5b61366a82868387614ad4565b151561367557600080fd5b61367f8585614d2a565b95945050505050565b600080548290811061369657fe5b60009182526020909120600290910201805460019091015490915064ffffffffff80821691650100000000008104821691605060020a8204811691607860020a81049091169061ffff60a060020a820481169160b060020a81049091169067ffffffffffffffff60c060020a9091041688565b600a5460009060a060020a900460ff161561372357600080fd5b600160a060020a033381166000908152600d602052604090205416151561374957600080fd5b6000805464ffffffffff851690811061375e57fe5b60009182526020909120600290910201600181015490915064ffffffffff8381166501000000000090920416146118bd57600181015464ffffffffff808516917fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b38189165010000000000909104168460405164ffffffffff9283168152911660208201526040908101905180910390a260018101805464ffffffffff8416650100000000000269ffffffffff000000000019909116179055505050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b820191906000526020600020905b81548152906001019060200180831161389357829003601f168201915b505050505081565b6138c061537d565b61114f613966600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b820191906000526020600020905b81548152906001019060200180831161393f57829003601f168201915b5050505050614f32565b6139eb61397861397d61397887614f5a565b614f32565b6139eb600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b615270565b600a5460009060a060020a900460ff1615613a0a57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613a3057600080fd5b6000805464ffffffffff8516908110613a4557fe5b60009182526020909120600290910201600181015490915061ffff83811660a060020a90920416146118bd57600181015464ffffffffff8416907f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef2749060a060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660a060020a0275ffff000000000000000000000000000000000000000019909116179055505050565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b60095460009033600160a060020a03908116911614613b8857600080fd5b5080600160a060020a0381166394a892336040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613bc757600080fd5b5af11515613bd457600080fd5b505050604051805190501515613be957600080fd5b600160a060020a038281166000908152600d602052604090208054600160a060020a031916918316919091179055600e805460018101613c29838261540d565b5060009182526020909120018054600160a060020a031916600160a060020a039290921691909117905550565b6000808064ffffffffff8516819011613c6e57600080fd5b600064ffffffffff851611613c8257600080fd5b6000805464ffffffffff8716908110613c9757fe5b9060005260206000209060020201915060008464ffffffffff16815481101515613cbd57fe5b90600052602060002090600202019050613cd982868387614ad4565b801561367f575061367f8486614a6b565b601054790100000000000000000000000000000000000000000000000000900464ffffffffff1681565b600a5460009060a060020a900460ff1615613d2e57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613d5457600080fd5b6000805464ffffffffff8516908110613d6957fe5b906000526020600020906002020190508181600001541415156118bd578264ffffffffff167fbecce9a2928a6d9bbe3755bd02387af9dbe05d1ecfa05028c33d7245e24a860c82600001548460405191825260208201526040908101905180910390a25550565b60095460009033600160a060020a03908116911614613dee57600080fd5b5080600160a060020a0381166390da7c3c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613e2d57600080fd5b5af11515613e3a57600080fd5b505050604051805190501515613e4f57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600554600160a060020a031681565b60008060008060008060008060008964ffffffffff16815481101515613ea357fe5b600091825260209091206002909102018054600190910154909a64ffffffffff8083169b5065010000000000830481169a50605060020a830481169950607860020a830416975061ffff60a060020a83048116975060b060020a909204909116945092505050565b60115465010000000000900464ffffffffff1681565b600160a060020a03918216600090815260076020526040902054821691161490565b6000806000806000806000806000613f59615431565b60095433600160a060020a03908116911614613f7457600080fd5b600a5460a060020a900460ff161515613f8c57600080fd5b8b64ffffffffff16613f9c61153d565b60010114613fa957600080fd5b8c99508b98505b64ffffffffff808c16908a16116142215789600160a060020a031663e39bdfab8a60405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160e060405180830381600087803b151561400d57600080fd5b5af1151561401a57600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051969e50949c50929a50909850965094509092506101009050604051908101604052808981526020018864ffffffffff1681526020018764ffffffffff1681526020018664ffffffffff1681526020018564ffffffffff1681526020018461ffff1681526020018361ffff168152602001600067ffffffffffffffff168152509050600080548060010182816140db9190615475565b6000928352602090922083916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001918201805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790559a909a019950613fb09050565b50505050505050505050505050565b600e80548290811061423e57fe5b600091825260209091200154600160a060020a0316905081565b600a54600090819060a060020a900460ff161561427457600080fd5b61427e3384614448565b151561428957600080fd5b61429283611155565b151561429d57600080fd5b6142a783856152dc565b15156142b257600080fd5b6142bc8385611fbb565b905034819010156142cc57600080fd5b600654600160a060020a031663c170fd54348390038660405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561431d57600080fd5b5af1151561432a57600080fd5b505050506143388385614d2a565b64ffffffffff16949350505050565b60008060008364ffffffffff1681548110151561436057fe5b600091825260209091206002909102016001015465010000000000900464ffffffffff169392505050565b600a5460a060020a900460ff16156143a257600080fd5b6143ac3382614448565b15156143b757600080fd5b64ffffffffff8116600090815260046020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907fe53f1ce10d7caafaafcb8d2857c06db87da891294ba914f8436e31b905e1e0e79084905164ffffffffff909116815260200160405180910390a35050565b600042826040015164ffffffffff16111592915050565b64ffffffffff16600090815260016020526040902054600160a060020a0391821691161490565b64ffffffffff9190911660009081526003602052604090208054600160a060020a031916600160a060020a03909216919091179055565b600181015460085460a060020a90910461ffff1690600090600160a060020a03166306347def8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b151561450657600080fd5b5af1151561451357600080fd5b505050604051805160018501805469ffffffffff000000000019166501000000000064ffffffffff9384168102919091179182905587831693507fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b3818928692919091041660405164ffffffffff9283168152911660208201526040908101905180910390a2600854600160a060020a031663732606fc6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156145d657600080fd5b5af115156145e357600080fd5b505050604051805160018086015461ffff60a060020a9091048116909101161015905061193157506001808301805461ffff60a060020a80830482169485018216810275ffff000000000000000000000000000000000000000019909316929092179283905564ffffffffff8716927f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef27492859291041660405161ffff9283168152911660208201526040908101905180910390a250505050565b600854600090600160a060020a0316635757dcdf8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156146eb57600080fd5b5af115156146f857600080fd5b50505060405180519392505050565b6000614711615431565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e0820181905280549194506001918083016147788382615475565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555003915064ffffffffff8211156148c757600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a261494060008783614975565b9a9950505050505050505050565b64ffffffffff16600090815260036020526040902054600160a060020a0391821691161490565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a0319169091179055831615614a1757600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b64ffffffffff8082166000908152600160205260408082205492851682528120549091600160a060020a0390811691168082148061367f575064ffffffffff8516600090815260046020526040902054600160a060020a03908116908316149250505092915050565b60008364ffffffffff168264ffffffffff161415614af457506000614d22565b600185015464ffffffffff838116605060020a909204161415614b1957506000614d22565b600185015464ffffffffff838116607860020a909204161415614b3e57506000614d22565b600183015464ffffffffff858116605060020a909204161415614b6357506000614d22565b600183015464ffffffffff858116607860020a909204161415614b8857506000614d22565b6001830154605060020a900464ffffffffff161515614ba957506001614d22565b6001850154605060020a900464ffffffffff161515614bca57506001614d22565b60018581015490840154605060020a9182900464ffffffffff90811692909104161415614bf957506000614d22565b60018086015490840154605060020a900464ffffffffff908116607860020a909204161415614c2a57506000614d22565b60018086015490840154607860020a900464ffffffffff908116605060020a909204161415614c5b57506000614d22565b60018581015490840154607860020a9182900464ffffffffff90811692909104161415614c8a57506000614d22565b60125485548454600160a060020a039092169163c868a569918791869060405160e060020a63ffffffff871602815264ffffffffff94851660048201526024810193909352921660448201526064810191909152608401602060405180830381600087803b1515614cfa57600080fd5b5af11515614d0757600080fd5b5050506040518051905015614d1e57506001614d22565b5060005b949350505050565b6000806000806000806000808864ffffffffff16815481101515614d4a57fe5b9060005260206000209060020201955060008964ffffffffff16815481101515614d7057fe5b90600052602060002090600202019450614d8a88876144a6565b614d9489866144a6565b64ffffffffff808a166000908152600460205260408082208054600160a060020a03199081169091558b841683529120805490911690556001860154161515614ddc57600080fd5b60085460018681015490880154600160a060020a0390921691631af97fb79161ffff60b060020a91829004811692919091041660405160e060020a63ffffffff851602815261ffff928316600482015291166024820152604401602060405180830381600087803b1515614e4f57600080fd5b5af11515614e5c57600080fd5b505050604051805160125487548954929750600160a060020a039091169250638d8b1b889160405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b1515614ebc57600080fd5b5af11515614ec957600080fd5b505050604051805164ffffffffff8b16600090815260016020526040902054909450600160a060020a03169250614f259050898986614f078161469d565b60018a01548890889065010000000000900464ffffffffff16614707565b9998505050505050505050565b614f3a6154a1565b602082016040805190810160405280845181526020019190915292915050565b614f6261537d565b614f6a61537d565b6000614f7461537d565b60206040519081016040526000815292505b600a808604950691506020604051908101604052600081529050811515614fe25760408051908101604052600181527f300000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600114156150265760408051908101604052600181527f310000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816002141561506a5760408051908101604052600181527f320000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600314156150ae5760408051908101604052600181527f330000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600414156150f25760408051908101604052600181527f340000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600514156151365760408051908101604052600181527f350000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816006141561517a5760408051908101604052600181527f360000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600714156151be5760408051908101604052600181527f370000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600814156152025760408051908101604052600181527f380000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600914156152425760408051908101604052600181527f3900000000000000000000000000000000000000000000000000000000000000602082015290505b61525761524e82614f32565b6139eb85614f32565b9250600085111561526757614f86565b50909392505050565b61527861537d565b61528061537d565b600083518551016040518059106152945750595b818152601f19601f8301168101602001604052905091506020820190506152c18186602001518751615338565b6152d48551820185602001518651615338565b509392505050565b6000806000808564ffffffffff168154811015156152f657fe5b9060005260206000209060020201915060008464ffffffffff1681548110151561531c57fe5b9060005260206000209060020201905061367f82868387614ad4565b60005b6020821061535e578251845260208401935060208301925060208203915061533b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153d057805160ff19168380011785556153fd565b828001600101855582156153fd579182015b828111156153fd5782518255916020019190600101906153e2565b506154099291506154b8565b5090565b8154818355818115116118bd576000838152602090206118bd9181019083016154b8565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b8154818355818115116118bd576002028160020283600052602060002091820191016118bd91906154d2565b604080519081016040526000808252602082015290565b61126d91905b8082111561540957600081556001016154be565b61126d91905b8082111561540957600080825560018201556002016154d85600a165627a7a72305820fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b0029


   Swarm Source:
bzzr://fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.