Sponsored Link:   SHIFT.cash - smart-contract based car title lending platform, 30 billion market, 35+ employees. Join NOW.
Contract Overview | XJPCoin
ETH Balance: 0 Ether
ETH USD Value: $0
No Of Transactions: 75 txns
Token Tracker 0x39689fE671C01fcE173395f6BC45D4C332026666
  Latest 25 txns from a total Of 75 transactions View All

TxHash Age From To Value [TxFee]
0x0d8a369c25a42cedd50bd8c080855d2cab2b3174e10f7cbe4356a03f3cb8373826 days 51 mins ago0xa65e9fec4f892ef6e9fe3888ed9b0eb6aab1f0fd  IN   XJPCoin0 Ether0.0026131
0x5a2f152dea8443a02f5762926debb7b4ba36539775a054b24e68ee955e0539ab40 days 12 hrs ago0x5ce7cc48ac46b5fc49efd21bdbb1295ea49d751e  IN   XJPCoin0 Ether0.00554838
0x86cd7c7286857c57feaff538d0a2bc1462a7199ce90e3bd9ba3ff8685a26ff5640 days 12 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.0029864
0xf90b52cf5fb469ea1a5c4d6e2ed393d06bc2dc506736afe70f5d3b01a9cfbd1d40 days 12 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.0024
0x947d172103a5f62e620c2a97b4c2ca9b6caed6223cfd0bdf100548a400ba5efd40 days 13 hrs ago0x5ce7cc48ac46b5fc49efd21bdbb1295ea49d751e  IN   XJPCoin0 Ether0.00519042
0x526d449404d763e8a9469a7f965d9f4b09190f4f164f366e95c3ae197e4249fb40 days 13 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00564858
0xf1da410e8930e004b141a8af9e4c0b7348e0cc1f9184a055b99921b73f26cd9b40 days 15 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00378
0xdd80c7440a6005b1c3847e224270c1ab807c3118386fc9340939b63de1ffdebf40 days 15 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00378
0xffaa69bbdc4f041b9be9340c3b2c5f380736690401ac68fd214e9df26c66028340 days 16 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00378
0xe2c7b5599cc377f37ef80bd29de935b014faf9a647002f9c5eae673ad85d307740 days 18 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.005999999877
0xd956337107c02c1098b1917a64d3e59ac6e49e81f2d3aee9a1e9fb4b6b85d01340 days 19 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.005291462492
0x8ad82e6ef16626fe59b18dd0c1fa261affb51285c11dce9c0ac128e5bb14cff840 days 19 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.0036
0x2f863e595d0f4e234aee41b4e2c60d36d56383a08fdb516503e35b14bd81fc8f40 days 19 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.005456238673
0xb11a709144f50851c40326371fb5650f51b5fc78e6121078decdd268a10bf83d40 days 19 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.004105074278
0xd0bdbbff4dfa1aad16a3f165f85d16134ab7176227218581d1d143b4ff7346b940 days 19 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00342
0xd5959e86fa6fce5181b43ec4b4c937d38361e16ec64e1648ecfc160311ba995953 days 19 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.002605611909
0x5810c05dd8677349e032e0c1154f3d2a2248f77241f121b537017112f0a8a8f758 days 14 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.002918686556
0xa456743d5352bc794a7dedf038277aedb76b3cbc36d299e0a3035b8b60935f1158 days 14 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.003396537139
0x75901feb3484182a8e92c3bf0ef095f1b4cc98912e10120a79d207cd0839feb397 days 25 mins ago0x0066fe769c7524d124f8467998579195a9b5b6a8  IN   XJPCoin0 Ether0.00179064
0x1d31c3ae050ff16ce996e3d40f0896c816feae283a3c0008f101869c520f499797 days 26 mins ago0x7d17954a294917759d6a927d2740682af2146e20  IN   XJPCoin0 Ether0.00179064
0x73d46903a982f87c6252b6dc6a8ad34b0876529e0ab33cd0d29cb15fa8c4c71697 days 2 hrs ago0x0066fe769c7524d124f8467998579195a9b5b6a8  IN   XJPCoin0 Ether0.00179064
0xa8121013a2e0e50182da3525cfa08be98b0c7e3fd521ad82a4e8318e6a5752c699 days 8 hrs ago0x0066fe769c7524d124f8467998579195a9b5b6a8  IN   XJPCoin0 Ether0.00149064
0x1fe2b8a5f9eaeb3124561033c43c3e6842b437c9bb14a401e717c3b61c3b28cb100 days 2 hrs ago0x74a42e129a894249e57475970ed6bee2ff886a72  IN   XJPCoin0 Ether0.0008949
0xc13d034884d35f8232748f8ada19db57210f0e4ae3502b5934155c952d92c954100 days 2 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00188286
0x571982dfa44cd9de3c7ef068fc5e4c3fc09bb4f75e9cd66b39395552adce7b35101 days 4 hrs ago0x0066fe769c7524d124f8467998579195a9b5b6a8  IN   XJPCoin0 Ether0.0003801132
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Warning: The compiled contract might be susceptible to ZeroFunctionSelector (very low-severity), DelegateCallReturnValue (low-severity), ECRecoverMalformedInput (medium-severity), SkipEmptyStringLiteral (low-severity) Solidity compiler bugs.

