ETH Price: $2,387.18 (+7.92%)

Contract

0x4deE63c5f8BDaE0C78Acb24433fb0360340CF930
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Tokens113992322020-12-06 12:40:591547 days ago1607258459IN
0x4deE63c5...0340CF930
0 ETH0.0008926319.9
Buy NFT113960512020-12-06 1:06:031548 days ago1607216763IN
0x4deE63c5...0340CF930
0 ETH0.0089411919.00000145
Buy NFT113946762020-12-05 19:58:471548 days ago1607198327IN
0x4deE63c5...0340CF930
0 ETH0.0080000117
Buy NFT113933022020-12-05 14:58:141548 days ago1607180294IN
0x4deE63c5...0340CF930
0 ETH0.0097197621
Buy NFT113932862020-12-05 14:54:181548 days ago1607180058IN
0x4deE63c5...0340CF930
0 ETH0.0103701721
Buy NFT113932782020-12-05 14:51:581548 days ago1607179918IN
0x4deE63c5...0340CF930
0 ETH0.0100449721
Buy NFT113932742020-12-05 14:51:441548 days ago1607179904IN
0x4deE63c5...0340CF930
0 ETH0.0097197621
Buy NFT113932692020-12-05 14:51:111548 days ago1607179871IN
0x4deE63c5...0340CF930
0 ETH0.0103701721
Buy NFT113931712020-12-05 14:30:581548 days ago1607178658IN
0x4deE63c5...0340CF930
0 ETH0.0102075721
Buy NFT113931532020-12-05 14:26:281548 days ago1607178388IN
0x4deE63c5...0340CF930
0 ETH0.013610128
Buy NFT113930982020-12-05 14:12:241548 days ago1607177544IN
0x4deE63c5...0340CF930
0 ETH0.0009326119.7
Buy NFT113930982020-12-05 14:12:241548 days ago1607177544IN
0x4deE63c5...0340CF930
0 ETH0.0076459515.73
Buy NFT113918062020-12-05 9:25:451548 days ago1607160345IN
0x4deE63c5...0340CF930
0 ETH0.0105327821
Buy NFT113917962020-12-05 9:22:431548 days ago1607160163IN
0x4deE63c5...0340CF930
0 ETH0.0110205921
Buy NFT113917892020-12-05 9:21:181548 days ago1607160078IN
0x4deE63c5...0340CF930
0 ETH0.0123209121
Buy NFT113917192020-12-05 9:04:591548 days ago1607159099IN
0x4deE63c5...0340CF930
0 ETH0.013751227
Buy NFT113917012020-12-05 9:00:281548 days ago1607158828IN
0x4deE63c5...0340CF930
0 ETH0.0099583618.7000016
Buy NFT113906332020-12-05 5:05:571549 days ago1607144757IN
0x4deE63c5...0340CF930
0 ETH0.0147814222
Buy NFT113906202020-12-05 5:02:021549 days ago1607144522IN
0x4deE63c5...0340CF930
0 ETH0.0149517722
Buy NFT113906042020-12-05 4:59:291549 days ago1607144369IN
0x4deE63c5...0340CF930
0 ETH0.0145973521.00000145
Buy NFT113905852020-12-05 4:54:531549 days ago1607144093IN
0x4deE63c5...0340CF930
0 ETH0.0144407322
Buy NFT113905752020-12-05 4:53:061549 days ago1607143986IN
0x4deE63c5...0340CF930
0 ETH0.0132970321
Buy NFT113905232020-12-05 4:39:321549 days ago1607143172IN
0x4deE63c5...0340CF930
0 ETH0.0129733220
Buy NFT113905022020-12-05 4:34:391549 days ago1607142879IN
0x4deE63c5...0340CF930
0 ETH0.012106819.6
Buy NFT113904762020-12-05 4:30:081549 days ago1607142608IN
0x4deE63c5...0340CF930
0 ETH0.012044420
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NFTMarketplace

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity 0.6.2;



/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

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

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

  /**
   * @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
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}



/**
 * @dev Math operations with safety checks that throw on error. This contract is based on the
 * source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol.
 */
library SafeMath
{
  /**
   * List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant OVERFLOW = "008001";
  string constant SUBTRAHEND_GREATER_THEN_MINUEND = "008002";
  string constant DIVISION_BY_ZERO = "008003";

  /**
   * @dev Multiplies two numbers, reverts on overflow.
   * @param _factor1 Factor number.
   * @param _factor2 Factor number.
   * @return product The product of the two factors.
   */
  function mul(
    uint256 _factor1,
    uint256 _factor2
  )
    internal
    pure
    returns (uint256 product)
  {
    // 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 (_factor1 == 0)
    {
      return 0;
    }

    product = _factor1 * _factor2;
    require(product / _factor1 == _factor2, OVERFLOW);
  }

  /**
   * @dev Integer division of two numbers, truncating the quotient, reverts on division by zero.
   * @param _dividend Dividend number.
   * @param _divisor Divisor number.
   * @return quotient The quotient.
   */
  function div(
    uint256 _dividend,
    uint256 _divisor
  )
    internal
    pure
    returns (uint256 quotient)
  {
    // Solidity automatically asserts when dividing by 0, using all gas.
    require(_divisor > 0, DIVISION_BY_ZERO);
    quotient = _dividend / _divisor;
    // assert(_dividend == _divisor * quotient + _dividend % _divisor); // There is no case in which this doesn't hold.
  }

  /**
   * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
   * @param _minuend Minuend number.
   * @param _subtrahend Subtrahend number.
   * @return difference Difference.
   */
  function sub(
    uint256 _minuend,
    uint256 _subtrahend
  )
    internal
    pure
    returns (uint256 difference)
  {
    require(_subtrahend <= _minuend, SUBTRAHEND_GREATER_THEN_MINUEND);
    difference = _minuend - _subtrahend;
  }

  /**
   * @dev Adds two numbers, reverts on overflow.
   * @param _addend1 Number.
   * @param _addend2 Number.
   * @return sum Sum.
   */
  function add(
    uint256 _addend1,
    uint256 _addend2
  )
    internal
    pure
    returns (uint256 sum)
  {
    sum = _addend1 + _addend2;
    require(sum >= _addend1, OVERFLOW);
  }

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

}


/**
 * @dev signature of external (deployed) contract (ERC20 token)
 * only methods we will use, needed for us to communicate with CYTR token (which is ERC20)
 */
contract ERC20Token {
 
    function totalSupply() external view returns (uint256){}
    function balanceOf(address account) external view returns (uint256){}
    function allowance(address owner, address spender) external view returns (uint256){}
    function transfer(address recipient, uint256 amount) external returns (bool){}
    function approve(address spender, uint256 amount) external returns (bool){}
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool){}
    function decimals()  external view returns (uint8){}
  
}



/**
 * @dev signature of external (deployed) contract for NFT publishing (ERC721)
 * only methods we will use, needed for us to communicate with Cyclops token (which is ERC721)
 */
contract CyclopsTokens {
    
 
 
 function mint(address _to, uint256 _tokenId, string calldata _uri) external {}
 
 function ownerOf(uint256 _tokenId) external view returns (address) {}
 function burn(uint256 _tokenId) external {}
 
 function tokenURI(uint256 _tokenId) external  view returns(string memory) {}
    
}

