ETH Price: $3,338.43 (+2.41%)
Gas: 1 Gwei

Contract

0xf936AA9e1f22C915Abf4A66a5a6e94eb8716BA5e
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Sell Unit138608772021-12-23 10:35:39949 days ago1640255739IN
0xf936AA9e...b8716BA5e
0 ETH0.0044016841.29234081
Sell Unit118558012021-02-14 16:13:401261 days ago1613319220IN
0xf936AA9e...b8716BA5e
0 ETH0.00852474140
Sell Unit118558012021-02-14 16:13:401261 days ago1613319220IN
0xf936AA9e...b8716BA5e
0 ETH0.01676682140
Sell Unit117921852021-02-04 21:12:421271 days ago1612473162IN
0xf936AA9e...b8716BA5e
0 ETH0.00930708143.1
Sell Unit117874192021-02-04 3:47:241271 days ago1612410444IN
0xf936AA9e...b8716BA5e
0 ETH0.01457545120.2
Sell Unit117871172021-02-04 2:40:211271 days ago1612406421IN
0xf936AA9e...b8716BA5e
0 ETH0.00937397117.1
Sell Unit117855162021-02-03 20:47:381272 days ago1612385258IN
0xf936AA9e...b8716BA5e
0 ETH0.00960468120
Sell Unit111628152020-10-31 5:37:551367 days ago1604122675IN
0xf936AA9e...b8716BA5e
0 ETH0.0004627220
Sell Unit111628062020-10-31 5:36:151367 days ago1604122575IN
0xf936AA9e...b8716BA5e
0 ETH0.000460419.9
Sell Unit111626952020-10-31 5:08:451367 days ago1604120925IN
0xf936AA9e...b8716BA5e
0 ETH0.0018923619
Sell Unit111626862020-10-31 5:06:291367 days ago1604120789IN
0xf936AA9e...b8716BA5e
0 ETH0.0019023219.1
Sell Unit111626752020-10-31 5:04:101367 days ago1604120650IN
0xf936AA9e...b8716BA5e
0 ETH0.0004395819
Sell Unit111626262020-10-31 4:55:191367 days ago1604120119IN
0xf936AA9e...b8716BA5e
0 ETH0.0032332727
Sell Unit111626152020-10-31 4:53:001367 days ago1604119980IN
0xf936AA9e...b8716BA5e
0 ETH0.0016885621.1
Sell Unit111626012020-10-31 4:50:261367 days ago1604119826IN
0xf936AA9e...b8716BA5e
0 ETH0.0017285821.6
Sell Unit109701562020-10-01 12:27:401397 days ago1601555260IN
0xf936AA9e...b8716BA5e
0 ETH0.0047220559.0058
Sell Unit102927342020-06-18 23:53:291501 days ago1592524409IN
0xf936AA9e...b8716BA5e
0 ETH0.0036370830
Sell Unit102927302020-06-18 23:52:371501 days ago1592524357IN
0xf936AA9e...b8716BA5e
0 ETH0.0019508130
Sell Unit100804452020-05-17 0:56:071534 days ago1589676967IN
0xf936AA9e...b8716BA5e
0 ETH0.0010957111
Buy Unit99683272020-04-29 15:41:481552 days ago1588174908IN
0xf936AA9e...b8716BA5e
0 ETH0.0013453915
Sell Unit99057372020-04-19 23:08:521561 days ago1587337732IN
0xf936AA9e...b8716BA5e
0 ETH0.000160072
Sell Unit98786202020-04-15 18:25:411566 days ago1586975141IN
0xf936AA9e...b8716BA5e
0 ETH0.000298833
Sell Unit98779372020-04-15 15:53:181566 days ago1586965998IN
0xf936AA9e...b8716BA5e
0 ETH0.000325195
Sell Unit98732862020-04-14 22:36:031567 days ago1586903763IN
0xf936AA9e...b8716BA5e
0 ETH0.000560277
Sell Unit98732742020-04-14 22:34:091567 days ago1586903649IN
0xf936AA9e...b8716BA5e
0 ETH0.000531687
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Units

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-05-05
*/

pragma solidity ^0.4.25;

/**
 * 
 * World War Goo - Competitive Idle Game
 * 
 * https://ethergoo.io
 * 
 */


