ETH Price: $3,404.85 (+4.50%)

Token

Marble (MIB)
 

Overview

Max Total Supply

262 MIB

Holders

38

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 MIB
0x3934bA5291a7F96cf74c621022a4c3322c793C7A
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Marbles

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 7 of 11: marbles.sol
pragma solidity ^0.4.11;

import "./ERC721BasicTokenSoloArcade.sol";  
import "./OwnableSolo.sol";
import "./PayableSolo.sol";
import "./ERC721MetadataSoloArcade.sol";


//@title Marbles
//@dev marbles contract inherets ERC721 Non-Fungible Token Standard basic implementation.
//@author Oleg Mitrakhovich                        
contract Marbles is ERC721BasicTokenSoloArcade, OwnableSolo, PayableSolo, ERC721MetadataSoloArcade {

    //@dev basic structure of a marble, 8 attributes.
    struct Marble {
    
        uint256 batch;    //assigns which batch the marble is from (1, 2, 3, 4, etc.)
        string material;  // glass, clay, agate, steel, alabaster
        uint size;        // 12mm, 14mm, 16mm, 18mm, 19mm, 22mm, 25mm, 35mm, 41mm, 48mm
        string pattern;   /*1.Corkscrew Swirls 
                            2.Ribbon Swirls 
                            3.Fancy Swirls 
                            4.Cat’s Eye 
                            5.Clouds 
                            6.Onionskins 
                            7.Bullseye 
                            8.Clearies 
                            9.Opaques
                          */ 

        string origin; /* 1.Germany 
                          2.Belgium 
                          3.Japan 
                          4.China 420
                          5.US 
                          6.Mexico 
                         */
        string forged; // handmade, machined, custom
        string grade;  // mint, near mint, good, exprienced, senior 
        string color;  //list of colors
        
    } 

    //@dev emits add marble attributes event
    //@param _tokenId ID of the token that just had all of its attributes changed
    event addMarbleAttributesConfirmed(uint256 indexed _tokenId);
    

    //@dev stores all the marble prices by its ID.
    mapping(uint256 => uint256) public marblePrices;

    //@dev storing total created marble count
    uint public marbleCount;
    
    
    //@dev storing the count of all place holder marbles.
    uint public placeHolderMarbleCount;

    //@dev stores the highest marble ID created.
    uint public highestMarbleCreated;
    
    //@dev stores the highest Marble ID in the catalaug
    uint public highestMarbleInventory;
    
    //@dev stores highest place holder marble ID created.
    uint public highestPlaceHolderCreated;
    
    //@dev stores all the place holder marbles IDs 
    mapping(uint256 => bool) public placeHolderMarbles;

    //@dev stores marble IDs to marble struct 
    mapping(uint256 => Marble) public marbles; 
    
    //@dev stores all the placeholder marbles by index
    mapping (uint256 => uint256) public placeHolderMarbleIndex;
    
    //@dev first queue number used in placeholdermarbleIndex
    uint256 public first = 1;
    
    //@dev last queue number used in placeholdermarbleIndex
    uint256 public last = 0;
    
    
    //@dev checks to see if the price being used to buy a marble is correct, throws if its not
    modifier priceCheck(uint256 _tokenId) {
       require(marblePrices[_tokenId] == msg.value);
       _;
    }

    
    //@dev upon deployment ETH will be deposited to marbles contract, if there is any.
    constructor () public payable {
        deposit(msg.value);
    }
    
    //@dev fall back function, will execute when someone tries to send ETH to this contract address
    function () public payable {
        deposit(msg.value); //deposit ETH to contract
    }
    
    //@dev returns the total supply of marbles
    function totalSupply() public view returns (uint256 total){
        return marbleCount;
    }

    
     //@dev returns the placeholder marble ID that is located in the first Index.
     function getPlaceHolderMarble() public view returns(uint256 placeholdermarble){
      return placeHolderMarbleIndex[first];
     }

     //@dev returns all marbles of owner by index. should be used on the back end to sync the database. run this in a loop.
     function getMarblesOwnedByIndex(uint256 index, address _owner) public view returns(uint256 marbleId){
      address owner = tokenOwner[index];
      require(owner == _owner);
      return index;
     }

     //@dev returns all marbles created on the contract by index. should be used on the back end to sync. run this in a loop.
     function getAllMarblesCreatedByIndex(uint256 index) public view returns(uint256 marbleId){
      address owner = tokenOwner[index];
      require(owner != address(0));
      return index;
     }

     //@credit CryptoKitties contract (https://ethfiddle.com/09YbyJRfiI) (https://etherscan.io/token/0x06012c8cf97bead5deae237070f9587f8e7a266d#readContract)
     //@dev searches for all the marbles that were assigned to a specific address, returns an array of marble IDs.
     //@dev DO NOT USE THIS FUNCTION inside the contract, it is too expensive and your function call will time out, if their is too many marbles to find. 
     //@dev This function is used to support web3 calls. 
     //@dev When tested with web3 calls this function stopped looking for marbles at 1000 on Rikenby test network.
     //@param _owner wallet address of the owner who owns marble IDs
     function marblesOwned(address _owner) external view returns(uint256[] MarblesOwned) {
        uint256 CountOfMarbles = balanceOf(_owner);   //stores the total number of marbles that are owned by the "_owner" address

        if (CountOfMarbles == 0) {                    //checks to see if the count of marbles is at zero
        
            return new uint256[](0);                  // function returns an empty array of the above if statement returns true  
        
        } else {                                        
        
            uint256[] memory result = new uint256[](CountOfMarbles); //allocating memory in the result array to the count of possible owned marbles by the "_owner"
            uint256 totalMarbles = highestMarbleCreated;             //setting totalMarbles to the highest marble ID. This is done to keep the value constant when used in the for loop.
            uint256 resultIndex = 0;                                 //initializing resultIndex at 0

            uint256 MarbleId;                                        //initializing MarbleId to use later in the for loop 

            for (MarbleId = 1; MarbleId <= totalMarbles; MarbleId++) { //MarbleId gets intialized at 1, the loop will keep going till MarbleId is higher than the total number of Marbles. Adds 1 to MarbleId each loop cycle
                if (tokenOwner[MarbleId] == _owner) { //uses TokenOwner mapping from ERC721BasicToken contract, returns true if MarbleId was mapped to "_owner" address
                    result[resultIndex] = MarbleId;   //stores the MarbleId in a array of uint256 called result, uses resultIndex to expand the array
                    resultIndex++;                    //add one to resultIdex
                }

                if (CountOfMarbles == resultIndex){   //returns the function early when the result count is equal to the total owner's marbles.
                    return result;
                }
            }                                         

            return result;                            //returns an array of MarbleIds
        }
    }
 
    //@dev returns all the marble Token IDs that were created
    //DO NOT USE THIS FUNCTION INTERNALLY. For testing purposes only
    function allMarblesCreated() external view returns(uint256[] MarblesCreated){
        uint256 allMarblesCreatedCount = marbleCount;
        uint256[] memory result = new uint256[](allMarblesCreatedCount); //allocating enough memory to store all the Marble IDs created
        uint256 resultIndex = 0; //setting result index to 0
        uint256 allTokens = highestMarbleCreated;
        uint256 tokenIndex;      //token index that will be used in tokenOwner mapping

        for(tokenIndex = 1; tokenIndex <= allTokens; tokenIndex++){
            if(tokenOwner[tokenIndex] != 0){ //checks if the index of that token owner is not equal to zero
            result[resultIndex] = tokenIndex; //if the above statement returns true, stores the token Id in array called result
            resultIndex++;//increases result index by one
            
            }
        }

        return result;  //returns the final result of all token IDs created
    }
   
    //@dev returns a list of marbles that are still placeholder marbles
    function getPlaceHolderMarbles() external view returns(uint256[] resultPlaceHolders){
              uint256 allPlaceHoldersCreatedCount = placeHolderMarbleCount;
              uint256[] memory result = new uint256[](allPlaceHoldersCreatedCount);
              uint256 resultIndex = 0;
              uint256 allPlaceHolders = highestMarbleCreated;
              uint256 index;

              for(index = 1; index <= allPlaceHolders; index++){
                  if(placeHolderMarbles[index]){
                  result[resultIndex] = index;
                  resultIndex++;
                  }
              }

              return result;
    }


    
    //@dev configures the marble price and stores the highest marble ID currently available for sale
    //@param _newPriceInWei takes in the marble price in wei of one marble
    //@param _highestMarbleInventory takes in the highest token ID currently available in store
    function configStore (uint256 _newPriceInWei, uint256 startingId, uint endingId) external onlyOwner {
                  for(uint i = startingId; i <= endingId; i++){
                    marblePrices[i] = _newPriceInWei;
                  } 
                  
                  if(highestMarbleInventory < endingId){
                      highestMarbleInventory = endingId; //sets the highest marble ID in store catalogue, used inside modifiers to check if the marble ID being requested is a valid one.
                  }            
                   
    }

    //@dev returns the token price in string format, uint to string
    //@credit "ORACLIZE_API" https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
    // <ORACLIZE_API>
    /*
    Copyright (c) 2015-2016 Oraclize SRL
    Copyright (c) 2016 Oraclize LTD
    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:
    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.
    */
    function getMarblePrice(uint256 _tokenId) external view returns (string){
                uint256 marblePrice = marblePrices[_tokenId];
               
                if(marblePrice == 0) return "0";
                uint j = marblePrice;
                uint len;
                while(j != 0){
                    len++;
                    j /= 10;
                }

                bytes memory bstr = new bytes(len);
                uint k = len - 1;
                
                while(marblePrice != 0){
                    bstr[k--] = byte(48 + marblePrice % 10);
                    marblePrice /= 10;
                }

                return string(bstr);
    }

           
  
    //@dev used in requestBuy function. Makes sure that token ID was not created on the contract and creates a placeholder structure for that specific marble.
    modifier MarblePlaceHolderCreation(uint256 _marbleId){
        require(!_exists(_marbleId)); //makes sure marble Id was not created on the contract
        require(_marbleId <= highestMarbleInventory); //makes sure marble Id is lower than highest marble ID available for sale
        marbles[_marbleId] = Marble(_marbleId,"NULL", _marbleId, "NULL", "NULL", "NULL", "NULL", "NULL"); //creates a place holder structure for clients future marble
        placeHolderMarbles[_marbleId] = true; //sets marble ID to true for being a placeholder marble
        last += 1;
        placeHolderMarbleIndex[last] = _marbleId;
        placeHolderMarbleCount++;             //adds one to total placeholder marble account, later used for memorory allocation
         if(highestPlaceHolderCreated < _marbleId){ //checks to see if the highest place holder marble created is lower than marble ID.
            highestPlaceHolderCreated = _marbleId; //if above statement is true  sets the current marble ID to highest place holder marble created
        }
        _;
    }
    
    //@dev used in requestBuy function. uses ERC721BasicToken minting function.
    modifier TokenMint(address _wallet, uint256 _tokenId){
        _mint(_wallet, _tokenId); //Mints the token ID of the newest placeholder structure to that wallet address.
        marbleCount++; //adds one to total marble count
        _;
    }

    //@dev before function can be executed it, the priceCheck modifier checks if the price matches to what is stored in marblePrice.
    //IfNotPaused checks to see if the function was paused by the owner of the contract.
    //MarblePlaceHolderCreation creates a marble placeholder structure that will be modified later with attributes from the database
    //TokenMint modifier mints the token Id to that specific wallet, prevents double buying of the same marble in the store.
    //@param _wallet address of a wallet thats making a request to buy a marble
    //@param _tokenId ID of the token thats being requested for purchase
    function requestBuy(uint256 _tokenId) payable external ifNotPaused priceCheck(_tokenId) MarblePlaceHolderCreation(_tokenId) TokenMint(msg.sender, _tokenId) {
                 deposit(msg.value);
    }
     
     //@dev allows the owner of the contract to buy marbles for free
     function requestBuyOwner(uint256 _tokenId) external ifNotPaused onlyOwner MarblePlaceHolderCreation(_tokenId) TokenMint(msg.sender, _tokenId) {
                 
     }

     modifier checkIfMarblePlaceHolder(uint256 _marbleId){
         require(placeHolderMarbles[_marbleId]);
         _;
     }
     
     modifier changePlaceHolderMarbleToFalse(uint256 _marbleId){
         placeHolderMarbles[_marbleId] = false;
         _;
     }
     
     //@dev adds marble attributes to a created marble placeholder
     //@param _tokenId   stores token ID that needs to created
     //@param _material  glass, clay, agate, steel, alabaster
     //@param _size      12mm, 14mm, 16mm, 18mm, 19mm, 22mm, 25mm, 35mm, 41mm, 48mm
     //@param _pattern   1.Corkscrew Swirls 2.Ribbon Swirls 3.Fancy Swirls 4.Cat’s Eyes 5.Clouds 6.Onionskins 7.Bullseye 8.Clearies 9.Opaques
     //@param _origin    1.Germany 2.Belgium 3.Japan 4.China 5.US 6.Mexico 
     //@param _forged    handmade, machined, custom
     //@param _grade     mint, near mint, good, exprienced, senior
     //@param _color     list of colors, Example "188-142-94/229-66-251/63-89-145" 
     //@param _uriBase   takes a string of the URI base string, where metadata for that token will be stored, Example (https://api.cryptomibs.co/marbles/10000)                                                                                                 
    function addMarbleAttributes(uint256 _marbleId, uint256 _batch, string _material, uint _size, string _pattern, string _origin, string _forged, string _grade, string _color, string _uriBase) ifNotPaused onlyCreator checkIfMarblePlaceHolder(_marbleId) changePlaceHolderMarbleToFalse(_marbleId) public  {
        marbles[_marbleId] = Marble(_batch, _material, _size, _pattern, _origin, _forged, _grade, _color); //modifies the placeholder marble.
        setTokenURI(_marbleId, _uriBase); //sets token URI
        
        if(highestMarbleCreated < _marbleId){ //checks to see if the highestMarbleCreated is lower than marble ID.
            highestMarbleCreated = _marbleId; //if the above statement returns true, set the new marble ID to highestMarbleCreated.
        }

        
        
        if(last >= first){
            delete placeHolderMarbleIndex[first];
            first += 1;
        }
       
        if(placeHolderMarbleCount != 0){
        placeHolderMarbleCount--;             //decreases the count of all place holder marbles by one.
        }
        
        emit addMarbleAttributesConfirmed(_marbleId); //emits an events sending the wallet address and marble ID of the token that was created and modified with new attributes from database.
        
    }
    
    //@dev used for games to change marble attributes depending on the result of the game. only one of the pre set creator wallets can use this function.
    function changeMarbleAttributes(uint256 _marbleId, uint256 _batch, string _material, uint _size, string _pattern, string _origin, string _forged, string _grade, string _color) public {
          require(gameContracts[msg.sender]);
          marbles[_marbleId] = Marble(_batch, _material, _size, _pattern, _origin, _forged, _grade, _color);
    }
    
    //@dev returns a transfered  marble ID, for processing
    function getTransferedMarbleId() public view returns(uint256 transferedMarble){
        return transferedMarbleIndex[firstFirst];
    }
    
    //@dev checks if marble ID is a recently transfered marble
    modifier checkIfTransferedMarbleIsTrue(uint256 tokenId){
        require(transferedMarbles[tokenId]);
        _;
    }
    
    //@dev changes the status of the transfered marble to false
    modifier changeTransferedMarbleStatusToFalse(uint256 tokenId){
        transferedMarbles[tokenId] = false;
        _;
    }
    
    //@dev increments the transfer marble queue
    function incrementTransferMarbleIndex(uint256 tokenId) public onlyCreator checkIfTransferedMarbleIsTrue(tokenId) changeTransferedMarbleStatusToFalse(tokenId){
         if(lastLast >= firstFirst){
          delete transferedMarbleIndex[firstFirst];
          firstFirst += 1;
        }
    }
    
    //@dev emergency function that force incrments the transfer queue, can only be used by one of the creator wallets
    function forceIncrementTransferMarbleIndex() public onlyCreator returns(bool increment){
        if(lastLast >= firstFirst){
          delete transferedMarbleIndex[firstFirst];
          firstFirst += 1;
          return true;
        }
        return false;
    }    
    

}