contract NFTMarketplace is
  Ownable
{
    using SafeMath for uint256;    
    
     modifier onlyPriceManager() {
      require(
          msg.sender == price_manager,
          "only price manager can call this function"
          );
          _;
    }
    
    modifier onlyOwnerOrPriceManager() {
      require(
          msg.sender == price_manager || msg.sender == owner,
          "only price manager or owner can call this function"
          );
          _;
    }
 
    /**
    * @dev not bullet-proof check, but additional measure, actually we require specific (contract) address,
    * which is key (see onlyBankContract)
    */
    function isContract(address _addr) internal view returns (bool){
      uint32 size;
      assembly {
          size := extcodesize(_addr)
      }
    
      return (size > 0);
    }

    modifier notContract(){
      require(
          (!isContract(msg.sender)),
          "external contracts are not allowed"
          );
          _;
    }

 
    
  //external NFT publishing contract
  CyclopsTokens nftContract;
  ERC20Token token; //CYTR
  
  //hard code address of external contract (NFT), as it can't be redeployed in production
  //what could be redeployed - NFTBank contract -  and we can link new NFT bank 
  //with special method in CyclopsTokens
  address nftContractAddress = 0xd6d778d86Ddf225e3c02C45D6C6e8Eb3497B452A; //NFT contract (Cyclops)
  address paymentTokenAddress = 0xBD05CeE8741100010D8E93048a80Ed77645ac7bf; //payment token (ERC20, CYTR)
  
  address price_manager = 0x0000000000000000000000000000000000000000;
  
  bool internal_prices = true;
  uint256 price_curve = 5; //5%
  
  uint32 constant BAD_NFT_PROFILE_ID = 9999999;
  uint256 constant BAD_PRICE = 0;
  string constant BAD_URL = '';
  uint32 constant UNLIMITED = 9999999;
  
  /**
   * @dev 'database' to store profiles of NFTs
   */
  struct NFTProfile{
      uint32 id;
      uint256 price; //in CYTR, i.e. 1,678 CYTR last 18 digits are decimals
      uint256 sell_price; //in CYTR i.e. 1,678 CYTR last 18 digits are decimals
      string url;
      uint32 limit;
  }
  
  NFTProfile[] public nftProfiles;
  
  uint256 next_token_id = 10;

   /**
   * @dev Events
   */
    //buy from us
    event Minted(uint32 profileID, uint256 tokenId, address wallet, uint256 cytrAmount, uint256 priceAtMoment);
    
    //intermediate event for support of broken buy (CYTR transferred but NFT was not minted) 
    // - for manual resolution from admin panel
    event GotCYTRForNFT(uint32 profileID, address wallet, uint256 cytrAmount, uint256 priceAtMoment);
    
    //intermediate event for support of broken sell (CYTR transferred back NFT was not burned) 
    // - for manual resolution from admin panel
    event SendCYTRForNFT(uint32 profileID, address wallet, uint256 cytrAmount, uint256 buybackPriceAtMoment);
    
    //buy back from user
    event Burned(uint32 profileID, uint256 tokenId, address wallet, uint256 cytrAmount, uint256 buybackPriceAtMoment);
    
    //admin events - CYTR tokens/ether deposit/withdrawal
    event TokensDeposited(uint256 amount, address wallet);
    event FinneyDeposited(uint256 amount, address wallet);
    event Withdrawn(uint256 amount, address wallet);
    event TokensWithdrawn(uint256 amount, address wallet);
    event AdminMinted(uint32 profileID, uint256 tokenId, address wallet, uint256 curPrice); 
    event AdminBurned(uint256 _tokenId,uint32 tokenProfileId, uint256 curSellPrice); 

  /**
   * @dev Contract constructor.
   */
  constructor()
    public
  {
     price_manager = owner;
     nftContract = CyclopsTokens(nftContractAddress);   //NFT minting interface
     token = ERC20Token(paymentTokenAddress);           //CYTR interface
  }
    
    function setPriceManagerRight(address newPriceManager) external onlyOwner{
          price_manager = newPriceManager;
    }
      
    
    function getPriceManager() public view returns(address){
        return price_manager;
    }

    function setInternalPriceCurve() external onlyOwnerOrPriceManager{
          internal_prices = true;
    }
    
    function setExternalPriceCurve() external onlyOwnerOrPriceManager{
          internal_prices = false;
    }
      
    function isPriceCurveInternal() public view returns(bool){
        return internal_prices;
    }
      
    function setPriceCurve(uint256 new_curve) external onlyOwnerOrPriceManager{
          price_curve = new_curve;
    }
      
    
    function getPriceCurve() public view returns(uint256){
        return price_curve;
    }
    
    
    /**
    * @dev setter/getter for ERC20 linked to exchange (current) smartcontract
    */
    function setPaymentToken(address newERC20Contract) external onlyOwner returns(bool){
    
        paymentTokenAddress = newERC20Contract;
        token = ERC20Token(paymentTokenAddress);
    }
    
    
    function getPaymentToken() external view returns(address){
        return paymentTokenAddress;
    }
    
    
    
    /**
    * @dev setter/getter for NFT publisher linked to 'marketplace' smartcontract
    */
    function setNFTContract(address newNFTContract) external onlyOwner returns(bool){
    
        nftContractAddress = newNFTContract;
        nftContract = CyclopsTokens(nftContractAddress);
    }
    
    
    function getNFTContract() external view returns(address){
        return nftContractAddress;
    }



  /**
   * @dev getter for next_token_id
   */
  function getNextTokenId() external  view returns (uint256){
      return next_token_id;
  }
  
   /**
   * @dev setter for next_token_id
   */
  function setNextTokenId(uint32 setId) external onlyOwnerOrPriceManager (){
      next_token_id = setId;
  }
  
  /**
   * @dev adds 'record' to 'database'
   * @param id, unique id of profiles
   * @param price, price of NFT assets which will be generated based on profile
   * @param sell_price, when we will buy out from owner (burn)
   * @param url, url of NFT assets which will be generated based on profile
   */
  function addNFTProfile(uint32 id, uint256 price, uint256 sell_price, string calldata url, uint32 limit) external onlyOwnerOrPriceManager {
      NFTProfile memory temp = NFTProfile(id,price,sell_price,url, limit);
      nftProfiles.push(temp);
  }
  
  
  
  /**
   * @dev removes 'record' to 'database'
   * @param id (profile id)
   *
   */
  function removeNFTProfileAtId(uint32 id) external onlyOwnerOrPriceManager {
     for (uint32 i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              removeNFTProfileAtIndex(i);      
              return;
          }
     }
  }
  
  
  
  /**
   * @dev removes 'record' to 'database'
   * @param index, record number (from 0)
   *
   */
  function removeNFTProfileAtIndex(uint32 index) internal {
     if (index >= nftProfiles.length) return;
     if (index == nftProfiles.length -1){
         nftProfiles.pop();
     } else {
         for (uint i = index; i < nftProfiles.length-1; i++){
             nftProfiles[i] = nftProfiles[i+1];
         }
         nftProfiles.pop();
     }
  }
  
  
  
  /**
   * @dev replaces 'record' in the 'database'
   * @param id, unique id of profile
   * @param price, price of NFT assets which will be generated based on profile
   * @param sell_price, sell price (back to owner) of NFT assets when owner sell to us (and we burn)
   * @param url, url of NFT assets which will be generated based on profile
   */
  function replaceNFTProfileAtId(uint32 id, uint256 price, uint256 sell_price, string calldata url, uint32 limit) external onlyOwnerOrPriceManager {
     for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              nftProfiles[i].price = price;
              nftProfiles[i].sell_price = sell_price;
              nftProfiles[i].url = url;
              nftProfiles[i].limit = limit;
              return;
          }
     }
  }
  
  
  /**
   * @dev replaces 'record' in the 'database'
   * @param atIndex, at which row of array to make replacement
   * @param id, unique id of profiles
   * @param price, price of NFT assets which will be generated based on profile
   * @param sell_price, sell price (back to owner) of NFT assets when owner sell to us (and we burn)
   * @param url, url of NFT assets which will be generated based on profile
   */
  function replaceNFTProfileAtIndex(uint32 atIndex, uint32 id, uint256 price, uint256 sell_price, string calldata url, uint32 limit) external onlyOwnerOrPriceManager  {
     nftProfiles[atIndex].id = id;
     nftProfiles[atIndex].price = price;
     nftProfiles[atIndex].sell_price = sell_price;
     nftProfiles[atIndex].url = url;
     nftProfiles[atIndex].limit = limit;
  }
  
    /**
   * @dev return array of strings is not supported by solidity, we return ids & prices
   */
  function viewNFTProfilesPrices() external view returns( uint32[] memory, uint256[] memory, uint256[] memory){
      uint32[] memory ids = new uint32[](nftProfiles.length);
      uint256[] memory prices = new uint256[](nftProfiles.length);
      uint256[] memory sell_prices = new uint256[](nftProfiles.length);
      for (uint i = 0; i < nftProfiles.length; i++){
          ids[i] = nftProfiles[i].id;
          prices[i] = nftProfiles[i].price;
          sell_prices[i] = nftProfiles[i].sell_price;
      }
      return (ids, prices, sell_prices);
  }
  
  
   /**
   * @dev return price, sell_price & url for profile by id
   */
  function viewNFTProfileDetails(uint32 id) external view returns(uint256, uint256, string memory, uint32){
     for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              return (nftProfiles[i].price, nftProfiles[i].sell_price, nftProfiles[i].url, nftProfiles[i].limit);     
          }
     }
     return (BAD_PRICE, BAD_PRICE, BAD_URL, UNLIMITED);
  }
  
  /**
   * @dev get price by id from 'database'
   * @param id, unique id of profiles
   */
  function getPriceById(uint32 id) public  view returns (uint256){
      for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              return nftProfiles[i].price;
          }
      }
      return BAD_PRICE;
  }
  
  
 
  
  /**
   * @dev get sell price by id from 'database'
   * @param id, unique id of profiles
   */
  function getSellPriceById(uint32 id) public  view returns (uint256){
      for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              return nftProfiles[i].sell_price;
          }
      }
      return BAD_PRICE;
  }
  
   /**
   * @dev set new price for asset (profile of NFT), price for which customer can buy
   * @param id, unique id of profiles
   */
  function setPriceById(uint32 id, uint256 new_price) external onlyOwnerOrPriceManager{
      for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              nftProfiles[i].price = new_price;
              return;
          }
      }
  }
  
   /**
   * @dev set new sell (buy back) price for asset (profile of NFT), 
   * price for which customer can sell to us
   * @param id, unique id of profiles
   */
  function setSellPriceById(uint32 id, uint256 new_price) external onlyOwnerOrPriceManager{
      for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              nftProfiles[i].sell_price = new_price;
              return;
          }
      }
  }
  
  // for optimization, funciton to update both prices
  function updatePricesById(uint32 id, uint256 new_price, uint256 new_sell_price) external onlyOwnerOrPriceManager{
      for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              nftProfiles[i].price = new_price;
              nftProfiles[i].sell_price = new_sell_price;
              return;
          }
      }
  }
  
 
  
  /**
   * @dev get url by id from 'database'
   * @param id, unique id of profiles
   */ 
  function  getUrlById(uint32 id) public view returns (string memory){
      for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
              return nftProfiles[i].url;
          }
      }
      return BAD_URL;
  }
  
  function  getLimitById(uint32 id) public view returns (uint32){
      for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == id){
             return nftProfiles[i].limit;
          }
      }
      return UNLIMITED;
  }
  
   
  /**
   * @dev accepts payment only in CYTR(!) for mint NFT & calls external contract
   * it is public function, i.e called by buyer via dApp
   * buyer selects profile (profileID), provides own wallet address (_to)
   * and dApp provides available _tokenId (for flexibility its calculation is not automatic on 
   * smart contract level, but it is possible to implement) - > nftContract.totalSupply()+1
   * why not recommended: outsite of smart contract with multiple simultaneous customers we can 
   * instanteneusly on level of backend determinte next free id.
   * on CyclopsTokens smartcontract level it can be only calculated correctly after mint transaction is confirmed
   * here utility function is implemented which is used by backend ,getNextTokenId()
   * it is also possible to use setNextTokenId function (by owner) to reset token id if needed
   * normal use is dApp requests next token id (tid = getNextTokenId()) and after that
   * calls publicMint(profile, to, tid)
   * it allows different dApps use different token ids areas
   * like   dapp1: tid = getNextTokenId() + 10000
   *        dapp2: tid = getNextTokenId() + 20000
   */
  function buyNFT(          //'buy' == mint NFT token function, provides NFT token in exchange of CYTR    
    uint32 profileID,       //id of NFT profile
    uint256 cytrAmount,     //amount of CYTR we check it is equal to price, amount in real form i.e. 18 decimals
    address _to,            //where to deliver 
    uint256 _tokenId        //with which id NFT will be generated
  ) 
    external 
    notContract 
    returns (uint256)
  {
    require (getLimitById(profileID) > 0,"limit is over");
    
    uint256 curPrice = getPriceById(profileID);
    require(curPrice != BAD_PRICE, "price for NFT profile not found");
    require(cytrAmount > 0, "You need to provide some CYTR"); //it is already in 'real' form, i.e. with decimals
    
    require(cytrAmount == curPrice); //correct work (i.e. dApp calculated price correctly)
    
    uint256 token_bal = token.balanceOf(msg.sender); //how much CYTR buyer has
    
    require(token_bal >= cytrAmount, "Check the CYTR balance on your wallet"); //is it enough
    
    uint256 allowance = token.allowance(msg.sender, address(this));
    
    require(allowance >= cytrAmount, "Check the CYTR allowance"); //is allowance provided
    
    require(isFreeTokenId(_tokenId), "token id is is occupied"); //adjust on calling party

    //ensure we revert in case of failure
    try token.transferFrom(msg.sender, address(this), cytrAmount) { // get CYTR from buyer
        emit GotCYTRForNFT(profileID, msg.sender, cytrAmount, curPrice);
    } catch {
        require(false,"CYTR transfer failed");
        return 0; 
    }
  
   
    //external contract mint
    try nftContract.mint(_to,_tokenId, getUrlById(profileID)){
        next_token_id++;
        //we should have event pairs GotCYTRForNFT - Minted if all good
        emit Minted(profileID, _tokenId, msg.sender, cytrAmount, curPrice); 
    } catch {
        //return payment by using require..it should revert transaction 
        require(false,"mint failed");
    }
    
    for (uint i = 0; i < nftProfiles.length; i++){
      if (nftProfiles[i].id == profileID){
          if (nftProfiles[i].limit != UNLIMITED) nftProfiles[i].limit--;
      }
    }
    
    if (internal_prices){ //if we manage price curve internally
        for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == profileID){
              uint256 change = nftProfiles[i].price.div(100).mul(price_curve);
              nftProfiles[i].price = nftProfiles[i].price.add(change);
              change = nftProfiles[i].sell_price.div(100).mul(price_curve);
              nftProfiles[i].sell_price = nftProfiles[i].sell_price.add(change);
          }
      }
    }
 
    //return _tokenId; //success, return generated tokenId, works only if called by contract, i.e. not our case
  }

 /**
   * @dev method allows collectible owner to sell it back for sell price
   * collectible is burned, amount of sell price returned to owner of collectible
   * tokenId -> tokenProfileId -> sell price
   */
  function sellNFTBack(uint256 _tokenId) external notContract returns(uint256){ //'sell' == burn, burns and returns CYTR to user
        require(nftContract.ownerOf(_tokenId) == msg.sender, "it is not your NFT");
        uint32 tokenProfileId = getProfileIdByTokenId(_tokenId);
        require(tokenProfileId != BAD_NFT_PROFILE_ID, "NFT profile ID not found");
        uint256 sellPrice = getSellPriceById(tokenProfileId); 
        require(sellPrice != BAD_PRICE, "NFT price not found");
        
        require(token.balanceOf(msg.sender) > sellPrice, "unsufficient CYTR on contract");
        
        try nftContract.burn(_tokenId) {
            emit Burned(tokenProfileId, _tokenId, msg.sender, sellPrice, sellPrice); 
        } catch {
        //ensure error will be send (false, i.e. require is never fulfilled, error send)
            require (false, "NFT burn failed");
        }
      
        //ensure we revert in case of failure
        try token.transfer(msg.sender,  sellPrice) { // send CYTR to seller
            //just continue if all good..
            emit SendCYTRForNFT(tokenProfileId, msg.sender, sellPrice, sellPrice);
        } catch {
            require(false,"CYTR transfer failed");
            return 0; 
        }
        
        for (uint i = 0; i < nftProfiles.length; i++){
          if (nftProfiles[i].id == tokenProfileId){
              if (nftProfiles[i].limit != UNLIMITED) nftProfiles[i].limit++;
          }
        }
       
        if (internal_prices){ //if we manage price curve internally
            for (uint i = 0; i < nftProfiles.length; i++){
              if (nftProfiles[i].id == tokenProfileId){
                  uint256 change = nftProfiles[i].price.div(100).mul(price_curve);
                  nftProfiles[i].price = nftProfiles[i].price.sub(change);
                  change = nftProfiles[i].sell_price.div(100).mul(price_curve);
                  nftProfiles[i].sell_price = nftProfiles[i].sell_price.sub(change);
              }
            }
        }
  }
  
  
  function adminMint(       //mint for free as admin
    uint32 profileID,       //id of NFT profile
    address _to,            //where to deliver 
    uint256 _tokenId        //with which id NFT will be generated
  ) 
    external 
    onlyOwnerOrPriceManager
    returns (uint256)
  {
    uint256 curPrice = getPriceById(profileID);
    require(curPrice != BAD_PRICE, "price for NFT profile not found");
    require(isFreeTokenId(_tokenId), "token id is is occupied");
  

    
    //external contract mint
    try nftContract.mint(_to,_tokenId, getUrlById(profileID)){
        next_token_id++;
        //we should have event pairs GotCYTRForNFT - Minted if all good
        emit AdminMinted(profileID, _tokenId, _to, curPrice); 
    } catch {
        //return payment by using require..it should revert transaction 
        require(false,"mint failed");
    }
    
    return _tokenId; //success, return generated tokenId (works if called by another contract)
  }

  
  
  function adminBurn(uint256 _tokenId) external  onlyOwnerOrPriceManager returns(uint256){  //burn as admin, without CYTR move

        uint32 tokenProfileId = getProfileIdByTokenId(_tokenId);
        //require(tokenProfileId != BAD_NFT_PROFILE_ID, "NFT profile ID not found");
        //in admin mode we do not require it
        uint256 sellPrice = getSellPriceById(tokenProfileId); 
        //require(sellPrice != BAD_PRICE, "NFT price not found");
        //in admin mode we do not require it
        
        try nftContract.burn(_tokenId) {
            emit AdminBurned(_tokenId, tokenProfileId, sellPrice); 
        } catch {
        //ensure error will be send (false, i.e. require is never fulfilled, error send)
            require (false, "NFT burn failed");
        }
      
  }
  
  
  function getProfileIdByTokenId(uint256 tokenId) public view returns(uint32){
      string memory url = BAD_URL;
      try nftContract.tokenURI(tokenId) {
        url = nftContract.tokenURI(tokenId);
        return getProfileIdbyUrl(url);
      } catch {
        return BAD_NFT_PROFILE_ID;
      }
     
  }
  
  function getProfileIdbyUrl(string memory url) public  view returns (uint32){
      for (uint i = 0; i < nftProfiles.length; i++){
          if (keccak256(bytes(nftProfiles[i].url)) == keccak256(bytes(url))){
              return nftProfiles[i].id;
          }
      }
      return BAD_NFT_PROFILE_ID;
  }
  
 
  
  function isFreeTokenId(uint256 tokenId) public view returns (bool){
      try nftContract.tokenURI(tokenId) { 
          //if we can run this successfully it means token id is not free -> false
          return false;
      } catch {
          return true; //if we errored getting url by tokenId, it is free -> true
      }
  }
  
  
  function getTokenPriceByTokenId(uint256 tokenId) public view returns(uint256){
      string memory url = BAD_URL;
      try nftContract.tokenURI(tokenId) {
        url = nftContract.tokenURI(tokenId);
        uint32 profileId = getProfileIdbyUrl(url);
        if (profileId == BAD_NFT_PROFILE_ID){
            return BAD_NFT_PROFILE_ID;
        } else {
            return getSellPriceById(profileId);
        }
      } catch {
        return BAD_NFT_PROFILE_ID;
      }
     
  }
  
  
    /**
    * @dev - six functions below are for owner to check balance and
    * deposit/withdraw eth/tokens to exchange contract
    */
    /**
    * @dev returns contract balance, in wei
    */
    
    function getContractBalance() external view returns (uint256) {
        return address(this).balance;
    }

    /**
    * @dev returns contract tokens balance
    */
    function getContractTokensBalance() external view returns (uint256) {
        return token.balanceOf(address(this));
    }
    
    
    function withdraw(address payable sendTo, uint256 amount) external onlyOwner {
        require(address(this).balance >= amount, "unsufficient funds");
        bool success = false;
        // ** sendTo.transfer(amount);**
        (success, ) = sendTo.call.value(amount)("");
        require(success, "Transfer failed.");
        // ** end **
        emit Withdrawn(amount, sendTo); //in wei
    }
    
    
    //deposit ether (amount in finney for control is provided as input paramenter)
    function deposit(uint256 amount) payable external onlyOwner { 
        require(amount*(1 finney) == msg.value,"please provide value in finney");
        emit FinneyDeposited(amount, owner); //in finney
    }
    
    
    // tokens with decimals, already converted on frontend
    function depositTokens(uint256 amount) external onlyOwner {
        require(amount > 0, "You need to deposit at least some tokens");
        uint256 allowance = token.allowance(msg.sender, address(this));
        require(allowance >= amount, "Check the token allowance");
        token.transferFrom(msg.sender, address(this), amount);
    
        emit TokensDeposited(amount, owner);
    }
    
    
    // tokens with decimals, already converted on frontend
    function withdrawTokens(address to_wallet, uint256 realAmountTokens) external onlyOwner {
            
        require(realAmountTokens > 0, "You need to withdraw at least some tokens");
      
        uint256 contractTokenBalance = token.balanceOf(address(this));
    
        require(contractTokenBalance > realAmountTokens, "unsufficient funds");
    
         //ensure we revert in case of failure
        try token.transfer(to_wallet, realAmountTokens) {
            emit TokensWithdrawn(realAmountTokens, to_wallet); //in real representation
        } catch {
            require(false,"tokens transfer failed");
    
        }
    
    }
        
    
    
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"tokenProfileId","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"curSellPrice","type":"uint256"}],"name":"AdminBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"profileID","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"curPrice","type":"uint256"}],"name":"AdminMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"profileID","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"cytrAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buybackPriceAtMoment","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"FinneyDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"profileID","type":"uint32"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"cytrAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceAtMoment","type":"uint256"}],"name":"GotCYTRForNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"profileID","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"cytrAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceAtMoment","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"profileID","type":"uint32"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"cytrAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buybackPriceAtMoment","type":"uint256"}],"name":"SendCYTRForNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sell_price","type":"uint256"},{"internalType":"string","name":"url","type":"string"},{"internalType":"uint32","name":"limit","type":"uint32"}],"name":"addNFTProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"adminBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"profileID","type":"uint32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"adminMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"profileID","type":"uint32"},{"internalType":"uint256","name":"cytrAmount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buyNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractTokensBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"}],"name":"getLimitById","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaymentToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"}],"name":"getPriceById","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceCurve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getProfileIdByTokenId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"getProfileIdbyUrl","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"}],"name":"getSellPriceById","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenPriceByTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"}],"name":"getUrlById","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isFreeTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPriceCurveInternal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftProfiles","outputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sell_price","type":"uint256"},{"internalType":"string","name":"url","type":"string"},{"internalType":"uint32","name":"limit","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"}],"name":"removeNFTProfileAtId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sell_price","type":"uint256"},{"internalType":"string","name":"url","type":"string"},{"internalType":"uint32","name":"limit","type":"uint32"}],"name":"replaceNFTProfileAtId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"atIndex","type":"uint32"},{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sell_price","type":"uint256"},{"internalType":"string","name":"url","type":"string"},{"internalType":"uint32","name":"limit","type":"uint32"}],"name":"replaceNFTProfileAtIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"sellNFTBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setExternalPriceCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setInternalPriceCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newNFTContract","type":"address"}],"name":"setNFTContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"setId","type":"uint32"}],"name":"setNextTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newERC20Contract","type":"address"}],"name":"setPaymentToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint256","name":"new_price","type":"uint256"}],"name":"setPriceById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_curve","type":"uint256"}],"name":"setPriceCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPriceManager","type":"address"}],"name":"setPriceManagerRight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint256","name":"new_price","type":"uint256"}],"name":"setSellPriceById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint256","name":"new_price","type":"uint256"},{"internalType":"uint256","name":"new_sell_price","type":"uint256"}],"name":"updatePricesById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"id","type":"uint32"}],"name":"viewNFTProfileDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewNFTProfilesPrices","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"sendTo","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_wallet","type":"address"},{"internalType":"uint256","name":"realAmountTokens","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600380546001600160a01b031990811673d6d778d86ddf225e3c02c45d6c6e8eb3497b452a179091556004805490911673bd05cee8741100010d8e93048a80ed77645ac7bf179055600580546001600160a81b031916600160a01b178155600655600a60085534801561007657600080fd5b50600080546001600160a01b03199081163317918290556005805482166001600160a01b03938416179055600354600180548316918416919091179055600454600280549092169216919091179055614b4f806100d46000396000f3fe6080604052600436106102725760003560e01c8063940a14551161014f578063c9ab22a7116100c1578063dd49756e1161007a578063dd49756e14610d63578063dec0fc5c14610d8d578063f2fde38b14610db7578063f3fe3bc314610dea578063f3fef3a314610dff578063f8a623d314610e3857610272565b8063c9ab22a714610c07578063caa0f92a14610c43578063cbfcaed514610c58578063cf5b281614610c88578063d3c5f13714610c9d578063d41c3a6514610d4e57610272565b8063a77cefc411610113578063a77cefc414610b09578063a7ccabdf14610b39578063a8f621ea14610b6c578063b6749d9414610b96578063b6b55f2514610bc0578063badb97ff14610bdd57610272565b8063940a1455146109c357806394d212e614610a0c5780639609f6c714610a215780639cf1ba2e14610a36578063a5419ba214610a6657610272565b80635230bcdf116101e857806377476c7b116101ac57806377476c7b146107d9578063860d248a1461080f5780638cec7946146108995780638da5cb5b1461096f5780638da7df22146109845780638ea7f0331461099957610272565b80635230bcdf146105c05780635d7dc9da146106b35780635d82c4621461074d5780636a326ab11461077d5780636f9fb98a146107c457610272565b806319e1f4861161023a57806319e1f4861461048a5780631ba9bdac146104b457806329598630146104c95780632b1f4ad6146104ff5780634488c99c1461053057806345f403621461057b57610272565b806302d1003b1461027757806306b091f9146102b95780630ea638a3146102f4578063156b1d37146103bd57806318fdec7e14610457575b600080fd5b34801561028357600080fd5b506102a76004803603602081101561029a57600080fd5b503563ffffffff16610e4d565b60408051918252519081900360200190f35b3480156102c557600080fd5b506102f2600480360360408110156102dc57600080fd5b506001600160a01b038135169060200135610ec6565b005b34801561030057600080fd5b506103246004803603602081101561031757600080fd5b503563ffffffff1661118b565b60405180858152602001848152602001806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561037f578181015183820152602001610367565b50505050905090810190601f1680156103ac5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b3480156103c957600080fd5b506102f2600480360360a08110156103e057600080fd5b63ffffffff8235169160208101359160408201359190810190608081016060820135600160201b81111561041357600080fd5b82018360208201111561042557600080fd5b803590602001918460018302840111600160201b8311171561044657600080fd5b91935091503563ffffffff1661131b565b34801561046357600080fd5b506102f26004803603602081101561047a57600080fd5b50356001600160a01b0316611480565b34801561049657600080fd5b506102a7600480360360208110156104ad57600080fd5b503561151a565b3480156104c057600080fd5b506102f2611bf5565b3480156104d557600080fd5b506102f2600480360360408110156104ec57600080fd5b5063ffffffff8135169060200135611c62565b34801561050b57600080fd5b50610514611d33565b604080516001600160a01b039092168252519081900360200190f35b34801561053c57600080fd5b506102a76004803603608081101561055357600080fd5b5063ffffffff813516906020810135906001600160a01b036040820135169060600135611d43565b34801561058757600080fd5b506102a76004803603606081101561059e57600080fd5b5063ffffffff813516906001600160a01b03602082013516906040013561250e565b3480156105cc57600080fd5b506105d56127ad565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561061d578181015183820152602001610605565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561065c578181015183820152602001610644565b50505050905001848103825285818151815260200191508051906020019060200280838360005b8381101561069b578181015183820152602001610683565b50505050905001965050505050505060405180910390f35b3480156106bf57600080fd5b506102f2600480360360a08110156106d657600080fd5b63ffffffff8235169160208101359160408201359190810190608081016060820135600160201b81111561070957600080fd5b82018360208201111561071b57600080fd5b803590602001918460018302840111600160201b8311171561073c57600080fd5b91935091503563ffffffff1661292b565b34801561075957600080fd5b506102a76004803603602081101561077057600080fd5b503563ffffffff16612afc565b34801561078957600080fd5b506107b0600480360360208110156107a057600080fd5b50356001600160a01b0316612b6a565b604080519115158252519081900360200190f35b3480156107d057600080fd5b506102a7612c14565b3480156107e557600080fd5b506102f2600480360360408110156107fc57600080fd5b5063ffffffff8135169060200135612c18565b34801561081b57600080fd5b50610824612ce5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561085e578181015183820152602001610846565b50505050905090810190601f16801561088b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a557600080fd5b506108c3600480360360208110156108bc57600080fd5b5035612d07565b604051808663ffffffff1663ffffffff168152602001858152602001848152602001806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015610930578181015183820152602001610918565b50505050905090810190601f16801561095d5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b34801561097b57600080fd5b50610514612dde565b34801561099057600080fd5b506107b0612ded565b3480156109a557600080fd5b506107b0600480360360208110156109bc57600080fd5b5035612dfd565b3480156109cf57600080fd5b506109f3600480360360208110156109e657600080fd5b503563ffffffff16612f42565b6040805163ffffffff9092168252519081900360200190f35b348015610a1857600080fd5b506102a7612fc4565b348015610a2d57600080fd5b506102a7613040565b348015610a4257600080fd5b506102f260048036036020811015610a5957600080fd5b503563ffffffff16613046565b348015610a7257600080fd5b506102f2600480360360c0811015610a8957600080fd5b63ffffffff823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610ac557600080fd5b820183602082011115610ad757600080fd5b803590602001918460018302840111600160201b83111715610af857600080fd5b91935091503563ffffffff166130af565b348015610b1557600080fd5b5061082460048036036020811015610b2c57600080fd5b503563ffffffff16613214565b348015610b4557600080fd5b506107b060048036036020811015610b5c57600080fd5b50356001600160a01b0316613322565b348015610b7857600080fd5b506102a760048036036020811015610b8f57600080fd5b50356133cc565b348015610ba257600080fd5b506109f360048036036020811015610bb957600080fd5b5035613692565b6102f260048036036020811015610bd657600080fd5b503561392b565b348015610be957600080fd5b506102a760048036036020811015610c0057600080fd5b5035613a49565b348015610c1357600080fd5b506102f260048036036060811015610c2a57600080fd5b5063ffffffff8135169060208101359060400135613bb2565b348015610c4f57600080fd5b506102a7613ca8565b348015610c6457600080fd5b506102f260048036036020811015610c7b57600080fd5b503563ffffffff16613cae565b348015610c9457600080fd5b506102f2613d70565b348015610ca957600080fd5b506109f360048036036020811015610cc057600080fd5b810190602081018135600160201b811115610cda57600080fd5b820183602082011115610cec57600080fd5b803590602001918460018302840111600160201b83111715610d0d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613de3945050505050565b348015610d5a57600080fd5b50610514613eba565b348015610d6f57600080fd5b506102f260048036036020811015610d8657600080fd5b5035613ec9565b348015610d9957600080fd5b506102f260048036036020811015610db057600080fd5b5035614124565b348015610dc357600080fd5b506102f260048036036020811015610dda57600080fd5b50356001600160a01b0316614187565b348015610df657600080fd5b506108246142cd565b348015610e0b57600080fd5b506102f260048036036040811015610e2257600080fd5b506001600160a01b0381351690602001356142ef565b348015610e4457600080fd5b50610514614494565b6000805b600754811015610ebb578263ffffffff1660078281548110610e6f57fe5b600091825260209091206005909102015463ffffffff161415610eb35760078181548110610e9957fe5b906000526020600020906005020160020154915050610ec1565b600101610e51565b50600090505b919050565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610f7a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610f3f578181015183820152602001610f27565b50505050905090810190601f168015610f6c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008111610fba5760405162461bcd60e51b8152600401808060200182810382526029815260200180614af16029913960400191505060405180910390fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d602081101561102f57600080fd5b5051905081811161107c576040805162461bcd60e51b8152602060048201526012602482015271756e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b6002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156110d257600080fd5b505af19250505080156110f757506040513d60208110156110f257600080fd5b505160015b611141576040805162461bcd60e51b81526020600482015260166024820152751d1bdad95b9cc81d1c985b9cd9995c8819985a5b195960521b604482015290519081900360640190fd5b50604080518381526001600160a01b038516602082015281517f0ddddc48b57dd67f8fa2ff05c78034b578c31ef5caa05b03d2ca16feadbbb98f929181900390910190a15b505050565b600080606081805b6007548110156112f6578563ffffffff16600782815481106111b157fe5b600091825260209091206005909102015463ffffffff1614156112ee57600781815481106111db57fe5b906000526020600020906005020160010154600782815481106111fa57fe5b9060005260206000209060050201600201546007838154811061121957fe5b90600052602060002090600502016003016007848154811061123757fe5b600091825260209182902060046005909202010154825460408051601f6002600019600186161561010002019094169390930492830185900485028101850190915281815263ffffffff909216928491908301828280156112d95780601f106112ae576101008083540402835291602001916112d9565b820191906000526020600020905b8154815290600101906020018083116112bc57829003601f168201915b50505050509150945094509450945050611314565b600101611193565b505060408051602081019091526000808252935083925090506298967f5b9193509193565b6005546001600160a01b031633148061133e57506000546001600160a01b031633145b6113795760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b600754811015611476578663ffffffff166007828154811061139a57fe5b600091825260209091206005909102015463ffffffff16141561146e5785600782815481106113c557fe5b90600052602060002090600502016001018190555084600782815481106113e857fe5b90600052602060002090600502016002018190555083836007838154811061140c57fe5b9060005260206000209060050201600301919061142a929190614855565b50816007828154811061143957fe5b906000526020600020906005020160040160006101000a81548163ffffffff021916908363ffffffff16021790555050611478565b60010161137c565b505b505050505050565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146114f75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611525336144a3565b156115615760405162461bcd60e51b8152600401808060200182810382526022815260200180614aa76022913960400191505060405180910390fd5b600154604080516331a9108f60e11b815260048101859052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b50516001600160a01b031614611628576040805162461bcd60e51b81526020600482015260126024820152711a5d081a5cc81b9bdd081e5bdd5c8813919560721b604482015290519081900360640190fd5b600061163383613692565b905063ffffffff81166298967f1415611693576040805162461bcd60e51b815260206004820152601860248201527f4e46542070726f66696c65204944206e6f7420666f756e640000000000000000604482015290519081900360640190fd5b600061169e82610e4d565b9050806116e8576040805162461bcd60e51b8152602060048201526013602482015272139195081c1c9a58d9481b9bdd08199bdd5b99606a1b604482015290519081900360640190fd5b600254604080516370a0823160e01b8152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561173257600080fd5b505afa158015611746573d6000803e3d6000fd5b505050506040513d602081101561175c57600080fd5b5051116117b0576040805162461bcd60e51b815260206004820152601d60248201527f756e73756666696369656e742043595452206f6e20636f6e7472616374000000604482015290519081900360640190fd5b60015460408051630852cd8d60e31b81526004810187905290516001600160a01b03909216916342966c689160248082019260009290919082900301818387803b1580156117fd57600080fd5b505af192505050801561180e575060015b611851576040805162461bcd60e51b815260206004820152600f60248201526e13919508189d5c9b8819985a5b1959608a1b604482015290519081900360640190fd5b6040805163ffffffff84168152602081018690523381830152606081018390526080810183905290517fd47f6b8f75f609a4e4c8a2ac7d7b832f838a4d7cd0bd16e09cbdb1c75589f1839181900360a00190a16002546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156118f857600080fd5b505af192505050801561191d57506040513d602081101561191857600080fd5b505160015b611965576040805162461bcd60e51b815260206004820152601460248201527310d65514881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b506040805163ffffffff841681523360208201528082018390526060810183905290517fa7ee43596e81c2ca49d6a37948abf0c3c23d30645ae08996783fb304b0de07469181900360800190a160005b600754811015611a69578263ffffffff16600782815481106119d357fe5b600091825260209091206005909102015463ffffffff161415611a61576298967f63ffffffff1660078281548110611a0757fe5b600091825260209091206004600590920201015463ffffffff1614611a615760078181548110611a3357fe5b60009182526020909120600460059092020101805463ffffffff8082166001011663ffffffff199091161790555b6001016119b5565b50600554600160a01b900460ff1615611bee5760005b600754811015611bec578263ffffffff1660078281548110611a9d57fe5b600091825260209091206005909102015463ffffffff161415611be4576000611b00600654611af4606460078681548110611ad457fe5b9060005260206000209060050201600101546144af90919063ffffffff16565b9063ffffffff61453116565b9050611b338160078481548110611b1357fe5b9060005260206000209060050201600101546145c390919063ffffffff16565b60078381548110611b4057fe5b906000526020600020906005020160010181905550611b8d600654611af4606460078681548110611b6d57fe5b9060005260206000209060050201600201546144af90919063ffffffff16565b9050611bc08160078481548110611ba057fe5b9060005260206000209060050201600201546145c390919063ffffffff16565b60078381548110611bcd57fe5b906000526020600020906005020160020181905550505b600101611a7f565b505b5050919050565b6005546001600160a01b0316331480611c1857506000546001600160a01b031633145b611c535760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b6005805460ff60a01b19169055565b6005546001600160a01b0316331480611c8557506000546001600160a01b031633145b611cc05760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b600754811015611186578263ffffffff1660078281548110611ce157fe5b600091825260209091206005909102015463ffffffff161415611d27578160078281548110611d0c57fe5b90600052602060002090600502016002018190555050611d2f565b600101611cc3565b5050565b6003546001600160a01b03165b90565b6000611d4e336144a3565b15611d8a5760405162461bcd60e51b8152600401808060200182810382526022815260200180614aa76022913960400191505060405180910390fd5b6000611d9586612f42565b63ffffffff1611611ddd576040805162461bcd60e51b815260206004820152600d60248201526c3634b6b4ba1034b99037bb32b960991b604482015290519081900360640190fd5b6000611de886612afc565b905080611e3c576040805162461bcd60e51b815260206004820152601f60248201527f707269636520666f72204e46542070726f66696c65206e6f7420666f756e6400604482015290519081900360640190fd5b60008511611e91576040805162461bcd60e51b815260206004820152601d60248201527f596f75206e65656420746f2070726f7669646520736f6d652043595452000000604482015290519081900360640190fd5b808514611e9d57600080fd5b600254604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611ee857600080fd5b505afa158015611efc573d6000803e3d6000fd5b505050506040513d6020811015611f1257600080fd5b5051905085811015611f555760405162461bcd60e51b8152600401808060200182810382526025815260200180614a826025913960400191505060405180910390fd5b60025460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b158015611fa657600080fd5b505afa158015611fba573d6000803e3d6000fd5b505050506040513d6020811015611fd057600080fd5b5051905086811015612029576040805162461bcd60e51b815260206004820152601860248201527f436865636b20746865204359545220616c6c6f77616e63650000000000000000604482015290519081900360640190fd5b61203285612dfd565b61207d576040805162461bcd60e51b81526020600482015260176024820152761d1bdad95b881a59081a5cc81a5cc81bd8d8dd5c1a5959604a1b604482015290519081900360640190fd5b600254604080516323b872dd60e01b8152336004820152306024820152604481018a905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156120d757600080fd5b505af19250505080156120fc57506040513d60208110156120f757600080fd5b505160015b612144576040805162461bcd60e51b815260206004820152601460248201527310d65514881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b506040805163ffffffff8a1681523360208201528082018990526060810185905290517f5eb741512cc8246129aa667a37f08969a61a32e86fe056469e4f2aa361959ef19181900360800190a16001546001600160a01b031663d3fc986487876121ad8c613214565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156122175781810151838201526020016121ff565b50505050905090810190601f1680156122445780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561226557600080fd5b505af1925050508015612276575060015b6122b5576040805162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015290519081900360640190fd5b6008805460010190556040805163ffffffff8a168152602081018790523381830152606081018990526080810185905290517feb4a64188fd5e16f806e9767e459d5307b5cbe10288b34c01d2a7cddb1afe5689181900360a00190a160005b6007548110156123ca578863ffffffff166007828154811061233257fe5b600091825260209091206005909102015463ffffffff1614156123c2576298967f63ffffffff166007828154811061236657fe5b600091825260209091206004600590920201015463ffffffff16146123c2576007818154811061239257fe5b60009182526020909120600590910201600401805463ffffffff19811663ffffffff918216600019019091161790555b600101612314565b50600554600160a01b900460ff16156125035760005b600754811015612501578863ffffffff16600782815481106123fe57fe5b600091825260209091206005909102015463ffffffff1614156124f9576000612435600654611af4606460078681548110611ad457fe5b9050612468816007848154811061244857fe5b90600052602060002090600502016001015461463b90919063ffffffff16565b6007838154811061247557fe5b9060005260206000209060050201600101819055506124a2600654611af4606460078681548110611b6d57fe5b90506124d581600784815481106124b557fe5b90600052602060002090600502016002015461463b90919063ffffffff16565b600783815481106124e257fe5b906000526020600020906005020160020181905550505b6001016123e0565b505b505050949350505050565b6005546000906001600160a01b031633148061253457506000546001600160a01b031633145b61256f5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b600061257a85612afc565b9050806125ce576040805162461bcd60e51b815260206004820152601f60248201527f707269636520666f72204e46542070726f66696c65206e6f7420666f756e6400604482015290519081900360640190fd5b6125d783612dfd565b612622576040805162461bcd60e51b81526020600482015260176024820152761d1bdad95b881a59081a5cc81a5cc81bd8d8dd5c1a5959604a1b604482015290519081900360640190fd5b6001546001600160a01b031663d3fc9864858561263e89613214565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126a8578181015183820152602001612690565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156126f657600080fd5b505af1925050508015612707575060015b612746576040805162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015290519081900360640190fd5b6008805460010190556040805163ffffffff87168152602081018590526001600160a01b038616818301526060810183905290517f07758c1736fe471cbbfb2decfd56015182a376e8753b390846fa0c3a23036b349181900360800190a150909392505050565b6060806060806007805490506040519080825280602002602001820160405280156127e2578160200160208202803883390190505b5090506060600780549050604051908082528060200260200182016040528015612816578160200160208202803883390190505b509050606060078054905060405190808252806020026020018201604052801561284a578160200160208202803883390190505b50905060005b60075481101561291e576007818154811061286757fe5b6000918252602090912060059091020154845163ffffffff9091169085908390811061288f57fe5b602002602001019063ffffffff16908163ffffffff1681525050600781815481106128b657fe5b9060005260206000209060050201600101548382815181106128d457fe5b602002602001018181525050600781815481106128ed57fe5b90600052602060002090600502016002015482828151811061290b57fe5b6020908102919091010152600101612850565b5091945092509050909192565b6005546001600160a01b031633148061294e57506000546001600160a01b031633145b6129895760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b6129916148d3565b6040518060a001604052808863ffffffff16815260200187815260200186815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505063ffffffff85811660209384015260078054600181018255925283517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6886005909302928301805463ffffffff191691909216178155838301517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68983015560408401517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a8301556060840151805194955085949193612acf937fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b019291019061490e565b50608091909101516004909101805463ffffffff191663ffffffff90921691909117905550505050505050565b6000805b600754811015610ebb578263ffffffff1660078281548110612b1e57fe5b600091825260209091206005909102015463ffffffff161415612b625760078181548110612b4857fe5b906000526020600020906005020160010154915050610ec1565b600101612b00565b6000805460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314612be25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50600480546001600160a01b03199081166001600160a01b039485161791829055600280549290941691161790915590565b4790565b6005546001600160a01b0316331480612c3b57506000546001600160a01b031633145b612c765760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b600754811015611186578263ffffffff1660078281548110612c9757fe5b600091825260209091206005909102015463ffffffff161415612cdd578160078281548110612cc257fe5b90600052602060002090600502016001018190555050611d2f565b600101612c79565b6040518060400160405280600681526020016518189c18181960d11b81525081565b60078181548110612d1457fe5b60009182526020918290206005919091020180546001808301546002808501546003860180546040805161010097831615979097026000190190911693909304601f810189900489028601890190935282855263ffffffff9095169750919591949391830182828015612dc85780601f10612d9d57610100808354040283529160200191612dc8565b820191906000526020600020905b815481529060010190602001808311612dab57829003601f168201915b5050506004909301549192505063ffffffff1685565b6000546001600160a01b031681565b600554600160a01b900460ff1690565b6001546040805163c87b56dd60e01b81526004810184905290516000926001600160a01b03169163c87b56dd9160248083019286929190829003018186803b158015612e4857600080fd5b505afa925050508015612f2c57506040513d6000823e601f3d908101601f191682016040526020811015612e7b57600080fd5b8101908080516040519392919084600160201b821115612e9a57600080fd5b908301906020820185811115612eaf57600080fd5b8251600160201b811182820188101715612ec857600080fd5b82525081516020918201929091019080838360005b83811015612ef5578181015183820152602001612edd565b50505050905090810190601f168015612f225780820380516001836020036101000a031916815260200191505b5060405250505060015b612f3857506001610ec1565b5060009050610ec1565b6000805b600754811015612fb9578263ffffffff1660078281548110612f6457fe5b600091825260209091206005909102015463ffffffff161415612fb15760078181548110612f8e57fe5b600091825260209091206004600590920201015463ffffffff169150610ec19050565b600101612f46565b506298967f92915050565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561300f57600080fd5b505afa158015613023573d6000803e3d6000fd5b505050506040513d602081101561303957600080fd5b5051905090565b60065490565b6005546001600160a01b031633148061306957506000546001600160a01b031633145b6130a45760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b63ffffffff16600855565b6005546001600160a01b03163314806130d257506000546001600160a01b031633145b61310d5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b8560078863ffffffff168154811061312157fe5b60009182526020909120600590910201805463ffffffff191663ffffffff9283161790556007805487928a1690811061315657fe5b9060005260206000209060050201600101819055508360078863ffffffff168154811061317f57fe5b906000526020600020906005020160020181905550828260078963ffffffff16815481106131a957fe5b906000526020600020906005020160030191906131c7929190614855565b508060078863ffffffff16815481106131dc57fe5b906000526020600020906005020160040160006101000a81548163ffffffff021916908363ffffffff16021790555050505050505050565b606060005b60075481101561330c578263ffffffff166007828154811061323757fe5b600091825260209091206005909102015463ffffffff161415613304576007818154811061326157fe5b6000918252602091829020600360059092020101805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156132f75780601f106132cc576101008083540402835291602001916132f7565b820191906000526020600020905b8154815290600101906020018083116132da57829003601f168201915b5050505050915050610ec1565b600101613219565b5050604080516020810190915260008152919050565b6000805460408051808201909152600681526530313830303160d01b6020820152906001600160a01b0316331461339a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50600380546001600160a01b03199081166001600160a01b039485161791829055600180549290941691161790915590565b604080516020810182526000808252600154835163c87b56dd60e01b815260048101869052935191936001600160a01b039091169163c87b56dd916024808201928792909190829003018186803b15801561342657600080fd5b505afa92505050801561350a57506040513d6000823e601f3d908101601f19168201604052602081101561345957600080fd5b8101908080516040519392919084600160201b82111561347857600080fd5b90830190602082018581111561348d57600080fd5b8251600160201b8111828201881017156134a657600080fd5b82525081516020918201929091019080838360005b838110156134d35781810151838201526020016134bb565b50505050905090810190601f1680156135005780820380516001836020036101000a031916815260200191505b5060405250505060015b61351a57506298967f9050610ec1565b506001546040805163c87b56dd60e01b81526004810186905290516001600160a01b039092169163c87b56dd91602480820192600092909190829003018186803b15801561356757600080fd5b505afa15801561357b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135a457600080fd5b8101908080516040519392919084600160201b8211156135c357600080fd5b9083019060208201858111156135d857600080fd5b8251600160201b8111828201881017156135f157600080fd5b82525081516020918201929091019080838360005b8381101561361e578181015183820152602001613606565b50505050905090810190601f16801561364b5780820380516001836020036101000a031916815260200191505b506040525050509050600061365f82613de3565b905063ffffffff81166298967f141561368057506298967f9150610ec19050565b61368981610e4d565b92505050610ec1565b604080516020810182526000808252600154835163c87b56dd60e01b815260048101869052935191936001600160a01b039091169163c87b56dd916024808201928792909190829003018186803b1580156136ec57600080fd5b505afa9250505080156137d057506040513d6000823e601f3d908101601f19168201604052602081101561371f57600080fd5b8101908080516040519392919084600160201b82111561373e57600080fd5b90830190602082018581111561375357600080fd5b8251600160201b81118282018810171561376c57600080fd5b82525081516020918201929091019080838360005b83811015613799578181015183820152602001613781565b50505050905090810190601f1680156137c65780820380516001836020036101000a031916815260200191505b5060405250505060015b6137e0576298967f915050610ec1565b506001546040805163c87b56dd60e01b81526004810186905290516001600160a01b039092169163c87b56dd91602480820192600092909190829003018186803b15801561382d57600080fd5b505afa158015613841573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561386a57600080fd5b8101908080516040519392919084600160201b82111561388957600080fd5b90830190602082018581111561389e57600080fd5b8251600160201b8111828201881017156138b757600080fd5b82525081516020918201929091019080838360005b838110156138e45781810151838201526020016138cc565b50505050905090810190601f1680156139115780820380516001836020036101000a031916815260200191505b50604052505050905061392381613de3565b915050610ec1565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146139a25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50348166038d7ea4c680000214613a00576040805162461bcd60e51b815260206004820152601e60248201527f706c656173652070726f766964652076616c756520696e2066696e6e65790000604482015290519081900360640190fd5b600054604080518381526001600160a01b03909216602083015280517feddca56e728ea017cd6a76222db5c5a1a3c95bc755678277f2ed597e027021a59281900390910190a150565b6005546000906001600160a01b0316331480613a6f57506000546001600160a01b031633145b613aaa5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b6000613ab583613692565b90506000613ac282610e4d565b60015460408051630852cd8d60e31b81526004810188905290519293506001600160a01b03909116916342966c689160248082019260009290919082900301818387803b158015613b1257600080fd5b505af1925050508015613b23575060015b613b66576040805162461bcd60e51b815260206004820152600f60248201526e13919508189d5c9b8819985a5b1959608a1b604482015290519081900360640190fd5b6040805185815263ffffffff8416602082015280820183905290517f8d8aa2b5868830a27eb7e88c61b8f505ea4e8b85b14f0d6600bfac724a9301459181900360600190a15050919050565b6005546001600160a01b0316331480613bd557506000546001600160a01b031633145b613c105760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b600754811015613ca2578363ffffffff1660078281548110613c3157fe5b600091825260209091206005909102015463ffffffff161415613c9a578260078281548110613c5c57fe5b9060005260206000209060050201600101819055508160078281548110613c7f57fe5b90600052602060002090600502016002018190555050611186565b600101613c13565b50505050565b60085490565b6005546001600160a01b0316331480613cd157506000546001600160a01b031633145b613d0c5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b60075463ffffffff82161015611d2f578163ffffffff1660078263ffffffff1681548110613d3957fe5b600091825260209091206005909102015463ffffffff161415613d6557613d5f816146ab565b50613d6d565b600101613d0f565b50565b6005546001600160a01b0316331480613d9357506000546001600160a01b031633145b613dce5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b6005805460ff60a01b1916600160a01b179055565b6000805b600754811015612fb957828051906020012060078281548110613e0657fe5b90600052602060002090600502016003016040518082805460018160011615610100020316600290048015613e725780601f10613e50576101008083540402835291820191613e72565b820191906000526020600020905b815481529060010190602001808311613e5e575b505091505060405180910390201415613eb25760078181548110613e9257fe5b600091825260209091206005909102015463ffffffff169150610ec19050565b600101613de7565b6004546001600160a01b031690565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314613f405760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b5060008111613f805760405162461bcd60e51b8152600401808060200182810382526028815260200180614ac96028913960400191505060405180910390fd5b60025460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b158015613fd157600080fd5b505afa158015613fe5573d6000803e3d6000fd5b505050506040513d6020811015613ffb57600080fd5b5051905081811015614054576040805162461bcd60e51b815260206004820152601960248201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604482015290519081900360640190fd5b600254604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b505050506040513d60208110156140d857600080fd5b5050600054604080518481526001600160a01b03909216602083015280517fbb18388c519fe4b4b577b17f416832c870492be5510cdb062b086c0a0025d7889281900390910190a15050565b6005546001600160a01b031633148061414757506000546001600160a01b031633145b6141825760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b600655565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146141fe5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b0382166142715760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146143665760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50804710156143b1576040805162461bcd60e51b8152602060048201526012602482015271756e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146143fc576040519150601f19603f3d011682016040523d82523d6000602084013e614401565b606091505b5050809150508061444c576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b604080518381526001600160a01b038516602082015281517f8c7cdad0d12a8db3e23561b42da6f10c8137914c97beff202213a410e1f520a3929181900390910190a1505050565b6005546001600160a01b031690565b3b63ffffffff16151590565b60008082116040518060400160405280600681526020016530303830303360d01b8152509061451f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b5081838161452957fe5b049392505050565b600082614540575060006145bd565b508181028183828161454e57fe5b04146040518060400160405280600681526020016530303830303160d01b815250906145bb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b505b92915050565b6000828211156040518060400160405280600681526020016518181c18181960d11b815250906146345760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b5050900390565b60408051808201909152600681526530303830303160d01b602082015282820190838210156145bb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b60075463ffffffff8216106146bf57613d6d565b6007546000190163ffffffff821614156147305760078054806146de57fe5b600082815260208120600560001990930192830201805463ffffffff1916815560018101829055600281018290559061471a600383018261497c565b50600401805463ffffffff191690559055613d6d565b63ffffffff81165b600754600019018110156147f9576007816001018154811061475657fe5b90600052602060002090600502016007828154811061477157fe5b600091825260209091208254600590920201805463ffffffff191663ffffffff9092169190911781556001808301548183015560028084015481840155600380850180546147d194928601939192811615610100026000190116046149c0565b506004918201549101805463ffffffff191663ffffffff909216919091179055600101614738565b50600780548061480557fe5b600082815260208120600560001990930192830201805463ffffffff19168155600181018290556002810182905590614841600383018261497c565b50600401805463ffffffff19169055905550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106148965782800160ff198235161785556148c3565b828001600101855582156148c3579182015b828111156148c35782358255916020019190600101906148a8565b506148cf929150614a35565b5090565b6040518060a00160405280600063ffffffff168152602001600081526020016000815260200160608152602001600063ffffffff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061494f57805160ff19168380011785556148c3565b828001600101855582156148c3579182015b828111156148c3578251825591602001919060010190614961565b50805460018160011615610100020316600290046000825580601f106149a25750613d6d565b601f016020900490600052602060002090810190613d6d9190614a35565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106149f957805485556148c3565b828001600101855582156148c357600052602060002091601f016020900482015b828111156148c3578254825591600101919060010190614a1a565b611d4091905b808211156148cf5760008155600101614a3b56fe6f6e6c79207072696365206d616e61676572206f72206f776e65722063616e2063616c6c20746869732066756e6374696f6e436865636b2074686520435954522062616c616e6365206f6e20796f75722077616c6c657465787465726e616c20636f6e74726163747320617265206e6f7420616c6c6f776564596f75206e65656420746f206465706f736974206174206c6561737420736f6d6520746f6b656e73596f75206e65656420746f207769746864726177206174206c6561737420736f6d6520746f6b656e73a26469706673582212205d2b32be9b840bdb01ee17c72260a6ff6dd2c8ef6097cb5573e4b9ea6e18bdee64736f6c63430006020033