Contract Source Code Verified
Contract Name: IkuraController
Compiler Version: v0.4.11+commit.68ef5810
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts
contract DSAuthority {
    function canCall(
        address src, address dst, bytes4 sig
    ) constant returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

    function DSAuth() {
        owner = msg.sender;
        LogSetOwner(msg.sender);
    }

    function setOwner(address owner_)
        auth
    {
        owner = owner_;
        LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        auth
    {
        authority = authority_;
        LogSetAuthority(authority);
    }

    modifier auth {
        assert(isAuthorized(msg.sender, msg.sig));
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }

    function assert(bool x) internal {
        if (!x) throw;
    }
}





contract ERC20 {
    function totalSupply() constant returns (uint supply);
    function balanceOf( address who ) constant returns (uint value);
    function allowance( address owner, address spender ) constant returns (uint _allowance);

    function transfer( address to, uint value) returns (bool ok);
    function transferFrom( address from, address to, uint value) returns (bool ok);
    function approve( address spender, uint value ) returns (bool ok);

    event Transfer( address indexed from, address indexed to, uint value);
    event Approval( address indexed owner, address indexed spender, uint value);
}

contract DSMath {
    

    function add(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) constant internal returns (uint256 z) {
        z = x * y;
        assert(x == 0 || z / x == y);
    }

    function div(uint256 x, uint256 y) constant internal returns (uint256 z) {
        z = x / y;
    }

    function min(uint256 x, uint256 y) constant internal returns (uint256 z) {
        return x <= y ? x : y;
    }
    function max(uint256 x, uint256 y) constant internal returns (uint256 z) {
        return x >= y ? x : y;
    }



    function hadd(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x + y) >= x);
    }

    function hsub(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x - y) <= x);
    }

    function hmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = x * y;
        assert(x == 0 || z / x == y);
    }

    function hdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = x / y;
    }

    function hmin(uint128 x, uint128 y) constant internal returns (uint128 z) {
        return x <= y ? x : y;
    }
    function hmax(uint128 x, uint128 y) constant internal returns (uint128 z) {
        return x >= y ? x : y;
    }



    function imin(int256 x, int256 y) constant internal returns (int256 z) {
        return x <= y ? x : y;
    }
    function imax(int256 x, int256 y) constant internal returns (int256 z) {
        return x >= y ? x : y;
    }

    /*
    WAD math
     */

    uint128 constant WAD = 10 ** 18;

    function wadd(uint128 x, uint128 y) constant internal returns (uint128) {
        return hadd(x, y);
    }

    function wsub(uint128 x, uint128 y) constant internal returns (uint128) {
        return hsub(x, y);
    }

    function wmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * y + WAD / 2) / WAD);
    }

    function wdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * WAD + y / 2) / y);
    }

    function wmin(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmin(x, y);
    }
    function wmax(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmax(x, y);
    }

    /*
    RAY math
     */

    uint128 constant RAY = 10 ** 27;

    function radd(uint128 x, uint128 y) constant internal returns (uint128) {
        return hadd(x, y);
    }

    function rsub(uint128 x, uint128 y) constant internal returns (uint128) {
        return hsub(x, y);
    }

    function rmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * y + RAY / 2) / RAY);
    }

    function rdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * RAY + y / 2) / y);
    }

    function rpow(uint128 x, uint64 n) constant internal returns (uint128 z) {
        
        
        
        
        
        
        
        
        
        
        
        
        
        

        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }

    function rmin(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmin(x, y);
    }
    function rmax(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmax(x, y);
    }

    function cast(uint256 x) constant internal returns (uint128 z) {
        assert((z = uint128(x)) == x);
    }

}

contract IkuraStorage is DSMath, DSAuth {
  
  address[] ownerAddresses;

  
  mapping(address => uint) coinBalances;

  
  mapping(address => uint) tokenBalances;

  
  mapping(address => mapping (address => uint)) coinAllowances;

  
  uint _totalSupply = 0;

  
  
  
  uint _transferFeeRate = 500;

  
  
  
  uint8 _transferMinimumFee = 5;

  address tokenAddress;
  address multiSigAddress;
  address authorityAddress;

  
  
  
  function IkuraStorage() DSAuth() {
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }

  function changeToken(address tokenAddress_) auth {
    tokenAddress = tokenAddress_;
  }

  function changeAssociation(address multiSigAddress_) auth {
    multiSigAddress = multiSigAddress_;
  }

  function changeAuthority(address authorityAddress_) auth {
    authorityAddress = authorityAddress_;
  }

  function totalSupply() auth returns (uint) {
    return _totalSupply;
  }
  function addTotalSupply(uint amount) auth {
    _totalSupply = add(_totalSupply, amount);
  }
  function subTotalSupply(uint amount) auth {
    _totalSupply = sub(_totalSupply, amount);
  }
  function transferFeeRate() auth returns (uint) {
    return _transferFeeRate;
  }

  function setTransferFeeRate(uint newTransferFeeRate) auth returns (bool) {
    _transferFeeRate = newTransferFeeRate;

    return true;
  }

  
  
  

  function transferMinimumFee() auth returns (uint8) {
    return _transferMinimumFee;
  }

  function setTransferMinimumFee(uint8 newTransferMinimumFee) auth {
    _transferMinimumFee = newTransferMinimumFee;
  }

  function addOwnerAddress(address addr) internal returns (bool) {
    ownerAddresses.push(addr);

    return true;
  }

  function removeOwnerAddress(address addr) internal returns (bool) {
    uint i = 0;

    while (ownerAddresses[i] != addr) { i++; }

    while (i < ownerAddresses.length - 1) {
      ownerAddresses[i] = ownerAddresses[i + 1];
      i++;
    }

    ownerAddresses.length--;

    return true;
  }

  function primaryOwner() auth returns (address) {
    return ownerAddresses[0];
  }

  function isOwnerAddress(address addr) auth returns (bool) {
    for (uint i = 0; i < ownerAddresses.length; i++) {
      if (ownerAddresses[i] == addr) return true;
    }

    return false;
  }

  function numOwnerAddress() auth constant returns (uint) {
    return ownerAddresses.length;
  }

  
  
  

  function coinBalance(address addr) auth returns (uint) {
    return coinBalances[addr];
  }

  function addCoinBalance(address addr, uint amount) auth returns (bool) {
    coinBalances[addr] = add(coinBalances[addr], amount);

    return true;
  }

  function subCoinBalance(address addr, uint amount) auth returns (bool) {
    coinBalances[addr] = sub(coinBalances[addr], amount);

    return true;
  }

  
  
  

  function tokenBalance(address addr) auth returns (uint) {
    return tokenBalances[addr];
  }

  function addTokenBalance(address addr, uint amount) auth returns (bool) {
    tokenBalances[addr] = add(tokenBalances[addr], amount);

    if (tokenBalances[addr] > 0 && !isOwnerAddress(addr)) {
      addOwnerAddress(addr);
    }

    return true;
  }

  function subTokenBalance(address addr, uint amount) auth returns (bool) {
    tokenBalances[addr] = sub(tokenBalances[addr], amount);

    if (tokenBalances[addr] <= 0) {
      removeOwnerAddress(addr);
    }

    return true;
  }

  
  
  

  function coinAllowance(address owner_, address spender) auth returns (uint) {
    return coinAllowances[owner_][spender];
  }

  function addCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = add(coinAllowances[owner_][spender], amount);

    return true;
  }

  function subCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = sub(coinAllowances[owner_][spender], amount);

    return true;
  }

  function setCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = amount;

    return true;
  }

  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    sig; 

    return  src == address(this) ||
            src == owner ||
            src == tokenAddress ||
            src == authorityAddress ||
            src == multiSigAddress;
  }
}