File 1 of 11: AddressUtils.sol
pragma solidity ^0.4.24;


/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param _account address of the account to check
   * @return whether the target address is a contract
   */
  function isContract(address _account) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(_account) }
    return size > 0;
  }

}

//The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

File 2 of 11: ERC165.sol
pragma solidity ^0.4.24;


/**
 * @title ERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface ERC165 {

  /**
   * @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.
   */
  function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool);
}

//The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

File 3 of 11: ERC721Basic.sol
pragma solidity ^0.4.24;

import "./ERC165.sol";


/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic is ERC165 {

  bytes4 internal constant InterfaceId_ERC721 = 0x80ac58cd;
  /*
   * 0x80ac58cd ===
   *   bytes4(keccak256('balanceOf(address)')) ^
   *   bytes4(keccak256('ownerOf(uint256)')) ^
   *   bytes4(keccak256('approve(address,uint256)')) ^
   *   bytes4(keccak256('getApproved(uint256)')) ^
   *   bytes4(keccak256('setApprovalForAll(address,bool)')) ^ 
   *   bytes4(keccak256('isApprovedForAll(address,address)')) ^
   *   bytes4(keccak256('transferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))
   */
   
//   bytes4 constant public InterfaceId_ERC721 =   //0x6dd562d1
//     bytes4(keccak256('balanceOf(address)')) ^
//     bytes4(keccak256('ownerOf(uint256)')) ^
//     bytes4(keccak256('exists(uint256)')) ^
//     bytes4(keccak256('approve(address,uint256)')) ^
//     bytes4(keccak256('getApproved(uint256)')) ^
//     //bytes4(keccak256('setApprovalForAll(address,bool)')) ^
//     bytes4(keccak256('isApprovedForAll(address,address)')) ^
//     bytes4(keccak256('transferFrom(address,address,uint256)')) ^
//     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
//     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'));

  bytes4 internal constant InterfaceId_ERC721Enumerable = 0x780e9d63;
  /**
   * 0x780e9d63 ===
   *   bytes4(keccak256('totalSupply()')) ^
   *   bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
   *   bytes4(keccak256('tokenByIndex(uint256)'))
   */

  bytes4 internal constant InterfaceId_ERC721Metadata = 0x5b5e139f;
  /**
   * 0x5b5e139f ===
   *   bytes4(keccak256('name()')) ^
   *   bytes4(keccak256('symbol()')) ^
   *   bytes4(keccak256('tokenURI(uint256)'))
   */
  //all the basic functions start here...basically....
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);

  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId) public view returns (address _operator);

  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator) public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;

  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data ) public;
}

//The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

File 4 of 11: ERC721BasicTokenSoloArcade.sol
pragma solidity ^0.4.24;

import "./ERC721Basic.sol";
import "./ERC721Receiver.sol";
import "./SafeMath.sol";
import "./AddressUtils.sol";
import "./SupportsInterfaceWithLookup.sol";


/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicTokenSoloArcade is SupportsInterfaceWithLookup, ERC721Basic {

  using SafeMath for uint256;
  using AddressUtils for address;

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

  // Mapping from token ID to owner
  mapping (uint256 => address) internal tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) internal tokenApprovals;

  // Mapping from owner to number of owned token
  mapping (address => uint256) internal ownedTokensCount;

  // Mapping from owner to operator approvals
  mapping (address => mapping (address => bool)) internal operatorApprovals;
  
  //@dev stores all the game contracts that ERC721BasicToken will safely interact with
  mapping (address => bool) public gameContracts;
  
  //@dev sets the "gameMaster" who can add game contracts to marbles contract
  address public gameMaster;
  
  // @dev Throws if called by any account other than the gameMaster
  modifier onlyGameMaster() {
    require(msg.sender == gameMaster);
    _;
  }
  
  //@dev sets the game contracts that are allowed to interact with the marbles contract
  function setGameContracts(address _newGameContract) public onlyGameMaster{
      gameContracts[_newGameContract] = true;
  }
  
  //@dev stores all the transfered marbles in a form of a queue, helps the database to keep in sync
  mapping (uint256 => uint256) public transferedMarbleIndex;
  
  //@dev sets the status of the marble to transfered marble, helps the increment function to not increment over a marble thats has not being looked at by the database
  mapping (uint256 => bool) public transferedMarbles;
  
  //@dev used at the first number in the transfered queue
  uint256 public firstFirst = 1;
  
  //@dev used as last number in the transfered queue
  uint256 public lastLast = 0;
  
  
  constructor()
    public
  {
     //@dev sets the "gameMaster" to the address of the owner of the contract
     gameMaster = msg.sender;
    //@dev register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(InterfaceId_ERC721);
  }

  /**
   * @dev Gets the balance of the specified address
   * @param _owner address to query the balance of
   * @return uint256 representing the amount owned by the passed address
   */
  function balanceOf(address _owner) public view returns (uint256) {
    require(_owner != address(0));
    return ownedTokensCount[_owner];
  }

  /**
   * @dev Gets the owner of the specified token ID
   * @param _tokenId uint256 ID of the token to query the owner of
   * @return owner address currently marked as the owner of the given token ID
   */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    address owner = tokenOwner[_tokenId];
    require(owner != address(0));
    return owner;
  }

  /**
   * @dev Approves another address to transfer the given token ID
   * The zero address indicates there is no approved address.
   * There can only be one approved address per token at a given time.
   * Can only be called by the token owner or an approved operator.
   * @param _to address to be approved for the given token ID
   * @param _tokenId uint256 ID of the token to be approved
   */
  function approve(address _to, uint256 _tokenId) public {
    address owner = ownerOf(_tokenId);
    require(_to != owner);
    require(msg.sender == owner || isApprovedForAll(owner, msg.sender));

    tokenApprovals[_tokenId] = _to;
    emit Approval(owner, _to, _tokenId);
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }

  /**
   * @dev Sets or unsets the approval of a given operator. Disabled for now.
   * An operator is allowed to transfer all tokens of the sender on their behalf
   * @param _to operator address to set the approval
   * @param _approved representing the status of the approval to be set
   */
  function setApprovalForAll(address _to, bool _approved) public {
    require(_to != msg.sender);
    operatorApprovals[msg.sender][_to] = _approved;
    emit ApprovalForAll(msg.sender, _to, _approved);
  }

  /**
   * @dev Tells whether an operator is approved by a given owner
   * @param _owner owner address which you want to query the approval of
   * @param _operator operator address which you want to query the approval of
   * @return bool whether the given operator is approved by the given owner
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    public
    view
    returns (bool)
  {
    return operatorApprovals[_owner][_operator];
  }

  /**
   * @dev Transfers the ownership of a given token ID to another address
   * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
  {
    require(isApprovedOrOwner(msg.sender, _tokenId));
    require(_to != address(0));
    
    clearRemoveAdd(_from, _to, _tokenId);
    
    insertTokenTransferQue(_tokenId); 
    emit Transfer(_from, _to, _tokenId);
  }
  
   /**
   * @dev Transfers the ownership of a given token ID from the game contract
   * Requires the msg.sender to one of the game contracts approved by the game master
   * @param gameContract stores the address of the game contract the function was called from
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferFromGameSolo(address gameContract, address _from, address _to, uint256 _tokenId) public {
      require(gameContracts[gameContract]);
      require(gameContracts[msg.sender]);
      require(ownerOf(_tokenId) == msg.sender);
      require(_to != address(0));
      
      clearRemoveAdd(_from, _to, _tokenId);
      
      emit Transfer(_from, _to, _tokenId);
      
  }
  
   /**
   * @dev internal function used to insert token ID into the transfer queue
   * @param _tokenId uint256 ID of the token to be inserted in the toke queue
  */
  function insertTokenTransferQue(uint256 _tokenId) internal{
    lastLast += 1;
    transferedMarbleIndex[lastLast] = _tokenId;
    transferedMarbles[_tokenId] = true;
  }
  
  /**
   * @dev internal function changes ownership of a token ID, makes it easier to recycle code
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function clearRemoveAdd(address _from, address _to, uint256 _tokenId) internal {
       clearApproval(_from, _tokenId);
       removeTokenFrom(_from, _tokenId);
       addTokenTo(_to, _tokenId);
  }
  
  /**
   *@dev transfer function with the same logic as "transfeFrom" function, but this one does not place the marble
   *into the transfer queue. Please don't use this function without the the front end. The database will not be in sync with your transfer.
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferFromGameERC721(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
  {
    require(gameContracts[msg.sender]);
    require(isApprovedOrOwner(tx.origin, _tokenId));
    require(_to != address(0));

    clearRemoveAdd(_from, _to, _tokenId);
    
    emit Transfer(_from, _to, _tokenId);
  }
  
  /**
   * @dev uses the same logic as the transferFrom function, but this function is only used to transfer prizes from games to a winning player.
   * requires that the msg.sender is the game contract added by the game master of the contract
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferPrizeFromGame(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
  {
    require(gameContracts[msg.sender]);
    require(_to != address(0));
    clearRemoveAdd(_from, _to, _tokenId);
    emit Transfer(_from, _to, _tokenId);
  }
  
  
  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   *
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
  {
    // solium-disable-next-line arg-overflow
    safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes data to send along with a safe transfer check
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    public
  {
    transferFrom(_from, _to, _tokenId);
    // solium-disable-next-line arg-overflow
    require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
  }

  /**
   * @dev Returns whether the specified token exists
   * @param _tokenId uint256 ID of the token to query the existence of
   * @return whether the token exists
   */
  function _exists(uint256 _tokenId) internal view returns (bool) {
    address owner = tokenOwner[_tokenId];
    return owner != address(0);
  }

  /**
   * @dev Returns whether the given spender can transfer a given token ID
   * @param _spender address of the spender to query
   * @param _tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   *  is an operator of the owner, or is the owner of the token
   */
  function isApprovedOrOwner(
    address _spender,
    uint256 _tokenId
  )
    internal
    view
    returns (bool)
  {
    address owner = ownerOf(_tokenId);
    // Disable solium check because of
    // https://github.com/duaraghav8/Solium/issues/175
    // solium-disable-next-line operator-whitespace
    return (
      _spender == owner ||
      getApproved(_tokenId) == _spender ||
      isApprovedForAll(owner, _spender)
    );
  }

   /**
    * @dev Internal function to mint a new token
    * Reverts if the given token ID already exists
    * @param _to The address that will own the minted token
    * @param _tokenId uint256 ID of the token to be minted by the msg.sender
    */ 
  function _mint(address _to, uint256 _tokenId) internal {
    require(_to != address(0));
    addTokenTo(_to, _tokenId);
    emit Transfer(address(0), _to, _tokenId);
  }

 

  /**
   * @dev Internal function to clear current approval of a given token ID
   * Reverts if the given address is not indeed the owner of the token
   * @param _owner owner of the token
   * @param _tokenId uint256 ID of the token to be transferred
   */
  function clearApproval(address _owner, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _owner);
    if (tokenApprovals[_tokenId] != address(0)) {
      tokenApprovals[_tokenId] = address(0);
    }
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    require(tokenOwner[_tokenId] == address(0));
    tokenOwner[_tokenId] = _to;
    ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _from);
    ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
    tokenOwner[_tokenId] = address(0);
  }

  /**
   * @dev Internal function to invoke `onERC721Received` on a target address
   * The call is not executed if the target address is not a contract
   * @param _from address representing the previous owner of the given token ID
   * @param _to target address that will receive the tokens
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return whether the call correctly returned the expected magic value
   */
  function checkAndCallSafeTransfer(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    internal
    returns (bool)
  {
    if (!_to.isContract()) {
      return true;
    }
    bytes4 retval = ERC721Receiver(_to).onERC721Received(
      msg.sender, _from, _tokenId, _data);
    return (retval == ERC721_RECEIVED);
  }
}