Deployed Bytecode

0x6080604052600436106102725760003560e01c8063940a14551161014f578063c9ab22a7116100c1578063dd49756e1161007a578063dd49756e14610d63578063dec0fc5c14610d8d578063f2fde38b14610db7578063f3fe3bc314610dea578063f3fef3a314610dff578063f8a623d314610e3857610272565b8063c9ab22a714610c07578063caa0f92a14610c43578063cbfcaed514610c58578063cf5b281614610c88578063d3c5f13714610c9d578063d41c3a6514610d4e57610272565b8063a77cefc411610113578063a77cefc414610b09578063a7ccabdf14610b39578063a8f621ea14610b6c578063b6749d9414610b96578063b6b55f2514610bc0578063badb97ff14610bdd57610272565b8063940a1455146109c357806394d212e614610a0c5780639609f6c714610a215780639cf1ba2e14610a36578063a5419ba214610a6657610272565b80635230bcdf116101e857806377476c7b116101ac57806377476c7b146107d9578063860d248a1461080f5780638cec7946146108995780638da5cb5b1461096f5780638da7df22146109845780638ea7f0331461099957610272565b80635230bcdf146105c05780635d7dc9da146106b35780635d82c4621461074d5780636a326ab11461077d5780636f9fb98a146107c457610272565b806319e1f4861161023a57806319e1f4861461048a5780631ba9bdac146104b457806329598630146104c95780632b1f4ad6146104ff5780634488c99c1461053057806345f403621461057b57610272565b806302d1003b1461027757806306b091f9146102b95780630ea638a3146102f4578063156b1d37146103bd57806318fdec7e14610457575b600080fd5b34801561028357600080fd5b506102a76004803603602081101561029a57600080fd5b503563ffffffff16610e4d565b60408051918252519081900360200190f35b3480156102c557600080fd5b506102f2600480360360408110156102dc57600080fd5b506001600160a01b038135169060200135610ec6565b005b34801561030057600080fd5b506103246004803603602081101561031757600080fd5b503563ffffffff1661118b565b60405180858152602001848152602001806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561037f578181015183820152602001610367565b50505050905090810190601f1680156103ac5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b3480156103c957600080fd5b506102f2600480360360a08110156103e057600080fd5b63ffffffff8235169160208101359160408201359190810190608081016060820135600160201b81111561041357600080fd5b82018360208201111561042557600080fd5b803590602001918460018302840111600160201b8311171561044657600080fd5b91935091503563ffffffff1661131b565b34801561046357600080fd5b506102f26004803603602081101561047a57600080fd5b50356001600160a01b0316611480565b34801561049657600080fd5b506102a7600480360360208110156104ad57600080fd5b503561151a565b3480156104c057600080fd5b506102f2611bf5565b3480156104d557600080fd5b506102f2600480360360408110156104ec57600080fd5b5063ffffffff8135169060200135611c62565b34801561050b57600080fd5b50610514611d33565b604080516001600160a01b039092168252519081900360200190f35b34801561053c57600080fd5b506102a76004803603608081101561055357600080fd5b5063ffffffff813516906020810135906001600160a01b036040820135169060600135611d43565b34801561058757600080fd5b506102a76004803603606081101561059e57600080fd5b5063ffffffff813516906001600160a01b03602082013516906040013561250e565b3480156105cc57600080fd5b506105d56127ad565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561061d578181015183820152602001610605565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561065c578181015183820152602001610644565b50505050905001848103825285818151815260200191508051906020019060200280838360005b8381101561069b578181015183820152602001610683565b50505050905001965050505050505060405180910390f35b3480156106bf57600080fd5b506102f2600480360360a08110156106d657600080fd5b63ffffffff8235169160208101359160408201359190810190608081016060820135600160201b81111561070957600080fd5b82018360208201111561071b57600080fd5b803590602001918460018302840111600160201b8311171561073c57600080fd5b91935091503563ffffffff1661292b565b34801561075957600080fd5b506102a76004803603602081101561077057600080fd5b503563ffffffff16612afc565b34801561078957600080fd5b506107b0600480360360208110156107a057600080fd5b50356001600160a01b0316612b6a565b604080519115158252519081900360200190f35b3480156107d057600080fd5b506102a7612c14565b3480156107e557600080fd5b506102f2600480360360408110156107fc57600080fd5b5063ffffffff8135169060200135612c18565b34801561081b57600080fd5b50610824612ce5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561085e578181015183820152602001610846565b50505050905090810190601f16801561088b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a557600080fd5b506108c3600480360360208110156108bc57600080fd5b5035612d07565b604051808663ffffffff1663ffffffff168152602001858152602001848152602001806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015610930578181015183820152602001610918565b50505050905090810190601f16801561095d5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b34801561097b57600080fd5b50610514612dde565b34801561099057600080fd5b506107b0612ded565b3480156109a557600080fd5b506107b0600480360360208110156109bc57600080fd5b5035612dfd565b3480156109cf57600080fd5b506109f3600480360360208110156109e657600080fd5b503563ffffffff16612f42565b6040805163ffffffff9092168252519081900360200190f35b348015610a1857600080fd5b506102a7612fc4565b348015610a2d57600080fd5b506102a7613040565b348015610a4257600080fd5b506102f260048036036020811015610a5957600080fd5b503563ffffffff16613046565b348015610a7257600080fd5b506102f2600480360360c0811015610a8957600080fd5b63ffffffff823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610ac557600080fd5b820183602082011115610ad757600080fd5b803590602001918460018302840111600160201b83111715610af857600080fd5b91935091503563ffffffff166130af565b348015610b1557600080fd5b5061082460048036036020811015610b2c57600080fd5b503563ffffffff16613214565b348015610b4557600080fd5b506107b060048036036020811015610b5c57600080fd5b50356001600160a01b0316613322565b348015610b7857600080fd5b506102a760048036036020811015610b8f57600080fd5b50356133cc565b348015610ba257600080fd5b506109f360048036036020811015610bb957600080fd5b5035613692565b6102f260048036036020811015610bd657600080fd5b503561392b565b348015610be957600080fd5b506102a760048036036020811015610c0057600080fd5b5035613a49565b348015610c1357600080fd5b506102f260048036036060811015610c2a57600080fd5b5063ffffffff8135169060208101359060400135613bb2565b348015610c4f57600080fd5b506102a7613ca8565b348015610c6457600080fd5b506102f260048036036020811015610c7b57600080fd5b503563ffffffff16613cae565b348015610c9457600080fd5b506102f2613d70565b348015610ca957600080fd5b506109f360048036036020811015610cc057600080fd5b810190602081018135600160201b811115610cda57600080fd5b820183602082011115610cec57600080fd5b803590602001918460018302840111600160201b83111715610d0d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613de3945050505050565b348015610d5a57600080fd5b50610514613eba565b348015610d6f57600080fd5b506102f260048036036020811015610d8657600080fd5b5035613ec9565b348015610d9957600080fd5b506102f260048036036020811015610db057600080fd5b5035614124565b348015610dc357600080fd5b506102f260048036036020811015610dda57600080fd5b50356001600160a01b0316614187565b348015610df657600080fd5b506108246142cd565b348015610e0b57600080fd5b506102f260048036036040811015610e2257600080fd5b506001600160a01b0381351690602001356142ef565b348015610e4457600080fd5b50610514614494565b6000805b600754811015610ebb578263ffffffff1660078281548110610e6f57fe5b600091825260209091206005909102015463ffffffff161415610eb35760078181548110610e9957fe5b906000526020600020906005020160020154915050610ec1565b600101610e51565b50600090505b919050565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610f7a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610f3f578181015183820152602001610f27565b50505050905090810190601f168015610f6c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008111610fba5760405162461bcd60e51b8152600401808060200182810382526029815260200180614af16029913960400191505060405180910390fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d602081101561102f57600080fd5b5051905081811161107c576040805162461bcd60e51b8152602060048201526012602482015271756e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b6002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156110d257600080fd5b505af19250505080156110f757506040513d60208110156110f257600080fd5b505160015b611141576040805162461bcd60e51b81526020600482015260166024820152751d1bdad95b9cc81d1c985b9cd9995c8819985a5b195960521b604482015290519081900360640190fd5b50604080518381526001600160a01b038516602082015281517f0ddddc48b57dd67f8fa2ff05c78034b578c31ef5caa05b03d2ca16feadbbb98f929181900390910190a15b505050565b600080606081805b6007548110156112f6578563ffffffff16600782815481106111b157fe5b600091825260209091206005909102015463ffffffff1614156112ee57600781815481106111db57fe5b906000526020600020906005020160010154600782815481106111fa57fe5b9060005260206000209060050201600201546007838154811061121957fe5b90600052602060002090600502016003016007848154811061123757fe5b600091825260209182902060046005909202010154825460408051601f6002600019600186161561010002019094169390930492830185900485028101850190915281815263ffffffff909216928491908301828280156112d95780601f106112ae576101008083540402835291602001916112d9565b820191906000526020600020905b8154815290600101906020018083116112bc57829003601f168201915b50505050509150945094509450945050611314565b600101611193565b505060408051602081019091526000808252935083925090506298967f5b9193509193565b6005546001600160a01b031633148061133e57506000546001600160a01b031633145b6113795760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b600754811015611476578663ffffffff166007828154811061139a57fe5b600091825260209091206005909102015463ffffffff16141561146e5785600782815481106113c557fe5b90600052602060002090600502016001018190555084600782815481106113e857fe5b90600052602060002090600502016002018190555083836007838154811061140c57fe5b9060005260206000209060050201600301919061142a929190614855565b50816007828154811061143957fe5b906000526020600020906005020160040160006101000a81548163ffffffff021916908363ffffffff16021790555050611478565b60010161137c565b505b505050505050565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146114f75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611525336144a3565b156115615760405162461bcd60e51b8152600401808060200182810382526022815260200180614aa76022913960400191505060405180910390fd5b600154604080516331a9108f60e11b815260048101859052905133926001600160a01b031691636352211e916024808301926020929190829003018186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b50516001600160a01b031614611628576040805162461bcd60e51b81526020600482015260126024820152711a5d081a5cc81b9bdd081e5bdd5c8813919560721b604482015290519081900360640190fd5b600061163383613692565b905063ffffffff81166298967f1415611693576040805162461bcd60e51b815260206004820152601860248201527f4e46542070726f66696c65204944206e6f7420666f756e640000000000000000604482015290519081900360640190fd5b600061169e82610e4d565b9050806116e8576040805162461bcd60e51b8152602060048201526013602482015272139195081c1c9a58d9481b9bdd08199bdd5b99606a1b604482015290519081900360640190fd5b600254604080516370a0823160e01b8152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561173257600080fd5b505afa158015611746573d6000803e3d6000fd5b505050506040513d602081101561175c57600080fd5b5051116117b0576040805162461bcd60e51b815260206004820152601d60248201527f756e73756666696369656e742043595452206f6e20636f6e7472616374000000604482015290519081900360640190fd5b60015460408051630852cd8d60e31b81526004810187905290516001600160a01b03909216916342966c689160248082019260009290919082900301818387803b1580156117fd57600080fd5b505af192505050801561180e575060015b611851576040805162461bcd60e51b815260206004820152600f60248201526e13919508189d5c9b8819985a5b1959608a1b604482015290519081900360640190fd5b6040805163ffffffff84168152602081018690523381830152606081018390526080810183905290517fd47f6b8f75f609a4e4c8a2ac7d7b832f838a4d7cd0bd16e09cbdb1c75589f1839181900360a00190a16002546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156118f857600080fd5b505af192505050801561191d57506040513d602081101561191857600080fd5b505160015b611965576040805162461bcd60e51b815260206004820152601460248201527310d65514881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b506040805163ffffffff841681523360208201528082018390526060810183905290517fa7ee43596e81c2ca49d6a37948abf0c3c23d30645ae08996783fb304b0de07469181900360800190a160005b600754811015611a69578263ffffffff16600782815481106119d357fe5b600091825260209091206005909102015463ffffffff161415611a61576298967f63ffffffff1660078281548110611a0757fe5b600091825260209091206004600590920201015463ffffffff1614611a615760078181548110611a3357fe5b60009182526020909120600460059092020101805463ffffffff8082166001011663ffffffff199091161790555b6001016119b5565b50600554600160a01b900460ff1615611bee5760005b600754811015611bec578263ffffffff1660078281548110611a9d57fe5b600091825260209091206005909102015463ffffffff161415611be4576000611b00600654611af4606460078681548110611ad457fe5b9060005260206000209060050201600101546144af90919063ffffffff16565b9063ffffffff61453116565b9050611b338160078481548110611b1357fe5b9060005260206000209060050201600101546145c390919063ffffffff16565b60078381548110611b4057fe5b906000526020600020906005020160010181905550611b8d600654611af4606460078681548110611b6d57fe5b9060005260206000209060050201600201546144af90919063ffffffff16565b9050611bc08160078481548110611ba057fe5b9060005260206000209060050201600201546145c390919063ffffffff16565b60078381548110611bcd57fe5b906000526020600020906005020160020181905550505b600101611a7f565b505b5050919050565b6005546001600160a01b0316331480611c1857506000546001600160a01b031633145b611c535760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b6005805460ff60a01b19169055565b6005546001600160a01b0316331480611c8557506000546001600160a01b031633145b611cc05760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b600754811015611186578263ffffffff1660078281548110611ce157fe5b600091825260209091206005909102015463ffffffff161415611d27578160078281548110611d0c57fe5b90600052602060002090600502016002018190555050611d2f565b600101611cc3565b5050565b6003546001600160a01b03165b90565b6000611d4e336144a3565b15611d8a5760405162461bcd60e51b8152600401808060200182810382526022815260200180614aa76022913960400191505060405180910390fd5b6000611d9586612f42565b63ffffffff1611611ddd576040805162461bcd60e51b815260206004820152600d60248201526c3634b6b4ba1034b99037bb32b960991b604482015290519081900360640190fd5b6000611de886612afc565b905080611e3c576040805162461bcd60e51b815260206004820152601f60248201527f707269636520666f72204e46542070726f66696c65206e6f7420666f756e6400604482015290519081900360640190fd5b60008511611e91576040805162461bcd60e51b815260206004820152601d60248201527f596f75206e65656420746f2070726f7669646520736f6d652043595452000000604482015290519081900360640190fd5b808514611e9d57600080fd5b600254604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611ee857600080fd5b505afa158015611efc573d6000803e3d6000fd5b505050506040513d6020811015611f1257600080fd5b5051905085811015611f555760405162461bcd60e51b8152600401808060200182810382526025815260200180614a826025913960400191505060405180910390fd5b60025460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b158015611fa657600080fd5b505afa158015611fba573d6000803e3d6000fd5b505050506040513d6020811015611fd057600080fd5b5051905086811015612029576040805162461bcd60e51b815260206004820152601860248201527f436865636b20746865204359545220616c6c6f77616e63650000000000000000604482015290519081900360640190fd5b61203285612dfd565b61207d576040805162461bcd60e51b81526020600482015260176024820152761d1bdad95b881a59081a5cc81a5cc81bd8d8dd5c1a5959604a1b604482015290519081900360640190fd5b600254604080516323b872dd60e01b8152336004820152306024820152604481018a905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156120d757600080fd5b505af19250505080156120fc57506040513d60208110156120f757600080fd5b505160015b612144576040805162461bcd60e51b815260206004820152601460248201527310d65514881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b506040805163ffffffff8a1681523360208201528082018990526060810185905290517f5eb741512cc8246129aa667a37f08969a61a32e86fe056469e4f2aa361959ef19181900360800190a16001546001600160a01b031663d3fc986487876121ad8c613214565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156122175781810151838201526020016121ff565b50505050905090810190601f1680156122445780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561226557600080fd5b505af1925050508015612276575060015b6122b5576040805162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015290519081900360640190fd5b6008805460010190556040805163ffffffff8a168152602081018790523381830152606081018990526080810185905290517feb4a64188fd5e16f806e9767e459d5307b5cbe10288b34c01d2a7cddb1afe5689181900360a00190a160005b6007548110156123ca578863ffffffff166007828154811061233257fe5b600091825260209091206005909102015463ffffffff1614156123c2576298967f63ffffffff166007828154811061236657fe5b600091825260209091206004600590920201015463ffffffff16146123c2576007818154811061239257fe5b60009182526020909120600590910201600401805463ffffffff19811663ffffffff918216600019019091161790555b600101612314565b50600554600160a01b900460ff16156125035760005b600754811015612501578863ffffffff16600782815481106123fe57fe5b600091825260209091206005909102015463ffffffff1614156124f9576000612435600654611af4606460078681548110611ad457fe5b9050612468816007848154811061244857fe5b90600052602060002090600502016001015461463b90919063ffffffff16565b6007838154811061247557fe5b9060005260206000209060050201600101819055506124a2600654611af4606460078681548110611b6d57fe5b90506124d581600784815481106124b557fe5b90600052602060002090600502016002015461463b90919063ffffffff16565b600783815481106124e257fe5b906000526020600020906005020160020181905550505b6001016123e0565b505b505050949350505050565b6005546000906001600160a01b031633148061253457506000546001600160a01b031633145b61256f5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b600061257a85612afc565b9050806125ce576040805162461bcd60e51b815260206004820152601f60248201527f707269636520666f72204e46542070726f66696c65206e6f7420666f756e6400604482015290519081900360640190fd5b6125d783612dfd565b612622576040805162461bcd60e51b81526020600482015260176024820152761d1bdad95b881a59081a5cc81a5cc81bd8d8dd5c1a5959604a1b604482015290519081900360640190fd5b6001546001600160a01b031663d3fc9864858561263e89613214565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126a8578181015183820152602001612690565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156126f657600080fd5b505af1925050508015612707575060015b612746576040805162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015290519081900360640190fd5b6008805460010190556040805163ffffffff87168152602081018590526001600160a01b038616818301526060810183905290517f07758c1736fe471cbbfb2decfd56015182a376e8753b390846fa0c3a23036b349181900360800190a150909392505050565b6060806060806007805490506040519080825280602002602001820160405280156127e2578160200160208202803883390190505b5090506060600780549050604051908082528060200260200182016040528015612816578160200160208202803883390190505b509050606060078054905060405190808252806020026020018201604052801561284a578160200160208202803883390190505b50905060005b60075481101561291e576007818154811061286757fe5b6000918252602090912060059091020154845163ffffffff9091169085908390811061288f57fe5b602002602001019063ffffffff16908163ffffffff1681525050600781815481106128b657fe5b9060005260206000209060050201600101548382815181106128d457fe5b602002602001018181525050600781815481106128ed57fe5b90600052602060002090600502016002015482828151811061290b57fe5b6020908102919091010152600101612850565b5091945092509050909192565b6005546001600160a01b031633148061294e57506000546001600160a01b031633145b6129895760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b6129916148d3565b6040518060a001604052808863ffffffff16815260200187815260200186815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505063ffffffff85811660209384015260078054600181018255925283517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6886005909302928301805463ffffffff191691909216178155838301517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68983015560408401517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a8301556060840151805194955085949193612acf937fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b019291019061490e565b50608091909101516004909101805463ffffffff191663ffffffff90921691909117905550505050505050565b6000805b600754811015610ebb578263ffffffff1660078281548110612b1e57fe5b600091825260209091206005909102015463ffffffff161415612b625760078181548110612b4857fe5b906000526020600020906005020160010154915050610ec1565b600101612b00565b6000805460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314612be25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50600480546001600160a01b03199081166001600160a01b039485161791829055600280549290941691161790915590565b4790565b6005546001600160a01b0316331480612c3b57506000546001600160a01b031633145b612c765760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b600754811015611186578263ffffffff1660078281548110612c9757fe5b600091825260209091206005909102015463ffffffff161415612cdd578160078281548110612cc257fe5b90600052602060002090600502016001018190555050611d2f565b600101612c79565b6040518060400160405280600681526020016518189c18181960d11b81525081565b60078181548110612d1457fe5b60009182526020918290206005919091020180546001808301546002808501546003860180546040805161010097831615979097026000190190911693909304601f810189900489028601890190935282855263ffffffff9095169750919591949391830182828015612dc85780601f10612d9d57610100808354040283529160200191612dc8565b820191906000526020600020905b815481529060010190602001808311612dab57829003601f168201915b5050506004909301549192505063ffffffff1685565b6000546001600160a01b031681565b600554600160a01b900460ff1690565b6001546040805163c87b56dd60e01b81526004810184905290516000926001600160a01b03169163c87b56dd9160248083019286929190829003018186803b158015612e4857600080fd5b505afa925050508015612f2c57506040513d6000823e601f3d908101601f191682016040526020811015612e7b57600080fd5b8101908080516040519392919084600160201b821115612e9a57600080fd5b908301906020820185811115612eaf57600080fd5b8251600160201b811182820188101715612ec857600080fd5b82525081516020918201929091019080838360005b83811015612ef5578181015183820152602001612edd565b50505050905090810190601f168015612f225780820380516001836020036101000a031916815260200191505b5060405250505060015b612f3857506001610ec1565b5060009050610ec1565b6000805b600754811015612fb9578263ffffffff1660078281548110612f6457fe5b600091825260209091206005909102015463ffffffff161415612fb15760078181548110612f8e57fe5b600091825260209091206004600590920201015463ffffffff169150610ec19050565b600101612f46565b506298967f92915050565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561300f57600080fd5b505afa158015613023573d6000803e3d6000fd5b505050506040513d602081101561303957600080fd5b5051905090565b60065490565b6005546001600160a01b031633148061306957506000546001600160a01b031633145b6130a45760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b63ffffffff16600855565b6005546001600160a01b03163314806130d257506000546001600160a01b031633145b61310d5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b8560078863ffffffff168154811061312157fe5b60009182526020909120600590910201805463ffffffff191663ffffffff9283161790556007805487928a1690811061315657fe5b9060005260206000209060050201600101819055508360078863ffffffff168154811061317f57fe5b906000526020600020906005020160020181905550828260078963ffffffff16815481106131a957fe5b906000526020600020906005020160030191906131c7929190614855565b508060078863ffffffff16815481106131dc57fe5b906000526020600020906005020160040160006101000a81548163ffffffff021916908363ffffffff16021790555050505050505050565b606060005b60075481101561330c578263ffffffff166007828154811061323757fe5b600091825260209091206005909102015463ffffffff161415613304576007818154811061326157fe5b6000918252602091829020600360059092020101805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156132f75780601f106132cc576101008083540402835291602001916132f7565b820191906000526020600020905b8154815290600101906020018083116132da57829003601f168201915b5050505050915050610ec1565b600101613219565b5050604080516020810190915260008152919050565b6000805460408051808201909152600681526530313830303160d01b6020820152906001600160a01b0316331461339a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50600380546001600160a01b03199081166001600160a01b039485161791829055600180549290941691161790915590565b604080516020810182526000808252600154835163c87b56dd60e01b815260048101869052935191936001600160a01b039091169163c87b56dd916024808201928792909190829003018186803b15801561342657600080fd5b505afa92505050801561350a57506040513d6000823e601f3d908101601f19168201604052602081101561345957600080fd5b8101908080516040519392919084600160201b82111561347857600080fd5b90830190602082018581111561348d57600080fd5b8251600160201b8111828201881017156134a657600080fd5b82525081516020918201929091019080838360005b838110156134d35781810151838201526020016134bb565b50505050905090810190601f1680156135005780820380516001836020036101000a031916815260200191505b5060405250505060015b61351a57506298967f9050610ec1565b506001546040805163c87b56dd60e01b81526004810186905290516001600160a01b039092169163c87b56dd91602480820192600092909190829003018186803b15801561356757600080fd5b505afa15801561357b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135a457600080fd5b8101908080516040519392919084600160201b8211156135c357600080fd5b9083019060208201858111156135d857600080fd5b8251600160201b8111828201881017156135f157600080fd5b82525081516020918201929091019080838360005b8381101561361e578181015183820152602001613606565b50505050905090810190601f16801561364b5780820380516001836020036101000a031916815260200191505b506040525050509050600061365f82613de3565b905063ffffffff81166298967f141561368057506298967f9150610ec19050565b61368981610e4d565b92505050610ec1565b604080516020810182526000808252600154835163c87b56dd60e01b815260048101869052935191936001600160a01b039091169163c87b56dd916024808201928792909190829003018186803b1580156136ec57600080fd5b505afa9250505080156137d057506040513d6000823e601f3d908101601f19168201604052602081101561371f57600080fd5b8101908080516040519392919084600160201b82111561373e57600080fd5b90830190602082018581111561375357600080fd5b8251600160201b81118282018810171561376c57600080fd5b82525081516020918201929091019080838360005b83811015613799578181015183820152602001613781565b50505050905090810190601f1680156137c65780820380516001836020036101000a031916815260200191505b5060405250505060015b6137e0576298967f915050610ec1565b506001546040805163c87b56dd60e01b81526004810186905290516001600160a01b039092169163c87b56dd91602480820192600092909190829003018186803b15801561382d57600080fd5b505afa158015613841573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561386a57600080fd5b8101908080516040519392919084600160201b82111561388957600080fd5b90830190602082018581111561389e57600080fd5b8251600160201b8111828201881017156138b757600080fd5b82525081516020918201929091019080838360005b838110156138e45781810151838201526020016138cc565b50505050905090810190601f1680156139115780820380516001836020036101000a031916815260200191505b50604052505050905061392381613de3565b915050610ec1565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146139a25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50348166038d7ea4c680000214613a00576040805162461bcd60e51b815260206004820152601e60248201527f706c656173652070726f766964652076616c756520696e2066696e6e65790000604482015290519081900360640190fd5b600054604080518381526001600160a01b03909216602083015280517feddca56e728ea017cd6a76222db5c5a1a3c95bc755678277f2ed597e027021a59281900390910190a150565b6005546000906001600160a01b0316331480613a6f57506000546001600160a01b031633145b613aaa5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b6000613ab583613692565b90506000613ac282610e4d565b60015460408051630852cd8d60e31b81526004810188905290519293506001600160a01b03909116916342966c689160248082019260009290919082900301818387803b158015613b1257600080fd5b505af1925050508015613b23575060015b613b66576040805162461bcd60e51b815260206004820152600f60248201526e13919508189d5c9b8819985a5b1959608a1b604482015290519081900360640190fd5b6040805185815263ffffffff8416602082015280820183905290517f8d8aa2b5868830a27eb7e88c61b8f505ea4e8b85b14f0d6600bfac724a9301459181900360600190a15050919050565b6005546001600160a01b0316331480613bd557506000546001600160a01b031633145b613c105760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b600754811015613ca2578363ffffffff1660078281548110613c3157fe5b600091825260209091206005909102015463ffffffff161415613c9a578260078281548110613c5c57fe5b9060005260206000209060050201600101819055508160078281548110613c7f57fe5b90600052602060002090600502016002018190555050611186565b600101613c13565b50505050565b60085490565b6005546001600160a01b0316331480613cd157506000546001600160a01b031633145b613d0c5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b60005b60075463ffffffff82161015611d2f578163ffffffff1660078263ffffffff1681548110613d3957fe5b600091825260209091206005909102015463ffffffff161415613d6557613d5f816146ab565b50613d6d565b600101613d0f565b50565b6005546001600160a01b0316331480613d9357506000546001600160a01b031633145b613dce5760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b6005805460ff60a01b1916600160a01b179055565b6000805b600754811015612fb957828051906020012060078281548110613e0657fe5b90600052602060002090600502016003016040518082805460018160011615610100020316600290048015613e725780601f10613e50576101008083540402835291820191613e72565b820191906000526020600020905b815481529060010190602001808311613e5e575b505091505060405180910390201415613eb25760078181548110613e9257fe5b600091825260209091206005909102015463ffffffff169150610ec19050565b600101613de7565b6004546001600160a01b031690565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314613f405760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b5060008111613f805760405162461bcd60e51b8152600401808060200182810382526028815260200180614ac96028913960400191505060405180910390fd5b60025460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b158015613fd157600080fd5b505afa158015613fe5573d6000803e3d6000fd5b505050506040513d6020811015613ffb57600080fd5b5051905081811015614054576040805162461bcd60e51b815260206004820152601960248201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604482015290519081900360640190fd5b600254604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b505050506040513d60208110156140d857600080fd5b5050600054604080518481526001600160a01b03909216602083015280517fbb18388c519fe4b4b577b17f416832c870492be5510cdb062b086c0a0025d7889281900390910190a15050565b6005546001600160a01b031633148061414757506000546001600160a01b031633145b6141825760405162461bcd60e51b8152600401808060200182810382526032815260200180614a506032913960400191505060405180910390fd5b600655565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146141fe5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b0382166142715760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b60005460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146143665760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b50804710156143b1576040805162461bcd60e51b8152602060048201526012602482015271756e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146143fc576040519150601f19603f3d011682016040523d82523d6000602084013e614401565b606091505b5050809150508061444c576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b604080518381526001600160a01b038516602082015281517f8c7cdad0d12a8db3e23561b42da6f10c8137914c97beff202213a410e1f520a3929181900390910190a1505050565b6005546001600160a01b031690565b3b63ffffffff16151590565b60008082116040518060400160405280600681526020016530303830303360d01b8152509061451f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b5081838161452957fe5b049392505050565b600082614540575060006145bd565b508181028183828161454e57fe5b04146040518060400160405280600681526020016530303830303160d01b815250906145bb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b505b92915050565b6000828211156040518060400160405280600681526020016518181c18181960d11b815250906146345760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b5050900390565b60408051808201909152600681526530303830303160d01b602082015282820190838210156145bb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f3f578181015183820152602001610f27565b60075463ffffffff8216106146bf57613d6d565b6007546000190163ffffffff821614156147305760078054806146de57fe5b600082815260208120600560001990930192830201805463ffffffff1916815560018101829055600281018290559061471a600383018261497c565b50600401805463ffffffff191690559055613d6d565b63ffffffff81165b600754600019018110156147f9576007816001018154811061475657fe5b90600052602060002090600502016007828154811061477157fe5b600091825260209091208254600590920201805463ffffffff191663ffffffff9092169190911781556001808301548183015560028084015481840155600380850180546147d194928601939192811615610100026000190116046149c0565b506004918201549101805463ffffffff191663ffffffff909216919091179055600101614738565b50600780548061480557fe5b600082815260208120600560001990930192830201805463ffffffff19168155600181018290556002810182905590614841600383018261497c565b50600401805463ffffffff19169055905550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106148965782800160ff198235161785556148c3565b828001600101855582156148c3579182015b828111156148c35782358255916020019190600101906148a8565b506148cf929150614a35565b5090565b6040518060a00160405280600063ffffffff168152602001600081526020016000815260200160608152602001600063ffffffff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061494f57805160ff19168380011785556148c3565b828001600101855582156148c3579182015b828111156148c3578251825591602001919060010190614961565b50805460018160011615610100020316600290046000825580601f106149a25750613d6d565b601f016020900490600052602060002090810190613d6d9190614a35565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106149f957805485556148c3565b828001600101855582156148c357600052602060002091601f016020900482015b828111156148c3578254825591600101919060010190614a1a565b611d4091905b808211156148cf5760008155600101614a3b56fe6f6e6c79207072696365206d616e61676572206f72206f776e65722063616e2063616c6c20746869732066756e6374696f6e436865636b2074686520435954522062616c616e6365206f6e20796f75722077616c6c657465787465726e616c20636f6e74726163747320617265206e6f7420616c6c6f776564596f75206e65656420746f206465706f736974206174206c6561737420736f6d6520746f6b656e73596f75206e65656420746f207769746864726177206174206c6561737420736f6d6520746f6b656e73a26469706673582212205d2b32be9b840bdb01ee17c72260a6ff6dd2c8ef6097cb5573e4b9ea6e18bdee64736f6c63430006020033