contract IkuraTokenEvent {
  /** オーナーがdJPYを鋳造した際に発火するイベント */
  event IkuraMint(address indexed owner, uint);

  /** オーナーがdJPYを消却した際に発火するイベント */
  event IkuraBurn(address indexed owner, uint);

  /** トークンの移動時に発火するイベント */
  event IkuraTransferToken(address indexed from, address indexed to, uint value);

  /** 手数料が発生したときに発火するイベント */
  event IkuraTransferFee(address indexed from, address indexed to, address indexed owner, uint value);

  event IkuraTransfer(address indexed from, address indexed to, uint value);

  /** 送金許可イベント */
  event IkuraApproval(address indexed owner, address indexed spender, uint value);
}

contract IkuraAssociation is DSMath, DSAuth {
  
  
  

  
  uint public confirmTotalTokenThreshold = 50;

  
  
  

  
  IkuraStorage _storage;
  IkuraToken _token;

  
  Proposal[] mintProposals;
  Proposal[] burnProposals;
  Proposal[] transferMinimumFeeProposals;
  Proposal[] transferFeeRateProposals;

  mapping (bytes32 => Proposal[]) proposals;

  struct Proposal {
    address proposer;                     
    bytes32 digest;                       
    bool executed;                        
    uint createdAt;                       
    uint expireAt;                        
    address[] confirmers;                 
    uint amount;                          
    uint8 transferMinimumFee;             
    uint transferFeeRate;                 
  }

  
  
  

  event MintProposalAdded(uint proposalId, address proposer, uint amount);
  event MintConfirmed(uint proposalId, address confirmer, uint amount);
  event MintExecuted(uint proposalId, address proposer, uint amount);

  event BurnProposalAdded(uint proposalId, address proposer, uint amount);
  event BurnConfirmed(uint proposalId, address confirmer, uint amount);
  event BurnExecuted(uint proposalId, address proposer, uint amount);

  event TransferMinimumFeeProposalAdded(uint proposalId, address proposer, uint8 transferMinimumFee);
  event TransferMinimumFeeConfirmed(uint proposalId, address confirmer, uint8 transferMinimumFee);
  event TransferMinimumFeeExecuted(uint proposalId, address proposer, uint8 transferMinimumFee);

  event TransferFeeRateProposalAdded(uint proposalId, address proposer, uint transferFeeRate);
  event TransferFeeRateConfirmed(uint proposalId, address confirmer, uint transferFeeRate);
  event TransferFeeRateExecuted(uint proposalId, address proposer, uint transferFeeRate);

  function IkuraAssociation() {
    proposals[sha3('mint')] = mintProposals;
    proposals[sha3('burn')] = burnProposals;
    proposals[sha3('transferMinimumFee')] = transferMinimumFeeProposals;
    proposals[sha3('transferFeeRate')] = transferFeeRateProposals;

  }

  function changeStorage(IkuraStorage newStorage) auth returns (bool) {
    _storage = newStorage;

    return true;
  }

  function changeToken(IkuraToken token_) auth returns (bool) {
    _token = token_;

    return true;
  }

  function newProposal(bytes32 type_, address proposer, uint amount, uint8 transferMinimumFee, uint transferFeeRate, bytes transationBytecode) returns (uint) {
    uint proposalId = proposals[type_].length++;
    Proposal proposal = proposals[type_][proposalId];
    proposal.proposer = proposer;
    proposal.amount = amount;
    proposal.transferMinimumFee = transferMinimumFee;
    proposal.transferFeeRate = transferFeeRate;
    proposal.digest = sha3(proposer, amount, transationBytecode);
    proposal.executed = false;
    proposal.createdAt = now;
    proposal.expireAt = proposal.createdAt + 86400;

    
    
    if (type_ == sha3('mint')) MintProposalAdded(proposalId, proposer, amount);
    if (type_ == sha3('burn')) BurnProposalAdded(proposalId, proposer, amount);
    if (type_ == sha3('transferMinimumFee')) TransferMinimumFeeProposalAdded(proposalId, proposer, transferMinimumFee);
    if (type_ == sha3('transferFeeRate')) TransferFeeRateProposalAdded(proposalId, proposer, transferFeeRate);

    
    confirmProposal(type_, proposer, proposalId);

    return proposalId;
  }

  function confirmProposal(bytes32 type_, address confirmer, uint proposalId) {
    Proposal proposal = proposals[type_][proposalId];

    
    if (hasConfirmed(type_, confirmer, proposalId)) throw;

    
    proposal.confirmers.push(confirmer);

    
    
    if (type_ == sha3('mint')) MintConfirmed(proposalId, confirmer, proposal.amount);
    if (type_ == sha3('burn')) BurnConfirmed(proposalId, confirmer, proposal.amount);
    if (type_ == sha3('transferMinimumFee')) TransferMinimumFeeConfirmed(proposalId, confirmer, proposal.transferMinimumFee);
    if (type_ == sha3('transferFeeRate')) TransferFeeRateConfirmed(proposalId, confirmer, proposal.transferFeeRate);

    if (isProposalExecutable(type_, proposalId, proposal.proposer, '')) {
      proposal.executed = true;

      
      
      if (type_ == sha3('mint')) executeMintProposal(proposalId);
      if (type_ == sha3('burn')) executeBurnProposal(proposalId);
      if (type_ == sha3('transferMinimumFee')) executeUpdateTransferMinimumFeeProposal(proposalId);
      if (type_ == sha3('transferFeeRate')) executeUpdateTransferFeeRateProposal(proposalId);
    }
  }

  function hasConfirmed(bytes32 type_, address addr, uint proposalId) returns (bool) {
    Proposal proposal = proposals[type_][proposalId];
    uint length = proposal.confirmers.length;

    for (uint i = 0; i < length; i++) {
      if (proposal.confirmers[i] == addr) return true;
    }

    return false;
  }

  function confirmedTotalToken(bytes32 type_, uint proposalId) returns (uint) {
    Proposal proposal = proposals[type_][proposalId];
    uint length = proposal.confirmers.length;
    uint total = 0;

    for (uint i = 0; i < length; i++) {
      total = add(total, _storage.tokenBalance(proposal.confirmers[i]));
    }

    return total;
  }

  function proposalExpireAt(bytes32 type_, uint proposalId) returns (uint) {
    Proposal proposal = proposals[type_][proposalId];
    return proposal.expireAt;
  }

  function isProposalExecutable(bytes32 type_, uint proposalId, address proposer, bytes transactionBytecode) returns (bool) {
    Proposal proposal = proposals[type_][proposalId];

    
    if (_storage.numOwnerAddress() < 2) {
      return true;
    }

    return  proposal.digest == sha3(proposer, proposal.amount, transactionBytecode) &&
            isProposalNotExpired(type_, proposalId) &&
            div(mul(100, confirmedTotalToken(type_, proposalId)), _storage.totalSupply()) > confirmTotalTokenThreshold;
  }

  function numberOfProposals(bytes32 type_) constant returns (uint) {
    return proposals[type_].length;
  }

  function numberOfActiveProposals(bytes32 type_) constant returns (uint) {
    uint numActiveProposal = 0;

    for(uint i = 0; i < proposals[type_].length; i++) {
      Proposal proposal = proposals[type_][i];

      if (isProposalNotExpired(type_, i)) {
        numActiveProposal++;
      }
    }

    return numActiveProposal;
  }

  function isProposalNotExpired(bytes32 type_, uint proposalId) internal returns (bool) {
    Proposal proposal = proposals[type_][proposalId];

    return  !proposal.executed &&
            now < proposal.expireAt;
  }

  function executeMintProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('mint')][proposalId];

    
    if (proposal.amount <= 0) throw;

    MintExecuted(proposalId, proposal.proposer, proposal.amount);

    
    _storage.addTotalSupply(proposal.amount);
    _storage.addCoinBalance(proposal.proposer, proposal.amount);
    _storage.addTokenBalance(proposal.proposer, proposal.amount);
  }

  function executeBurnProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('burn')][proposalId];

    
    if (proposal.amount <= 0) throw;
    if (_storage.coinBalance(proposal.proposer) < proposal.amount) throw;
    if (_storage.tokenBalance(proposal.proposer) < proposal.amount) throw;

    BurnExecuted(proposalId, proposal.proposer, proposal.amount);

    
    _storage.subTotalSupply(proposal.amount);
    _storage.subCoinBalance(proposal.proposer, proposal.amount);
    _storage.subTokenBalance(proposal.proposer, proposal.amount);
  }

  function executeUpdateTransferMinimumFeeProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('transferMinimumFee')][proposalId];

    if (proposal.transferMinimumFee < 0) throw;

    TransferMinimumFeeExecuted(proposalId, proposal.proposer, proposal.transferMinimumFee);

    _storage.setTransferMinimumFee(proposal.transferMinimumFee);
  }

  function executeUpdateTransferFeeRateProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('transferFeeRate')][proposalId];

    if (proposal.transferFeeRate < 0) throw;

    TransferFeeRateExecuted(proposalId, proposal.proposer, proposal.transferFeeRate);

    _storage.setTransferFeeRate(proposal.transferFeeRate);
  }

  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    sig; 

    return  src == address(this) ||
            src == owner ||
            src == address(_token);
  }
}
library ProposalLibrary {
  
  
  

  
  struct Entity {
    IkuraStorage _storage;
    IkuraAssociation _association;
  }

  function changeStorage(Entity storage self, address storage_) internal {
    self._storage = IkuraStorage(storage_);
  }

  function changeAssociation(Entity storage self, address association_) internal {
    self._association = IkuraAssociation(association_);
  }

  function updateTransferMinimumFee(Entity storage self, address sender, uint8 fee) returns (bool) {
    if (fee < 0) throw;

    self._association.newProposal(sha3('transferMinimumFee'), sender, 0, fee, 0, '');

    return true;
  }

  function updateTransferFeeRate(Entity storage self, address sender, uint rate) returns (bool) {
    if (rate < 0) throw;

    self._association.newProposal(sha3('transferFeeRate'), sender, 0, 0, rate, '');

    return true;
  }

  function mint(Entity storage self, address sender, uint amount) returns (bool) {
    if (amount <= 0) throw;

    self._association.newProposal(sha3('mint'), sender, amount, 0, 0, '');

    return true;
  }

  function burn(Entity storage self, address sender, uint amount) returns (bool) {
    if (amount <= 0) throw;
    if (self._storage.coinBalance(sender) < amount) throw;
    if (self._storage.tokenBalance(sender) < amount) throw;

    self._association.newProposal(sha3('burn'), sender, amount, 0, 0, '');

    return true;
  }

  function confirmProposal(Entity storage self, address sender, bytes32 type_, uint proposalId) {
    self._association.confirmProposal(type_, sender, proposalId);
  }

  function numberOfProposals(Entity storage self, bytes32 type_) constant returns (uint) {
    return self._association.numberOfProposals(type_);
  }
}

