ETH Price: $3,486.63 (+2.31%)
Gas: 12 Gwei

Contract

0xd5AD2e51b4CcDc949067c73767819477E3A129fB
 

Overview

ETH Balance

0.011000001000000001 ETH

Eth Value

$38.35 (@ $3,486.63/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw ETH76210942019-04-23 2:14:551896 days ago1555985695IN
0xd5AD2e51...7E3A129fB
0 ETH0.000170953
Deposit ETH76210902019-04-23 2:14:301896 days ago1555985670IN
0xd5AD2e51...7E3A129fB
0.00553732 ETH0.000239143
Withdraw ETH75885322019-04-18 0:32:471901 days ago1555547567IN
0xd5AD2e51...7E3A129fB
0 ETH0.000170953
Deposit ETH75884822019-04-18 0:21:041901 days ago1555546864IN
0xd5AD2e51...7E3A129fB
0.001 ETH0.000422323
Limit Order75381152019-04-10 4:16:411909 days ago1554869801IN
0xd5AD2e51...7E3A129fB
0 ETH0.000642783
Deposit Withdraw...75379722019-04-10 3:37:241909 days ago1554867444IN
0xd5AD2e51...7E3A129fB
0 ETH0.000272573
Deposit ETH75378292019-04-10 3:03:441909 days ago1554865424IN
0xd5AD2e51...7E3A129fB
0.001 ETH0.000398585
Limit Order75377572019-04-10 2:46:101909 days ago1554864370IN
0xd5AD2e51...7E3A129fB
0 ETH0.000407082
Deposit Withdraw...75377272019-04-10 2:41:051909 days ago1554864065IN
0xd5AD2e51...7E3A129fB
0 ETH0.000363832
Set Product Info75376992019-04-10 2:36:001909 days ago1554863760IN
0xd5AD2e51...7E3A129fB
0 ETH0.000090553
Add Product75376152019-04-10 2:17:371909 days ago1554862657IN
0xd5AD2e51...7E3A129fB
1 wei0.000293192.2
Set Product Fee75372462019-04-10 0:55:071909 days ago1554857707IN
0xd5AD2e51...7E3A129fB
0 ETH0.000137255
Add Owner75283192019-04-08 15:36:541911 days ago1554737814IN
0xd5AD2e51...7E3A129fB
0 ETH0.000183372
Deposit ETH74642342019-03-29 15:39:331921 days ago1553873973IN
0xd5AD2e51...7E3A129fB
0.01 ETH0.000129432
Deposit ETH74642332019-03-29 15:39:311921 days ago1553873971IN
0xd5AD2e51...7E3A129fB
0 ETH0.000189432
Set Taker Fee Ra...74642292019-03-29 15:38:381921 days ago1553873918IN
0xd5AD2e51...7E3A129fB
0 ETH0.000085312
Set Product Fee74642292019-03-29 15:38:381921 days ago1553873918IN
0xd5AD2e51...7E3A129fB
0 ETH0.000085542
Set Product Info74642272019-03-29 15:38:291921 days ago1553873909IN
0xd5AD2e51...7E3A129fB
0 ETH0.000059342
Set Product Info74642252019-03-29 15:38:051921 days ago1553873885IN
0xd5AD2e51...7E3A129fB
0 ETH0.000059472
Set Product Info74640962019-03-29 15:08:571921 days ago1553872137IN
0xd5AD2e51...7E3A129fB
0 ETH0.000059472
Set Product Info74640872019-03-29 15:07:061921 days ago1553872026IN
0xd5AD2e51...7E3A129fB
0 ETH0.000059472
Set Product Info74638162019-03-29 13:59:361921 days ago1553867976IN
0xd5AD2e51...7E3A129fB
0 ETH0.000059472
Set Product Info74638022019-03-29 13:57:171921 days ago1553867837IN
0xd5AD2e51...7E3A129fB
0 ETH0.00008923
Add Owner74637682019-03-29 13:51:221921 days ago1553867482IN
0xd5AD2e51...7E3A129fB
0 ETH0.000275053
Add Product74637502019-03-29 13:45:521921 days ago1553867152IN
0xd5AD2e51...7E3A129fB
0 ETH0.000236542
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
76210942019-04-23 2:14:551896 days ago1555985695
0xd5AD2e51...7E3A129fB
0.00553732 ETH
75885322019-04-18 0:32:471901 days ago1555547567
0xd5AD2e51...7E3A129fB
0.001 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DEX

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-03-29
*/

pragma solidity ^0.4.25;

 /*
  * @title: SafeMath
  * @dev: Helper contract functions to arithmatic operations safely.
  */
contract SafeMath {
  function Sub(uint128 a, uint128 b) pure public returns (uint128) {
    assert(b <= a);
    return a - b;
  }

  function Add(uint128 a, uint128 b) pure public returns (uint128) {
    uint128 c = a + b;
    assert(c>=a && c>=b);
    return c;
  }
}

 /*
  * @title: Token
  * @dev: Interface contract for ERC20 tokens
  */
contract Token {
  function totalSupply() public view returns (uint256 supply);
  function balanceOf(address _owner) public view returns (uint256 balance);
  function transfer(address _to, uint256 _value) public returns (bool success);
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
  function approve(address _spender, uint256 _value) public returns (bool success);
  function allowance(address _owner, address _spender) public view returns (uint256 remaining);
  event Transfer(address indexed _from, address indexed _to, uint256 _value);
  event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

 /*
  * @title: Dex
  * @author Dexhigh Services Pvt. Ltd (https://www.dexhigh.com)
  * @dev The Dex Contract implement all the required functionalities viz order sharing, local exchange etc.
  */
contract DEX is SafeMath
{
    uint32 public lastTransferId = 1;

    // Events
    event NewDeposit(uint32 indexed exId, uint32  prCode, uint32 indexed accountId, uint128 amount, uint64 timestamp, uint32 lastTransferId);
    event NewWithdraw(uint32 indexed exId, uint32  prCode, uint32 indexed accountId, uint128 amount, uint64 timestamp, uint32 lastTransferId);
    uint32 public lastNewOrderId = 1;
    event NewOrder(uint32 indexed prTrade, uint32 indexed prBase, uint32 indexed accountId, uint32 id, bool isSell, uint80 price, uint104 qty, uint32 lastNewOrderId);
    event NewCancel(uint32 indexed prTrade, uint32 indexed prBase, uint32 indexed accountId, uint32 id, bool isSell, uint80 price, uint104 qt, uint32 lastNewOrderId);
    event NewBestBidAsk(uint32 indexed prTrade, uint32 indexed prBase, bool isBid, uint80 price);
    uint32 public lastTradeId = 1;
    event NewTrade(uint32 indexed prTrade, uint32 prBase, uint32 indexed bidId, uint32 indexed askId, uint32 accountIdBid, uint32 accountIdAsk, bool isSell, uint80 price, uint104 qty, uint32 lastTradeId, uint64 timestamp);

    // basePrice, All the prices will be "based" by basePrice
    uint256 public constant basePrice = 10000000000;
    uint80 public constant maxPrice = 10000000000000000000001;
    uint104 public constant maxQty = 1000000000000000000000000000001;
    uint128 public constant maxBalance = 1000000000000000000000000000000000001;
    bool public isContractUse = true;

    //No Args constructor will add msg.sender as owner/operator
    // Add ETH product
    constructor() public
    {
        owner = msg.sender;
        operator = owner;
        AddOwner(msg.sender);
        AddProduct(18, 0x0);
        //lastProductId = 1; // productId == 1 -> ETH 0x0
    }

    address public owner;
    // Functions with this modifier can only be executed by the owner
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    address public operator;
    // Functions with this modifier can only be executed by the operator
    modifier onlyOperator() {
        require(msg.sender == operator);
        _;
    }
    function transferOperator(address _operator) onlyOwner public {
        operator = _operator;
    }

    // Functions with this modifier can only be executed by the owner of each exchange
    modifier onlyExOwner()  {
        require(owner_id[msg.sender] != 0);
        _;
    }

    // Functions with this modifier can only be executed when this contract is not abandoned
    modifier onlyContractUse {
        require(isContractUse == true);
        _;
    }

    uint32 public lastOwnerId;
    mapping (uint32 => address) id_owner;
    mapping (address => uint32) owner_id;
    mapping (uint32 => uint8) ownerId_takerFeeRateLocal;
    mapping (uint32 => uint32) ownerId_accountId;

    //Delete the owner of exchange
    function DeleteOwner(uint32 exId) onlyOperator public
    {
        require(lastOwnerId >= exId && exId > 0);
        owner_id[id_owner[exId]] = 0;
    }

    //Add Owner of exchange
    function AddOwner(address newOwner) onlyOperator public
    {
        require(owner_id[newOwner] == 0);

        owner_id[newOwner] = ++lastOwnerId;
        id_owner[lastOwnerId] = newOwner;

        ownerId_accountId[lastOwnerId] = FindOrAddAccount();
    }
    //Get exchange owner list and id
    function GetOwnerList() view public returns (address[] owners, uint32[] ownerIds)
    {
        owners = new address[](lastOwnerId);
        ownerIds = new uint32[](lastOwnerId);

        for (uint32 i = 1; i <= lastOwnerId; i++)
        {
            owners[i - 1] = id_owner[i];
            ownerIds[i - 1] = i;
        }
    }
    //Set local exchange fee
    function setTakerFeeRateLocal(uint8 _takerFeeRate) public
    {
        require (_takerFeeRate <= 100);// takerFeeRate cannot be more than 1%
        uint32 ownerId = owner_id[msg.sender];
        require(ownerId != 0);
        ownerId_takerFeeRateLocal[ownerId] = _takerFeeRate;//bp
    }
    // Get fee Rate for an exchange with owner id == ownerId
    function getTakerFeeRateLocal(uint32 ownerId) public view returns (uint8)
    {
        return ownerId_takerFeeRateLocal[ownerId];//bp
    }

    //Air Drop events
    function airDrop(uint32 exId, uint32 prCode, uint32[] accountIds, uint104[] qtys) onlyExOwner public
    {
        uint32 accountId = FindOrRevertAccount();
        require(accountId_freeze[accountId] == false);
        uint256 n = accountIds.length;
        require(n == qtys.length);

        uint128 sum = 0;
        for (uint32 i = 0; i < n; i++)
        {
            sum += qtys[i];
        }

        exId_prCode_AccountId_Balance[exId][prCode][accountId].available = Sub(exId_prCode_AccountId_Balance[exId][prCode][accountId].available, sum);

        for (i = 0; i < n; i++)
        {
            exId_prCode_AccountId_Balance[exId][prCode][accountIds[i]].available += qtys[i];
            // exId_prCode_AccountId_Balance[exId][prCode][accountIds[i]].available >> qtys[i]
            // 2^128 >> 2^104 -> minimum 2^24 times of airdrop need for overflow (hard to imagine)
            // because prCode_AccountId_Balance[prCode][accountIds[i]].available restircted by maxBalance in deposit function
        }
    }

    //information of product
    struct ProductInfo
    {
        uint256 divider;
        bool isTradeBid;
        bool isTradeAsk;
        bool isDeposit;
        bool isWithdraw;
        uint32 ownerId;
        uint104 minQty;
    }

    uint32 public lastProductId;
    uint256 public newProductFee;
    mapping (uint32 => address) prCode_product;
    mapping (address => uint32) product_prCode;
    mapping (uint32 => ProductInfo) prCode_productInfo;

    // Add product by exchange owner
    function AddProduct(uint256 decimals, address product) payable onlyExOwner public
    {
        require(msg.value >= newProductFee || msg.sender == operator);
        require(product_prCode[product] == 0);
        require(decimals <= 18);

        product_prCode[product] = ++lastProductId;
        prCode_product[lastProductId] = product;

        ProductInfo memory productInfo;
        productInfo.divider = 10 ** decimals; // max = 10 ^ 18 because of require(decimals <= 18);
        productInfo.ownerId = owner_id[msg.sender];
        prCode_productInfo[lastProductId] = productInfo;

        exId_prCode_AccountId_Balance[1][1][ownerId_accountId[1]].available += uint128(msg.value); //eth transfer < 2^128
    }
    // Set Product Information
    function SetProductInfo(uint32 prCode, bool isTradeBid, bool isTradeAsk, bool isDeposit, bool isWithdraw, uint104 _minQty, uint32 exId) public
    {
        ProductInfo storage prInfo = prCode_productInfo[prCode];

        require(msg.sender == operator || owner_id[msg.sender] == prInfo.ownerId );

        prInfo.isTradeBid = isTradeBid;
        prInfo.isTradeAsk = isTradeAsk;
        prInfo.isDeposit = isDeposit;
        prInfo.isWithdraw = isWithdraw;
        prInfo.minQty = _minQty;
        prInfo.ownerId = exId;
    }
    // Set product listing fee
    function SetProductFee(uint256 productFee) onlyOperator public
    {
        newProductFee = productFee;
    }
    // Get product address and id
    function GetProductList() view public returns (address[] products, uint32[] productIds)
    {
        products = new address[](lastProductId);
        productIds = new uint32[](lastProductId);

        for (uint32 i = 1; i <= lastProductId; i++)
        {
            products[i - 1] = prCode_product[i];
            productIds[i - 1] = i;
        }
    }
    // Get infromation of product
    function GetProductInfo(address product) view public returns (uint32 prCode, uint256 divider, bool isTradeBid, bool isTradeAsk, bool isDeposit, bool isWithdraw, uint32 ownerId, uint104 minQty)
    {
        prCode = product_prCode[product];

        divider = prCode_productInfo[prCode].divider;
        isTradeBid = prCode_productInfo[prCode].isTradeBid;
        isTradeAsk = prCode_productInfo[prCode].isTradeAsk;
        isDeposit = prCode_productInfo[prCode].isDeposit;
        isWithdraw = prCode_productInfo[prCode].isWithdraw;
        ownerId = prCode_productInfo[prCode].ownerId;
        minQty = prCode_productInfo[prCode].minQty;
    }

    uint32 public lastAcccountId;
    mapping (uint32 => uint8) id_announceLV;
    //Each announceLV open information as
    //0: None, 1: Trade, 2:Balance, 3:DepositWithdrawal, 4:OpenOrder
    mapping (uint32 => address) id_account;
    mapping (uint32 => bool) accountId_freeze;
    mapping (address => uint32) account_id;
    // Find or add account
    function FindOrAddAccount() private returns (uint32)
    {
        if (account_id[msg.sender] == 0)
        {
            account_id[msg.sender] = ++lastAcccountId;
            id_account[lastAcccountId] = msg.sender;
        }
        return account_id[msg.sender];
    }
    // Find or revert account
    function FindOrRevertAccount() private view returns (uint32)
    {
        uint32 accountId = account_id[msg.sender];
        require(accountId != 0);
        return accountId;
    }
    // Get account id of msg sender
    function GetMyAccountId() view public returns (uint32)
    {
        return account_id[msg.sender];
    }
    // Get account id of any users
    function GetAccountId(address account) view public returns (uint32)
    {
        return account_id[account];
    }
    // Get account announcement level
    function GetMyAnnounceLV() view public returns (uint32)
    {
        return id_announceLV[account_id[msg.sender]];
    }
    // Set account announce level
    function ChangeAnnounceLV(uint8 announceLV) public
    {
        id_announceLV[FindOrRevertAccount()] = announceLV;
    }
    // Freeze or unfreez of account
    function SetFreezeByAddress(bool isFreeze, address account) onlyOperator public
    {
        uint32 accountId = account_id[account];

        if (accountId != 0)
        {
            accountId_freeze[accountId] = isFreeze;
        }
    }

    // reserved: Balance held up in orderBook
    // available: Balance available for trade
    struct Balance
    {
        uint128 reserved;
        uint128 available;
    }

    struct ListItem
    {
        uint32 prev;
        uint32 next;
    }

    struct OrderLink
    {
        uint32 firstId;
        uint32 lastId;
        uint80 nextPrice;
        uint80 prevPrice;
        mapping (uint32 => ListItem) id_orderList;
    }

    struct Order
    {
        uint32 exId;
        uint32 accountId;
        uint32 prTrade;
        uint32 prBase;
        uint104 qty;
        uint80 price;
        bool isSell;
    }

    uint32 public lastOrderId;
    mapping (uint32 => Order) id_Order;

    //orderbook information
    struct OrderBook
    {
        uint8 tickSize;

        uint80 bestBidPrice;
        uint80 bestAskPrice;

        mapping (uint80 => OrderLink) bidPrice_Order;
        mapping (uint80 => OrderLink) askPrice_Order;
    }
    mapping (uint32 => mapping (uint32 => OrderBook)) basePID_tradePID_orderBook;
    function SetOrderBookTickSize(uint32 prTrade, uint32 prBase, uint8 _tickSize) onlyOperator public
    {
        basePID_tradePID_orderBook[prBase][prTrade].tickSize = _tickSize;
    }

    mapping (uint32 => mapping (uint32 => mapping (uint32 => Balance))) exId_prCode_AccountId_Balance;

    // open order list
    struct OpenOrder
    {
        uint32 startId;
        mapping(uint32 => ListItem) id_orderList;
    }
    mapping(uint32 => OpenOrder) accountId_OpenOrder;
    function AddOpenOrder(uint32 accountId, uint32 orderId) private
    {
        OpenOrder memory openOrder = accountId_OpenOrder[accountId];

        if (openOrder.startId != 0)
        {
            accountId_OpenOrder[accountId].id_orderList[openOrder.startId].prev = orderId;
            accountId_OpenOrder[accountId].id_orderList[orderId].next = openOrder.startId;
        }
        accountId_OpenOrder[accountId].startId = orderId;
    }
    function RemoveOpenOrder(uint32 accountId, uint32 orderId) private
    {
        OpenOrder memory openOrder = accountId_OpenOrder[accountId];

        uint32 nextId = accountId_OpenOrder[accountId].id_orderList[orderId].next;
        uint32 prevId = accountId_OpenOrder[accountId].id_orderList[orderId].prev;

        if (nextId != 0)
        {
            accountId_OpenOrder[accountId].id_orderList[nextId].prev = prevId;
        }

        if (prevId != 0)
        {
            accountId_OpenOrder[accountId].id_orderList[prevId].next = nextId;
        }

        if (openOrder.startId == orderId)
        {
            accountId_OpenOrder[accountId].startId = nextId;
        }
    }

    //withdrawal and deposit record (DW records)
    struct DWrecord
    {
        uint32 prCode;
        bool isDeposit;
        uint128 qty;
        uint64 timestamp;
    }

    struct DWrecords
    {
        uint32 N;
        mapping (uint32 => DWrecord) N_DWrecord;
    }
    mapping (uint32 => mapping (uint32 => DWrecords)) exId_AccountId_DWrecords;

    //record deposit and withdrawal
    function RecordDW(uint32 exId, uint32 accountId, uint32 prCode, bool isDeposit, uint128 qty) private
    {
        DWrecord memory dW;
        dW.isDeposit = isDeposit;
        dW.prCode = prCode;
        dW.qty = qty;
        dW.timestamp = uint64(now);

        exId_AccountId_DWrecords[exId][accountId].N_DWrecord[++exId_AccountId_DWrecords[exId][accountId].N] = dW;

        if (isDeposit == true)
            emit NewDeposit(exId, prCode, accountId, qty, dW.timestamp, lastTransferId++);
        else
            emit NewWithdraw(exId, prCode, accountId, qty, dW.timestamp, lastTransferId++);
    }
    // returns 'N', DW  records with account id, accountId, for exchange id, exId
    function GetDWrecords(uint32 N, uint32 exId, uint32 accountId) view public returns (uint32[] prCode, bool[] isDeposit, uint128[] qty, uint64[] timestamp)
    {
        checkAnnounceLV(accountId, 3);

        DWrecords storage dWrecords = exId_AccountId_DWrecords[exId][accountId];
        uint32 n = dWrecords.N;

        if (n > N)
            n = N;

        prCode = new uint32[](n);
        isDeposit = new bool[](n);
        qty = new uint128[](n);
        timestamp = new uint64[](n);

        for (uint32 i = dWrecords.N; i > dWrecords.N - n; i--)
        {
            N = dWrecords.N - i;
            prCode[N] = dWrecords.N_DWrecord[i].prCode;
            isDeposit[N] = dWrecords.N_DWrecord[i].isDeposit;
            qty[N] = dWrecords.N_DWrecord[i].qty;
            timestamp[N] = dWrecords.N_DWrecord[i].timestamp;
        }
    }

    //Deposit ETH to exchange
    function depositETH(uint32 exId) payable onlyContractUse public
    {
        require(exId <= lastOwnerId);
        uint32 accountId = FindOrAddAccount();
        exId_prCode_AccountId_Balance[exId][1][accountId].available = Add(exId_prCode_AccountId_Balance[exId][1][accountId].available, uint128(msg.value));
        RecordDW(exId, accountId, 1, true, uint104(msg.value));
    }
    // Withdraw ETH from exchange
    function withdrawETH(uint32 exId, uint104 amount) public
    {
        uint32 accountId = FindOrRevertAccount();
        require(accountId_freeze[accountId] == false);
        exId_prCode_AccountId_Balance[exId][1][accountId].available = Sub(exId_prCode_AccountId_Balance[exId][1][accountId].available, amount);
        require(msg.sender.send(amount));
        RecordDW(exId, accountId, 1, false,  amount);
    }
    // Deposit/Withdraw, ERC20's to exchange
    function depositWithdrawToken(uint32 exId, uint128 amount, bool isDeposit, address prAddress) public
    {
        uint32 prCode = product_prCode[prAddress];
        require(amount < maxBalance && prCode != 0);
        uint32 accountId = FindOrAddAccount();
        require(accountId_freeze[accountId] == false);

        if (isDeposit == true)
        {
            require(prCode_productInfo[prCode].isDeposit == true && isContractUse == true && exId <= lastOwnerId);
            require(Token(prAddress).transferFrom(msg.sender, this, amount));
            exId_prCode_AccountId_Balance[exId][prCode][accountId].available = Add(exId_prCode_AccountId_Balance[exId][prCode][accountId].available, amount);
            require (exId_prCode_AccountId_Balance[exId][prCode][accountId].available < maxBalance);
        }
        else
        {
            require(prCode_productInfo[prCode].isWithdraw == true);
            exId_prCode_AccountId_Balance[exId][prCode][accountId].available = Sub(exId_prCode_AccountId_Balance[exId][prCode][accountId].available, amount);
            require(Token(prAddress).transfer(msg.sender, amount));
        }
        RecordDW(exId, accountId, prCode, isDeposit, amount);
    }

    // This function will be never used in normal situations.
    // This function is only prepared for emergency case such as smart contract hacking Vulnerability or smart contract abolishment
    // Withdrawn fund by this function cannot belong to any exchange operators or owners.
    // Withdrawn fund should be distributed to individual accounts having original ownership of withdrawn fund.
    // After using this function, this contract cannot get any deposit or trade.
    // After using this function, this contract will be abolished.
    function emergencyWithdrawal(uint32 prCode, uint256 amount) onlyOwner public
    {
        isContractUse = false;//This cannot be return. After activating this, this contract cannot support any deposit or trade function.
        if (prCode == 1)
            require(msg.sender.send(amount));
        else
            Token(prCode_product[prCode]).transfer(msg.sender, amount);
    }

    // Find tick size of each price
    function GetNextTick(bool isAsk, uint80 price, uint8 n) public pure returns (uint80)
    {
        if (price > 0)
        {
            uint80 tick = GetTick(price, n);

            if (isAsk == true)
                return (((price - 1) / tick) + 1) * tick;
            else
                return (price / tick) * tick;
        }
        else
        {
            return price;
        }
    }

    function GetTick(uint80 price, uint8 n)  public pure returns  (uint80)
    {
        if (n < 1)
            n = 1;

        uint80 x = 1;

        for (uint8 i=1; i <= n / 2; i++)
        {
            x *= 10;
        }

        if (price < 10 * x)
            return 1;
        else
        {
            uint80 tick = 10000;

            uint80 priceTenPercent = price / 10 / x;

            while (priceTenPercent > tick)
            {
                tick *= 10;
            }

            while (priceTenPercent < tick)
            {
                tick /= 10;
            }

            if (n % 2 == 1)
            {
                if (price >= 50 * tick * x)
                {
                    tick *= 5;
                }
            }
            else
            {
                if (price < 50 * tick * x)
                {
                    tick *= 5;
                }
                else
                {
                    tick *= 10;
                }

            }

            return tick;
        }
    }
    // New limit order
    function LimitOrder(uint32 exId, uint32 prTrade, uint32 prBase, bool isSell, uint80 price, uint104 qty) public onlyContractUse  returns  (uint32)
    {
        uint32 accountId = FindOrRevertAccount();
        require(accountId_freeze[accountId] == false);
        uint80 lastBestPrice;
        OrderBook storage orderBook = basePID_tradePID_orderBook[prBase][prTrade];
        require(price != 0 && price <= maxPrice && qty <= maxQty &&
            ((isSell == false && prCode_productInfo[prTrade].isTradeBid == true && prCode_productInfo[prBase].isTradeAsk == true)
            || (isSell == true && prCode_productInfo[prTrade].isTradeAsk == true && prCode_productInfo[prBase].isTradeBid == true))
            && prCode_productInfo[prTrade].minQty <= qty);

        if (isSell == true)
        {
            price = GetNextTick(true, price, orderBook.tickSize);
            lastBestPrice = orderBook.bestAskPrice;
        }
        else
        {
            price = GetNextTick(false, price, orderBook.tickSize);
            lastBestPrice = orderBook.bestBidPrice;
        }

        Order memory order;
        order.exId = exId;
        order.isSell = isSell;
        order.prTrade = prTrade;
        order.prBase = prBase;
        order.accountId = accountId;
        order.price = price;
        order.qty = qty;

        require (IsPossibleLimit(exId, order));

        emit NewOrder(order.prTrade, order.prBase, order.accountId, ++lastOrderId, order.isSell, order.price, order.qty, lastNewOrderId++);

        BalanceUpdateByLimitAfterTrade(order, qty, matchOrder(orderBook, order, lastOrderId));

        if (order.qty != 0)
        {
            uint80 priceNext;
            uint80 price0;

            if (isSell == true)
            {
                price0 = orderBook.bestAskPrice;
                if (price0 == 0)
                {
                    orderBook.askPrice_Order[price].prevPrice = 0;
                    orderBook.askPrice_Order[price].nextPrice = 0;
                    orderBook.bestAskPrice = price;
                }
                else if(price < price0)
                {
                    orderBook.askPrice_Order[price0].prevPrice = price;
                    orderBook.askPrice_Order[price].prevPrice = 0;
                    orderBook.askPrice_Order[price].nextPrice = price0;
                    orderBook.bestAskPrice = price;
                }
                else if (orderBook.askPrice_Order[price].firstId == 0)
                {
                    priceNext = price0;

                    while (priceNext != 0 && priceNext < price)
                    {
                        price0 = priceNext;
                        priceNext = orderBook.askPrice_Order[price0].nextPrice;
                    }

                    orderBook.askPrice_Order[price0].nextPrice = price;
                    orderBook.askPrice_Order[price].prevPrice = price0;
                    orderBook.askPrice_Order[price].nextPrice = priceNext;
                    if (priceNext != 0)
                    {
                        orderBook.askPrice_Order[priceNext].prevPrice = price;
                    }
                }

                OrderLink storage orderLink = orderBook.askPrice_Order[price];
            }
            else
            {
                price0 = orderBook.bestBidPrice;
                if (price0 == 0)
                {
                    orderBook.bidPrice_Order[price].prevPrice = 0;
                    orderBook.bidPrice_Order[price].nextPrice = 0;
                    orderBook.bestBidPrice = price;
                }
                else if (price > price0)
                {
                    orderBook.bidPrice_Order[price0].prevPrice = price;
                    orderBook.bidPrice_Order[price].prevPrice = 0;
                    orderBook.bidPrice_Order[price].nextPrice = price0;
                    orderBook.bestBidPrice = price;
                }
                else if (orderBook.bidPrice_Order[price].firstId == 0)
                {
                    priceNext = price0;

                    while (priceNext != 0 && priceNext > price)
                    {
                        price0 = priceNext;
                        priceNext = orderBook.bidPrice_Order[price0].nextPrice;
                    }

                    orderBook.bidPrice_Order[price0].nextPrice = price;
                    orderBook.bidPrice_Order[price].prevPrice = price0;
                    orderBook.bidPrice_Order[price].nextPrice = priceNext;
                    if (priceNext != 0)
                    {
                        orderBook.bidPrice_Order[priceNext].prevPrice = price;
                    }
                }

                orderLink = orderBook.bidPrice_Order[price];
            }

            if (lastOrderId != 0)
            {
                orderLink.id_orderList[lastOrderId].prev = orderLink.lastId;
                if (orderLink.firstId != 0)
                {
                    orderLink.id_orderList[orderLink.lastId].next = lastOrderId;
                }
                else
                {
                    orderLink.id_orderList[lastOrderId].next = 0;
                    orderLink.firstId = lastOrderId;
                }
                orderLink.lastId = lastOrderId;
            }

            AddOpenOrder(accountId, lastOrderId);
            id_Order[lastOrderId] = order;
        }

        if (isSell == true && lastBestPrice != orderBook.bestAskPrice)
        {
            emit NewBestBidAsk(prTrade, prBase, isSell, orderBook.bestAskPrice);
        }
        if (isSell == false && lastBestPrice != orderBook.bestBidPrice)
        {
            emit NewBestBidAsk(prTrade, prBase, isSell, orderBook.bestBidPrice);
        }

        return lastOrderId;
    }

    function BalanceUpdateByLimitAfterTrade(Order order, uint104 qty, uint104 tradedQty) private
    {
        uint32 exId = order.exId;
        uint32 accountId = order.accountId;
        uint32 prTrade = order.prTrade;
        uint32 prBase = order.prBase;
        uint80 price = order.price;
        uint104 orderQty = order.qty;

        if (order.isSell)
        {
            Balance storage balance = exId_prCode_AccountId_Balance[exId][prTrade][accountId];
            balance.available = Sub(balance.available, qty);

            if (orderQty != 0)
                balance.reserved = Add(balance.reserved, orderQty);
        }
        else
        {
            balance = exId_prCode_AccountId_Balance[exId][prBase][accountId];
            if (orderQty != 0)
            {
                // prCode_productInfo[prBase].divider * qty * price < 2^60 * 2^80 * 2^104 < 2^256
                uint256 temp = prCode_productInfo[prBase].divider * orderQty * price / basePrice / prCode_productInfo[prTrade].divider;
                require (temp < maxQty); // temp < maxQty < 2^104
                balance.available = Sub(balance.available, tradedQty + uint104(temp));
                balance.reserved = Add(balance.reserved, uint104(temp));
            }
            else
            {
                balance.available = Sub(balance.available, tradedQty);
            }
            tradedQty = qty - orderQty;

            prBase = prTrade;
        }
        if (tradedQty != 0)
        {
            uint104 takeFeeLocal = tradedQty * ownerId_takerFeeRateLocal[exId] / 10000;
            exId_prCode_AccountId_Balance[exId][prBase][accountId].available += tradedQty - takeFeeLocal;
            exId_prCode_AccountId_Balance[exId][prBase][ownerId_accountId[exId]].available += takeFeeLocal;
        }
    }

    function IsPossibleLimit(uint32 exId, Order memory order) private view returns (bool)
    {
        if (order.isSell)
        {
            if (exId_prCode_AccountId_Balance[exId][order.prTrade][order.accountId].available >= order.qty)
                return true;
            else
                return false;
        }
        else
        {
            if (exId_prCode_AccountId_Balance[exId][order.prBase][order.accountId].available >= prCode_productInfo[order.prBase].divider * order.qty * order.price / basePrice / prCode_productInfo[order.prTrade].divider)
                return true;
            else
                return false;
        }
    }
    // Heart of DexHI's onchain order matching algorithm
    function matchOrder(OrderBook storage ob, Order memory order, uint32 id) private returns (uint104)
    {
        uint32 prTrade = order.prTrade;
        uint32 prBase = order.prBase;
        uint80 tradePrice;

        if (order.isSell == true)
            tradePrice = ob.bestBidPrice;
        else
            tradePrice = ob.bestAskPrice;

        bool isBestPriceUpdate = false;

        uint104 qtyBase = 0;
        uint104 tradeAmount;

        while (tradePrice != 0 && order.qty > 0 && ((order.isSell && order.price <= tradePrice) || (!order.isSell && order.price >= tradePrice)))
        {
            if (order.isSell == true)
                OrderLink storage orderLink = ob.bidPrice_Order[tradePrice];
            else
                orderLink = ob.askPrice_Order[tradePrice];

            uint32 orderId = orderLink.firstId;

            while (orderLink.firstId != 0 && orderId != 0 && order.qty != 0)
            {
                Order storage matchingOrder = id_Order[orderId];
                if (matchingOrder.qty >= order.qty)
                {
                    tradeAmount = order.qty;
                    matchingOrder.qty -= order.qty; //matchingOrder.qty cannot be negative by (matchingOrder.qty >= order.qty
                    order.qty = 0;
                }
                else
                {
                    tradeAmount = matchingOrder.qty;
                    order.qty -= matchingOrder.qty;
                    matchingOrder.qty = 0;
                }

                qtyBase += BalanceUpdateByTradeCp(order, matchingOrder, tradeAmount);
                //return value of BalanceUpdateByTradeCp < maxqty < 2^100 so qtyBase < 2 * maxqty < 2 * 101 by below require(qtyBase < maxQty) -> qtyBase cannot be overflow
                require(qtyBase < maxQty);

                uint32 orderAccountID = order.accountId;

                if (order.isSell == true)
                    emit NewTrade(prTrade, prBase, orderId, id, matchingOrder.accountId, orderAccountID, true, tradePrice,  tradeAmount, lastTradeId++, uint64(now));
                else
                    emit NewTrade(prTrade, prBase, id, orderId, orderAccountID, matchingOrder.accountId, false, tradePrice,  tradeAmount, lastTradeId++, uint64(now));

                if (matchingOrder.qty != 0)
                {
                    break;
                }
                else
                {
                    if (RemoveOrder(prTrade, prBase, matchingOrder.isSell, tradePrice, orderId) == true)
                    {
                        RemoveOpenOrder(matchingOrder.accountId, orderId);
                    }
                    orderId = orderLink.firstId;
                }
            }

            if (orderLink.firstId == 0)
            {
                tradePrice = orderLink.nextPrice;
                isBestPriceUpdate = true;
            }
        }

        if (isBestPriceUpdate == true)
        {
            if (order.isSell)
            {
                ob.bestBidPrice = tradePrice;
            }
            else
            {
                ob.bestAskPrice = tradePrice;
            }

            emit NewBestBidAsk(prTrade, prBase, !order.isSell, tradePrice);
        }

        return qtyBase;
    }

    function BalanceUpdateByTradeCp(Order order, Order matchingOrder, uint104 tradeAmount) private returns (uint104)
    {
        uint32 accountId = matchingOrder.accountId;
        uint32 prTrade = order.prTrade;
        uint32 prBase = order.prBase;
        require (tradeAmount < maxQty);
        // qtyBase < 10 ^ 18 < 2^ 60 & tradedAmount < 2^104 & matching orderprice < 2^80 ->  prCode_productInfo[prBase].divider * tradeAmount * matchingOrder.price < 2^256
        // so, below qtyBase cannot be overflow
        uint256 qtyBase = prCode_productInfo[prBase].divider * tradeAmount * matchingOrder.price / basePrice / prCode_productInfo[prTrade].divider;
        require (qtyBase < maxQty);

        Balance storage balanceTrade = exId_prCode_AccountId_Balance[matchingOrder.exId][prTrade][accountId];
        Balance storage balanceBase = exId_prCode_AccountId_Balance[matchingOrder.exId][prBase][accountId];

        if (order.isSell == true)
        {
            balanceTrade.available = SafeMath.Add(balanceTrade.available, tradeAmount);
            balanceBase.reserved = SafeMath.Sub(balanceBase.reserved, uint104(qtyBase));
        }
        else
        {
            balanceTrade.reserved = SafeMath.Sub(balanceTrade.reserved, tradeAmount);
            balanceBase.available = SafeMath.Add(balanceBase.available, uint104(qtyBase));
        }

        return uint104(qtyBase); // return value < maxQty = 1000000000000000000000000000001 < 2^100 by require (qtyBase < maxQty);
    }
    // Internal functions to remove order
    function RemoveOrder(uint32 prTrade, uint32 prBase, bool isSell, uint80 price, uint32 id) private returns (bool)
    {
        OrderBook storage ob = basePID_tradePID_orderBook[prBase][prTrade];

        if (isSell == false)
        {
            OrderLink storage orderLink = ob.bidPrice_Order[price];
        }
        else
        {
            orderLink = ob.askPrice_Order[price];
        }

        if (id != 0)
        {
            ListItem memory removeItem = orderLink.id_orderList[id];
            if (removeItem.next != 0)
            {
                orderLink.id_orderList[removeItem.next].prev = removeItem.prev;
            }

            if (removeItem.prev != 0)
            {
                orderLink.id_orderList[removeItem.prev].next = removeItem.next;
            }

            if (id == orderLink.lastId)
            {
                orderLink.lastId = removeItem.prev;
            }

            if (id == orderLink.firstId)
            {
                orderLink.firstId = removeItem.next;
            }

            delete orderLink.id_orderList[id];

            if (orderLink.firstId == 0)
            {
                if (orderLink.nextPrice != 0)
                {
                    if (isSell == true)
                        OrderLink storage replaceLink = ob.askPrice_Order[orderLink.nextPrice];
                    else
                        replaceLink = ob.bidPrice_Order[orderLink.nextPrice];

                    replaceLink.prevPrice = orderLink.prevPrice;
                }
                if (orderLink.prevPrice != 0)
                {
                    if (isSell == true)
                        replaceLink = ob.askPrice_Order[orderLink.prevPrice];
                    else
                        replaceLink = ob.bidPrice_Order[orderLink.prevPrice];

                    replaceLink.nextPrice = orderLink.nextPrice;
                }

                if (price == ob.bestAskPrice)
                {
                    ob.bestAskPrice = orderLink.nextPrice;
                }
                if (price == ob.bestBidPrice)
                {
                    ob.bestBidPrice = orderLink.nextPrice;
                }
            }
            return true;
        }
        else
        {
            return false;
        }
    }
    // Cancel orders, keep eye on max block gas Fee
    function cancelOrders(uint32 exId, uint32[] id) public
    {
        for (uint32 i = 0; i < id.length; i++)
        {
            cancelOrder(exId, id[i]);
        }
    }
    //  Cancel order
    function cancelOrder(uint32 exId, uint32 id) public returns (bool)
    {
        Order memory order = id_Order[id];
        uint32 accountId = account_id[msg.sender];
        require(order.accountId == accountId);

        uint32 prTrade = order.prTrade;
        uint32 prBase = order.prBase;
        bool isSell = order.isSell;
        uint80 price = order.price;
        uint104 qty = order.qty;

        if (RemoveOrder(prTrade, prBase, isSell, price, id) == false)
            return false;
        else
        {
            RemoveOpenOrder(accountId, id);
        }

        if (isSell)
        {
            Balance storage balance = exId_prCode_AccountId_Balance[exId][prTrade][accountId];
            balance.available = SafeMath.Add(balance.available, qty);
            balance.reserved = SafeMath.Sub(balance.reserved, qty);
        }
        else
        {
            balance = exId_prCode_AccountId_Balance[exId][prBase][accountId];
            // prCode_productInfo[prBase].divider * qty * price < 2^60 * 2^80 * 2^104 < 2^256
            uint256 temp = prCode_productInfo[prBase].divider * qty * price / basePrice / prCode_productInfo[prTrade].divider;
            require (temp < maxQty); // temp < maxQty < 2^104 -> temp cannot be overflow
            balance.available = SafeMath.Add(balance.available, uint104(temp));
            balance.reserved = SafeMath.Sub(balance.reserved, uint104(temp));
        }

        emit NewCancel(prTrade, prBase, accountId, id, isSell, price, qty, lastNewOrderId++);
        return true;
    }
    function checkAnnounceLV(uint32 accountId, uint8 LV) private view returns (bool)
    {
        require(accountId == account_id[msg.sender] || id_announceLV[accountId] >= LV || msg.sender == operator || owner_id[msg.sender] != 0);
    }
    // Get balance by acount id
    function getBalance(uint32 exId, uint32[] prCode, uint32 accountId) view public returns (uint128[] available, uint128[] reserved)
    {
        if (accountId == 0)
            accountId = account_id[msg.sender];
        checkAnnounceLV(accountId, 2);

        uint256 n = prCode.length;
        available = new uint128[](n);
        reserved = new uint128[](n);

        for (uint32 i = 0; i < n; i++)
        {
            available[i] = exId_prCode_AccountId_Balance[exId][prCode[i]][accountId].available;
            reserved[i] = exId_prCode_AccountId_Balance[exId][prCode[i]][accountId].reserved;
        }
    }
    // Get balance by product
    function getBalanceByProduct(uint32 exId, uint32 prCode, uint128 minQty) view public returns (uint32[] accountId, uint128[] balanceSum)
    {
        require (owner_id[msg.sender] != 0 || msg.sender == operator);
        uint32 n = 0;
        for (uint32 i = 1; i <= lastAcccountId; i++)
        {
            if (exId_prCode_AccountId_Balance[exId][prCode][i].available + exId_prCode_AccountId_Balance[exId][prCode][i].reserved > minQty)
                n++;
        }
        accountId = new uint32[](n);
        balanceSum = new uint128[](n);

        n = 0;
        uint128 temp;
        for (i = 1; i <= lastAcccountId; i++)
        {
            temp = exId_prCode_AccountId_Balance[exId][prCode][i].available + exId_prCode_AccountId_Balance[exId][prCode][i].reserved;
            if (temp >= minQty)
            {
                accountId[n] = i;
                balanceSum[n++] = temp;
            }
        }
    }

    // Get bestBidPrice and bestAskPrice of each orderbook
    function getOrderBookInfo(uint32[] prTrade, uint32 prBase) view public returns (uint80[] bestBidPrice, uint80[] bestAskPrice)
    {
        uint256 n = prTrade.length;
        bestBidPrice = new uint80[](n);
        bestAskPrice = new uint80[](n);

        for (uint256 i = 0; i < n; i++)
        {
            OrderBook memory orderBook = basePID_tradePID_orderBook[prBase][prTrade[i]];
            bestBidPrice[i] = orderBook.bestBidPrice;
            bestAskPrice[i] = orderBook.bestAskPrice;
        }
    }

    // Get order information by order id
    function getOrder(uint32 id) view public returns (uint32 prTrade, uint32 prBase, bool sell, uint80 price, uint104 qty, uint32 accountId)
    {
        Order memory order = id_Order[id];

        accountId = order.accountId;
        checkAnnounceLV(accountId, 4);

        prTrade = order.prTrade;
        prBase = order.prBase;
        price = order.price;
        sell = order.isSell;
        qty = order.qty;
    }

    // Get message sender's open orders
    function GetMyOrders(uint32 exId, uint32 accountId, uint16 orderN) view public returns (uint32[] orderId, uint32[] prTrade, uint32[] prBase, bool[] sells, uint80[] prices, uint104[] qtys)
    {
        if (accountId == 0)
            accountId = account_id[msg.sender];

        checkAnnounceLV(accountId, 4);

        OpenOrder storage openOrder = accountId_OpenOrder[accountId];

        orderId = new uint32[](orderN);
        prTrade = new uint32[](orderN);
        prBase = new uint32[](orderN);
        qtys = new uint104[](orderN);
        prices = new uint80[](orderN);
        sells = new bool[](orderN);

        uint32 id = openOrder.startId;
        if (id != 0)
        {
            Order memory order;
            uint32 i = 0;
            while (id != 0 && i < orderN)
            {
                order = id_Order[id];

                if (exId == order.exId)
                {
                    orderId[i] = id;
                    prTrade[i] = order.prTrade;
                    prBase[i] = order.prBase;
                    qtys[i] = order.qty;
                    prices[i] = order.price;
                    sells[i++] = order.isSell;
                }

                id = openOrder.id_orderList[id].next;
            }
        }
    }

    // Get all order id in each price
    function GetHogaDetail(uint32 prTrade, uint32 prBase, uint80 price, bool isSell, uint16 orderN) view public returns (uint32[] orderIds)
    {
        if (isSell == false)
        {
            OrderLink storage orderLink = basePID_tradePID_orderBook[prBase][prTrade].bidPrice_Order[price];
        }
        else if (isSell == true)
        {
            orderLink = basePID_tradePID_orderBook[prBase][prTrade].askPrice_Order[price];
        }
        else
        {
            return;
        }

        orderIds = new uint32[](orderN);
        uint16 n = 0;
        uint32 id0 = orderLink.firstId;
        while (id0 != 0 && orderN > n)
        {
            orderIds[n++] = id0;
            id0 = orderLink.id_orderList[id0].next;
        }
    }

    // Get orderbook screen
    function GetHoga(uint32 prTrade, uint32 prBase, uint32 hogaN) public view returns (uint80[] priceB, uint104[] volumeB, uint80[] priceA, uint104[] volumeA)
    {
        OrderBook storage ob = basePID_tradePID_orderBook[prBase][prTrade];

        (priceB, volumeB) = GetHoga(ob, hogaN, false);
        (priceA, volumeA) = GetHoga(ob, hogaN, true);
    }

    // Get orderbook screen
    function GetHoga(OrderBook storage ob, uint32 hogaN, bool isSell) private view returns (uint80[] prices, uint104[] volumes)
    {
        prices = new uint80[](hogaN);
        volumes = new uint104[](hogaN);

        uint32 n;
        uint32 id0;
        uint80 price;
        uint104 sum;

        if (isSell == false)
            price = ob.bestBidPrice;
        else
            price = ob.bestAskPrice;

        if (price != 0)
        {
            n = 0;
            while (price != 0 && n < hogaN)
            {
                if (isSell == false)
                    OrderLink storage orderLink = ob.bidPrice_Order[price];
                else
                    orderLink = ob.askPrice_Order[price];

                id0 = orderLink.firstId;
                sum = 0;
                while (id0 != 0)
                {
                    sum += id_Order[id0].qty;
                    id0 = orderLink.id_orderList[id0].next;
                }
                prices[n] = price;
                volumes[n] = sum;
                price = orderLink.nextPrice;
                n++;
            }

            if (n > 0)
            {
                while (n < hogaN)
                {
                    if (isSell == true)
                        prices[n] = GetNextTick(true, prices[n - 1] + 1, ob.tickSize);
                    else
                        prices[n] = GetNextTick(false, prices[n - 1] - 1, ob.tickSize);
                    n++;
                }
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"a","type":"uint128"},{"name":"b","type":"uint128"}],"name":"Add","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"GetMyAccountId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"isSell","type":"bool"},{"name":"price","type":"uint80"},{"name":"qty","type":"uint104"}],"name":"LimitOrder","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"transferOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastAcccountId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"N","type":"uint32"},{"name":"exId","type":"uint32"},{"name":"accountId","type":"uint32"}],"name":"GetDWrecords","outputs":[{"name":"prCode","type":"uint32[]"},{"name":"isDeposit","type":"bool[]"},{"name":"qty","type":"uint128[]"},{"name":"timestamp","type":"uint64[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"}],"name":"DeleteOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastOwnerId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GetMyAnnounceLV","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newProductFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastNewOrderId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTradeId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastOrderId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"product","type":"address"}],"name":"GetProductInfo","outputs":[{"name":"prCode","type":"uint32"},{"name":"divider","type":"uint256"},{"name":"isTradeBid","type":"bool"},{"name":"isTradeAsk","type":"bool"},{"name":"isDeposit","type":"bool"},{"name":"isWithdraw","type":"bool"},{"name":"ownerId","type":"uint32"},{"name":"minQty","type":"uint104"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"announceLV","type":"uint8"}],"name":"ChangeAnnounceLV","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GetOwnerList","outputs":[{"name":"owners","type":"address[]"},{"name":"ownerIds","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"ownerId","type":"uint32"}],"name":"getTakerFeeRateLocal","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_takerFeeRate","type":"uint8"}],"name":"setTakerFeeRateLocal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxBalance","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"prCode","type":"uint32"},{"name":"isTradeBid","type":"bool"},{"name":"isTradeAsk","type":"bool"},{"name":"isDeposit","type":"bool"},{"name":"isWithdraw","type":"bool"},{"name":"_minQty","type":"uint104"},{"name":"exId","type":"uint32"}],"name":"SetProductInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"_tickSize","type":"uint8"}],"name":"SetOrderBookTickSize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint32"}],"name":"getOrder","outputs":[{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"sell","type":"bool"},{"name":"price","type":"uint80"},{"name":"qty","type":"uint104"},{"name":"accountId","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastProductId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"productFee","type":"uint256"}],"name":"SetProductFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"id","type":"uint32"}],"name":"cancelOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"price","type":"uint80"},{"name":"isSell","type":"bool"},{"name":"orderN","type":"uint16"}],"name":"GetHogaDetail","outputs":[{"name":"orderIds","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTransferId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isContractUse","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"isFreeze","type":"bool"},{"name":"account","type":"address"}],"name":"SetFreezeByAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"AddOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"prTrade","type":"uint32"},{"name":"prBase","type":"uint32"},{"name":"hogaN","type":"uint32"}],"name":"GetHoga","outputs":[{"name":"priceB","type":"uint80[]"},{"name":"volumeB","type":"uint104[]"},{"name":"priceA","type":"uint80[]"},{"name":"volumeA","type":"uint104[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"price","type":"uint80"},{"name":"n","type":"uint8"}],"name":"GetTick","outputs":[{"name":"","type":"uint80"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"id","type":"uint32[]"}],"name":"cancelOrders","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"basePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxQty","outputs":[{"name":"","type":"uint104"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"amount","type":"uint104"}],"name":"withdrawETH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"prCode","type":"uint32"},{"name":"accountIds","type":"uint32[]"},{"name":"qtys","type":"uint104[]"}],"name":"airDrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"GetAccountId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint128"},{"name":"b","type":"uint128"}],"name":"Sub","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"},{"name":"amount","type":"uint128"},{"name":"isDeposit","type":"bool"},{"name":"prAddress","type":"address"}],"name":"depositWithdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"exId","type":"uint32"},{"name":"prCode","type":"uint32[]"},{"name":"accountId","type":"uint32"}],"name":"getBalance","outputs":[{"name":"available","type":"uint128[]"},{"name":"reserved","type":"uint128[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"decimals","type":"uint256"},{"name":"product","type":"address"}],"name":"AddProduct","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"isAsk","type":"bool"},{"name":"price","type":"uint80"},{"name":"n","type":"uint8"}],"name":"GetNextTick","outputs":[{"name":"","type":"uint80"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"exId","type":"uint32"}],"name":"depositETH","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"maxPrice","outputs":[{"name":"","type":"uint80"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GetProductList","outputs":[{"name":"products","type":"address[]"},{"name":"productIds","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"exId","type":"uint32"},{"name":"prCode","type":"uint32"},{"name":"minQty","type":"uint128"}],"name":"getBalanceByProduct","outputs":[{"name":"accountId","type":"uint32[]"},{"name":"balanceSum","type":"uint128[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"exId","type":"uint32"},{"name":"accountId","type":"uint32"},{"name":"orderN","type":"uint16"}],"name":"GetMyOrders","outputs":[{"name":"orderId","type":"uint32[]"},{"name":"prTrade","type":"uint32[]"},{"name":"prBase","type":"uint32[]"},{"name":"sells","type":"bool[]"},{"name":"prices","type":"uint80[]"},{"name":"qtys","type":"uint104[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"prTrade","type":"uint32[]"},{"name":"prBase","type":"uint32"}],"name":"getOrderBookInfo","outputs":[{"name":"bestBidPrice","type":"uint80[]"},{"name":"bestAskPrice","type":"uint80[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"prCode","type":"uint32"},{"name":"amount","type":"uint256"}],"name":"emergencyWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exId","type":"uint32"},{"indexed":false,"name":"prCode","type":"uint32"},{"indexed":true,"name":"accountId","type":"uint32"},{"indexed":false,"name":"amount","type":"uint128"},{"indexed":false,"name":"timestamp","type":"uint64"},{"indexed":false,"name":"lastTransferId","type":"uint32"}],"name":"NewDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exId","type":"uint32"},{"indexed":false,"name":"prCode","type":"uint32"},{"indexed":true,"name":"accountId","type":"uint32"},{"indexed":false,"name":"amount","type":"uint128"},{"indexed":false,"name":"timestamp","type":"uint64"},{"indexed":false,"name":"lastTransferId","type":"uint32"}],"name":"NewWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prTrade","type":"uint32"},{"indexed":true,"name":"prBase","type":"uint32"},{"indexed":true,"name":"accountId","type":"uint32"},{"indexed":false,"name":"id","type":"uint32"},{"indexed":false,"name":"isSell","type":"bool"},{"indexed":false,"name":"price","type":"uint80"},{"indexed":false,"name":"qty","type":"uint104"},{"indexed":false,"name":"lastNewOrderId","type":"uint32"}],"name":"NewOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prTrade","type":"uint32"},{"indexed":true,"name":"prBase","type":"uint32"},{"indexed":true,"name":"accountId","type":"uint32"},{"indexed":false,"name":"id","type":"uint32"},{"indexed":false,"name":"isSell","type":"bool"},{"indexed":false,"name":"price","type":"uint80"},{"indexed":false,"name":"qt","type":"uint104"},{"indexed":false,"name":"lastNewOrderId","type":"uint32"}],"name":"NewCancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prTrade","type":"uint32"},{"indexed":true,"name":"prBase","type":"uint32"},{"indexed":false,"name":"isBid","type":"bool"},{"indexed":false,"name":"price","type":"uint80"}],"name":"NewBestBidAsk","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prTrade","type":"uint32"},{"indexed":false,"name":"prBase","type":"uint32"},{"indexed":true,"name":"bidId","type":"uint32"},{"indexed":true,"name":"askId","type":"uint32"},{"indexed":false,"name":"accountIdBid","type":"uint32"},{"indexed":false,"name":"accountIdAsk","type":"uint32"},{"indexed":false,"name":"isSell","type":"bool"},{"indexed":false,"name":"price","type":"uint80"},{"indexed":false,"name":"qty","type":"uint104"},{"indexed":false,"name":"lastTradeId","type":"uint32"},{"indexed":false,"name":"timestamp","type":"uint64"}],"name":"NewTrade","type":"event"}]

608060405260008054606060020a60ff0219604060020a63ffffffff021967ffffffff000000001963ffffffff199093166001179290921664010000000017919091166801000000000000000017166c010000000000000000000000001790553480156200006c57600080fd5b506001805433600160a060020a031991821681179283905560028054600160a060020a0390941693909216929092179055620000b190640100000000620000ce810204565b620000c860126000640100000000620001f9810204565b6200050b565b600254600160a060020a03163314620000e657600080fd5b600160a060020a03811660009081526004602052604090205463ffffffff16156200011057600080fd5b6002805460a060020a63ffffffff02198116740100000000000000000000000000000000000000009182900463ffffffff9081166001018116808402929092178455600160a060020a0385166000818152600460209081526040808320805463ffffffff19169096179095559554949094049091168352600390935290208054600160a060020a0319169091179055620001b26401000000006200043d810204565b60025474010000000000000000000000000000000000000000900463ffffffff9081166000908152600660205260409020805463ffffffff19169290911691909117905550565b62000203620004cf565b3360009081526004602052604090205463ffffffff1615156200022557600080fd5b60085434101580620002415750600254600160a060020a031633145b15156200024d57600080fd5b600160a060020a0382166000908152600a602052604090205463ffffffff16156200027757600080fd5b60128311156200028657600080fd5b6007805463ffffffff8082166001908101821663ffffffff1993841681178555600160a060020a039096166000818152600a602081815260408084208054909816909a17909655865485168252600986528882208054600160a060020a03191690931790925597900a85523387526004835285872054821660a08601908152935482168752600b83528587208551815585840151910180548688015160608801516080890151975160c0909901516001606860020a03166801000000000000000002604060020a60a860020a03199987166401000000000267ffffffff000000001999151563010000000263ff00000019931515620100000262ff0000199515156101000261ff001999151560ff1990981697909717989098169590951793909316959095171691909117959095169490941794909416939093179091557f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a315490911683527fe05cd31702e6c5d366a557249766f77ad1ec870b62d942c3a61ebfada6a8e51e9052902080546001608060020a03700100000000000000000000000000000000808304821634018216029116179055565b3360009081526010602052604081205463ffffffff161515620004b557600c805463ffffffff808216600101811663ffffffff1992831681178455336000818152601060209081526040808320805490971690941790955594549092168452600e90925291208054600160a060020a03191690911790555b503360009081526010602052604090205463ffffffff1690565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b615f91806200051b6000396000f3006080604052600436106102715763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663072a0ea48114610276578063082c288f146102b95780630c145c87146102e757806329605e771461032e5780632d5a46ff146103515780633cdc23741461036657806341a6e1e0146104b35780634320a6cb146104d15780634b3488c2146104e65780634f34e1f9146104fb57806352ba28e41461052257806352bcfd5b146105375780635662ecc71461054c578063570ca73514610561578063598ecf36146105925780635a230af91461060c5780635d285c2c146106275780636422d517146106d5578063663754a31461070957806373ad468a14610724578063766fb7641461073957806376efb1e314610782578063899452e5146107ac5780638da5cb5b146108195780638dff9f921461082e5780638f95b64f14610843578063949ebfbd1461085b5780639a9f662c14610893578063a29685a51461091f578063a2b6d6d014610934578063a789044114610949578063ac1e9ef41461096f578063b5d759d914610990578063b83112ab146109ba578063ba96185a146109fd578063c7876ea414610a5d578063c7a9548014610a72578063ca7c2e4e14610aa3578063cae9de4314610acd578063cc74d6d814610b6e578063cd83644614610b8f578063cdcc799614610bb6578063cdf604e214610bf1578063d7c3595614610c59578063dd7da32214610c70578063dfdf577e14610c9c578063e38d6b5c14610cad578063e4c59a1714610cc2578063e8384e6814610cd7578063ef2e514014610d07578063f3d5d60a14610edf578063fe7d14a814610f3c575b600080fd5b34801561028257600080fd5b5061029d6001608060020a0360043581169060243516610f5d565b604080516001608060020a039092168252519081900360200190f35b3480156102c557600080fd5b506102ce610f9f565b6040805163ffffffff9092168252519081900360200190f35b3480156102f357600080fd5b506102ce63ffffffff6004358116906024358116906044351660643515156001605060020a03608435166001606860020a0360a43516610fb8565b34801561033a57600080fd5b5061034f600160a060020a0360043516611d93565b005b34801561035d57600080fd5b506102ce611dd9565b34801561037257600080fd5b5061039063ffffffff60043581169060243581169060443516611de5565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b838110156103dc5781810151838201526020016103c4565b50505050905001858103845288818151815260200191508051906020019060200280838360005b8381101561041b578181015183820152602001610403565b50505050905001858103835287818151815260200191508051906020019060200280838360005b8381101561045a578181015183820152602001610442565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610499578181015183820152602001610481565b505050509050019850505050505050505060405180910390f35b3480156104bf57600080fd5b5061034f63ffffffff60043516612083565b3480156104dd57600080fd5b506102ce612104565b3480156104f257600080fd5b506102ce612117565b34801561050757600080fd5b50610510612140565b60408051918252519081900360200190f35b34801561052e57600080fd5b506102ce612146565b34801561054357600080fd5b506102ce61215a565b34801561055857600080fd5b506102ce61216d565b34801561056d57600080fd5b50610576612179565b60408051600160a060020a039092168252519081900360200190f35b34801561059e57600080fd5b506105b3600160a060020a0360043516612188565b6040805163ffffffff998a16815260208101989098529515158787015293151560608701529115156080860152151560a085015290931660c08301526001606860020a0390921660e08201529051908190036101000190f35b34801561061857600080fd5b5061034f60ff60043516612200565b34801561063357600080fd5b5061063c612238565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610680578181015183820152602001610668565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106bf5781810151838201526020016106a7565b5050505090500194505050505060405180910390f35b3480156106e157600080fd5b506106f363ffffffff60043516612370565b6040805160ff9092168252519081900360200190f35b34801561071557600080fd5b5061034f60ff6004351661238b565b34801561073057600080fd5b5061029d6123e9565b34801561074557600080fd5b5061034f63ffffffff6004358116906024351515906044351515906064351515906084351515906001606860020a0360a435169060c435166123fc565b34801561078e57600080fd5b5061034f63ffffffff6004358116906024351660ff604435166124f7565b3480156107b857600080fd5b506107ca63ffffffff60043516612546565b6040805163ffffffff97881681529587166020870152931515858501526001605060020a0390921660608501526001606860020a0316608084015290921660a082015290519081900360c00190f35b34801561082557600080fd5b5061057661262e565b34801561083a57600080fd5b506102ce61263d565b34801561084f57600080fd5b5061034f600435612649565b34801561086757600080fd5b5061087f63ffffffff60043581169060243516612665565b604080519115158252519081900360200190f35b34801561089f57600080fd5b506108cf63ffffffff600435811690602435166001605060020a0360443516606435151561ffff608435166129e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561090b5781810151838201526020016108f3565b505050509050019250505060405180910390f35b34801561092b57600080fd5b506102ce612b39565b34801561094057600080fd5b5061087f612b45565b34801561095557600080fd5b5061034f6004351515600160a060020a0360243516612b55565b34801561097b57600080fd5b5061034f600160a060020a0360043516612bbc565b34801561099c57600080fd5b5061039063ffffffff60043581169060243581169060443516612cd3565b3480156109c657600080fd5b506109e16001605060020a036004351660ff60243516612d30565b604080516001605060020a039092168252519081900360200190f35b348015610a0957600080fd5b5060408051602060046024803582810135848102808701860190975280865261034f96843563ffffffff1696369660449591949091019291829185019084908082843750949750612e859650505050505050565b348015610a6957600080fd5b50610510612ec7565b348015610a7e57600080fd5b50610a87612ed0565b604080516001606860020a039092168252519081900360200190f35b348015610aaf57600080fd5b5061034f63ffffffff600435166001606860020a0360243516612ee1565b348015610ad957600080fd5b50604080516020600460443581810135838102808601850190965280855261034f95833563ffffffff9081169660248035909216963696956064959294930192829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750612fee9650505050505050565b348015610b7a57600080fd5b506102ce600160a060020a03600435166131f5565b348015610b9b57600080fd5b5061029d6001608060020a0360043581169060243516613216565b348015610bc257600080fd5b5061034f63ffffffff600435166001608060020a03602435166044351515600160a060020a0360643516613239565b348015610bfd57600080fd5b5060408051602060046024803582810135848102808701860190975280865261063c96843563ffffffff16963696604495919490910192918291850190849080828437509497505050923563ffffffff16935061360492505050565b61034f600435600160a060020a03602435166137dc565b348015610c7c57600080fd5b506109e160043515156001605060020a036024351660ff60443516613a1f565b61034f63ffffffff60043516613aab565b348015610cb957600080fd5b506109e1613b9f565b348015610cce57600080fd5b5061063c613bad565b348015610ce357600080fd5b5061063c63ffffffff600435811690602435166001608060020a0360443516613cc1565b348015610d1357600080fd5b50610d3263ffffffff6004358116906024351661ffff60443516613ebf565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b83811015610d86578181015183820152602001610d6e565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b83811015610dc5578181015183820152602001610dad565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b83811015610e04578181015183820152602001610dec565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b83811015610e43578181015183820152602001610e2b565b50505050905001878103835289818151815260200191508051906020019060200280838360005b83811015610e82578181015183820152602001610e6a565b50505050905001878103825288818151815260200191508051906020019060200280838360005b83811015610ec1578181015183820152602001610ea9565b505050509050019c5050505050505050505050505060405180910390f35b348015610eeb57600080fd5b506040805160206004803580820135838102808601850190965280855261063c953695939460249493850192918291850190849080828437509497505050923563ffffffff16935061426c92505050565b348015610f4857600080fd5b5061034f63ffffffff600435166024356143c9565b60008282016001608060020a0380851690821610801590610f905750826001608060020a0316816001608060020a031610155b1515610f9857fe5b9392505050565b3360009081526010602052604090205463ffffffff1690565b600080600080610fc6615e99565b6000805481908190606060020a900460ff161515600114610fe657600080fd5b610fee6144e0565b63ffffffff81166000908152600f602052604090205490975060ff161561101457600080fd5b601360008d63ffffffff1663ffffffff16815260200190815260200160002060008e63ffffffff1663ffffffff1681526020019081526020016000209450896001605060020a031660001415801561107f575069021e19e0c9bab24000016001605060020a038b1611155b80156110a157506c0c9f2c9cd04674edea400000016001606860020a038a1611155b801561116457508a1580156110d3575063ffffffff8d166000908152600b6020526040902060019081015460ff161515145b8015611101575063ffffffff8c166000908152600b60205260409020600190810154610100900460ff161515145b80611164575060018b151514801561113b575063ffffffff8d166000908152600b60205260409020600190810154610100900460ff161515145b8015611164575063ffffffff8c166000908152600b6020526040902060019081015460ff161515145b801561119b575063ffffffff8d166000908152600b60205260409020600101546001606860020a03808b16604060020a9092041611155b15156111a657600080fd5b60018b151514156111e05784546111c4906001908c9060ff16613a1f565b8554909a50605860020a90046001605060020a03169550611209565b84546111f3906000908c9060ff16613a1f565b8554909a5061010090046001605060020a031695505b63ffffffff808f1685528b151560c08601528d811660408601528c81166060860152871660208501526001605060020a038a1660a08501526001606860020a038916608085015261125a8e85614507565b151561126557600080fd5b836020015163ffffffff16846060015163ffffffff16856040015163ffffffff167f779bcb03f0f0b9518125c9665fdc55d28e5e899384a7fb39dd366ec3177671b66011600081819054906101000a900463ffffffff1660010191906101000a81548163ffffffff021916908363ffffffff16021790558860c001518960a001518a608001516000600481819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550604051808663ffffffff1663ffffffff16815260200185151515158152602001846001605060020a03166001605060020a03168152602001836001606860020a03166001606860020a031681526020018263ffffffff1663ffffffff1681526020019550505050505060405180910390a46011546113b99085908b906113b4908990849063ffffffff16614634565b614c54565b60808401516001606860020a031615611c325760018b151514156116f9578454605860020a90046001605060020a03169150811515611459576001605060020a038a166000818152600287016020526040902080547bffffffffffffffffffffffffffffffffffffffff000000000000000019169055855474ffffffffffffffffffff00000000000000000000001916605860020a9091021785556116d9565b816001605060020a03168a6001605060020a03161015611515576001605060020a0380831660008181526002880160205260408082208054948f16609060020a8102600080516020615f4683398151915290961695909517905583825290208054604060020a9092027bffffffffffffffffffffffffffffffffffffffff0000000000000000199092169190911790558554605860020a90910274ffffffffffffffffffff0000000000000000000000199091161785556116d9565b6001605060020a038a16600090815260028601602052604090205463ffffffff1615156116d9578192505b6001605060020a038316158015906115695750896001605060020a0316836001605060020a0316105b1561159a576001605060020a038084166000908152600287016020526040902054604060020a900416929150611540565b89856002016000846001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550818560020160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160126101000a8154816001605060020a0302191690836001605060020a03160217905550828560020160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550826001605060020a031660001415156116d9576001605060020a03808416600090815260028701602052604090208054918c16609060020a02600080516020615f468339815191529092169190911790555b506001605060020a038916600090815260028501602052604090206119fe565b845461010090046001605060020a0316915081151561176d576001605060020a038a166000818152600187016020526040902080547bffffffffffffffffffffffffffffffffffffffff00000000000000001916905585546affffffffffffffffffff0019166101009091021785556119e2565b816001605060020a03168a6001605060020a0316111561181e576001605060020a0380831660008181526001880160205260408082208054948f16609060020a8102600080516020615f4683398151915290961695909517905583825290208054604060020a9092027bffffffffffffffffffffffffffffffffffffffff0000000000000000199092169190911790558554610100919091026affffffffffffffffffff00199091161785556119e2565b6001605060020a038a16600090815260018601602052604090205463ffffffff1615156119e2578192505b6001605060020a038316158015906118725750896001605060020a0316836001605060020a0316115b156118a3576001605060020a038084166000908152600187016020526040902054604060020a900416929150611849565b89856001016000846001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550818560010160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160126101000a8154816001605060020a0302191690836001605060020a03160217905550828560010160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550826001605060020a031660001415156119e2576001605060020a03808416600090815260018701602052604090208054918c16609060020a02600080516020615f468339815191529092169190911790555b506001605060020a038916600090815260018501602052604090205b60115463ffffffff1615611aed57805460115463ffffffff90811660009081526001840160205260409020805463ffffffff191664010000000090930482169290921790915581541615611a8e57601154815463ffffffff64010000000091829004811660009081526001850160205260409020805467ffffffff00000000191691909316909102179055611aca565b6011805463ffffffff90811660009081526001840160205260409020805467ffffffff00000000191690559054825463ffffffff191691161781555b601154815467ffffffff00000000191663ffffffff909116640100000000021781555b601154611b0190889063ffffffff16615066565b60115463ffffffff90811660009081526012602090815260409182902087518154928901519389015160608a015160808b01516001606860020a0316608060020a027cffffffffffffffffffffffffff0000000000000000000000000000000019918816606060020a026fffffffff00000000000000000000000019938916604060020a026bffffffff000000000000000019988a166401000000000267ffffffff000000001996909a1663ffffffff19909816979097179490941697909717959095169390931792909216919091179190911691909117815560a0850151600191909101805460c087015115156a0100000000000000000000026aff00000000000000000000196001605060020a0390941669ffffffffffffffffffff1990921691909117929092169190911790555b60018b1515148015611c58575084546001605060020a03878116605860020a9092041614155b15611cd8578b63ffffffff168d63ffffffff167f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab8d88600001600b9054906101000a90046001605060020a03166040518083151515158152602001826001605060020a03166001605060020a031681526020019250505060405180910390a35b8a158015611cf8575084546001605060020a038781166101009092041614155b15611d78578b63ffffffff168d63ffffffff167f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab8d8860000160019054906101000a90046001605060020a03166040518083151515158152602001826001605060020a03166001605060020a031681526020019250505060405180910390a35b505060115463ffffffff169c9b505050505050505050505050565b600154600160a060020a03163314611daa57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c5463ffffffff1681565b6060806060806000806000611dfb88600361512a565b5063ffffffff808a1660009081526016602090815260408083208c8516845290915290208054909450811692508a16821115611e35578991505b8163ffffffff16604051908082528060200260200182016040528015611e65578160200160208202803883390190505b5096508163ffffffff16604051908082528060200260200182016040528015611e98578160200160208202803883390190505b5095508163ffffffff16604051908082528060200260200182016040528015611ecb578160200160208202803883390190505b5094508163ffffffff16604051908082528060200260200182016040528015611efe578160200160208202803883390190505b50835490945063ffffffff1690505b825463ffffffff9081168390038116908216111561207757825463ffffffff808316600090815260018601602052604090205489519282168490039c5081169189918d16908110611f5a57fe5b63ffffffff9283166020918202929092018101919091528282166000908152600186019091526040902054875164010000000090910460ff16918891908d16908110611fa257fe5b91151560209283029190910182015263ffffffff8281166000908152600186019092526040909120548651650100000000009091046001608060020a0316918791908d16908110611fef57fe5b6001608060020a039290921660209283029190910182015263ffffffff8281166000908152600186019092526040909120548551750100000000000000000000000000000000000000000090910467ffffffffffffffff16918691908d1690811061205657fe5b67ffffffffffffffff90921660209283029091019091015260001901611f0d565b50505093509350935093565b600254600160a060020a0316331461209a57600080fd5b60025463ffffffff80831660a060020a90920416108015906120c2575060008163ffffffff16115b15156120cd57600080fd5b63ffffffff16600090815260036020908152604080832054600160a060020a0316835260049091529020805463ffffffff19169055565b60025460a060020a900463ffffffff1681565b3360009081526010602090815260408083205463ffffffff168352600d90915290205460ff1690565b60085481565b600054640100000000900463ffffffff1681565b600054604060020a900463ffffffff1681565b60115463ffffffff1681565b600254600160a060020a031681565b600160a060020a03166000908152600a602090815260408083205463ffffffff908116808552600b909352922080546001909101549193909260ff808416936101008104821693620100008204831693630100000083049093169264010000000083041691604060020a90046001606860020a031690565b80600d600061220d6144e0565b63ffffffff1681526020810191909152604001600020805460ff191660ff9290921691909117905550565b6060806000600260149054906101000a900463ffffffff1663ffffffff1660405190808252806020026020018201604052801561227f578160200160208202803883390190505b509250600260149054906101000a900463ffffffff1663ffffffff166040519080825280602002602001820160405280156122c4578160200160208202803883390190505b509150600190505b60025463ffffffff60a060020a90910481169082161161236b5763ffffffff8082166000908152600360205260409020548451600160a060020a03909116918591600019850190911690811061231e57fe5b600160a060020a0390921660209283029091019091015281518190839063ffffffff60001984011690811061234f57fe5b63ffffffff9092166020928302909101909101526001016122cc565b509091565b63ffffffff1660009081526005602052604090205460ff1690565b6000606460ff8316111561239e57600080fd5b503360009081526004602052604090205463ffffffff168015156123c157600080fd5b63ffffffff166000908152600560205260409020805460ff191660ff92909216919091179055565b6ec097ce7bc90715b34b9f100000000181565b63ffffffff87166000908152600b60205260409020600254600160a060020a031633148061244e575060018101543360009081526004602052604090205463ffffffff90811664010000000090920416145b151561245957600080fd5b600101805460ff19169615159690961761ff001916610100951515959095029490941762ff0000191662010000931515939093029290921763ff00000019166301000000911515919091021774ffffffffffffffffffffffffff00000000000000001916604060020a6001606860020a0392909216919091021767ffffffff00000000191664010000000063ffffffff929092169190910217905550565b600254600160a060020a0316331461250e57600080fd5b63ffffffff9182166000908152601360209081526040808320959094168252939093529120805460ff191660ff909216919091179055565b600080600080600080612557615e99565b505063ffffffff868116600090815260126020908152604091829020825160e0810184528154808616825264010000000081048616938201849052604060020a8104861694820194909452606060020a84049094166060850152608060020a9092046001606860020a031660808401526001909101546001605060020a03811660a08401526a0100000000000000000000900460ff16151560c08301529061260082600461512a565b5080604001519650806060015195508060a0015193508060c001519450806080015192505091939550919395565b600154600160a060020a031681565b60075463ffffffff1681565b600254600160a060020a0316331461266057600080fd5b600855565b600061266f615e99565b5063ffffffff8281166000908152601260209081526040808320815160e0810183528154808716825264010000000081048716828601908152604060020a8204881683860152606060020a820488166060840152608060020a9091046001606860020a031660808301526001909201546001605060020a03811660a08301526a0100000000000000000000900460ff16151560c082015233855260109093529083205490519193908116929182918291829182918291829116881461273357600080fd5b88604001519650886060015195508860c0015194508860a00151935088608001519250612763878787878f6151aa565b151561277257600099506129d4565b61277c888c61557a565b841561282d5763ffffffff8c811660009081526014602090815260408083208b851684528252808320938c1683529290522080549092506127d690608060020a90046001608060020a03166001606860020a038516610f5d565b82546001608060020a03918216608060020a029082161780845561280491166001606860020a038516613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178255612930565b63ffffffff808d1660009081526014602090815260408083208a85168085529083528184208d861685528352818420948c168452600b9092528083205491835290912054919350906402540be400906001606860020a038616026001605060020a038716020481151561289c57fe5b0490506c0c9f2c9cd04674edea4000000181106128b857600080fd5b81546128dd90608060020a90046001608060020a03166001606860020a038316610f5d565b82546001608060020a03918216608060020a029082161780845561290b91166001606860020a038316613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a03919091161782555b60008054600164010000000080830463ffffffff908116928301811690910267ffffffff000000001990931692909217909255604080518e8316815288151560208201526001605060020a038816818301526001606860020a0387166060820152608081019390935251818b1692898316928b16917f6f8015e56b17b22535b1afdd1a99929ea0ef7348dfd6b4b414474f8b5caeb2f09181900360a00190a4600199505b50505050505050505092915050565b606060008080851515612a2d5763ffffffff8089166000908152601360209081526040808320938d1683529281528282206001605060020a038b1683526001019052209250612a7a565b60018615151415612a755763ffffffff8089166000908152601360209081526040808320938d1683529281528282206001605060020a038b1683526002019052209250612a7a565b612b2d565b8461ffff16604051908082528060200260200182016040528015612aa8578160200160208202803883390190505b5083549094506000925063ffffffff1690505b63ffffffff811615801590612ad757508161ffff168561ffff16115b15612b2d57835160018301928291869161ffff16908110612af457fe5b63ffffffff9283166020918202909201810191909152918116600090815260018501909252604090912054640100000000900416612abb565b50505095945050505050565b60005463ffffffff1681565b600054606060020a900460ff1681565b600254600090600160a060020a03163314612b6f57600080fd5b50600160a060020a03811660009081526010602052604090205463ffffffff168015612bb75763ffffffff81166000908152600f60205260409020805460ff19168415151790555b505050565b600254600160a060020a03163314612bd357600080fd5b600160a060020a03811660009081526004602052604090205463ffffffff1615612bfc57600080fd5b6002805477ffffffff000000000000000000000000000000000000000019811660a060020a9182900463ffffffff9081166001018116808402929092178455600160a060020a0385166000818152600460209081526040808320805463ffffffff1916909617909555955494909404909116835260039093529020805473ffffffffffffffffffffffffffffffffffffffff19169091179055612c9d6156a1565b60025460a060020a900463ffffffff9081166000908152600660205260409020805463ffffffff19169290911691909117905550565b63ffffffff8083166000908152601360209081526040808320938716835292905290812060609182918291829190612d0e908290889061573f565b9095509350612d1f8187600161573f565b959994985096509394509192505050565b600080600080600060018660ff161015612d4957600195505b60019350600192505b600260ff87160460ff168360ff16111515612d7957600a9390930292600190920191612d52565b83600a026001605060020a0316876001605060020a03161015612d9f5760019450612e7b565b61271091506001605060020a0384811690600a8982160416811515612dc057fe5b0490505b816001605060020a0316816001605060020a03161115612de957600a82029150612dc4565b816001605060020a0316816001605060020a03161015612e1757600a6001605060020a038316049150612de9565b60018087161415612e46576001605060020a03828502603202811690881610612e41576005820291505b612e77565b8382603202026001605060020a0316876001605060020a03161015612e7057600582029150612e77565b600a820291505b8194505b5050505092915050565b60005b81518163ffffffff161015612bb757612ebe83838363ffffffff16815181101515612eaf57fe5b90602001906020020151612665565b50600101612e88565b6402540be40081565b6c0c9f2c9cd04674edea4000000181565b6000612eeb6144e0565b63ffffffff81166000908152600f602052604090205490915060ff1615612f1157600080fd5b63ffffffff838116600090815260146020908152604080832060018452825280832093851683529290522054612f6090608060020a90046001608060020a03166001606860020a038416613216565b63ffffffff8085166000908152601460209081526040808320600184528252808320938616835292905281812080546001608060020a03948516608060020a029416939093179092555133916001606860020a03851680156108fc02929091818181858888f193505050501515612fd657600080fd5b612bb7838260016000866001606860020a0316615a50565b3360009081526004602052604081205481908190819063ffffffff16151561301557600080fd5b61301d6144e0565b63ffffffff81166000908152600f602052604090205490945060ff161561304357600080fd5b85518551909350831461305557600080fd5b5060009050805b828163ffffffff16101561309e57848163ffffffff1681518110151561307e57fe5b602090810290910101516001606860020a0316919091019060010161305c565b63ffffffff88811660009081526014602090815260408083208b851684528252808320938816835292905220546130e590608060020a90046001608060020a031683613216565b63ffffffff808a1660009081526014602090815260408083208c851684528252808320938916835292905290812080546001608060020a03938416608060020a0293169290921790915590505b828163ffffffff1610156131eb57848163ffffffff1681518110151561315457fe5b602090810290910181015163ffffffff808b1660009081526014845260408082208c8416835290945292832089516001606860020a0390931693909290918a919086169081106131a057fe5b602090810290910181015163ffffffff16825281019190915260400160002080546001608060020a03608060020a808304821690940181169093029216919091179055600101613132565b5050505050505050565b600160a060020a031660009081526010602052604090205463ffffffff1690565b60006001608060020a03808416908316111561322e57fe5b508082035b92915050565b600160a060020a0381166000908152600a602052604081205463ffffffff16906ec097ce7bc90715b34b9f10000000016001608060020a038616108015613285575063ffffffff821615155b151561329057600080fd5b6132986156a1565b63ffffffff81166000908152600f602052604090205490915060ff16156132be57600080fd5b600184151514156134945763ffffffff82166000908152600b6020526040902060019081015462010000900460ff16151514801561330a5750600054606060020a900460ff1615156001145b8015613329575060025463ffffffff60a060020a909104811690871611155b151561333457600080fd5b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526001608060020a03871660448201529051600160a060020a038516916323b872dd9160648083019260209291908290030181600087803b1580156133aa57600080fd5b505af11580156133be573d6000803e3d6000fd5b505050506040513d60208110156133d457600080fd5b505115156133e157600080fd5b63ffffffff8681166000908152601460209081526040808320868516845282528083209385168352929052205461342890608060020a90046001608060020a031686610f5d565b63ffffffff87811660009081526014602090815260408083208785168452825280832093861683529290522080546001608060020a03908116608060020a938216840217918290556ec097ce7bc90715b34b9f100000000192909104161061348f57600080fd5b6135ef565b63ffffffff82166000908152600b602052604090206001908101546301000000900460ff161515146134c557600080fd5b63ffffffff8681166000908152601460209081526040808320868516845282528083209385168352929052205461350c90608060020a90046001608060020a031686613216565b63ffffffff808816600090815260146020908152604080832087851684528252808320938616835292815282822080546001608060020a03958616608060020a0290861617905582517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015293891660248501529151600160a060020a0387169363a9059cbb936044808301949193928390030190829087803b1580156135b857600080fd5b505af11580156135cc573d6000803e3d6000fd5b505050506040513d60208110156135e257600080fd5b505115156135ef57600080fd5b6135fc8682848789615a50565b505050505050565b60608060008063ffffffff85161515613630573360009081526010602052604090205463ffffffff1694505b61363b85600261512a565b50855191508160405190808252806020026020018201604052801561366a578160200160208202803883390190505b50935081604051908082528060200260200182016040528015613697578160200160208202803883390190505b509250600090505b818163ffffffff1610156137d25763ffffffff80881660009081526014602052604081208851909289919085169081106136d557fe5b60209081029190910181015163ffffffff90811683528282019390935260409182016000908120898516825290915220548551608060020a9091046001608060020a031691869190841690811061372857fe5b6001608060020a03909216602092830290910182015263ffffffff80891660009081526014909252604082208851909291899190851690811061376757fe5b602090810290910181015163ffffffff908116835282820193909352604091820160009081208985168252909152205484516001608060020a039091169185919084169081106137b357fe5b6001608060020a0390921660209283029091019091015260010161369f565b5050935093915050565b6137e4615e99565b3360009081526004602052604090205463ffffffff16151561380557600080fd5b600854341015806138205750600254600160a060020a031633145b151561382b57600080fd5b600160a060020a0382166000908152600a602052604090205463ffffffff161561385457600080fd5b601283111561386257600080fd5b6007805463ffffffff8082166001908101821663ffffffff1993841681178555600160a060020a039096166000818152600a602081815260408084208054909816909a1790965586548516825260098652888220805473ffffffffffffffffffffffffffffffffffffffff191690931790925597900a85523387526004835285872054821660a08601908152935482168752600b83528587208551815585840151910180548688015160608801516080890151975160c0909901516001606860020a0316604060020a0274ffffffffffffffffffffffffff0000000000000000199987166401000000000267ffffffff000000001999151563010000000263ff00000019931515620100000262ff0000199515156101000261ff001999151560ff1990981697909717989098169590951793909316959095171691909117959095169490941794909416939093179091557f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a315490911683527fe05cd31702e6c5d366a557249766f77ad1ec870b62d942c3a61ebfada6a8e51e9052902080546001608060020a03608060020a808304821634018216029116179055565b6000806000846001605060020a03161115613a9f57613a3e8484612d30565b905060018515151415613a785780816001605060020a0316600186036001605060020a0316811515613a6c57fe5b04600101029150613aa3565b80816001605060020a0316856001605060020a0316811515613a9657fe5b04029150613aa3565b8391505b509392505050565b60008054606060020a900460ff161515600114613ac757600080fd5b60025463ffffffff60a060020a90910481169083161115613ae757600080fd5b613aef6156a1565b63ffffffff838116600090815260146020908152604080832060018452825280832093851683529290522054909150613b3890608060020a90046001608060020a031634610f5d565b63ffffffff80841660009081526014602090815260408083206001808552908352818420948716845293909152902080546001608060020a03938416608060020a02931692909217909155613b9b9083908390806001606860020a033416615a50565b5050565b69021e19e0c9bab240000181565b6007546040805163ffffffff90921680835260208082028401019091526060918291600091908015613be9578160200160208202803883390190505b506007546040805163ffffffff9092168083526020808202840101909152919450908015613c21578160200160208202803883390190505b509150600190505b60075463ffffffff9081169082161161236b5763ffffffff8082166000908152600960205260409020548451600160a060020a039091169185916000198501909116908110613c7457fe5b600160a060020a0390921660209283029091019091015281518190839063ffffffff600019840116908110613ca557fe5b63ffffffff909216602092830290910190910152600101613c29565b3360009081526004602052604081205460609182918190819063ffffffff16151580613cf75750600254600160a060020a031633145b1515613d0257600080fd5b60009250600191505b600c5463ffffffff90811690831611613d7f5763ffffffff88811660009081526014602090815260408083208b851684528252808320938616835292905220546001608060020a03878116608060020a8304821692821692909201161115613d74576001909201915b600190910190613d0b565b8263ffffffff16604051908082528060200260200182016040528015613daf578160200160208202803883390190505b5094508263ffffffff16604051908082528060200260200182016040528015613de2578160200160208202803883390190505b50935060009250600191505b600c5463ffffffff90811690831611613eb4575063ffffffff87811660009081526014602090815260408083208a851684528252808320938516835292905220546001608060020a03808216608060020a9092048116919091019086811690821610613ea95781858463ffffffff16815181101515613e6957fe5b63ffffffff9283166020918202909201015284516001850194839287929116908110613e9157fe5b6001608060020a039092166020928302909101909101525b600190910190613dee565b505050935093915050565b606080606080606080600080613ed3615e99565b600063ffffffff8c161515613efb573360009081526010602052604090205463ffffffff169b505b613f068c600461512a565b50601560008d63ffffffff1663ffffffff16815260200190815260200160002093508a61ffff16604051908082528060200260200182016040528015613f56578160200160208202803883390190505b5099508a61ffff16604051908082528060200260200182016040528015613f87578160200160208202803883390190505b5098508a61ffff16604051908082528060200260200182016040528015613fb8578160200160208202803883390190505b5097508a61ffff16604051908082528060200260200182016040528015613fe9578160200160208202803883390190505b5094508a61ffff1660405190808252806020026020018201604052801561401a578160200160208202803883390190505b5095508a61ffff1660405190808252806020026020018201604052801561404b578160200160208202803883390190505b50845490975063ffffffff169250821561425c575060005b63ffffffff83161580159061408157508a61ffff168163ffffffff16105b1561425c5763ffffffff838116600090815260126020908152604091829020825160e08101845281548086168083526401000000008204871694830194909452604060020a8104861694820194909452606060020a840485166060820152608060020a9093046001606860020a03166080840152600101546001605060020a03811660a08401526a0100000000000000000000900460ff16151560c0830152909350908e16141561423257828a8263ffffffff1681518110151561414157fe5b63ffffffff9283166020918202909201015260408301518a5190918b9190841690811061416a57fe5b63ffffffff928316602091820290920101526060830151895190918a9190841690811061419357fe5b63ffffffff9283166020918202909201015260808301518651909187919084169081106141bc57fe5b6001606860020a0390921660209283029091019091015260a08201518651879063ffffffff84169081106141ec57fe5b6001605060020a0390921660209283029091019091015260c082015187516001830192899163ffffffff90911690811061422257fe5b9115156020928302909101909101525b63ffffffff9283166000908152600185016020526040902054640100000000900490921691614063565b5050505093975093979195509350565b60608060008061427a615ed5565b86519250826040519080825280602002602001820160405280156142a8578160200160208202803883390190505b509450826040519080825280602002602001820160405280156142d5578160200160208202803883390190505b509350600091505b828210156143bf5763ffffffff86166000908152601360205260408120885190919089908590811061430b57fe5b602090810290910181015163ffffffff1682528181019290925260409081016000208151606081018352905460ff811682526001605060020a0361010082048116948301859052605860020a9091041691810191909152865190925086908490811061437357fe5b6001605060020a039092166020928302909101909101526040810151845185908490811061439d57fe5b6001605060020a039092166020928302909101909101526001909101906142dd565b5050509250929050565b600154600160a060020a031633146143e057600080fd5b600080546cff0000000000000000000000001916905563ffffffff82166001141561443157604051339082156108fc029083906000818181858888f19350505050151561442c57600080fd5b613b9b565b63ffffffff821660009081526009602090815260408083205481517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018690529151600160a060020a039091169363a9059cbb93604480850194919392918390030190829087803b1580156144b057600080fd5b505af11580156144c4573d6000803e3d6000fd5b505050506040513d60208110156144da57600080fd5b50505050565b3360009081526010602052604081205463ffffffff1680151561450257600080fd5b919050565b60008160c001511561457d57608082015163ffffffff84811660009081526014602090815260408083208188015185168452825280832082880151909416835292905220546001606860020a03909116608060020a9091046001608060020a03161061457557506001613233565b506000613233565b60408083015163ffffffff9081166000908152600b6020528281205460a0860151608087015160608801519094168352939091205490926402540be400926001606860020a0316919091026001605060020a0390911602048115156145de57fe5b63ffffffff858116600090815260146020908152604080832060608901518516845282528083208883015190941683529290522054919004608060020a9091046001608060020a03161061457557506001613233565b60008060008060008060008060008060008c6040015199508c6060015198508c60c00151151560011515141561467b578d5461010090046001605060020a03169750614690565b8d54605860020a90046001605060020a031697505b60009650600095505b6001605060020a038816158015906146be575060008d608001516001606860020a0316115b801561471a57508c60c0015180156146ec5750876001605060020a03168d60a001516001605060020a031611155b8061471a57508c60c0015115801561471a5750876001605060020a03168d60a001516001605060020a031610155b15614b845760c08d015115156001141561474f576001605060020a038816600090815260018f0160205260409020935061476c565b6001605060020a038816600090815260028f016020526040902093505b835463ffffffff1692505b835463ffffffff1615801590614792575063ffffffff831615155b80156147aa575060808d01516001606860020a031615155b15614b585763ffffffff8316600090815260126020526040902060808e015181549193506001606860020a03908116608060020a90920416106148395760808d01805183546001606860020a03608060020a8083048216849003909116027cffffffffffffffffffffffffff000000000000000000000000000000001990911617845560009091529450614881565b815460808e0180516001606860020a03608060020a8404811691829003169091527cffffffffffffffffffffffffff0000000000000000000000000000000019909116835594505b6040805160e081018252835463ffffffff8082168352640100000000820481166020840152604060020a8204811693830193909352606060020a81049092166060820152608060020a9091046001606860020a0316608082015260018301546001605060020a03811660a08301526a0100000000000000000000900460ff16151560c0820152614913908e9087615c90565b909501946c0c9f2c9cd04674edea400000016001606860020a0387161061493957600080fd5b5060208c015160c08d0151151560011415614a2057815460008054604060020a80820463ffffffff908116600181810183169093026bffffffff00000000000000001990941693909317909355604080518e85168152640100000000909504841660208601528584168582015260608501919091526001605060020a038c1660808501526001606860020a03891660a085015260c084019190915267ffffffffffffffff421660e084015251818f1692868316928e16917fd1baace08af1f93c73aedf5f7bce6194ecd40491b8f82a51f0b218fe1e0a2971918190036101000190a4614aeb565b8154600080546001604060020a80830463ffffffff90811692830181169091026bffffffff000000000000000019909316929092178355604080518e84168152868416602082015264010000000090950483168582015260608501939093526001605060020a038c1660808501526001606860020a03891660a085015260c084015267ffffffffffffffff421660e08401529051818616928f8316928e16917fd1baace08af1f93c73aedf5f7bce6194ecd40491b8f82a51f0b218fe1e0a2971918190036101000190a45b8154608060020a90046001606860020a031615614b0757614b58565b614b258a8a84600101600a9054906101000a900460ff168b876151aa565b151560011415614b49578154614b4990640100000000900463ffffffff168461557a565b835463ffffffff169250614777565b835463ffffffff161515614b7f578354604060020a90046001605060020a03169750600196505b614699565b60018715151415614c42578c60c0015115614bbf578d546affffffffffffffffffff0019166101006001605060020a038a1602178e55614bed565b8d5474ffffffffffffffffffff00000000000000000000001916605860020a6001605060020a038a1602178e555b60c08d015160408051911582526001605060020a038a166020830152805163ffffffff808d1693908e16927f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab92918290030190a35b50939c9b505050505050505050505050565b825160208401516040850151606086015160a0870151608088015160c08901516000908190819015614d435763ffffffff89811660009081526014602090815260408083208b851684528252808320938c168352929052208054909350614cd490608060020a90046001608060020a03166001606860020a038d16613216565b83546001608060020a03918216608060020a0291161783556001606860020a03841615614d3e578254614d19906001608060020a03166001606860020a038616610f5d565b83546fffffffffffffffffffffffffffffffff19166001608060020a03919091161783555b614ea8565b63ffffffff808a1660009081526014602090815260408083208a851684528252808320938c1683529290522092506001606860020a03841615614e615763ffffffff8088166000908152600b60205260408082205492891682529020546402540be400906001606860020a038716026001605060020a0388160204811515614dc757fe5b0491506c0c9f2c9cd04674edea400000018210614de357600080fd5b8254614e0a90608060020a90046001608060020a0316838c016001606860020a0316613216565b83546001608060020a03918216608060020a0290821617808555614e3891166001606860020a038416610f5d565b83546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178355614e9f565b8254614e8690608060020a90046001608060020a03166001606860020a038c16613216565b83546001608060020a03918216608060020a0291161783555b838b0399508695505b6001606860020a038a16156150585763ffffffff89166000908152600560205260409020546127109060ff168b026001606860020a0316049050808a036001606860020a0316601460008b63ffffffff1663ffffffff16815260200190815260200160002060008863ffffffff1663ffffffff16815260200190815260200160002060008a63ffffffff1663ffffffff16815260200190815260200160002060000160108282829054906101000a90046001608060020a03160192506101000a8154816001608060020a0302191690836001608060020a03160217905550806001606860020a0316601460008b63ffffffff1663ffffffff16815260200190815260200160002060008863ffffffff1663ffffffff1681526020019081526020016000206000600660008d63ffffffff1663ffffffff16815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060000160108282829054906101000a90046001608060020a03160192506101000a8154816001608060020a0302191690836001608060020a031602179055505b505050505050505050505050565b61506e615ef5565b5063ffffffff80831660009081526015602090815260409182902082519182019092529054909116808252156151015763ffffffff8084166000908152601560209081526040808320855185168452600101808352818420805486891663ffffffff199091168117909155865190855292529091208054919092166401000000000267ffffffff00000000199091161790555b5063ffffffff9182166000908152601560205260409020805463ffffffff191691909216179055565b3360009081526010602052604081205463ffffffff8481169116148061516b575063ffffffff83166000908152600d602052604090205460ff808416911610155b806151805750600254600160a060020a031633145b8061519f57503360009081526004602052604090205463ffffffff1615155b151561323357600080fd5b60008060006151b7615f07565b63ffffffff8089166000908152601360209081526040808320938d1683529290529081209350871515615205576001605060020a038716600090815260018501602052604090209250615222565b6001605060020a0387166000908152600285016020526040902092505b63ffffffff8616156155685763ffffffff8087166000908152600185016020908152604091829020825180840190935254808416835264010000000090049092169181018290529250156152a257815160208084015163ffffffff9081166000908152600187019092526040909120805463ffffffff1916919092161790555b815163ffffffff16156152ef57602082810151835163ffffffff9081166000908152600187019093526040909220805467ffffffff00000000191664010000000093909216929092021790555b825463ffffffff87811664010000000090920416141561532d578151835463ffffffff9091166401000000000267ffffffff00000000199091161783555b825463ffffffff87811691161415615359576020820151835463ffffffff191663ffffffff9091161783555b63ffffffff80871660009081526001850160205260409020805467ffffffffffffffff19169055835416151561555f578254604060020a90046001605060020a03161561542457600188151514156153d357508154604060020a90046001605060020a0316600090815260028401602052604090206153f7565b508154604060020a90046001605060020a0316600090815260018401602052604090205b82548154600080516020615f4683398151915216609060020a918290046001605060020a03169091021781555b8254609060020a90046001605060020a0316156154c4576001881515141561546e57508154609060020a90046001605060020a031660009081526002840160205260409020615492565b508154609060020a90046001605060020a0316600090815260018401602052604090205b8254815471ffffffffffffffffffff00000000000000001916604060020a918290046001605060020a03169091021781555b83546001605060020a03888116605860020a909204161415615517578254845474ffffffffffffffffffff00000000000000000000001916604060020a9091046001605060020a0316605860020a021784555b83546001605060020a0388811661010090920416141561555f57825484546affffffffffffffffffff001916610100604060020a9092046001605060020a0316919091021784555b6001945061556d565b600094505b5050505095945050505050565b615582615ef5565b5063ffffffff8281166000908152601560209081526040808320815180840183528154861681528686168552600190910190925290912054909164010000000082048116911681156156075763ffffffff858116600090815260156020908152604080832086851684526001019091529020805463ffffffff19169183169190911790555b63ffffffff8116156156595763ffffffff80861660009081526015602090815260408083208585168452600101909152902080549184166401000000000267ffffffff00000000199092169190911790555b8363ffffffff16836000015163ffffffff16141561569a5763ffffffff8581166000908152601560205260409020805463ffffffff19169184169190911790555b5050505050565b3360009081526010602052604081205463ffffffff16151561572557600c805463ffffffff808216600101811663ffffffff1992831681178455336000818152601060209081526040808320805490971690941790955594549092168452600e9092529120805473ffffffffffffffffffffffffffffffffffffffff191690911790555b503360009081526010602052604090205463ffffffff1690565b60608060008060008060008863ffffffff1660405190808252806020026020018201604052801561577a578160200160208202803883390190505b5096508863ffffffff166040519080825280602002602001820160405280156157ad578160200160208202803883390190505b5095508715156157ce57895461010090046001605060020a031692506157e3565b8954605860020a90046001605060020a031692505b6001605060020a03831615615a4357600094505b6001605060020a0383161580159061581a57508863ffffffff168563ffffffff16105b156159415787151561584657506001605060020a038216600090815260018a0160205260409020615862565b506001605060020a038216600090815260028a01602052604090205b805463ffffffff169350600091505b63ffffffff8416156158c85763ffffffff9384166000908152601260209081526040808320546001850190925290912054640100000000900490941693608060020a90046001606860020a03169190910190615871565b82878663ffffffff168151811015156158dd57fe5b6001605060020a0390921660209283029091019091015285518290879063ffffffff881690811061590a57fe5b6001606860020a0390921660209283029091019091015280546001909501946001605060020a03604060020a9091041692506157f7565b60008563ffffffff161115615a43575b8863ffffffff168563ffffffff161015615a4357600188151514156159d6576159a66001886001880363ffffffff1681518110151561598c57fe5b602090810290910101518c5460019091019060ff16613a1f565b878663ffffffff168151811015156159ba57fe5b6001605060020a03909216602092830290910190910152615a38565b615a0c60006001896001890363ffffffff168151811015156159f457fe5b602090810290910101518d549190039060ff16613a1f565b878663ffffffff16815181101515615a2057fe5b6001605060020a039092166020928302909101909101525b600190940193615951565b5050505050935093915050565b615a58615f1e565b821515602080830182815263ffffffff80881685526001608060020a03808716604080880191825267ffffffffffffffff42811660608a019081528e86166000908152601689528381208f881682528952838120805480891660019081018a1663ffffffff19928316811784558452918201909a529390208a5181549851955192519093167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff92909616650100000000000274ffffffffffffffffffffffffffffffff0000000000199515156401000000000264ff000000001994909816989099169790971791909116949094179190911694909417919091161790551415615c00576060808201516000805463ffffffff81811660018101821663ffffffff19909316929092179092556040805189841681526001608060020a038816602082015267ffffffffffffffff90941684820152938301529151828816928916917f6235021ead958d6a16078b65a45fa3dbae50d9def6d3783497c2253303b8fde5919081900360800190a36135fc565b6060808201516000805463ffffffff81811660018101821663ffffffff19909316929092179092556040805189841681526001608060020a038816602082015267ffffffffffffffff90941684820152938301529151828816928916917f24e4b81742f08bf8c724465f6c343cbf3f771ce88cdb98b2f9b531233c7b646a919081900360800190a3505050505050565b60208201516040840151606085015160009291908380806c0c9f2c9cd04674edea400000016001606860020a03891610615cc957600080fd5b63ffffffff8086166000908152600b60205260408082205460a08d0151938816835291205490916402540be400916001606860020a038c16026001605060020a039091160204811515615d1857fe5b0492506c0c9f2c9cd04674edea400000018310615d3457600080fd5b5050865163ffffffff9081166000908152601460208181526040808420888616855282528084208986168086529083528185208d5187168652938352818520958816855294825280842094845293905291902060c08a0151151560011415615e13578154615dbb90608060020a90046001608060020a03166001606860020a038a16610f5d565b82546001608060020a03918216608060020a029082161783558154615dea91166001606860020a038516613216565b81546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178155615e8b565b8154615e31906001608060020a03166001606860020a038a16613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a039182161783558154615e7291608060020a909104166001606860020a038516610f5d565b81546001608060020a03918216608060020a0291161781555b509098975050505050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516060810182526000808252602082018190529181019190915290565b60408051602081019091526000815290565b604080518082019091526000808252602082015290565b604080516080810182526000808252602082018190529181018290526060810191909152905600ffffffff00000000000000000000ffffffffffffffffffffffffffffffffffffa165627a7a72305820163017106c52a92cc0571246a2021e799d6dcf30f81bfd460c2d7f35971c8e420029

Deployed Bytecode

0x6080604052600436106102715763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663072a0ea48114610276578063082c288f146102b95780630c145c87146102e757806329605e771461032e5780632d5a46ff146103515780633cdc23741461036657806341a6e1e0146104b35780634320a6cb146104d15780634b3488c2146104e65780634f34e1f9146104fb57806352ba28e41461052257806352bcfd5b146105375780635662ecc71461054c578063570ca73514610561578063598ecf36146105925780635a230af91461060c5780635d285c2c146106275780636422d517146106d5578063663754a31461070957806373ad468a14610724578063766fb7641461073957806376efb1e314610782578063899452e5146107ac5780638da5cb5b146108195780638dff9f921461082e5780638f95b64f14610843578063949ebfbd1461085b5780639a9f662c14610893578063a29685a51461091f578063a2b6d6d014610934578063a789044114610949578063ac1e9ef41461096f578063b5d759d914610990578063b83112ab146109ba578063ba96185a146109fd578063c7876ea414610a5d578063c7a9548014610a72578063ca7c2e4e14610aa3578063cae9de4314610acd578063cc74d6d814610b6e578063cd83644614610b8f578063cdcc799614610bb6578063cdf604e214610bf1578063d7c3595614610c59578063dd7da32214610c70578063dfdf577e14610c9c578063e38d6b5c14610cad578063e4c59a1714610cc2578063e8384e6814610cd7578063ef2e514014610d07578063f3d5d60a14610edf578063fe7d14a814610f3c575b600080fd5b34801561028257600080fd5b5061029d6001608060020a0360043581169060243516610f5d565b604080516001608060020a039092168252519081900360200190f35b3480156102c557600080fd5b506102ce610f9f565b6040805163ffffffff9092168252519081900360200190f35b3480156102f357600080fd5b506102ce63ffffffff6004358116906024358116906044351660643515156001605060020a03608435166001606860020a0360a43516610fb8565b34801561033a57600080fd5b5061034f600160a060020a0360043516611d93565b005b34801561035d57600080fd5b506102ce611dd9565b34801561037257600080fd5b5061039063ffffffff60043581169060243581169060443516611de5565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b838110156103dc5781810151838201526020016103c4565b50505050905001858103845288818151815260200191508051906020019060200280838360005b8381101561041b578181015183820152602001610403565b50505050905001858103835287818151815260200191508051906020019060200280838360005b8381101561045a578181015183820152602001610442565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015610499578181015183820152602001610481565b505050509050019850505050505050505060405180910390f35b3480156104bf57600080fd5b5061034f63ffffffff60043516612083565b3480156104dd57600080fd5b506102ce612104565b3480156104f257600080fd5b506102ce612117565b34801561050757600080fd5b50610510612140565b60408051918252519081900360200190f35b34801561052e57600080fd5b506102ce612146565b34801561054357600080fd5b506102ce61215a565b34801561055857600080fd5b506102ce61216d565b34801561056d57600080fd5b50610576612179565b60408051600160a060020a039092168252519081900360200190f35b34801561059e57600080fd5b506105b3600160a060020a0360043516612188565b6040805163ffffffff998a16815260208101989098529515158787015293151560608701529115156080860152151560a085015290931660c08301526001606860020a0390921660e08201529051908190036101000190f35b34801561061857600080fd5b5061034f60ff60043516612200565b34801561063357600080fd5b5061063c612238565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610680578181015183820152602001610668565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106bf5781810151838201526020016106a7565b5050505090500194505050505060405180910390f35b3480156106e157600080fd5b506106f363ffffffff60043516612370565b6040805160ff9092168252519081900360200190f35b34801561071557600080fd5b5061034f60ff6004351661238b565b34801561073057600080fd5b5061029d6123e9565b34801561074557600080fd5b5061034f63ffffffff6004358116906024351515906044351515906064351515906084351515906001606860020a0360a435169060c435166123fc565b34801561078e57600080fd5b5061034f63ffffffff6004358116906024351660ff604435166124f7565b3480156107b857600080fd5b506107ca63ffffffff60043516612546565b6040805163ffffffff97881681529587166020870152931515858501526001605060020a0390921660608501526001606860020a0316608084015290921660a082015290519081900360c00190f35b34801561082557600080fd5b5061057661262e565b34801561083a57600080fd5b506102ce61263d565b34801561084f57600080fd5b5061034f600435612649565b34801561086757600080fd5b5061087f63ffffffff60043581169060243516612665565b604080519115158252519081900360200190f35b34801561089f57600080fd5b506108cf63ffffffff600435811690602435166001605060020a0360443516606435151561ffff608435166129e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561090b5781810151838201526020016108f3565b505050509050019250505060405180910390f35b34801561092b57600080fd5b506102ce612b39565b34801561094057600080fd5b5061087f612b45565b34801561095557600080fd5b5061034f6004351515600160a060020a0360243516612b55565b34801561097b57600080fd5b5061034f600160a060020a0360043516612bbc565b34801561099c57600080fd5b5061039063ffffffff60043581169060243581169060443516612cd3565b3480156109c657600080fd5b506109e16001605060020a036004351660ff60243516612d30565b604080516001605060020a039092168252519081900360200190f35b348015610a0957600080fd5b5060408051602060046024803582810135848102808701860190975280865261034f96843563ffffffff1696369660449591949091019291829185019084908082843750949750612e859650505050505050565b348015610a6957600080fd5b50610510612ec7565b348015610a7e57600080fd5b50610a87612ed0565b604080516001606860020a039092168252519081900360200190f35b348015610aaf57600080fd5b5061034f63ffffffff600435166001606860020a0360243516612ee1565b348015610ad957600080fd5b50604080516020600460443581810135838102808601850190965280855261034f95833563ffffffff9081169660248035909216963696956064959294930192829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750612fee9650505050505050565b348015610b7a57600080fd5b506102ce600160a060020a03600435166131f5565b348015610b9b57600080fd5b5061029d6001608060020a0360043581169060243516613216565b348015610bc257600080fd5b5061034f63ffffffff600435166001608060020a03602435166044351515600160a060020a0360643516613239565b348015610bfd57600080fd5b5060408051602060046024803582810135848102808701860190975280865261063c96843563ffffffff16963696604495919490910192918291850190849080828437509497505050923563ffffffff16935061360492505050565b61034f600435600160a060020a03602435166137dc565b348015610c7c57600080fd5b506109e160043515156001605060020a036024351660ff60443516613a1f565b61034f63ffffffff60043516613aab565b348015610cb957600080fd5b506109e1613b9f565b348015610cce57600080fd5b5061063c613bad565b348015610ce357600080fd5b5061063c63ffffffff600435811690602435166001608060020a0360443516613cc1565b348015610d1357600080fd5b50610d3263ffffffff6004358116906024351661ffff60443516613ebf565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b83811015610d86578181015183820152602001610d6e565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b83811015610dc5578181015183820152602001610dad565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b83811015610e04578181015183820152602001610dec565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b83811015610e43578181015183820152602001610e2b565b50505050905001878103835289818151815260200191508051906020019060200280838360005b83811015610e82578181015183820152602001610e6a565b50505050905001878103825288818151815260200191508051906020019060200280838360005b83811015610ec1578181015183820152602001610ea9565b505050509050019c5050505050505050505050505060405180910390f35b348015610eeb57600080fd5b506040805160206004803580820135838102808601850190965280855261063c953695939460249493850192918291850190849080828437509497505050923563ffffffff16935061426c92505050565b348015610f4857600080fd5b5061034f63ffffffff600435166024356143c9565b60008282016001608060020a0380851690821610801590610f905750826001608060020a0316816001608060020a031610155b1515610f9857fe5b9392505050565b3360009081526010602052604090205463ffffffff1690565b600080600080610fc6615e99565b6000805481908190606060020a900460ff161515600114610fe657600080fd5b610fee6144e0565b63ffffffff81166000908152600f602052604090205490975060ff161561101457600080fd5b601360008d63ffffffff1663ffffffff16815260200190815260200160002060008e63ffffffff1663ffffffff1681526020019081526020016000209450896001605060020a031660001415801561107f575069021e19e0c9bab24000016001605060020a038b1611155b80156110a157506c0c9f2c9cd04674edea400000016001606860020a038a1611155b801561116457508a1580156110d3575063ffffffff8d166000908152600b6020526040902060019081015460ff161515145b8015611101575063ffffffff8c166000908152600b60205260409020600190810154610100900460ff161515145b80611164575060018b151514801561113b575063ffffffff8d166000908152600b60205260409020600190810154610100900460ff161515145b8015611164575063ffffffff8c166000908152600b6020526040902060019081015460ff161515145b801561119b575063ffffffff8d166000908152600b60205260409020600101546001606860020a03808b16604060020a9092041611155b15156111a657600080fd5b60018b151514156111e05784546111c4906001908c9060ff16613a1f565b8554909a50605860020a90046001605060020a03169550611209565b84546111f3906000908c9060ff16613a1f565b8554909a5061010090046001605060020a031695505b63ffffffff808f1685528b151560c08601528d811660408601528c81166060860152871660208501526001605060020a038a1660a08501526001606860020a038916608085015261125a8e85614507565b151561126557600080fd5b836020015163ffffffff16846060015163ffffffff16856040015163ffffffff167f779bcb03f0f0b9518125c9665fdc55d28e5e899384a7fb39dd366ec3177671b66011600081819054906101000a900463ffffffff1660010191906101000a81548163ffffffff021916908363ffffffff16021790558860c001518960a001518a608001516000600481819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550604051808663ffffffff1663ffffffff16815260200185151515158152602001846001605060020a03166001605060020a03168152602001836001606860020a03166001606860020a031681526020018263ffffffff1663ffffffff1681526020019550505050505060405180910390a46011546113b99085908b906113b4908990849063ffffffff16614634565b614c54565b60808401516001606860020a031615611c325760018b151514156116f9578454605860020a90046001605060020a03169150811515611459576001605060020a038a166000818152600287016020526040902080547bffffffffffffffffffffffffffffffffffffffff000000000000000019169055855474ffffffffffffffffffff00000000000000000000001916605860020a9091021785556116d9565b816001605060020a03168a6001605060020a03161015611515576001605060020a0380831660008181526002880160205260408082208054948f16609060020a8102600080516020615f4683398151915290961695909517905583825290208054604060020a9092027bffffffffffffffffffffffffffffffffffffffff0000000000000000199092169190911790558554605860020a90910274ffffffffffffffffffff0000000000000000000000199091161785556116d9565b6001605060020a038a16600090815260028601602052604090205463ffffffff1615156116d9578192505b6001605060020a038316158015906115695750896001605060020a0316836001605060020a0316105b1561159a576001605060020a038084166000908152600287016020526040902054604060020a900416929150611540565b89856002016000846001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550818560020160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160126101000a8154816001605060020a0302191690836001605060020a03160217905550828560020160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550826001605060020a031660001415156116d9576001605060020a03808416600090815260028701602052604090208054918c16609060020a02600080516020615f468339815191529092169190911790555b506001605060020a038916600090815260028501602052604090206119fe565b845461010090046001605060020a0316915081151561176d576001605060020a038a166000818152600187016020526040902080547bffffffffffffffffffffffffffffffffffffffff00000000000000001916905585546affffffffffffffffffff0019166101009091021785556119e2565b816001605060020a03168a6001605060020a0316111561181e576001605060020a0380831660008181526001880160205260408082208054948f16609060020a8102600080516020615f4683398151915290961695909517905583825290208054604060020a9092027bffffffffffffffffffffffffffffffffffffffff0000000000000000199092169190911790558554610100919091026affffffffffffffffffff00199091161785556119e2565b6001605060020a038a16600090815260018601602052604090205463ffffffff1615156119e2578192505b6001605060020a038316158015906118725750896001605060020a0316836001605060020a0316115b156118a3576001605060020a038084166000908152600187016020526040902054604060020a900416929150611849565b89856001016000846001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550818560010160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160126101000a8154816001605060020a0302191690836001605060020a03160217905550828560010160008c6001605060020a03166001605060020a0316815260200190815260200160002060000160086101000a8154816001605060020a0302191690836001605060020a03160217905550826001605060020a031660001415156119e2576001605060020a03808416600090815260018701602052604090208054918c16609060020a02600080516020615f468339815191529092169190911790555b506001605060020a038916600090815260018501602052604090205b60115463ffffffff1615611aed57805460115463ffffffff90811660009081526001840160205260409020805463ffffffff191664010000000090930482169290921790915581541615611a8e57601154815463ffffffff64010000000091829004811660009081526001850160205260409020805467ffffffff00000000191691909316909102179055611aca565b6011805463ffffffff90811660009081526001840160205260409020805467ffffffff00000000191690559054825463ffffffff191691161781555b601154815467ffffffff00000000191663ffffffff909116640100000000021781555b601154611b0190889063ffffffff16615066565b60115463ffffffff90811660009081526012602090815260409182902087518154928901519389015160608a015160808b01516001606860020a0316608060020a027cffffffffffffffffffffffffff0000000000000000000000000000000019918816606060020a026fffffffff00000000000000000000000019938916604060020a026bffffffff000000000000000019988a166401000000000267ffffffff000000001996909a1663ffffffff19909816979097179490941697909717959095169390931792909216919091179190911691909117815560a0850151600191909101805460c087015115156a0100000000000000000000026aff00000000000000000000196001605060020a0390941669ffffffffffffffffffff1990921691909117929092169190911790555b60018b1515148015611c58575084546001605060020a03878116605860020a9092041614155b15611cd8578b63ffffffff168d63ffffffff167f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab8d88600001600b9054906101000a90046001605060020a03166040518083151515158152602001826001605060020a03166001605060020a031681526020019250505060405180910390a35b8a158015611cf8575084546001605060020a038781166101009092041614155b15611d78578b63ffffffff168d63ffffffff167f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab8d8860000160019054906101000a90046001605060020a03166040518083151515158152602001826001605060020a03166001605060020a031681526020019250505060405180910390a35b505060115463ffffffff169c9b505050505050505050505050565b600154600160a060020a03163314611daa57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c5463ffffffff1681565b6060806060806000806000611dfb88600361512a565b5063ffffffff808a1660009081526016602090815260408083208c8516845290915290208054909450811692508a16821115611e35578991505b8163ffffffff16604051908082528060200260200182016040528015611e65578160200160208202803883390190505b5096508163ffffffff16604051908082528060200260200182016040528015611e98578160200160208202803883390190505b5095508163ffffffff16604051908082528060200260200182016040528015611ecb578160200160208202803883390190505b5094508163ffffffff16604051908082528060200260200182016040528015611efe578160200160208202803883390190505b50835490945063ffffffff1690505b825463ffffffff9081168390038116908216111561207757825463ffffffff808316600090815260018601602052604090205489519282168490039c5081169189918d16908110611f5a57fe5b63ffffffff9283166020918202929092018101919091528282166000908152600186019091526040902054875164010000000090910460ff16918891908d16908110611fa257fe5b91151560209283029190910182015263ffffffff8281166000908152600186019092526040909120548651650100000000009091046001608060020a0316918791908d16908110611fef57fe5b6001608060020a039290921660209283029190910182015263ffffffff8281166000908152600186019092526040909120548551750100000000000000000000000000000000000000000090910467ffffffffffffffff16918691908d1690811061205657fe5b67ffffffffffffffff90921660209283029091019091015260001901611f0d565b50505093509350935093565b600254600160a060020a0316331461209a57600080fd5b60025463ffffffff80831660a060020a90920416108015906120c2575060008163ffffffff16115b15156120cd57600080fd5b63ffffffff16600090815260036020908152604080832054600160a060020a0316835260049091529020805463ffffffff19169055565b60025460a060020a900463ffffffff1681565b3360009081526010602090815260408083205463ffffffff168352600d90915290205460ff1690565b60085481565b600054640100000000900463ffffffff1681565b600054604060020a900463ffffffff1681565b60115463ffffffff1681565b600254600160a060020a031681565b600160a060020a03166000908152600a602090815260408083205463ffffffff908116808552600b909352922080546001909101549193909260ff808416936101008104821693620100008204831693630100000083049093169264010000000083041691604060020a90046001606860020a031690565b80600d600061220d6144e0565b63ffffffff1681526020810191909152604001600020805460ff191660ff9290921691909117905550565b6060806000600260149054906101000a900463ffffffff1663ffffffff1660405190808252806020026020018201604052801561227f578160200160208202803883390190505b509250600260149054906101000a900463ffffffff1663ffffffff166040519080825280602002602001820160405280156122c4578160200160208202803883390190505b509150600190505b60025463ffffffff60a060020a90910481169082161161236b5763ffffffff8082166000908152600360205260409020548451600160a060020a03909116918591600019850190911690811061231e57fe5b600160a060020a0390921660209283029091019091015281518190839063ffffffff60001984011690811061234f57fe5b63ffffffff9092166020928302909101909101526001016122cc565b509091565b63ffffffff1660009081526005602052604090205460ff1690565b6000606460ff8316111561239e57600080fd5b503360009081526004602052604090205463ffffffff168015156123c157600080fd5b63ffffffff166000908152600560205260409020805460ff191660ff92909216919091179055565b6ec097ce7bc90715b34b9f100000000181565b63ffffffff87166000908152600b60205260409020600254600160a060020a031633148061244e575060018101543360009081526004602052604090205463ffffffff90811664010000000090920416145b151561245957600080fd5b600101805460ff19169615159690961761ff001916610100951515959095029490941762ff0000191662010000931515939093029290921763ff00000019166301000000911515919091021774ffffffffffffffffffffffffff00000000000000001916604060020a6001606860020a0392909216919091021767ffffffff00000000191664010000000063ffffffff929092169190910217905550565b600254600160a060020a0316331461250e57600080fd5b63ffffffff9182166000908152601360209081526040808320959094168252939093529120805460ff191660ff909216919091179055565b600080600080600080612557615e99565b505063ffffffff868116600090815260126020908152604091829020825160e0810184528154808616825264010000000081048616938201849052604060020a8104861694820194909452606060020a84049094166060850152608060020a9092046001606860020a031660808401526001909101546001605060020a03811660a08401526a0100000000000000000000900460ff16151560c08301529061260082600461512a565b5080604001519650806060015195508060a0015193508060c001519450806080015192505091939550919395565b600154600160a060020a031681565b60075463ffffffff1681565b600254600160a060020a0316331461266057600080fd5b600855565b600061266f615e99565b5063ffffffff8281166000908152601260209081526040808320815160e0810183528154808716825264010000000081048716828601908152604060020a8204881683860152606060020a820488166060840152608060020a9091046001606860020a031660808301526001909201546001605060020a03811660a08301526a0100000000000000000000900460ff16151560c082015233855260109093529083205490519193908116929182918291829182918291829116881461273357600080fd5b88604001519650886060015195508860c0015194508860a00151935088608001519250612763878787878f6151aa565b151561277257600099506129d4565b61277c888c61557a565b841561282d5763ffffffff8c811660009081526014602090815260408083208b851684528252808320938c1683529290522080549092506127d690608060020a90046001608060020a03166001606860020a038516610f5d565b82546001608060020a03918216608060020a029082161780845561280491166001606860020a038516613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178255612930565b63ffffffff808d1660009081526014602090815260408083208a85168085529083528184208d861685528352818420948c168452600b9092528083205491835290912054919350906402540be400906001606860020a038616026001605060020a038716020481151561289c57fe5b0490506c0c9f2c9cd04674edea4000000181106128b857600080fd5b81546128dd90608060020a90046001608060020a03166001606860020a038316610f5d565b82546001608060020a03918216608060020a029082161780845561290b91166001606860020a038316613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a03919091161782555b60008054600164010000000080830463ffffffff908116928301811690910267ffffffff000000001990931692909217909255604080518e8316815288151560208201526001605060020a038816818301526001606860020a0387166060820152608081019390935251818b1692898316928b16917f6f8015e56b17b22535b1afdd1a99929ea0ef7348dfd6b4b414474f8b5caeb2f09181900360a00190a4600199505b50505050505050505092915050565b606060008080851515612a2d5763ffffffff8089166000908152601360209081526040808320938d1683529281528282206001605060020a038b1683526001019052209250612a7a565b60018615151415612a755763ffffffff8089166000908152601360209081526040808320938d1683529281528282206001605060020a038b1683526002019052209250612a7a565b612b2d565b8461ffff16604051908082528060200260200182016040528015612aa8578160200160208202803883390190505b5083549094506000925063ffffffff1690505b63ffffffff811615801590612ad757508161ffff168561ffff16115b15612b2d57835160018301928291869161ffff16908110612af457fe5b63ffffffff9283166020918202909201810191909152918116600090815260018501909252604090912054640100000000900416612abb565b50505095945050505050565b60005463ffffffff1681565b600054606060020a900460ff1681565b600254600090600160a060020a03163314612b6f57600080fd5b50600160a060020a03811660009081526010602052604090205463ffffffff168015612bb75763ffffffff81166000908152600f60205260409020805460ff19168415151790555b505050565b600254600160a060020a03163314612bd357600080fd5b600160a060020a03811660009081526004602052604090205463ffffffff1615612bfc57600080fd5b6002805477ffffffff000000000000000000000000000000000000000019811660a060020a9182900463ffffffff9081166001018116808402929092178455600160a060020a0385166000818152600460209081526040808320805463ffffffff1916909617909555955494909404909116835260039093529020805473ffffffffffffffffffffffffffffffffffffffff19169091179055612c9d6156a1565b60025460a060020a900463ffffffff9081166000908152600660205260409020805463ffffffff19169290911691909117905550565b63ffffffff8083166000908152601360209081526040808320938716835292905290812060609182918291829190612d0e908290889061573f565b9095509350612d1f8187600161573f565b959994985096509394509192505050565b600080600080600060018660ff161015612d4957600195505b60019350600192505b600260ff87160460ff168360ff16111515612d7957600a9390930292600190920191612d52565b83600a026001605060020a0316876001605060020a03161015612d9f5760019450612e7b565b61271091506001605060020a0384811690600a8982160416811515612dc057fe5b0490505b816001605060020a0316816001605060020a03161115612de957600a82029150612dc4565b816001605060020a0316816001605060020a03161015612e1757600a6001605060020a038316049150612de9565b60018087161415612e46576001605060020a03828502603202811690881610612e41576005820291505b612e77565b8382603202026001605060020a0316876001605060020a03161015612e7057600582029150612e77565b600a820291505b8194505b5050505092915050565b60005b81518163ffffffff161015612bb757612ebe83838363ffffffff16815181101515612eaf57fe5b90602001906020020151612665565b50600101612e88565b6402540be40081565b6c0c9f2c9cd04674edea4000000181565b6000612eeb6144e0565b63ffffffff81166000908152600f602052604090205490915060ff1615612f1157600080fd5b63ffffffff838116600090815260146020908152604080832060018452825280832093851683529290522054612f6090608060020a90046001608060020a03166001606860020a038416613216565b63ffffffff8085166000908152601460209081526040808320600184528252808320938616835292905281812080546001608060020a03948516608060020a029416939093179092555133916001606860020a03851680156108fc02929091818181858888f193505050501515612fd657600080fd5b612bb7838260016000866001606860020a0316615a50565b3360009081526004602052604081205481908190819063ffffffff16151561301557600080fd5b61301d6144e0565b63ffffffff81166000908152600f602052604090205490945060ff161561304357600080fd5b85518551909350831461305557600080fd5b5060009050805b828163ffffffff16101561309e57848163ffffffff1681518110151561307e57fe5b602090810290910101516001606860020a0316919091019060010161305c565b63ffffffff88811660009081526014602090815260408083208b851684528252808320938816835292905220546130e590608060020a90046001608060020a031683613216565b63ffffffff808a1660009081526014602090815260408083208c851684528252808320938916835292905290812080546001608060020a03938416608060020a0293169290921790915590505b828163ffffffff1610156131eb57848163ffffffff1681518110151561315457fe5b602090810290910181015163ffffffff808b1660009081526014845260408082208c8416835290945292832089516001606860020a0390931693909290918a919086169081106131a057fe5b602090810290910181015163ffffffff16825281019190915260400160002080546001608060020a03608060020a808304821690940181169093029216919091179055600101613132565b5050505050505050565b600160a060020a031660009081526010602052604090205463ffffffff1690565b60006001608060020a03808416908316111561322e57fe5b508082035b92915050565b600160a060020a0381166000908152600a602052604081205463ffffffff16906ec097ce7bc90715b34b9f10000000016001608060020a038616108015613285575063ffffffff821615155b151561329057600080fd5b6132986156a1565b63ffffffff81166000908152600f602052604090205490915060ff16156132be57600080fd5b600184151514156134945763ffffffff82166000908152600b6020526040902060019081015462010000900460ff16151514801561330a5750600054606060020a900460ff1615156001145b8015613329575060025463ffffffff60a060020a909104811690871611155b151561333457600080fd5b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526001608060020a03871660448201529051600160a060020a038516916323b872dd9160648083019260209291908290030181600087803b1580156133aa57600080fd5b505af11580156133be573d6000803e3d6000fd5b505050506040513d60208110156133d457600080fd5b505115156133e157600080fd5b63ffffffff8681166000908152601460209081526040808320868516845282528083209385168352929052205461342890608060020a90046001608060020a031686610f5d565b63ffffffff87811660009081526014602090815260408083208785168452825280832093861683529290522080546001608060020a03908116608060020a938216840217918290556ec097ce7bc90715b34b9f100000000192909104161061348f57600080fd5b6135ef565b63ffffffff82166000908152600b602052604090206001908101546301000000900460ff161515146134c557600080fd5b63ffffffff8681166000908152601460209081526040808320868516845282528083209385168352929052205461350c90608060020a90046001608060020a031686613216565b63ffffffff808816600090815260146020908152604080832087851684528252808320938616835292815282822080546001608060020a03958616608060020a0290861617905582517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015293891660248501529151600160a060020a0387169363a9059cbb936044808301949193928390030190829087803b1580156135b857600080fd5b505af11580156135cc573d6000803e3d6000fd5b505050506040513d60208110156135e257600080fd5b505115156135ef57600080fd5b6135fc8682848789615a50565b505050505050565b60608060008063ffffffff85161515613630573360009081526010602052604090205463ffffffff1694505b61363b85600261512a565b50855191508160405190808252806020026020018201604052801561366a578160200160208202803883390190505b50935081604051908082528060200260200182016040528015613697578160200160208202803883390190505b509250600090505b818163ffffffff1610156137d25763ffffffff80881660009081526014602052604081208851909289919085169081106136d557fe5b60209081029190910181015163ffffffff90811683528282019390935260409182016000908120898516825290915220548551608060020a9091046001608060020a031691869190841690811061372857fe5b6001608060020a03909216602092830290910182015263ffffffff80891660009081526014909252604082208851909291899190851690811061376757fe5b602090810290910181015163ffffffff908116835282820193909352604091820160009081208985168252909152205484516001608060020a039091169185919084169081106137b357fe5b6001608060020a0390921660209283029091019091015260010161369f565b5050935093915050565b6137e4615e99565b3360009081526004602052604090205463ffffffff16151561380557600080fd5b600854341015806138205750600254600160a060020a031633145b151561382b57600080fd5b600160a060020a0382166000908152600a602052604090205463ffffffff161561385457600080fd5b601283111561386257600080fd5b6007805463ffffffff8082166001908101821663ffffffff1993841681178555600160a060020a039096166000818152600a602081815260408084208054909816909a1790965586548516825260098652888220805473ffffffffffffffffffffffffffffffffffffffff191690931790925597900a85523387526004835285872054821660a08601908152935482168752600b83528587208551815585840151910180548688015160608801516080890151975160c0909901516001606860020a0316604060020a0274ffffffffffffffffffffffffff0000000000000000199987166401000000000267ffffffff000000001999151563010000000263ff00000019931515620100000262ff0000199515156101000261ff001999151560ff1990981697909717989098169590951793909316959095171691909117959095169490941794909416939093179091557f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a315490911683527fe05cd31702e6c5d366a557249766f77ad1ec870b62d942c3a61ebfada6a8e51e9052902080546001608060020a03608060020a808304821634018216029116179055565b6000806000846001605060020a03161115613a9f57613a3e8484612d30565b905060018515151415613a785780816001605060020a0316600186036001605060020a0316811515613a6c57fe5b04600101029150613aa3565b80816001605060020a0316856001605060020a0316811515613a9657fe5b04029150613aa3565b8391505b509392505050565b60008054606060020a900460ff161515600114613ac757600080fd5b60025463ffffffff60a060020a90910481169083161115613ae757600080fd5b613aef6156a1565b63ffffffff838116600090815260146020908152604080832060018452825280832093851683529290522054909150613b3890608060020a90046001608060020a031634610f5d565b63ffffffff80841660009081526014602090815260408083206001808552908352818420948716845293909152902080546001608060020a03938416608060020a02931692909217909155613b9b9083908390806001606860020a033416615a50565b5050565b69021e19e0c9bab240000181565b6007546040805163ffffffff90921680835260208082028401019091526060918291600091908015613be9578160200160208202803883390190505b506007546040805163ffffffff9092168083526020808202840101909152919450908015613c21578160200160208202803883390190505b509150600190505b60075463ffffffff9081169082161161236b5763ffffffff8082166000908152600960205260409020548451600160a060020a039091169185916000198501909116908110613c7457fe5b600160a060020a0390921660209283029091019091015281518190839063ffffffff600019840116908110613ca557fe5b63ffffffff909216602092830290910190910152600101613c29565b3360009081526004602052604081205460609182918190819063ffffffff16151580613cf75750600254600160a060020a031633145b1515613d0257600080fd5b60009250600191505b600c5463ffffffff90811690831611613d7f5763ffffffff88811660009081526014602090815260408083208b851684528252808320938616835292905220546001608060020a03878116608060020a8304821692821692909201161115613d74576001909201915b600190910190613d0b565b8263ffffffff16604051908082528060200260200182016040528015613daf578160200160208202803883390190505b5094508263ffffffff16604051908082528060200260200182016040528015613de2578160200160208202803883390190505b50935060009250600191505b600c5463ffffffff90811690831611613eb4575063ffffffff87811660009081526014602090815260408083208a851684528252808320938516835292905220546001608060020a03808216608060020a9092048116919091019086811690821610613ea95781858463ffffffff16815181101515613e6957fe5b63ffffffff9283166020918202909201015284516001850194839287929116908110613e9157fe5b6001608060020a039092166020928302909101909101525b600190910190613dee565b505050935093915050565b606080606080606080600080613ed3615e99565b600063ffffffff8c161515613efb573360009081526010602052604090205463ffffffff169b505b613f068c600461512a565b50601560008d63ffffffff1663ffffffff16815260200190815260200160002093508a61ffff16604051908082528060200260200182016040528015613f56578160200160208202803883390190505b5099508a61ffff16604051908082528060200260200182016040528015613f87578160200160208202803883390190505b5098508a61ffff16604051908082528060200260200182016040528015613fb8578160200160208202803883390190505b5097508a61ffff16604051908082528060200260200182016040528015613fe9578160200160208202803883390190505b5094508a61ffff1660405190808252806020026020018201604052801561401a578160200160208202803883390190505b5095508a61ffff1660405190808252806020026020018201604052801561404b578160200160208202803883390190505b50845490975063ffffffff169250821561425c575060005b63ffffffff83161580159061408157508a61ffff168163ffffffff16105b1561425c5763ffffffff838116600090815260126020908152604091829020825160e08101845281548086168083526401000000008204871694830194909452604060020a8104861694820194909452606060020a840485166060820152608060020a9093046001606860020a03166080840152600101546001605060020a03811660a08401526a0100000000000000000000900460ff16151560c0830152909350908e16141561423257828a8263ffffffff1681518110151561414157fe5b63ffffffff9283166020918202909201015260408301518a5190918b9190841690811061416a57fe5b63ffffffff928316602091820290920101526060830151895190918a9190841690811061419357fe5b63ffffffff9283166020918202909201015260808301518651909187919084169081106141bc57fe5b6001606860020a0390921660209283029091019091015260a08201518651879063ffffffff84169081106141ec57fe5b6001605060020a0390921660209283029091019091015260c082015187516001830192899163ffffffff90911690811061422257fe5b9115156020928302909101909101525b63ffffffff9283166000908152600185016020526040902054640100000000900490921691614063565b5050505093975093979195509350565b60608060008061427a615ed5565b86519250826040519080825280602002602001820160405280156142a8578160200160208202803883390190505b509450826040519080825280602002602001820160405280156142d5578160200160208202803883390190505b509350600091505b828210156143bf5763ffffffff86166000908152601360205260408120885190919089908590811061430b57fe5b602090810290910181015163ffffffff1682528181019290925260409081016000208151606081018352905460ff811682526001605060020a0361010082048116948301859052605860020a9091041691810191909152865190925086908490811061437357fe5b6001605060020a039092166020928302909101909101526040810151845185908490811061439d57fe5b6001605060020a039092166020928302909101909101526001909101906142dd565b5050509250929050565b600154600160a060020a031633146143e057600080fd5b600080546cff0000000000000000000000001916905563ffffffff82166001141561443157604051339082156108fc029083906000818181858888f19350505050151561442c57600080fd5b613b9b565b63ffffffff821660009081526009602090815260408083205481517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018690529151600160a060020a039091169363a9059cbb93604480850194919392918390030190829087803b1580156144b057600080fd5b505af11580156144c4573d6000803e3d6000fd5b505050506040513d60208110156144da57600080fd5b50505050565b3360009081526010602052604081205463ffffffff1680151561450257600080fd5b919050565b60008160c001511561457d57608082015163ffffffff84811660009081526014602090815260408083208188015185168452825280832082880151909416835292905220546001606860020a03909116608060020a9091046001608060020a03161061457557506001613233565b506000613233565b60408083015163ffffffff9081166000908152600b6020528281205460a0860151608087015160608801519094168352939091205490926402540be400926001606860020a0316919091026001605060020a0390911602048115156145de57fe5b63ffffffff858116600090815260146020908152604080832060608901518516845282528083208883015190941683529290522054919004608060020a9091046001608060020a03161061457557506001613233565b60008060008060008060008060008060008c6040015199508c6060015198508c60c00151151560011515141561467b578d5461010090046001605060020a03169750614690565b8d54605860020a90046001605060020a031697505b60009650600095505b6001605060020a038816158015906146be575060008d608001516001606860020a0316115b801561471a57508c60c0015180156146ec5750876001605060020a03168d60a001516001605060020a031611155b8061471a57508c60c0015115801561471a5750876001605060020a03168d60a001516001605060020a031610155b15614b845760c08d015115156001141561474f576001605060020a038816600090815260018f0160205260409020935061476c565b6001605060020a038816600090815260028f016020526040902093505b835463ffffffff1692505b835463ffffffff1615801590614792575063ffffffff831615155b80156147aa575060808d01516001606860020a031615155b15614b585763ffffffff8316600090815260126020526040902060808e015181549193506001606860020a03908116608060020a90920416106148395760808d01805183546001606860020a03608060020a8083048216849003909116027cffffffffffffffffffffffffff000000000000000000000000000000001990911617845560009091529450614881565b815460808e0180516001606860020a03608060020a8404811691829003169091527cffffffffffffffffffffffffff0000000000000000000000000000000019909116835594505b6040805160e081018252835463ffffffff8082168352640100000000820481166020840152604060020a8204811693830193909352606060020a81049092166060820152608060020a9091046001606860020a0316608082015260018301546001605060020a03811660a08301526a0100000000000000000000900460ff16151560c0820152614913908e9087615c90565b909501946c0c9f2c9cd04674edea400000016001606860020a0387161061493957600080fd5b5060208c015160c08d0151151560011415614a2057815460008054604060020a80820463ffffffff908116600181810183169093026bffffffff00000000000000001990941693909317909355604080518e85168152640100000000909504841660208601528584168582015260608501919091526001605060020a038c1660808501526001606860020a03891660a085015260c084019190915267ffffffffffffffff421660e084015251818f1692868316928e16917fd1baace08af1f93c73aedf5f7bce6194ecd40491b8f82a51f0b218fe1e0a2971918190036101000190a4614aeb565b8154600080546001604060020a80830463ffffffff90811692830181169091026bffffffff000000000000000019909316929092178355604080518e84168152868416602082015264010000000090950483168582015260608501939093526001605060020a038c1660808501526001606860020a03891660a085015260c084015267ffffffffffffffff421660e08401529051818616928f8316928e16917fd1baace08af1f93c73aedf5f7bce6194ecd40491b8f82a51f0b218fe1e0a2971918190036101000190a45b8154608060020a90046001606860020a031615614b0757614b58565b614b258a8a84600101600a9054906101000a900460ff168b876151aa565b151560011415614b49578154614b4990640100000000900463ffffffff168461557a565b835463ffffffff169250614777565b835463ffffffff161515614b7f578354604060020a90046001605060020a03169750600196505b614699565b60018715151415614c42578c60c0015115614bbf578d546affffffffffffffffffff0019166101006001605060020a038a1602178e55614bed565b8d5474ffffffffffffffffffff00000000000000000000001916605860020a6001605060020a038a1602178e555b60c08d015160408051911582526001605060020a038a166020830152805163ffffffff808d1693908e16927f02a998c439d01283c50acb516486f22eb80d74d328a8aa85743fac532c6e9bab92918290030190a35b50939c9b505050505050505050505050565b825160208401516040850151606086015160a0870151608088015160c08901516000908190819015614d435763ffffffff89811660009081526014602090815260408083208b851684528252808320938c168352929052208054909350614cd490608060020a90046001608060020a03166001606860020a038d16613216565b83546001608060020a03918216608060020a0291161783556001606860020a03841615614d3e578254614d19906001608060020a03166001606860020a038616610f5d565b83546fffffffffffffffffffffffffffffffff19166001608060020a03919091161783555b614ea8565b63ffffffff808a1660009081526014602090815260408083208a851684528252808320938c1683529290522092506001606860020a03841615614e615763ffffffff8088166000908152600b60205260408082205492891682529020546402540be400906001606860020a038716026001605060020a0388160204811515614dc757fe5b0491506c0c9f2c9cd04674edea400000018210614de357600080fd5b8254614e0a90608060020a90046001608060020a0316838c016001606860020a0316613216565b83546001608060020a03918216608060020a0290821617808555614e3891166001606860020a038416610f5d565b83546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178355614e9f565b8254614e8690608060020a90046001608060020a03166001606860020a038c16613216565b83546001608060020a03918216608060020a0291161783555b838b0399508695505b6001606860020a038a16156150585763ffffffff89166000908152600560205260409020546127109060ff168b026001606860020a0316049050808a036001606860020a0316601460008b63ffffffff1663ffffffff16815260200190815260200160002060008863ffffffff1663ffffffff16815260200190815260200160002060008a63ffffffff1663ffffffff16815260200190815260200160002060000160108282829054906101000a90046001608060020a03160192506101000a8154816001608060020a0302191690836001608060020a03160217905550806001606860020a0316601460008b63ffffffff1663ffffffff16815260200190815260200160002060008863ffffffff1663ffffffff1681526020019081526020016000206000600660008d63ffffffff1663ffffffff16815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060000160108282829054906101000a90046001608060020a03160192506101000a8154816001608060020a0302191690836001608060020a031602179055505b505050505050505050505050565b61506e615ef5565b5063ffffffff80831660009081526015602090815260409182902082519182019092529054909116808252156151015763ffffffff8084166000908152601560209081526040808320855185168452600101808352818420805486891663ffffffff199091168117909155865190855292529091208054919092166401000000000267ffffffff00000000199091161790555b5063ffffffff9182166000908152601560205260409020805463ffffffff191691909216179055565b3360009081526010602052604081205463ffffffff8481169116148061516b575063ffffffff83166000908152600d602052604090205460ff808416911610155b806151805750600254600160a060020a031633145b8061519f57503360009081526004602052604090205463ffffffff1615155b151561323357600080fd5b60008060006151b7615f07565b63ffffffff8089166000908152601360209081526040808320938d1683529290529081209350871515615205576001605060020a038716600090815260018501602052604090209250615222565b6001605060020a0387166000908152600285016020526040902092505b63ffffffff8616156155685763ffffffff8087166000908152600185016020908152604091829020825180840190935254808416835264010000000090049092169181018290529250156152a257815160208084015163ffffffff9081166000908152600187019092526040909120805463ffffffff1916919092161790555b815163ffffffff16156152ef57602082810151835163ffffffff9081166000908152600187019093526040909220805467ffffffff00000000191664010000000093909216929092021790555b825463ffffffff87811664010000000090920416141561532d578151835463ffffffff9091166401000000000267ffffffff00000000199091161783555b825463ffffffff87811691161415615359576020820151835463ffffffff191663ffffffff9091161783555b63ffffffff80871660009081526001850160205260409020805467ffffffffffffffff19169055835416151561555f578254604060020a90046001605060020a03161561542457600188151514156153d357508154604060020a90046001605060020a0316600090815260028401602052604090206153f7565b508154604060020a90046001605060020a0316600090815260018401602052604090205b82548154600080516020615f4683398151915216609060020a918290046001605060020a03169091021781555b8254609060020a90046001605060020a0316156154c4576001881515141561546e57508154609060020a90046001605060020a031660009081526002840160205260409020615492565b508154609060020a90046001605060020a0316600090815260018401602052604090205b8254815471ffffffffffffffffffff00000000000000001916604060020a918290046001605060020a03169091021781555b83546001605060020a03888116605860020a909204161415615517578254845474ffffffffffffffffffff00000000000000000000001916604060020a9091046001605060020a0316605860020a021784555b83546001605060020a0388811661010090920416141561555f57825484546affffffffffffffffffff001916610100604060020a9092046001605060020a0316919091021784555b6001945061556d565b600094505b5050505095945050505050565b615582615ef5565b5063ffffffff8281166000908152601560209081526040808320815180840183528154861681528686168552600190910190925290912054909164010000000082048116911681156156075763ffffffff858116600090815260156020908152604080832086851684526001019091529020805463ffffffff19169183169190911790555b63ffffffff8116156156595763ffffffff80861660009081526015602090815260408083208585168452600101909152902080549184166401000000000267ffffffff00000000199092169190911790555b8363ffffffff16836000015163ffffffff16141561569a5763ffffffff8581166000908152601560205260409020805463ffffffff19169184169190911790555b5050505050565b3360009081526010602052604081205463ffffffff16151561572557600c805463ffffffff808216600101811663ffffffff1992831681178455336000818152601060209081526040808320805490971690941790955594549092168452600e9092529120805473ffffffffffffffffffffffffffffffffffffffff191690911790555b503360009081526010602052604090205463ffffffff1690565b60608060008060008060008863ffffffff1660405190808252806020026020018201604052801561577a578160200160208202803883390190505b5096508863ffffffff166040519080825280602002602001820160405280156157ad578160200160208202803883390190505b5095508715156157ce57895461010090046001605060020a031692506157e3565b8954605860020a90046001605060020a031692505b6001605060020a03831615615a4357600094505b6001605060020a0383161580159061581a57508863ffffffff168563ffffffff16105b156159415787151561584657506001605060020a038216600090815260018a0160205260409020615862565b506001605060020a038216600090815260028a01602052604090205b805463ffffffff169350600091505b63ffffffff8416156158c85763ffffffff9384166000908152601260209081526040808320546001850190925290912054640100000000900490941693608060020a90046001606860020a03169190910190615871565b82878663ffffffff168151811015156158dd57fe5b6001605060020a0390921660209283029091019091015285518290879063ffffffff881690811061590a57fe5b6001606860020a0390921660209283029091019091015280546001909501946001605060020a03604060020a9091041692506157f7565b60008563ffffffff161115615a43575b8863ffffffff168563ffffffff161015615a4357600188151514156159d6576159a66001886001880363ffffffff1681518110151561598c57fe5b602090810290910101518c5460019091019060ff16613a1f565b878663ffffffff168151811015156159ba57fe5b6001605060020a03909216602092830290910190910152615a38565b615a0c60006001896001890363ffffffff168151811015156159f457fe5b602090810290910101518d549190039060ff16613a1f565b878663ffffffff16815181101515615a2057fe5b6001605060020a039092166020928302909101909101525b600190940193615951565b5050505050935093915050565b615a58615f1e565b821515602080830182815263ffffffff80881685526001608060020a03808716604080880191825267ffffffffffffffff42811660608a019081528e86166000908152601689528381208f881682528952838120805480891660019081018a1663ffffffff19928316811784558452918201909a529390208a5181549851955192519093167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff92909616650100000000000274ffffffffffffffffffffffffffffffff0000000000199515156401000000000264ff000000001994909816989099169790971791909116949094179190911694909417919091161790551415615c00576060808201516000805463ffffffff81811660018101821663ffffffff19909316929092179092556040805189841681526001608060020a038816602082015267ffffffffffffffff90941684820152938301529151828816928916917f6235021ead958d6a16078b65a45fa3dbae50d9def6d3783497c2253303b8fde5919081900360800190a36135fc565b6060808201516000805463ffffffff81811660018101821663ffffffff19909316929092179092556040805189841681526001608060020a038816602082015267ffffffffffffffff90941684820152938301529151828816928916917f24e4b81742f08bf8c724465f6c343cbf3f771ce88cdb98b2f9b531233c7b646a919081900360800190a3505050505050565b60208201516040840151606085015160009291908380806c0c9f2c9cd04674edea400000016001606860020a03891610615cc957600080fd5b63ffffffff8086166000908152600b60205260408082205460a08d0151938816835291205490916402540be400916001606860020a038c16026001605060020a039091160204811515615d1857fe5b0492506c0c9f2c9cd04674edea400000018310615d3457600080fd5b5050865163ffffffff9081166000908152601460208181526040808420888616855282528084208986168086529083528185208d5187168652938352818520958816855294825280842094845293905291902060c08a0151151560011415615e13578154615dbb90608060020a90046001608060020a03166001606860020a038a16610f5d565b82546001608060020a03918216608060020a029082161783558154615dea91166001606860020a038516613216565b81546fffffffffffffffffffffffffffffffff19166001608060020a0391909116178155615e8b565b8154615e31906001608060020a03166001606860020a038a16613216565b82546fffffffffffffffffffffffffffffffff19166001608060020a039182161783558154615e7291608060020a909104166001606860020a038516610f5d565b81546001608060020a03918216608060020a0291161781555b509098975050505050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516060810182526000808252602082018190529181019190915290565b60408051602081019091526000815290565b604080518082019091526000808252602082015290565b604080516080810182526000808252602082018190529181018290526060810191909152905600ffffffff00000000000000000000ffffffffffffffffffffffffffffffffffffa165627a7a72305820163017106c52a92cc0571246a2021e799d6dcf30f81bfd460c2d7f35971c8e420029

Swarm Source

bzzr://163017106c52a92cc0571246a2021e799d6dcf30f81bfd460c2d7f35971c8e42

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  ]
[ 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.