Deployed Bytecode Sourcemap

6133:24948:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16735:264;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16735:264:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16735:264:0;;;;:::i;:::-;;;;;;;;;;;;;;;;30396:660;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30396:660:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30396:660:0;;;;;;;;:::i;:::-;;15854:402;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15854:402:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15854:402:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15854:402:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13801:475;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13801:475:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;13801:475:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;13801:475:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13801:475:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;13801:475:0;;-1:-1:-1;13801:475:0;-1:-1:-1;13801:475:0;;;;:::i;9980:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9980:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9980:125:0;-1:-1:-1;;;;;9980:125:0;;:::i;23205:2056::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23205:2056:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23205:2056:0;;:::i;10347:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10347:109:0;;;:::i;17604:288::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17604:288:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17604:288:0;;;;;;;;;:::i;11579:100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11579:100:0;;;:::i;:::-;;;;-1:-1:-1;;;;;11579:100:0;;;;;;;;;;;;;;20133:2850;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20133:2850:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;20133:2850:0;;;;;;;;;;-1:-1:-1;;;;;20133:2850:0;;;;;;;;;;:::i;25273:991::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25273:991:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25273:991:0;;;;;-1:-1:-1;;;;;25273:991:0;;;;;;;;;;:::i;15205:562::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15205:562:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15205:562:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15205:562:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15205:562:0;;;;;;;;;;;;;;;;;;;;;12322:250;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12322:250:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;12322:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12322:250:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12322:250:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12322:250:0;;-1:-1:-1;12322:250:0;-1:-1:-1;12322:250:0;;;;:::i;16360:255::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16360:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16360:255:0;;;;:::i;10924:196::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10924:196:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10924:196:0;-1:-1:-1;;;;;10924:196:0;;:::i;:::-;;;;;;;;;;;;;;;;;;28807:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28807:109:0;;;:::i;17147:279::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17147:279:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17147:279:0;;;;;;;;;:::i;458:65::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;458:65:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;458:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8314:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8314:31:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8314:31:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;8314:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;578:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;578:20:0;;;:::i;10470:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10470:98:0;;;:::i;27743:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27743:334:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27743:334:0;;:::i;18694:253::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18694:253:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18694:253:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28985:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28985:124:0;;;:::i;10720:90::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10720:90:0;;;:::i;11891:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11891:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11891:109:0;;;;:::i;14712:381::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14712:381:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14712:381:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;14712:381:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14712:381:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14712:381:0;;-1:-1:-1;14712:381:0;-1:-1:-1;14712:381:0;;;;:::i;18431:255::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18431:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18431:255:0;;;;:::i;11363:198::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11363:198:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11363:198:0;-1:-1:-1;;;;;11363:198:0;;:::i;28089:494::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28089:494:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28089:494:0;;:::i;27094:315::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27094:315:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27094:315:0;;:::i;29633:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29633:210:0;;:::i;26278:804::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26278:804:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26278:804:0;;:::i;17955:366::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17955:366:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17955:366:0;;;;;;;;;;;;;;:::i;11739:93::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11739:93:0;;;:::i;12679:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12679:269:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12679:269:0;;;;:::i;10227:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10227:108:0;;;:::i;27417:311::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27417:311:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27417:311:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27417:311:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27417:311:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27417:311:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27417:311:0;;-1:-1:-1;27417:311:0;;-1:-1:-1;;;;;27417:311:0:i;11138:102::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11138:102:0;;;:::i;29921:397::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29921:397:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29921:397:0;;:::i;10582:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10582:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10582:118:0;;:::i;1415:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1415:238:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1415:238:0;-1:-1:-1;;;;;1415:238:0;;:::i;402:51::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;402:51:0;;;:::i;29127:404::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29127:404:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29127:404:0;;;;;;;;:::i;10125:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10125:94:0;;;:::i;16735:264::-;16794:7;;16811:158;16832:11;:18;16828:22;;16811:158;;;16894:2;16873:23;;:11;16885:1;16873:14;;;;;;;;;;;;;;;;;;;;;:17;;;:23;16869:91;;;16921:11;16933:1;16921:14;;;;;;;;;;;;;;;;;;:25;;;16914:32;;;;;16869:91;16852:3;;16811:158;;;;7922:1;16977:16;;16735:264;;;;:::o;30396:660::-;1208:5;;1215:17;;;;;;;;;;;;-1:-1:-1;;;1215:17:0;;;;;-1:-1:-1;;;;;1208:5:0;1194:10;:19;1186:47;;;;-1:-1:-1;;;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30536:1:::1;30517:16;:20;30509:74;;;;-1:-1:-1::0;;;30509:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30633:5;::::0;:30:::1;::::0;;-1:-1:-1;;;30633:30:0;;30657:4:::1;30633:30;::::0;::::1;::::0;;;30602:28:::1;::::0;-1:-1:-1;;;;;30633:5:0::1;::::0;:15:::1;::::0;:30;;;;;::::1;::::0;;;;;;;;:5;:30;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;30633:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30633:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;30633:30:0;;-1:-1:-1;30688:39:0;;::::1;30680:70;;;::::0;;-1:-1:-1;;;30680:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30680:70:0;;;;;;;;;;;;;::::1;;30819:5;::::0;:43:::1;::::0;;-1:-1:-1;;;30819:43:0;;-1:-1:-1;;;;;30819:43:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:14:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;:5:::1;::::0;:43;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;30819:43:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;30819:43:0;::::1;;30815:228;;30986:39;::::0;;-1:-1:-1;;;30986:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30986:39:0;;;;;;;;;;;;;::::1;30815:228;-1:-1:-1::0;30883:44:0::1;::::0;;;;;-1:-1:-1;;;;;30883:44:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;30815:228;1240:1;30396:660:::0;;:::o;15854:402::-;15918:7;;15936:13;15918:7;;15966:228;15987:11;:18;15983:22;;15966:228;;;16049:2;16028:23;;:11;16040:1;16028:14;;;;;;;;;;;;;;;;;;;;;:17;;;:23;16024:162;;;16077:11;16089:1;16077:14;;;;;;;;;;;;;;;;;;:20;;;16099:11;16111:1;16099:14;;;;;;;;;;;;;;;;;;:25;;;16126:11;16138:1;16126:14;;;;;;;;;;;;;;;;;;:18;;16146:11;16158:1;16146:14;;;;;;;;;;;;;;;;;:20;:14;;;;;:20;;16069:98;;;;;;;-1:-1:-1;;16146:20:0;16069:98;;;16146:20;16069:98;;;;;;;;;;;;;;;;;;;;;;;;;;;16146:20;;;;;16069:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16024:162;16007:3;;15966:228;;;-1:-1:-1;;16231:7:0;;;;;;;;;7922:1;16231:7;;;7922:1;-1:-1:-1;7922:1:0;;-1:-1:-1;16231:7:0;-1:-1:-1;7989:7:0;15854:402;;;;;;:::o;13801:475::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13959:6:::1;13954:317;13975:11;:18:::0;13971:22;::::1;13954:317;;;14037:2;14016:23;;:11;14028:1;14016:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:23;14012:251;;;14080:5;14057:11;14069:1;14057:14;;;;;;;;;;;;;;;;;;:20;;:28;;;;14130:10;14102:11;14114:1;14102:14;;;;;;;;;;;;;;;;;;:25;;:38;;;;14178:3;;14157:11;14169:1;14157:14;;;;;;;;;;;;;;;;;;:18;;:24;;;;;;;:::i;:::-;;14221:5;14198:11;14210:1;14198:14;;;;;;;;;;;;;;;;;;:20;;;:28;;;;;;;;;;;;;;;;;;14243:7;;;14012:251;13995:3;;13954:317;;;;6615:1;13801:475:::0;;;;;;:::o;9980:125::-;1208:5;;1215:17;;;;;;;;;;;;-1:-1:-1;;;1215:17:0;;;;;-1:-1:-1;;;;;1208:5:0;1194:10;:19;1186:47;;;;-1:-1:-1;;;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1186:47:0;-1:-1:-1;10066:13:0::1;:31:::0;;-1:-1:-1;;;;;;10066:31:0::1;-1:-1:-1::0;;;;;10066:31:0;;;::::1;::::0;;;::::1;::::0;;9980:125::o;23205:2056::-;23273:7;7051:22;7062:10;7051;:22::i;:::-;7050:23;7029:107;;;;-1:-1:-1;;;7029:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23349:11:::1;::::0;:29:::1;::::0;;-1:-1:-1;;;23349:29:0;;::::1;::::0;::::1;::::0;;;;;23382:10:::1;::::0;-1:-1:-1;;;;;23349:11:0::1;::::0;:19:::1;::::0;:29;;;;;::::1;::::0;;;;;;;;:11;:29;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;23349:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23349:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;23349:29:0;-1:-1:-1;;;;;23349:43:0::1;;23341:74;;;::::0;;-1:-1:-1;;;23341:74:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23341:74:0;;;;;;;;;;;;;::::1;;23426:21;23450:31;23472:8;23450:21;:31::i;:::-;23426:55:::0;-1:-1:-1;23500:36:0::1;::::0;::::1;7881:7;23500:36;;23492:73;;;::::0;;-1:-1:-1;;;23492:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23576:17;23596:32;23613:14;23596:16;:32::i;:::-;23576:52:::0;-1:-1:-1;23648:22:0;23640:54:::1;;;::::0;;-1:-1:-1;;;23640:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23640:54:0;;;;;;;;;;;;;::::1;;23723:5;::::0;:27:::1;::::0;;-1:-1:-1;;;23723:27:0;;23739:10:::1;23723:27;::::0;::::1;::::0;;;23753:9;;-1:-1:-1;;;;;23723:5:0::1;::::0;:15:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;:5;:27;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;23723:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23723:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;23723:27:0;:39:::1;23715:81;;;::::0;;-1:-1:-1;;;23715:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23821:11;::::0;:26:::1;::::0;;-1:-1:-1;;;23821:26:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;23821:11:0;;::::1;::::0;:16:::1;::::0;:26;;;;;:11:::1;::::0;:26;;;;;;;;:11;;:26;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;23821:26:0;;;;;;;;;;;;;;23817:288;;24059:34;::::0;;-1:-1:-1;;;24059:34:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24059:34:0;;;;;;;;;;;;;::::1;23817:288;23868:66;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;23901:10:::1;23868:66:::0;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;24174:5;::::0;:38:::1;::::0;;-1:-1:-1;;;24174:38:0;;24189:10:::1;24174:38;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;24174:5:0;;::::1;::::0;:14:::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:38;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;24174:38:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;24174:38:0;::::1;;24170:300;;24397:37;::::0;;-1:-1:-1;;;24397:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24397:37:0;;;;;;;;;;;;;::::1;24170:300;-1:-1:-1::0;24299:64:0::1;::::0;;::::1;::::0;::::1;::::0;;24330:10:::1;24299:64;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;24495:6;24490:201;24511:11;:18:::0;24507:22;::::1;24490:201;;;24573:14;24552:35;;:11;24564:1;24552:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:35;24548:132;;;7989:7;24609:33;;:11;24621:1;24609:14;;;;;;;;;::::0;;;::::1;::::0;;;:20:::1;:14;::::0;;::::1;;:20;::::0;::::1;;:33;24605:61;;24644:11;24656:1;24644:14;;;;;;;;;::::0;;;::::1;::::0;;;:20:::1;:14;::::0;;::::1;;:20;:22:::0;;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;24644:22:0;;::::1;;::::0;;24605:61:::1;24531:3;;24490:201;;;-1:-1:-1::0;24714:15:0::1;::::0;-1:-1:-1;;;24714:15:0;::::1;;;24710:546;;;24788:6;24783:462;24804:11;:18:::0;24800:22;::::1;24783:462;;;24870:14;24849:35;;:11;24861:1;24849:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:35;24845:385;;;24906:14;24923:46;24957:11;;24923:29;24948:3;24923:11;24935:1;24923:14;;;;;;;;;;;;;;;;;;:20;;;:24;;:29;;;;:::i;:::-;:33:::0;:46:::1;:33;:46;:::i;:::-;24906:63;;25013:32;25038:6;25013:11;25025:1;25013:14;;;;;;;;;;;;;;;;;;:20;;;:24;;:32;;;;:::i;:::-;24990:11;25002:1;24990:14;;;;;;;;;;;;;;;;;;:20;;:55;;;;25075:51;25114:11;;25075:34;25105:3;25075:11;25087:1;25075:14;;;;;;;;;;;;;;;;;;:25;;;:29;;:34;;;;:::i;:51::-;25066:60;;25175:37;25205:6;25175:11;25187:1;25175:14;;;;;;;;;;;;;;;;;;:25;;;:29;;:37;;;;:::i;:::-;25147:11;25159:1;25147:14;;;;;;;;;;;;;;;;;;:25;;:65;;;;24845:385;;24824:3;;24783:462;;;;24710:546;7149:1;;23205:2056:::0;;;:::o;10347:109::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10425:15:::1;:23:::0;;-1:-1:-1;;;;10425:23:0::1;::::0;;10347:109::o;17604:288::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17706:6:::1;17701:186;17722:11;:18:::0;17718:22;::::1;17701:186;;;17784:2;17763:23;;:11;17775:1;17763:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:23;17759:119;;;17832:9;17804:11;17816:1;17804:14;;;;;;;;;;;;;;;;;;:25;;:37;;;;17858:7;;;17759:119;17742:3;;17701:186;;6615:1;17604:288:::0;;:::o;11579:100::-;11653:18;;-1:-1:-1;;;;;11653:18:0;11579:100;;:::o;20133:2850::-;20570:7;7051:22;7062:10;7051;:22::i;:::-;7050:23;7029:107;;;;-1:-1:-1;;;7029:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20624:1:::1;20598:23;20611:9;20598:12;:23::i;:::-;:27;;;20589:53;;;::::0;;-1:-1:-1;;;20589:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20589:53:0;;;;;;;;;;;;;::::1;;20655:16;20674:23;20687:9;20674:12;:23::i;:::-;20655:42:::0;-1:-1:-1;20712:21:0;20704:65:::1;;;::::0;;-1:-1:-1;;;20704:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;20797:1;20784:10;:14;20776:56;;;::::0;;-1:-1:-1;;;20776:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;20918:8;20904:10;:22;20896:31;;;::::0;::::1;;21014:5;::::0;:27:::1;::::0;;-1:-1:-1;;;21014:27:0;;21030:10:::1;21014:27;::::0;::::1;::::0;;;20994:17:::1;::::0;-1:-1:-1;;;;;21014:5:0::1;::::0;:15:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;:5;:27;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;21014:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21014:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;21014:27:0;;-1:-1:-1;21088:23:0;;::::1;;21080:73;;;;-1:-1:-1::0;;;21080:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21201:5;::::0;:42:::1;::::0;;-1:-1:-1;;;21201:42:0;;21217:10:::1;21201:42;::::0;::::1;::::0;21237:4:::1;21201:42:::0;;;;;;21181:17:::1;::::0;-1:-1:-1;;;;;21201:5:0::1;::::0;:15:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;:5;:42;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;21201:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21201:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;21201:42:0;;-1:-1:-1;21264:23:0;;::::1;;21256:60;;;::::0;;-1:-1:-1;;;21256:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;21361:23;21375:8;21361:13;:23::i;:::-;21353:59;;;::::0;;-1:-1:-1;;;21353:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21353:59:0;;;;;;;;;;;;;::::1;;21494:5;::::0;:57:::1;::::0;;-1:-1:-1;;;21494:57:0;;21513:10:::1;21494:57;::::0;::::1;::::0;21533:4:::1;21494:57:::0;;;;;;;;;;;;-1:-1:-1;;;;;21494:5:0;;::::1;::::0;:18:::1;::::0;:57;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:57;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;21494:57:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;21494:57:0;::::1;;21490:250;;21675:37;::::0;;-1:-1:-1;;;21675:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21675:37:0;;;;;;;;;;;;;::::1;21490:250;-1:-1:-1::0;21591:58:0::1;::::0;;::::1;::::0;::::1;::::0;;21616:10:::1;21591:58;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;21789:11;::::0;-1:-1:-1;;;;;21789:11:0::1;:16;21806:3:::0;21810:8;21820:21:::1;21831:9:::0;21820:10:::1;:21::i;:::-;21789:53;;;;;;;;;;;;;-1:-1:-1::0;;;;;21789:53:0::1;-1:-1:-1::0;;;;;21789:53:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;21789:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;21789:53:0;;;;;;;;;;;;;;21785:370;;22119:28;::::0;;-1:-1:-1;;;22119:28:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22119:28:0;;;;;;;;;;;;;::::1;21785:370;21853:13;:15:::0;;::::1;;::::0;;21957:61:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;21985:10:::1;21957:61:::0;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;22172:6;22167:180;22188:11;:18:::0;22184:22;::::1;22167:180;;;22246:9;22225:30;;:11;22237:1;22225:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:30;22221:119;;;7989:7;22273:33;;:11;22285:1;22273:14;;;;;;;;;::::0;;;::::1;::::0;;;:20:::1;:14;::::0;;::::1;;:20;::::0;::::1;;:33;22269:61;;22308:11;22320:1;22308:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:20;;:22:::0;;-1:-1:-1;;22308:22:0;::::1;;::::0;;::::1;-1:-1:-1::0;;22308:22:0;;;::::1;;::::0;;22269:61:::1;22208:3;;22167:180;;;-1:-1:-1::0;22363:15:0::1;::::0;-1:-1:-1;;;22363:15:0;::::1;;;22359:503;;;22433:6;22428:427;22449:11;:18:::0;22445:22;::::1;22428:427;;;22511:9;22490:30;;:11;22502:1;22490:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:30;22486:360;;;22538:14;22555:46;22589:11;;22555:29;22580:3;22555:11;22567:1;22555:14;;;;;;;:46;22538:63;;22641:32;22666:6;22641:11;22653:1;22641:14;;;;;;;;;;;;;;;;;;:20;;;:24;;:32;;;;:::i;:::-;22618:11;22630:1;22618:14;;;;;;;;;;;;;;;;;;:20;;:55;;;;22699:51;22738:11;;22699:34;22729:3;22699:11;22711:1;22699:14;;;;;;;:51;22690:60;;22795:37;22825:6;22795:11;22807:1;22795:14;;;;;;;;;;;;;;;;;;:25;;;:29;;:37;;;;:::i;:::-;22767:11;22779:1;22767:14;;;;;;;;;;;;;;;;;;:25;;:65;;;;22486:360;;22469:3;;22428:427;;;;22359:503;7149:1;;;20133:2850:::0;;;;;;:::o;25273:991::-;6488:13;;25553:7;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25572:16:::1;25591:23;25604:9;25591:12;:23::i;:::-;25572:42:::0;-1:-1:-1;25629:21:0;25621:65:::1;;;::::0;;-1:-1:-1;;;25621:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25701:23;25715:8;25701:13;:23::i;:::-;25693:59;;;::::0;;-1:-1:-1;;;25693:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25693:59:0;;;;;;;;;;;;;::::1;;25805:11;::::0;-1:-1:-1;;;;;25805:11:0::1;:16;25822:3:::0;25826:8;25836:21:::1;25847:9:::0;25836:10:::1;:21::i;:::-;25805:53;;;;;;;;;;;;;-1:-1:-1::0;;;;;25805:53:0::1;-1:-1:-1::0;;;;;25805:53:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;25805:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;25805:53:0;;;;;;;;;;;;;;25801:356;;26121:28;::::0;;-1:-1:-1;;;26121:28:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26121:28:0;;;;;;;;;;;;;::::1;25801:356;25869:13;:15:::0;;::::1;;::::0;;25973:47:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;25973:47:0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;26176:8:0;;25273:991;-1:-1:-1;;;25273:991:0:o;15205:562::-;15261:15;15278:16;15296;15322:19;15357:11;:18;;;;15344:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;15344:32:0;;15322:54;;15385:23;15425:11;:18;;;;15411:33;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;15411:33:0;;15385:59;;15453:28;15498:11;:18;;;;15484:33;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;15484:33:0;-1:-1:-1;15453:64:0;-1:-1:-1;15531:6:0;15526:194;15547:11;:18;15543:22;;15526:194;;;15593:11;15605:1;15593:14;;;;;;;;;;;;;;;;;;;;;:17;15584:6;;15593:17;;;;;15584:3;;15588:1;;15584:6;;;;;;;;;;;:26;;;;;;;;;;;15635:11;15647:1;15635:14;;;;;;;;;;;;;;;;;;:20;;;15623:6;15630:1;15623:9;;;;;;;;;;;;;:32;;;;;15685:11;15697:1;15685:14;;;;;;;;;;;;;;;;;;:25;;;15668:11;15680:1;15668:14;;;;;;;;;;;;;;;;;:42;15567:3;;15526:194;;;-1:-1:-1;15736:3:0;;-1:-1:-1;15741:6:0;-1:-1:-1;15749:11:0;-1:-1:-1;15205:562:0;;;:::o;12322:250::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12468:22:::1;;:::i;:::-;12493:42;;;;;;;;12504:2;12493:42;;;;;;12507:5;12493:42;;;;12513:10;12493:42;;;;12524:3;;12493:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;-1:-1;12493:42:0;;;-1:-1:-1;;;12493:42:0::1;::::0;;::::1;;::::0;;::::1;::::0;12544:11:::1;27:10:-1::0;;39:1:::1;23:18:::0;::::1;45:23:::0;;12544:22:0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;12544:22:0::1;::::0;;;::::1;;::::0;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;12544:22:0;;;;::::1;::::0;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12544:22:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;12544:22:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;;12322:250:0:o;16360:255::-;16415:7;;16432:153;16453:11;:18;16449:22;;16432:153;;;16515:2;16494:23;;:11;16506:1;16494:14;;;;;;;;;;;;;;;;;;;;;:17;;;:23;16490:86;;;16542:11;16554:1;16542:14;;;;;;;;;;;;;;;;;;:20;;;16535:27;;;;;16490:86;16473:3;;16432:153;;10924:196;11002:4;1208:5;;1215:17;;;;;;;;;;;;-1:-1:-1;;;1215:17:0;;;;;-1:-1:-1;;;;;1208:5:0;1194:10;:19;1186:47;;;;-1:-1:-1;;;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1186:47:0;-1:-1:-1;11024:19:0::1;:38:::0;;-1:-1:-1;;;;;;11024:38:0;;::::1;-1:-1:-1::0;;;;;11024:38:0;;::::1;;::::0;;;;11073:5:::1;:39:::0;;11092:19;;;::::1;11073:39:::0;::::1;;::::0;;;;10924:196::o;28807:109::-;28887:21;28807:109;:::o;17147:279::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17245:6:::1;17240:181;17261:11;:18:::0;17257:22;::::1;17240:181;;;17323:2;17302:23;;:11;17314:1;17302:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:23;17298:114;;;17366:9;17343:11;17355:1;17343:14;;;;;;;;;;;;;;;;;;:20;;:32;;;;17392:7;;;17298:114;17281:3;;17240:181;;458:65:::0;;;;;;;;;;;;;;-1:-1:-1;;;458:65:0;;;;:::o;8314:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8314:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8314:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8314:31:0;;;;;;;-1:-1:-1;;8314:31:0;;;:::o;578:20::-;;;-1:-1:-1;;;;;578:20:0;;:::o;10470:98::-;10545:15;;-1:-1:-1;;;10545:15:0;;;;;10470:98::o;27743:334::-;27822:11;;:29;;;-1:-1:-1;;;27822:29:0;;;;;;;;;;27804:4;;-1:-1:-1;;;;;27822:11:0;;:20;;:29;;;;;27804:4;;27822:29;;;;;;;:11;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;27822:29:0;;;;;;;;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27822:29:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;27822:29:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;27822:29:0;;420:4:-1;411:14;;;;27822:29:0;;;;;411:14:-1;27822:29:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27822:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27818:254;;-1:-1:-1;27999:4:0;27992:11;;27818:254;;27957:5;27950:12;;;;18694:253;18749:6;;18765:152;18786:11;:18;18782:22;;18765:152;;;18848:2;18827:23;;:11;18839:1;18827:14;;;;;;;;;;;;;;;;;;;;;:17;;;:23;18823:85;;;18874:11;18886:1;18874:14;;;;;;;;;;;;;;;;:20;:14;;;;;:20;;;;;-1:-1:-1;18867:27:0;;-1:-1:-1;18867:27:0;18823:85;18806:3;;18765:152;;;-1:-1:-1;7989:7:0;;18694:253;-1:-1:-1;;18694:253:0:o;28985:124::-;29071:5;;:30;;;-1:-1:-1;;;29071:30:0;;29095:4;29071:30;;;;;;29044:7;;-1:-1:-1;;;;;29071:5:0;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;29071:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29071:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29071:30:0;;-1:-1:-1;28985:124:0;:::o;10720:90::-;10791:11;;10720:90;:::o;11891:109::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11973:21:::1;;:13;:21:::0;11891:109::o;14712:381::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14911:2:::1;14885:11;14897:7;14885:20;;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:28:::0;;-1:-1:-1;;14885:28:0::1;;::::0;;::::1;;::::0;;14921:11:::1;:20:::0;;14950:5;;14921:20;::::1;::::0;;::::1;;;;;;;;;;;;;;;:26;;:34;;;;14997:10;14963:11;14975:7;14963:20;;;;;;;;;;;;;;;;;;;;:31;;:44;;;;15042:3;;15015:11;15027:7;15015:20;;;;;;;;;;;;;;;;;;;;:24;;:30;;;;;;;:::i;:::-;;15082:5;15053:11;15065:7;15053:20;;;;;;;;;;;;;;;;;;;;:26;;;:34;;;;;;;;;;;;;;;;;;14712:381:::0;;;;;;;:::o;18431:255::-;18484:13;18512:6;18507:151;18528:11;:18;18524:22;;18507:151;;;18590:2;18569:23;;:11;18581:1;18569:14;;;;;;;;;;;;;;;;;;;;;:17;;;:23;18565:84;;;18617:11;18629:1;18617:14;;;;;;;;;;;;;;;;;:18;:14;;;;;:18;18610:25;;;;;;;-1:-1:-1;;18610:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18617:18;18610:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18565:84;18548:3;;18507:151;;;-1:-1:-1;;18673:7:0;;;;;;;;;-1:-1:-1;18673:7:0;;18431:255;;;:::o;11363:198::-;11438:4;1208:5;;1215:17;;;;;;;;;;;;-1:-1:-1;;;1215:17:0;;;;;-1:-1:-1;;;;;1208:5:0;1194:10;:19;1186:47;;;;-1:-1:-1;;;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1186:47:0;-1:-1:-1;11460:18:0::1;:35:::0;;-1:-1:-1;;;;;;11460:35:0;;::::1;-1:-1:-1::0;;;;;11460:35:0;;::::1;;::::0;;;;-1:-1:-1;11506:47:0;;11534:18;;;::::1;11506:47:::0;::::1;;::::0;;;;11363:198::o;28089:494::-;28195:7;;;;;;;;28158;28195;;;28215:11;;:29;;-1:-1:-1;;;28215:29:0;;;;;;;;;;28158:7;;-1:-1:-1;;;;;28215:11:0;;;;:20;;:29;;;;;28158:7;;28215:29;;;;;;;;:11;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;28215:29:0;;;;;;;;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;28215:29:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;28215:29:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;28215:29:0;;420:4:-1;411:14;;;;28215:29:0;;;;;411:14:-1;28215:29:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28215:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28211:360;;-1:-1:-1;7881:7:0;;-1:-1:-1;28536:25:0;;28211:360;-1:-1:-1;28262:11:0;;:29;;;-1:-1:-1;;;28262:29:0;;;;;;;;;;-1:-1:-1;;;;;28262:11:0;;;;:20;;:29;;;;;:11;;:29;;;;;;;;:11;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;28262:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28262:29:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;28262:29:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;28262:29:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;28262:29:0;;420:4:-1;411:14;;;;28262:29:0;;;;;411:14:-1;28262:29:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28262:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28256:35;;28302:16;28321:22;28339:3;28321:17;:22::i;:::-;28302:41;-1:-1:-1;28358:31:0;;;7881:7;28358:31;28354:155;;;-1:-1:-1;7881:7:0;;-1:-1:-1;28405:25:0;;-1:-1:-1;28405:25:0;28354:155;28470:27;28487:9;28470:16;:27::i;:::-;28463:34;;;;;;27094:315;27198:7;;;;;;;;27162:6;27198:7;;;27218:11;;:29;;-1:-1:-1;;;27218:29:0;;;;;;;;;;27162:6;;-1:-1:-1;;;;;27218:11:0;;;;:20;;:29;;;;;27162:6;;27218:29;;;;;;;;:11;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;27218:29:0;;;;;;;;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27218:29:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;27218:29:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;27218:29:0;;420:4:-1;411:14;;;;27218:29:0;;;;;411:14:-1;27218:29:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27218:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27214:183;;7881:7;27362:25;;;;;27214:183;-1:-1:-1;27265:11:0;;:29;;;-1:-1:-1;;;27265:29:0;;;;;;;;;;-1:-1:-1;;;;;27265:11:0;;;;:20;;:29;;;;;:11;;:29;;;;;;;;:11;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;27265:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27265:29:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27265:29:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;27265:29:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;27265:29:0;;420:4:-1;411:14;;;;27265:29:0;;;;;411:14:-1;27265:29:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27265:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27259:35;;27312:22;27330:3;27312:17;:22::i;:::-;27305:29;;;;;29633:210;1208:5;;1215:17;;;;;;;;;;;;-1:-1:-1;;;1215:17:0;;;;;-1:-1:-1;;;;;1208:5:0;1194:10;:19;1186:47;;;;-1:-1:-1;;;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1186:47:0;;29734:9:::1;29713:6;29721:8;29713:17;:30;29705:72;;;::::0;;-1:-1:-1;;;29705:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29817:5;::::0;29793:30:::1;::::0;;;;;-1:-1:-1;;;;;29817:5:0;;::::1;29793:30;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;29633:210:::0;:::o;26278:804::-;6488:13;;26357:7;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26414:21:::1;26438:31;26460:8;26438:21;:31::i;:::-;26414:55;;26612:17;26632:32;26649:14;26632:16;:32::i;:::-;26803:11;::::0;:26:::1;::::0;;-1:-1:-1;;;26803:26:0;;::::1;::::0;::::1;::::0;;;;;26612:52;;-1:-1:-1;;;;;;26803:11:0;;::::1;::::0;:16:::1;::::0;:26;;;;;:11:::1;::::0;:26;;;;;;;;:11;;:26;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;26803:26:0;;;;;;;;;;;;;;26799:270;;27023:34;::::0;;-1:-1:-1;;;27023:34:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27023:34:0;;;;;;;;;;;;;::::1;26799:270;26850:48;::::0;;;;;::::1;::::0;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;;::::1;6615:1;;26278:804:::0;;;:::o;17955:366::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18081:6:::1;18076:240;18097:11;:18:::0;18093:22;::::1;18076:240;;;18159:2;18138:23;;:11;18150:1;18138:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:23;18134:173;;;18202:9;18179:11;18191:1;18179:14;;;;;;;;;;;;;;;;;;:20;;:32;;;;18256:14;18228:11;18240:1;18228:14;;;;;;;;;;;;;;;;;;:25;;:42;;;;18287:7;;;18134:173;18117:3;;18076:240;;;;17955:366:::0;;;:::o;11739:93::-;11813:13;;11739:93;:::o;12679:269::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12766:8:::1;12761:182;12784:11;:18:::0;12780:22:::1;::::0;::::1;;12761:182;;;12846:2;12825:23;;:11;12837:1;12825:14;;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:17:::0;::::1;;:23;12821:114;;;12866:26;12890:1;12866:23;:26::i;:::-;12915:7;;;12821:114;12804:3;;12761:182;;6615:1;12679:269:::0;:::o;10227:108::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10305:15:::1;:22:::0;;-1:-1:-1;;;;10305:22:0::1;-1:-1:-1::0;;;10305:22:0::1;::::0;;10227:108::o;27417:311::-;27485:6;;27501:188;27522:11;:18;27518:22;;27501:188;;;27619:3;27603:21;;;;;;27579:11;27591:1;27579:14;;;;;;;;;;;;;;;;;;:18;;27563:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:61;27559:121;;;27649:11;27661:1;27649:14;;;;;;;;;;;;;;;;;;;;;:17;;;;-1:-1:-1;27642:24:0;;-1:-1:-1;27642:24:0;27559:121;27542:3;;27501:188;;11138:102;11213:19;;-1:-1:-1;;;;;11213:19:0;11138:102;:::o;29921:397::-;1208:5;;1215:17;;;;;;;;;;;;-1:-1:-1;;;1215:17:0;;;;;-1:-1:-1;;;;;1208:5:0;1194:10;:19;1186:47;;;;-1:-1:-1;;;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1186:47:0;;30007:1:::1;29998:6;:10;29990:63;;;;-1:-1:-1::0;;;29990:63:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30084:5;::::0;:42:::1;::::0;;-1:-1:-1;;;30084:42:0;;30100:10:::1;30084:42;::::0;::::1;::::0;30120:4:::1;30084:42:::0;;;;;;30064:17:::1;::::0;-1:-1:-1;;;;;30084:5:0::1;::::0;:15:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;:5;:42;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;30084:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30084:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;30084:42:0;;-1:-1:-1;30145:19:0;;::::1;;30137:57;;;::::0;;-1:-1:-1;;;30137:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30205:5;::::0;:53:::1;::::0;;-1:-1:-1;;;30205:53:0;;30224:10:::1;30205:53;::::0;::::1;::::0;30244:4:::1;30205:53:::0;;;;;;;;;;;;-1:-1:-1;;;;;30205:5:0;;::::1;::::0;:18:::1;::::0;:53;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:53;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;30205:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30205:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;30304:5:0::1;::::0;30280:30:::1;::::0;;;;;-1:-1:-1;;;;;30304:5:0;;::::1;30205:53;30280:30:::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;1240:1;29921:397:::0;:::o;10582:118::-;6488:13;;-1:-1:-1;;;;;6488:13:0;6474:10;:27;;:50;;-1:-1:-1;6519:5:0;;-1:-1:-1;;;;;6519:5:0;6505:10;:19;6474:50;6454:148;;;;-1:-1:-1;;;6454:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10669:11:::1;:23:::0;10582:118::o;1415:238::-;1208:5;;1215:17;;;;;;;;;;;;-1:-1:-1;;;1215:17:0;;;;;-1:-1:-1;;;;;1208:5:0;1194:10;:19;1186:47;;;;-1:-1:-1;;;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1186:47:0;-1:-1:-1;1541:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;1541:31:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;1516:23:0;::::1;1508:65;;;::::0;-1:-1:-1;;;1508:65:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;27:10:-1;;8:100:::1;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;1508:65:0;-1:-1:-1::0;1606:5:0::1;::::0;;1585:38:::1;::::0;-1:-1:-1;;;;;1585:38:0;;::::1;::::0;1606:5;::::1;::::0;1585:38:::1;::::0;::::1;1630:5;:17:::0;;-1:-1:-1;;;;;;1630:17:0::1;-1:-1:-1::0;;;;;1630:17:0;;;::::1;::::0;;;::::1;::::0;;1415:238::o;402:51::-;;;;;;;;;;;;;;-1:-1:-1;;;402:51:0;;;;:::o;29127:404::-;1208:5;;1215:17;;;;;;;;;;;;-1:-1:-1;;;1215:17:0;;;;;-1:-1:-1;;;;;1208:5:0;1194:10;:19;1186:47;;;;-1:-1:-1;;;1186:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1186:47:0;;29248:6:::1;29223:21;:31;;29215:62;;;::::0;;-1:-1:-1;;;29215:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29215:62:0;;;;;;;;;;;;;::::1;;29375:29;::::0;29288:12:::1;::::0;-1:-1:-1;;;;;29375:11:0;::::1;::::0;29393:6;;29288:12;29375:29;29288:12;29375:29;29393:6;29375:11;:29:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;29361:43:0;;;;;29423:7;29415:36;;;::::0;;-1:-1:-1;;;29415:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29415:36:0;;;;;;;;;;;;;::::1;;29489:25;::::0;;;;;-1:-1:-1;;;;;29489:25:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;1240:1;29127:404:::0;;:::o;10125:94::-;10198:13;;-1:-1:-1;;;;;10198:13:0;10125:94;:::o;6802:188::-;6924:18;6973:8;;;;;6802:188::o;3138:409::-;3241:16;3362:1;3351:8;:12;3365:16;;;;;;;;;;;;;-1:-1:-1;;;3365:16:0;;;3343:39;;;;;-1:-1:-1;;;3343:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3343:39:0;;3412:8;3400:9;:20;;;;;;;3138:409;-1:-1:-1;;;3138:409:0:o;2420:485::-;2522:15;2761:13;2757:49;;-1:-1:-1;2797:1:0;2790:8;;2757:49;-1:-1:-1;2824:19:0;;;2835:8;2824;:19;:8;2858:18;;;;;:30;2890:8;;;;;;;;;;;;;-1:-1:-1;;;2890:8:0;;;2850:49;;;;;-1:-1:-1;;;2850:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;2850:49:0;;2420:485;;;;;:::o;3786:248::-;3891:18;3944:8;3929:11;:23;;3954:31;;;;;;;;;;;;;-1:-1:-1;;;3954:31:0;;;3921:65;;;;;-1:-1:-1;;;3921:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3921:65:0;-1:-1:-1;;4006:22:0;;;3786:248::o;4187:197::-;4369:8;;;;;;;;;;;;-1:-1:-1;;;4369:8:0;;;;4318:19;;;;4352:15;;;;4344:34;;;;-1:-1:-1;;;4344:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;13069:357:0;13146:11;:18;13137:27;;;;13133:40;;13166:7;;13133:40;13193:11;:18;-1:-1:-1;;13193:21:0;13184:30;;;;13180:241;;;13227:11;:17;;;;;;;;;;;;;;;-1:-1:-1;;13227:17:0;;;;;;;;;-1:-1:-1;;13227:17:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;13227:17:0;;;;-1:-1:-1;;13227:17:0;;;;;13180:241;;;13276:14;;;13271:113;13296:11;:18;-1:-1:-1;;13296:20:0;13292:24;;13271:113;;;13355:11;13367:1;13369;13367:3;13355:16;;;;;;;;;;;;;;;;;;13338:11;13350:1;13338:14;;;;;;;;;;;;;;;;:33;;:14;;;;;:33;;-1:-1:-1;;13338:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13338:33:0;;;;:::i;:::-;-1:-1:-1;13338:33:0;;;;;;;;;-1:-1:-1;;13338:33:0;;;;;;;;;;;;13318:3;13271:113;;;;13395:11;:17;;;;;;;;;;;;;;;-1:-1:-1;;13395:17:0;;;;;;;;;-1:-1:-1;;13395:17:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;13395:17:0;;;;-1:-1:-1;;13395:17:0;;;;;13069:357;:::o;6133:24948::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6133:24948:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6133:24948:0;;;-1:-1:-1;6133:24948:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://5d2b32be9b840bdb01ee17c72260a6ff6dd2c8ef6097cb5573e4b9ea6e18bdee

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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