// The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

File 5 of 11: ERC721MetadataSoloArcade.sol
pragma solidity ^0.4.11;

import "./ERC721BasicTokenSoloArcade.sol";  
import "./OwnableSolo.sol";

contract ERC721MetadataSoloArcade is ERC721BasicTokenSoloArcade, OwnableSolo {

    
    //@dev declares the token name as "Marble"
	string public constant name = "Marble";
    
    //@dev declares the token symbol as "MIB"
    string public constant symbol = "MIB";

    //@dev mapping for token URIs
    mapping(uint256 => string) public tokenURIs;

    //@dev function which sets the token URI, throws if token ID does not exist, only wallet address that is set as creator can set meta data
    //@param tokenId ID of the token to set its URI 
    //@param uri string URI to assign  (example https://api.cryptomibs.co/marbles/)
    function setTokenURI(uint256 tokenId, string uri) onlyCreator public {
        
        if(bytes(tokenURIs[tokenId]).length != 0){ //checks if there is already any metadata recorded for that token ID.
           delete tokenURIs[tokenId];       //clears old metadata if any, for that token ID
        }

        require(_exists(tokenId));   //checks to see if tokenId exists
        
        tokenURIs[tokenId] = uri;    // sets token URI to a given string in tokenURIs mapping

    }

    //@dev returns a URI for a given token ID, throws if token ID does not exists. Turns the URI into bytes and concatenates the token ID to the end of URI base
    //This method uses a turorial from coinmonks.
    //Ref: https://medium.com/coinmonks/jumping-into-solidity-the-erc721-standard-part-6-7ea4af3366fd
    //@param tokenId ID of token to query
    function tokenURI(uint256 tokenId) public view returns (string){
        require(_exists(tokenId)); //checks if token ID exists.
        
        bytes storage uriBase = bytes(tokenURIs[tokenId]);  
    
        //prepare our tokenId's byte array
        uint maxLength = 78;
        bytes memory reversed = new bytes(maxLength);
        uint i = 0;
    
        //loop through and add byte values to the array
        while (tokenId != 0) {
        uint remainder = tokenId % 10;
        tokenId /= 10;
        reversed[i++] = byte(48 + remainder);
        }
    
        //prepare the final array
        bytes memory result = new bytes(uriBase.length + i);
        uint j;
        //add the base to the final array
        for (j = 0; j < uriBase.length; j++) {
        result[j] = uriBase[j];
        }
    
        //add the tokenId to the final array
        for (j = 0; j < i; j++) {
        result[j + uriBase.length] = reversed[i - 1 - j];
        }  
    

        return string(result);  //turn it into a string and return it  
    

    }

}

File 6 of 11: ERC721Receiver.sol
pragma solidity ^0.4.24;


/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract ERC721Receiver {
  /**
   * @dev Magic value to be returned upon successful reception of an NFT
   *  Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`,
   *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
   */
  bytes4 internal constant ERC721_RECEIVED = 0x150b7a02;

  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   * after a `safetransfer`. This function MAY throw to revert and reject the
   * transfer. Return of other than the magic value MUST result in the
   * transaction being reverted.
   * Note: the contract address is always the message sender.
   * @param _operator The address which called `safeTransferFrom` function
   * @param _from The address which previously owned the token
   * @param _tokenId The NFT identifier which is being transferred
   * @param _data Additional data with no specified format
   * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes _data
  )
    public
    returns(bytes4);
}

//The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

File 8 of 11: OwnableSolo.sol
pragma solidity ^0.4.24;


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract OwnableSolo {
  
  //@dev stores the wallet address of the owner of the contract
  address public owner;
  
  //@dev stores the wallet address to allow token creation
  address[] public accounts;

  //@dev keeps track if a function is paused or not, only owner of the contract can change this value to true.
  bool public paused = false;
  
  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }


  //@dev throws if "paused" set to true.
  modifier ifNotPaused() {
        require(!paused);
        _;
    }

  //@dev sets the paused variable to false.
  function unpause() public onlyOwner {
        paused = false;
  }
   
  //@dev set the paused varible to true.
  function pause() public onlyOwner{
        paused = true;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  //@dev Throws if called by any account other than the owners wallet address.
  modifier onlyCreator(){
    for (uint i = 0; i < accounts.length; i++){
     if(accounts[i] == msg.sender){
      _;
      return;
     }
    }
    revert();
  }

  //@dev sets a wallet address to be able to create marbles, only the owner of the contract can set a creator
  //@param _newcreator takes the wallet address of a new creator
  function setCreator(address _newcreator) public onlyOwner {
    accounts.push(_newcreator);
  }
  

  //@dev clears the array of all accounts stored
  function deleteCreators() public onlyOwner{
    delete accounts;
  }


  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

//The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

File 9 of 11: PayableSolo.sol
pragma solidity ^0.4.11;

import "./OwnableSolo.sol";

contract PayableSolo is OwnableSolo {
    
    //@dev withdraws any funds available on the contract, only the owner of the contract can withdraw funds
    function withdraw() onlyOwner public  {
        msg.sender.transfer(this.balance);  //change above to "(address(contract).balance)"
                          
    }

    //@dev deposits ETH to contract
    //@parm amount the amount being deposited
    function deposit(uint256 amount) payable public {
        require(msg.value == amount);
        
    }

    //@dev returns the total balance of ETH on the contract
    function getBalance() public view returns (uint256) {
        return this.balance; //changed this to "return address(contract).balance;"
    } 
}

// The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

File 10 of 11: SafeMath.sol
pragma solidity ^0.4.24;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    uint256 c = _a * _b;
    require(c / _a == _b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b <= _a);
    uint256 c = _a - _b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
    uint256 c = _a + _b;
    require(c >= _a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

//The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

File 11 of 11: SupportsInterfaceWithLookup.sol
pragma solidity ^0.4.24;

import "./ERC165.sol";


/**
 * @title SupportsInterfaceWithLookup
 * @author Matt Condon (@shrugs)
 * @dev Implements ERC165 using a lookup table.
 */
contract SupportsInterfaceWithLookup is ERC165 {

  bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7;
  /**
   * 0x01ffc9a7 ===
   *   bytes4(keccak256('supportsInterface(bytes4)'))
   */

  /**
   * @dev a mapping of interface id to whether or not it's supported
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev A contract implementing SupportsInterfaceWithLookup
   * implement ERC165 itself
   */
  constructor()
    public
  {
    _registerInterface(InterfaceId_ERC165);
  }

  /**
   * @dev implement supportsInterface(bytes4) using a lookup table
   */
  function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceId];
  }

  /**
   * @dev private method for registering an interface
   */
  function _registerInterface(bytes4 _interfaceId)
    internal
  {
    require(_interfaceId != 0xffffffff);
    supportedInterfaces[_interfaceId] = true;
  }
}

//The MIT License (MIT)

// Copyright (c) 2016 Smart Contract Solutions, Inc.

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:

// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// © 2018 GitHub, Inc.

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","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":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allMarblesCreated","outputs":[{"name":"MarblesCreated","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFromGameERC721","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"forceIncrementTransferMarbleIndex","outputs":[{"name":"increment","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transferedMarbleIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"requestBuyOwner","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":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"requestBuy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newPriceInWei","type":"uint256"},{"name":"startingId","type":"uint256"},{"name":"endingId","type":"uint256"}],"name":"configStore","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"first","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newcreator","type":"address"}],"name":"setCreator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"firstFirst","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":true,"inputs":[],"name":"last","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getMarblePrice","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTransferedMarbleId","outputs":[{"name":"transferedMarble","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"highestPlaceHolderCreated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"placeHolderMarbleIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"placeHolderMarbles","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"gameContract","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFromGameSolo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"highestMarbleCreated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastLast","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_marbleId","type":"uint256"},{"name":"_batch","type":"uint256"},{"name":"_material","type":"string"},{"name":"_size","type":"uint256"},{"name":"_pattern","type":"string"},{"name":"_origin","type":"string"},{"name":"_forged","type":"string"},{"name":"_grade","type":"string"},{"name":"_color","type":"string"},{"name":"_uriBase","type":"string"}],"name":"addMarbleAttributes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"marbles","outputs":[{"name":"batch","type":"uint256"},{"name":"material","type":"string"},{"name":"size","type":"uint256"},{"name":"pattern","type":"string"},{"name":"origin","type":"string"},{"name":"forged","type":"string"},{"name":"grade","type":"string"},{"name":"color","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenURIs","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"gameContracts","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"incrementTransferMarbleIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transferedMarbles","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getAllMarblesCreatedByIndex","outputs":[{"name":"marbleId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPlaceHolderMarble","outputs":[{"name":"placeholdermarble","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferPrizeFromGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"},{"name":"_owner","type":"address"}],"name":"getMarblesOwnedByIndex","outputs":[{"name":"marbleId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"deleteCreators","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newGameContract","type":"address"}],"name":"setGameContracts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_marbleId","type":"uint256"},{"name":"_batch","type":"uint256"},{"name":"_material","type":"string"},{"name":"_size","type":"uint256"},{"name":"_pattern","type":"string"},{"name":"_origin","type":"string"},{"name":"_forged","type":"string"},{"name":"_grade","type":"string"},{"name":"_color","type":"string"}],"name":"changeMarbleAttributes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","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":"","type":"uint256"}],"name":"marblePrices","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gameMaster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"marblesOwned","outputs":[{"name":"MarblesOwned","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"marbleCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"highestMarbleInventory","outputs":[{"name":"","type":"uint256"}],"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":true,"inputs":[{"name":"","type":"uint256"}],"name":"accounts","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPlaceHolderMarbles","outputs":[{"name":"resultPlaceHolders","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"placeHolderMarbleCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":true,"stateMutability":"payable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"addMarbleAttributesConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"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"}]

608060405260016009556000600a556000600d60006101000a81548160ff02191690831515021790555060016018556000601955620000706301ffc9a77c0100000000000000000000000000000000000000000000000000000000026200014f640100000000026401000000009004565b33600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620000ee6380ac58cd7c0100000000000000000000000000000000000000000000000000000000026200014f640100000000026401000000009004565b33600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000149346200020d640100000000026401000000009004565b6200021f565b63ffffffff7c010000000000000000000000000000000000000000000000000000000002817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614151515620001a157600080fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b80341415156200021c57600080fd5b50565b6154e7806200022f6000396000f300608060405260043610610301576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461030c57806306fdde0314610370578063081812fc14610400578063095ea7b31461046d5780630cdffd4b146104ba57806312065fe014610526578063162094c41461055157806318160ddd146105c45780631862e750146105ef57806319fa8f501461065c5780631cac5aeb146106c55780631f912134146106f45780631fbc1c1d1461073557806323b872dd1461076257806332a22bb6146107cf5780633bcd1a3f146107ef5780633ccfd60b146108305780633df4ddf4146108475780633f4ba83a146108725780633f51601814610889578063411dc379146108cc57806342842e0e146108f757806347799da8146109645780634caae94f1461098f5780634cff665214610a35578063503d65fb14610a6057806353d2a4a414610a8b578063569b99ec14610acc57806356c484bc14610b115780635a14a52014610b9e5780635c3c9d9814610bc95780635c975abb14610bf45780635e372d6714610c235780636352211e14610e4e57806367d076b314610ebb5780636c8b703f1461118b5780636ddd474d1461123157806370a082311461128c578063715018a6146112e357806379bdf7c2146112fa5780638456cb591461132757806386fe68761461133e5780638da5cb5b1461138357806393226c22146113da5780639482c6f71461141b57806395d89b41146114465780639b9b8aea146114d6578063a22cb46514611543578063a2d8f93514611592578063a4f2d089146115f3578063a72580771461160a578063af87dbac1461164d578063b6b55f2514611832578063b88d4fde14611852578063bcdb413514611905578063bdf84ae714611946578063c26663491461199d578063c41034cb14611a35578063c87b56dd14611a60578063e5060e1714611b06578063e985e9c514611b31578063f2a40db814611bac578063f2fde38b14611c19578063f866f6d114611c5c578063ffe6a43314611cc8575b61030a34611cf3565b005b34801561031857600080fd5b5061035660048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611d04565b604051808215151515815260200191505060405180910390f35b34801561037c57600080fd5b50610385611d6b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c55780820151818401526020810190506103aa565b50505050905090810190601f1680156103f25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561040c57600080fd5b5061042b60048036038101908080359060200190929190505050611da4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047957600080fd5b506104b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611de1565b005b3480156104c657600080fd5b506104cf611f26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105125780820151818401526020810190506104f7565b505050509050019250505060405180910390f35b34801561053257600080fd5b5061053b612010565b6040518082815260200191505060405180910390f35b34801561055d57600080fd5b506105c260048036038101908080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061202f565b005b3480156105d057600080fd5b506105d9612158565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b5061065a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612162565b005b34801561066857600080fd5b50610671612276565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156106d157600080fd5b506106da61229d565b604051808215151515815260200191505060405180910390f35b34801561070057600080fd5b5061071f6004803603810190808035906020019092919050505061237f565b6040518082815260200191505060405180910390f35b34801561074157600080fd5b5061076060048036038101908080359060200190929190505050612397565b005b34801561076e57600080fd5b506107cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612726565b005b6107ed600480360381019080803590602001909291905050506127eb565b005b3480156107fb57600080fd5b5061082e600480360381019080803590602001909291908035906020019092919080359060200190929190505050612b4a565b005b34801561083c57600080fd5b50610845612bf2565b005b34801561085357600080fd5b5061085c612cae565b6040518082815260200191505060405180910390f35b34801561087e57600080fd5b50610887612cb4565b005b34801561089557600080fd5b506108ca600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d2d565b005b3480156108d857600080fd5b506108e1612df2565b6040518082815260200191505060405180910390f35b34801561090357600080fd5b50610962600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612df8565b005b34801561097057600080fd5b50610979612e19565b6040518082815260200191505060405180910390f35b34801561099b57600080fd5b506109ba60048036038101908080359060200190929190505050612e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109fa5780820151818401526020810190506109df565b50505050905090810190601f168015610a275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a4157600080fd5b50610a4a612f90565b6040518082815260200191505060405180910390f35b348015610a6c57600080fd5b50610a75612fad565b6040518082815260200191505060405180910390f35b348015610a9757600080fd5b50610ab660048036038101908080359060200190929190505050612fb3565b6040518082815260200191505060405180910390f35b348015610ad857600080fd5b50610af760048036038101908080359060200190929190505050612fcb565b604051808215151515815260200191505060405180910390f35b348015610b1d57600080fd5b50610b9c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612feb565b005b348015610baa57600080fd5b50610bb3613185565b6040518082815260200191505060405180910390f35b348015610bd557600080fd5b50610bde61318b565b6040518082815260200191505060405180910390f35b348015610c0057600080fd5b50610c09613191565b604051808215151515815260200191505060405180910390f35b348015610c2f57600080fd5b50610e4c6004803603810190808035906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506131a4565b005b348015610e5a57600080fd5b50610e7960048036038101908080359060200190929190505050613474565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ec757600080fd5b50610ee6600480360381019080803590602001909291905050506134f2565b6040518089815260200180602001888152602001806020018060200180602001806020018060200187810387528e818151815260200191508051906020019080838360005b83811015610f46578082015181840152602081019050610f2b565b50505050905090810190601f168015610f735780820380516001836020036101000a031916815260200191505b5087810386528c818151815260200191508051906020019080838360005b83811015610fac578082015181840152602081019050610f91565b50505050905090810190601f168015610fd95780820380516001836020036101000a031916815260200191505b5087810385528b818151815260200191508051906020019080838360005b83811015611012578082015181840152602081019050610ff7565b50505050905090810190601f16801561103f5780820380516001836020036101000a031916815260200191505b5087810384528a818151815260200191508051906020019080838360005b8381101561107857808201518184015260208101905061105d565b50505050905090810190601f1680156110a55780820380516001836020036101000a031916815260200191505b50878103835289818151815260200191508051906020019080838360005b838110156110de5780820151818401526020810190506110c3565b50505050905090810190601f16801561110b5780820380516001836020036101000a031916815260200191505b50878103825288818151815260200191508051906020019080838360005b83811015611144578082015181840152602081019050611129565b50505050905090810190601f1680156111715780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b34801561119757600080fd5b506111b6600480360381019080803590602001909291905050506138ca565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156111f65780820151818401526020810190506111db565b50505050905090810190601f1680156112235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561123d57600080fd5b50611272600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061397a565b604051808215151515815260200191505060405180910390f35b34801561129857600080fd5b506112cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061399a565b6040518082815260200191505060405180910390f35b3480156112ef57600080fd5b506112f8613a1e565b005b34801561130657600080fd5b5061132560048036038101908080359060200190929190505050613b23565b005b34801561133357600080fd5b5061133c613c52565b005b34801561134a57600080fd5b5061136960048036038101908080359060200190929190505050613ccb565b604051808215151515815260200191505060405180910390f35b34801561138f57600080fd5b50611398613ceb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156113e657600080fd5b5061140560048036038101908080359060200190929190505050613d11565b6040518082815260200191505060405180910390f35b34801561142757600080fd5b50611430613d8f565b6040518082815260200191505060405180910390f35b34801561145257600080fd5b5061145b613dac565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561149b578082015181840152602081019050611480565b50505050905090810190601f1680156114c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156114e257600080fd5b50611541600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613de5565b005b34801561154f57600080fd5b50611590600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613ee4565b005b34801561159e57600080fd5b506115dd60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614020565b6040518082815260200191505060405180910390f35b3480156115ff57600080fd5b5061160861409d565b005b34801561161657600080fd5b5061164b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614109565b005b34801561165957600080fd5b506118306004803603810190808035906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506141c0565b005b61185060048036038101908080359060200190929190505050611cf3565b005b34801561185e57600080fd5b50611903600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050614336565b005b34801561191157600080fd5b506119306004803603810190808035906020019092919050505061435e565b6040518082815260200191505060405180910390f35b34801561195257600080fd5b5061195b614376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156119a957600080fd5b506119de600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061439c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611a21578082015181840152602081019050611a06565b505050509050019250505060405180910390f35b348015611a4157600080fd5b50611a4a6144f4565b6040518082815260200191505060405180910390f35b348015611a6c57600080fd5b50611a8b600480360381019080803590602001909291905050506144fa565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611acb578082015181840152602081019050611ab0565b50505050905090810190601f168015611af85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015611b1257600080fd5b50611b1b614801565b6040518082815260200191505060405180910390f35b348015611b3d57600080fd5b50611b92600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614807565b604051808215151515815260200191505060405180910390f35b348015611bb857600080fd5b50611bd76004803603810190808035906020019092919050505061489b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015611c2557600080fd5b50611c5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506148d9565b005b348015611c6857600080fd5b50611c71614941565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611cb4578082015181840152602081019050611c99565b505050509050019250505060405180910390f35b348015611cd457600080fd5b50611cdd6149fe565b6040518082815260200191505060405180910390f35b8034141515611d0157600080fd5b50565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6040805190810160405280600681526020017f4d6172626c65000000000000000000000000000000000000000000000000000081525081565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611dec82613474565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611e2957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e695750611e688133614807565b5b1515611e7457600080fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6060600060606000806000601054945084604051908082528060200260200182016040528015611f655781602001602082028038833980820191505090505b509350600092506012549150600190505b81811115156120055760006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ff857808484815181101515611fe157fe5b906020019060200201818152505082806001019350505b8080600101915050611f76565b839550505050505090565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b60008090505b600c8054905081101561214e573373ffffffffffffffffffffffffffffffffffffffff16600c8281548110151561206857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612141576000600e600085815260200190815260200160002080546001816001161561010002031660029004905014151561210057600e600084815260200190815260200160002060006120ff919061532d565b5b61210983614a04565b151561211457600080fd5b81600e6000858152602001908152602001600020908051906020019061213b929190615375565b50612153565b8080600101915050612035565b600080fd5b505050565b6000601054905090565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156121ba57600080fd5b6121c43282614a76565b15156121cf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561220b57600080fd5b612216838383614b0b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6301ffc9a77c01000000000000000000000000000000000000000000000000000000000281565b600080600090505b600c80549050811015612376573373ffffffffffffffffffffffffffffffffffffffff16600c828154811015156122d857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561236957600954600a5410151561235f5760076000600954815260200190815260200160002060009055600160096000828254019250508190555060019150612364565b600091505b61237b565b80806001019150506122a5565b600080fd5b5090565b60076020528060005260406000206000915090505481565b600d60009054906101000a900460ff161515156123b357600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561240f57600080fd5b8061241981614a04565b15151561242557600080fd5b601354811115151561243657600080fd5b610100604051908101604052808281526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020018281526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c00000000000000000000000000000000000000000000000000000000815250815250601660008381526020019081526020016000206000820151816000015560208201518160010190805190602001906125e89291906153f5565b5060408201518160020155606082015181600301908051906020019061260f9291906153f5565b50608082015181600401908051906020019061262c9291906153f5565b5060a08201518160050190805190602001906126499291906153f5565b5060c08201518160060190805190602001906126669291906153f5565b5060e08201518160070190805190602001906126839291906153f5565b5090505060016015600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601960008282540192505081905550806017600060195481526020019081526020016000208190555060116000815480929190600101919050555080601454101561270257806014819055505b338261270e8282614b2e565b60106000815480929190600101919050555050505050565b6127303382614a76565b151561273b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561277757600080fd5b612782838383614b0b565b61278b81614bd4565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600d60009054906101000a900460ff1615151561280757600080fd5b8034600f60008381526020019081526020016000205414151561282957600080fd5b8161283381614a04565b15151561283f57600080fd5b601354811115151561285057600080fd5b610100604051908101604052808281526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020018281526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081525060166000838152602001908152602001600020600082015181600001556020820151816001019080519060200190612a029291906153f5565b50604082015181600201556060820151816003019080519060200190612a299291906153f5565b506080820151816004019080519060200190612a469291906153f5565b5060a0820151816005019080519060200190612a639291906153f5565b5060c0820151816006019080519060200190612a809291906153f5565b5060e0820151816007019080519060200190612a9d9291906153f5565b5090505060016015600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016019600082825401925050819055508060176000601954815260200190815260200160002081905550601160008154809291906001019190505550806014541015612b1c57806014819055505b3383612b288282614b2e565b601060008154809291906001019190505550612b4334611cf3565b5050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ba857600080fd5b8290505b8181111515612bda5783600f6000838152602001908152602001600020819055508080600101915050612bac565b816013541015612bec57816013819055505b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c4e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015612cab573d6000803e3d6000fd5b50565b60185481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d1057600080fd5b6000600d60006101000a81548160ff021916908315150217905550565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d8957600080fd5b600c8190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60095481565b612e148383836020604051908101604052806000815250614336565b505050565b60195481565b6060600080600060606000600f60008881526020019081526020016000205494506000851415612e86576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509550612f86565b8493505b600084141515612eb0578280600101935050600a84811515612ea857fe5b049350612e8a565b826040519080825280601f01601f191660200182016040528015612ee35781602001602082028038833980820191505090505b5091506001830390505b600085141515612f8257600a85811515612f0357fe5b066030017f010000000000000000000000000000000000000000000000000000000000000002828280600190039350815181101515612f3e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85811515612f7a57fe5b049450612eed565b8195505b5050505050919050565b600060076000600954815260200190815260200160002054905090565b60145481565b60176020528060005260406000206000915090505481565b60156020528060005260406000206000915054906101000a900460ff1681565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561304357600080fd5b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561309b57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166130bb82613474565b73ffffffffffffffffffffffffffffffffffffffff161415156130dd57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561311957600080fd5b613124838383614b0b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60125481565b600a5481565b600d60009054906101000a900460ff1681565b600d60009054906101000a900460ff161515156131c057600080fd5b60008090505b600c80549050811015613462573373ffffffffffffffffffffffffffffffffffffffff16600c828154811015156131f957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613455578a6015600082815260200190815260200160002060009054906101000a900460ff16151561326d57600080fd5b8b60006015600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610100604051908101604052808d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815250601660008f815260200190815260200160002060008201518160000155602082015181600101908051906020019061330e9291906153f5565b506040820151816002015560608201518160030190805190602001906133359291906153f5565b5060808201518160040190805190602001906133529291906153f5565b5060a082015181600501908051906020019061336f9291906153f5565b5060c082015181600601908051906020019061338c9291906153f5565b5060e08201518160070190805190602001906133a99291906153f5565b509050506133b78d8561202f565b8c60125410156133c9578c6012819055505b601854601954101515613401576017600060185481526020019081526020016000206000905560016018600082825401925050819055505b600060115414151561342157601160008154809291906001900391905055505b8c7f31eee1167cac310158e0a63cad46310701819d39af7176a998f2b87ecc5bee1f60405160405180910390a25050613467565b80806001019150506131c6565b600080fd5b5050505050505050505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156134e957600080fd5b80915050919050565b6016602052806000526040600020600091509050806000015490806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135a45780601f10613579576101008083540402835291602001916135a4565b820191906000526020600020905b81548152906001019060200180831161358757829003601f168201915b505050505090806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156136485780601f1061361d57610100808354040283529160200191613648565b820191906000526020600020905b81548152906001019060200180831161362b57829003601f168201915b505050505090806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156136e65780601f106136bb576101008083540402835291602001916136e6565b820191906000526020600020905b8154815290600101906020018083116136c957829003601f168201915b505050505090806005018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156137845780601f1061375957610100808354040283529160200191613784565b820191906000526020600020905b81548152906001019060200180831161376757829003601f168201915b505050505090806006018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138225780601f106137f757610100808354040283529160200191613822565b820191906000526020600020905b81548152906001019060200180831161380557829003601f168201915b505050505090806007018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138c05780601f10613895576101008083540402835291602001916138c0565b820191906000526020600020905b8154815290600101906020018083116138a357829003601f168201915b5050505050905088565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156139725780601f1061394757610100808354040283529160200191613972565b820191906000526020600020905b81548152906001019060200180831161395557829003601f168201915b505050505081565b60056020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156139d757600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613a7a57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008090505b600c80549050811015613c49573373ffffffffffffffffffffffffffffffffffffffff16600c82815481101515613b5c57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613c3c57816008600082815260200190815260200160002060009054906101000a900460ff161515613bd057600080fd5b8260006008600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600954600a54101515613c35576007600060095481526020019081526020016000206000905560016009600082825401925050819055505b5050613c4e565b8080600101915050613b29565b600080fd5b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613cae57600080fd5b6001600d60006101000a81548160ff021916908315150217905550565b60086020528060005260406000206000915054906101000a900460ff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613d8657600080fd5b82915050919050565b600060176000601854815260200190815260200160002054905090565b6040805190810160405280600381526020017f4d4942000000000000000000000000000000000000000000000000000000000081525081565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613e3d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613e7957600080fd5b613e84838383614b0b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613f1f57600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6000806001600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561409357600080fd5b8391505092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156140f957600080fd5b600c60006141079190615475565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561416557600080fd5b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561421857600080fd5b6101006040519081016040528089815260200188815260200187815260200186815260200185815260200184815260200183815260200182815250601660008b815260200190815260200160002060008201518160000155602082015181600101908051906020019061428c9291906153f5565b506040820151816002015560608201518160030190805190602001906142b39291906153f5565b5060808201518160040190805190602001906142d09291906153f5565b5060a08201518160050190805190602001906142ed9291906153f5565b5060c082015181600601908051906020019061430a9291906153f5565b5060e08201518160070190805190602001906143279291906153f5565b50905050505050505050505050565b614341848484612726565b61434d84848484614c2e565b151561435857600080fd5b50505050565b600f6020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000606060008060006143b08761399a565b945060008514156143f35760006040519080825280602002602001820160405280156143eb5781602001602082028038833980820191505090505b5095506144ea565b846040519080825280602002602001820160405280156144225781602001602082028038833980820191505090505b509350601254925060009150600190505b82811115156144e6578673ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156144c9578084838151811015156144b257fe5b906020019060200201818152505081806001019250505b818514156144d9578395506144ea565b8080600101915050614433565b8395505b5050505050919050565b60105481565b606060008060606000806060600061451189614a04565b151561451c57600080fd5b600e60008a81526020019081526020016000209650604e9550856040519080825280601f01601f1916602001820160405280156145685781602001602082028038833980820191505090505b509450600093505b60008914151561460757600a8981151561458657fe5b069250600a8981151561459557fe5b049850826030017f01000000000000000000000000000000000000000000000000000000000000000285858060010196508151811015156145d257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350614570565b8387805460018160011615610100020316600290049050016040519080825280601f01601f1916602001820160405280156146515781602001602082028038833980820191505090505b509150600090505b86805460018160011615610100020316600290049050811015614725578681815460018160011615610100020316600290048110151561469557fe5b8154600116156146b45790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000282828151811015156146e857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614659565b600090505b838110156147f2578481600186030381518110151561474557fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002828880546001816001161561010002031660029004905083018151811015156147b557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061472a565b81975050505050505050919050565b60135481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c818154811015156148aa57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561493557600080fd5b61493e81614e50565b50565b60606000606060008060006011549450846040519080825280602002602001820160405280156149805781602001602082028038833980820191505090505b509350600092506012549150600190505b81811115156149f3576015600082815260200190815260200160002060009054906101000a900460ff16156149e6578084848151811015156149cf57fe5b906020019060200201818152505082806001019350505b8080600101915050614991565b839550505050505090565b60115481565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080614a8283613474565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480614af157508373ffffffffffffffffffffffffffffffffffffffff16614ad984611da4565b73ffffffffffffffffffffffffffffffffffffffff16145b80614b025750614b018185614807565b5b91505092915050565b614b158382614f4c565b614b1f838261504f565b614b29828261517e565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614b6a57600080fd5b614b74828261517e565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001600a600082825401925050819055508060076000600a5481526020019081526020016000208190555060016008600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080614c508573ffffffffffffffffffffffffffffffffffffffff166152d8565b1515614c5f5760019150614e47565b8473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614d54578082015181840152602081019050614d39565b50505050905090810190601f168015614d815780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614da357600080fd5b505af1158015614db7573d6000803e3d6000fd5b505050506040513d6020811015614dcd57600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614e8c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8173ffffffffffffffffffffffffffffffffffffffff16614f6c82613474565b73ffffffffffffffffffffffffffffffffffffffff16141515614f8e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561504b5760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b8173ffffffffffffffffffffffffffffffffffffffff1661506f82613474565b73ffffffffffffffffffffffffffffffffffffffff1614151561509157600080fd5b6150e46001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546152eb90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156151ec57600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506152916001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461530c90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b6000808383111515156152fd57600080fd5b82840390508091505092915050565b600080828401905083811015151561532357600080fd5b8091505092915050565b50805460018160011615610100020316600290046000825580601f106153535750615372565b601f0160209004906000526020600020908101906153719190615496565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153b657805160ff19168380011785556153e4565b828001600101855582156153e4579182015b828111156153e35782518255916020019190600101906153c8565b5b5090506153f19190615496565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061543657805160ff1916838001178555615464565b82800160010185558215615464579182015b82811115615463578251825591602001919060010190615448565b5b5090506154719190615496565b5090565b50805460008255906000526020600020908101906154939190615496565b50565b6154b891905b808211156154b457600081600090555060010161549c565b5090565b905600a165627a7a723058205289c3ef1325d13f648bc2d80c3d7fa30671d1c11b5cfff33ef27f8b0408b2d90029

Deployed Bytecode

0x608060405260043610610301576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461030c57806306fdde0314610370578063081812fc14610400578063095ea7b31461046d5780630cdffd4b146104ba57806312065fe014610526578063162094c41461055157806318160ddd146105c45780631862e750146105ef57806319fa8f501461065c5780631cac5aeb146106c55780631f912134146106f45780631fbc1c1d1461073557806323b872dd1461076257806332a22bb6146107cf5780633bcd1a3f146107ef5780633ccfd60b146108305780633df4ddf4146108475780633f4ba83a146108725780633f51601814610889578063411dc379146108cc57806342842e0e146108f757806347799da8146109645780634caae94f1461098f5780634cff665214610a35578063503d65fb14610a6057806353d2a4a414610a8b578063569b99ec14610acc57806356c484bc14610b115780635a14a52014610b9e5780635c3c9d9814610bc95780635c975abb14610bf45780635e372d6714610c235780636352211e14610e4e57806367d076b314610ebb5780636c8b703f1461118b5780636ddd474d1461123157806370a082311461128c578063715018a6146112e357806379bdf7c2146112fa5780638456cb591461132757806386fe68761461133e5780638da5cb5b1461138357806393226c22146113da5780639482c6f71461141b57806395d89b41146114465780639b9b8aea146114d6578063a22cb46514611543578063a2d8f93514611592578063a4f2d089146115f3578063a72580771461160a578063af87dbac1461164d578063b6b55f2514611832578063b88d4fde14611852578063bcdb413514611905578063bdf84ae714611946578063c26663491461199d578063c41034cb14611a35578063c87b56dd14611a60578063e5060e1714611b06578063e985e9c514611b31578063f2a40db814611bac578063f2fde38b14611c19578063f866f6d114611c5c578063ffe6a43314611cc8575b61030a34611cf3565b005b34801561031857600080fd5b5061035660048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611d04565b604051808215151515815260200191505060405180910390f35b34801561037c57600080fd5b50610385611d6b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c55780820151818401526020810190506103aa565b50505050905090810190601f1680156103f25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561040c57600080fd5b5061042b60048036038101908080359060200190929190505050611da4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047957600080fd5b506104b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611de1565b005b3480156104c657600080fd5b506104cf611f26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105125780820151818401526020810190506104f7565b505050509050019250505060405180910390f35b34801561053257600080fd5b5061053b612010565b6040518082815260200191505060405180910390f35b34801561055d57600080fd5b506105c260048036038101908080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061202f565b005b3480156105d057600080fd5b506105d9612158565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b5061065a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612162565b005b34801561066857600080fd5b50610671612276565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156106d157600080fd5b506106da61229d565b604051808215151515815260200191505060405180910390f35b34801561070057600080fd5b5061071f6004803603810190808035906020019092919050505061237f565b6040518082815260200191505060405180910390f35b34801561074157600080fd5b5061076060048036038101908080359060200190929190505050612397565b005b34801561076e57600080fd5b506107cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612726565b005b6107ed600480360381019080803590602001909291905050506127eb565b005b3480156107fb57600080fd5b5061082e600480360381019080803590602001909291908035906020019092919080359060200190929190505050612b4a565b005b34801561083c57600080fd5b50610845612bf2565b005b34801561085357600080fd5b5061085c612cae565b6040518082815260200191505060405180910390f35b34801561087e57600080fd5b50610887612cb4565b005b34801561089557600080fd5b506108ca600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d2d565b005b3480156108d857600080fd5b506108e1612df2565b6040518082815260200191505060405180910390f35b34801561090357600080fd5b50610962600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612df8565b005b34801561097057600080fd5b50610979612e19565b6040518082815260200191505060405180910390f35b34801561099b57600080fd5b506109ba60048036038101908080359060200190929190505050612e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109fa5780820151818401526020810190506109df565b50505050905090810190601f168015610a275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a4157600080fd5b50610a4a612f90565b6040518082815260200191505060405180910390f35b348015610a6c57600080fd5b50610a75612fad565b6040518082815260200191505060405180910390f35b348015610a9757600080fd5b50610ab660048036038101908080359060200190929190505050612fb3565b6040518082815260200191505060405180910390f35b348015610ad857600080fd5b50610af760048036038101908080359060200190929190505050612fcb565b604051808215151515815260200191505060405180910390f35b348015610b1d57600080fd5b50610b9c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612feb565b005b348015610baa57600080fd5b50610bb3613185565b6040518082815260200191505060405180910390f35b348015610bd557600080fd5b50610bde61318b565b6040518082815260200191505060405180910390f35b348015610c0057600080fd5b50610c09613191565b604051808215151515815260200191505060405180910390f35b348015610c2f57600080fd5b50610e4c6004803603810190808035906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506131a4565b005b348015610e5a57600080fd5b50610e7960048036038101908080359060200190929190505050613474565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ec757600080fd5b50610ee6600480360381019080803590602001909291905050506134f2565b6040518089815260200180602001888152602001806020018060200180602001806020018060200187810387528e818151815260200191508051906020019080838360005b83811015610f46578082015181840152602081019050610f2b565b50505050905090810190601f168015610f735780820380516001836020036101000a031916815260200191505b5087810386528c818151815260200191508051906020019080838360005b83811015610fac578082015181840152602081019050610f91565b50505050905090810190601f168015610fd95780820380516001836020036101000a031916815260200191505b5087810385528b818151815260200191508051906020019080838360005b83811015611012578082015181840152602081019050610ff7565b50505050905090810190601f16801561103f5780820380516001836020036101000a031916815260200191505b5087810384528a818151815260200191508051906020019080838360005b8381101561107857808201518184015260208101905061105d565b50505050905090810190601f1680156110a55780820380516001836020036101000a031916815260200191505b50878103835289818151815260200191508051906020019080838360005b838110156110de5780820151818401526020810190506110c3565b50505050905090810190601f16801561110b5780820380516001836020036101000a031916815260200191505b50878103825288818151815260200191508051906020019080838360005b83811015611144578082015181840152602081019050611129565b50505050905090810190601f1680156111715780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b34801561119757600080fd5b506111b6600480360381019080803590602001909291905050506138ca565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156111f65780820151818401526020810190506111db565b50505050905090810190601f1680156112235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561123d57600080fd5b50611272600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061397a565b604051808215151515815260200191505060405180910390f35b34801561129857600080fd5b506112cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061399a565b6040518082815260200191505060405180910390f35b3480156112ef57600080fd5b506112f8613a1e565b005b34801561130657600080fd5b5061132560048036038101908080359060200190929190505050613b23565b005b34801561133357600080fd5b5061133c613c52565b005b34801561134a57600080fd5b5061136960048036038101908080359060200190929190505050613ccb565b604051808215151515815260200191505060405180910390f35b34801561138f57600080fd5b50611398613ceb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156113e657600080fd5b5061140560048036038101908080359060200190929190505050613d11565b6040518082815260200191505060405180910390f35b34801561142757600080fd5b50611430613d8f565b6040518082815260200191505060405180910390f35b34801561145257600080fd5b5061145b613dac565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561149b578082015181840152602081019050611480565b50505050905090810190601f1680156114c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156114e257600080fd5b50611541600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613de5565b005b34801561154f57600080fd5b50611590600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613ee4565b005b34801561159e57600080fd5b506115dd60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614020565b6040518082815260200191505060405180910390f35b3480156115ff57600080fd5b5061160861409d565b005b34801561161657600080fd5b5061164b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614109565b005b34801561165957600080fd5b506118306004803603810190808035906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506141c0565b005b61185060048036038101908080359060200190929190505050611cf3565b005b34801561185e57600080fd5b50611903600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050614336565b005b34801561191157600080fd5b506119306004803603810190808035906020019092919050505061435e565b6040518082815260200191505060405180910390f35b34801561195257600080fd5b5061195b614376565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156119a957600080fd5b506119de600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061439c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611a21578082015181840152602081019050611a06565b505050509050019250505060405180910390f35b348015611a4157600080fd5b50611a4a6144f4565b6040518082815260200191505060405180910390f35b348015611a6c57600080fd5b50611a8b600480360381019080803590602001909291905050506144fa565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611acb578082015181840152602081019050611ab0565b50505050905090810190601f168015611af85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015611b1257600080fd5b50611b1b614801565b6040518082815260200191505060405180910390f35b348015611b3d57600080fd5b50611b92600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614807565b604051808215151515815260200191505060405180910390f35b348015611bb857600080fd5b50611bd76004803603810190808035906020019092919050505061489b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015611c2557600080fd5b50611c5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506148d9565b005b348015611c6857600080fd5b50611c71614941565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611cb4578082015181840152602081019050611c99565b505050509050019250505060405180910390f35b348015611cd457600080fd5b50611cdd6149fe565b6040518082815260200191505060405180910390f35b8034141515611d0157600080fd5b50565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6040805190810160405280600681526020017f4d6172626c65000000000000000000000000000000000000000000000000000081525081565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611dec82613474565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611e2957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e695750611e688133614807565b5b1515611e7457600080fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6060600060606000806000601054945084604051908082528060200260200182016040528015611f655781602001602082028038833980820191505090505b509350600092506012549150600190505b81811115156120055760006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ff857808484815181101515611fe157fe5b906020019060200201818152505082806001019350505b8080600101915050611f76565b839550505050505090565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b60008090505b600c8054905081101561214e573373ffffffffffffffffffffffffffffffffffffffff16600c8281548110151561206857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612141576000600e600085815260200190815260200160002080546001816001161561010002031660029004905014151561210057600e600084815260200190815260200160002060006120ff919061532d565b5b61210983614a04565b151561211457600080fd5b81600e6000858152602001908152602001600020908051906020019061213b929190615375565b50612153565b8080600101915050612035565b600080fd5b505050565b6000601054905090565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156121ba57600080fd5b6121c43282614a76565b15156121cf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561220b57600080fd5b612216838383614b0b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6301ffc9a77c01000000000000000000000000000000000000000000000000000000000281565b600080600090505b600c80549050811015612376573373ffffffffffffffffffffffffffffffffffffffff16600c828154811015156122d857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561236957600954600a5410151561235f5760076000600954815260200190815260200160002060009055600160096000828254019250508190555060019150612364565b600091505b61237b565b80806001019150506122a5565b600080fd5b5090565b60076020528060005260406000206000915090505481565b600d60009054906101000a900460ff161515156123b357600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561240f57600080fd5b8061241981614a04565b15151561242557600080fd5b601354811115151561243657600080fd5b610100604051908101604052808281526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020018281526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c00000000000000000000000000000000000000000000000000000000815250815250601660008381526020019081526020016000206000820151816000015560208201518160010190805190602001906125e89291906153f5565b5060408201518160020155606082015181600301908051906020019061260f9291906153f5565b50608082015181600401908051906020019061262c9291906153f5565b5060a08201518160050190805190602001906126499291906153f5565b5060c08201518160060190805190602001906126669291906153f5565b5060e08201518160070190805190602001906126839291906153f5565b5090505060016015600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601960008282540192505081905550806017600060195481526020019081526020016000208190555060116000815480929190600101919050555080601454101561270257806014819055505b338261270e8282614b2e565b60106000815480929190600101919050555050505050565b6127303382614a76565b151561273b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561277757600080fd5b612782838383614b0b565b61278b81614bd4565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600d60009054906101000a900460ff1615151561280757600080fd5b8034600f60008381526020019081526020016000205414151561282957600080fd5b8161283381614a04565b15151561283f57600080fd5b601354811115151561285057600080fd5b610100604051908101604052808281526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020018281526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600481526020017f4e554c4c0000000000000000000000000000000000000000000000000000000081525081525060166000838152602001908152602001600020600082015181600001556020820151816001019080519060200190612a029291906153f5565b50604082015181600201556060820151816003019080519060200190612a299291906153f5565b506080820151816004019080519060200190612a469291906153f5565b5060a0820151816005019080519060200190612a639291906153f5565b5060c0820151816006019080519060200190612a809291906153f5565b5060e0820151816007019080519060200190612a9d9291906153f5565b5090505060016015600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016019600082825401925050819055508060176000601954815260200190815260200160002081905550601160008154809291906001019190505550806014541015612b1c57806014819055505b3383612b288282614b2e565b601060008154809291906001019190505550612b4334611cf3565b5050505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ba857600080fd5b8290505b8181111515612bda5783600f6000838152602001908152602001600020819055508080600101915050612bac565b816013541015612bec57816013819055505b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c4e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015612cab573d6000803e3d6000fd5b50565b60185481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d1057600080fd5b6000600d60006101000a81548160ff021916908315150217905550565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d8957600080fd5b600c8190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60095481565b612e148383836020604051908101604052806000815250614336565b505050565b60195481565b6060600080600060606000600f60008881526020019081526020016000205494506000851415612e86576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509550612f86565b8493505b600084141515612eb0578280600101935050600a84811515612ea857fe5b049350612e8a565b826040519080825280601f01601f191660200182016040528015612ee35781602001602082028038833980820191505090505b5091506001830390505b600085141515612f8257600a85811515612f0357fe5b066030017f010000000000000000000000000000000000000000000000000000000000000002828280600190039350815181101515612f3e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85811515612f7a57fe5b049450612eed565b8195505b5050505050919050565b600060076000600954815260200190815260200160002054905090565b60145481565b60176020528060005260406000206000915090505481565b60156020528060005260406000206000915054906101000a900460ff1681565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561304357600080fd5b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561309b57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166130bb82613474565b73ffffffffffffffffffffffffffffffffffffffff161415156130dd57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561311957600080fd5b613124838383614b0b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60125481565b600a5481565b600d60009054906101000a900460ff1681565b600d60009054906101000a900460ff161515156131c057600080fd5b60008090505b600c80549050811015613462573373ffffffffffffffffffffffffffffffffffffffff16600c828154811015156131f957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613455578a6015600082815260200190815260200160002060009054906101000a900460ff16151561326d57600080fd5b8b60006015600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610100604051908101604052808d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815250601660008f815260200190815260200160002060008201518160000155602082015181600101908051906020019061330e9291906153f5565b506040820151816002015560608201518160030190805190602001906133359291906153f5565b5060808201518160040190805190602001906133529291906153f5565b5060a082015181600501908051906020019061336f9291906153f5565b5060c082015181600601908051906020019061338c9291906153f5565b5060e08201518160070190805190602001906133a99291906153f5565b509050506133b78d8561202f565b8c60125410156133c9578c6012819055505b601854601954101515613401576017600060185481526020019081526020016000206000905560016018600082825401925050819055505b600060115414151561342157601160008154809291906001900391905055505b8c7f31eee1167cac310158e0a63cad46310701819d39af7176a998f2b87ecc5bee1f60405160405180910390a25050613467565b80806001019150506131c6565b600080fd5b5050505050505050505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156134e957600080fd5b80915050919050565b6016602052806000526040600020600091509050806000015490806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135a45780601f10613579576101008083540402835291602001916135a4565b820191906000526020600020905b81548152906001019060200180831161358757829003601f168201915b505050505090806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156136485780601f1061361d57610100808354040283529160200191613648565b820191906000526020600020905b81548152906001019060200180831161362b57829003601f168201915b505050505090806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156136e65780601f106136bb576101008083540402835291602001916136e6565b820191906000526020600020905b8154815290600101906020018083116136c957829003601f168201915b505050505090806005018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156137845780601f1061375957610100808354040283529160200191613784565b820191906000526020600020905b81548152906001019060200180831161376757829003601f168201915b505050505090806006018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138225780601f106137f757610100808354040283529160200191613822565b820191906000526020600020905b81548152906001019060200180831161380557829003601f168201915b505050505090806007018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138c05780601f10613895576101008083540402835291602001916138c0565b820191906000526020600020905b8154815290600101906020018083116138a357829003601f168201915b5050505050905088565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156139725780601f1061394757610100808354040283529160200191613972565b820191906000526020600020905b81548152906001019060200180831161395557829003601f168201915b505050505081565b60056020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156139d757600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613a7a57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008090505b600c80549050811015613c49573373ffffffffffffffffffffffffffffffffffffffff16600c82815481101515613b5c57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613c3c57816008600082815260200190815260200160002060009054906101000a900460ff161515613bd057600080fd5b8260006008600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600954600a54101515613c35576007600060095481526020019081526020016000206000905560016009600082825401925050819055505b5050613c4e565b8080600101915050613b29565b600080fd5b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613cae57600080fd5b6001600d60006101000a81548160ff021916908315150217905550565b60086020528060005260406000206000915054906101000a900460ff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613d8657600080fd5b82915050919050565b600060176000601854815260200190815260200160002054905090565b6040805190810160405280600381526020017f4d4942000000000000000000000000000000000000000000000000000000000081525081565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613e3d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613e7957600080fd5b613e84838383614b0b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613f1f57600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6000806001600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561409357600080fd5b8391505092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156140f957600080fd5b600c60006141079190615475565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561416557600080fd5b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561421857600080fd5b6101006040519081016040528089815260200188815260200187815260200186815260200185815260200184815260200183815260200182815250601660008b815260200190815260200160002060008201518160000155602082015181600101908051906020019061428c9291906153f5565b506040820151816002015560608201518160030190805190602001906142b39291906153f5565b5060808201518160040190805190602001906142d09291906153f5565b5060a08201518160050190805190602001906142ed9291906153f5565b5060c082015181600601908051906020019061430a9291906153f5565b5060e08201518160070190805190602001906143279291906153f5565b50905050505050505050505050565b614341848484612726565b61434d84848484614c2e565b151561435857600080fd5b50505050565b600f6020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000606060008060006143b08761399a565b945060008514156143f35760006040519080825280602002602001820160405280156143eb5781602001602082028038833980820191505090505b5095506144ea565b846040519080825280602002602001820160405280156144225781602001602082028038833980820191505090505b509350601254925060009150600190505b82811115156144e6578673ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156144c9578084838151811015156144b257fe5b906020019060200201818152505081806001019250505b818514156144d9578395506144ea565b8080600101915050614433565b8395505b5050505050919050565b60105481565b606060008060606000806060600061451189614a04565b151561451c57600080fd5b600e60008a81526020019081526020016000209650604e9550856040519080825280601f01601f1916602001820160405280156145685781602001602082028038833980820191505090505b509450600093505b60008914151561460757600a8981151561458657fe5b069250600a8981151561459557fe5b049850826030017f01000000000000000000000000000000000000000000000000000000000000000285858060010196508151811015156145d257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350614570565b8387805460018160011615610100020316600290049050016040519080825280601f01601f1916602001820160405280156146515781602001602082028038833980820191505090505b509150600090505b86805460018160011615610100020316600290049050811015614725578681815460018160011615610100020316600290048110151561469557fe5b8154600116156146b45790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000282828151811015156146e857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614659565b600090505b838110156147f2578481600186030381518110151561474557fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002828880546001816001161561010002031660029004905083018151811015156147b557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061472a565b81975050505050505050919050565b60135481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c818154811015156148aa57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561493557600080fd5b61493e81614e50565b50565b60606000606060008060006011549450846040519080825280602002602001820160405280156149805781602001602082028038833980820191505090505b509350600092506012549150600190505b81811115156149f3576015600082815260200190815260200160002060009054906101000a900460ff16156149e6578084848151811015156149cf57fe5b906020019060200201818152505082806001019350505b8080600101915050614991565b839550505050505090565b60115481565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080614a8283613474565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480614af157508373ffffffffffffffffffffffffffffffffffffffff16614ad984611da4565b73ffffffffffffffffffffffffffffffffffffffff16145b80614b025750614b018185614807565b5b91505092915050565b614b158382614f4c565b614b1f838261504f565b614b29828261517e565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614b6a57600080fd5b614b74828261517e565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001600a600082825401925050819055508060076000600a5481526020019081526020016000208190555060016008600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080614c508573ffffffffffffffffffffffffffffffffffffffff166152d8565b1515614c5f5760019150614e47565b8473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614d54578082015181840152602081019050614d39565b50505050905090810190601f168015614d815780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614da357600080fd5b505af1158015614db7573d6000803e3d6000fd5b505050506040513d6020811015614dcd57600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614e8c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8173ffffffffffffffffffffffffffffffffffffffff16614f6c82613474565b73ffffffffffffffffffffffffffffffffffffffff16141515614f8e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561504b5760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b8173ffffffffffffffffffffffffffffffffffffffff1661506f82613474565b73ffffffffffffffffffffffffffffffffffffffff1614151561509157600080fd5b6150e46001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546152eb90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156151ec57600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506152916001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461530c90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b6000808383111515156152fd57600080fd5b82840390508091505092915050565b600080828401905083811015151561532357600080fd5b8091505092915050565b50805460018160011615610100020316600290046000825580601f106153535750615372565b601f0160209004906000526020600020908101906153719190615496565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153b657805160ff19168380011785556153e4565b828001600101855582156153e4579182015b828111156153e35782518255916020019190600101906153c8565b5b5090506153f19190615496565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061543657805160ff1916838001178555615464565b82800160010185558215615464579182015b82811115615463578251825591602001919060010190615448565b5b5090506154719190615496565b5090565b50805460008255906000526020600020908101906154939190615496565b50565b6154b891905b808211156154b457600081600090555060010161549c565b5090565b905600a165627a7a723058205289c3ef1325d13f648bc2d80c3d7fa30671d1c11b5cfff33ef27f8b0408b2d90029

Deployed Bytecode Sourcemap

340:19033:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3510:18;3518:9;3510:7;:18::i;:::-;340:19033;811:148:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;811:148:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;242:38:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;242:38:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;242:38:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4321:113:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4321:113:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3803:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3803:284:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7577:964:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7577:964:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7577:964:10;;;;;;;;;;;;;;;;;650:144:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;650:144:7;;;;;;;;;;;;;;;;;;;;;;;755:494:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;755:494:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3622:95:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3622:95:10;;;;;;;;;;;;;;;;;;;;;;;8375:340:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8375:340:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;242:54:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;242:54:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19087:271:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19087:271:10;;;;;;;;;;;;;;;;;;;;;;;;;;;1904:57:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1904:57:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14754:170:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14754:170:10;;;;;;;;;;;;;;;;;;;;;;;;;;5872:334:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5872:334:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14468:202:10;;;;;;;;;;;;;;;;;;;;;;;;;;9573:569;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9573:569:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;217:167:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;217:167:7;;;;;;2843:24:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2843:24:10;;;;;;;;;;;;;;;;;;;;;;;1081:67:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1081:67:6;;;;;;1855:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1855:97:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;2256:29:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2256:29:3;;;;;;;;;;;;;;;;;;;;;;;10071:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10071:208:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2941:23:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2941:23:10;;;;;;;;;;;;;;;;;;;;;;;11537:696;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11537:696:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11537:696:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18063:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18063:137:10;;;;;;;;;;;;;;;;;;;;;;;2389:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2389:37:10;;;;;;;;;;;;;;;;;;;;;;;2710:58;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2710:58:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2492:50:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6670:396:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6670:396:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2181:32:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2181:32:10;;;;;;;;;;;;;;;;;;;;;;;2348:27:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2348:27:3;;;;;;;;;;;;;;;;;;;;;;;553:26:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;553:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;16179:1297:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16179:1297:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3220:168:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3220:168:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2599:41:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2599:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2599:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2599:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2599:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2599:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2599:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2599:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;421:43:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;421:43:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;421:43:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1255:46:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1255:46:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2855:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2855:145:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2356:114:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2356:114:6;;;;;;18661:295:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18661:295:10;;;;;;;;;;;;;;;;;;;;;;;;;;1199:63:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1199:63:6;;;;;;2138:50:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2138:50:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;320:20:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;320:20:6;;;;;;;;;;;;;;;;;;;;;;;;;;;4422:198:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4422:198:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3815:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3815:132:10;;;;;;;;;;;;;;;;;;;;;;;340:37:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;340:37:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;340:37:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9158:277:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9158:277:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4741:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4741:209:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4081:205:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4081:205:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2012:70:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2012:70:6;;;;;;1669:126:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1669:126:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;17643:348:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17643:348:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;476:105:7;;;;;;;;;;;;;;;;;;;;;;;;;;10975:287:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10975:287:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1884:47:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1884:47:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1389:25:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1389:25:3;;;;;;;;;;;;;;;;;;;;;;;;;;;5305:2130:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5305:2130:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5305:2130:10;;;;;;;;;;;;;;;;;1987:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1987:23:10;;;;;;;;;;;;;;;;;;;;;;;1616:1084:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1616:1084:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1616:1084:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2283:34:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2283:34:10;;;;;;;;;;;;;;;;;;;;;;;5267:177:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5267:177:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;409:25:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;409:25:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2638:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2638:105:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;8625:657:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8625:657:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8625:657:10;;;;;;;;;;;;;;;;;2088:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2088:34:10;;;;;;;;;;;;;;;;;;;;;;;476:105:7;556:6;543:9;:19;535:28;;;;;;;;476:105;:::o;811:148:9:-;897:4;920:19;:33;940:12;920:33;;;;;;;;;;;;;;;;;;;;;;;;;;;913:40;;811:148;;;:::o;242:38:4:-;;;;;;;;;;;;;;;;;;;;:::o;4321:113:3:-;4381:7;4404:14;:24;4419:8;4404:24;;;;;;;;;;;;;;;;;;;;;4397:31;;4321:113;;;:::o;3803:284::-;3865:13;3881:17;3889:8;3881:7;:17::i;:::-;3865:33;;3920:5;3913:12;;:3;:12;;;;3905:21;;;;;;;;3955:5;3941:19;;:10;:19;;;:58;;;;3964:35;3981:5;3988:10;3964:16;:35::i;:::-;3941:58;3933:67;;;;;;;;4036:3;4009:14;:24;4024:8;4009:24;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;4072:8;4067:3;4051:30;;4060:5;4051:30;;;;;;;;;;;;3803:284;;;:::o;7577:964:10:-;7628:24;7664:30;7719:23;7856:19;7918:17;7969:18;7697:11;;7664:44;;7759:22;7745:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;7745:37:10;;;;7719:63;;7878:1;7856:23;;7938:20;;7918:40;;8076:1;8063:14;;8059:396;8093:9;8079:10;:23;;8059:396;;;8161:1;8135:10;:22;8146:10;8135:22;;;;;;;;;;;;;;;;;;;;;:27;;;;8132:312;;;8263:10;8241:6;8248:11;8241:19;;;;;;;;;;;;;;;;;:32;;;;;8370:13;;;;;;;8132:312;8104:12;;;;;;;8059:396;;;8474:6;8467:13;;7577:964;;;;;;:::o;650:144:7:-;693:7;720:4;:12;;;713:19;;650:144;:::o;755:494:4:-;1537:6:6;1546:1;1537:10;;1532:120;1553:8;:15;;;;1549:1;:19;1532:120;;;1600:10;1585:25;;:8;1594:1;1585:11;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;1582:63;;;884:1:4;854:9;:18;864:7;854:18;;;;;;;;;;;848:32;;;;;;;;;;;;;;;;:37;;845:216;;;977:9;:18;987:7;977:18;;;;;;;;;;;;970:25;;;;:::i;:::-;845:216;1081:16;1089:7;1081;:16::i;:::-;1073:25;;;;;;;;1176:3;1155:9;:18;1165:7;1155:18;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;1630:7:6;;1582:63;1570:3;;;;;;;1532:120;;;1658:8;;;755:494:4;;;;:::o;3622:95:10:-;3666:13;3698:11;;3691:18;;3622:95;:::o;8375:340:3:-;8503:13;:25;8517:10;8503:25;;;;;;;;;;;;;;;;;;;;;;;;;8495:34;;;;;;;;8544:38;8562:9;8573:8;8544:17;:38::i;:::-;8536:47;;;;;;;;8613:1;8598:17;;:3;:17;;;;8590:26;;;;;;;;8625:36;8640:5;8647:3;8652:8;8625:14;:36::i;:::-;8700:8;8695:3;8679:30;;8688:5;8679:30;;;;;;;;;;;;8375:340;;;:::o;242:54:9:-;286:10;242:54;;;:::o;19087:271:10:-;19159:14;1537:6:6;1546:1;1537:10;;1532:120;1553:8;:15;;;;1549:1;:19;1532:120;;;1600:10;1585:25;;:8;1594:1;1585:11;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;1582:63;;;19200:10:10;;19188:8;;:22;;19185:143;;;19231:21;:33;19253:10;;19231:33;;;;;;;;;;;19224:40;;;19291:1;19277:10;;:15;;;;;;;;;;;19312:4;19305:11;;;;19185:143;19345:5;19338:12;;1620:1:6;1630:7;;1582:63;1570:3;;;;;;;1532:120;;;1658:8;;;19087:271:10;;;:::o;1904:57:3:-;;;;;;;;;;;;;;;;;:::o;14754:170:10:-;1003:6:6;;;;;;;;;;;1002:7;994:16;;;;;;;;1397:5;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;14854:8:10;12491:18;12499:9;12491:7;:18::i;:::-;12490:19;12482:28;;;;;;;;12597:22;;12584:9;:35;;12576:44;;;;;;;;12726:75;;;;;;;;;12733:9;12726:75;;;;;;;;;;;;;;;;;;;;;;;;;;12751:9;12726:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12705:7;:18;12713:9;12705:18;;;;;;;;;;;:96;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;12905:4;12873:18;:29;12892:9;12873:29;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;12984:1;12976:4;;:9;;;;;;;;;;;13027;12996:22;:28;13019:4;;12996:28;;;;;;;;;;;:40;;;;13047:22;;:24;;;;;;;;;;;;;13209:9;13181:25;;:37;13178:285;;;13346:9;13318:25;:37;;;;13178:285;14874:10;14886:8;13639:24;13645:7;13654:8;13639:5;:24::i;:::-;13755:11;;:13;;;;;;;;;;;;;13473:1;;1410::6;14754:170:10;:::o;5872:334:3:-;5990:39;6008:10;6020:8;5990:17;:39::i;:::-;5982:48;;;;;;;;6060:1;6045:17;;:3;:17;;;;6037:26;;;;;;;;6076:36;6091:5;6098:3;6103:8;6076:14;:36::i;:::-;6125:32;6148:8;6125:22;:32::i;:::-;6191:8;6186:3;6170:30;;6179:5;6170:30;;;;;;;;;;;;5872:334;;;:::o;14468:202:10:-;1003:6:6;;;;;;;;;;;1002:7;994:16;;;;;;;;14546:8:10;3161:9;3135:12;:22;3148:8;3135:22;;;;;;;;;;;;:35;3127:44;;;;;;;;14582:8;12491:18;12499:9;12491:7;:18::i;:::-;12490:19;12482:28;;;;;;;;12597:22;;12584:9;:35;;12576:44;;;;;;;;12726:75;;;;;;;;;12733:9;12726:75;;;;;;;;;;;;;;;;;;;;;;;;;;12751:9;12726:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12705:7;:18;12713:9;12705:18;;;;;;;;;;;:96;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;12905:4;12873:18;:29;12892:9;12873:29;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;12984:1;12976:4;;:9;;;;;;;;;;;13027;12996:22;:28;13019:4;;12996:28;;;;;;;;;;;:40;;;;13047:22;;:24;;;;;;;;;;;;;13209:9;13181:25;;:37;13178:285;;;13346:9;13318:25;:37;;;;13178:285;14602:10;14614:8;13639:24;13645:7;13654:8;13639:5;:24::i;:::-;13755:11;;:13;;;;;;;;;;;;;14644:18;14652:9;14644:7;:18::i;:::-;13473:1;;3181;1021::6;14468:202:10;:::o;9573:569::-;9698:6;1397:5:6;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;9707:10:10;9698:19;;9694:121;9724:8;9719:1;:13;;9694:121;;;9779:14;9761:12;:15;9774:1;9761:15;;;;;;;;;;;:32;;;;9734:3;;;;;;;9694:121;;;9884:8;9859:22;;:33;9856:246;;;9943:8;9918:22;:33;;;;9856:246;9573:569;;;;:::o;217:167:7:-;1397:5:6;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;266:10:7;:19;;:33;286:4;:12;;;266:33;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;266:33:7;217:167::o;2843:24:10:-;;;;:::o;1081:67:6:-;1397:5;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;1137:5;1128:6;;:14;;;;;;;;;;;;;;;;;;1081:67::o;1855:97::-;1397:5;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;1920:8;1934:11;1920:26;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1920:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1855:97;:::o;2256:29:3:-;;;;:::o;10071:208::-;10231:42;10248:5;10255:3;10260:8;10231:42;;;;;;;;;;;;;:16;:42::i;:::-;10071:208;;;:::o;2941:23:10:-;;;;:::o;11537:696::-;11602:6;11628:19;11758:6;11797:8;11935:17;11988:6;11650:12;:22;11663:8;11650:22;;;;;;;;;;;;11628:44;;11726:1;11711:11;:16;11708:31;;;11729:10;;;;;;;;;;;;;;;;;;;;;;11708:31;11767:11;11758:20;;11824:91;11835:1;11830;:6;;11824:91;;;11860:5;;;;;;;11893:2;11888:7;;;;;;;;;;;11824:91;;;11965:3;11955:14;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;11955:14:10;;;;11935:34;;12003:1;11997:3;:7;11988:16;;12041:145;12062:1;12047:11;:16;;12041:145;;;12123:2;12109:11;:16;;;;;;;;12104:2;:21;12099:27;;12087:4;12092:3;;;;;;;12087:9;;;;;;;;;;;;;;:39;;;;;;;;;;;12164:2;12149:17;;;;;;;;;;;12041:145;;;12220:4;12206:19;;11537:696;;;;;;;;;:::o;18063:137::-;18116:24;18159:21;:33;18181:10;;18159:33;;;;;;;;;;;;18152:40;;18063:137;:::o;2389:37::-;;;;:::o;2710:58::-;;;;;;;;;;;;;;;;;:::o;2492:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;6670:396:3:-;6792:13;:27;6806:12;6792:27;;;;;;;;;;;;;;;;;;;;;;;;;6784:36;;;;;;;;6837:13;:25;6851:10;6837:25;;;;;;;;;;;;;;;;;;;;;;;;;6829:34;;;;;;;;6901:10;6880:31;;:17;6888:8;6880:7;:17::i;:::-;:31;;;6872:40;;;;;;;;6944:1;6929:17;;:3;:17;;;;6921:26;;;;;;;;6964:36;6979:5;6986:3;6991:8;6964:14;:36::i;:::-;7043:8;7038:3;7022:30;;7031:5;7022:30;;;;;;;;;;;;6670:396;;;;:::o;2181:32:10:-;;;;:::o;2348:27:3:-;;;;:::o;553:26:6:-;;;;;;;;;;;;;:::o;16179:1297:10:-;1003:6:6;;;;;;;;;;;1002:7;994:16;;;;;;;;1537:6;1546:1;1537:10;;1532:120;1553:8;:15;;;;1549:1;:19;1532:120;;;1600:10;1585:25;;:8;1594:1;1585:11;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;1582:63;;;16418:9:10;15005:18;:29;15024:9;15005:29;;;;;;;;;;;;;;;;;;;;;14997:38;;;;;;;;16460:9;15173:5;15141:18;:29;15160:9;15141:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;16511:76;;;;;;;;;16518:6;16511:76;;;;16526:9;16511:76;;;;16537:5;16511:76;;;;16544:8;16511:76;;;;16554:7;16511:76;;;;16563:7;16511:76;;;;16572:6;16511:76;;;;16580:6;16511:76;;;16490:7;:18;16498:9;16490:18;;;;;;;;;;;:97;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;16633:32;16645:9;16656:8;16633:11;:32::i;:::-;16729:9;16706:20;;:32;16703:250;;;16846:9;16823:20;:32;;;;16703:250;16996:5;;16988:4;;:13;;16985:105;;;17024:22;:29;17047:5;;17024:29;;;;;;;;;;;17017:36;;;17077:1;17068:5;;:10;;;;;;;;;;;16985:105;17138:1;17112:22;;:27;;17109:148;;;17151:22;;:24;;;;;;;;;;;;;;17109:148;17311:9;17282:39;;;;;;;;;;15047:1;1620::6;1630:7;;1582:63;1570:3;;;;;;;1532:120;;;1658:8;;;1021:1;;16179:1297:10;;;;;;;;;;:::o;3220:168:3:-;3276:7;3292:13;3308:10;:20;3319:8;3308:20;;;;;;;;;;;;;;;;;;;;;3292:36;;3360:1;3343:19;;:5;:19;;;;3335:28;;;;;;;;3377:5;3370:12;;3220:168;;;;:::o;2599:41:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;421:43:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1255:46:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;2855:145::-;2911:7;2953:1;2935:20;;:6;:20;;;;2927:29;;;;;;;;2970:16;:24;2987:6;2970:24;;;;;;;;;;;;;;;;2963:31;;2855:145;;;:::o;2356:114:6:-;1397:5;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;2433:5;;;;;;;;;;;2414:25;;;;;;;;;;;;2462:1;2446:5;;:18;;;;;;;;;;;;;;;;;;2356:114::o;18661:295:10:-;1537:6:6;1546:1;1537:10;;1532:120;1553:8;:15;;;;1549:1;:19;1532:120;;;1600:10;1585:25;;:8;1594:1;1585:11;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;1582:63;;;18765:7:10;18350:17;:26;18368:7;18350:26;;;;;;;;;;;;;;;;;;;;;18342:35;;;;;;;;18810:7;18575:5;18546:17;:26;18564:7;18546:26;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;18845:10;;18833:8;;:22;;18830:119;;;18876:21;:33;18898:10;;18876:33;;;;;;;;;;;18869:40;;;18936:1;18922:10;;:15;;;;;;;;;;;18830:119;18388:1;1620::6;1630:7;;1582:63;1570:3;;;;;;;1532:120;;;1658:8;;;18661:295:10;;;:::o;1199:63:6:-;1397:5;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;1252:4;1243:6;;:13;;;;;;;;;;;;;;;;;;1199:63::o;2138:50:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;320:20:6:-;;;;;;;;;;;;;:::o;4422:198:10:-;4494:16;4520:13;4536:10;:17;4547:5;4536:17;;;;;;;;;;;;;;;;;;;;;4520:33;;4587:1;4570:19;;:5;:19;;;;4562:28;;;;;;;;4606:5;4599:12;;4422:198;;;;:::o;3815:132::-;3867:25;3909:22;:29;3932:5;;3909:29;;;;;;;;;;;;3902:36;;3815:132;:::o;340:37:4:-;;;;;;;;;;;;;;;;;;;;:::o;9158:277:3:-;9285:13;:25;9299:10;9285:25;;;;;;;;;;;;;;;;;;;;;;;;;9277:34;;;;;;;;9341:1;9326:17;;:3;:17;;;;9318:26;;;;;;;;9351:36;9366:5;9373:3;9378:8;9351:14;:36::i;:::-;9420:8;9415:3;9399:30;;9408:5;9399:30;;;;;;;;;;;;9158:277;;;:::o;4741:209::-;4826:10;4819:17;;:3;:17;;;;4811:26;;;;;;;;4881:9;4844:17;:29;4862:10;4844:29;;;;;;;;;;;;;;;:34;4874:3;4844:34;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;4929:3;4902:42;;4917:10;4902:42;;;4934:9;4902:42;;;;;;;;;;;;;;;;;;;;;;4741:209;;:::o;4081:205:10:-;4164:16;4190:13;4206:10;:17;4217:5;4206:17;;;;;;;;;;;;;;;;;;;;;4190:33;;4249:6;4240:15;;:5;:15;;;4232:24;;;;;;;;4272:5;4265:12;;4081:205;;;;;:::o;2012:70:6:-;1397:5;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;2068:8;;2061:15;;;;:::i;:::-;2012:70::o;1669:126:3:-;1547:10;;;;;;;;;;;1533:24;;:10;:24;;;1525:33;;;;;;;;1785:4;1751:13;:31;1765:16;1751:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;1669:126;:::o;17643:348:10:-;17847:13;:25;17861:10;17847:25;;;;;;;;;;;;;;;;;;;;;;;;;17839:34;;;;;;;;17907:76;;;;;;;;;17914:6;17907:76;;;;17922:9;17907:76;;;;17933:5;17907:76;;;;17940:8;17907:76;;;;17950:7;17907:76;;;;17959:7;17907:76;;;;17968:6;17907:76;;;;17976:6;17907:76;;;17886:7;:18;17894:9;17886:18;;;;;;;;;;;:97;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;17643:348;;;;;;;;;:::o;10975:287:3:-;11107:34;11120:5;11127:3;11132:8;11107:12;:34::i;:::-;11202:53;11227:5;11234:3;11239:8;11249:5;11202:24;:53::i;:::-;11194:62;;;;;;;;10975:287;;;;:::o;1884:47:10:-;;;;;;;;;;;;;;;;;:::o;1389:25:3:-;;;;;;;;;;;;;:::o;5305:2130:10:-;5365:22;5400;5862:23;6027:20;6213:19;6317:16;5425:17;5435:6;5425:9;:17::i;:::-;5400:42;;5555:1;5537:14;:19;5533:1895;;;5674:1;5660:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5660:16:10;;;;5653:23;;;;5533:1895;5902:14;5888:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5888:29:10;;;;5862:55;;6050:20;;6027:43;;6235:1;6213:23;;6459:1;6448:12;;6443:844;6474:12;6462:8;:24;;6443:844;;;6698:6;6674:30;;:10;:20;6685:8;6674:20;;;;;;;;;;;;;;;;;;;;;:30;;;6670:400;;;6865:8;6843:6;6850:11;6843:19;;;;;;;;;;;;;;;;;:30;;;;;6994:13;;;;;;;6670:400;7112:11;7094:14;:29;7090:182;;;7246:6;7239:13;;;;7090:182;6488:10;;;;;;;6443:844;;;7351:6;7344:13;;5305:2130;;;;;;;;;:::o;1987:23::-;;;;:::o;1616:1084:4:-;1672:6;1765:21;1877:14;1907:21;1962:6;2078:14;2241:19;2303:6;1698:16;1706:7;1698;:16::i;:::-;1690:25;;;;;;;;1795:9;:18;1805:7;1795:18;;;;;;;;;;;1765:49;;1894:2;1877:19;;1941:9;1931:20;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;1931:20:4;;;;1907:44;;1971:1;1962:10;;2046:144;2064:1;2053:7;:12;;2046:144;;;2105:2;2095:7;:12;;;;;;;;2078:29;;2129:2;2118:13;;;;;;;;;;;2168:9;2163:2;:14;2158:20;;2142:8;2151:3;;;;;;2142:13;;;;;;;;;;;;;;:36;;;;;;;;;;;2046:144;;;2290:1;2273:7;:14;;;;;;;;;;;;;;;;:18;2263:29;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;2263:29:4;;;;2241:51;;2372:1;2368:5;;2363:82;2379:7;:14;;;;;;;;;;;;;;;;2375:1;:18;2363:82;;;2423:7;2431:1;2423:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2411:6;2418:1;2411:9;;;;;;;;;;;;;;:22;;;;;;;;;;;2395:3;;;;;;;2363:82;;;2516:1;2512:5;;2507:95;2523:1;2519;:5;2507:95;;;2571:8;2588:1;2584;2580;:5;:9;2571:19;;;;;;;;;;;;;;;;;;;;2542:6;2553:7;:14;;;;;;;;;;;;;;;;2549:1;:18;2542:26;;;;;;;;;;;;;;:48;;;;;;;;;;;2526:3;;;;;;;2507:95;;;2636:6;2622:21;;1616:1084;;;;;;;;;;:::o;2283:34:10:-;;;;:::o;5267:177:3:-;5379:4;5402:17;:25;5420:6;5402:25;;;;;;;;;;;;;;;:36;5428:9;5402:36;;;;;;;;;;;;;;;;;;;;;;;;;5395:43;;5267:177;;;;:::o;409:25:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2638:105::-;1397:5;;;;;;;;;;;1383:19;;:10;:19;;;1375:28;;;;;;;;2708:29;2727:9;2708:18;:29::i;:::-;2638:105;:::o;8625:657:10:-;8680:28;8726:35;8803:23;8888:19;8928:23;8991:13;8764:22;;8726:60;;8843:27;8829:42;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;8829:42:10;;;;8803:68;;8910:1;8888:23;;8954:20;;8928:46;;9035:1;9027:9;;9023:220;9047:15;9038:5;:24;;9023:220;;;9096:18;:25;9115:5;9096:25;;;;;;;;;;;;;;;;;;;;;9093:133;;;9165:5;9143:6;9150:11;9143:19;;;;;;;;;;;;;;;;;:27;;;;;9191:13;;;;;;;9093:133;9064:7;;;;;;;9023:220;;;9268:6;9261:13;;8625:657;;;;;;:::o;2088:34::-;;;;:::o;11447:146:3:-;11505:4;11518:13;11534:10;:20;11545:8;11534:20;;;;;;;;;;;;;;;;;;;;;11518:36;;11585:1;11568:19;;:5;:19;;;;11561:26;;11447:146;;;;:::o;11949:455::-;12065:4;12081:13;12097:17;12105:8;12097:7;:17::i;:::-;12081:33;;12298:5;12286:17;;:8;:17;;;:61;;;;12339:8;12314:33;;:21;12326:8;12314:11;:21::i;:::-;:33;;;12286:61;:105;;;;12358:33;12375:5;12382:8;12358:16;:33::i;:::-;12286:105;12270:128;;11949:455;;;;;:::o;7715:202::-;7804:30;7818:5;7825:8;7804:13;:30::i;:::-;7844:32;7860:5;7867:8;7844:15;:32::i;:::-;7886:25;7897:3;7902:8;7886:10;:25::i;:::-;7715:202;;;:::o;12668:173::-;12753:1;12738:17;;:3;:17;;;;12730:26;;;;;;;;12763:25;12774:3;12779:8;12763:10;:25::i;:::-;12826:8;12821:3;12800:35;;12817:1;12800:35;;;;;;;;;;;;12668:173;;:::o;7244:174::-;7321:1;7309:8;;:13;;;;;;;;;;;7363:8;7329:21;:31;7351:8;;7329:31;;;;;;;;;;;:42;;;;7408:4;7378:17;:27;7396:8;7378:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;7244:174;:::o;14834:362::-;14980:4;15053:13;15001:16;:3;:14;;;:16::i;:::-;15000:17;14996:51;;;15035:4;15028:11;;;;14996:51;15084:3;15069:36;;;15114:10;15126:5;15133:8;15143:5;15069:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15069:80:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15069:80:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15069:80:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15069:80:3;;;;;;;;;;;;;;;;15053:96;;711:10;15174:15;;15164:25;;;:6;:25;;;;15156:34;;14834:362;;;;;;;;:::o;2884:175:6:-;2976:1;2955:23;;:9;:23;;;;2947:32;;;;;;;;3019:9;2991:38;;3012:5;;;;;;;;;;;2991:38;;;;;;;;;;;;3044:9;3036:5;;:17;;;;;;;;;;;;;;;;;;2884:175;:::o;13116:219:3:-;13218:6;13197:27;;:17;13205:8;13197:7;:17::i;:::-;:27;;;13189:36;;;;;;;;13272:1;13236:38;;:14;:24;13251:8;13236:24;;;;;;;;;;;;;;;;;;;;;:38;;;;13232:98;;;13320:1;13285:14;:24;13300:8;13285:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;13232:98;13116:219;;:::o;14099:218::-;14202:5;14181:26;;:17;14189:8;14181:7;:17::i;:::-;:26;;;14173:35;;;;;;;;14241:30;14269:1;14241:16;:23;14258:5;14241:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;14215:16;:23;14232:5;14215:23;;;;;;;;;;;;;;;:56;;;;14309:1;14278:10;:20;14289:8;14278:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14099:218;;:::o;13605:208::-;13712:1;13680:34;;:10;:20;13691:8;13680:20;;;;;;;;;;;;;;;;;;;;;:34;;;13672:43;;;;;;;;13745:3;13722:10;:20;13733:8;13722:20;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;13779:28;13805:1;13779:16;:21;13796:3;13779:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;13755:16;:21;13772:3;13755:21;;;;;;;;;;;;;;;:52;;;;13605:208;;:::o;471:595:0:-;532:4;545:12;1028:8;1016:21;1008:29;;1059:1;1052:4;:8;1045:15;;471:595;;;;:::o;1135:142:8:-;1195:7;1235:9;1225:2;1219;:8;;1211:17;;;;;;;;1252:2;1247;:7;1235:19;;1270:1;1263:8;;1135:142;;;;;:::o;1345:141::-;1405:7;1421:9;1438:2;1433;:7;1421:19;;1460:2;1455:1;:7;;1447:16;;;;;;;;1479:1;1472:8;;1345:141;;;;;:::o;340:19033:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://5289c3ef1325d13f648bc2d80c3d7fa30671d1c11b5cfff33ef27f8b0408b2d9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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