contract IkuraToken is IkuraTokenEvent, DSMath, DSAuth {
  
  
  

  /*using ProposalLibrary for ProposalLibrary.Entity;
  ProposalLibrary.Entity proposalEntity;*/

  
  
  

  
  IkuraStorage _storage;
  IkuraAssociation _association;

  function IkuraToken() DSAuth() {
    
    
    
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }

  function totalSupply(address sender) auth constant returns (uint) {
    sender; 

    return _storage.totalSupply();
  }

  function balanceOf(address sender, address addr) auth constant returns (uint) {
    sender; 

    return _storage.coinBalance(addr);
  }

  function transfer(address sender, address to, uint amount) auth returns (bool success) {
    uint fee = transferFee(sender, sender, to, amount);

    if (_storage.coinBalance(sender) < add(amount, fee)) throw;
    if (amount <= 0) throw;

    
    address owner = selectOwnerAddressForTransactionFee(sender);

    
    _storage.subCoinBalance(sender, add(amount, fee));

    
    _storage.addCoinBalance(to, amount);

    
    _storage.addCoinBalance(owner, fee);

    
    IkuraTransfer(sender, to, amount);
    IkuraTransferFee(sender, to, owner, fee);

    return true;
  }

  function transferFrom(address sender, address from, address to, uint amount) auth returns (bool success) {
    uint fee = transferFee(sender, from, to, amount);

    if (_storage.coinBalance(from) < amount) throw;
    if (_storage.coinAllowance(from, sender) < amount) throw;
    if (amount <= 0) throw;
    if (add(_storage.coinBalance(to), amount) <= _storage.coinBalance(to)) throw;
    if (_storage.coinBalance(sender) < fee) throw;

    
    address owner = selectOwnerAddressForTransactionFee(sender);

    
    _storage.subCoinBalance(sender, fee);

    
    _storage.subCoinBalance(from, amount);

    
    _storage.subCoinAllowance(from, sender, amount);

    
    _storage.addCoinBalance(to, amount);

    
    _storage.addCoinBalance(owner, fee);

    
    IkuraTransfer(from, to, amount);

    return true;
  }

  function approve(address sender, address spender, uint amount) auth returns (bool success) {
    _storage.setCoinAllowance(sender, spender, amount);

    
    IkuraApproval(sender, spender, amount);

    return true;
  }


  function allowance(address sender, address owner, address spender) auth constant returns (uint remaining) {
    sender; 

    return _storage.coinAllowance(owner, spender);
  }

  
  
  


  function tokenBalanceOf(address sender, address owner) auth constant returns (uint balance) {
    sender; 

    return _storage.tokenBalance(owner);
  }


  function transferToken(address sender, address to, uint amount) auth returns (bool success) {
    if (_storage.tokenBalance(sender) < amount ) throw;
    if (amount <= 0) throw;
    if (add(_storage.tokenBalance(to), amount) <= _storage.tokenBalance(to)) throw;

    _storage.subTokenBalance(sender, amount);
    _storage.addTokenBalance(to, amount);

    IkuraTransferToken(sender, to, amount);

    return true;
  }


  function transferFeeRate(address sender) auth constant returns (uint) {
    sender; 

    return _storage.transferFeeRate();
  }


  function transferMinimumFee(address sender) auth constant returns (uint8) {
    sender; 

    return _storage.transferMinimumFee();
  }


  function transferFee(address sender, address from, address to, uint amount) auth returns (uint) {
    from; to; 

    uint rate = transferFeeRate(sender);
    uint denominator = 1000000; 
    uint numerator = mul(amount, rate);

    uint fee = div(numerator, denominator);
    uint remainder = sub(numerator, mul(denominator, fee));

    
    if (remainder > 0) {
      fee++;
    }

    if (fee < transferMinimumFee(sender)) {
      fee = transferMinimumFee(sender);
    }

    return fee;
  }


  function updateTransferMinimumFee(address sender, uint8 fee) auth returns (bool) {
    if (fee < 0) throw;

    _association.newProposal(sha3('transferMinimumFee'), sender, 0, fee, 0, '');
    return true;

    /*return proposalEntity.updateTransferMinimumFee(sender, fee);*/
  }


  function updateTransferFeeRate(address sender, uint rate) auth returns (bool) {
    if (rate < 0) throw;

    _association.newProposal(sha3('transferFeeRate'), sender, 0, 0, rate, '');
    return true;

    /*return proposalEntity.updateTransferFeeRate(sender, rate);*/
  }


  function selectOwnerAddressForTransactionFee(address sender) auth returns (address) {
    sender; 

    return _storage.primaryOwner();
  }

  function mint(address sender, uint amount) auth returns (bool) {
    if (amount <= 0) throw;

    _association.newProposal(sha3('mint'), sender, amount, 0, 0, '');

    /*return proposalEntity.mint(sender, amount);*/
  }


  function burn(address sender, uint amount) auth returns (bool) {
    if (amount <= 0) throw;
    if (_storage.coinBalance(sender) < amount) throw;
    if (_storage.tokenBalance(sender) < amount) throw;

    _association.newProposal(sha3('burn'), sender, amount, 0, 0, '');
    /*return proposalEntity.burn(sender, amount);*/
  }

  function confirmProposal(address sender, bytes32 type_, uint proposalId) auth {
    _association.confirmProposal(type_, sender, proposalId);
    /*proposalEntity.confirmProposal(sender, type_, proposalId);*/
  }


  function numberOfProposals(bytes32 type_) constant returns (uint) {
    return _association.numberOfProposals(type_);
    /*return proposalEntity.numberOfProposals(type_);*/
  }


  function changeAssociation(address association_) auth returns (bool) {
    _association = IkuraAssociation(association_);
    /*proposalEntity.changeAssociation(_association);*/

    return true;
  }


  function changeStorage(address storage_) auth returns (bool) {
    _storage = IkuraStorage(storage_);
    /*proposalEntity.changeStorage(_storage);*/

    return true;
  }


  function logicVersion(address sender) auth constant returns (uint) {
    sender; 

    return 1;
  }
}