contract Units {

    GooToken constant goo = GooToken(0xdf0960778c6e6597f197ed9a25f12f5d971da86c);
    Army army = Army(0x0);
    Clans clans = Clans(0x0);
    Factories constant factories = Factories(0xc81068cd335889736fc485592e4d73a82403d44b);

    mapping(address => mapping(uint256 => UnitsOwned)) public unitsOwned;
    mapping(address => mapping(uint256 => UnitExperience)) public unitExp;
    mapping(address => mapping(uint256 => uint256)) private unitMaxCap;

    mapping(address => mapping(uint256 => UnitUpgrades)) private unitUpgrades;
    mapping(address => mapping(uint256 => UpgradesOwned)) public upgradesOwned; // For each unitId, which upgrades owned (3 columns of uint64)

    mapping(uint256 => Unit) public unitList;
    mapping(uint256 => Upgrade) public upgradeList;
    mapping(address => bool) operator;

    address owner;

    constructor() public {
        owner = msg.sender;
    }

    struct UnitsOwned {
        uint80 units;
        uint8 factoryBuiltFlag; // Incase user sells units, we still want to keep factory
    }

    struct UnitExperience {
        uint224 experience;
        uint32 level;
    }

    struct UnitUpgrades {
        uint32 prodIncrease;
        uint32 prodMultiplier;

        uint32 attackIncrease;
        uint32 attackMultiplier;
        uint32 defenseIncrease;
        uint32 defenseMultiplier;
        uint32 lootingIncrease;
        uint32 lootingMultiplier;
    }

    struct UpgradesOwned {
        uint64 column0;
        uint64 column1;
        uint64 column2;
    }


    // Unit & Upgrade data:
    
    struct Unit {
        uint256 unitId;
        uint224 gooCost;
        uint256 baseProduction;
        uint80 attack;
        uint80 defense;
        uint80 looting;
    }

    struct Upgrade {
        uint256 upgradeId;
        uint224 gooCost;
        uint256 unitId;
        uint256 column; // Columns of upgrades (1st & 2nd are unit specific, then 3rd is capacity)
        uint256 prerequisiteUpgrade;

        uint256 unitMaxCapacityGain;
        uint32 prodIncrease;
        uint32 prodMultiplier;
        uint32 attackIncrease;
        uint32 attackMultiplier;
        uint32 defenseIncrease;
        uint32 defenseMultiplier;
        uint32 lootingIncrease;
        uint32 lootingMultiplier;
    }

    function setArmy(address armyContract) external {
        require(msg.sender == owner);
        army = Army(armyContract);
    }

    function setClans(address clansContract) external {
        require(msg.sender == owner);
        clans = Clans(clansContract);
    }

    function setOperator(address gameContract, bool isOperator) external {
        require(msg.sender == owner);
        operator[gameContract] = isOperator;
    }

    function mintUnitExternal(uint256 unit, uint80 amount, address player, uint8 chosenPosition) external {
        require(operator[msg.sender]);
        mintUnit(unit, amount, player, chosenPosition);
    }

    function mintUnit(uint256 unit, uint80 amount, address player, uint8 chosenPosition) internal {
        UnitsOwned storage existingUnits = unitsOwned[player][unit];
        if (existingUnits.factoryBuiltFlag == 0) {
            // Edge case to create factory for player (on empty tile) where it is their first unit
            uint256[] memory existingFactories = factories.getFactories(player);
            uint256 length = existingFactories.length;

            // Provided position is not valid so find valid factory position
            if (chosenPosition >= factories.MAX_SIZE() || (chosenPosition < length && existingFactories[chosenPosition] > 0)) {
                chosenPosition = 0;
                while (chosenPosition < length && existingFactories[chosenPosition] > 0) {
                    chosenPosition++;
                }
            }

            factories.addFactory(player, chosenPosition, unit);
            unitsOwned[player][unit] = UnitsOwned(amount, 1); // 1 = Flag to say factory exists
        } else {
            existingUnits.units += amount;
        }

        (uint80 attackStats, uint80 defenseStats, uint80 lootingStats) = getUnitsCurrentBattleStats(player, unit);
        if (attackStats > 0 || defenseStats > 0 || lootingStats > 0) {
            army.increasePlayersArmyPowerTrio(player, attackStats * amount, defenseStats * amount, lootingStats * amount);
        } else {
            uint256 prodIncrease = getUnitsCurrentProduction(player, unit) * amount;
            goo.increasePlayersGooProduction(player, prodIncrease / 100);
        }
    }


    function deleteUnitExternal(uint80 amount, uint256 unit, address player) external {
        require(operator[msg.sender]);
        deleteUnit(amount, unit, player);
    }

    function deleteUnit(uint80 amount, uint256 unit, address player) internal {
        (uint80 attackStats, uint80 defenseStats, uint80 lootingStats) = getUnitsCurrentBattleStats(player, unit);
        if (attackStats > 0 || defenseStats > 0 || lootingStats > 0) {
            army.decreasePlayersArmyPowerTrio(player, attackStats * amount, defenseStats * amount, lootingStats * amount);
        } else {
            uint256 prodDecrease = getUnitsCurrentProduction(player, unit) * amount;
            goo.decreasePlayersGooProduction(player, prodDecrease / 100);
        }
        unitsOwned[player][unit].units -= amount;
    }


    function getUnitsCurrentBattleStats(address player, uint256 unitId) internal view returns (uint80 attack, uint80 defense, uint80 looting) {
        Unit memory unit = unitList[unitId];
        UnitUpgrades memory existingUpgrades = unitUpgrades[player][unitId];
        attack = (unit.attack + existingUpgrades.attackIncrease) * (100 + existingUpgrades.attackMultiplier);
        defense = (unit.defense + existingUpgrades.defenseIncrease) * (100 + existingUpgrades.defenseMultiplier);
        looting = (unit.looting + existingUpgrades.lootingIncrease) * (100 + existingUpgrades.lootingMultiplier);
    }
    
    function getUnitsCurrentProduction(address player, uint256 unitId) public view returns (uint256) {
        UnitUpgrades memory existingUpgrades = unitUpgrades[player][unitId];
        return (unitList[unitId].baseProduction + existingUpgrades.prodIncrease) * (100 + existingUpgrades.prodMultiplier);
    }


    function buyUnit(uint256 unitId, uint80 amount, uint8 position) external {
        uint224 gooCost = SafeMath224.mul(unitList[unitId].gooCost, amount);
        require(gooCost > 0); // Valid unit

        uint80 newTotal = unitsOwned[msg.sender][unitId].units + amount;
        if (newTotal > 99) {
            require(newTotal < 99 + unitMaxCap[msg.sender][unitId]);
        }

        // Clan discount
        uint224 unitDiscount = clans.getPlayersClanUpgrade(msg.sender, 1); // class 1 = unit discount
        uint224 reducedGooCost = gooCost - ((gooCost * unitDiscount) / 100);
        uint224 seventyFivePercentRefund = (gooCost * 3) / 4;

        // Update players goo
        goo.updatePlayersGooFromPurchase(msg.sender, reducedGooCost);
        goo.mintGoo(seventyFivePercentRefund, this); // 75% refund is stored (in this contract) for when player sells unit
        army.depositSpentGoo(reducedGooCost - seventyFivePercentRefund); // Upto 25% Goo spent goes to divs (Remaining is discount + 75% player gets back when selling unit)
        mintUnit(unitId, amount, msg.sender, position);
    }


    function sellUnit(uint256 unitId, uint80 amount) external {
        require(unitsOwned[msg.sender][unitId].units >= amount && amount > 0);

        uint224 gooCost = unitList[unitId].gooCost;
        require(gooCost > 0);

        goo.updatePlayersGoo(msg.sender);
        deleteUnit(amount, unitId, msg.sender);
        goo.transfer(msg.sender, (gooCost * amount * 3) / 4); // Refund 75%
    }


    function grantArmyExp(address player, uint256 unitId, uint224 amount) external returns(bool) {
        require(operator[msg.sender]);

        UnitExperience memory existingExp = unitExp[player][unitId];
        uint224 expRequirement = (existingExp.level + 1) * 80; // Lvl 1: 80; Lvl 2: 160, Lvl 3: 240 (480 in total) etc.

        if (existingExp.experience + amount >= expRequirement) {
            existingExp.experience = (existingExp.experience + amount) - expRequirement;
            existingExp.level++;
            unitExp[player][unitId] = existingExp;

            // Grant buff to unit (5% additive multiplier)
            UnitUpgrades memory existingUpgrades = unitUpgrades[player][unitId];
            existingUpgrades.attackMultiplier += 5;
            existingUpgrades.defenseMultiplier += 5;
            existingUpgrades.lootingMultiplier += 5;
            unitUpgrades[player][unitId] = existingUpgrades;

            // Increase player's army power
            uint80 multiplierGain = unitsOwned[player][unitId].units * 5;

            Unit memory unit = unitList[unitId];
            uint80 attackGain = multiplierGain * (unit.attack + existingUpgrades.attackIncrease);
            uint80 defenseGain = multiplierGain * (unit.defense + existingUpgrades.defenseIncrease);
            uint80 lootingGain = multiplierGain * (unit.looting + existingUpgrades.lootingIncrease);
            army.increasePlayersArmyPowerTrio(player, attackGain, defenseGain, lootingGain);
            return true;
        } else {
            unitExp[player][unitId].experience += amount;
            return false;
        }
    }

    function increaseUnitCapacity(address player, uint256 upgradeGain, uint256 unitId) external {
        require(operator[msg.sender]);
        unitMaxCap[player][unitId] += upgradeGain;
    }

    function decreaseUnitCapacity(address player, uint256 upgradeGain, uint256 unitId) external {
        require(operator[msg.sender]);
        unitMaxCap[player][unitId] -= upgradeGain;
    }


    function increaseUpgradesExternal(address player, uint256 unitId, uint32 prodIncrease, uint32 prodMultiplier, uint32 attackIncrease, uint32 attackMultiplier, uint32 defenseIncrease, uint32 defenseMultiplier, uint32 lootingIncrease, uint32 lootingMultiplier) external {
        require(operator[msg.sender]);
        Upgrade memory upgrade = Upgrade(0,0,0,0,0,0, prodIncrease, prodMultiplier, attackIncrease, attackMultiplier, defenseIncrease, defenseMultiplier, lootingIncrease, lootingMultiplier);
        increaseUpgrades(player, upgrade, unitId);
    }


    function increaseUpgrades(address player, Upgrade upgrade, uint256 unitId) internal {
        uint80 units = unitsOwned[player][unitId].units;
        UnitUpgrades memory existingUpgrades = unitUpgrades[player][unitId];

        Unit memory unit = unitList[unitId];
        if (unit.baseProduction > 0) {
            // Increase goo production
            uint256 prodGain = units * upgrade.prodMultiplier * (unit.baseProduction + existingUpgrades.prodIncrease); // Multiplier gains
            prodGain += units * upgrade.prodIncrease * (100 + existingUpgrades.prodMultiplier); // Base prod gains

            goo.updatePlayersGoo(player);
            goo.increasePlayersGooProduction(player, prodGain / 100);
        } else {
            // Increase army power
            uint80 attackGain = units * upgrade.attackMultiplier * (unit.attack + existingUpgrades.attackIncrease); // Multiplier gains
            uint80 defenseGain = units * upgrade.defenseMultiplier * (unit.defense + existingUpgrades.defenseIncrease); // Multiplier gains
            uint80 lootingGain = units * upgrade.lootingMultiplier * (unit.looting + existingUpgrades.lootingIncrease); // Multiplier gains

            attackGain += units * upgrade.attackIncrease * (100 + existingUpgrades.attackMultiplier); // + Base gains
            defenseGain += units * upgrade.defenseIncrease * (100 + existingUpgrades.defenseMultiplier); // + Base gains
            lootingGain += units * upgrade.lootingIncrease * (100 + existingUpgrades.lootingMultiplier); // + Base gains

            army.increasePlayersArmyPowerTrio(player, attackGain, defenseGain, lootingGain);
        }

        existingUpgrades.prodIncrease += upgrade.prodIncrease;
        existingUpgrades.prodMultiplier += upgrade.prodMultiplier;
        existingUpgrades.attackIncrease += upgrade.attackIncrease;
        existingUpgrades.attackMultiplier += upgrade.attackMultiplier;
        existingUpgrades.defenseIncrease += upgrade.defenseIncrease;
        existingUpgrades.defenseMultiplier += upgrade.defenseMultiplier;
        existingUpgrades.lootingIncrease += upgrade.lootingIncrease;
        existingUpgrades.lootingMultiplier += upgrade.lootingMultiplier;
        unitUpgrades[player][unitId] = existingUpgrades;
    }


    function decreaseUpgradesExternal(address player, uint256 unitId, uint32 prodIncrease, uint32 prodMultiplier, uint32 attackIncrease, uint32 attackMultiplier, uint32 defenseIncrease, uint32 defenseMultiplier, uint32 lootingIncrease, uint32 lootingMultiplier) external {
        require(operator[msg.sender]);
        Upgrade memory upgrade = Upgrade(0,0,0,0,0,0, prodIncrease, prodMultiplier, attackIncrease, attackMultiplier, defenseIncrease, defenseMultiplier, lootingIncrease, lootingMultiplier);
        decreaseUpgrades(player, upgrade, unitId);
    }


    function decreaseUpgrades(address player, Upgrade upgrade, uint256 unitId) internal {
        uint80 units = unitsOwned[player][unitId].units;
        UnitUpgrades memory existingUpgrades = unitUpgrades[player][unitId];

        Unit memory unit = unitList[unitId];
        if (unit.baseProduction > 0) {
            // Decrease goo production
            uint256 prodLoss = units * upgrade.prodMultiplier * (unit.baseProduction + existingUpgrades.prodIncrease); // Multiplier losses
            prodLoss += units * upgrade.prodIncrease * (100 + existingUpgrades.prodMultiplier); // Base prod losses

            goo.updatePlayersGoo(player);
            goo.decreasePlayersGooProduction(player, prodLoss / 100);
        } else {
            // Decrease army power
            uint80 attackLoss = units * upgrade.attackMultiplier * (unit.attack + existingUpgrades.attackIncrease); // Multiplier losses
            uint80 defenseLoss = units * upgrade.defenseMultiplier * (unit.defense + existingUpgrades.defenseIncrease); // Multiplier losses
            uint80 lootingLoss = units * upgrade.lootingMultiplier * (unit.looting + existingUpgrades.lootingIncrease); // Multiplier losses

            attackLoss += units * upgrade.attackIncrease * (100 + existingUpgrades.attackMultiplier); // + Base losses
            defenseLoss += units * upgrade.defenseIncrease * (100 + existingUpgrades.defenseMultiplier); // + Base losses
            lootingLoss += units * upgrade.lootingIncrease * (100 + existingUpgrades.lootingMultiplier); // + Base losses
            army.decreasePlayersArmyPowerTrio(player, attackLoss, defenseLoss, lootingLoss);
        }

        existingUpgrades.prodIncrease -= upgrade.prodIncrease;
        existingUpgrades.prodMultiplier -= upgrade.prodMultiplier;
        existingUpgrades.attackIncrease -= upgrade.attackIncrease;
        existingUpgrades.attackMultiplier -= upgrade.attackMultiplier;
        existingUpgrades.defenseIncrease -= upgrade.defenseIncrease;
        existingUpgrades.defenseMultiplier -= upgrade.defenseMultiplier;
        existingUpgrades.lootingIncrease -= upgrade.lootingIncrease;
        existingUpgrades.lootingMultiplier -= upgrade.lootingMultiplier;
        unitUpgrades[player][unitId] = existingUpgrades;
    }

    function swapUpgradesExternal(address player, uint256 unitId, uint32[8] upgradeGains, uint32[8] upgradeLosses) external {
        require(operator[msg.sender]);

        UnitUpgrades memory existingUpgrades = unitUpgrades[player][unitId];
        Unit memory unit = unitList[unitId];

        if (unit.baseProduction > 0) {
            // Change goo production
            gooProductionChange(player, unitId, existingUpgrades, unit.baseProduction, upgradeGains, upgradeLosses);
        } else {
            // Change army power
            armyPowerChange(player, existingUpgrades, unit, upgradeGains, upgradeLosses);
        }
    }
    
    function armyPowerChange(address player, UnitUpgrades existingUpgrades, Unit unit, uint32[8] upgradeGains, uint32[8] upgradeLosses) internal {
        int256 existingAttack = int256((unit.attack + existingUpgrades.attackIncrease) * (100 + existingUpgrades.attackMultiplier));
        int256 existingDefense = int256((unit.defense + existingUpgrades.defenseIncrease) * (100 + existingUpgrades.defenseMultiplier));
        int256 existingLooting = int256((unit.looting + existingUpgrades.lootingIncrease) * (100 + existingUpgrades.lootingMultiplier));
    
        existingUpgrades.attackIncrease = uint32(int(existingUpgrades.attackIncrease) + (int32(upgradeGains[2]) - int32(upgradeLosses[2])));
        existingUpgrades.attackMultiplier = uint32(int(existingUpgrades.attackMultiplier) + (int32(upgradeGains[3]) - int32(upgradeLosses[3])));
        existingUpgrades.defenseIncrease = uint32(int(existingUpgrades.defenseIncrease) + (int32(upgradeGains[4]) - int32(upgradeLosses[4])));
        existingUpgrades.defenseMultiplier = uint32(int(existingUpgrades.defenseMultiplier) + (int32(upgradeGains[5]) - int32(upgradeLosses[5])));
        existingUpgrades.lootingIncrease = uint32(int(existingUpgrades.lootingIncrease) + (int32(upgradeGains[6]) - int32(upgradeLosses[6])));
        existingUpgrades.lootingMultiplier = uint32(int(existingUpgrades.lootingMultiplier) + (int32(upgradeGains[7]) - int32(upgradeLosses[7])));
        
        int256 attackChange = ((int256(unit.attack) + existingUpgrades.attackIncrease) * (100 + existingUpgrades.attackMultiplier)) - existingAttack;
        int256 defenseChange = ((int256(unit.defense) + existingUpgrades.defenseIncrease) * (100 + existingUpgrades.defenseMultiplier)) - existingDefense;
        int256 lootingChange = ((int256(unit.looting) + existingUpgrades.lootingIncrease) * (100 + existingUpgrades.lootingMultiplier)) - existingLooting;
        
        uint256 unitId = unit.unitId;
        int256 units = int256(unitsOwned[player][unitId].units);
        
        army.changePlayersArmyPowerTrio(player, units * attackChange, units * defenseChange, units * lootingChange);
        unitUpgrades[player][unitId] = existingUpgrades;
    }
    
    function gooProductionChange(address player, uint256 unitId, UnitUpgrades existingUpgrades, uint256 baseProduction, uint32[8] upgradeGains, uint32[8] upgradeLosses) internal {
        goo.updatePlayersGoo(player);
        
        int256 existingProd = int256((baseProduction + existingUpgrades.prodIncrease) * (100 + existingUpgrades.prodMultiplier));
        existingUpgrades.prodIncrease = uint32(int(existingUpgrades.prodIncrease) + (int32(upgradeGains[0]) - int32(upgradeLosses[0])));
        existingUpgrades.prodMultiplier = uint32(int(existingUpgrades.prodMultiplier) + (int32(upgradeGains[1]) - int32(upgradeLosses[1])));            
        
        int256 prodChange = ((int256(baseProduction) + existingUpgrades.prodIncrease) * (100 + existingUpgrades.prodMultiplier)) - existingProd;
        if (prodChange > 0) {
            goo.increasePlayersGooProduction(player, (unitsOwned[player][unitId].units * uint256(prodChange)) / 100);
        } else {
            goo.decreasePlayersGooProduction(player, (unitsOwned[player][unitId].units * uint256(-prodChange)) / 100);
        }
        
        unitUpgrades[player][unitId] = existingUpgrades;
    }

    function addUnit(uint256 id, uint224 baseGooCost, uint256 baseGooProduction, uint80 baseAttack, uint80 baseDefense, uint80 baseLooting) external {
        require(operator[msg.sender]);
        unitList[id] = Unit(id, baseGooCost, baseGooProduction, baseAttack, baseDefense, baseLooting);
    }


    function addUpgrade(uint256 id, uint224 gooCost, uint256 unit, uint256 column, uint256 prereq, uint256 unitMaxCapacityGain, uint32[8] upgradeGains) external {
        require(operator[msg.sender]);
        upgradeList[id] = Upgrade(id, gooCost, unit, column, prereq, unitMaxCapacityGain, upgradeGains[0], upgradeGains[1], upgradeGains[2], upgradeGains[3], upgradeGains[4], upgradeGains[5], upgradeGains[6], upgradeGains[7]);
    }

    function buyUpgrade(uint64 upgradeId) external {
        Upgrade memory upgrade = upgradeList[upgradeId];
        uint256 unitId = upgrade.unitId;
        UpgradesOwned memory ownedUpgrades = upgradesOwned[msg.sender][unitId];

        uint64 latestUpgradeOwnedForColumn;
        if (upgrade.column == 0) {
            latestUpgradeOwnedForColumn = ownedUpgrades.column0;
            ownedUpgrades.column0 = upgradeId;  // Update upgradesOwned
        } else if (upgrade.column == 1) {
            latestUpgradeOwnedForColumn = ownedUpgrades.column1;
            ownedUpgrades.column1 = upgradeId;  // Update upgradesOwned
        } else if (upgrade.column == 2) {
            latestUpgradeOwnedForColumn = ownedUpgrades.column2;
            ownedUpgrades.column2 = upgradeId;  // Update upgradesOwned
        }
        upgradesOwned[msg.sender][unitId] = ownedUpgrades;

        require(unitId > 0); // Valid upgrade
        require(latestUpgradeOwnedForColumn < upgradeId); // Haven't already purchased
        require(latestUpgradeOwnedForColumn >= upgrade.prerequisiteUpgrade); // Own prequisite

        // Clan discount
        uint224 upgradeDiscount = clans.getPlayersClanUpgrade(msg.sender, 0); // class 0 = upgrade discount
        uint224 reducedUpgradeCost = upgrade.gooCost - ((upgrade.gooCost * upgradeDiscount) / 100);

        // Update players goo
        goo.updatePlayersGooFromPurchase(msg.sender, reducedUpgradeCost);
        army.depositSpentGoo(reducedUpgradeCost); // Transfer to goo bankroll

        // Update stats for upgrade
        if (upgrade.column == 2) {
            unitMaxCap[msg.sender][unitId] += upgrade.unitMaxCapacityGain;
        } else if (upgrade.column == 1) {
            increaseUpgrades(msg.sender, upgrade, unitId);
        } else if (upgrade.column == 0) {
            increaseUpgrades(msg.sender, upgrade, unitId);
        }
    }

}




contract GooToken {
    function transfer(address to, uint256 tokens) external returns (bool);
    function increasePlayersGooProduction(address player, uint256 increase) external;
    function decreasePlayersGooProduction(address player, uint256 decrease) external;
    function updatePlayersGooFromPurchase(address player, uint224 purchaseCost) external;
    function updatePlayersGoo(address player) external;
    function mintGoo(uint224 amount, address player) external;
}

contract Army {
    function depositSpentGoo(uint224 gooSpent) external;
    function increasePlayersArmyPowerTrio(address player, uint80 attackGain, uint80 defenseGain, uint80 lootingGain) public;
    function decreasePlayersArmyPowerTrio(address player, uint80 attackLoss, uint80 defenseLoss, uint80 lootingLoss) public;
    function changePlayersArmyPowerTrio(address player, int attackChange, int defenseChange, int lootingChange) public;

}

contract Clans {
    mapping(uint256 => uint256) public clanTotalArmyPower;
    function totalSupply() external view returns (uint256);
    function depositGoo(uint256 amount, uint256 clanId) external;
    function getPlayerFees(address player) external view returns (uint224 clansFee, uint224 leadersFee, address leader, uint224 referalsFee, address referer);
    function getPlayersClanUpgrade(address player, uint256 upgradeClass) external view returns (uint224 upgradeGain);
    function mintGoo(address player, uint256 amount) external;
    function increaseClanPower(address player, uint256 amount) external;
    function decreaseClanPower(address player, uint256 amount) external;
}

contract Factories {
    uint256 public constant MAX_SIZE = 40;
    function getFactories(address player) external returns (uint256[]);
    function addFactory(address player, uint8 position, uint256 unitId) external;
}


library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint224 a, uint224 b) internal pure returns (uint224) {
    if (a == 0) {
      return 0;
    }
    uint224 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}


library SafeMath224 {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint224 a, uint224 b) internal pure returns (uint224) {
    if (a == 0) {
      return 0;
    }
    uint224 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint224 a, uint224 b) internal pure returns (uint224) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint224 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint224 a, uint224 b) internal pure returns (uint224) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint224 a, uint224 b) internal pure returns (uint224) {
    uint224 c = a + b;
    assert(c >= a);
    return c;
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"upgradesOwned","outputs":[{"name":"column0","type":"uint64"},{"name":"column1","type":"uint64"},{"name":"column2","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"unitList","outputs":[{"name":"unitId","type":"uint256"},{"name":"gooCost","type":"uint224"},{"name":"baseProduction","type":"uint256"},{"name":"attack","type":"uint80"},{"name":"defense","type":"uint80"},{"name":"looting","type":"uint80"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"unitExp","outputs":[{"name":"experience","type":"uint224"},{"name":"level","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint80"},{"name":"unit","type":"uint256"},{"name":"player","type":"address"}],"name":"deleteUnitExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"upgradeList","outputs":[{"name":"upgradeId","type":"uint256"},{"name":"gooCost","type":"uint224"},{"name":"unitId","type":"uint256"},{"name":"column","type":"uint256"},{"name":"prerequisiteUpgrade","type":"uint256"},{"name":"unitMaxCapacityGain","type":"uint256"},{"name":"prodIncrease","type":"uint32"},{"name":"prodMultiplier","type":"uint32"},{"name":"attackIncrease","type":"uint32"},{"name":"attackMultiplier","type":"uint32"},{"name":"defenseIncrease","type":"uint32"},{"name":"defenseMultiplier","type":"uint32"},{"name":"lootingIncrease","type":"uint32"},{"name":"lootingMultiplier","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"armyContract","type":"address"}],"name":"setArmy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"unit","type":"uint256"},{"name":"amount","type":"uint80"},{"name":"player","type":"address"},{"name":"chosenPosition","type":"uint8"}],"name":"mintUnitExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"player","type":"address"},{"name":"unitId","type":"uint256"},{"name":"upgradeGains","type":"uint32[8]"},{"name":"upgradeLosses","type":"uint32[8]"}],"name":"swapUpgradesExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"unitId","type":"uint256"},{"name":"amount","type":"uint80"},{"name":"position","type":"uint8"}],"name":"buyUnit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"upgradeId","type":"uint64"}],"name":"buyUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"player","type":"address"},{"name":"upgradeGain","type":"uint256"},{"name":"unitId","type":"uint256"}],"name":"increaseUnitCapacity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"gameContract","type":"address"},{"name":"isOperator","type":"bool"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"player","type":"address"},{"name":"unitId","type":"uint256"},{"name":"amount","type":"uint224"}],"name":"grantArmyExp","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"player","type":"address"},{"name":"unitId","type":"uint256"},{"name":"prodIncrease","type":"uint32"},{"name":"prodMultiplier","type":"uint32"},{"name":"attackIncrease","type":"uint32"},{"name":"attackMultiplier","type":"uint32"},{"name":"defenseIncrease","type":"uint32"},{"name":"defenseMultiplier","type":"uint32"},{"name":"lootingIncrease","type":"uint32"},{"name":"lootingMultiplier","type":"uint32"}],"name":"decreaseUpgradesExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"player","type":"address"},{"name":"unitId","type":"uint256"},{"name":"prodIncrease","type":"uint32"},{"name":"prodMultiplier","type":"uint32"},{"name":"attackIncrease","type":"uint32"},{"name":"attackMultiplier","type":"uint32"},{"name":"defenseIncrease","type":"uint32"},{"name":"defenseMultiplier","type":"uint32"},{"name":"lootingIncrease","type":"uint32"},{"name":"lootingMultiplier","type":"uint32"}],"name":"increaseUpgradesExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"unitsOwned","outputs":[{"name":"units","type":"uint80"},{"name":"factoryBuiltFlag","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"player","type":"address"},{"name":"upgradeGain","type":"uint256"},{"name":"unitId","type":"uint256"}],"name":"decreaseUnitCapacity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"baseGooCost","type":"uint224"},{"name":"baseGooProduction","type":"uint256"},{"name":"baseAttack","type":"uint80"},{"name":"baseDefense","type":"uint80"},{"name":"baseLooting","type":"uint80"}],"name":"addUnit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"player","type":"address"},{"name":"unitId","type":"uint256"}],"name":"getUnitsCurrentProduction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"gooCost","type":"uint224"},{"name":"unit","type":"uint256"},{"name":"column","type":"uint256"},{"name":"prereq","type":"uint256"},{"name":"unitMaxCapacityGain","type":"uint256"},{"name":"upgradeGains","type":"uint32[8]"}],"name":"addUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"unitId","type":"uint256"},{"name":"amount","type":"uint80"}],"name":"sellUnit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"clansContract","type":"address"}],"name":"setClans","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]