contract IkuraAuthority is DSAuthority, DSAuth {
  
  IkuraStorage tokenStorage;

  
  
  mapping(bytes4 => bool) actionsWithToken;

  
  mapping(bytes4 => bool) actionsForbidden;

  
  
  
  function IkuraAuthority() DSAuth() {
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }


  function changeStorage(address storage_) auth {
    tokenStorage = IkuraStorage(storage_);

    
    actionsWithToken[stringToSig('mint(uint256)')] = true;
    actionsWithToken[stringToSig('burn(uint256)')] = true;
    actionsWithToken[stringToSig('updateTransferMinimumFee(uint8)')] = true;
    actionsWithToken[stringToSig('updateTransferFeeRate(uint256)')] = true;
    actionsWithToken[stringToSig('confirmProposal(string, uint256)')] = true;
    actionsWithToken[stringToSig('numberOfProposals(string)')] = true;

    
    actionsForbidden[stringToSig('forbiddenAction()')] = true;
  }

  function canCall(address src, address dst, bytes4 sig) constant returns (bool) {
    
    if (actionsWithToken[sig]) return canCallWithAssociation(src, dst);

    
    if (actionsForbidden[sig]) return canCallWithNoOne();

    
    return canCallDefault(src);
  }

  function canCallDefault(address src) internal constant returns (bool) {
    return tokenStorage.isOwnerAddress(src);
  }


  function canCallWithAssociation(address src, address dst) internal returns (bool) {
    
    dst;

    return tokenStorage.isOwnerAddress(src) &&
           (tokenStorage.numOwnerAddress() == 1 || tokenStorage.tokenBalance(src) > 0);
  }


  function canCallWithNoOne() internal constant returns (bool) {
    return false;
  }


  function stringToSig(string str) internal constant returns (bytes4) {
    return bytes4(sha3(str));
  }
}