608060405260008054600160a060020a031990811690915560018054909116905534801561002c57600080fd5b50600a8054600160a060020a031916331790556144758061004e6000396000f30060806040526004361061010e5763ffffffff60e060020a600035041663069d04f781146101135780630a8e987c146101635780630cdddceb146101c157806311d5aa931461020d578063126ef2801461023f57806312e68ddf146102e057806343f4e4dc14610301578063454764ac146103375780634705c18114610360578063511de2801461038a5780635352df60146103ac578063558a7297146103d357806360bada1c146103f9578063a442ed601461043d578063a9ed5b4314610496578063c1431eda146104ef578063c26c006d14610538578063c95186751461055f578063d1bf3d3f1461059e578063e00cf084146105d4578063e6fe72bb14610606578063f40b26bd1461062a575b600080fd5b34801561011f57600080fd5b50610137600160a060020a036004351660243561064b565b6040805167ffffffffffffffff9485168152928416602084015292168183015290519081900360600190f35b34801561016f57600080fd5b5061017b60043561068d565b60408051968752600160e060020a039095166020870152858501939093526001605060020a039182166060860152811660808501521660a0830152519081900360c00190f35b3480156101cd57600080fd5b506101e5600160a060020a03600435166024356106e4565b60408051600160e060020a03909316835263ffffffff90911660208301528051918290030190f35b34801561021957600080fd5b5061023d6001605060020a0360043516602435600160a060020a0360443516610719565b005b34801561024b57600080fd5b50610257600435610747565b604080519e8f52600160e060020a03909d1660208f01528d8d019b909b5260608d019990995260808c019790975260a08b019590955263ffffffff93841660c08b015291831660e08a015282166101008901528116610120880152908116610140870152908116610160860152908116610180850152166101a083015251908190036101c00190f35b3480156102ec57600080fd5b5061023d600160a060020a03600435166107ea565b34801561030d57600080fd5b5061023d6004356001605060020a0360243516600160a060020a036044351660ff60643516610830565b34801561034357600080fd5b5061023d600160a060020a03600435166024356044610144610860565b34801561036c57600080fd5b5061023d6004356001605060020a036024351660ff60443516610a73565b34801561039657600080fd5b5061023d67ffffffffffffffff60043516610d9f565b3480156103b857600080fd5b5061023d600160a060020a036004351660243560443561125f565b3480156103df57600080fd5b5061023d600160a060020a036004351660243515156112ac565b34801561040557600080fd5b50610429600160a060020a0360043516602435600160e060020a03604435166112ee565b604080519115158252519081900360200190f35b34801561044957600080fd5b5061023d600160a060020a036004351660243563ffffffff60443581169060643581169060843581169060a43581169060c43581169060e435811690610104358116906101243516611a76565b3480156104a257600080fd5b5061023d600160a060020a036004351660243563ffffffff60443581169060643581169060843581169060a43581169060c43581169060e435811690610104358116906101243516611b54565b3480156104fb57600080fd5b50610513600160a060020a0360043516602435611c25565b604080516001605060020a03909316835260ff90911660208301528051918290030190f35b34801561054457600080fd5b5061023d600160a060020a0360043516602435604435611c5e565b34801561056b57600080fd5b5061023d600435600160e060020a03602435166044356001605060020a0360643581169060843581169060a43516611cac565b3480156105aa57600080fd5b506105c2600160a060020a0360043516602435611ddf565b60408051918252519081900360200190f35b3480156105e057600080fd5b5061023d600435600160e060020a036024351660443560643560843560a43560c4611ebc565b34801561061257600080fd5b5061023d6004356001605060020a036024351661214a565b34801561063657600080fd5b5061023d600160a060020a0360043516612300565b600660209081526000928352604080842090915290825290205467ffffffffffffffff80821691680100000000000000008104821691608060020a9091041683565b60076020526000908152604090208054600182015460028301546003909301549192600160e060020a03909116916001605060020a03808216916a0100000000000000000000810482169160a060020a9091041686565b6003602090815260009283526040808420909152908252902054600160e060020a0381169060e060020a900463ffffffff1682565b3360009081526009602052604090205460ff16151561073757600080fd5b610742838383612346565b505050565b60086020526000908152604090208054600182015460028301546003840154600485015460058601546006909601549495600160e060020a03909416949293919290919063ffffffff8082169164010000000081048216916801000000000000000082048116916c010000000000000000000000008104821691608060020a820481169160a060020a810482169160c060020a820481169160e060020a9004168e565b600a54600160a060020a0316331461080157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b3360009081526009602052604090205460ff16151561084e57600080fd5b61085a84848484612524565b50505050565b610868614305565b610870614349565b3360009081526009602052604090205460ff16151561088e57600080fd5b5050600160a060020a03841660009081526005602090815260408083208684528252808320815161010081018352905463ffffffff808216835264010000000082048116838601526801000000000000000082048116838501526c0100000000000000000000000082048116606080850191909152608060020a8304821660808086019190915260a060020a808504841660a08088019190915260c060020a8604851660c08089019190915260e060020a90960490941660e08701528b89526007885286892087519586018852805486526001810154600160e060020a03169886019890985260028801549685018790526003909701546001605060020a03808216938601939093526a010000000000000000000081048316918501919091529590950490941693810193909352921015610a1c57610a17868684846040015188600880602002604051908101604052809291908260086020028082843750506040805161010081810190925293508c925060089150839083908082843750612aae9350505050565b610a6b565b610a6b86838387600880602002604051908101604052809291908260086020028082843750506040805161010081810190925293508b925060089150839083908082843750612e7f9350505050565b505050505050565b6000838152600760205260408120600101548190819081908190610aa990600160e060020a03166001605060020a038916613333565b94506000600160e060020a03861611610ac157600080fd5b3360009081526002602090815260408083208b84529091529020546001605060020a039081168801945060639085161115610b28573360009081526004602090815260408083208b84529091529020546063016001605060020a03851610610b2857600080fd5b60018054604080517fa8be8329000000000000000000000000000000000000000000000000000000008152336004820152602481019390935251600160a060020a039091169163a8be83299160448083019260209291908290030181600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d6020811015610bbf57600080fd5b505192506064600160e060020a038685021604850391506004600160e060020a036003870216604080517fbb002ba8000000000000000000000000000000000000000000000000000000008152336004820152600160e060020a0386166024820152905192909104925060008051602061442a8339815191529163bb002ba89160448082019260009290919082900301818387803b158015610c6057600080fd5b505af1158015610c74573d6000803e3d6000fd5b5050604080517f4f03f17c000000000000000000000000000000000000000000000000000000008152600160e060020a0385166004820152306024820152905160008051602061442a8339815191529350634f03f17c9250604480830192600092919082900301818387803b158015610cec57600080fd5b505af1158015610d00573d6000803e3d6000fd5b505060008054604080517f1149ef5a000000000000000000000000000000000000000000000000000000008152600160e060020a038789031660048201529051600160a060020a039092169450631149ef5a9350602480820193929182900301818387803b158015610d7157600080fd5b505af1158015610d85573d6000803e3d6000fd5b50505050610d9588883389612524565b5050505050505050565b610da761437e565b6000610db16143f2565b50505067ffffffffffffffff808216600090815260086020908152604080832081516101c081018352815481526001820154600160e060020a03168185015260028201548184018190526003830154606080840191825260048501546080850152600585015460a085015260069485015463ffffffff80821660c08701526401000000008204811660e08701526801000000000000000080830482166101008801526c0100000000000000000000000083048216610120880152608060020a808404831661014089015260a060020a8404831661016089015260c060020a8404831661018089015260e060020a9093049091166101a0870152338a52958852868920848a5288528689208751928301885254808b1683529586048a169782019790975295909304909616928401929092525190939290819081901515610f0757835167ffffffffffffffff881685529250610f53565b856060015160011415610f2f5760208401805167ffffffffffffffff89169091529250610f53565b856060015160021415610f535760408401805167ffffffffffffffff891690915292505b336000908152600660209081526040808320888452825280832087518154938901519289015167ffffffffffffffff908116608060020a0277ffffffffffffffff000000000000000000000000000000001994821668010000000000000000026fffffffffffffffff0000000000000000199290931667ffffffffffffffff19909616959095171617919091169190911790558511610ff157600080fd5b67ffffffffffffffff8088169084161061100a57600080fd5b608086015167ffffffffffffffff8416101561102557600080fd5b600154604080517fa8be83290000000000000000000000000000000000000000000000000000000081523360048201526000602482018190529151600160a060020a039093169263a8be832992604480840193602093929083900390910190829087803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b505050506040513d60208110156110bf57600080fd5b50516020870151604080517fbb002ba80000000000000000000000000000000000000000000000000000000081523360048201526064600160e060020a038486028116919091049093039283166024820152905192945090925060008051602061442a8339815191529163bb002ba89160448082019260009290919082900301818387803b15801561115057600080fd5b505af1158015611164573d6000803e3d6000fd5b505060008054604080517f1149ef5a000000000000000000000000000000000000000000000000000000008152600160e060020a03871660048201529051600160a060020a039092169450631149ef5a9350602480820193929182900301818387803b1580156111d357600080fd5b505af11580156111e7573d6000803e3d6000fd5b505050508560600151600214156112235760a0860151336000908152600460209081526040808320898452909152902080549091019055611256565b8560600151600114156112405761123b338787613395565b611256565b6060860151151561125657611256338787613395565b50505050505050565b3360009081526009602052604090205460ff16151561127d57600080fd5b600160a060020a0390921660009081526004602090815260408083209483529390529190912080549091019055565b600a54600160a060020a031633146112c357600080fd5b600160a060020a03919091166000908152600960205260409020805460ff1916911515919091179055565b60006112f8614412565b6000611302614305565b600061130c614349565b336000908152600960205260408120548190819060ff16151561132e57600080fd5b600160a060020a038c1660009081526003602090815260408083208e8452825291829020825180840190935254600160e060020a0380821680855260e060020a90920463ffffffff908116938501849052939b5060019092016050029092169850908b01168711611a0d57868a896000015101038860000190600160e060020a03169081600160e060020a03168152505087602001805180919060010163ffffffff1663ffffffff168152505087600360008e600160a060020a0316600160a060020a0316815260200190815260200160002060008d815260200190815260200160002060008201518160000160006101000a815481600160e060020a030219169083600160e060020a03160217905550602082015181600001601c6101000a81548163ffffffff021916908363ffffffff160217905550905050600560008d600160a060020a0316600160a060020a0316815260200190815260200160002060008c815260200190815260200160002061010060405190810160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201600c9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201601c9054906101000a900463ffffffff1663ffffffff1663ffffffff168152505095506005866060018181510191509063ffffffff16908163ffffffff168152505060058660a0018181510191509063ffffffff16908163ffffffff168152505060058660e0018181510191509063ffffffff16908163ffffffff168152505085600560008e600160a060020a0316600160a060020a0316815260200190815260200160002060008d815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff160217905550905050600260008d600160a060020a0316600160a060020a0316815260200190815260200160002060008c815260200190815260200160002060000160009054906101000a90046001605060020a03166005029450600760008c815260200190815260200160002060c06040519081016040529081600082015481526020016001820160009054906101000a9004600160e060020a0316600160e060020a0316600160e060020a03168152602001600282015481526020016003820160009054906101000a90046001605060020a03166001605060020a03166001605060020a0316815260200160038201600a9054906101000a90046001605060020a03166001605060020a03166001605060020a031681526020016003820160149054906101000a90046001605060020a03166001605060020a03166001605060020a0316815250509350856040015163ffffffff1684606001510185029250856080015163ffffffff16846080015101850291508560c0015163ffffffff168460a0015101850290506000809054906101000a9004600160a060020a0316600160a060020a03166336bce9988d8585856040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001846001605060020a03166001605060020a03168152602001836001605060020a03166001605060020a03168152602001826001605060020a03166001605060020a03168152602001945050505050600060405180830381600087803b1580156119ec57600080fd5b505af1158015611a00573d6000803e3d6000fd5b5050505060019850611a67565b600160a060020a038c1660009081526003602090815260408083208e845290915281208054600160e060020a038082168e01167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1990911617905598505b50505050505050509392505050565b611a7e61437e565b3360009081526009602052604090205460ff161515611a9c57600080fd5b6101c060405190810160405280600081526020016000600160e060020a03168152602001600081526020016000815260200160008152602001600081526020018a63ffffffff1681526020018963ffffffff1681526020018863ffffffff1681526020018763ffffffff1681526020018663ffffffff1681526020018563ffffffff1681526020018463ffffffff1681526020018363ffffffff168152509050611b478b828c613a98565b5050505050505050505050565b611b5c61437e565b3360009081526009602052604090205460ff161515611b7a57600080fd5b6101c060405190810160405280600081526020016000600160e060020a03168152602001600081526020016000815260200160008152602001600081526020018a63ffffffff1681526020018963ffffffff1681526020018863ffffffff1681526020018763ffffffff1681526020018663ffffffff1681526020018563ffffffff1681526020018463ffffffff1681526020018363ffffffff168152509050611b478b828c613395565b60026020908152600092835260408084209091529082529020546001605060020a038116906a0100000000000000000000900460ff1682565b3360009081526009602052604090205460ff161515611c7c57600080fd5b600160a060020a039092166000908152600460209081526040808320948352939052919091208054919091039055565b3360009081526009602052604090205460ff161515611cca57600080fd5b6040805160c081018252878152600160e060020a0396871660208083019182528284019788526001605060020a03968716606084019081529587166080840190815294871660a0840190815260009a8b526007909152929098209051815596516001880180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191691909716179095559251600286015551600390940180549251935169ffffffffffffffffffff199093169482169490941773ffffffffffffffffffff0000000000000000000019166a010000000000000000000093821693909302929092177fffff00000000000000000000ffffffffffffffffffffffffffffffffffffffff1660a060020a9190921602179055565b6000611de9614305565b5050600160a060020a03821660009081526005602090815260408083208484528252808320815161010081018352905463ffffffff808216808452640100000000830482168487018190526801000000000000000084048316858701526c01000000000000000000000000840483166060860152608060020a84048316608086015260a060020a8404831660a086015260c060020a8404831660c086015260e060020a909304821660e08501528787526007909552929094206002015490920160649093011691909102905b5092915050565b3360009081526009602052604090205460ff161515611eda57600080fd5b604080516101c081018252888152600160e060020a0388166020808301919091528183018890526060808301889052608080840188905260a080850188905263ffffffff8735811660c08088019190915294880135811660e0870152958701358616610100860152918601358516610120850152850135841661014084015284013583166101608301528301359091166101808201526101a0810182600763ffffffff6020918202929092013582169092526000998a52600882526040998a90208351815591830151600183018054600160e060020a039283167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909116179055998301516002830155606083015160038301556080830151600483015560a0830151600583015560c08301516006909201805460e08501516101008601516101208701516101408801516101608901516101808a01516101a0909a0151881660e060020a0299881660c060020a027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff91891660a060020a0277ffffffff000000000000000000000000000000000000000019938a16608060020a0273ffffffff0000000000000000000000000000000019958b166c01000000000000000000000000026fffffffff00000000000000000000000019978c1668010000000000000000026bffffffff000000000000000019998d166401000000000267ffffffff00000000199e909d1663ffffffff19909b169a909a179c909c169a909a179690961696909617939093169790971716949094179490941693909317919091169190911790981617909655505050505050565b3360009081526002602090815260408083208584529091528120546001605060020a0380841691161080159061218957506000826001605060020a0316115b151561219457600080fd5b50600082815260076020526040812060010154600160e060020a03169081116121bc57600080fd5b604080517fb5967e16000000000000000000000000000000000000000000000000000000008152336004820152905160008051602061442a8339815191529163b5967e1691602480830192600092919082900301818387803b15801561222157600080fd5b505af1158015612235573d6000803e3d6000fd5b50505050612244828433612346565b60008051602061442a83398151915263a9059cbb336004600160e060020a0360036001605060020a03881687020216046040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160e060020a0316815260200192505050602060405180830381600087803b1580156122cf57600080fd5b505af11580156122e3573d6000803e3d6000fd5b505050506040513d60208110156122f957600080fd5b5050505050565b600a54600160a060020a0316331461231757600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080600080612356858761419b565b9350935093506000846001605060020a0316118061237d57506000836001605060020a0316115b8061239157506000826001605060020a0316115b1561243c5760008054604080517ffa5ccd0b000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301526001605060020a03898d0281166024840152888d0281166044840152878d021660648301529151919092169263fa5ccd0b926084808201939182900301818387803b15801561241f57600080fd5b505af1158015612433573d6000803e3d6000fd5b505050506124d7565b866001605060020a03166124508688611ddf565b02905060008051602061442a83398151915263add1dcfa86606484046040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b1580156124be57600080fd5b505af11580156124d2573d6000803e3d6000fd5b505050505b50505050600160a060020a0316600090815260026020908152604080832093835292905220805469ffffffffffffffffffff1981166001605060020a039182169390930316919091179055565b600160a060020a038216600090815260026020908152604080832087845290915281208054909160609181908190819081906a0100000000000000000000900460ff1615156128ba57604080517febff831f000000000000000000000000000000000000000000000000000000008152600160a060020a038b166004820152905173c81068cd335889736fc485592e4d73a82403d44b9163ebff831f91602480830192600092919082900301818387803b1580156125e157600080fd5b505af11580156125f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561261e57600080fd5b81019080805164010000000081111561263657600080fd5b8201602081018481111561264957600080fd5b815185602082028301116401000000008211171561266657600080fd5b505092919050505095508551945073c81068cd335889736fc485592e4d73a82403d44b600160a060020a0316638d67799e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156126c657600080fd5b505af11580156126da573d6000803e3d6000fd5b505050506040513d60208110156126f057600080fd5b505160ff891610158061272a5750848860ff1610801561272a57506000868960ff1681518110151561271e57fe5b90602001906020020151115b1561277057600097505b848860ff1610801561276057506000868960ff1681518110151561275457fe5b90602001906020020151115b1561277057600190970196612734565b604080517faf209cf8000000000000000000000000000000000000000000000000000000008152600160a060020a038b16600482015260ff8a166024820152604481018d9052905173c81068cd335889736fc485592e4d73a82403d44b9163af209cf891606480830192600092919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505060408051908101604052808b6001605060020a03168152602001600160ff16815250600260008b600160a060020a0316600160a060020a0316815260200190815260200160002060008d815260200190815260200160002060008201518160000160006101000a8154816001605060020a0302191690836001605060020a03160217905550602082015181600001600a6101000a81548160ff021916908360ff1602179055509050506128dd565b86546001605060020a038082168c011669ffffffffffffffffffff199091161787555b6128e7898c61419b565b9350935093506000846001605060020a0316118061290e57506000836001605060020a0316115b8061292257506000826001605060020a0316115b15612a07576000809054906101000a9004600160a060020a0316600160a060020a03166336bce9988a8c87028d87028e87026040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001846001605060020a03166001605060020a03168152602001836001605060020a03166001605060020a03168152602001826001605060020a03166001605060020a03168152602001945050505050600060405180830381600087803b1580156129ea57600080fd5b505af11580156129fe573d6000803e3d6000fd5b50505050611b47565b896001605060020a0316612a1b8a8d611ddf565b02905060008051602061442a83398151915263a732f9ac8a606484046040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015612a8957600080fd5b505af1158015612a9d573d6000803e3d6000fd5b505050505050505050505050505050565b604080517fb5967e16000000000000000000000000000000000000000000000000000000008152600160a060020a03881660048201529051600091829160008051602061442a8339815191529163b5967e16916024808301928692919082900301818387803b158015612b2057600080fd5b505af1158015612b34573d6000803e3d6000fd5b505050506020868101805188518651885163ffffffff928316919003600390810b82018316808d5289870151968b015196909603900b828416018216938490528901606492830182160295509101169086010282900390506000811315612c4d57600160a060020a03881660008181526002602090815260408083208b84529091528082205481517fa732f9ac000000000000000000000000000000000000000000000000000000008152600481019490945260646001605060020a0390911685020460248401525160008051602061442a8339815191529263a732f9ac92604480830193919282900301818387803b158015612c3057600080fd5b505af1158015612c44573d6000803e3d6000fd5b50505050612d03565b600160a060020a03881660008181526002602090815260408083208b84529091528082205481517fadd1dcfa000000000000000000000000000000000000000000000000000000008152600481019490945260646001605060020a03909116858403020460248401525160008051602061442a8339815191529263add1dcfa92604480830193919282900301818387803b158015612cea57600080fd5b505af1158015612cfe573d6000803e3d6000fd5b505050505b85600560008a600160a060020a0316600160a060020a03168152602001908152602001600020600089815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff1602179055509050505050505050505050565b6000806000806000806000808b6060015160640163ffffffff168c6040015163ffffffff168c6060015101026001605060020a031697508b60a0015160640163ffffffff168c6080015163ffffffff168c6080015101026001605060020a031696508b60e0015160640163ffffffff168c60c0015163ffffffff168c60a0015101026001605060020a03169550886002600881101515612f1b57fe5b60200201518a6002602002015160408e01805192909103600390810b63ffffffff938416019092169052899060200201518a6003602002015160608e0180519290910360030b63ffffffff92831601909116905288600460200201518a6004602002015160808e0180519290910360030b63ffffffff92831601909116905288600560200201518a6005602002015160a08e0180519290910360030b63ffffffff92831601909116905288600660200201518a6006602002015160c08e0180519290910360030b63ffffffff92831601909116905288600760200201518a600760200201510360030b8c60e0015163ffffffff16018c60e0019063ffffffff16908163ffffffff1681525050878c6060015160640163ffffffff168d6040015163ffffffff168d606001516001605060020a03160102039450868c60a0015160640163ffffffff168d6080015163ffffffff168d608001516001605060020a03160102039350858c60e0015160640163ffffffff168d60c0015163ffffffff168d60a001516001605060020a031601020392508a600001519150600260008e600160a060020a0316600160a060020a03168152602001908152602001600020600083815260200190815260200160002060000160009054906101000a90046001605060020a03166001605060020a031690506000809054906101000a9004600160a060020a0316600160a060020a03166308688ce08e8784028785028786026040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b15801561319a57600080fd5b505af11580156131ae573d6000803e3d6000fd5b505050508b600560008f600160a060020a0316600160a060020a03168152602001908152602001600020600084815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505050505050505050505050505050565b600080600160e060020a038416151561334f5760009150611eb5565b828402905082600160e060020a031684600160e060020a031682600160e060020a031681151561337b57fe5b04600160e060020a031614151561338e57fe5b9392505050565b600061339f614305565b6133a7614349565b505050600160a060020a0383166000818152600260208181526040808420868552825280842054948452600582528084208685528252808420815161010081018352905463ffffffff808216835264010000000082048116838601526801000000000000000082048116838501526c0100000000000000000000000082048116606080850191909152608060020a8304821660808086019190915260a060020a808504841660a08088019190915260c060020a8604851660c08089019190915260e060020a90960490941660e08701528b8a5260078852868a2087519586018852805486526001810154600160e060020a031698860198909852978701549584018690526003909601546001605060020a03818116928501929092526a010000000000000000000081048216968401969096529590940485169381019390935292909416939192909181908190819081101561366557856000015163ffffffff168560400151018960e0015163ffffffff1688026001605060020a0316029350856020015160640163ffffffff168960c0015163ffffffff168802026001605060020a03168401935060008051602061442a833981519152600160a060020a031663b5967e168b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b1580156135b957600080fd5b505af11580156135cd573d6000803e3d6000fd5b5050604080517fa732f9ac000000000000000000000000000000000000000000000000000000008152600160a060020a038e166004820152606488046024820152905160008051602061442a833981519152935063a732f9ac9250604480830192600092919082900301818387803b15801561364857600080fd5b505af115801561365c573d6000803e3d6000fd5b50505050613804565b856040015163ffffffff1685606001510189610120015163ffffffff168802029250856080015163ffffffff1685608001510189610160015163ffffffff1688020291508560c0015163ffffffff168560a0015101896101a0015163ffffffff168802029050856060015160640163ffffffff1689610100015163ffffffff16880202830192508560a0015160640163ffffffff1689610140015163ffffffff16880202820191508560e0015160640163ffffffff1689610180015163ffffffff16880202810190506000809054906101000a9004600160a060020a0316600160a060020a03166336bce9988b8585856040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001846001605060020a03166001605060020a03168152602001836001605060020a03166001605060020a03168152602001826001605060020a03166001605060020a03168152602001945050505050600060405180830381600087803b1580156137eb57600080fd5b505af11580156137ff573d6000803e3d6000fd5b505050505b8860c00151866000018181510191509063ffffffff16908163ffffffff16815250508860e00151866020018181510191509063ffffffff16908163ffffffff1681525050886101000151866040018181510191509063ffffffff16908163ffffffff1681525050886101200151866060018181510191509063ffffffff16908163ffffffff1681525050886101400151866080018181510191509063ffffffff16908163ffffffff16815250508861016001518660a0018181510191509063ffffffff16908163ffffffff16815250508861018001518660c0018181510191509063ffffffff16908163ffffffff1681525050886101a001518660e0018181510191509063ffffffff16908163ffffffff168152505085600560008c600160a060020a0316600160a060020a0316815260200190815260200160002060008a815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505050505050505050505050565b6000613aa2614305565b613aaa614349565b505050600160a060020a0383166000818152600260208181526040808420868552825280842054948452600582528084208685528252808420815161010081018352905463ffffffff808216835264010000000082048116838601526801000000000000000082048116838501526c0100000000000000000000000082048116606080850191909152608060020a8304821660808086019190915260a060020a808504841660a08088019190915260c060020a8604851660c08089019190915260e060020a90960490941660e08701528b8a5260078852868a2087519586018852805486526001810154600160e060020a031698860198909852978701549584018690526003909601546001605060020a03818116928501929092526a0100000000000000000000810482169684019690965295909404851693810193909352929094169391929091819081908190811015613d6857856000015163ffffffff168560400151018960e0015163ffffffff1688026001605060020a0316029350856020015160640163ffffffff168960c0015163ffffffff168802026001605060020a03168401935060008051602061442a833981519152600160a060020a031663b5967e168b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b158015613cbc57600080fd5b505af1158015613cd0573d6000803e3d6000fd5b5050604080517fadd1dcfa000000000000000000000000000000000000000000000000000000008152600160a060020a038e166004820152606488046024820152905160008051602061442a833981519152935063add1dcfa9250604480830192600092919082900301818387803b158015613d4b57600080fd5b505af1158015613d5f573d6000803e3d6000fd5b50505050613f07565b856040015163ffffffff1685606001510189610120015163ffffffff168802029250856080015163ffffffff1685608001510189610160015163ffffffff1688020291508560c0015163ffffffff168560a0015101896101a0015163ffffffff168802029050856060015160640163ffffffff1689610100015163ffffffff16880202830192508560a0015160640163ffffffff1689610140015163ffffffff16880202820191508560e0015160640163ffffffff1689610180015163ffffffff16880202810190506000809054906101000a9004600160a060020a0316600160a060020a031663fa5ccd0b8b8585856040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001846001605060020a03166001605060020a03168152602001836001605060020a03166001605060020a03168152602001826001605060020a03166001605060020a03168152602001945050505050600060405180830381600087803b158015613eee57600080fd5b505af1158015613f02573d6000803e3d6000fd5b505050505b8860c00151866000018181510391509063ffffffff16908163ffffffff16815250508860e00151866020018181510391509063ffffffff16908163ffffffff1681525050886101000151866040018181510391509063ffffffff16908163ffffffff1681525050886101200151866060018181510391509063ffffffff16908163ffffffff1681525050886101400151866080018181510391509063ffffffff16908163ffffffff16815250508861016001518660a0018181510391509063ffffffff16908163ffffffff16815250508861018001518660c0018181510391509063ffffffff16908163ffffffff1681525050886101a001518660e0018181510391509063ffffffff16908163ffffffff168152505085600560008c600160a060020a0316600160a060020a0316815260200190815260200160002060008a815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505050505050505050505050565b60008060006141a8614349565b6141b0614305565b5050506000838152600760209081526040808320815160c08181018452825482526001830154600160e060020a0316828601526002830154828501526003909201546001605060020a0380821660608085019182526a010000000000000000000084048316608080870191825260a060020a9586900490941660a0968701908152600160a060020a03909e168a5260058952878a209c8a529b885297869020865161010081018852905463ffffffff8082168352640100000000820481169983019990995268010000000000000000810489169782018890526c01000000000000000000000000810489169982018a9052608060020a81048916938201849052938404881694810185905260c060020a8404881695810186905260e060020a909304871660e09093018390525199519a519990940160649687018616029a999093019085018416029796019201160292915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915290565b604080516060810182526000808252602082018190529181019190915290565b6040805180820190915260008082526020820152905600000000000000000000000000df0960778c6e6597f197ed9a25f12f5d971da86ca165627a7a723058203bd0a86cbd4ae0e47ee49e040608015de08b9b9713307e3094cf6c2945d071590029