contract IkuraController is ERC20, DSAuth {
  
  
  

  
  string public name = "XJP 0.6.0";

  
  string public constant symbol = "XJP";

  
  uint8 public constant decimals = 0;

  
  
  

  
  
  IkuraToken private token;

  
  IkuraStorage private tokenStorage;

  
  IkuraAuthority private authority;

  
  IkuraAssociation private association;

  
  
  

  function totalSupply() constant returns (uint) {
    return token.totalSupply(msg.sender);
  }

  function balanceOf(address addr) constant returns (uint) {
    return token.balanceOf(msg.sender, addr);
  }

  function transfer(address to, uint amount) returns (bool) {
    if (token.transfer(msg.sender, to, amount)) {
      Transfer(msg.sender, to, amount);

      return true;
    } else {
      return false;
    }
  }

  function transferFrom(address from, address to, uint amount) returns (bool) {
    if (token.transferFrom(msg.sender, from, to, amount)) {
      Transfer(from, to, amount);

      return true;
    } else {
      return false;
    }
  }

  function approve(address spender, uint amount) returns (bool) {
    if (token.approve(msg.sender, spender, amount)) {
      Approval(msg.sender, spender, amount);

      return true;
    } else {
      return false;
    }
  }

  function allowance(address addr, address spender) constant returns (uint) {
    return token.allowance(msg.sender, addr, spender);
  }

  
  
  

  function tokenBalanceOf(address addr) constant returns (uint) {
    return token.tokenBalanceOf(msg.sender, addr);
  }

  function transferToken(address to, uint amount) returns (bool) {
    return token.transferToken(msg.sender, to, amount);
  }

  function transferFeeRate() constant returns (uint) {
    return token.transferFeeRate(msg.sender);
  }

  function transferMinimumFee() constant returns (uint8) {
    return token.transferMinimumFee(msg.sender);
  }

  function transferFee(address from, address to, uint amount) returns (uint) {
    return token.transferFee(msg.sender, from, to, amount);
  }

  

  function updateTransferMinimumFee(uint8 minimumFee) auth returns (bool) {
    return token.updateTransferMinimumFee(msg.sender, minimumFee);
  }

  function updateTransferFeeRate(uint feeRate) auth returns (bool) {
    return token.updateTransferFeeRate(msg.sender, feeRate);
  }

  function mint(uint amount) auth returns (bool) {
    return token.mint(msg.sender, amount);
  }

  function burn(uint amount) auth returns (bool) {
    return token.burn(msg.sender, amount);
  }

  function isOwner(address addr) auth returns (bool) {
    return tokenStorage.isOwnerAddress(addr);
  }


  function confirmProposal(string type_, uint proposalId) auth {
    token.confirmProposal(msg.sender, sha3(type_), proposalId);
  }

  function numOwnerAddress() auth constant returns (uint) {
    return tokenStorage.numOwnerAddress();
  }


  function numberOfProposals(string type_) auth constant returns (uint) {
    return token.numberOfProposals(sha3(type_));
  }

  
  
  


  function setup(address storageAddress, address tokenAddress, address authorityAddress, address associationAddress) auth {
    changeStorage(storageAddress);
    changeToken(tokenAddress);
    changeAuthority(authorityAddress);
    changeAssociation(associationAddress);
  }


  function changeToken(address tokenAddress) auth {
    
    token = IkuraToken(tokenAddress);

    
    tokenStorage.changeToken(token);
    token.changeStorage(tokenStorage);

    
    if (association != address(0)) {
      association.changeToken(token);
      token.changeAssociation(association);
    }
  }

  function changeStorage(address storageAddress) auth {
    
    tokenStorage = IkuraStorage(storageAddress);
  }


  function changeAuthority(address authorityAddress) auth {
    
    authority = IkuraAuthority(authorityAddress);
    setAuthority(authority);

    
    authority.changeStorage(tokenStorage);
    tokenStorage.changeAuthority(authority);
  }

  function changeAssociation(address associationAddress) auth {
    
    association = IkuraAssociation(associationAddress);

    
    association.changeStorage(tokenStorage);
    tokenStorage.changeAssociation(association);

    
    if (token != address(0)) {
      association.changeToken(token);
      token.changeAssociation(association);
    }
  }


  function forbiddenAction() auth returns (bool) {
    return true;
  }

 
  function logicVersion() constant returns (uint) {
    return token.logicVersion(msg.sender);
  }


  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    return  src == address(this) ||
            src == owner ||
            authority.canCall(src, this, sig);
  }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferToken","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authorityAddress","type":"address"}],"name":"changeAuthority","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"logicVersion","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transferFeeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"type_","type":"string"},{"name":"proposalId","type":"uint256"}],"name":"confirmProposal","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"feeRate","type":"uint256"}],"name":"updateTransferFeeRate","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"storageAddress","type":"address"},{"name":"tokenAddress","type":"address"},{"name":"authorityAddress","type":"address"},{"name":"associationAddress","type":"address"}],"name":"setup","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"tokenAddress","type":"address"}],"name":"changeToken","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"numOwnerAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transferMinimumFee","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"forbiddenAction","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"associationAddress","type":"address"}],"name":"changeAssociation","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"storageAddress","type":"address"}],"name":"changeStorage","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"minimumFee","type":"uint8"}],"name":"updateTransferMinimumFee","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"type_","type":"string"}],"name":"numberOfProposals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"tokenBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6060604052604060405190810160405280600981526020017f584a5020302e362e3000000000000000000000000000000000000000000000008152506002908051906020019062000052929190620000e2565b505b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405180905060405180910390a25b62000191565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200012557805160ff191683800117855562000156565b8280016001018555821562000156579182015b828111156200015557825182559160200191906001019062000138565b5b50905062000165919062000169565b5090565b6200018e91905b808211156200018a57600081600090555060010162000170565b5090565b90565b61356680620001a16000396000f3006060604052361561019f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146101a1578063095ea7b31461023a5780631072cbea14610291578063116877cc146102e857806313af40351461031e57806318160ddd146103545780631946fdf41461037a57806323b872dd146103a05780632f54bf6e14610416578063313ce56714610464578063351bf5181461049057806342966c68146104b65780634fad404a146104ee578063548d4a541461055157806354c35a3c1461058957806359d5d02a1461061c57806366829b161461068e57806370a08231146106c45780637a9e5e4b1461070e5780637aa306a21461074457806388bf60b71461076a5780638da5cb5b1461079657806395d89b41146107e8578063a0712d6814610881578063a9059cbb146108b9578063b3350f0314610910578063bf29b90a1461093a578063bf7e214f14610970578063c50c97d0146109c2578063dd62ed3e146109f8578063df49dfe314610a61578063e35f025414610a9c578063e42c08f214610b0a575bfe5b34156101a957fe5b6101b1610b54565b6040518080602001828103825283818151815260200191508051906020019080838360008314610200575b805182526020831115610200576020820191506020810190506020830392506101dc565b505050905090810190601f16801561022c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561024257fe5b610277600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bf2565b604051808215151515815260200191505060405180910390f35b341561029957fe5b6102ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610d8d565b604051808215151515815260200191505060405180910390f35b34156102f057fe5b61031c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b005b341561032657fe5b610352600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112d565b005b341561035c57fe5b610364611211565b6040518082815260200191505060405180910390f35b341561038257fe5b61038a6112f3565b6040518082815260200191505060405180910390f35b34156103a857fe5b6103fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113d5565b604051808215151515815260200191505060405180910390f35b341561041e57fe5b61044a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115a5565b604051808215151515815260200191505060405180910390f35b341561046c57fe5b6104746116c0565b604051808260ff1660ff16815260200191505060405180910390f35b341561049857fe5b6104a06116c5565b6040518082815260200191505060405180910390f35b34156104be57fe5b6104d460048080359060200190919050506117a7565b604051808215151515815260200191505060405180910390f35b34156104f657fe5b61054f600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080359060200190919050506118ca565b005b341561055957fe5b61056f6004808035906020019091905050611a48565b604051808215151515815260200191505060405180910390f35b341561059157fe5b61061a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b6b565b005b341561062457fe5b610678600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611bcd565b6040518082815260200191505060405180910390f35b341561069657fe5b6106c2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d23565b005b34156106cc57fe5b6106f8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506121db565b6040518082815260200191505060405180910390f35b341561071657fe5b610742600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506122f3565b005b341561074c57fe5b6107546123d7565b6040518082815260200191505060405180910390f35b341561077257fe5b61077a6124bc565b604051808260ff1660ff16815260200191505060405180910390f35b341561079e57fe5b6107a661259e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107f057fe5b6107f86125c4565b6040518080602001828103825283818151815260200191508051906020019080838360008314610847575b80518252602083111561084757602082019150602081019050602083039250610823565b505050905090810190601f1680156108735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561088957fe5b61089f60048080359060200190919050506125fe565b604051808215151515815260200191505060405180910390f35b34156108c157fe5b6108f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612721565b604051808215151515815260200191505060405180910390f35b341561091857fe5b6109206128bc565b604051808215151515815260200191505060405180910390f35b341561094257fe5b61096e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506128fd565b005b341561097857fe5b610980612db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ca57fe5b6109f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ddb565b005b3415610a0057fe5b610a4b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612e57565b6040518082815260200191505060405180910390f35b3415610a6957fe5b610a82600480803560ff16906020019091905050612fa4565b604051808215151515815260200191505060405180910390f35b3415610aa457fe5b610af4600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506130cd565b6040518082815260200191505060405180910390f35b3415610b1257fe5b610b3e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613224565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bea5780601f10610bbf57610100808354040283529160200191610bea565b820191906000526020600020905b815481529060010190602001808311610bcd57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1f21c673385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610cf257fe5b6102c65a03f11515610d0057fe5b5050506040518051905015610d7d578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a360019050610d87565b60009050610d87565b5b92915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f5537ede3385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610e8d57fe5b6102c65a03f11515610e9b57fe5b5050506040518051905090505b92915050565b610ee4610edf336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166122f3565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561102b57fe5b6102c65a03f1151561103957fe5b505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663116877cc600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561111757fe5b6102c65a03f1151561112557fe5b5050505b5b50565b61116361115e336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405180905060405180910390a25b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4dc2aa4336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156112d557fe5b6102c65a03f115156112e357fe5b5050506040518051905090505b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8a582af336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156113b757fe5b6102c65a03f115156113c557fe5b5050506040518051905090505b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea338686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b151561150957fe5b6102c65a03f1151561151757fe5b5050506040518051905015611594578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905061159e565b6000905061159e565b5b9392505050565b60006115dd6115d8336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2e1a8d8836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561169f57fe5b6102c65a03f115156116ad57fe5b5050506040518051905090505b5b919050565b600081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358cf9570336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561178957fe5b6102c65a03f1151561179757fe5b5050506040518051905090505b90565b60006117df6117da336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156118a957fe5b6102c65a03f115156118b757fe5b5050506040518051905090505b5b919050565b6119006118fb336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb9734fc33846040518082805190602001908083835b602083106119735780518252602082019150602081019050602083039250611950565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600019166000191681526020018281526020019350505050600060405180830381600087803b1515611a3157fe5b6102c65a03f11515611a3f57fe5b5050505b5b5050565b6000611a80611a7b336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166325f0f46733846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611b4a57fe5b6102c65a03f11515611b5857fe5b5050506040518051905090505b5b919050565b611ba1611b9c336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b611baa84612ddb565b611bb383611d23565b611bbc82610eae565b611bc5816128fd565b5b5b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b76a25c338686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611d0157fe5b6102c65a03f11515611d0f57fe5b5050506040518051905090505b9392505050565b611d59611d54336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1515611e7557fe5b6102c65a03f11515611e8357fe5b505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611f6a57fe5b6102c65a03f11515611f7857fe5b5050506040518051905050600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156121d657600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156120bf57fe5b6102c65a03f115156120cd57fe5b5050506040518051905050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156121bc57fe5b6102c65a03f115156121ca57fe5b50505060405180519050505b5b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7888aec33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156122d357fe5b6102c65a03f115156122e157fe5b5050506040518051905090505b919050565b612329612324336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405180905060405180910390a25b5b50565b600061240f61240a336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637aa306a26000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401809050602060405180830381600087803b151561249d57fe5b6102c65a03f115156124ab57fe5b5050506040518051905090505b5b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663112fbe9b336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561258057fe5b6102c65a03f1151561258e57fe5b5050506040518051905090505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b604060405190810160405280600381526020017f584a50000000000000000000000000000000000000000000000000000000000081525081565b6000612636612631336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561270057fe5b6102c65a03f1151561270e57fe5b5050506040518051905090505b5b919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc83385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561282157fe5b6102c65a03f1151561282f57fe5b50505060405180519050156128ac578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190506128b6565b600090506128b6565b5b92915050565b60006128f46128ef336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600190505b5b90565b61293361292e336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a5857fe5b6102c65a03f11515612a6657fe5b5050506040518051905050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1515612b4c57fe5b6102c65a03f11515612b5a57fe5b505050600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612db057600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612c9957fe5b6102c65a03f11515612ca757fe5b5050506040518051905050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612d9657fe5b6102c65a03f11515612da457fe5b50505060405180519050505b5b5b50565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612e11612e0c336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663927da1053385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050602060405180830381600087803b1515612f8357fe5b6102c65a03f11515612f9157fe5b5050506040518051905090505b92915050565b6000612fdc612fd7336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663915a405f33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff16815260200192505050602060405180830381600087803b15156130ac57fe5b6102c65a03f115156130ba57fe5b5050506040518051905090505b5b919050565b6000613105613100336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663796d67da836040518082805190602001908083835b602083106131775780518252602082019150602081019050602083039250613154565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561320357fe5b6102c65a03f1151561321157fe5b5050506040518051905090505b5b919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631bea800633846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561331c57fe5b6102c65a03f1151561332a57fe5b5050506040518051905090505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806133c55750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806135205750600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b70096138430856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019350505050602060405180830381600087803b151561350757fe5b6102c65a03f1151561351557fe5b505050604051805190505b90505b92915050565b8015156135365760006000fd5b5b505600a165627a7a72305820792b492909f01c0cd2478bd5bec8959d698c39f31179b42ec9e3d9207e604d8a0029

   Swarm Source:
bzzr://792b492909f01c0cd2478bd5bec8959d698c39f31179b42ec9e3d9207e604d8a

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.