Deployed Bytecode

0x60806040526004361061010e5763ffffffff60e060020a600035041663069d04f781146101135780630a8e987c146101635780630cdddceb146101c157806311d5aa931461020d578063126ef2801461023f57806312e68ddf146102e057806343f4e4dc14610301578063454764ac146103375780634705c18114610360578063511de2801461038a5780635352df60146103ac578063558a7297146103d357806360bada1c146103f9578063a442ed601461043d578063a9ed5b4314610496578063c1431eda146104ef578063c26c006d14610538578063c95186751461055f578063d1bf3d3f1461059e578063e00cf084146105d4578063e6fe72bb14610606578063f40b26bd1461062a575b600080fd5b34801561011f57600080fd5b50610137600160a060020a036004351660243561064b565b6040805167ffffffffffffffff9485168152928416602084015292168183015290519081900360600190f35b34801561016f57600080fd5b5061017b60043561068d565b60408051968752600160e060020a039095166020870152858501939093526001605060020a039182166060860152811660808501521660a0830152519081900360c00190f35b3480156101cd57600080fd5b506101e5600160a060020a03600435166024356106e4565b60408051600160e060020a03909316835263ffffffff90911660208301528051918290030190f35b34801561021957600080fd5b5061023d6001605060020a0360043516602435600160a060020a0360443516610719565b005b34801561024b57600080fd5b50610257600435610747565b604080519e8f52600160e060020a03909d1660208f01528d8d019b909b5260608d019990995260808c019790975260a08b019590955263ffffffff93841660c08b015291831660e08a015282166101008901528116610120880152908116610140870152908116610160860152908116610180850152166101a083015251908190036101c00190f35b3480156102ec57600080fd5b5061023d600160a060020a03600435166107ea565b34801561030d57600080fd5b5061023d6004356001605060020a0360243516600160a060020a036044351660ff60643516610830565b34801561034357600080fd5b5061023d600160a060020a03600435166024356044610144610860565b34801561036c57600080fd5b5061023d6004356001605060020a036024351660ff60443516610a73565b34801561039657600080fd5b5061023d67ffffffffffffffff60043516610d9f565b3480156103b857600080fd5b5061023d600160a060020a036004351660243560443561125f565b3480156103df57600080fd5b5061023d600160a060020a036004351660243515156112ac565b34801561040557600080fd5b50610429600160a060020a0360043516602435600160e060020a03604435166112ee565b604080519115158252519081900360200190f35b34801561044957600080fd5b5061023d600160a060020a036004351660243563ffffffff60443581169060643581169060843581169060a43581169060c43581169060e435811690610104358116906101243516611a76565b3480156104a257600080fd5b5061023d600160a060020a036004351660243563ffffffff60443581169060643581169060843581169060a43581169060c43581169060e435811690610104358116906101243516611b54565b3480156104fb57600080fd5b50610513600160a060020a0360043516602435611c25565b604080516001605060020a03909316835260ff90911660208301528051918290030190f35b34801561054457600080fd5b5061023d600160a060020a0360043516602435604435611c5e565b34801561056b57600080fd5b5061023d600435600160e060020a03602435166044356001605060020a0360643581169060843581169060a43516611cac565b3480156105aa57600080fd5b506105c2600160a060020a0360043516602435611ddf565b60408051918252519081900360200190f35b3480156105e057600080fd5b5061023d600435600160e060020a036024351660443560643560843560a43560c4611ebc565b34801561061257600080fd5b5061023d6004356001605060020a036024351661214a565b34801561063657600080fd5b5061023d600160a060020a0360043516612300565b600660209081526000928352604080842090915290825290205467ffffffffffffffff80821691680100000000000000008104821691608060020a9091041683565b60076020526000908152604090208054600182015460028301546003909301549192600160e060020a03909116916001605060020a03808216916a0100000000000000000000810482169160a060020a9091041686565b6003602090815260009283526040808420909152908252902054600160e060020a0381169060e060020a900463ffffffff1682565b3360009081526009602052604090205460ff16151561073757600080fd5b610742838383612346565b505050565b60086020526000908152604090208054600182015460028301546003840154600485015460058601546006909601549495600160e060020a03909416949293919290919063ffffffff8082169164010000000081048216916801000000000000000082048116916c010000000000000000000000008104821691608060020a820481169160a060020a810482169160c060020a820481169160e060020a9004168e565b600a54600160a060020a0316331461080157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b3360009081526009602052604090205460ff16151561084e57600080fd5b61085a84848484612524565b50505050565b610868614305565b610870614349565b3360009081526009602052604090205460ff16151561088e57600080fd5b5050600160a060020a03841660009081526005602090815260408083208684528252808320815161010081018352905463ffffffff808216835264010000000082048116838601526801000000000000000082048116838501526c0100000000000000000000000082048116606080850191909152608060020a8304821660808086019190915260a060020a808504841660a08088019190915260c060020a8604851660c08089019190915260e060020a90960490941660e08701528b89526007885286892087519586018852805486526001810154600160e060020a03169886019890985260028801549685018790526003909701546001605060020a03808216938601939093526a010000000000000000000081048316918501919091529590950490941693810193909352921015610a1c57610a17868684846040015188600880602002604051908101604052809291908260086020028082843750506040805161010081810190925293508c925060089150839083908082843750612aae9350505050565b610a6b565b610a6b86838387600880602002604051908101604052809291908260086020028082843750506040805161010081810190925293508b925060089150839083908082843750612e7f9350505050565b505050505050565b6000838152600760205260408120600101548190819081908190610aa990600160e060020a03166001605060020a038916613333565b94506000600160e060020a03861611610ac157600080fd5b3360009081526002602090815260408083208b84529091529020546001605060020a039081168801945060639085161115610b28573360009081526004602090815260408083208b84529091529020546063016001605060020a03851610610b2857600080fd5b60018054604080517fa8be8329000000000000000000000000000000000000000000000000000000008152336004820152602481019390935251600160a060020a039091169163a8be83299160448083019260209291908290030181600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d6020811015610bbf57600080fd5b505192506064600160e060020a038685021604850391506004600160e060020a036003870216604080517fbb002ba8000000000000000000000000000000000000000000000000000000008152336004820152600160e060020a0386166024820152905192909104925060008051602061442a8339815191529163bb002ba89160448082019260009290919082900301818387803b158015610c6057600080fd5b505af1158015610c74573d6000803e3d6000fd5b5050604080517f4f03f17c000000000000000000000000000000000000000000000000000000008152600160e060020a0385166004820152306024820152905160008051602061442a8339815191529350634f03f17c9250604480830192600092919082900301818387803b158015610cec57600080fd5b505af1158015610d00573d6000803e3d6000fd5b505060008054604080517f1149ef5a000000000000000000000000000000000000000000000000000000008152600160e060020a038789031660048201529051600160a060020a039092169450631149ef5a9350602480820193929182900301818387803b158015610d7157600080fd5b505af1158015610d85573d6000803e3d6000fd5b50505050610d9588883389612524565b5050505050505050565b610da761437e565b6000610db16143f2565b50505067ffffffffffffffff808216600090815260086020908152604080832081516101c081018352815481526001820154600160e060020a03168185015260028201548184018190526003830154606080840191825260048501546080850152600585015460a085015260069485015463ffffffff80821660c08701526401000000008204811660e08701526801000000000000000080830482166101008801526c0100000000000000000000000083048216610120880152608060020a808404831661014089015260a060020a8404831661016089015260c060020a8404831661018089015260e060020a9093049091166101a0870152338a52958852868920848a5288528689208751928301885254808b1683529586048a169782019790975295909304909616928401929092525190939290819081901515610f0757835167ffffffffffffffff881685529250610f53565b856060015160011415610f2f5760208401805167ffffffffffffffff89169091529250610f53565b856060015160021415610f535760408401805167ffffffffffffffff891690915292505b336000908152600660209081526040808320888452825280832087518154938901519289015167ffffffffffffffff908116608060020a0277ffffffffffffffff000000000000000000000000000000001994821668010000000000000000026fffffffffffffffff0000000000000000199290931667ffffffffffffffff19909616959095171617919091169190911790558511610ff157600080fd5b67ffffffffffffffff8088169084161061100a57600080fd5b608086015167ffffffffffffffff8416101561102557600080fd5b600154604080517fa8be83290000000000000000000000000000000000000000000000000000000081523360048201526000602482018190529151600160a060020a039093169263a8be832992604480840193602093929083900390910190829087803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b505050506040513d60208110156110bf57600080fd5b50516020870151604080517fbb002ba80000000000000000000000000000000000000000000000000000000081523360048201526064600160e060020a038486028116919091049093039283166024820152905192945090925060008051602061442a8339815191529163bb002ba89160448082019260009290919082900301818387803b15801561115057600080fd5b505af1158015611164573d6000803e3d6000fd5b505060008054604080517f1149ef5a000000000000000000000000000000000000000000000000000000008152600160e060020a03871660048201529051600160a060020a039092169450631149ef5a9350602480820193929182900301818387803b1580156111d357600080fd5b505af11580156111e7573d6000803e3d6000fd5b505050508560600151600214156112235760a0860151336000908152600460209081526040808320898452909152902080549091019055611256565b8560600151600114156112405761123b338787613395565b611256565b6060860151151561125657611256338787613395565b50505050505050565b3360009081526009602052604090205460ff16151561127d57600080fd5b600160a060020a0390921660009081526004602090815260408083209483529390529190912080549091019055565b600a54600160a060020a031633146112c357600080fd5b600160a060020a03919091166000908152600960205260409020805460ff1916911515919091179055565b60006112f8614412565b6000611302614305565b600061130c614349565b336000908152600960205260408120548190819060ff16151561132e57600080fd5b600160a060020a038c1660009081526003602090815260408083208e8452825291829020825180840190935254600160e060020a0380821680855260e060020a90920463ffffffff908116938501849052939b5060019092016050029092169850908b01168711611a0d57868a896000015101038860000190600160e060020a03169081600160e060020a03168152505087602001805180919060010163ffffffff1663ffffffff168152505087600360008e600160a060020a0316600160a060020a0316815260200190815260200160002060008d815260200190815260200160002060008201518160000160006101000a815481600160e060020a030219169083600160e060020a03160217905550602082015181600001601c6101000a81548163ffffffff021916908363ffffffff160217905550905050600560008d600160a060020a0316600160a060020a0316815260200190815260200160002060008c815260200190815260200160002061010060405190810160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201600c9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201601c9054906101000a900463ffffffff1663ffffffff1663ffffffff168152505095506005866060018181510191509063ffffffff16908163ffffffff168152505060058660a0018181510191509063ffffffff16908163ffffffff168152505060058660e0018181510191509063ffffffff16908163ffffffff168152505085600560008e600160a060020a0316600160a060020a0316815260200190815260200160002060008d815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff160217905550905050600260008d600160a060020a0316600160a060020a0316815260200190815260200160002060008c815260200190815260200160002060000160009054906101000a90046001605060020a03166005029450600760008c815260200190815260200160002060c06040519081016040529081600082015481526020016001820160009054906101000a9004600160e060020a0316600160e060020a0316600160e060020a03168152602001600282015481526020016003820160009054906101000a90046001605060020a03166001605060020a03166001605060020a0316815260200160038201600a9054906101000a90046001605060020a03166001605060020a03166001605060020a031681526020016003820160149054906101000a90046001605060020a03166001605060020a03166001605060020a0316815250509350856040015163ffffffff1684606001510185029250856080015163ffffffff16846080015101850291508560c0015163ffffffff168460a0015101850290506000809054906101000a9004600160a060020a0316600160a060020a03166336bce9988d8585856040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001846001605060020a03166001605060020a03168152602001836001605060020a03166001605060020a03168152602001826001605060020a03166001605060020a03168152602001945050505050600060405180830381600087803b1580156119ec57600080fd5b505af1158015611a00573d6000803e3d6000fd5b5050505060019850611a67565b600160a060020a038c1660009081526003602090815260408083208e845290915281208054600160e060020a038082168e01167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1990911617905598505b50505050505050509392505050565b611a7e61437e565b3360009081526009602052604090205460ff161515611a9c57600080fd5b6101c060405190810160405280600081526020016000600160e060020a03168152602001600081526020016000815260200160008152602001600081526020018a63ffffffff1681526020018963ffffffff1681526020018863ffffffff1681526020018763ffffffff1681526020018663ffffffff1681526020018563ffffffff1681526020018463ffffffff1681526020018363ffffffff168152509050611b478b828c613a98565b5050505050505050505050565b611b5c61437e565b3360009081526009602052604090205460ff161515611b7a57600080fd5b6101c060405190810160405280600081526020016000600160e060020a03168152602001600081526020016000815260200160008152602001600081526020018a63ffffffff1681526020018963ffffffff1681526020018863ffffffff1681526020018763ffffffff1681526020018663ffffffff1681526020018563ffffffff1681526020018463ffffffff1681526020018363ffffffff168152509050611b478b828c613395565b60026020908152600092835260408084209091529082529020546001605060020a038116906a0100000000000000000000900460ff1682565b3360009081526009602052604090205460ff161515611c7c57600080fd5b600160a060020a039092166000908152600460209081526040808320948352939052919091208054919091039055565b3360009081526009602052604090205460ff161515611cca57600080fd5b6040805160c081018252878152600160e060020a0396871660208083019182528284019788526001605060020a03968716606084019081529587166080840190815294871660a0840190815260009a8b526007909152929098209051815596516001880180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191691909716179095559251600286015551600390940180549251935169ffffffffffffffffffff199093169482169490941773ffffffffffffffffffff0000000000000000000019166a010000000000000000000093821693909302929092177fffff00000000000000000000ffffffffffffffffffffffffffffffffffffffff1660a060020a9190921602179055565b6000611de9614305565b5050600160a060020a03821660009081526005602090815260408083208484528252808320815161010081018352905463ffffffff808216808452640100000000830482168487018190526801000000000000000084048316858701526c01000000000000000000000000840483166060860152608060020a84048316608086015260a060020a8404831660a086015260c060020a8404831660c086015260e060020a909304821660e08501528787526007909552929094206002015490920160649093011691909102905b5092915050565b3360009081526009602052604090205460ff161515611eda57600080fd5b604080516101c081018252888152600160e060020a0388166020808301919091528183018890526060808301889052608080840188905260a080850188905263ffffffff8735811660c08088019190915294880135811660e0870152958701358616610100860152918601358516610120850152850135841661014084015284013583166101608301528301359091166101808201526101a0810182600763ffffffff6020918202929092013582169092526000998a52600882526040998a90208351815591830151600183018054600160e060020a039283167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909116179055998301516002830155606083015160038301556080830151600483015560a0830151600583015560c08301516006909201805460e08501516101008601516101208701516101408801516101608901516101808a01516101a0909a0151881660e060020a0299881660c060020a027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff91891660a060020a0277ffffffff000000000000000000000000000000000000000019938a16608060020a0273ffffffff0000000000000000000000000000000019958b166c01000000000000000000000000026fffffffff00000000000000000000000019978c1668010000000000000000026bffffffff000000000000000019998d166401000000000267ffffffff00000000199e909d1663ffffffff19909b169a909a179c909c169a909a179690961696909617939093169790971716949094179490941693909317919091169190911790981617909655505050505050565b3360009081526002602090815260408083208584529091528120546001605060020a0380841691161080159061218957506000826001605060020a0316115b151561219457600080fd5b50600082815260076020526040812060010154600160e060020a03169081116121bc57600080fd5b604080517fb5967e16000000000000000000000000000000000000000000000000000000008152336004820152905160008051602061442a8339815191529163b5967e1691602480830192600092919082900301818387803b15801561222157600080fd5b505af1158015612235573d6000803e3d6000fd5b50505050612244828433612346565b60008051602061442a83398151915263a9059cbb336004600160e060020a0360036001605060020a03881687020216046040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160e060020a0316815260200192505050602060405180830381600087803b1580156122cf57600080fd5b505af11580156122e3573d6000803e3d6000fd5b505050506040513d60208110156122f957600080fd5b5050505050565b600a54600160a060020a0316331461231757600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080600080612356858761419b565b9350935093506000846001605060020a0316118061237d57506000836001605060020a0316115b8061239157506000826001605060020a0316115b1561243c5760008054604080517ffa5ccd0b000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301526001605060020a03898d0281166024840152888d0281166044840152878d021660648301529151919092169263fa5ccd0b926084808201939182900301818387803b15801561241f57600080fd5b505af1158015612433573d6000803e3d6000fd5b505050506124d7565b866001605060020a03166124508688611ddf565b02905060008051602061442a83398151915263add1dcfa86606484046040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b1580156124be57600080fd5b505af11580156124d2573d6000803e3d6000fd5b505050505b50505050600160a060020a0316600090815260026020908152604080832093835292905220805469ffffffffffffffffffff1981166001605060020a039182169390930316919091179055565b600160a060020a038216600090815260026020908152604080832087845290915281208054909160609181908190819081906a0100000000000000000000900460ff1615156128ba57604080517febff831f000000000000000000000000000000000000000000000000000000008152600160a060020a038b166004820152905173c81068cd335889736fc485592e4d73a82403d44b9163ebff831f91602480830192600092919082900301818387803b1580156125e157600080fd5b505af11580156125f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561261e57600080fd5b81019080805164010000000081111561263657600080fd5b8201602081018481111561264957600080fd5b815185602082028301116401000000008211171561266657600080fd5b505092919050505095508551945073c81068cd335889736fc485592e4d73a82403d44b600160a060020a0316638d67799e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156126c657600080fd5b505af11580156126da573d6000803e3d6000fd5b505050506040513d60208110156126f057600080fd5b505160ff891610158061272a5750848860ff1610801561272a57506000868960ff1681518110151561271e57fe5b90602001906020020151115b1561277057600097505b848860ff1610801561276057506000868960ff1681518110151561275457fe5b90602001906020020151115b1561277057600190970196612734565b604080517faf209cf8000000000000000000000000000000000000000000000000000000008152600160a060020a038b16600482015260ff8a166024820152604481018d9052905173c81068cd335889736fc485592e4d73a82403d44b9163af209cf891606480830192600092919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505060408051908101604052808b6001605060020a03168152602001600160ff16815250600260008b600160a060020a0316600160a060020a0316815260200190815260200160002060008d815260200190815260200160002060008201518160000160006101000a8154816001605060020a0302191690836001605060020a03160217905550602082015181600001600a6101000a81548160ff021916908360ff1602179055509050506128dd565b86546001605060020a038082168c011669ffffffffffffffffffff199091161787555b6128e7898c61419b565b9350935093506000846001605060020a0316118061290e57506000836001605060020a0316115b8061292257506000826001605060020a0316115b15612a07576000809054906101000a9004600160a060020a0316600160a060020a03166336bce9988a8c87028d87028e87026040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001846001605060020a03166001605060020a03168152602001836001605060020a03166001605060020a03168152602001826001605060020a03166001605060020a03168152602001945050505050600060405180830381600087803b1580156129ea57600080fd5b505af11580156129fe573d6000803e3d6000fd5b50505050611b47565b896001605060020a0316612a1b8a8d611ddf565b02905060008051602061442a83398151915263a732f9ac8a606484046040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015612a8957600080fd5b505af1158015612a9d573d6000803e3d6000fd5b505050505050505050505050505050565b604080517fb5967e16000000000000000000000000000000000000000000000000000000008152600160a060020a03881660048201529051600091829160008051602061442a8339815191529163b5967e16916024808301928692919082900301818387803b158015612b2057600080fd5b505af1158015612b34573d6000803e3d6000fd5b505050506020868101805188518651885163ffffffff928316919003600390810b82018316808d5289870151968b015196909603900b828416018216938490528901606492830182160295509101169086010282900390506000811315612c4d57600160a060020a03881660008181526002602090815260408083208b84529091528082205481517fa732f9ac000000000000000000000000000000000000000000000000000000008152600481019490945260646001605060020a0390911685020460248401525160008051602061442a8339815191529263a732f9ac92604480830193919282900301818387803b158015612c3057600080fd5b505af1158015612c44573d6000803e3d6000fd5b50505050612d03565b600160a060020a03881660008181526002602090815260408083208b84529091528082205481517fadd1dcfa000000000000000000000000000000000000000000000000000000008152600481019490945260646001605060020a03909116858403020460248401525160008051602061442a8339815191529263add1dcfa92604480830193919282900301818387803b158015612cea57600080fd5b505af1158015612cfe573d6000803e3d6000fd5b505050505b85600560008a600160a060020a0316600160a060020a03168152602001908152602001600020600089815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff1602179055509050505050505050505050565b6000806000806000806000808b6060015160640163ffffffff168c6040015163ffffffff168c6060015101026001605060020a031697508b60a0015160640163ffffffff168c6080015163ffffffff168c6080015101026001605060020a031696508b60e0015160640163ffffffff168c60c0015163ffffffff168c60a0015101026001605060020a03169550886002600881101515612f1b57fe5b60200201518a6002602002015160408e01805192909103600390810b63ffffffff938416019092169052899060200201518a6003602002015160608e0180519290910360030b63ffffffff92831601909116905288600460200201518a6004602002015160808e0180519290910360030b63ffffffff92831601909116905288600560200201518a6005602002015160a08e0180519290910360030b63ffffffff92831601909116905288600660200201518a6006602002015160c08e0180519290910360030b63ffffffff92831601909116905288600760200201518a600760200201510360030b8c60e0015163ffffffff16018c60e0019063ffffffff16908163ffffffff1681525050878c6060015160640163ffffffff168d6040015163ffffffff168d606001516001605060020a03160102039450868c60a0015160640163ffffffff168d6080015163ffffffff168d608001516001605060020a03160102039350858c60e0015160640163ffffffff168d60c0015163ffffffff168d60a001516001605060020a031601020392508a600001519150600260008e600160a060020a0316600160a060020a03168152602001908152602001600020600083815260200190815260200160002060000160009054906101000a90046001605060020a03166001605060020a031690506000809054906101000a9004600160a060020a0316600160a060020a03166308688ce08e8784028785028786026040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001848152602001838152602001828152602001945050505050600060405180830381600087803b15801561319a57600080fd5b505af11580156131ae573d6000803e3d6000fd5b505050508b600560008f600160a060020a0316600160a060020a03168152602001908152602001600020600084815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505050505050505050505050505050565b600080600160e060020a038416151561334f5760009150611eb5565b828402905082600160e060020a031684600160e060020a031682600160e060020a031681151561337b57fe5b04600160e060020a031614151561338e57fe5b9392505050565b600061339f614305565b6133a7614349565b505050600160a060020a0383166000818152600260208181526040808420868552825280842054948452600582528084208685528252808420815161010081018352905463ffffffff808216835264010000000082048116838601526801000000000000000082048116838501526c0100000000000000000000000082048116606080850191909152608060020a8304821660808086019190915260a060020a808504841660a08088019190915260c060020a8604851660c08089019190915260e060020a90960490941660e08701528b8a5260078852868a2087519586018852805486526001810154600160e060020a031698860198909852978701549584018690526003909601546001605060020a03818116928501929092526a010000000000000000000081048216968401969096529590940485169381019390935292909416939192909181908190819081101561366557856000015163ffffffff168560400151018960e0015163ffffffff1688026001605060020a0316029350856020015160640163ffffffff168960c0015163ffffffff168802026001605060020a03168401935060008051602061442a833981519152600160a060020a031663b5967e168b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b1580156135b957600080fd5b505af11580156135cd573d6000803e3d6000fd5b5050604080517fa732f9ac000000000000000000000000000000000000000000000000000000008152600160a060020a038e166004820152606488046024820152905160008051602061442a833981519152935063a732f9ac9250604480830192600092919082900301818387803b15801561364857600080fd5b505af115801561365c573d6000803e3d6000fd5b50505050613804565b856040015163ffffffff1685606001510189610120015163ffffffff168802029250856080015163ffffffff1685608001510189610160015163ffffffff1688020291508560c0015163ffffffff168560a0015101896101a0015163ffffffff168802029050856060015160640163ffffffff1689610100015163ffffffff16880202830192508560a0015160640163ffffffff1689610140015163ffffffff16880202820191508560e0015160640163ffffffff1689610180015163ffffffff16880202810190506000809054906101000a9004600160a060020a0316600160a060020a03166336bce9988b8585856040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001846001605060020a03166001605060020a03168152602001836001605060020a03166001605060020a03168152602001826001605060020a03166001605060020a03168152602001945050505050600060405180830381600087803b1580156137eb57600080fd5b505af11580156137ff573d6000803e3d6000fd5b505050505b8860c00151866000018181510191509063ffffffff16908163ffffffff16815250508860e00151866020018181510191509063ffffffff16908163ffffffff1681525050886101000151866040018181510191509063ffffffff16908163ffffffff1681525050886101200151866060018181510191509063ffffffff16908163ffffffff1681525050886101400151866080018181510191509063ffffffff16908163ffffffff16815250508861016001518660a0018181510191509063ffffffff16908163ffffffff16815250508861018001518660c0018181510191509063ffffffff16908163ffffffff1681525050886101a001518660e0018181510191509063ffffffff16908163ffffffff168152505085600560008c600160a060020a0316600160a060020a0316815260200190815260200160002060008a815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505050505050505050505050565b6000613aa2614305565b613aaa614349565b505050600160a060020a0383166000818152600260208181526040808420868552825280842054948452600582528084208685528252808420815161010081018352905463ffffffff808216835264010000000082048116838601526801000000000000000082048116838501526c0100000000000000000000000082048116606080850191909152608060020a8304821660808086019190915260a060020a808504841660a08088019190915260c060020a8604851660c08089019190915260e060020a90960490941660e08701528b8a5260078852868a2087519586018852805486526001810154600160e060020a031698860198909852978701549584018690526003909601546001605060020a03818116928501929092526a0100000000000000000000810482169684019690965295909404851693810193909352929094169391929091819081908190811015613d6857856000015163ffffffff168560400151018960e0015163ffffffff1688026001605060020a0316029350856020015160640163ffffffff168960c0015163ffffffff168802026001605060020a03168401935060008051602061442a833981519152600160a060020a031663b5967e168b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b158015613cbc57600080fd5b505af1158015613cd0573d6000803e3d6000fd5b5050604080517fadd1dcfa000000000000000000000000000000000000000000000000000000008152600160a060020a038e166004820152606488046024820152905160008051602061442a833981519152935063add1dcfa9250604480830192600092919082900301818387803b158015613d4b57600080fd5b505af1158015613d5f573d6000803e3d6000fd5b50505050613f07565b856040015163ffffffff1685606001510189610120015163ffffffff168802029250856080015163ffffffff1685608001510189610160015163ffffffff1688020291508560c0015163ffffffff168560a0015101896101a0015163ffffffff168802029050856060015160640163ffffffff1689610100015163ffffffff16880202830192508560a0015160640163ffffffff1689610140015163ffffffff16880202820191508560e0015160640163ffffffff1689610180015163ffffffff16880202810190506000809054906101000a9004600160a060020a0316600160a060020a031663fa5ccd0b8b8585856040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a03168152602001846001605060020a03166001605060020a03168152602001836001605060020a03166001605060020a03168152602001826001605060020a03166001605060020a03168152602001945050505050600060405180830381600087803b158015613eee57600080fd5b505af1158015613f02573d6000803e3d6000fd5b505050505b8860c00151866000018181510391509063ffffffff16908163ffffffff16815250508860e00151866020018181510391509063ffffffff16908163ffffffff1681525050886101000151866040018181510391509063ffffffff16908163ffffffff1681525050886101200151866060018181510391509063ffffffff16908163ffffffff1681525050886101400151866080018181510391509063ffffffff16908163ffffffff16815250508861016001518660a0018181510391509063ffffffff16908163ffffffff16815250508861018001518660c0018181510391509063ffffffff16908163ffffffff1681525050886101a001518660e0018181510391509063ffffffff16908163ffffffff168152505085600560008c600160a060020a0316600160a060020a0316815260200190815260200160002060008a815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505050505050505050505050565b60008060006141a8614349565b6141b0614305565b5050506000838152600760209081526040808320815160c08181018452825482526001830154600160e060020a0316828601526002830154828501526003909201546001605060020a0380821660608085019182526a010000000000000000000084048316608080870191825260a060020a9586900490941660a0968701908152600160a060020a03909e168a5260058952878a209c8a529b885297869020865161010081018852905463ffffffff8082168352640100000000820481169983019990995268010000000000000000810489169782018890526c01000000000000000000000000810489169982018a9052608060020a81048916938201849052938404881694810185905260c060020a8404881695810186905260e060020a909304871660e09093018390525199519a519990940160649687018616029a999093019085018416029796019201160292915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915290565b604080516060810182526000808252602082018190529181019190915290565b6040805180820190915260008082526020820152905600000000000000000000000000df0960778c6e6597f197ed9a25f12f5d971da86ca165627a7a723058203bd0a86cbd4ae0e47ee49e040608015de08b9b9713307e3094cf6c2945d071590029

Swarm Source

bzzr://3bd0a86cbd4ae0e47ee49e040608015de08b9b9713307e3094cf6c2945d07159

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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