ETH Price: $2,445.58 (-3.65%)

Contract

0x1FbeA078ad9f0f52FD39Fc8AD7494732D65309Fb
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

Transaction Hash
Method
Block
From
To
Transfer Ownersh...170464002023-04-14 15:52:23508 days ago1681487543IN
0x1FbeA078...2D65309Fb
0 ETH0.0012375641.45121979
Set Dev Rescue E...170463952023-04-14 15:51:23508 days ago1681487483IN
0x1FbeA078...2D65309Fb
0 ETH0.0018286739.66061491
Set Game Contrac...159660472022-11-14 5:00:35659 days ago1668402035IN
0x1FbeA078...2D65309Fb
0 ETH0.0005880212.72063098
Set Game Contrac...159660062022-11-14 4:52:23659 days ago1668401543IN
0x1FbeA078...2D65309Fb
0 ETH0.0003260213.409007
Set Game Contrac...158993192022-11-04 21:23:59669 days ago1667597039IN
0x1FbeA078...2D65309Fb
0 ETH0.0011247424.33153043
Set Game Contrac...158993192022-11-04 21:23:59669 days ago1667597039IN
0x1FbeA078...2D65309Fb
0 ETH0.0011247424.33153043
Set Game Contrac...158993172022-11-04 21:23:35669 days ago1667597015IN
0x1FbeA078...2D65309Fb
0 ETH0.0010184822.03275054
Set Game Contrac...158993152022-11-04 21:23:11669 days ago1667596991IN
0x1FbeA078...2D65309Fb
0 ETH0.0010858823.4908308
Set Game Contrac...158993142022-11-04 21:22:59669 days ago1667596979IN
0x1FbeA078...2D65309Fb
0 ETH0.0011522724.92692865
Set Game Contrac...158993132022-11-04 21:22:47669 days ago1667596967IN
0x1FbeA078...2D65309Fb
0 ETH0.0011744525.40688931
Set Game Contrac...158993122022-11-04 21:22:35669 days ago1667596955IN
0x1FbeA078...2D65309Fb
0 ETH0.0011596125.0858419
0x60803462158992962022-11-04 21:19:23669 days ago1667596763IN
 Create: MetatopiaSeason2Hub
0 ETH0.1074210619.67378021

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MetatopiaSeason2Hub

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 999 runs

Other Settings:
istanbul EvmVersion, MIT license
File 1 of 13 : HUB2.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity 0.8.17;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "../interfaces/ITopia.sol";
import "../interfaces/IGenesis.sol";

// all in one contract for receiving staked NFTs and distributing daily topia payouts

contract MetatopiaSeason2Hub is Ownable, IERC721Receiver {

    IGenesis public GenesisInterface;
    ITopia public TopiaInterface;
    IERC721 public Genesis = IERC721(0x810FeDb4a6927D02A6427f7441F6110d7A1096d5); // Genesis NFT contract
    IERC721 public Alpha = IERC721(0x96Af517c414B3726c1B2Ecc744ebf9d292DCbF60);
    IERC721 public Wastelands = IERC721(0x0b21144dbf11feb286d24cD42A7c3B0f90c32aC8);

    // 1=runner, 2=bull, 3=matador
    // 4=cadet, 5=alien, 6=general, 
    // 7=baker, 8=foodie, 9=shopowner, 
    // 10=cat, 11=dog, 12=vet
    mapping(uint16 => uint8) public genesisIdentifier; 
    mapping(address => bool) gameContracts;

    // ******* BULLRUN *******
    uint16 private numRunnersStaked;
    uint16 private numBullsStaked;
    mapping(uint16 => address) private OriginalMatadorOwner; 
    mapping(uint16 => address) private OriginalBullOwner;
    mapping(uint16 => address) private OriginalRunnerOwner;

    // ************ MOONFORCE ************
    uint16 private numCadetsStaked; // staked cadet nft ids
    uint16 private numGeneralsStaked;
    mapping(uint16 => address) private OriginalCadetOwner; 
    mapping(uint16 => address) private OriginalAlienOwner; 
    mapping(uint16 => address) private OriginalGeneralOwner;

    // ************ DOGEWORLD ************
    uint16 private numCatsStaked;
    uint16 private numDogsStaked;
    mapping(uint16 => address) private OriginalCatOwner; 
    mapping(uint16 => address) private OriginalDogOwner; 
    mapping(uint16 => address) private OriginalVetOwner;

    // ************ PYE MARKET ************
    uint16 private numBakersStaked; // staked baker nft ids
    uint16 private numFoodiesStaked; // ..
    mapping(uint16 => address) private OriginalBakerOwner; 
    mapping(uint16 => address) private OriginalFoodieOwner; 
    mapping(uint16 => address) private OriginalShopOwnerOwner;

    // ------------------------------------
    // mapping for alpha token id to wallet of staker
    mapping(uint16 => address) private OriginalAlphaOwner;
    // mapping for rat token id to wallet of staker
    mapping(uint16 => address) private OriginalRatOwner;
    // all alpha ids staked
    mapping(uint8 => uint16[]) private alphaIds;
    // mapping to arrays of stealing ids
    mapping(uint8 => uint16[]) private stakedIds; // 1 = Matadors, 2 = Aliens, 3 = Vets, 4 = Shop Owners
    // array of Owned Genesis token ids
    mapping(address => mapping(uint8 => uint16[])) genesisOwnedIds;
    // array of Owned Alpha token ids
    mapping(address => mapping(uint8 => uint16[])) alphaOwnedIds;
    // array of Owned Rat token ids
    mapping(address => uint16[]) ratOwnedIds;
    // number of Genesis staked
    uint256 public numGenesisStaked;
    // number of Alpha staked
    uint256 public numAlphasStaked;
    // number of rats staked;
    uint16 public numRatsStaked;

    // amount of $TOPIA earned so far per holder
    mapping(address => uint256) public totalHolderTOPIA;
    // mapping for alpha tokenId to game it's being staked in
    mapping(uint16 => uint8) public alphaGameIdentifier;
    // mapping for genesis tokenId to game it's being staked in
    mapping(uint16 => uint8) genesisGameIdentifier;
    // amount of $TOPIA earned so far
    uint256 public totalTOPIAEarned;

    bool public rescueEnabled;
    bool public devRescueEnabled;

    function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }

    constructor(address _topia) {
        TopiaInterface = ITopia(_topia);
    }

    // ************* EVENTS

    event TopiaClaimed (address indexed owner, uint256 earned, uint256 blockNum, uint256 timeStamp);
    event AlphaReceived (address indexed _originalOwner, uint16 _id);
    event AlphaReturned (address indexed _originalOwner, uint16 _id);
    event RatReceived (address indexed _originalOwner, uint16 _id);
    event RatReturned (address indexed _originalOwner, uint16 _id);
    event BullReceived (address indexed _originalOwner, uint16 _id);
    event BullReturned (address indexed _returnee, uint16 _id);
    event MatadorReceived (address indexed _originalOwner, uint16 _id);
    event MatadorReturned (address indexed _returnee, uint16 _id);
    event RunnerReceived (address indexed _originalOwner, uint16 _id);
    event RunnerReturned (address indexed _returnee, uint16 _id);
    event CadetReceived (address indexed _originalOwner, uint16 _id);
    event CadetReturned (address indexed _returnee, uint16 _id);
    event AlienReceived (address indexed _originalOwner, uint16 _id);
    event AlienReturned (address indexed _returnee, uint16 _id);
    event GeneralReceived (address indexed _originalOwner, uint16 _id);
    event GeneralReturned (address indexed _returnee, uint16 _id);
    event CatReceived (address indexed _originalOwner, uint16 _id);
    event CatReturned (address indexed _returnee, uint16 _id);
    event DogReceived (address indexed _originalOwner, uint16 _id);
    event DogReturned (address indexed _returnee, uint16 _id);
    event VetReceived (address indexed _originalOwner, uint16 _id);
    event VetReturned (address indexed _returnee, uint16 _id);
    event BakerReceived (address indexed _originalOwner, uint16 _id);
    event BakerReturned (address indexed _returnee, uint16 _id);
    event FoodieReceived (address indexed _originalOwner, uint16 _id);
    event FoodieReturned (address indexed _returnee, uint16 _id);
    event ShopOwnerReceived (address indexed _originalOwner, uint16 _id);
    event ShopOwnerReturned (address indexed _returnee, uint16 _id);
    event NFTStolen (address indexed _thief, address indexed _victim, uint16 _id);
    event PlatoonCreated (address indexed _creator, uint16[] cadets);
    event LitterCreated (address indexed _creator, uint16[] cats);
    event MobCreated (address indexed _creator, uint16[] runners);
    event UnionCreated (address indexed _creator, uint16[] bakers);
    event CadetAdded (address indexed _owner, uint16 _id);
    event CatAdded (address indexed _owner, uint16 _id);
    event RunnerAdded (address indexed _owner, uint16 _id);
    event BakerAdded (address indexed _owner, uint16 _id);
    event GroupUnstaked (address indexed _unstaker, uint8 _gameId, uint80 timestamp);
    event MatadorMigrated (address indexed _owner, uint16 _id);
    event GeneralMigrated (address indexed _owner, uint16 _id);
    event ShopOwnerMigrated (address indexed _owner, uint16 _id);
    event VetMigrated (address indexed _owner, uint16 _id);
    
    // ************* Universal TOPIA functions

    function pay(address _to, uint256 _amount) external onlyGames() {
        TopiaInterface.mint(_to, _amount);
        totalHolderTOPIA[_to] += _amount;
        totalTOPIAEarned += _amount;
        emit TopiaClaimed(_to, _amount, block.number, block.timestamp);
    }

    function burnFrom(address _to, uint256 _amount) external onlyGames() {
        TopiaInterface.burnFrom(_to, _amount);
    }

    // ************* MODIFIERS

    modifier onlyGames() {
        require(gameContracts[msg.sender], "only game contract allowed");
        _;
    }

    // ************* SETTERS

    function setGenesis(address _genesis) external onlyOwner {
        Genesis = IERC721(_genesis);
        GenesisInterface = IGenesis(_genesis);
    }

    function setTopia(address _topia) external onlyOwner {
        TopiaInterface = ITopia(_topia);
    }

    // mass update the genesisIdentifier mapping
    function batchSetGenesisIdentifier(uint16[] calldata _idNumbers, uint8[] calldata _types) external onlyOwner {
        require(_idNumbers.length == _types.length);
        for (uint16 i = 0; i < _idNumbers.length;) {
            require(_types[i] != 0 && _types[i] <= 12);
            genesisIdentifier[_idNumbers[i]] = _types[i];
            unchecked{ i++; }
        }
    }

    function setRescueEnabled(bool _flag) external onlyOwner {
        rescueEnabled = _flag;
    }

    function setDevRescueEnabled(bool _flag) external onlyOwner {
        devRescueEnabled = _flag;
    }

    // ************* EVENT FXNS

    function balanceOf(address owner) external view returns (uint256) {
        uint256 gen;
        for(uint8 i = 1; i <= 5; i++) {
            gen += genesisOwnedIds[owner][i].length;
        }

        uint256 alph;
        for(uint8 i = 1; i <= 5; i++) {
            alph += alphaOwnedIds[owner][i].length;
        }

        uint256 stakedBalance = alph + gen;
        return stakedBalance;
    }

    function getUserGenesisStaked(address owner) external view returns (uint16[] memory stakedGenesis) {
        uint256 length;
        for(uint8 i = 1; i <= 5; i++) {
            length += genesisOwnedIds[owner][i].length;
        }

        stakedGenesis = new uint16[](length);
        uint y = 0;
        for(uint8 i = 1; i <= 5; i++) {
            uint256 L = genesisOwnedIds[owner][i].length;
            for(uint z = 0; z < L; z++) {
                stakedGenesis[y] = uint16(genesisOwnedIds[owner][i][z]);
                y++;
            }
        }
    }

    function getUserStakedGenesisGame(address owner, uint8 game) external view returns (uint16[] memory stakedGenesis) {
        uint256 length = genesisOwnedIds[owner][game].length;
        stakedGenesis = new uint16[](length);

        for(uint i = 0; i < length;) {
            stakedGenesis[i] = uint16(genesisOwnedIds[owner][game][i]);
            unchecked{ i++; }
        }
    }

    function getUserAlphaStaked(address owner) external view returns (uint16[] memory stakedAlphas) {
        uint256 length;
        for(uint8 i = 1; i <= 5; i++) {
            length += alphaOwnedIds[owner][i].length;
        }

        stakedAlphas = new uint16[](length);
        uint y = 0;
        for(uint8 i = 1; i <= 5; i++) {
            uint256 L = alphaOwnedIds[owner][i].length;
            for(uint z = 0; z < L; z++) {
                stakedAlphas[y] = uint16(alphaOwnedIds[owner][i][z]);
                y++;
            }
        }
    }

    function getUserStakedAlphaGame(address owner, uint8 game) external view returns (uint16[] memory stakedAlphas) {
        uint256 length = alphaOwnedIds[owner][game].length;
        stakedAlphas = new uint16[](length);

        for(uint i = 0; i < length;) {
            stakedAlphas[i] = uint16(alphaOwnedIds[owner][game][i]);
            unchecked{ i++; }
        }
    }

    function getUserRatStaked(address owner) external view returns (uint16[] memory stakedRats) {
        uint256 length = ratOwnedIds[owner].length;
        stakedRats = new uint16[](length);

        for(uint i = 0; i < length;) {
            stakedRats[i] = uint16(ratOwnedIds[owner][i]);
            unchecked{ i++; }
        }
    }

    // ************ ALPHA NFT RECEIVE AND RETURN FUNCTIONS

    // @param: _gameIdentifier 1 = BullRun, 2 = MoonForce, 3 = Doge World, 4 = PYE Market, 5 = Wastelands
    function receiveAlpha(address _originalOwner, uint16 _id, uint8 _gameIdentifier) external onlyGames {
        require(_gameIdentifier >= 1 && _gameIdentifier <= 5 , "invalid id");
        IERC721(Alpha).safeTransferFrom(_originalOwner, address(this), _id);
        OriginalAlphaOwner[_id] = _originalOwner;
        alphaIds[_gameIdentifier].push(_id);
        alphaGameIdentifier[_id] = _gameIdentifier;
        alphaOwnedIds[_originalOwner][_gameIdentifier].push(_id);
        numAlphasStaked++;
        emit AlphaReceived(_originalOwner, _id);
    }

    function returnAlphaToOwner(address _returnee, uint16 _id, uint8 _gameIdentifier) external onlyGames {
        require(_returnee == OriginalAlphaOwner[_id], "not owner");
        IERC721(Alpha).safeTransferFrom(address(this), _returnee, _id);
        delete OriginalAlphaOwner[_id];
        delete alphaGameIdentifier[_id];
        uint256 d = uint256(_id);
        uint256 x = alphaOwnedIds[_returnee][_gameIdentifier].length;
        for(uint i = 0; i < x;) {
            if(alphaOwnedIds[_returnee][_gameIdentifier][i] == d) {
                alphaOwnedIds[_returnee][_gameIdentifier][i] = alphaOwnedIds[_returnee][_gameIdentifier][x -  1];
                alphaOwnedIds[_returnee][_gameIdentifier].pop();

                break;
            } else {
                unchecked{ i++; }
                continue;
            }
        }
        uint256 y = alphaIds[_gameIdentifier].length;
        uint256 m = (0 & (y - 1)) + (0 ^ (y - 1)) / 2;
        unchecked { 
            for(uint i = 0; i < y;) {
                if(alphaIds[_gameIdentifier][i] == d) {
                    alphaIds[_gameIdentifier][i] = alphaIds[_gameIdentifier][y -  1];
                    alphaIds[_gameIdentifier].pop();

                    break;
                } else if(alphaIds[_gameIdentifier][y - i - 1] == d) {
                    alphaIds[_gameIdentifier][i] = alphaIds[_gameIdentifier][y -  1];
                    alphaIds[_gameIdentifier].pop();

                    break;
                } else if(alphaIds[_gameIdentifier][m - i] == d) {
                    alphaIds[_gameIdentifier][i] = alphaIds[_gameIdentifier][y -  1];
                    alphaIds[_gameIdentifier].pop();

                    break;
                } else if(alphaIds[_gameIdentifier][m + i] == d) {
                    alphaIds[_gameIdentifier][i] = alphaIds[_gameIdentifier][y -  1];
                    alphaIds[_gameIdentifier].pop();

                    break;
                } else {
                    i++;
                    continue;
                }
            }
        }
        numAlphasStaked--;

        emit AlphaReturned(_returnee, _id);
    }

    function emergencyRescueAlpha(uint16 _id, address _account) external {
        if(devRescueEnabled && msg.sender == owner()) {
            IERC721(Alpha).safeTransferFrom(address(this), _account, _id);
        } else if (rescueEnabled && msg.sender == OriginalAlphaOwner[_id]) {
            IERC721(Alpha).safeTransferFrom(address(this), _account, _id);
        }
    }

    // ************ WASTELANDS NFT RECEIVE AND RETURN FUNCTIONS

    function receiveRat(address _originalOwner, uint16 _id) external onlyGames {
        IERC721(Wastelands).safeTransferFrom(_originalOwner, address(this), _id);
        OriginalRatOwner[_id] = _originalOwner;
        ratOwnedIds[_originalOwner].push(_id);
        numRatsStaked++;
        emit RatReceived(_originalOwner, _id);
    }

    function returnRatToOwner(address _returnee, uint16 _id) external onlyGames {
        require(_returnee == OriginalRatOwner[_id], "not owner");
        IERC721(Wastelands).safeTransferFrom(address(this), _returnee, _id);
        delete OriginalRatOwner[_id];
        uint256 x = ratOwnedIds[_returnee].length;
        for(uint i = 0; i < x;) {
            if(ratOwnedIds[_returnee][i] == _id) {
                ratOwnedIds[_returnee][i] = ratOwnedIds[_returnee][x -  1];
                ratOwnedIds[_returnee].pop();

                break;
            } else {
                unchecked{ i++; }
                continue;
            }
        }
        numRatsStaked--;
        emit RatReturned(_returnee, _id);
    }

    function emergencyRescueRat(uint16 _id, address _account) external {
        if(devRescueEnabled && msg.sender == owner()) {
            IERC721(Wastelands).safeTransferFrom(address(this), _account, _id);
        } else if (rescueEnabled && msg.sender == OriginalRatOwner[_id]) {
            IERC721(Wastelands).safeTransferFrom(address(this), _account, _id);
        }
    }

    // ************ METATOPIA WASTELANDS FUNCTIONS

    // for tier 3 NFTS being sent to wastelands 
    // @param: _gameId: 1 = bullrun, 2 = MF, 3 = DW, 4 = PM
    // @param: returningFromWastelands, if the NFT has already been in the wastelands and user is trying to get it back
    function migrate(uint16 _id, address _originalOwner, uint8 _gameId, bool returningFromWastelands) external onlyGames {
        require(_gameId >= 1 && _gameId <= 4, "Invalid game id");
        if (_gameId == 1) { // incoming matador
            if (!returningFromWastelands) { // nft is being sent to the wastes
                OriginalMatadorOwner[_id] = _originalOwner;
                emit MatadorMigrated(_originalOwner, _id);
            } else { // nft is going back to original owner
                delete OriginalMatadorOwner[_id];
                emit MatadorReturned(_originalOwner, _id);
            }
        } else if (_gameId == 2) { // incoming general
            if (!returningFromWastelands) { // nft is being sent to the wastes
                OriginalGeneralOwner[_id] = _originalOwner;
                emit GeneralMigrated(_originalOwner, _id);
            } else { // nft is going back to original owner
                delete OriginalGeneralOwner[_id];
                emit GeneralReturned(_originalOwner, _id);
            }
        } else if (_gameId == 3) { // incoming vet
            if (!returningFromWastelands) { // nft is being sent to the wastes
                OriginalVetOwner[_id] = _originalOwner;
                emit VetMigrated(_originalOwner, _id);
            } else { // nft is going back to original owner
                delete OriginalVetOwner[_id];
                emit VetReturned(_originalOwner, _id);
            }
        } else if (_gameId == 4) { // incoming shopowner
            if (!returningFromWastelands) { // nft is being sent to the wastes
                OriginalShopOwnerOwner[_id] = _originalOwner;
                emit ShopOwnerMigrated(_originalOwner, _id);
            } else { // nft is going back to original owner
                delete OriginalShopOwnerOwner[_id];
                emit ShopOwnerReturned(_originalOwner, _id);
            }
        }
        if (!returningFromWastelands) { // nft is being sent to the wastes
            Genesis.safeTransferFrom(_originalOwner, address(this), _id);
            genesisGameIdentifier[_id] = 5; // NFT goes to Wastelands
            genesisOwnedIds[_originalOwner][5].push(_id);
        } else {
            Genesis.safeTransferFrom(address(this), _originalOwner, _id);
            delete genesisGameIdentifier[_id];
            removeGenesisArray(_id, _originalOwner, 5);
        }
    }

    // ************ METATOPIA GENESIS NFT RECEIVE AND RETURN FUNCTIONS
    // @param: _gameId: 1 = bullrun, 2 = MF, 3 = DW, 4 = PM, 5 = Wastelands
    // 1=runner, 2=bull, 3=matador
    // 4=cadet, 5=alien, 6=general, 
    // 7=baker, 8=foodie, 9=shopowner, 
    // 10=cat, 11=dog, 12=vet

    function receieveManyGenesis(address _originalOwner, uint16[] memory _ids, uint8[] memory identifiers, uint8 _gameIdentifier) external onlyGames {
        for(uint i = 0; i < _ids.length;) {
            if (identifiers[i] == 1) {                
                OriginalRunnerOwner[_ids[i]] = _originalOwner;
                numRunnersStaked++;                
                emit RunnerReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 2) {                
                OriginalBullOwner[_ids[i]] = _originalOwner;
                numBullsStaked++;                
                emit BullReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 3) {                
                OriginalMatadorOwner[_ids[i]] = _originalOwner;
                stakedIds[1].push(_ids[i]);                
                emit MatadorReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 4) {                
                OriginalCadetOwner[_ids[i]] = _originalOwner;
                numCadetsStaked++;                
                emit CadetReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 5) {                
                OriginalAlienOwner[_ids[i]] = _originalOwner;
                stakedIds[2].push(_ids[i]);                 
                emit AlienReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 6) {                
                OriginalGeneralOwner[_ids[i]] = _originalOwner;
                numGeneralsStaked++;                
                emit GeneralReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 7) {                
                OriginalBakerOwner[_ids[i]] = _originalOwner;
                numBakersStaked++;                
                emit BakerReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 8) {                
                OriginalFoodieOwner[_ids[i]] = _originalOwner;
                numFoodiesStaked++;        
                emit FoodieReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 9) {     
                OriginalShopOwnerOwner[_ids[i]] = _originalOwner; 
                stakedIds[4].push(_ids[i]); 
                emit ShopOwnerReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 10) {
                OriginalCatOwner[_ids[i]] = _originalOwner;
                numCatsStaked++;
                emit CatReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 11) {
                OriginalDogOwner[_ids[i]] = _originalOwner;
                numDogsStaked++;
                emit DogReceived(_originalOwner, _ids[i]);
            } else if (identifiers[i] == 12) {
                OriginalVetOwner[_ids[i]] = _originalOwner;
                stakedIds[3].push(_ids[i]); 
                emit VetReceived(_originalOwner, _ids[i]);
            }

            genesisGameIdentifier[_ids[i]] = _gameIdentifier;
            if (genesisIdentifier[_ids[i]] == 0) {
                genesisIdentifier[_ids[i]] = identifiers[i];
            }

            genesisOwnedIds[_originalOwner][_gameIdentifier].push(_ids[i]);
            Genesis.safeTransferFrom(_originalOwner, address(this), _ids[i]);

            unchecked{ i++; }
        }
        numGenesisStaked += _ids.length;
    }

    function returnGenesisToOwner(address _returnee, uint16 _id, uint8 identifier, uint8 _gameIdentifier) external onlyGames {
        if (identifier == 1) {
            require(_returnee == OriginalRunnerOwner[_id], "not owner");
            delete OriginalRunnerOwner[_id];
            delete genesisGameIdentifier[_id];
            numRunnersStaked--; 
            emit RunnerReturned(_returnee, _id);
        } else if (identifier == 2) {
            require(_returnee == OriginalBullOwner[_id], "not owner");
            delete OriginalBullOwner[_id];
            delete genesisGameIdentifier[_id];
            numBullsStaked--;
            emit BullReturned(_returnee, _id);
        } else if (identifier == 3) {
            require(_returnee == OriginalMatadorOwner[_id], "not owner");
            delete OriginalMatadorOwner[_id];
            delete genesisGameIdentifier[_id];
            removeStakedArray(_id, 1);
            emit MatadorReturned(_returnee, _id);
        } else if (identifier == 4) {
            require(_returnee == OriginalCadetOwner[_id], "not owner");
            delete OriginalCadetOwner[_id];
            delete genesisGameIdentifier[_id];
            numCadetsStaked--;
            emit CadetReturned(_returnee, _id);
        } else if (identifier == 5) {
            require(_returnee == OriginalAlienOwner[_id], "not owner");
            delete OriginalAlienOwner[_id];
            delete genesisGameIdentifier[_id];
            removeStakedArray(_id, 2);
            emit AlienReturned(_returnee, _id);
        } else if (identifier == 6) {
            require(_returnee == OriginalGeneralOwner[_id], "not owner");
            delete OriginalGeneralOwner[_id];
            delete genesisGameIdentifier[_id];
            numGeneralsStaked--;
            emit GeneralReturned(_returnee, _id);
        } else if (identifier == 7) {
            require(_returnee == OriginalBakerOwner[_id], "not owner");
            delete OriginalBakerOwner[_id];
            delete genesisGameIdentifier[_id];
            numBakersStaked--;
            emit BakerReturned(_returnee, _id);
        } else if (identifier == 8) {
            require(_returnee == OriginalFoodieOwner[_id], "not owner");
            delete OriginalFoodieOwner[_id];
            delete genesisGameIdentifier[_id];
            numFoodiesStaked--;
            emit FoodieReturned(_returnee, _id);
        } else if (identifier == 9) {
            require(_returnee == OriginalShopOwnerOwner[_id], "not owner");
            delete OriginalShopOwnerOwner[_id];
            delete genesisGameIdentifier[_id];
            removeStakedArray(_id, 4);
            emit ShopOwnerReturned(_returnee, _id);
        } else if (identifier == 10) {
            require(_returnee == OriginalCatOwner[_id], "not owner");
            delete OriginalCatOwner[_id];
            delete genesisGameIdentifier[_id];
            numCatsStaked--;
            emit CatReturned(_returnee, _id);
        } else if (identifier == 11) {
            require(_returnee == OriginalDogOwner[_id], "not owner");
            delete OriginalDogOwner[_id];
            delete genesisGameIdentifier[_id];
            numDogsStaked--;
            emit DogReturned(_returnee, _id);
        } else if (identifier == 12) {
            require(_returnee == OriginalVetOwner[_id], "not owner");
            delete OriginalVetOwner[_id];
            delete genesisGameIdentifier[_id];
            removeStakedArray(_id, 3);
            emit VetReturned(_returnee, _id);
        }
        removeGenesisArray(_id, _returnee, _gameIdentifier);
        numGenesisStaked--;

        IERC721(Genesis).safeTransferFrom(address(this), _returnee, _id);
    }

    function removeGenesisArray(uint16 _id, address _returnee, uint8 _gameIdentifier) internal {
        uint256 x = genesisOwnedIds[_returnee][_gameIdentifier].length;
        for(uint i = 0; i < x;) {
            if(genesisOwnedIds[_returnee][_gameIdentifier][i] == _id) {
                genesisOwnedIds[_returnee][_gameIdentifier][i] = genesisOwnedIds[_returnee][_gameIdentifier][x -  1];
                genesisOwnedIds[_returnee][_gameIdentifier].pop();

                break;
            } else {
                unchecked{ i++; }
                continue;
            }
        }
    }

    function removeStakedArray(uint16 _id, uint8 _type) internal {
        uint256 x = stakedIds[_type].length;
        for(uint i = 0; i < x;) {
            if(stakedIds[_type][i] == _id) {
                stakedIds[_type][i] = stakedIds[_type][x -  1];
                stakedIds[_type].pop();

                break;
            } else {
                unchecked{ i++; }
                continue;
            }
        }
    }

    function emergencyRescueGenesis(uint16 _id, address _account) external {
        require(devRescueEnabled && msg.sender == owner());
        IERC721(Genesis).safeTransferFrom(address(this), _account, _id);
    }

    // ************** STEALING LOGIC ***************
    // @param: _gameId: 1 = bullrun, 2 = MF, 3 = DW, 4 = PM, 5 = Wastelands
    // @param _id: the actual NFT id
    // @param: identifier:
    // 1=runner, 2=bull, 3=matador
    // 4=cadet, 5=alien, 6=general, 
    // 7=baker, 8=foodie, 9=shopowner, 
    // 10=cat, 11=dog, 12=vet
    function stealGenesis(uint16 _id, uint256 seed, uint8 _gameId, uint8 identifier, address _victim) external onlyGames returns (address thief) {
        uint256 bucket = (seed & 0xFFFFFFFF);
        if (_gameId == 1) { // is a bullrun nft
            if (identifier == 1) { // is a runner
                thief = OriginalAlphaOwner[uint16(alphaIds[1][bucket % alphaIds[1].length])];
                delete OriginalRunnerOwner[_id];
                numRunnersStaked--;
            } else if (identifier == 2) { // is a bull
                thief = OriginalMatadorOwner[uint16(stakedIds[1][(bucket % stakedIds[1].length)])];
                delete OriginalBullOwner[_id];
                numBullsStaked--;
            }
        } else if (_gameId == 2) { // is a mf nft, aliens can't be stolen
            if (identifier == 4) { // is a cadet
                thief = OriginalAlienOwner[uint16(stakedIds[2][(bucket % stakedIds[2].length)])];
                delete OriginalCadetOwner[_id];
                numCadetsStaked--;
            }
        } else if (_gameId == 3) { // is a dw nft
            if (identifier == 10) { // is a cat
                thief = OriginalAlphaOwner[uint16(alphaIds[3][bucket % alphaIds[3].length])];
                delete OriginalCatOwner[_id];
                numCatsStaked--;
            } else if (identifier == 11) { // is a dog
                thief = OriginalVetOwner[uint16(stakedIds[3][(bucket % stakedIds[3].length)])];
                delete OriginalDogOwner[_id];
                numDogsStaked--;               
            }
        } else if (_gameId == 4) { // is a pm nft
            if (identifier == 7) { // is a baker
                thief = OriginalAlphaOwner[uint16(alphaIds[4][bucket % alphaIds[4].length])];
                delete OriginalBakerOwner[_id];
                numBakersStaked--;
            } else if (identifier == 8) { // is a foodie
                thief = OriginalShopOwnerOwner[uint16(stakedIds[4][(bucket % stakedIds[4].length)])];
                delete OriginalFoodieOwner[_id];
                numFoodiesStaked--;
            }
        }
        removeGenesisArray(_id, _victim, _gameId);
        IERC721(Genesis).safeTransferFrom(address(this), thief, _id);
        emit NFTStolen(thief, _victim, _id);
    }

    // only tier 3 nfts can be stolen during wastelands migration
    // for tier 3's being SENT to wastes
    
    function stealMigratingGenesis(uint16 _id, uint256 seed, uint8 _gameId, address _victim, bool returningFromWastelands) external onlyGames returns (address thief) {
        uint256 bucket = (seed & 0xFFFFFFFF);
        if (_gameId == 1) { // steal matador
            thief = OriginalAlienOwner[uint16(stakedIds[2][(bucket % stakedIds[2].length)])];
            if (!returningFromWastelands) { // if NFT is going to wastelands
                IERC721(Genesis).safeTransferFrom(_victim, thief, _id);
            } else { // user is bringing NFT back from wastelands
                IERC721(Genesis).safeTransferFrom(address(this), thief, _id);
            }
            delete OriginalMatadorOwner[_id];
        } else if (_gameId == 2) { // steal general
            thief = OriginalAlienOwner[uint16(stakedIds[2][(bucket % stakedIds[2].length)])];
            if (!returningFromWastelands) { // if NFT is going to wastelands
                IERC721(Genesis).safeTransferFrom(_victim, thief, _id);
            } else { // user is bringing NFT back from wastelands
                IERC721(Genesis).safeTransferFrom(address(this), thief, _id);
            }
            delete OriginalGeneralOwner[_id];
        } else if (_gameId == 3) { // steal vet
            thief = OriginalAlienOwner[uint16(stakedIds[2][(bucket % stakedIds[2].length)])];
            if (!returningFromWastelands) { // if NFT is going to wastelands
                IERC721(Genesis).safeTransferFrom(_victim, thief, _id);
            } else { // user is bringing NFT back from wastelands
                IERC721(Genesis).safeTransferFrom(address(this), thief, _id);
            }
            delete OriginalVetOwner[_id];
        } else if (_gameId == 4) { // steal shopowner
            thief = OriginalAlienOwner[uint16(stakedIds[2][(bucket % stakedIds[2].length)])];
            if (!returningFromWastelands) { // if NFT is going to wastelands
                IERC721(Genesis).safeTransferFrom(_victim, thief, _id);
            } else { // user is bringing NFT back from wastelands
                IERC721(Genesis).safeTransferFrom(address(this), thief, _id);
            }
            delete OriginalShopOwnerOwner[_id];
        }
        emit NFTStolen(thief, _victim, _id);
    }

    // ************ UNIVERSAL NFT GROUPING FXNS (PLATOONS, MOBS, LITTERS, UNIONS) *************

    // @param: _ids: NFT ids being staked together to form a platoon, litter... etc
    // @param: _creator: address of the person creating their group (staker)
    // @param: _gameIdentifier: 1 = bullrun, 2 = MF, 3 = DW, 4 = PM

    function createGroup(uint16[] calldata _ids, address _creator, uint8 _gameIdentifier) external onlyGames {
        uint16 length = uint16(_ids.length); 
        for (uint i = 0; i < length;) {
            uint8 identifier;
            if (_gameIdentifier == 1) { // must be mob
                    Genesis.safeTransferFrom(_creator, address(this), _ids[i]);
                    OriginalRunnerOwner[_ids[i]] = _creator;
                    numRunnersStaked++;
                    identifier = 1;
                    emit RunnerReceived(_creator, _ids[i]);
            } else if (_gameIdentifier == 2) { // must be platoon
                    Genesis.safeTransferFrom(_creator, address(this), _ids[i]);
                    OriginalCadetOwner[_ids[i]] = _creator;
                    numCadetsStaked++;
                    identifier = 4;
                    emit CadetReceived(_creator, _ids[i]);
            } else if (_gameIdentifier == 3) { // must be litter
                    Genesis.safeTransferFrom(_creator, address(this), _ids[i]);
                    OriginalCatOwner[_ids[i]] = _creator;
                    numCatsStaked++;
                    identifier = 10;
                    emit CatReceived(_creator, _ids[i]);
            } else if (_gameIdentifier == 4) { // must be union
                    IERC721(Genesis).safeTransferFrom(_creator, address(this), _ids[i]);
                    OriginalBakerOwner[_ids[i]] = _creator;
                    numBakersStaked++;
                    identifier = 7;
                    emit BakerReceived(_creator, _ids[i]);
            }
            genesisGameIdentifier[_ids[i]] = _gameIdentifier;
            if (genesisIdentifier[_ids[i]] == 0) {
                genesisIdentifier[_ids[i]] = identifier;
            }

            genesisOwnedIds[_creator][_gameIdentifier].push(_ids[i]);

            unchecked { i++; }
        }
        numGenesisStaked += length;

        if (_gameIdentifier == 1) { 
            emit MobCreated(_creator, _ids); 
        } else if (_gameIdentifier == 2) { 
            emit PlatoonCreated(_creator, _ids); 
        } else if (_gameIdentifier == 3) { 
            emit LitterCreated(_creator, _ids);
        } else if (_gameIdentifier == 4) { 
            emit UnionCreated(_creator, _ids);
        }
    }

    function addToGroup(uint16 _id, address _creator, uint8 _gameIdentifier) external onlyGames {

        if (_gameIdentifier == 1) { // must be mob
                IERC721(Genesis).safeTransferFrom(_creator, address(this), _id);
                OriginalRunnerOwner[_id] = _creator;
                numRunnersStaked++;
                emit RunnerReceived(_creator, _id);
        } else if (_gameIdentifier == 2) { // must be platoon
                IERC721(Genesis).safeTransferFrom(_creator, address(this), _id);
                OriginalCadetOwner[_id] = _creator;
                numCadetsStaked++;
                emit CadetReceived(_creator, _id);
        } else if (_gameIdentifier == 3) { // must be litter
                IERC721(Genesis).safeTransferFrom(_creator, address(this), _id);
                OriginalCatOwner[_id] = _creator;
                numCatsStaked++;
                emit CatReceived(_creator, _id);
        } else if (_gameIdentifier == 4) { // must be union
                IERC721(Genesis).safeTransferFrom(_creator, address(this), _id);
                OriginalBakerOwner[_id] = _creator;
                numBakersStaked++;
                emit BakerReceived(_creator, _id);
        }
        numGenesisStaked++;
        genesisOwnedIds[_creator][_gameIdentifier].push(_id);

        
        if (_gameIdentifier == 1) { 
            if (genesisIdentifier[_id] == 0) {
                genesisIdentifier[_id] = 1;
            }
            emit RunnerAdded(_creator, _id); 
        } else if (_gameIdentifier == 2) { 
            if (genesisIdentifier[_id] == 0) {
                genesisIdentifier[_id] = 4;
            }
            emit CadetAdded(_creator, _id); 
        } else if (_gameIdentifier == 3) { 
            if (genesisIdentifier[_id] == 0) {
                genesisIdentifier[_id] = 10;
            }
            emit CatAdded(_creator, _id);
        } else if (_gameIdentifier == 4) { 
            if (genesisIdentifier[_id] == 0) {
                genesisIdentifier[_id] = 7;
            }
            emit BakerAdded(_creator, _id);
        }

    }

    function unstakeGroup(address _creator, uint8 _gameIdentifier) external onlyGames {  
        emit GroupUnstaked(_creator, _gameIdentifier, uint80(block.timestamp));
    } 

    // ************ BULLRUN GAME FUNCTIONS

    function getBullOwner(uint16 _id) external view returns (address) {
        return OriginalBullOwner[_id];
    }

    function getMatadorOwner(uint16 _id) external view returns (address) {
        return OriginalMatadorOwner[_id];
    }

    function getRunnerOwner(uint16 _id) external view returns (address) {
        return OriginalRunnerOwner[_id];
    }

    function matadorCount() public view returns (uint16) {
        return uint16(stakedIds[1].length);
    }

    function bullCount() public view returns (uint16) {
        return numBullsStaked;
    }

    function runnerCount() public view returns (uint16) {
        return numRunnersStaked;
    }

    // ************ MOONFORCE GAME FUNCTIONS

    function getCadetOwner(uint16 _id) external view returns (address) {
        return OriginalCadetOwner[_id];
    }

    function getAlienOwner(uint16 _id) external view returns (address) {
        return OriginalAlienOwner[_id];
    }

    function getGeneralOwner(uint16 _id) external view returns (address) {
        return OriginalGeneralOwner[_id];
    }

    function cadetCount() external view returns (uint16) {
        return numCadetsStaked;
    }

    function alienCount() external view returns (uint16) {
        return uint16(stakedIds[2].length);
    }

    function generalCount() external view returns (uint16) {
        return numGeneralsStaked;
    }

    // ************ DOGE WORLD GAME FUNCTIONS
    
    function getCatOwner(uint16 _id) external view returns (address) {
        return OriginalCatOwner[_id];
    }

    function getDogOwner(uint16 _id) external view returns (address) {
        return OriginalDogOwner[_id];
    }

    function getVetOwner(uint16 _id) external view returns (address) {
        return OriginalVetOwner[_id];
    }

    function catCount() external view returns (uint16) {
        // return uint16(catIds.length());
        return numCatsStaked;
    }

    function dogCount() external view returns (uint16) {
        // return uint16(dogIds.length());
        return numDogsStaked;
    }

    function vetCount() external view returns (uint16) {
        return uint16(stakedIds[3].length);
    }

    // ************ PYE MARKET GAME FUNCTIONS
    
    function getBakerOwner(uint16 _id) external view returns (address) {
        return OriginalBakerOwner[_id];
    }

    function getFoodieOwner(uint16 _id) external view returns (address) {
        return OriginalFoodieOwner[_id];
    }

    function getShopOwnerOwner(uint16 _id) external view returns (address) {
        return OriginalShopOwnerOwner[_id];
    }

    function bakerCount() external view returns (uint16) {
        return numBakersStaked;
    }

    function foodieCount() external view returns (uint16) {
        return numFoodiesStaked;
    }

    function shopOwnerCount() external view returns (uint16) {
        return uint16(stakedIds[4].length);
    }

    function setGameContract(address _contract, bool flag) external onlyOwner {
        gameContracts[_contract] = flag;
    }

    // ************ ALPHA AND RAT COUNT ***************

    function alphaCount(uint8 _gameIdentifier) external view returns (uint16) {
        return uint16(alphaIds[_gameIdentifier].length);
    }

    function allAlphaCount() external view returns (uint16 count) {
        count += uint16(alphaIds[1].length);
        count += uint16(alphaIds[2].length);
        count += uint16(alphaIds[3].length);
        count += uint16(alphaIds[4].length);
        count += uint16(alphaIds[5].length);
    }

    function ratCount() external view returns (uint16) {
        return numRatsStaked;
    }
}

File 2 of 13 : IGenesis.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface IGenesis {

    function walletOfOwner(address _owner) external view returns (uint256[] memory);
}

File 3 of 13 : ITopia.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface ITopia {

    function burn(uint256 _amount) external;
    function mint(address _to, uint256 _amount) external;  
    function burnFrom(address _from, uint256 _amount) external;
    function decimals() external pure returns (uint8);
    function balanceOf(address owner) external view returns (uint);
    function updateOriginAccess() external;
    function transferFrom(address sender, address recipient, uint256 amount) external returns(bool);
}

File 4 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 5 of 13 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 6 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 7 of 13 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 8 of 13 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 9 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 10 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 11 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 12 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 13 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999
  },
  "viaIR": true,
  "evmVersion": "istanbul",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_topia","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"AlienReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"AlienReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"AlphaReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"AlphaReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"BakerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"BakerReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"BakerReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"BullReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"BullReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"CadetAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"CadetReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"CadetReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"CatAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"CatReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"CatReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"DogReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"DogReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"FoodieReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"FoodieReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"GeneralMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"GeneralReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"GeneralReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_unstaker","type":"address"},{"indexed":false,"internalType":"uint8","name":"_gameId","type":"uint8"},{"indexed":false,"internalType":"uint80","name":"timestamp","type":"uint80"}],"name":"GroupUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_creator","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"cats","type":"uint16[]"}],"name":"LitterCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"MatadorMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"MatadorReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"MatadorReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_creator","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"runners","type":"uint16[]"}],"name":"MobCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_thief","type":"address"},{"indexed":true,"internalType":"address","name":"_victim","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"NFTStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_creator","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"cadets","type":"uint16[]"}],"name":"PlatoonCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"RatReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"RatReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"RunnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"RunnerReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"RunnerReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"ShopOwnerMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"ShopOwnerReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"ShopOwnerReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"TopiaClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_creator","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"bakers","type":"uint16[]"}],"name":"UnionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"VetMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_originalOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"VetReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_returnee","type":"address"},{"indexed":false,"internalType":"uint16","name":"_id","type":"uint16"}],"name":"VetReturned","type":"event"},{"inputs":[],"name":"Alpha","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Genesis","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GenesisInterface","outputs":[{"internalType":"contract IGenesis","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TopiaInterface","outputs":[{"internalType":"contract ITopia","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Wastelands","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint8","name":"_gameIdentifier","type":"uint8"}],"name":"addToGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"alienCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allAlphaCount","outputs":[{"internalType":"uint16","name":"count","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_gameIdentifier","type":"uint8"}],"name":"alphaCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"alphaGameIdentifier","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bakerCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_idNumbers","type":"uint16[]"},{"internalType":"uint8[]","name":"_types","type":"uint8[]"}],"name":"batchSetGenesisIdentifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bullCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cadetCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"catCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_ids","type":"uint16[]"},{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint8","name":"_gameIdentifier","type":"uint8"}],"name":"createGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devRescueEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dogCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"address","name":"_account","type":"address"}],"name":"emergencyRescueAlpha","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"address","name":"_account","type":"address"}],"name":"emergencyRescueGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"address","name":"_account","type":"address"}],"name":"emergencyRescueRat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"foodieCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generalCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"genesisIdentifier","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getAlienOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getBakerOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getBullOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getCadetOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getCatOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getDogOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getFoodieOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getGeneralOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getMatadorOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getRunnerOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getShopOwnerOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getUserAlphaStaked","outputs":[{"internalType":"uint16[]","name":"stakedAlphas","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getUserGenesisStaked","outputs":[{"internalType":"uint16[]","name":"stakedGenesis","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getUserRatStaked","outputs":[{"internalType":"uint16[]","name":"stakedRats","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint8","name":"game","type":"uint8"}],"name":"getUserStakedAlphaGame","outputs":[{"internalType":"uint16[]","name":"stakedAlphas","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint8","name":"game","type":"uint8"}],"name":"getUserStakedGenesisGame","outputs":[{"internalType":"uint16[]","name":"stakedGenesis","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"getVetOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"matadorCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"address","name":"_originalOwner","type":"address"},{"internalType":"uint8","name":"_gameId","type":"uint8"},{"internalType":"bool","name":"returningFromWastelands","type":"bool"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"numAlphasStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numGenesisStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numRatsStaked","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"pay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ratCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_originalOwner","type":"address"},{"internalType":"uint16[]","name":"_ids","type":"uint16[]"},{"internalType":"uint8[]","name":"identifiers","type":"uint8[]"},{"internalType":"uint8","name":"_gameIdentifier","type":"uint8"}],"name":"receieveManyGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_originalOwner","type":"address"},{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint8","name":"_gameIdentifier","type":"uint8"}],"name":"receiveAlpha","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_originalOwner","type":"address"},{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"receiveRat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_returnee","type":"address"},{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint8","name":"_gameIdentifier","type":"uint8"}],"name":"returnAlphaToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_returnee","type":"address"},{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint8","name":"identifier","type":"uint8"},{"internalType":"uint8","name":"_gameIdentifier","type":"uint8"}],"name":"returnGenesisToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_returnee","type":"address"},{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"returnRatToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runnerCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setDevRescueEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setGameContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_genesis","type":"address"}],"name":"setGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setRescueEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_topia","type":"address"}],"name":"setTopia","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shopOwnerCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint8","name":"_gameId","type":"uint8"},{"internalType":"uint8","name":"identifier","type":"uint8"},{"internalType":"address","name":"_victim","type":"address"}],"name":"stealGenesis","outputs":[{"internalType":"address","name":"thief","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint8","name":"_gameId","type":"uint8"},{"internalType":"address","name":"_victim","type":"address"},{"internalType":"bool","name":"returningFromWastelands","type":"bool"}],"name":"stealMigratingGenesis","outputs":[{"internalType":"address","name":"thief","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalHolderTOPIA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTOPIAEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint8","name":"_gameIdentifier","type":"uint8"}],"name":"unstakeGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vetCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"}]

6080346200010757601f620060c938819003918201601f19168301916001600160401b038311848410176200010c578084926020946040528339810103126200010757516001600160a01b039081811690819003620001075760005460018060a01b0319903382821617600055604051933391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a373810fedb4a6927d02a6427f7441f6110d7a1096d58160035416176003557396af517c414b3726c1b2ecc744ebf9d292dcbf60816004541617600455730b21144dbf11feb286d24cd42a7c3b0f90c32ac88160055416176005556002541617600255615fa69081620001238239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816302e70ab8146159de57508063030f8a09146159895780630adc84b01461528457806314b7f4c51461525e578063150b7a021461519e57806316372ab0146151795780632145cee51461513d57806324a811651461510157806327b3c190146150da5780632c8499c514613a755780632e02e658146150b35780632e19e73f14614eb4578063333dab5614614e0657806337d4fc8414614ddf57806339db714f14614dbc578063410e2b2914614d81578063438531f614614d55578063466bed6914614d2e5780634dd306cf14614cf25780634e5a18f91461480d578063516d60bc146147e85780635190357b146146f6578063588604f8146146d45780635e09f8741461469557806361888e8914614659578063624f99321461461d578063645b9fde146145e15780636a5085a9146145a55780636bf6eaff1461457e5780636e03c1761461403557806370a0823114613f75578063715018a614613f1b578063758854a214613d615780637653100814613d2c5780637804eb1f14613cf0578063795d336714613cd257806379cc679014613c3e5780637a6cae4e14613c025780638833241514613be05780638d89af4614613abd5780638da5cb5b14613a9757806391e4d98f14613a7557806391e761ca14612e425780639762942414612e0a5780639b479cfe14612dce5780639c312dc314612db15780639ddcba1d14612c84578063a3509fc814612c48578063a5e8364714612c1c578063a697361214612ac5578063a6cab4cd14612383578063a8ed28b4146122c2578063aac33aad1461229d578063bd48652e1461227f578063bd82fc78146117a4578063be5db8e414611782578063befec7051461165e578063c03f2ca614611622578063c407687614611506578063c6f654a014611481578063d8689691146113d3578063d885ce61146113a7578063d8e08e571461131d578063db1f5196146112fb578063e72f7cd5146112c5578063eb14b3531461127c578063f2fde38b146111a2578063f49d3955146110f8578063f5afe20f146110d3578063f70956c714610fd2578063f754ffa6146109f9578063f80b988c146103b9578063fb10c3d21461037d5763fd95856d1461034f57600080fd5b3461037a578060031936011261037a5761ffff604082600360209452601b8452205416604051908152f35b80fd5b503461037a57602036600319011261037a576001600160a01b03604060209261ffff6103a7615a11565b16815260138452205416604051908152f35b503461037a57608036600319011261037a576103d3615a11565b6103db615a58565b906103e4615a7d565b6064358015908115036109f45733855260ff6020926007845261040c82604089205416615bd9565b169060019182811015806109e9575b156109a5578083036107665750801561070f5761ffff8416808752600984527f10aae1ead4e36e8b41865adb3d322a33942fda91e1cb168046dd1c972ad0cc5a8460408920926001600160a01b03891693846001600160a01b0319825416179055604051908152a25b1561054857506001600160a01b03848160035416803b1561054457604051632142170760e11b81526001600160a01b038716600482015230602482015261ffff861660448201529082908290606490829084905af1801561053957610521575b505061051e9361ffff841686526024835260408620600560ff19825416179055168452601c81526040842090600585525260408320615d13565b80f35b61052a90615aad565b6105355784386104e4565b8480fd5b6040513d84823e3d90fd5b5080fd5b90916001600160a01b036003918682845416803b1561054457604051632142170760e11b81523060048201526001600160a01b038916602482015261ffff841660448201529082908290606490829084905af18015610539576106f7575b505061ffff939193809116938488526024968787526040892060ff198154169055169283600052601c94858752604060002097600598896000528852604060002054916000955b838710610603575b505050505050505050505080f35b87600052888a5260406000208b6000528a528186610625896040600020615cdc565b905490881b1c16036106ee57505085600052868852604060002089600052885260406000209060001983019283116106da57509161066b6106ae95949261068e94615cdc565b9054911b1c16918460005285875260406000208860005287526040600020615cdc565b90919082549060031b9161ffff9283811b93849216901b16911916179055565b6000528152604060002091600052526106ca6040600020615d88565b38808080808080808080806105f5565b634e487b7160e01b60005260116004526000fd5b958601956105ed565b61070090615aad565b61070b5786386105a6565b8680fd5b61ffff841680875260098452604087206001600160a01b031981541690556040519081527f65d7389b4b92a26ff3bda27f72e7035cfd365bdbeb67007bcdb592126acefd2c846001600160a01b03881692a2610484565b60028103610827575080156107d05761ffff8416808752600f84527f46462c42057db0f7a9f7c9f2b722d215f11ca2a0f5d38132b877843437a3b3c78460408920926001600160a01b03891693846001600160a01b0319825416179055604051908152a25b610484565b61ffff8416808752600f8452604087206001600160a01b031981541690556040519081527f1a91fc99f7ba6670afa9040ced9846e2e4ae5773fbd2d747eda6c2f5d8633c31846001600160a01b03881692a2610484565b600381036108e7575080156108905761ffff8416808752601384527fff9aa68430939f0c14075554dd842fa38c14c98977ca2a8a8759d2d9b7e2e8f78460408920926001600160a01b03891693846001600160a01b0319825416179055604051908152a2610484565b61ffff841680875260138452604087206001600160a01b031981541690556040519081527f9a55333272105310d1eac580297eb36abed153aeff87b7e87a264f62aac44850846001600160a01b03881692a2610484565b6004036107cb57801561094e5761ffff8416808752601784527fdd39053acc4ab51c644b0c68af41f73ce1fb879c3dd04e461fc66cd17affce778460408920926001600160a01b03891693846001600160a01b0319825416179055604051908152a2610484565b61ffff841680875260178452604087206001600160a01b031981541690556040519081527f0e86cc5d4242083c8e47d8d91f8b65ad3b640a0888c9c25da628544950cdef53846001600160a01b03881692a2610484565b6064846040519062461bcd60e51b82526004820152600f60248201527f496e76616c69642067616d6520696400000000000000000000000000000000006044820152fd5b50600481111561041b565b600080fd5b503461037a57606036600319011261037a57610a13615a11565b610a1b615a58565b90610a24615a7d565b3384526020906007825260ff8091610a4182604089205416615bd9565b16600181149485600014610cf1576001600160a01b0390878260035416803b1561054457604051632142170760e11b81526001600160a01b038416600482015230602482015261ffff891660448201529082908290606490829084905af1801561053957610cd9575b50506001600160a01b03917f3b08482ce1d83b0dee10c90274f7810c243fbed81e317303e9d4122e4c5fde248661ffff808a1690818d52600b835260408d2094861694856001600160a01b031982541617905560085490610b0c818316615dd3565b169061ffff191617600855604051908152a25b610b2a601f54615ccd565b601f551694858752601c845260408720826000528452610b4e856040600020615d13565b15610bac575061ffff7f6e4545ce7f7c3065c966e407a27add18a2d3340269a5dad3ddcd827a71996fe29316908186526006835260408620541615610b98575b604051908152a280f35b60408520805460ff19166001179055610b8e565b60028103610c0c575061ffff7f962a0bf2885f7d878689e8c2eb763bb44b7c19948ae428235e045cb084f7656f9316908186526006835260408620541615610bf857604051908152a280f35b60408520805460ff19166004179055610b8e565b60038103610c6c575061ffff7f177e7001afeb32d52fe86555fbf04a17d9d818e7f43c0df56227c119181a468f9316908186526006835260408620541615610c5857604051908152a280f35b60408520805460ff1916600a179055610b8e565b600414610c7b575b5050505080f35b61ffff7fba4cbf5fb6c4f19c4f9babe604b3c642f71e99006a1b9023bd2df354cb457e759316908186526006835260408620541615610cc5575b604051908152a238808080610c74565b60408520805460ff19166007179055610cb5565b610ce290615aad565b610ced578738610aaa565b8780fd5b60028203610de1576001600160a01b0390878260035416803b1561054457604051632142170760e11b81526001600160a01b038416600482015230602482015261ffff891660448201529082908290606490829084905af1801561053957610dcd575b50506001600160a01b03917f12874fc41971beedec32d7f3f5b92907f7baf9c4b390743a7c6f6399946fdf808661ffff808a1690818d52600d835260408d2094861694856001600160a01b0319825416179055600c5490610db6818316615dd3565b169061ffff191617600c55604051908152a2610b1f565b610dd690615aad565b610ced578738610d54565b60038203610ed1576001600160a01b0390878260035416803b1561054457604051632142170760e11b81526001600160a01b038416600482015230602482015261ffff891660448201529082908290606490829084905af1801561053957610ebd575b50506001600160a01b03917fad2ada2b0e0da621bbd929f37cad7f2c23b91c1307a6ef37587abe30b665cffa8661ffff808a1690818d526011835260408d2094861694856001600160a01b031982541617905560105490610ea6818316615dd3565b169061ffff191617601055604051908152a2610b1f565b610ec690615aad565b610ced578738610e44565b60048214610ee8575b6001600160a01b0390610b1f565b6001600160a01b0390878260035416803b1561054457604051632142170760e11b81526001600160a01b038416600482015230602482015261ffff891660448201529082908290606490829084905af1801561053957610fbe575b50506001600160a01b03917f5c25e0d917fafc03501d2c33e030668127f9fb3205f83c3a86f6fbd4d70504df8661ffff808a1690818d526015835260408d2094861694856001600160a01b031982541617905560145490610fa5818316615dd3565b169061ffff191617601455604051908152a29050610eda565b610fc790615aad565b610ced578738610f43565b503461037a57604036600319011261037a5767ffffffffffffffff6004358181116110cf57611005903690600401615b38565b916024359081116110cb5761101e903690600401615b38565b9190611028615b81565b82840361053557845b61ffff9081811690868210156110c75760ff9182611058611053838a89615c47565b615c6d565b161515806110ad575b156110a9576001928461108b61108661107e611053868d8c615c47565b948c8b615c47565b615c7b565b168a52600660205260408a20911660ff198254161790550116611031565b8880fd5b50600c836110bf611053848b8a615c47565b161115611061565b8780f35b8380fd5b8280fd5b503461037a578060031936011261037a57602061ffff60145460101c16604051908152f35b503461037a578060031936011261037a5760018152602090601a825261ffff908160408220541682811161118e579082604061117361115f61114b6111859660028752601a8a5285858820541690615f5a565b60038652601a895284848720541690615f5a565b60048552601a885283838620541690615f5a565b9260058152601a875220541690615f5a565b60405191168152f35b602482634e487b7160e01b81526011600452fd5b503461037a57602036600319011261037a576111bc615a42565b6111c4615b81565b6001600160a01b0380911690811561121257600054826001600160a01b0319821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b503461037a57602036600319011261037a576001600160a01b0361129e615a42565b6112a6615b81565b166001600160a01b031981816003541617600355600154161760015580f35b503461037a57602036600319011261037a5760ff604060209261ffff6112e9615a11565b16815260238452205416604051908152f35b503461037a578060031936011261037a57602061ffff600c5416604051908152f35b503461037a57602080600319360112610544576001600160a01b03611340615a42565b1691828152601e80835260408220549261135984615c9b565b94835b85811061137557604051806113718982615af9565b0390f35b60019082865284845261ffff61138e8260408920615cdc565b90549060031b1c166113a0828a615cff565b520161135c565b503461037a578060031936011261037a5761ffff604082600160209452601b8452205416604051908152f35b503461037a57604036600319011261037a576113ed615a42565b906001600160a01b036113fe615a8d565b921691828252601d9160209083825260ff604082209316928360005282526040600020549361142c85615c9b565b95825b86811061144457604051806113718a82615af9565b6001908285528386526040852087600052865261ffff611468826040600020615cdc565b90549060031b1c1661147a828b615cff565b520161142f565b503461037a57604036600319011261037a5761149b615a42565b7fd77603b1586d29d109a38f629a93cb445a0fe05dbda55a782d5d43e53df04d7960406001600160a01b036114ce615a8d565b9333865260076020526114e660ff8488205416615bd9565b60ff83519516855269ffffffffffffffffffff421660208601521692a280f35b503461037a57604036600319011261037a57611520615a42565b60243590338352600760205261153c60ff604085205416615bd9565b6001600160a01b0390838260025416803b15610544576040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602481018690529082908290604490829084905af180156105395761160e575b50507ff15ef988e0cab7863e51b16028ffd8ac865deaa333c9a9596b702ee6692e10819160609116928385526022602052604085206115e7828254615c24565b90556115f581602554615c24565b602555604051908152436020820152426040820152a280f35b61161790615aad565b6110cb5783386115a7565b503461037a57602036600319011261037a576001600160a01b03604060209261ffff61164c615a11565b16815260178452205416604051908152f35b503461037a576020908160031936011261037a5761167a615a42565b9181906001600160a01b0360019416915b60ff8516600581116116c8576116c2916116bc91858752601c85526040872090600052845260406000205490615c24565b94615c8a565b9361168b565b50916116d48493615c9b565b839060015b60ff81166005811161177457848752601c808752604088208260005287526040600020549188915b83831061171a575050505061171590615c8a565b6116d9565b919561176261176891898c9b969a94979b5284865260408c2087600052865261ffff61174a8a6040600020615cdc565b90549060031b1c1661175c828a615cff565b52615ccd565b96615ccd565b91979390969297611701565b604051806113718582615af9565b503461037a578060031936011261037a57602061ffff60085416604051908152f35b503461037a57608036600319011261037a576117be615a42565b67ffffffffffffffff906024358281116110cb57366023820112156110cb578060040135906117ec82615b69565b916117fa6040519384615ad7565b8083526024602084019160051b8301019136831161070b57602401905b828210612267575050506044359283116110cb57366023840112156110cb57826004013561184481615b69565b936118526040519586615ad7565b8185526024602086019260051b8201019036821161070b579060248794939201915b81831061224457505050611886615a9d565b338352600760205261189e60ff604085205416615bd9565b60ff16825b825181101561223057600160ff6118ba8389615cff565b511603611aa55761ffff806118cf8386615cff565b51168552600b602052604085206001600160a01b0387166001600160a01b03198254161790556008805482611905818316615dd3565b169061ffff19161790556119198285615cff565b51166040519081527f3b08482ce1d83b0dee10c90274f7810c243fbed81e317303e9d4122e4c5fde2460206001600160a01b03881692a25b61ffff61195e8285615cff565b5116845260246020526040842060ff1990838282541617905561ffff6119848386615cff565b5116855260068060205260ff60408720541615611a70575b50506001600160a01b0385168452601c60205260408420826000526020526119d7604060002061ffff6119cf8487615cff565b511690615d13565b6001600160a01b036003541661ffff6119f08386615cff565b511690803b15611a6c57604051632142170760e11b81526001600160a01b038816600482015230602482015261ffff92909216604483015285908290606490829084905af1908115611a61578591611a4d575b50506001016118a3565b611a5690615aad565b6110cb578338611a43565b6040513d87823e3d90fd5b8580fd5b60ff611a7c848a615cff565b51169061ffff611a8c8588615cff565b511687526020526040862091825416179055388061199c565b60028060ff611ab4848a615cff565b511603611b5c575061ffff80611aca8386615cff565b51168552600a602052604085206001600160a01b0387166001600160a01b03198254161790556008805463ffff00006010611b088584831c16615dd3565b901b169063ffff00001916179055611b208285615cff565b51166040519081527f4e0d1b237501159b8d5c2a1777b73a3090fd95d5a0de2806ddd8ca535e447f9360206001600160a01b03881692a2611951565b60038060ff611b6b858b615cff565b511603611c0957505061ffff80611b828386615cff565b511685526009602052604085206001600160a01b0387166001600160a01b031982541617905560018552601b602052611bc360408620826119cf8588615cff565b611bcd8285615cff565b51166040519081527f77268c18aa294555f638ca631483843e5e99f579965e7ab82ad8dc9c92622d0b60206001600160a01b03881692a2611951565b600460ff611c17858b615cff565b511603611cb457505061ffff80611c2e8386615cff565b51168552600d602052604085206001600160a01b0387166001600160a01b0319825416179055600c805482611c64818316615dd3565b169061ffff1916179055611c788285615cff565b51166040519081527f12874fc41971beedec32d7f3f5b92907f7baf9c4b390743a7c6f6399946fdf8060206001600160a01b03881692a2611951565b600560ff611cc2858b615cff565b511603611d5e575061ffff9081611cd98487615cff565b51168652600e602052604086206001600160a01b0388166001600160a01b03198254161790558552601b602052611d1860408620826119cf8588615cff565b611d228285615cff565b51166040519081527f43cf9d3931bdfd22950a871bb4f31d7c0ab0f71c1a3a0236ce2f883ead41ee7a60206001600160a01b03881692a2611951565b9050600660ff611d6e848a615cff565b511603611e16575061ffff80611d848386615cff565b51168552600f602052604085206001600160a01b0387166001600160a01b0319825416179055600c805463ffff00006010611dc28584831c16615dd3565b901b169063ffff00001916179055611dda8285615cff565b51166040519081527fa8477a27ecdfcfd7615fbe783fe10961e52aba38d67c0f8224df7e918bb3370f60206001600160a01b03881692a2611951565b600760ff611e24848a615cff565b511603611ec0575061ffff80611e3a8386615cff565b511685526015602052604085206001600160a01b0387166001600160a01b03198254161790556014805482611e70818316615dd3565b169061ffff1916179055611e848285615cff565b51166040519081527f5c25e0d917fafc03501d2c33e030668127f9fb3205f83c3a86f6fbd4d70504df60206001600160a01b03881692a2611951565b600860ff611ece848a615cff565b511603611f76575061ffff80611ee48386615cff565b511685526016602052604085206001600160a01b0387166001600160a01b03198254161790556014805463ffff00006010611f228584831c16615dd3565b901b169063ffff00001916179055611f3a8285615cff565b51166040519081527fa105eb1c1aeb2a96bd4e193c3a9b3bf73f2a8a1181b1b7e6dacda6c6a9a3554960206001600160a01b03881692a2611951565b600960ff611f84848a615cff565b511603612021575061ffff80611f9a8386615cff565b511685526017602052604085206001600160a01b0387166001600160a01b031982541617905560048552601b602052611fdb60408620826119cf8588615cff565b611fe58285615cff565b51166040519081527fb582b14f2ac3955bf383ef03f14b6d49c4740aaf044a02486db8aa68b728595e60206001600160a01b03881692a2611951565b600a60ff61202f848a615cff565b5116036120cb575061ffff806120458386615cff565b511685526011602052604085206001600160a01b0387166001600160a01b0319825416179055601080548261207b818316615dd3565b169061ffff191617905561208f8285615cff565b51166040519081527fad2ada2b0e0da621bbd929f37cad7f2c23b91c1307a6ef37587abe30b665cffa60206001600160a01b03881692a2611951565b600b60ff6120d9848a615cff565b51160361217f575061ffff806120ef8386615cff565b511685526012602052604085206001600160a01b0387166001600160a01b03198254161790556010805463ffff000061212b8483851c16615dd3565b831b169063ffff000019161790556121438285615cff565b51166040519081527fdf31d7124bfd2f8787d236d3e4d5545a7b4de7ed54a53733bcec0a941883d00e60206001600160a01b03881692a2611951565b600c60ff61218d848a615cff565b51161461219b575b50611951565b61ffff90816121aa8487615cff565b511686526013602052604086206001600160a01b0388166001600160a01b03198254161790558552601b6020526121e960408620826119cf8588615cff565b6121f38285615cff565b51166040519081527fabc0672b455df3350544c04ba51f9896a8c558f26a9c99ac08f286aae725459960206001600160a01b03881692a238612195565b8361223e8451601f54615c24565b601f5580f35b9091809394503560ff811681036109f45781528693926020908101929101611874565b6020809161227484615a33565b815201910190611817565b503461037a578060031936011261037a576020602554604051908152f35b503461037a578060031936011261037a57602061ffff60105460101c16604051908152f35b503461037a57604036600319011261037a57806122dd615a11565b6122e5615a58565b60ff60265460081c1680612370575b1561236c576001600160a01b036003541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff1660448201529082908290818381606481015b03925af18015610539576123575750f35b61236090615aad565b61037a5780f35b505050fd5b5050fd5b506001600160a01b0383541633146122f4565b503461037a57606036600319011261037a5760043567ffffffffffffffff8111610544576123b5903690600401615b38565b906123be615a58565b916123c7615a7d565b33855260076020526123df60ff604087205416615bd9565b845b61ffff8316811015612978578560ff83166001036125dd5750856001600160a01b0360035416612415611086848789615c47565b90803b156110cf57604051632142170760e11b81526001600160a01b038916600482015230602482015261ffff92909216604483015282908290606490829084905af18015610539576125c9575b50508061ffff6124796110866001948789615c47565b168752600b602052604087206001600160a01b0387166001600160a01b03198254161790556008805461ffff6124b0818316615dd3565b169061ffff1916179055816124c9611086838789615c47565b61ffff604051911681527f3b08482ce1d83b0dee10c90274f7810c243fbed81e317303e9d4122e4c5fde2460206001600160a01b038a1692a25b61ffff61251461108684888a615c47565b16885260246020526040882060ff199060ff86168282541617905561ffff61254061108685898b615c47565b16895260068060205260ff60408b2054161561259b575b5050506001600160a01b0386168752601c6020526040872060ff8416600052602052612595604060002061258f61108684888a615c47565b90615d13565b016123e1565b61ffff6125ac611086868a8c615c47565b168a5260205260ff60408a20921690825416179055388080612557565b6125d290615aad565b611a6c578538612463565b60ff831660020361270b5750856001600160a01b0360035416612604611086848789615c47565b90803b156110cf57604051632142170760e11b81526001600160a01b038916600482015230602482015261ffff92909216604483015282908290606490829084905af18015610539576126f7575b50508061ffff6126686110866001948789615c47565b168752600d602052604087206001600160a01b0387166001600160a01b0319825416179055600c805461ffff61269f818316615dd3565b169061ffff191617905560046126b9611086838789615c47565b61ffff604051911681527f12874fc41971beedec32d7f3f5b92907f7baf9c4b390743a7c6f6399946fdf8060206001600160a01b038a1692a2612503565b61270090615aad565b611a6c578538612652565b86600360ff8516810361283a576001600160a01b039192505416612733611086848789615c47565b90803b156110cf57604051632142170760e11b81526001600160a01b038916600482015230602482015261ffff92909216604483015282908290606490829084905af1801561053957612826575b50508061ffff6127976110866001948789615c47565b1687526011602052604087206001600160a01b0387166001600160a01b03198254161790556010805461ffff6127ce818316615dd3565b169061ffff1916179055600a6127e8611086838789615c47565b61ffff604051911681527fad2ada2b0e0da621bbd929f37cad7f2c23b91c1307a6ef37587abe30b665cffa60206001600160a01b038a1692a2612503565b61282f90615aad565b611a6c578538612781565b600460ff861614612851575b505090600191612503565b6001600160a01b03919250541661286c611086848789615c47565b90803b156110cf57604051632142170760e11b81526001600160a01b038916600482015230602482015261ffff92909216604483015282908290606490829084905af1801561053957612964575b50508061ffff6128d06110866001948789615c47565b1687526015602052604087206001600160a01b0387166001600160a01b03198254161790556014805461ffff612907818316615dd3565b169061ffff19161790556007612921611086838789615c47565b61ffff604051911681527f5c25e0d917fafc03501d2c33e030668127f9fb3205f83c3a86f6fbd4d70504df60206001600160a01b038a1692a29091508638612846565b61296d90615aad565b611a6c5785386128ba565b5092919261298c61ffff8316601f54615c24565b601f5560ff81166001036129dd57507fa8da7b1e0d970b1eafd389eff60f1af7bc99d29f12e6251e77bc1ad40fa79786916129d76001600160a01b0392604051938493169583615f13565b0390a280f35b60ff8116600203612a2557507f060119b04c405bda169a7f1d2fed0a8d391cb7ce23c2bd031185475978e6a7a2916129d76001600160a01b0392604051938493169583615f13565b60ff8116600303612a6d57507f655f67d36ab8e6c4bdda185fc5bf82b880bac26ec421c4fc741ff0e57fc36232916129d76001600160a01b0392604051938493169583615f13565b60ff16600414612a7e575b50505080f35b7f062c99098d2ce454eea75921396a62949c49c49d493384ca7644d329101b57b191612aba6001600160a01b0392604051938493169583615f13565b0390a2388080612a78565b503461037a57604036600319011261037a5780612ae0615a11565b612ae8615a58565b60265460ff8160081c1680612c09575b15612b5e57506001600160a01b036005541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff1660448201529082908290818381606481015b03925af180156105395761235757505080f35b60ff1680612be7575b612b715750505080f35b6001600160a01b036005541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff1660448201529082908290818381606481015b03925af1801561053957612bd3575b80612a78565b612bdc90615aad565b61037a578038612bcd565b5061ffff8216835260196020526001600160a01b036040842054163314612b67565b506001600160a01b038454163314612af8565b503461037a578060031936011261037a5761ffff604082600260209452601b8452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff612c72615a11565b16815260118452205416604051908152f35b503461037a57604036600319011261037a57612c9e615a42565b612ca6615a22565b3383526007602052612cbe60ff604085205416615bd9565b6001600160a01b0390838260055416803b1561054457604051632142170760e11b81526001600160a01b038616600482015230602482015261ffff841660448201529082908290606490829084905af1801561053957612d9d575b50507f8b6eebbdec11343459b3554f4b96ba6b00fb0f1c9803e175df47bbf4f7e0a0bb91602091612d7961ffff91828116938489526019865260408920971696876001600160a01b0319825416179055868852601e855260408820615d13565b60215490612d88818316615dd3565b169061ffff191617602155604051908152a280f35b612da690615aad565b6110cb578338612d19565b503461037a578060031936011261037a5760208054604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff612df8615a11565b16815260098452205416604051908152f35b503461037a57602036600319011261037a5760406020916001600160a01b03612e31615a42565b168152602283522054604051908152f35b503461037a57608036600319011261037a57612e5c615a42565b90612e65615a22565b612e6d615a7d565b92612e76615a9d565b9333845260ff60209160078352612e9282604088205416615bd9565b166001808203612fa15750508394612f42917f353dc3aef968a6a73b5fee216416835a4f8cb955339ecd211d9a9e07bdc76bc561ffff91828716808952600b82526001600160a01b0393612ef18560408c205416958916958614615d3d565b818a52600b83526040808b2080546001600160a01b0319169055602484528a20805460ff1916905560085490612f28818316615de6565b169061ffff191617600855604051908152a25b8284615df7565b612f4d601f54615dc6565b601f556001600160a01b036003541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff166044820152908290829081838160648101612346565b600282810361305b575050508394612f42917f7d4e06c18795f0a46e6788c6fb3d66ffd90ecf8977ec9f1e2baa9051eb42eeb161ffff91828716808952600a82526001600160a01b03936130008560408c205416958916958614615d3d565b818a52600a835260408a206001600160a01b031981541690556024835260408a2060ff19815416905563ffff000061303f600854928360101c16615de6565b60101b169063ffff0000191617600855604051908152a2612f3b565b600393928085036131d357505061ffff9283861691828852600984526001600160a01b03946130958660408b205416968816968714615d3d565b83895260098552604089206001600160a01b0319815416905560249081865260408a2060ff19815416905582600052601b938487526040600020546000935b818510613118575b50505050505050917f65d7389b4b92a26ff3bda27f72e7035cfd365bdbeb67007bcdb592126acefd2c869792612f4294604051908152a2612f3b565b85600052868952858885613130886040600020615cdc565b905490871b1c16036131ca5760005286895260406000209060001983019283116106da57509361068e7f65d7389b4b92a26ff3bda27f72e7035cfd365bdbeb67007bcdb592126acefd2c97948e9f9a97946131936131ab95612f429e9c99615cdc565b9054911b1c1691846000528588526040600020615cdc565b60005282526131bd6040600020615d88565b92948194993880806130dc565b909401936130d4565b929390926004810361328457505050508394612f42917ffc6cbfef07cde2a0f8e48ee78e5bcc2c1e67e3d3d384a6098a6a450742263ebd61ffff91828716808952600d82526001600160a01b03936132368560408c205416958916958614615d3d565b818a52600d83526040808b2080546001600160a01b0319169055602484528a20805460ff19169055600c549061326d818316615de6565b169061ffff191617600c55604051908152a2612f3b565b929392600581036133e7575061ffff9384871692838952600e85526001600160a01b03956132bd8760408c205416978916978814615d3d565b848a52600e865260408a206001600160a01b0319815416905560249384875260408b2060ff19815416905583600052601b94858852604060002054906000945b828610613342575b5050505050505050917fb1c64268b67eef6584cea022efe1cfe7314634f05b6f9bb974257bdc0383243f869792612f4294604051908152a2612f3b565b86600052878a528885613359886040600020615cdc565b905490871b1c16036133de57508560005286895260406000209060001983019283116106da57509361068e7fb1c64268b67eef6584cea022efe1cfe7314634f05b6f9bb974257bdc0383243f97948e9f9a97946131936133be95612f429e9c99615cdc565b60005282526133d06040600020615d88565b929481949938808080613305565b809501946132fd565b90979350600681036134a557505084955090612f42917f1a91fc99f7ba6670afa9040ced9846e2e4ae5773fbd2d747eda6c2f5d8633c3161ffff91828716808952600f82526001600160a01b039361344a8560408c205416958916958614615d3d565b818a52600f835260408a206001600160a01b031981541690556024835260408a2060ff19815416905563ffff0000613489600c54928360101c16615de6565b60101b169063ffff0000191617600c55604051908152a2612f3b565b6007810361355257505084955090612f42917f83622d58cf015c18e226a0d9d17619745b99d952a5740e4a60cd8942360c2c6b61ffff91828716808952601582526001600160a01b03936135048560408c205416958916958614615d3d565b818a52601583526040808b2080546001600160a01b0319169055602484528a20805460ff191690556014549061353b818316615de6565b169061ffff191617601455604051908152a2612f3b565b6008810361360c57505084955090612f42917f3fa3aa79eea014342138abcf13a240683fb1a7ec35fdcfc4d3cc0bd7b8c1303061ffff91828716808952601682526001600160a01b03936135b18560408c205416958916958614615d3d565b818a526016835260408a206001600160a01b031981541690556024835260408a2060ff19815416905563ffff00006135f0601454928360101c16615de6565b60101b169063ffff0000191617601455604051908152a2612f3b565b60098103613787575061ffff9687861691828852601784526001600160a01b03986136428a60408b2054169a88169a8b14615d3d565b83895260178552604089206001600160a01b0319815416905560249283865260408a2060ff1981541690556004600052601b93848752604060002054906000945b8286106136c7575b50505050505050957f0e86cc5d4242083c8e47d8d91f8b65ad3b640a0888c9c25da628544950cdef53612f4293928798604051908152a2612f3b565b600460005286895287856136df886040600020615cdc565b905490871b1c160361377e5750600460005285885260406000209060001983019283116106da57509361068e8c9d97947f0e86cc5d4242083c8e47d8d91f8b65ad3b640a0888c9c25da628544950cdef53979461374461375d95612f429d9c99615cdc565b9054911b1c169160046000528487526040600020615cdc565b600460005282526137716040600020615d88565b929881949538808061368b565b80950194613683565b909690600a810361383757505084955090612f42917f3b09adbdbbf3a9a7099a6851c3126ee181d4645531ed78837f2a0c105156231461ffff91828716808952601182526001600160a01b03936137e98560408c205416958916958614615d3d565b818a52601183526040808b2080546001600160a01b0319169055602484528a20805460ff1916905560105490613820818316615de6565b169061ffff191617601055604051908152a2612f3b565b600b81036138f157505084955090612f42917fc7566e16b1dfb6ea96eca0b07ecc81ac60913a7e91a31829e986b65acf3948ca61ffff91828716808952601282526001600160a01b03936138968560408c205416958916958614615d3d565b818a526012835260408a206001600160a01b031981541690556024835260408a2060ff19815416905563ffff00006138d5601054928360101c16615de6565b60101b169063ffff0000191617601055604051908152a2612f3b565b600c14613907575b5050839450612f4290612f3b565b61ffff80861691828852601384526001600160a01b03986139338a60408b2054169a88169a8b14615d3d565b83895260138552604089206001600160a01b0319815416905560249283865260408a2060ff19815416905582600052601b93848752604060002054906000935b8285106139b9575b50505050505050957f9a55333272105310d1eac580297eb36abed153aeff87b7e87a264f62aac44850612f4293928798604051908152a290386138f9565b8560005286895287846139d0876040600020615cdc565b905490891b1c1603613a6c57508460005285885260406000209060001983019283116106da57508b9c969361068e7f9a55333272105310d1eac580297eb36abed153aeff87b7e87a264f62aac448509794613a34612f429c9b9895613a4d95615cdc565b905490861b1c1691846000528588526040600020615cdc565b6000528252613a5f6040600020615d88565b929881949538808061397b565b80940193613973565b503461037a578060031936011261037a57602061ffff60215416604051908152f35b503461037a578060031936011261037a576001600160a01b036020915416604051908152f35b503461037a57604036600319011261037a5780613ad8615a11565b613ae0615a58565b60265460ff8160081c1680613bcd575b15613b4757506001600160a01b036004541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff166044820152908290829081838160648101612b4b565b60ff1680613bab575b613b5a5750505080f35b6001600160a01b036004541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff166044820152908290829081838160648101612bbe565b5061ffff8216835260186020526001600160a01b036040842054163314613b50565b506001600160a01b038454163314613af0565b503461037a578060031936011261037a57602061ffff60105416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff613c2c615a11565b16815260128452205416604051908152f35b503461037a57604036600319011261037a5780613c59615a42565b3382526007602052613c7160ff604084205416615bd9565b6001600160a01b0360025416803b1561236c576040517f79cc67900000000000000000000000000000000000000000000000000000000081526001600160a01b03909216600483015260248035908301528290829081838160448101612346565b503461037a578060031936011261037a576020601f54604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff613d1a615a11565b168152600a8452205416604051908152f35b503461037a57602036600319011261037a57613d46615a6e565b613d4e615b81565b60ff801960265416911515161760265580f35b503461037a57606036600319011261037a57613d7b615a42565b613d83615a22565b613d8b615a7d565b33845260ff60209160078352613da682604088205416615bd9565b16600181101580613f10575b15613ecc576001600160a01b0390858260045416803b1561054457604051632142170760e11b81526001600160a01b038816600482015230602482015261ffff871660448201529082908290606490829084905af1801561053957613eb8575b505083613ea29161ffff7ff21b092d2b78057537987c15cf87ef20f0d705bd1bcccc46a317d554e10c78c99616938489526018865260408920971696876001600160a01b0319825416179055808852601a8552613e728260408a20615d13565b83885260238552604088208160ff19825416179055868852601d8552604088209060005284526040600020615d13565b613eac8254615ccd565b8255604051908152a280f35b613ec190615aad565b611a6c578538613e12565b6064826040519062461bcd60e51b82526004820152600a60248201527f696e76616c6964206964000000000000000000000000000000000000000000006044820152fd5b506005811115613db2565b503461037a578060031936011261037a57613f34615b81565b60006001600160a01b0381546001600160a01b031981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461037a576020806003193601126105445790613f91615a42565b6001600160a01b031691600190825b60ff831660058111613fdd57613fd791613fd191878752601c85526040872090600052845260406000205490615c24565b92615c8a565b91613fa0565b600186838588805b60ff8616600581116140225761401c9161401691878552601d86526040852090600052855260406000205490615c24565b95615c8a565b94613fe5565b8361402d8684615c24565b604051908152f35b503461037a5760a036600319011261037a5761404f615a11565b614057615a7d565b61405f615a9d565b916084356001600160a01b0394858216938483036109f4573382526020956007875260ff61409281604086205416615bd9565b839063ffffffff60243516928185166001811460001461427a575016600181036141da57505060018352601a875260408320805461413893926140df92916140d991615ef3565b90615cdc565b949061ffff958691549060031b1c1684526018885288604085205416948087168552600b8952604085206001600160a01b0319815416905560085490614126818316615de6565b169061ffff1916176008555b85615df7565b8560035416803b1561054457604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff851660448201529082908290606490829084905af18015610539576141c6575b505083947fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f911693849261ffff60405191168152a3604051908152f35b6141d08291615aad565b61037a5780614189565b909491906002146141f1575b509061413891614132565b60018452601b88526040842080549295506141389392614215926140d99190615ef3565b949061ffff958691549060031b1c1684526009885288604085205416948087168552600a8952604085206001600160a01b0319815416905563ffff0000614263600854928360101c16615de6565b60101b169063ffff000019161760085590916141e6565b96929594939190600288036143205760049293949596975016146142a357509061413891614132565b60028452601b885260408420805492955061413893926142c7926140d99190615ef3565b949061ffff958691549060031b1c168452600e885288604085205416948087168552600d8952604085206001600160a01b03198154169055600c549061430e818316615de6565b169061ffff191617600c5590916141e6565b600397808903614445575016600a81036143ab5750858452601a895260408420805494955061413894614357926140d99190615ef3565b9561ffff96879254911b1c168452601888528860408520541694808716855260118952604085206001600160a01b031981541690556010549061439b818316615de6565b169061ffff191617601055614132565b600b146143c0575b5061413892939450614132565b858452601b8952604084208054949550614138946143e2926140d99190615ef3565b9561ffff96879254911b1c168452601388528860408520541694808716855260128952604085206001600160a01b0319815416905563ffff000061442d601054928360101c16615de6565b60101b169063ffff00001916176010558493926143b3565b60041461445c575b50505061413892939450614132565b16600781036144e3575060048452601a895260408420805494955061413894614489926140d99190615ef3565b9561ffff96879254911b1c168452601888528860408520541694808716855260158952604085206001600160a01b03198154169055601454906144cd818316615de6565b169061ffff1916176014555b849392388061444d565b6008146144f8575b50614138929394506144d9565b60048452601b89526040842080549495506141389461451b926140d99190615ef3565b9561ffff96879254911b1c168452601788528860408520541694808716855260168952604085206001600160a01b0319815416905563ffff0000614566601454928360101c16615de6565b60101b169063ffff00001916176014558493926144eb565b503461037a578060031936011261037a5760206001600160a01b0360035416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff6145cf615a11565b168152600b8452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff61460b615a11565b16815260168452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff614647615a11565b168152600e8452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff614683615a11565b16815260158452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b036146b7615a42565b6146bf615b81565b166001600160a01b0319600254161760025580f35b503461037a578060031936011261037a57602061ffff60145416604051908152f35b503461037a576020908160031936011261037a57614712615a42565b9181906001600160a01b0360019416915b60ff85166005811161475a57614754916116bc91858752601d85526040872090600052845260406000205490615c24565b93614723565b50916147668493615c9b565b839060015b60ff81166005811161177457848752601d808752604088208260005287526040600020549188915b8383106147ac57505050506147a790615c8a565b61476b565b91956117626147dc91898c9b969a94979b5284865260408c2087600052865261ffff61174a8a6040600020615cdc565b91979390969297614793565b503461037a578060031936011261037a57602061ffff60085460101c16604051908152f35b503461037a57606036600319011261037a57614827615a42565b61482f615a22565b90614838615a7d565b90338452600760205261485160ff604086205416615bd9565b61ffff8316845260186020526001600160a01b03916148798360408720541684841614615d3d565b848360045416803b1561054457604051632142170760e11b81523060048201526001600160a01b038516602482015261ffff871660448201529082908290606490829084905af1801561053957614cde575b505061ffff841685526018602052604085206001600160a01b0319815416905560236020526040852060ff1981541690558282168552601d806020526040862060ff831660005260205260406000205486905b808210614bf2575b50505060ff81168552601a602052604085205480600019810111614bde5785908190600019810160011c5b81841061499c575b82887fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb60208a8a61498a8354615dc6565b835561ffff604051951685521692a280f35b60ff85168352601a60205261ffff6149b78560408620615cdc565b919054818b169260031b1c1614600014614a53575092614a346020959361068e61ffff614a1960ff9660407fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb9c9a8989168352601a8d52600019019120615cdc565b90549060031b1c16918585168c52601a895260408c20615cdc565b168652601a8352614a4760408720615d88565b91819350853880614959565b60ff85168352601a60205261ffff614a75604085206000198786030190615cdc565b905460039190911b1c811690891603614ad6575092614a346020959361068e61ffff614a1960ff9660407fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb9c9a8989168352601a8d52600019019120615cdc565b60ff85168352601a60205261ffff614af46040852086840390615cdc565b905460039190911b1c811690891603614b55575092614a346020959361068e61ffff614a1960ff9660407fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb9c9a8989168352601a8d52600019019120615cdc565b60ff85168352601a60205261ffff614b736040852086840190615cdc565b905460039190911b1c811690891603614bd4575092614a346020959361068e61ffff614a1960ff9660407fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb9c9a8989168352601a8d52600019019120615cdc565b9260010192614951565b602486634e487b7160e01b81526011600452fd5b8585168852826020526040882060ff8516600052602052614c17826040600020615cdc565b905460039291831b1c61ffff90811690891603614cd2578686168952836020526040892060ff861660005260205260406000206000198201918211614cbe57614c939392614c6b61068e9361ffff93615cdc565b9054911b1c16918787168a528460205260408a2060ff87166000526020526040600020615cdc565b83831686526020526040852060ff8216600052602052614cb66040600020615d88565b388080614926565b60248a634e487b7160e01b81526011600452fd5b9160019150019061491e565b614ce790615aad565b6105355784386148cb565b503461037a57602036600319011261037a57614d0c615a6e565b614d14615b81565b61ff0060265491151560081b169061ff0019161760265580f35b503461037a578060031936011261037a5760206001600160a01b0360015416604051908152f35b503461037a578060031936011261037a5761ffff604082600460209452601b8452205416604051908152f35b503461037a57602036600319011261037a576004359060ff82168092036109f45760408160209361ffff9352601a8452205416604051908152f35b503461037a578060031936011261037a57602060ff602654166040519015158152f35b503461037a578060031936011261037a5760206001600160a01b0360045416604051908152f35b503461037a57604036600319011261037a57614e20615a42565b906001600160a01b03614e31615a8d565b921691828252601c9160209083825260ff6040822093169283600052825260406000205493614e5f85615c9b565b95825b868110614e7757604051806113718a82615af9565b6001908285528386526040852087600052865261ffff614e9b826040600020615cdc565b90549060031b1c16614ead828b615cff565b5201614e62565b503461037a57604036600319011261037a57614ece615a42565b90614ed7615a22565b91338252602060078152614ef160ff604085205416615bd9565b61ffff9384811690818552601983526001600160a01b03938460408720541694614f1f818316968714615d3d565b6005541690813b1561070b57604051632142170760e11b81523060048201526001600160a01b03909116602482015261ffff9092166044830152859082908183816064810103925af18015611a615790859161509f575b5081905260198252604084206001600160a01b03198154169055828452601e9485835260408520549585965b808810614fde575b50506021547f99175dc3ea3b7c111b073fe0a90ef647baf911324dd47b428e8fb6f2f22bfe80939291612d88828216615de6565b829086885282865284614ff48a60408b20615cdc565b905460039491851b1c16036150935786885282865260408820600019820191821161507f57846150659361504f7f99175dc3ea3b7c111b073fe0a90ef647baf911324dd47b428e8fb6f2f22bfe809a9b9c9461068e94615cdc565b9054911b1c1691898b5284885260408b20615cdc565b858752835261507660408720615d88565b85949338614faa565b602489634e487b7160e01b81526011600452fd5b97600191500196614fa2565b6150a890615aad565b6110cb578338614f76565b503461037a578060031936011261037a5760206001600160a01b0360025416604051908152f35b503461037a578060031936011261037a5760206001600160a01b0360055416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff61512b615a11565b168152600f8452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff615167615a11565b168152600d8452205416604051908152f35b503461037a578060031936011261037a57602061ffff600c5460101c16604051908152f35b503461037a57608036600319011261037a576151b8615a42565b506151c1615a58565b5060643567ffffffffffffffff8082116110cf57366023830112156110cf57816004013590811161524a57604051615203601f8301601f191660200182615ad7565b81815236602483850101116110cb57816024602094018483013701015260206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b602483634e487b7160e01b81526041600452fd5b503461037a578060031936011261037a57602060ff60265460081c166040519015158152f35b503461037a5760a036600319011261037a5761529e615a11565b6152a6615a7d565b606435916001600160a01b0380841692838503611a6c576084359081159182150361070b57338752602095600787526152e560ff60408a205416615bd9565b60ff9091169060243563ffffffff1688600184036154a3575061531f91925060028952601b88526140d960408a209160408b205490615ef3565b919061ffff928391549060031b1c168852600e8752836040892054169260001461540f5787846003541691823b1561054457604051632142170760e11b81526001600160a01b039182166004820152908516602482015261ffff87166044820152918290606490829084905af18015615404576153f0575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94935b8616815260098852206001600160a01b031981541690555b1693849261ffff60405191168152a3604051908152f35b6153fa8891615aad565b61070b5738615397565b6040513d8a823e3d90fd5b508260035416803b15610ced57604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff861660448201529088908290606490829084905af180156154045761548f575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94936153c1565b6154998891615aad565b61070b5738615461565b6002840361563357506154cd91925060028952601b88526140d960408a209160408b205490615ef3565b919061ffff928391549060031b1c168852600e8752836040892054169260001461559f5787846003541691823b1561054457604051632142170760e11b81526001600160a01b039182166004820152908516602482015261ffff87166044820152918290606490829084905af180156154045761558b575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94935b86168152600f8852206001600160a01b031981541690556153d9565b6155958891615aad565b61070b5738615545565b508260035416803b15610ced57604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff861660448201529088908290606490829084905af180156154045761561f575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f949361556f565b6156298891615aad565b61070b57386155f1565b6003938085036157c0575050846156608a9260028452601b8b526140d96040852091604086205490615ef3565b949061ffff9586915490831b1c168352600e8a52816040842054169560001461572d57541691823b1561054457604051632142170760e11b81526001600160a01b039182166004820152908516602482015261ffff87166044820152918290606490829084905af1801561540457615719575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94935b8616815260138852206001600160a01b031981541690556153d9565b6157238891615aad565b61070b57386156d3565b5416915050803b15610ced57604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff861660448201529088908290606490829084905af18015615404576157ac575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94936156fd565b6157b68891615aad565b61070b573861577e565b91999094909392916004146157ff575b50505050849550907fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f916153d9565b91935091615823819960028352601b8a526140d96040842091604085205490615ef3565b939061ffff9485915490871b1c168252600e895285806040842054169586946000146158f7575416803b156110cf57604051632142170760e11b81526001600160a01b03928316600482015293909116602484015261ffff871660448401528290606490829084905af18015615404576158e3575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94935b8616815260178852206001600160a01b0319815416905590913880806157d0565b6158ed8891615aad565b61070b5738615898565b541692505050803b15610ced57604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff861660448201529088908290606490829084905af18015615404579187986040927fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f96959461597a575b50906158c2565b61598390615aad565b38615973565b503461037a57604036600319011261037a576159a3615a42565b602435908115158092036110cf576001600160a01b03906159c2615b81565b1682526007602052604082209060ff8019835416911617905580f35b9050346105445760203660031901126105445760ff604060209361ffff615a03615a11565b168152600685522054168152f35b6004359061ffff821682036109f457565b6024359061ffff821682036109f457565b359061ffff821682036109f457565b600435906001600160a01b03821682036109f457565b602435906001600160a01b03821682036109f457565b6004359081151582036109f457565b6044359060ff821682036109f457565b6024359060ff821682036109f457565b6064359060ff821682036109f457565b67ffffffffffffffff8111615ac157604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117615ac157604052565b6020908160408183019282815285518094520193019160005b828110615b20575050505090565b835161ffff1685529381019392810192600101615b12565b9181601f840112156109f45782359167ffffffffffffffff83116109f4576020808501948460051b0101116109f457565b67ffffffffffffffff8111615ac15760051b60200190565b6001600160a01b03600054163303615b9557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b15615be057565b606460405162461bcd60e51b815260206004820152601a60248201527f6f6e6c792067616d6520636f6e747261637420616c6c6f7765640000000000006044820152fd5b91908201809211615c3157565b634e487b7160e01b600052601160045260246000fd5b9190811015615c575760051b0190565b634e487b7160e01b600052603260045260246000fd5b3560ff811681036109f45790565b3561ffff811681036109f45790565b60ff1660ff8114615c315760010190565b90615ca582615b69565b615cb26040519182615ad7565b8281528092615cc3601f1991615b69565b0190602036910137565b6000198114615c315760010190565b9190918054831015615c5757600052601e60206000208360041c019260011b1690565b8051821015615c575760209160051b010190565b9081549168010000000000000000831015615ac1578261068e916001615d3b95018155615cdc565b565b15615d4457565b606460405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e657200000000000000000000000000000000000000000000006044820152fd5b80548015615db0576000190190615d9f8282615cdc565b61ffff82549160031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b8015615c31576000190190565b61ffff809116908114615c315760010190565b61ffff168015615c31576000190190565b9291906001600160a01b031690600090828252601c60209080825260409460ff86862094169384865283528585205485985b818a10615e3d575b50505050505050509050565b8287528385528787208688528552615e578a898920615cdc565b9290549161ffff938460039481841692861b1c1614600014615ee457508388528486528888208789528652888820600019820191821161507f5792615ed69a9b92615ea861068e93615ec596615cdc565b9054911b1c1691848952858752898920888a528752898920615cdc565b845281528383209183525220615d88565b803880808080808080615e31565b9a909250600191500198615e29565b8115615efd570690565b634e487b7160e01b600052601260045260246000fd5b90916040602092828482018583525201929160005b828110615f36575050505090565b90919293828060019261ffff615f4b89615a33565b16815201950193929101615f28565b91909161ffff80809416911601918211615c315756fea264697066735822122090ad14d3cbe7c32d98e42e3f2db2e72bb27c64d6683e6f7c052a499fb95ef10764736f6c6343000811003300000000000000000000000041473032b82a4205ddde155cc7ed210b000b014d

Deployed Bytecode

0x608080604052600436101561001357600080fd5b600090813560e01c90816302e70ab8146159de57508063030f8a09146159895780630adc84b01461528457806314b7f4c51461525e578063150b7a021461519e57806316372ab0146151795780632145cee51461513d57806324a811651461510157806327b3c190146150da5780632c8499c514613a755780632e02e658146150b35780632e19e73f14614eb4578063333dab5614614e0657806337d4fc8414614ddf57806339db714f14614dbc578063410e2b2914614d81578063438531f614614d55578063466bed6914614d2e5780634dd306cf14614cf25780634e5a18f91461480d578063516d60bc146147e85780635190357b146146f6578063588604f8146146d45780635e09f8741461469557806361888e8914614659578063624f99321461461d578063645b9fde146145e15780636a5085a9146145a55780636bf6eaff1461457e5780636e03c1761461403557806370a0823114613f75578063715018a614613f1b578063758854a214613d615780637653100814613d2c5780637804eb1f14613cf0578063795d336714613cd257806379cc679014613c3e5780637a6cae4e14613c025780638833241514613be05780638d89af4614613abd5780638da5cb5b14613a9757806391e4d98f14613a7557806391e761ca14612e425780639762942414612e0a5780639b479cfe14612dce5780639c312dc314612db15780639ddcba1d14612c84578063a3509fc814612c48578063a5e8364714612c1c578063a697361214612ac5578063a6cab4cd14612383578063a8ed28b4146122c2578063aac33aad1461229d578063bd48652e1461227f578063bd82fc78146117a4578063be5db8e414611782578063befec7051461165e578063c03f2ca614611622578063c407687614611506578063c6f654a014611481578063d8689691146113d3578063d885ce61146113a7578063d8e08e571461131d578063db1f5196146112fb578063e72f7cd5146112c5578063eb14b3531461127c578063f2fde38b146111a2578063f49d3955146110f8578063f5afe20f146110d3578063f70956c714610fd2578063f754ffa6146109f9578063f80b988c146103b9578063fb10c3d21461037d5763fd95856d1461034f57600080fd5b3461037a578060031936011261037a5761ffff604082600360209452601b8452205416604051908152f35b80fd5b503461037a57602036600319011261037a576001600160a01b03604060209261ffff6103a7615a11565b16815260138452205416604051908152f35b503461037a57608036600319011261037a576103d3615a11565b6103db615a58565b906103e4615a7d565b6064358015908115036109f45733855260ff6020926007845261040c82604089205416615bd9565b169060019182811015806109e9575b156109a5578083036107665750801561070f5761ffff8416808752600984527f10aae1ead4e36e8b41865adb3d322a33942fda91e1cb168046dd1c972ad0cc5a8460408920926001600160a01b03891693846001600160a01b0319825416179055604051908152a25b1561054857506001600160a01b03848160035416803b1561054457604051632142170760e11b81526001600160a01b038716600482015230602482015261ffff861660448201529082908290606490829084905af1801561053957610521575b505061051e9361ffff841686526024835260408620600560ff19825416179055168452601c81526040842090600585525260408320615d13565b80f35b61052a90615aad565b6105355784386104e4565b8480fd5b6040513d84823e3d90fd5b5080fd5b90916001600160a01b036003918682845416803b1561054457604051632142170760e11b81523060048201526001600160a01b038916602482015261ffff841660448201529082908290606490829084905af18015610539576106f7575b505061ffff939193809116938488526024968787526040892060ff198154169055169283600052601c94858752604060002097600598896000528852604060002054916000955b838710610603575b505050505050505050505080f35b87600052888a5260406000208b6000528a528186610625896040600020615cdc565b905490881b1c16036106ee57505085600052868852604060002089600052885260406000209060001983019283116106da57509161066b6106ae95949261068e94615cdc565b9054911b1c16918460005285875260406000208860005287526040600020615cdc565b90919082549060031b9161ffff9283811b93849216901b16911916179055565b6000528152604060002091600052526106ca6040600020615d88565b38808080808080808080806105f5565b634e487b7160e01b60005260116004526000fd5b958601956105ed565b61070090615aad565b61070b5786386105a6565b8680fd5b61ffff841680875260098452604087206001600160a01b031981541690556040519081527f65d7389b4b92a26ff3bda27f72e7035cfd365bdbeb67007bcdb592126acefd2c846001600160a01b03881692a2610484565b60028103610827575080156107d05761ffff8416808752600f84527f46462c42057db0f7a9f7c9f2b722d215f11ca2a0f5d38132b877843437a3b3c78460408920926001600160a01b03891693846001600160a01b0319825416179055604051908152a25b610484565b61ffff8416808752600f8452604087206001600160a01b031981541690556040519081527f1a91fc99f7ba6670afa9040ced9846e2e4ae5773fbd2d747eda6c2f5d8633c31846001600160a01b03881692a2610484565b600381036108e7575080156108905761ffff8416808752601384527fff9aa68430939f0c14075554dd842fa38c14c98977ca2a8a8759d2d9b7e2e8f78460408920926001600160a01b03891693846001600160a01b0319825416179055604051908152a2610484565b61ffff841680875260138452604087206001600160a01b031981541690556040519081527f9a55333272105310d1eac580297eb36abed153aeff87b7e87a264f62aac44850846001600160a01b03881692a2610484565b6004036107cb57801561094e5761ffff8416808752601784527fdd39053acc4ab51c644b0c68af41f73ce1fb879c3dd04e461fc66cd17affce778460408920926001600160a01b03891693846001600160a01b0319825416179055604051908152a2610484565b61ffff841680875260178452604087206001600160a01b031981541690556040519081527f0e86cc5d4242083c8e47d8d91f8b65ad3b640a0888c9c25da628544950cdef53846001600160a01b03881692a2610484565b6064846040519062461bcd60e51b82526004820152600f60248201527f496e76616c69642067616d6520696400000000000000000000000000000000006044820152fd5b50600481111561041b565b600080fd5b503461037a57606036600319011261037a57610a13615a11565b610a1b615a58565b90610a24615a7d565b3384526020906007825260ff8091610a4182604089205416615bd9565b16600181149485600014610cf1576001600160a01b0390878260035416803b1561054457604051632142170760e11b81526001600160a01b038416600482015230602482015261ffff891660448201529082908290606490829084905af1801561053957610cd9575b50506001600160a01b03917f3b08482ce1d83b0dee10c90274f7810c243fbed81e317303e9d4122e4c5fde248661ffff808a1690818d52600b835260408d2094861694856001600160a01b031982541617905560085490610b0c818316615dd3565b169061ffff191617600855604051908152a25b610b2a601f54615ccd565b601f551694858752601c845260408720826000528452610b4e856040600020615d13565b15610bac575061ffff7f6e4545ce7f7c3065c966e407a27add18a2d3340269a5dad3ddcd827a71996fe29316908186526006835260408620541615610b98575b604051908152a280f35b60408520805460ff19166001179055610b8e565b60028103610c0c575061ffff7f962a0bf2885f7d878689e8c2eb763bb44b7c19948ae428235e045cb084f7656f9316908186526006835260408620541615610bf857604051908152a280f35b60408520805460ff19166004179055610b8e565b60038103610c6c575061ffff7f177e7001afeb32d52fe86555fbf04a17d9d818e7f43c0df56227c119181a468f9316908186526006835260408620541615610c5857604051908152a280f35b60408520805460ff1916600a179055610b8e565b600414610c7b575b5050505080f35b61ffff7fba4cbf5fb6c4f19c4f9babe604b3c642f71e99006a1b9023bd2df354cb457e759316908186526006835260408620541615610cc5575b604051908152a238808080610c74565b60408520805460ff19166007179055610cb5565b610ce290615aad565b610ced578738610aaa565b8780fd5b60028203610de1576001600160a01b0390878260035416803b1561054457604051632142170760e11b81526001600160a01b038416600482015230602482015261ffff891660448201529082908290606490829084905af1801561053957610dcd575b50506001600160a01b03917f12874fc41971beedec32d7f3f5b92907f7baf9c4b390743a7c6f6399946fdf808661ffff808a1690818d52600d835260408d2094861694856001600160a01b0319825416179055600c5490610db6818316615dd3565b169061ffff191617600c55604051908152a2610b1f565b610dd690615aad565b610ced578738610d54565b60038203610ed1576001600160a01b0390878260035416803b1561054457604051632142170760e11b81526001600160a01b038416600482015230602482015261ffff891660448201529082908290606490829084905af1801561053957610ebd575b50506001600160a01b03917fad2ada2b0e0da621bbd929f37cad7f2c23b91c1307a6ef37587abe30b665cffa8661ffff808a1690818d526011835260408d2094861694856001600160a01b031982541617905560105490610ea6818316615dd3565b169061ffff191617601055604051908152a2610b1f565b610ec690615aad565b610ced578738610e44565b60048214610ee8575b6001600160a01b0390610b1f565b6001600160a01b0390878260035416803b1561054457604051632142170760e11b81526001600160a01b038416600482015230602482015261ffff891660448201529082908290606490829084905af1801561053957610fbe575b50506001600160a01b03917f5c25e0d917fafc03501d2c33e030668127f9fb3205f83c3a86f6fbd4d70504df8661ffff808a1690818d526015835260408d2094861694856001600160a01b031982541617905560145490610fa5818316615dd3565b169061ffff191617601455604051908152a29050610eda565b610fc790615aad565b610ced578738610f43565b503461037a57604036600319011261037a5767ffffffffffffffff6004358181116110cf57611005903690600401615b38565b916024359081116110cb5761101e903690600401615b38565b9190611028615b81565b82840361053557845b61ffff9081811690868210156110c75760ff9182611058611053838a89615c47565b615c6d565b161515806110ad575b156110a9576001928461108b61108661107e611053868d8c615c47565b948c8b615c47565b615c7b565b168a52600660205260408a20911660ff198254161790550116611031565b8880fd5b50600c836110bf611053848b8a615c47565b161115611061565b8780f35b8380fd5b8280fd5b503461037a578060031936011261037a57602061ffff60145460101c16604051908152f35b503461037a578060031936011261037a5760018152602090601a825261ffff908160408220541682811161118e579082604061117361115f61114b6111859660028752601a8a5285858820541690615f5a565b60038652601a895284848720541690615f5a565b60048552601a885283838620541690615f5a565b9260058152601a875220541690615f5a565b60405191168152f35b602482634e487b7160e01b81526011600452fd5b503461037a57602036600319011261037a576111bc615a42565b6111c4615b81565b6001600160a01b0380911690811561121257600054826001600160a01b0319821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b503461037a57602036600319011261037a576001600160a01b0361129e615a42565b6112a6615b81565b166001600160a01b031981816003541617600355600154161760015580f35b503461037a57602036600319011261037a5760ff604060209261ffff6112e9615a11565b16815260238452205416604051908152f35b503461037a578060031936011261037a57602061ffff600c5416604051908152f35b503461037a57602080600319360112610544576001600160a01b03611340615a42565b1691828152601e80835260408220549261135984615c9b565b94835b85811061137557604051806113718982615af9565b0390f35b60019082865284845261ffff61138e8260408920615cdc565b90549060031b1c166113a0828a615cff565b520161135c565b503461037a578060031936011261037a5761ffff604082600160209452601b8452205416604051908152f35b503461037a57604036600319011261037a576113ed615a42565b906001600160a01b036113fe615a8d565b921691828252601d9160209083825260ff604082209316928360005282526040600020549361142c85615c9b565b95825b86811061144457604051806113718a82615af9565b6001908285528386526040852087600052865261ffff611468826040600020615cdc565b90549060031b1c1661147a828b615cff565b520161142f565b503461037a57604036600319011261037a5761149b615a42565b7fd77603b1586d29d109a38f629a93cb445a0fe05dbda55a782d5d43e53df04d7960406001600160a01b036114ce615a8d565b9333865260076020526114e660ff8488205416615bd9565b60ff83519516855269ffffffffffffffffffff421660208601521692a280f35b503461037a57604036600319011261037a57611520615a42565b60243590338352600760205261153c60ff604085205416615bd9565b6001600160a01b0390838260025416803b15610544576040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602481018690529082908290604490829084905af180156105395761160e575b50507ff15ef988e0cab7863e51b16028ffd8ac865deaa333c9a9596b702ee6692e10819160609116928385526022602052604085206115e7828254615c24565b90556115f581602554615c24565b602555604051908152436020820152426040820152a280f35b61161790615aad565b6110cb5783386115a7565b503461037a57602036600319011261037a576001600160a01b03604060209261ffff61164c615a11565b16815260178452205416604051908152f35b503461037a576020908160031936011261037a5761167a615a42565b9181906001600160a01b0360019416915b60ff8516600581116116c8576116c2916116bc91858752601c85526040872090600052845260406000205490615c24565b94615c8a565b9361168b565b50916116d48493615c9b565b839060015b60ff81166005811161177457848752601c808752604088208260005287526040600020549188915b83831061171a575050505061171590615c8a565b6116d9565b919561176261176891898c9b969a94979b5284865260408c2087600052865261ffff61174a8a6040600020615cdc565b90549060031b1c1661175c828a615cff565b52615ccd565b96615ccd565b91979390969297611701565b604051806113718582615af9565b503461037a578060031936011261037a57602061ffff60085416604051908152f35b503461037a57608036600319011261037a576117be615a42565b67ffffffffffffffff906024358281116110cb57366023820112156110cb578060040135906117ec82615b69565b916117fa6040519384615ad7565b8083526024602084019160051b8301019136831161070b57602401905b828210612267575050506044359283116110cb57366023840112156110cb57826004013561184481615b69565b936118526040519586615ad7565b8185526024602086019260051b8201019036821161070b579060248794939201915b81831061224457505050611886615a9d565b338352600760205261189e60ff604085205416615bd9565b60ff16825b825181101561223057600160ff6118ba8389615cff565b511603611aa55761ffff806118cf8386615cff565b51168552600b602052604085206001600160a01b0387166001600160a01b03198254161790556008805482611905818316615dd3565b169061ffff19161790556119198285615cff565b51166040519081527f3b08482ce1d83b0dee10c90274f7810c243fbed81e317303e9d4122e4c5fde2460206001600160a01b03881692a25b61ffff61195e8285615cff565b5116845260246020526040842060ff1990838282541617905561ffff6119848386615cff565b5116855260068060205260ff60408720541615611a70575b50506001600160a01b0385168452601c60205260408420826000526020526119d7604060002061ffff6119cf8487615cff565b511690615d13565b6001600160a01b036003541661ffff6119f08386615cff565b511690803b15611a6c57604051632142170760e11b81526001600160a01b038816600482015230602482015261ffff92909216604483015285908290606490829084905af1908115611a61578591611a4d575b50506001016118a3565b611a5690615aad565b6110cb578338611a43565b6040513d87823e3d90fd5b8580fd5b60ff611a7c848a615cff565b51169061ffff611a8c8588615cff565b511687526020526040862091825416179055388061199c565b60028060ff611ab4848a615cff565b511603611b5c575061ffff80611aca8386615cff565b51168552600a602052604085206001600160a01b0387166001600160a01b03198254161790556008805463ffff00006010611b088584831c16615dd3565b901b169063ffff00001916179055611b208285615cff565b51166040519081527f4e0d1b237501159b8d5c2a1777b73a3090fd95d5a0de2806ddd8ca535e447f9360206001600160a01b03881692a2611951565b60038060ff611b6b858b615cff565b511603611c0957505061ffff80611b828386615cff565b511685526009602052604085206001600160a01b0387166001600160a01b031982541617905560018552601b602052611bc360408620826119cf8588615cff565b611bcd8285615cff565b51166040519081527f77268c18aa294555f638ca631483843e5e99f579965e7ab82ad8dc9c92622d0b60206001600160a01b03881692a2611951565b600460ff611c17858b615cff565b511603611cb457505061ffff80611c2e8386615cff565b51168552600d602052604085206001600160a01b0387166001600160a01b0319825416179055600c805482611c64818316615dd3565b169061ffff1916179055611c788285615cff565b51166040519081527f12874fc41971beedec32d7f3f5b92907f7baf9c4b390743a7c6f6399946fdf8060206001600160a01b03881692a2611951565b600560ff611cc2858b615cff565b511603611d5e575061ffff9081611cd98487615cff565b51168652600e602052604086206001600160a01b0388166001600160a01b03198254161790558552601b602052611d1860408620826119cf8588615cff565b611d228285615cff565b51166040519081527f43cf9d3931bdfd22950a871bb4f31d7c0ab0f71c1a3a0236ce2f883ead41ee7a60206001600160a01b03881692a2611951565b9050600660ff611d6e848a615cff565b511603611e16575061ffff80611d848386615cff565b51168552600f602052604085206001600160a01b0387166001600160a01b0319825416179055600c805463ffff00006010611dc28584831c16615dd3565b901b169063ffff00001916179055611dda8285615cff565b51166040519081527fa8477a27ecdfcfd7615fbe783fe10961e52aba38d67c0f8224df7e918bb3370f60206001600160a01b03881692a2611951565b600760ff611e24848a615cff565b511603611ec0575061ffff80611e3a8386615cff565b511685526015602052604085206001600160a01b0387166001600160a01b03198254161790556014805482611e70818316615dd3565b169061ffff1916179055611e848285615cff565b51166040519081527f5c25e0d917fafc03501d2c33e030668127f9fb3205f83c3a86f6fbd4d70504df60206001600160a01b03881692a2611951565b600860ff611ece848a615cff565b511603611f76575061ffff80611ee48386615cff565b511685526016602052604085206001600160a01b0387166001600160a01b03198254161790556014805463ffff00006010611f228584831c16615dd3565b901b169063ffff00001916179055611f3a8285615cff565b51166040519081527fa105eb1c1aeb2a96bd4e193c3a9b3bf73f2a8a1181b1b7e6dacda6c6a9a3554960206001600160a01b03881692a2611951565b600960ff611f84848a615cff565b511603612021575061ffff80611f9a8386615cff565b511685526017602052604085206001600160a01b0387166001600160a01b031982541617905560048552601b602052611fdb60408620826119cf8588615cff565b611fe58285615cff565b51166040519081527fb582b14f2ac3955bf383ef03f14b6d49c4740aaf044a02486db8aa68b728595e60206001600160a01b03881692a2611951565b600a60ff61202f848a615cff565b5116036120cb575061ffff806120458386615cff565b511685526011602052604085206001600160a01b0387166001600160a01b0319825416179055601080548261207b818316615dd3565b169061ffff191617905561208f8285615cff565b51166040519081527fad2ada2b0e0da621bbd929f37cad7f2c23b91c1307a6ef37587abe30b665cffa60206001600160a01b03881692a2611951565b600b60ff6120d9848a615cff565b51160361217f575061ffff806120ef8386615cff565b511685526012602052604085206001600160a01b0387166001600160a01b03198254161790556010805463ffff000061212b8483851c16615dd3565b831b169063ffff000019161790556121438285615cff565b51166040519081527fdf31d7124bfd2f8787d236d3e4d5545a7b4de7ed54a53733bcec0a941883d00e60206001600160a01b03881692a2611951565b600c60ff61218d848a615cff565b51161461219b575b50611951565b61ffff90816121aa8487615cff565b511686526013602052604086206001600160a01b0388166001600160a01b03198254161790558552601b6020526121e960408620826119cf8588615cff565b6121f38285615cff565b51166040519081527fabc0672b455df3350544c04ba51f9896a8c558f26a9c99ac08f286aae725459960206001600160a01b03881692a238612195565b8361223e8451601f54615c24565b601f5580f35b9091809394503560ff811681036109f45781528693926020908101929101611874565b6020809161227484615a33565b815201910190611817565b503461037a578060031936011261037a576020602554604051908152f35b503461037a578060031936011261037a57602061ffff60105460101c16604051908152f35b503461037a57604036600319011261037a57806122dd615a11565b6122e5615a58565b60ff60265460081c1680612370575b1561236c576001600160a01b036003541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff1660448201529082908290818381606481015b03925af18015610539576123575750f35b61236090615aad565b61037a5780f35b505050fd5b5050fd5b506001600160a01b0383541633146122f4565b503461037a57606036600319011261037a5760043567ffffffffffffffff8111610544576123b5903690600401615b38565b906123be615a58565b916123c7615a7d565b33855260076020526123df60ff604087205416615bd9565b845b61ffff8316811015612978578560ff83166001036125dd5750856001600160a01b0360035416612415611086848789615c47565b90803b156110cf57604051632142170760e11b81526001600160a01b038916600482015230602482015261ffff92909216604483015282908290606490829084905af18015610539576125c9575b50508061ffff6124796110866001948789615c47565b168752600b602052604087206001600160a01b0387166001600160a01b03198254161790556008805461ffff6124b0818316615dd3565b169061ffff1916179055816124c9611086838789615c47565b61ffff604051911681527f3b08482ce1d83b0dee10c90274f7810c243fbed81e317303e9d4122e4c5fde2460206001600160a01b038a1692a25b61ffff61251461108684888a615c47565b16885260246020526040882060ff199060ff86168282541617905561ffff61254061108685898b615c47565b16895260068060205260ff60408b2054161561259b575b5050506001600160a01b0386168752601c6020526040872060ff8416600052602052612595604060002061258f61108684888a615c47565b90615d13565b016123e1565b61ffff6125ac611086868a8c615c47565b168a5260205260ff60408a20921690825416179055388080612557565b6125d290615aad565b611a6c578538612463565b60ff831660020361270b5750856001600160a01b0360035416612604611086848789615c47565b90803b156110cf57604051632142170760e11b81526001600160a01b038916600482015230602482015261ffff92909216604483015282908290606490829084905af18015610539576126f7575b50508061ffff6126686110866001948789615c47565b168752600d602052604087206001600160a01b0387166001600160a01b0319825416179055600c805461ffff61269f818316615dd3565b169061ffff191617905560046126b9611086838789615c47565b61ffff604051911681527f12874fc41971beedec32d7f3f5b92907f7baf9c4b390743a7c6f6399946fdf8060206001600160a01b038a1692a2612503565b61270090615aad565b611a6c578538612652565b86600360ff8516810361283a576001600160a01b039192505416612733611086848789615c47565b90803b156110cf57604051632142170760e11b81526001600160a01b038916600482015230602482015261ffff92909216604483015282908290606490829084905af1801561053957612826575b50508061ffff6127976110866001948789615c47565b1687526011602052604087206001600160a01b0387166001600160a01b03198254161790556010805461ffff6127ce818316615dd3565b169061ffff1916179055600a6127e8611086838789615c47565b61ffff604051911681527fad2ada2b0e0da621bbd929f37cad7f2c23b91c1307a6ef37587abe30b665cffa60206001600160a01b038a1692a2612503565b61282f90615aad565b611a6c578538612781565b600460ff861614612851575b505090600191612503565b6001600160a01b03919250541661286c611086848789615c47565b90803b156110cf57604051632142170760e11b81526001600160a01b038916600482015230602482015261ffff92909216604483015282908290606490829084905af1801561053957612964575b50508061ffff6128d06110866001948789615c47565b1687526015602052604087206001600160a01b0387166001600160a01b03198254161790556014805461ffff612907818316615dd3565b169061ffff19161790556007612921611086838789615c47565b61ffff604051911681527f5c25e0d917fafc03501d2c33e030668127f9fb3205f83c3a86f6fbd4d70504df60206001600160a01b038a1692a29091508638612846565b61296d90615aad565b611a6c5785386128ba565b5092919261298c61ffff8316601f54615c24565b601f5560ff81166001036129dd57507fa8da7b1e0d970b1eafd389eff60f1af7bc99d29f12e6251e77bc1ad40fa79786916129d76001600160a01b0392604051938493169583615f13565b0390a280f35b60ff8116600203612a2557507f060119b04c405bda169a7f1d2fed0a8d391cb7ce23c2bd031185475978e6a7a2916129d76001600160a01b0392604051938493169583615f13565b60ff8116600303612a6d57507f655f67d36ab8e6c4bdda185fc5bf82b880bac26ec421c4fc741ff0e57fc36232916129d76001600160a01b0392604051938493169583615f13565b60ff16600414612a7e575b50505080f35b7f062c99098d2ce454eea75921396a62949c49c49d493384ca7644d329101b57b191612aba6001600160a01b0392604051938493169583615f13565b0390a2388080612a78565b503461037a57604036600319011261037a5780612ae0615a11565b612ae8615a58565b60265460ff8160081c1680612c09575b15612b5e57506001600160a01b036005541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff1660448201529082908290818381606481015b03925af180156105395761235757505080f35b60ff1680612be7575b612b715750505080f35b6001600160a01b036005541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff1660448201529082908290818381606481015b03925af1801561053957612bd3575b80612a78565b612bdc90615aad565b61037a578038612bcd565b5061ffff8216835260196020526001600160a01b036040842054163314612b67565b506001600160a01b038454163314612af8565b503461037a578060031936011261037a5761ffff604082600260209452601b8452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff612c72615a11565b16815260118452205416604051908152f35b503461037a57604036600319011261037a57612c9e615a42565b612ca6615a22565b3383526007602052612cbe60ff604085205416615bd9565b6001600160a01b0390838260055416803b1561054457604051632142170760e11b81526001600160a01b038616600482015230602482015261ffff841660448201529082908290606490829084905af1801561053957612d9d575b50507f8b6eebbdec11343459b3554f4b96ba6b00fb0f1c9803e175df47bbf4f7e0a0bb91602091612d7961ffff91828116938489526019865260408920971696876001600160a01b0319825416179055868852601e855260408820615d13565b60215490612d88818316615dd3565b169061ffff191617602155604051908152a280f35b612da690615aad565b6110cb578338612d19565b503461037a578060031936011261037a5760208054604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff612df8615a11565b16815260098452205416604051908152f35b503461037a57602036600319011261037a5760406020916001600160a01b03612e31615a42565b168152602283522054604051908152f35b503461037a57608036600319011261037a57612e5c615a42565b90612e65615a22565b612e6d615a7d565b92612e76615a9d565b9333845260ff60209160078352612e9282604088205416615bd9565b166001808203612fa15750508394612f42917f353dc3aef968a6a73b5fee216416835a4f8cb955339ecd211d9a9e07bdc76bc561ffff91828716808952600b82526001600160a01b0393612ef18560408c205416958916958614615d3d565b818a52600b83526040808b2080546001600160a01b0319169055602484528a20805460ff1916905560085490612f28818316615de6565b169061ffff191617600855604051908152a25b8284615df7565b612f4d601f54615dc6565b601f556001600160a01b036003541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff166044820152908290829081838160648101612346565b600282810361305b575050508394612f42917f7d4e06c18795f0a46e6788c6fb3d66ffd90ecf8977ec9f1e2baa9051eb42eeb161ffff91828716808952600a82526001600160a01b03936130008560408c205416958916958614615d3d565b818a52600a835260408a206001600160a01b031981541690556024835260408a2060ff19815416905563ffff000061303f600854928360101c16615de6565b60101b169063ffff0000191617600855604051908152a2612f3b565b600393928085036131d357505061ffff9283861691828852600984526001600160a01b03946130958660408b205416968816968714615d3d565b83895260098552604089206001600160a01b0319815416905560249081865260408a2060ff19815416905582600052601b938487526040600020546000935b818510613118575b50505050505050917f65d7389b4b92a26ff3bda27f72e7035cfd365bdbeb67007bcdb592126acefd2c869792612f4294604051908152a2612f3b565b85600052868952858885613130886040600020615cdc565b905490871b1c16036131ca5760005286895260406000209060001983019283116106da57509361068e7f65d7389b4b92a26ff3bda27f72e7035cfd365bdbeb67007bcdb592126acefd2c97948e9f9a97946131936131ab95612f429e9c99615cdc565b9054911b1c1691846000528588526040600020615cdc565b60005282526131bd6040600020615d88565b92948194993880806130dc565b909401936130d4565b929390926004810361328457505050508394612f42917ffc6cbfef07cde2a0f8e48ee78e5bcc2c1e67e3d3d384a6098a6a450742263ebd61ffff91828716808952600d82526001600160a01b03936132368560408c205416958916958614615d3d565b818a52600d83526040808b2080546001600160a01b0319169055602484528a20805460ff19169055600c549061326d818316615de6565b169061ffff191617600c55604051908152a2612f3b565b929392600581036133e7575061ffff9384871692838952600e85526001600160a01b03956132bd8760408c205416978916978814615d3d565b848a52600e865260408a206001600160a01b0319815416905560249384875260408b2060ff19815416905583600052601b94858852604060002054906000945b828610613342575b5050505050505050917fb1c64268b67eef6584cea022efe1cfe7314634f05b6f9bb974257bdc0383243f869792612f4294604051908152a2612f3b565b86600052878a528885613359886040600020615cdc565b905490871b1c16036133de57508560005286895260406000209060001983019283116106da57509361068e7fb1c64268b67eef6584cea022efe1cfe7314634f05b6f9bb974257bdc0383243f97948e9f9a97946131936133be95612f429e9c99615cdc565b60005282526133d06040600020615d88565b929481949938808080613305565b809501946132fd565b90979350600681036134a557505084955090612f42917f1a91fc99f7ba6670afa9040ced9846e2e4ae5773fbd2d747eda6c2f5d8633c3161ffff91828716808952600f82526001600160a01b039361344a8560408c205416958916958614615d3d565b818a52600f835260408a206001600160a01b031981541690556024835260408a2060ff19815416905563ffff0000613489600c54928360101c16615de6565b60101b169063ffff0000191617600c55604051908152a2612f3b565b6007810361355257505084955090612f42917f83622d58cf015c18e226a0d9d17619745b99d952a5740e4a60cd8942360c2c6b61ffff91828716808952601582526001600160a01b03936135048560408c205416958916958614615d3d565b818a52601583526040808b2080546001600160a01b0319169055602484528a20805460ff191690556014549061353b818316615de6565b169061ffff191617601455604051908152a2612f3b565b6008810361360c57505084955090612f42917f3fa3aa79eea014342138abcf13a240683fb1a7ec35fdcfc4d3cc0bd7b8c1303061ffff91828716808952601682526001600160a01b03936135b18560408c205416958916958614615d3d565b818a526016835260408a206001600160a01b031981541690556024835260408a2060ff19815416905563ffff00006135f0601454928360101c16615de6565b60101b169063ffff0000191617601455604051908152a2612f3b565b60098103613787575061ffff9687861691828852601784526001600160a01b03986136428a60408b2054169a88169a8b14615d3d565b83895260178552604089206001600160a01b0319815416905560249283865260408a2060ff1981541690556004600052601b93848752604060002054906000945b8286106136c7575b50505050505050957f0e86cc5d4242083c8e47d8d91f8b65ad3b640a0888c9c25da628544950cdef53612f4293928798604051908152a2612f3b565b600460005286895287856136df886040600020615cdc565b905490871b1c160361377e5750600460005285885260406000209060001983019283116106da57509361068e8c9d97947f0e86cc5d4242083c8e47d8d91f8b65ad3b640a0888c9c25da628544950cdef53979461374461375d95612f429d9c99615cdc565b9054911b1c169160046000528487526040600020615cdc565b600460005282526137716040600020615d88565b929881949538808061368b565b80950194613683565b909690600a810361383757505084955090612f42917f3b09adbdbbf3a9a7099a6851c3126ee181d4645531ed78837f2a0c105156231461ffff91828716808952601182526001600160a01b03936137e98560408c205416958916958614615d3d565b818a52601183526040808b2080546001600160a01b0319169055602484528a20805460ff1916905560105490613820818316615de6565b169061ffff191617601055604051908152a2612f3b565b600b81036138f157505084955090612f42917fc7566e16b1dfb6ea96eca0b07ecc81ac60913a7e91a31829e986b65acf3948ca61ffff91828716808952601282526001600160a01b03936138968560408c205416958916958614615d3d565b818a526012835260408a206001600160a01b031981541690556024835260408a2060ff19815416905563ffff00006138d5601054928360101c16615de6565b60101b169063ffff0000191617601055604051908152a2612f3b565b600c14613907575b5050839450612f4290612f3b565b61ffff80861691828852601384526001600160a01b03986139338a60408b2054169a88169a8b14615d3d565b83895260138552604089206001600160a01b0319815416905560249283865260408a2060ff19815416905582600052601b93848752604060002054906000935b8285106139b9575b50505050505050957f9a55333272105310d1eac580297eb36abed153aeff87b7e87a264f62aac44850612f4293928798604051908152a290386138f9565b8560005286895287846139d0876040600020615cdc565b905490891b1c1603613a6c57508460005285885260406000209060001983019283116106da57508b9c969361068e7f9a55333272105310d1eac580297eb36abed153aeff87b7e87a264f62aac448509794613a34612f429c9b9895613a4d95615cdc565b905490861b1c1691846000528588526040600020615cdc565b6000528252613a5f6040600020615d88565b929881949538808061397b565b80940193613973565b503461037a578060031936011261037a57602061ffff60215416604051908152f35b503461037a578060031936011261037a576001600160a01b036020915416604051908152f35b503461037a57604036600319011261037a5780613ad8615a11565b613ae0615a58565b60265460ff8160081c1680613bcd575b15613b4757506001600160a01b036004541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff166044820152908290829081838160648101612b4b565b60ff1680613bab575b613b5a5750505080f35b6001600160a01b036004541691823b1561236757604051632142170760e11b81523060048201526001600160a01b03909216602483015261ffff166044820152908290829081838160648101612bbe565b5061ffff8216835260186020526001600160a01b036040842054163314613b50565b506001600160a01b038454163314613af0565b503461037a578060031936011261037a57602061ffff60105416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff613c2c615a11565b16815260128452205416604051908152f35b503461037a57604036600319011261037a5780613c59615a42565b3382526007602052613c7160ff604084205416615bd9565b6001600160a01b0360025416803b1561236c576040517f79cc67900000000000000000000000000000000000000000000000000000000081526001600160a01b03909216600483015260248035908301528290829081838160448101612346565b503461037a578060031936011261037a576020601f54604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff613d1a615a11565b168152600a8452205416604051908152f35b503461037a57602036600319011261037a57613d46615a6e565b613d4e615b81565b60ff801960265416911515161760265580f35b503461037a57606036600319011261037a57613d7b615a42565b613d83615a22565b613d8b615a7d565b33845260ff60209160078352613da682604088205416615bd9565b16600181101580613f10575b15613ecc576001600160a01b0390858260045416803b1561054457604051632142170760e11b81526001600160a01b038816600482015230602482015261ffff871660448201529082908290606490829084905af1801561053957613eb8575b505083613ea29161ffff7ff21b092d2b78057537987c15cf87ef20f0d705bd1bcccc46a317d554e10c78c99616938489526018865260408920971696876001600160a01b0319825416179055808852601a8552613e728260408a20615d13565b83885260238552604088208160ff19825416179055868852601d8552604088209060005284526040600020615d13565b613eac8254615ccd565b8255604051908152a280f35b613ec190615aad565b611a6c578538613e12565b6064826040519062461bcd60e51b82526004820152600a60248201527f696e76616c6964206964000000000000000000000000000000000000000000006044820152fd5b506005811115613db2565b503461037a578060031936011261037a57613f34615b81565b60006001600160a01b0381546001600160a01b031981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461037a576020806003193601126105445790613f91615a42565b6001600160a01b031691600190825b60ff831660058111613fdd57613fd791613fd191878752601c85526040872090600052845260406000205490615c24565b92615c8a565b91613fa0565b600186838588805b60ff8616600581116140225761401c9161401691878552601d86526040852090600052855260406000205490615c24565b95615c8a565b94613fe5565b8361402d8684615c24565b604051908152f35b503461037a5760a036600319011261037a5761404f615a11565b614057615a7d565b61405f615a9d565b916084356001600160a01b0394858216938483036109f4573382526020956007875260ff61409281604086205416615bd9565b839063ffffffff60243516928185166001811460001461427a575016600181036141da57505060018352601a875260408320805461413893926140df92916140d991615ef3565b90615cdc565b949061ffff958691549060031b1c1684526018885288604085205416948087168552600b8952604085206001600160a01b0319815416905560085490614126818316615de6565b169061ffff1916176008555b85615df7565b8560035416803b1561054457604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff851660448201529082908290606490829084905af18015610539576141c6575b505083947fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f911693849261ffff60405191168152a3604051908152f35b6141d08291615aad565b61037a5780614189565b909491906002146141f1575b509061413891614132565b60018452601b88526040842080549295506141389392614215926140d99190615ef3565b949061ffff958691549060031b1c1684526009885288604085205416948087168552600a8952604085206001600160a01b0319815416905563ffff0000614263600854928360101c16615de6565b60101b169063ffff000019161760085590916141e6565b96929594939190600288036143205760049293949596975016146142a357509061413891614132565b60028452601b885260408420805492955061413893926142c7926140d99190615ef3565b949061ffff958691549060031b1c168452600e885288604085205416948087168552600d8952604085206001600160a01b03198154169055600c549061430e818316615de6565b169061ffff191617600c5590916141e6565b600397808903614445575016600a81036143ab5750858452601a895260408420805494955061413894614357926140d99190615ef3565b9561ffff96879254911b1c168452601888528860408520541694808716855260118952604085206001600160a01b031981541690556010549061439b818316615de6565b169061ffff191617601055614132565b600b146143c0575b5061413892939450614132565b858452601b8952604084208054949550614138946143e2926140d99190615ef3565b9561ffff96879254911b1c168452601388528860408520541694808716855260128952604085206001600160a01b0319815416905563ffff000061442d601054928360101c16615de6565b60101b169063ffff00001916176010558493926143b3565b60041461445c575b50505061413892939450614132565b16600781036144e3575060048452601a895260408420805494955061413894614489926140d99190615ef3565b9561ffff96879254911b1c168452601888528860408520541694808716855260158952604085206001600160a01b03198154169055601454906144cd818316615de6565b169061ffff1916176014555b849392388061444d565b6008146144f8575b50614138929394506144d9565b60048452601b89526040842080549495506141389461451b926140d99190615ef3565b9561ffff96879254911b1c168452601788528860408520541694808716855260168952604085206001600160a01b0319815416905563ffff0000614566601454928360101c16615de6565b60101b169063ffff00001916176014558493926144eb565b503461037a578060031936011261037a5760206001600160a01b0360035416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff6145cf615a11565b168152600b8452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff61460b615a11565b16815260168452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff614647615a11565b168152600e8452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff614683615a11565b16815260158452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b036146b7615a42565b6146bf615b81565b166001600160a01b0319600254161760025580f35b503461037a578060031936011261037a57602061ffff60145416604051908152f35b503461037a576020908160031936011261037a57614712615a42565b9181906001600160a01b0360019416915b60ff85166005811161475a57614754916116bc91858752601d85526040872090600052845260406000205490615c24565b93614723565b50916147668493615c9b565b839060015b60ff81166005811161177457848752601d808752604088208260005287526040600020549188915b8383106147ac57505050506147a790615c8a565b61476b565b91956117626147dc91898c9b969a94979b5284865260408c2087600052865261ffff61174a8a6040600020615cdc565b91979390969297614793565b503461037a578060031936011261037a57602061ffff60085460101c16604051908152f35b503461037a57606036600319011261037a57614827615a42565b61482f615a22565b90614838615a7d565b90338452600760205261485160ff604086205416615bd9565b61ffff8316845260186020526001600160a01b03916148798360408720541684841614615d3d565b848360045416803b1561054457604051632142170760e11b81523060048201526001600160a01b038516602482015261ffff871660448201529082908290606490829084905af1801561053957614cde575b505061ffff841685526018602052604085206001600160a01b0319815416905560236020526040852060ff1981541690558282168552601d806020526040862060ff831660005260205260406000205486905b808210614bf2575b50505060ff81168552601a602052604085205480600019810111614bde5785908190600019810160011c5b81841061499c575b82887fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb60208a8a61498a8354615dc6565b835561ffff604051951685521692a280f35b60ff85168352601a60205261ffff6149b78560408620615cdc565b919054818b169260031b1c1614600014614a53575092614a346020959361068e61ffff614a1960ff9660407fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb9c9a8989168352601a8d52600019019120615cdc565b90549060031b1c16918585168c52601a895260408c20615cdc565b168652601a8352614a4760408720615d88565b91819350853880614959565b60ff85168352601a60205261ffff614a75604085206000198786030190615cdc565b905460039190911b1c811690891603614ad6575092614a346020959361068e61ffff614a1960ff9660407fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb9c9a8989168352601a8d52600019019120615cdc565b60ff85168352601a60205261ffff614af46040852086840390615cdc565b905460039190911b1c811690891603614b55575092614a346020959361068e61ffff614a1960ff9660407fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb9c9a8989168352601a8d52600019019120615cdc565b60ff85168352601a60205261ffff614b736040852086840190615cdc565b905460039190911b1c811690891603614bd4575092614a346020959361068e61ffff614a1960ff9660407fe7f8eae92cdda88e12bf251d1c6110e00b3d777ad50500a0f47e685f5e3e38eb9c9a8989168352601a8d52600019019120615cdc565b9260010192614951565b602486634e487b7160e01b81526011600452fd5b8585168852826020526040882060ff8516600052602052614c17826040600020615cdc565b905460039291831b1c61ffff90811690891603614cd2578686168952836020526040892060ff861660005260205260406000206000198201918211614cbe57614c939392614c6b61068e9361ffff93615cdc565b9054911b1c16918787168a528460205260408a2060ff87166000526020526040600020615cdc565b83831686526020526040852060ff8216600052602052614cb66040600020615d88565b388080614926565b60248a634e487b7160e01b81526011600452fd5b9160019150019061491e565b614ce790615aad565b6105355784386148cb565b503461037a57602036600319011261037a57614d0c615a6e565b614d14615b81565b61ff0060265491151560081b169061ff0019161760265580f35b503461037a578060031936011261037a5760206001600160a01b0360015416604051908152f35b503461037a578060031936011261037a5761ffff604082600460209452601b8452205416604051908152f35b503461037a57602036600319011261037a576004359060ff82168092036109f45760408160209361ffff9352601a8452205416604051908152f35b503461037a578060031936011261037a57602060ff602654166040519015158152f35b503461037a578060031936011261037a5760206001600160a01b0360045416604051908152f35b503461037a57604036600319011261037a57614e20615a42565b906001600160a01b03614e31615a8d565b921691828252601c9160209083825260ff6040822093169283600052825260406000205493614e5f85615c9b565b95825b868110614e7757604051806113718a82615af9565b6001908285528386526040852087600052865261ffff614e9b826040600020615cdc565b90549060031b1c16614ead828b615cff565b5201614e62565b503461037a57604036600319011261037a57614ece615a42565b90614ed7615a22565b91338252602060078152614ef160ff604085205416615bd9565b61ffff9384811690818552601983526001600160a01b03938460408720541694614f1f818316968714615d3d565b6005541690813b1561070b57604051632142170760e11b81523060048201526001600160a01b03909116602482015261ffff9092166044830152859082908183816064810103925af18015611a615790859161509f575b5081905260198252604084206001600160a01b03198154169055828452601e9485835260408520549585965b808810614fde575b50506021547f99175dc3ea3b7c111b073fe0a90ef647baf911324dd47b428e8fb6f2f22bfe80939291612d88828216615de6565b829086885282865284614ff48a60408b20615cdc565b905460039491851b1c16036150935786885282865260408820600019820191821161507f57846150659361504f7f99175dc3ea3b7c111b073fe0a90ef647baf911324dd47b428e8fb6f2f22bfe809a9b9c9461068e94615cdc565b9054911b1c1691898b5284885260408b20615cdc565b858752835261507660408720615d88565b85949338614faa565b602489634e487b7160e01b81526011600452fd5b97600191500196614fa2565b6150a890615aad565b6110cb578338614f76565b503461037a578060031936011261037a5760206001600160a01b0360025416604051908152f35b503461037a578060031936011261037a5760206001600160a01b0360055416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff61512b615a11565b168152600f8452205416604051908152f35b503461037a57602036600319011261037a576001600160a01b03604060209261ffff615167615a11565b168152600d8452205416604051908152f35b503461037a578060031936011261037a57602061ffff600c5460101c16604051908152f35b503461037a57608036600319011261037a576151b8615a42565b506151c1615a58565b5060643567ffffffffffffffff8082116110cf57366023830112156110cf57816004013590811161524a57604051615203601f8301601f191660200182615ad7565b81815236602483850101116110cb57816024602094018483013701015260206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b602483634e487b7160e01b81526041600452fd5b503461037a578060031936011261037a57602060ff60265460081c166040519015158152f35b503461037a5760a036600319011261037a5761529e615a11565b6152a6615a7d565b606435916001600160a01b0380841692838503611a6c576084359081159182150361070b57338752602095600787526152e560ff60408a205416615bd9565b60ff9091169060243563ffffffff1688600184036154a3575061531f91925060028952601b88526140d960408a209160408b205490615ef3565b919061ffff928391549060031b1c168852600e8752836040892054169260001461540f5787846003541691823b1561054457604051632142170760e11b81526001600160a01b039182166004820152908516602482015261ffff87166044820152918290606490829084905af18015615404576153f0575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94935b8616815260098852206001600160a01b031981541690555b1693849261ffff60405191168152a3604051908152f35b6153fa8891615aad565b61070b5738615397565b6040513d8a823e3d90fd5b508260035416803b15610ced57604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff861660448201529088908290606490829084905af180156154045761548f575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94936153c1565b6154998891615aad565b61070b5738615461565b6002840361563357506154cd91925060028952601b88526140d960408a209160408b205490615ef3565b919061ffff928391549060031b1c168852600e8752836040892054169260001461559f5787846003541691823b1561054457604051632142170760e11b81526001600160a01b039182166004820152908516602482015261ffff87166044820152918290606490829084905af180156154045761558b575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94935b86168152600f8852206001600160a01b031981541690556153d9565b6155958891615aad565b61070b5738615545565b508260035416803b15610ced57604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff861660448201529088908290606490829084905af180156154045761561f575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f949361556f565b6156298891615aad565b61070b57386155f1565b6003938085036157c0575050846156608a9260028452601b8b526140d96040852091604086205490615ef3565b949061ffff9586915490831b1c168352600e8a52816040842054169560001461572d57541691823b1561054457604051632142170760e11b81526001600160a01b039182166004820152908516602482015261ffff87166044820152918290606490829084905af1801561540457615719575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94935b8616815260138852206001600160a01b031981541690556153d9565b6157238891615aad565b61070b57386156d3565b5416915050803b15610ced57604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff861660448201529088908290606490829084905af18015615404576157ac575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94936156fd565b6157b68891615aad565b61070b573861577e565b91999094909392916004146157ff575b50505050849550907fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f916153d9565b91935091615823819960028352601b8a526140d96040842091604085205490615ef3565b939061ffff9485915490871b1c168252600e895285806040842054169586946000146158f7575416803b156110cf57604051632142170760e11b81526001600160a01b03928316600482015293909116602484015261ffff871660448401528290606490829084905af18015615404576158e3575b5090604086977fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f94935b8616815260178852206001600160a01b0319815416905590913880806157d0565b6158ed8891615aad565b61070b5738615898565b541692505050803b15610ced57604051632142170760e11b81523060048201526001600160a01b038416602482015261ffff861660448201529088908290606490829084905af18015615404579187986040927fd94293c5b4390a09be50f17655e06e594ae18d15ccd204fd98851ab26d273f9f96959461597a575b50906158c2565b61598390615aad565b38615973565b503461037a57604036600319011261037a576159a3615a42565b602435908115158092036110cf576001600160a01b03906159c2615b81565b1682526007602052604082209060ff8019835416911617905580f35b9050346105445760203660031901126105445760ff604060209361ffff615a03615a11565b168152600685522054168152f35b6004359061ffff821682036109f457565b6024359061ffff821682036109f457565b359061ffff821682036109f457565b600435906001600160a01b03821682036109f457565b602435906001600160a01b03821682036109f457565b6004359081151582036109f457565b6044359060ff821682036109f457565b6024359060ff821682036109f457565b6064359060ff821682036109f457565b67ffffffffffffffff8111615ac157604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117615ac157604052565b6020908160408183019282815285518094520193019160005b828110615b20575050505090565b835161ffff1685529381019392810192600101615b12565b9181601f840112156109f45782359167ffffffffffffffff83116109f4576020808501948460051b0101116109f457565b67ffffffffffffffff8111615ac15760051b60200190565b6001600160a01b03600054163303615b9557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b15615be057565b606460405162461bcd60e51b815260206004820152601a60248201527f6f6e6c792067616d6520636f6e747261637420616c6c6f7765640000000000006044820152fd5b91908201809211615c3157565b634e487b7160e01b600052601160045260246000fd5b9190811015615c575760051b0190565b634e487b7160e01b600052603260045260246000fd5b3560ff811681036109f45790565b3561ffff811681036109f45790565b60ff1660ff8114615c315760010190565b90615ca582615b69565b615cb26040519182615ad7565b8281528092615cc3601f1991615b69565b0190602036910137565b6000198114615c315760010190565b9190918054831015615c5757600052601e60206000208360041c019260011b1690565b8051821015615c575760209160051b010190565b9081549168010000000000000000831015615ac1578261068e916001615d3b95018155615cdc565b565b15615d4457565b606460405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e657200000000000000000000000000000000000000000000006044820152fd5b80548015615db0576000190190615d9f8282615cdc565b61ffff82549160031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b8015615c31576000190190565b61ffff809116908114615c315760010190565b61ffff168015615c31576000190190565b9291906001600160a01b031690600090828252601c60209080825260409460ff86862094169384865283528585205485985b818a10615e3d575b50505050505050509050565b8287528385528787208688528552615e578a898920615cdc565b9290549161ffff938460039481841692861b1c1614600014615ee457508388528486528888208789528652888820600019820191821161507f5792615ed69a9b92615ea861068e93615ec596615cdc565b9054911b1c1691848952858752898920888a528752898920615cdc565b845281528383209183525220615d88565b803880808080808080615e31565b9a909250600191500198615e29565b8115615efd570690565b634e487b7160e01b600052601260045260246000fd5b90916040602092828482018583525201929160005b828110615f36575050505090565b90919293828060019261ffff615f4b89615a33565b16815201950193929101615f28565b91909161ffff80809416911601918211615c315756fea264697066735822122090ad14d3cbe7c32d98e42e3f2db2e72bb27c64d6683e6f7c052a499fb95ef10764736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000041473032b82a4205ddde155cc7ed210b000b014d

-----Decoded View---------------
Arg [0] : _topia (address): 0x41473032b82a4205DDDe155CC7ED210B000b014D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000041473032b82a4205ddde155cc7ed210b000b014d


Deployed Bytecode Sourcemap

404:40381:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3161:30;404:40381;3161:30;;;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39300:9;404:40381;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;38917:16;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;7494:10;404:40381;;;;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;16327:1;;16316:12;;;;;:28;;;404:40381;;;;16378:12;;;16327:1;;-1:-1:-1;16430:24:10;;;;404:40381;;;;;;16509:20;404:40381;;16574:36;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;16574:36;16426:368;18115:24;;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;18190:60;;;;;404:40381;;-1:-1:-1;;;18190:60:10;;-1:-1:-1;;;;;404:40381:10;;;18190:60;;404:40381;18239:4;404:40381;;;;;;;;;;;;;;;;;;;;;;18190:60;;;;;;;;18111:472;404:40381;;18334:44;404:40381;;;;;;;;;;;;;;;;;;;;;;;;18334:15;404:40381;;;;;;;;;;;;;18334:44;:::i;:::-;404:40381;;18190:60;;;;:::i;:::-;404:40381;;18190:60;;;;404:40381;;;;18190:60;404:40381;;;;;;;;;18190:60;404:40381;;;18111:472;404:40381;;-1:-1:-1;;;;;404:40381:10;;;;;;;18409:60;;;;;404:40381;;-1:-1:-1;;;18409:60:10;;18442:4;404:40381;18409:60;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;18409:60;;;;;;;;18111:472;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26087:15;404:40381;;;;;;;;;;;;;;;;;;;26151:10;404:40381;26147:411;26163:5;;;;;;26147:411;18111:472;;;;;;;;;;;404:40381;;26151:10;404:40381;;;;;;;;;;;;;;;;26188:46;404:40381;;;;26188:46;:::i;:::-;404:40381;;;;;;;26188:53;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26310:51;;;26261:100;26310:51;;;26261:46;26310:51;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;;;;;;;;26261:46;:::i;:::-;:100;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;26261:100;404:40381;;;;;;;;;;;26379:47;404:40381;;;26379:47;:::i;:::-;26447:5;;;;;;;;;;;;;404:40381;-1:-1:-1;;;404:40381:10;;;;;;;26185:363;404:40381;;;;26151:10;;18409:60;;;;:::i;:::-;404:40381;;18409:60;;;;404:40381;;;;16426:368;404:40381;;;;;;16695:20;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;16743:36;404:40381;-1:-1:-1;;;;;404:40381:10;;16743:36;;16426:368;;16374:1728;16825:1;16814:12;;16825:1;;-1:-1:-1;16866:24:10;;;;404:40381;;;;;;16945:20;404:40381;;17010:36;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;17010:36;16862:368;16374:1728;;16862:368;404:40381;;;;;;17131:20;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;17179:36;404:40381;-1:-1:-1;;;;;404:40381:10;;17179:36;;16374:1728;;16810:1292;404:40381;17250:12;;17261:1;;-1:-1:-1;17298:24:10;;;;404:40381;;;;;;17377:16;404:40381;;17438:32;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;17438:32;16374:1728;;17294:352;404:40381;;;;;;17555:16;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;17599:32;404:40381;-1:-1:-1;;;;;404:40381:10;;17599:32;;16374:1728;;17246:856;404:40381;17666:12;16810:1292;17662:440;17720:24;;;;404:40381;;;;;;17799:22;404:40381;;17866:38;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;17866:38;16374:1728;;17716:376;404:40381;;;;;;17989:22;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;18039:38;404:40381;-1:-1:-1;;;;;404:40381:10;;18039:38;;16374:1728;;404:40381;;;;;;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;16316:28;16332:12;404:40381;16332:12;;;16316:28;;404:40381;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;7494:10;404:40381;;;;7480:13;404:40381;;;;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;34969:1;34950:20;;34946:1108;;;;;;-1:-1:-1;;;;;404:40381:10;;;;;;35005:63;;;;;404:40381;;-1:-1:-1;;;35005:63:10;;-1:-1:-1;;;;;404:40381:10;;;35005:63;;404:40381;35057:4;404:40381;;;;;;;;;;;;;;;;;;;;;;35005:63;;;;;;;;34946:1108;404:40381;;-1:-1:-1;;;;;404:40381:10;35180:29;404:40381;;;;;;;;;35086:19;404:40381;;;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;35139:18;404:40381;;35139:18;404:40381;;;35139:18;:::i;:::-;404:40381;;;;;;35139:18;404:40381;;;;;;35180:29;34946:1108;36063:18;;404:40381;36063:18;:::i;:::-;;404:40381;;;;;;36091:15;404:40381;;;;;;;;;;36091:52;404:40381;;;;36091:52;:::i;:::-;36163:768;;;404:40381;;36314:26;404:40381;;;;;;36208:17;404:40381;;;;;;;36208:27;36204:92;;36163:768;404:40381;;;;;36314:26;404:40381;;36204:92;404:40381;;;;;-1:-1:-1;;404:40381:10;34969:1;404:40381;;;36204:92;;36163:768;36381:1;36362:20;;36381:1;;404:40381;;36509:25;404:40381;;;;;;36403:17;404:40381;;;;;;;36403:27;36399:92;;404:40381;;;;;36509:25;404:40381;;36399:92;404:40381;;;;;-1:-1:-1;;404:40381:10;;;;;36399:92;;36358:573;404:40381;36556:20;;36575:1;;404:40381;;36704:23;404:40381;;;;;;36597:17;404:40381;;;;;;;36597:27;36593:93;;404:40381;;;;;36704:23;404:40381;;36593:93;404:40381;;;;;-1:-1:-1;;404:40381:10;;;;;36593:93;;36552:379;404:40381;36748:20;36744:187;;36552:379;;;;;404:40381;;36744:187;404:40381;36895:25;404:40381;;;;;;36789:17;404:40381;;;;;;;36789:27;36785:92;;36744:187;404:40381;;;;;36895:25;36744:187;;;;;;36785:92;404:40381;;;;;-1:-1:-1;;404:40381:10;7480:13;404:40381;;;36785:92;;35005:63;;;;:::i;:::-;404:40381;;35005:63;;;;404:40381;;;;34946:1108;35249:1;35230:20;;35249:1;;-1:-1:-1;;;;;404:40381:10;;;;;;35289:63;;;;;404:40381;;-1:-1:-1;;;35289:63:10;;-1:-1:-1;;;;;404:40381:10;;;35289:63;;404:40381;35341:4;404:40381;;;;;;;;;;;;;;;;;;;;;;35289:63;;;;;;;;35226:828;404:40381;;-1:-1:-1;;;;;404:40381:10;35462:28;404:40381;;;;;;;;;35370:18;404:40381;;;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;35422:17;404:40381;;35422:17;404:40381;;;35422:17;:::i;:::-;404:40381;;;;;;35422:17;404:40381;;;;;;35462:28;34946:1108;;35289:63;;;;:::i;:::-;404:40381;;35289:63;;;;35226:828;404:40381;35511:20;;35530:1;;-1:-1:-1;;;;;404:40381:10;;;;;;35569:63;;;;;404:40381;;-1:-1:-1;;;35569:63:10;;-1:-1:-1;;;;;404:40381:10;;;35569:63;;404:40381;35621:4;404:40381;;;;;;;;;;;;;;;;;;;;;;35569:63;;;;;;;;35507:547;404:40381;;-1:-1:-1;;;;;404:40381:10;35738:26;404:40381;;;;;;;;;35650:16;404:40381;;;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;35700:15;404:40381;;35700:15;404:40381;;;35700:15;:::i;:::-;404:40381;;;;;;35700:15;404:40381;;;;;;35738:26;34946:1108;;35569:63;;;;:::i;:::-;404:40381;;35569:63;;;;35507:547;404:40381;35785:20;;35781:273;;35507:547;-1:-1:-1;;;;;35507:547:10;34946:1108;;35781:273;-1:-1:-1;;;;;404:40381:10;;;;;;35842:63;;;;;404:40381;;-1:-1:-1;;;35842:63:10;;-1:-1:-1;;;;;404:40381:10;;;35842:63;;404:40381;35894:4;404:40381;;;;;;;;;;;;;;;;;;;;;;35842:63;;;;;;;;35781:273;404:40381;;-1:-1:-1;;;;;404:40381:10;36015:28;404:40381;;;;;;;;;35923:18;404:40381;;;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;35975:17;404:40381;;35975:17;404:40381;;;35975:17;:::i;:::-;404:40381;;;;;;35975:17;404:40381;;;;;;36015:28;35781:273;;;;35842:63;;;;:::i;:::-;404:40381;;35842:63;;;;404:40381;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1063:62:0;;;;:::i;:::-;8027:34:10;;;404:40381;;8077:12;;404:40381;;;;;8091:21;;;;;;;404:40381;8137:9;;;;;;;;:::i;:::-;;:::i;:::-;404:40381;8137:14;;:33;;;8077:12;404:40381;;;;8220:9;;8203:13;;8220:9;;;;;;:::i;:::-;8203:13;;;;:::i;:::-;;:::i;:::-;404:40381;;;8185:17;404:40381;;;;;;;;;;;;;;;;;8077:12;;404:40381;;;;8137:33;8155:9;8168:2;8155:9;;;;;;;:::i;:::-;404:40381;8155:15;;8137:33;;8091:21;;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;39923:16;404:40381;;;;;;;;;;;;;;;;;;;;;;;40492:1;404:40381;;;;40483:8;404:40381;;;;;;;;;;;;;;;;;;40602:35;40557;40512;40647;404:40381;40537:1;404:40381;;40483:8;404:40381;;;;;;;;40512:35;;:::i;:::-;404:40381;;;40483:8;404:40381;;;;;;;;40557:35;;:::i;:::-;404:40381;;;40483:8;404:40381;;;;;;;;40602:35;;:::i;:::-;404:40381;40672:1;404:40381;;40483:8;404:40381;;;;;40647:35;;:::i;:::-;404:40381;;;;;;;;;;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;404:40381:10;;;2169:22:0;;;404:40381:10;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;2573:40:0;404:40381:10;2573:40:0;;404:40381:10;;;;;;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;:::i;:::-;1063:62:0;;:::i;:::-;404:40381:10;-1:-1:-1;;;;;;404:40381:10;;;;;;;;7694:37;404:40381;;;7694:37;404:40381;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;;;;;:::i;:::-;;;;3429:51;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;38312:15;404:40381;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;404:40381:10;;:::i;:::-;;;;;;10935:11;404:40381;;;;;;;10983:20;;;;:::i;:::-;11018:10;;11030;;;;;;404:40381;;;;;;;:::i;:::-;;;;11018:10;404:40381;;;;;;;;;11080:21;404:40381;;;;11080:21;:::i;:::-;404:40381;;;;;;;11057:45;;;;:::i;:::-;404:40381;;11018:10;;404:40381;;;;;;;;;;;;;;;;37617:1;404:40381;;;37607:9;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;-1:-1:-1;;;;;404:40381:10;;:::i;:::-;;;;;;;10576:13;404:40381;;;;;;;;;;;;;;;;;;;;;;10634:20;;;;:::i;:::-;10669:10;;10681;;;;;;404:40381;;;;;;;:::i;10669:10::-;404:40381;;;;;;;;;;;;;;;;;10733:29;404:40381;;;;10733:29;:::i;:::-;404:40381;;;;;;;10708:55;;;;:::i;:::-;404:40381;;10669:10;;404:40381;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;37043:65;404:40381;-1:-1:-1;;;;;404:40381:10;;:::i;:::-;7494:10;;404:40381;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;;;;;;;;37091:15;404:40381;;;;;;37043:65;;404:40381;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;7494:10;;404:40381;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;-1:-1:-1;;;;;404:40381:10;;;7083:14;404:40381;;7083:33;;;;;404:40381;;;7083:33;;-1:-1:-1;;;;;404:40381:10;;;7083:33;;404:40381;;;;;;;;;;;;;;;;;;7083:33;;;;;;;;404:40381;;;7210:57;404:40381;;;;;;;;7126:16;404:40381;;;;;7126:32;404:40381;;;7126:32;:::i;:::-;404:40381;;7168:27;404:40381;7168:27;404:40381;7168:27;:::i;:::-;;404:40381;;;;;;7237:12;404:40381;;;;7251:15;404:40381;;;;7210:57;404:40381;;7083:33;;;;:::i;:::-;404:40381;;7083:33;;;;404:40381;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;39714:22;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9035:14;;9063:11;-1:-1:-1;;;;;9073:1:10;404:40381;;9059:97;9084:3;404:40381;;;9081:1;9076:6;;;;9084:3;404:40381;9103:42;404:40381;;;;9113:15;404:40381;;;;;;;;;;;;;;9103:42;;:::i;:::-;9084:3;;:::i;:::-;9063:11;;;9076:6;;;9182:20;9076:6;;9182:20;:::i;:::-;9212:10;9236:11;9073:1;9257:3;404:40381;;;9081:1;9249:6;;;;404:40381;;;9113:15;404:40381;;;;;;;;;;;;;;;9338:10;;9334:137;9350:5;;;;;;9257:3;;;;;;;:::i;:::-;9236:11;;9357:3;404:40381;;9453:3;9357;404:40381;;;;;;;;;;;;;;;;;;;;;;9406:28;404:40381;;;;9406:28;:::i;:::-;404:40381;;;;;;;9380:55;;;;:::i;:::-;404:40381;9453:3;:::i;:::-;9357;;:::i;:::-;9338:10;;;;;;;;;9249:6;404:40381;;;;9249:6;404:40381;;:::i;:::-;;;;;;;;;;;;;;;37803:16;404:40381;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7494:10;404:40381;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;;19044:10;;404:40381;;19056:15;;;;;19110:1;404:40381;19092:14;;;;:::i;:::-;404:40381;;19092:19;19110:1;;404:40381;19167:7;;;;;:::i;:::-;404:40381;;;;19147:19;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;19210:18;404:40381;;;19210:18;404:40381;;;19210:18;:::i;:::-;404:40381;;;;;;;;19298:7;;;;:::i;:::-;404:40381;;;;;;;19267:39;404:40381;-1:-1:-1;;;;;404:40381:10;;19267:39;;19088:2743;404:40381;21867:7;;;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;;;;;;21929:7;;;;:::i;:::-;404:40381;;;;21911:17;404:40381;;;;;;;;;21911:31;21907:113;;19088:2743;404:40381;;-1:-1:-1;;;;;404:40381:10;;;;22034:15;404:40381;;;;;;;;;;22034:62;404:40381;;;;22088:7;;;;:::i;:::-;404:40381;;22034:62;;:::i;:::-;-1:-1:-1;;;;;404:40381:10;;;;22166:7;;;;:::i;:::-;404:40381;;22110:64;;;;;;404:40381;;-1:-1:-1;;;22110:64:10;;-1:-1:-1;;;;;404:40381:10;;;22110:64;;404:40381;22159:4;404:40381;;;;;;;;;;;;;;;;;;;;;;;22110:64;;;;;;;;;;;19088:2743;404:40381;;19110:1;404:40381;19044:10;;22110:64;;;;:::i;:::-;404:40381;;22110:64;;;;;404:40381;;;;;;;;;22110:64;404:40381;;;21907:113;404:40381;21991:14;;;;:::i;:::-;404:40381;;21980:7;404:40381;21980:7;;;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;21907:113;;;;19088:2743;19349:1;19331:14;404:40381;19331:14;;;;:::i;:::-;404:40381;;19331:19;19349:1;;404:40381;;19404:7;;;;;:::i;:::-;404:40381;;;;19386:17;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;19447:16;404:40381;;;;19447:16;404:40381;;;;;19447:16;:::i;:::-;404:40381;;;;;;;;;;19531:7;;;;:::i;:::-;404:40381;;;;;;;19502:37;404:40381;-1:-1:-1;;;;;404:40381:10;;19502:37;;19088:2743;;19327:2504;404:40381;19564:14;404:40381;19564:14;;;;:::i;:::-;404:40381;;19564:19;22110:7;;404:40381;;;19640:7;;;;;:::i;:::-;404:40381;;;;19619:20;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;19110:1;404:40381;;19683:9;404:40381;;19683:26;404:40381;;;19701:7;;;;;:::i;19683:26::-;19780:7;;;;:::i;:::-;404:40381;;;;;;;19748:40;404:40381;-1:-1:-1;;;;;404:40381:10;;19748:40;;19088:2743;;19560:2271;404:40381;;19813:14;;;;:::i;:::-;404:40381;;19813:19;404:40381;;;;;19887:7;;;;;:::i;:::-;404:40381;;;;19868:18;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;19930:17;404:40381;;;19930:17;404:40381;;;19930:17;:::i;:::-;404:40381;;;;;;;;20016:7;;;;:::i;:::-;404:40381;;;;;;;19986:38;404:40381;-1:-1:-1;;;;;404:40381:10;;19986:38;;19088:2743;;19809:2022;404:40381;;20049:14;;;;:::i;:::-;404:40381;;20049:19;404:40381;;;;20123:7;;;;;;:::i;:::-;404:40381;;;;20104:18;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;20166:9;404:40381;;20166:26;404:40381;;;20184:7;;;;;:::i;20166:26::-;20262:7;;;;:::i;:::-;404:40381;;;;;;;20232:38;404:40381;-1:-1:-1;;;;;404:40381:10;;20232:38;;19088:2743;;20045:1786;20295:14;;21911:17;404:40381;20295:14;;;;:::i;:::-;404:40381;;20295:19;21911:17;;404:40381;;20371:7;;;;;:::i;:::-;404:40381;;;;20350:20;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;20414:19;404:40381;;;;20414:19;404:40381;;;;;20414:19;:::i;:::-;404:40381;;;;;;;;;;20504:7;;;;:::i;:::-;404:40381;;;;;;;20472:40;404:40381;-1:-1:-1;;;;;404:40381:10;;20472:40;;19088:2743;;20291:1540;7480:13;404:40381;20537:14;;;;:::i;:::-;404:40381;;20537:19;7480:13;;404:40381;;20611:7;;;;;:::i;:::-;404:40381;;;;20592:18;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;20654:17;404:40381;;;20654:17;404:40381;;;20654:17;:::i;:::-;404:40381;;;;;;;;20740:7;;;;:::i;:::-;404:40381;;;;;;;20710:38;404:40381;-1:-1:-1;;;;;404:40381:10;;20710:38;;19088:2743;;20533:1298;20791:1;404:40381;20773:14;;;;:::i;:::-;404:40381;;20773:19;20791:1;;404:40381;;20848:7;;;;;:::i;:::-;404:40381;;;;20828:19;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;20891:18;404:40381;;;;20891:18;404:40381;;;;;20891:18;:::i;:::-;404:40381;;;;;;;;;;20971:7;;;;:::i;:::-;404:40381;;;;;;;20940:39;404:40381;-1:-1:-1;;;;;404:40381:10;;20940:39;;19088:2743;;20769:1062;21022:1;404:40381;21004:14;;;;:::i;:::-;404:40381;;21004:19;21022:1;;404:40381;;21071:7;;;;;:::i;:::-;404:40381;;;;21048:22;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;21115:9;404:40381;;21115:26;404:40381;;;21133:7;;;;;:::i;21115:26::-;21199:7;;;;:::i;:::-;404:40381;;;;;;;21165:42;404:40381;-1:-1:-1;;;;;404:40381:10;;21165:42;;19088:2743;;21000:831;21250:2;404:40381;21232:14;;;;:::i;:::-;404:40381;;21232:20;21250:2;;404:40381;;21289:7;;;;;:::i;:::-;404:40381;;;;21272:16;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;21332:15;404:40381;;;21332:15;404:40381;;;21332:15;:::i;:::-;404:40381;;;;;;;;21398:7;;;;:::i;:::-;404:40381;;;;;;;21370:36;404:40381;-1:-1:-1;;;;;404:40381:10;;21370:36;;19088:2743;;21228:603;21449:2;404:40381;21431:14;;;;:::i;:::-;404:40381;;21431:20;21449:2;;404:40381;;21488:7;;;;;:::i;:::-;404:40381;;;;21471:16;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;21531:15;404:40381;;;21531:15;404:40381;;;;;21531:15;:::i;:::-;404:40381;;;;;;;;;;21597:7;;;;:::i;:::-;404:40381;;;;;;;21569:36;404:40381;-1:-1:-1;;;;;404:40381:10;;21569:36;;19088:2743;;21427:404;21648:2;404:40381;21630:14;;;;:::i;:::-;404:40381;;21630:20;21626:205;;21427:404;;19088:2743;;21626:205;404:40381;21687:7;;;;;;:::i;:::-;404:40381;;;;21670:16;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;21730:9;404:40381;;21730:26;404:40381;;;21748:7;;;;;:::i;21730:26::-;21808:7;;;;:::i;:::-;404:40381;;;;;;;21780:36;404:40381;-1:-1:-1;;;;;404:40381:10;;21780:36;;21626:205;;;19056:15;;22225:31;19056:15;404:40381;;;22225:31;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3640:31;404:40381;;;;;;;;;;;;;;;;;;;;;;39199:13;404:40381;39199:13;404:40381;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;:::i;:::-;;;:::i;:::-;;27090:16;404:40381;;;;27090:41;;;404:40381;;;;-1:-1:-1;;;;;404:40381:10;;;27142:63;;;;;;404:40381;;-1:-1:-1;;;27142:63:10;;27184:4;404:40381;27142:63;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;27142:63;;;;;;;;;;;404:40381;;27142:63;;;;:::i;:::-;404:40381;;27142:63;404:40381;27142:63;404:40381;;;;;;;;27090:41;404:40381;-1:-1:-1;;;;;404:40381:10;;;27110:10;:21;27090:41;;404:40381;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;7494:10;404:40381;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;32704:10;;404:40381;;;32716:10;;;;;32743:16;404:40381;;;32796:1;32777:20;32796:1;;404:40381;;-1:-1:-1;;;;;404:40381:10;;;32886:7;;;;;;:::i;:::-;32836:58;;;;;;404:40381;;-1:-1:-1;;;32836:58:10;;-1:-1:-1;;;;;404:40381:10;;;32836:58;;404:40381;32879:4;404:40381;;;;;;;;;;;;;;;;;;;;;;;32836:58;;;;;;;;32773:1354;32936:7;;;404:40381;32936:7;;32796:1;32936:7;;;;:::i;:::-;404:40381;;;32916:19;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;32977:18;404:40381;;;32977:18;404:40381;;;32977:18;:::i;:::-;404:40381;;;;;;;;33017:14;33083:7;;;;;;:::i;:::-;404:40381;;;;;;;33058:33;404:40381;-1:-1:-1;;;;;404:40381:10;;33058:33;;32773:1354;404:40381;34162:7;;;;;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;;;;;;;34224:7;;;;;;:::i;:::-;404:40381;;;34206:17;404:40381;;;;;;;;;34206:31;34202:109;;32773:1354;404:40381;;;-1:-1:-1;;;;;404:40381:10;;;;34325:15;404:40381;;;;;;;;;;;;34325:56;404:40381;;;34373:7;;;;;;:::i;:::-;34325:56;;:::i;:::-;404:40381;32704:10;;34202:109;404:40381;34275:7;;;;;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;;34202:109;;;;;32836:58;;;;:::i;:::-;404:40381;;32836:58;;;;32773:1354;404:40381;;;33135:1;33116:20;33135:1;;404:40381;;-1:-1:-1;;;;;404:40381:10;;;33229:7;;;;;;:::i;:::-;33179:58;;;;;;404:40381;;-1:-1:-1;;;33179:58:10;;-1:-1:-1;;;;;404:40381:10;;;33179:58;;404:40381;33222:4;404:40381;;;;;;;;;;;;;;;;;;;;;;;33179:58;;;;;;;;33112:1015;33278:7;;;404:40381;33278:7;;32796:1;33278:7;;;;:::i;:::-;404:40381;;;33259:18;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;33319:17;404:40381;;;33319:17;404:40381;;;33319:17;:::i;:::-;404:40381;;;;;;;;;33423:7;;;;;;:::i;:::-;404:40381;;;;;;;33399:32;404:40381;-1:-1:-1;;;;;404:40381:10;;33399:32;;32773:1354;;33179:58;;;;:::i;:::-;404:40381;;33179:58;;;;33112:1015;404:40381;;;;;33456:20;;33475:1;;-1:-1:-1;;;;;404:40381:10;;;;;33568:7;;;;;;:::i;:::-;33518:58;;;;;;404:40381;;-1:-1:-1;;;33518:58:10;;-1:-1:-1;;;;;404:40381:10;;;33518:58;;404:40381;33561:4;404:40381;;;;;;;;;;;;;;;;;;;;;;;33518:58;;;;;;;;33452:675;33615:7;;;404:40381;33615:7;;32796:1;33615:7;;;;:::i;:::-;404:40381;;;33598:16;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;33656:15;404:40381;;;33656:15;404:40381;;;33656:15;:::i;:::-;404:40381;;;;;;;;33706:2;33757:7;;;;;;:::i;:::-;404:40381;;;;;;;33735:30;404:40381;-1:-1:-1;;;;;404:40381:10;;33735:30;;32773:1354;;33518:58;;;;:::i;:::-;404:40381;;33518:58;;;;33452:675;404:40381;;;;33790:20;33786:341;;33452:675;;;;32796:1;33452:675;32773:1354;;33786:341;-1:-1:-1;;;;;404:40381:10;;;;;33910:7;;;;;;:::i;:::-;33851:67;;;;;;404:40381;;-1:-1:-1;;;33851:67:10;;-1:-1:-1;;;;;404:40381:10;;;33851:67;;404:40381;33903:4;404:40381;;;;;;;;;;;;;;;;;;;;;;;33851:67;;;;;;;;33786:341;33959:7;;;404:40381;33959:7;;32796:1;33959:7;;;;:::i;:::-;404:40381;;;33940:18;404:40381;;;;;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;;34000:17;404:40381;;;34000:17;404:40381;;;34000:17;:::i;:::-;404:40381;;;;;;;;7480:13;34104:7;;;;;;:::i;:::-;404:40381;;;;;;;34080:32;404:40381;-1:-1:-1;;;;;404:40381:10;;34080:32;;33786:341;;;;;;;33851:67;;;;:::i;:::-;404:40381;;33851:67;;;;32716:10;-1:-1:-1;;;;34433:26:10;404:40381;;;34433:26;404:40381;34433:26;:::i;:::-;;404:40381;;;;32796:1;32777:20;32796:1;;404:40381;34516:26;404:40381;34516:26;-1:-1:-1;;;;;404:40381:10;;;;;;;34516:26;;;:::i;:::-;;;;404:40381;;34470:361;404:40381;;;34583:1;34564:20;34583:1;;404:40381;34606:30;404:40381;34606:30;-1:-1:-1;;;;;404:40381:10;;;;;;;34606:30;;;:::i;34560:271::-;404:40381;;;;34658:20;34677:1;;404:40381;34700:29;404:40381;34700:29;-1:-1:-1;;;;;404:40381:10;;;;;;;34700:29;;;:::i;34654:177::-;404:40381;;;34750:20;34746:85;;34654:177;;;;404:40381;;34746:85;34792:28;404:40381;34792:28;-1:-1:-1;;;;;404:40381:10;;;;;;;34792:28;;;:::i;:::-;;;;34746:85;;;;;404:40381;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;:::i;:::-;;;:::i;:::-;15599:16;404:40381;;;;;;15599:41;;;404:40381;15596:292;;;404:40381;-1:-1:-1;;;;;15664:10:10;404:40381;;15656:66;;;;;;404:40381;;-1:-1:-1;;;15656:66:10;;15701:4;404:40381;15656:66;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;15656:66;;;;;;;;;;;15596:292;;404:40381;;15596:292;404:40381;;15743:52;;;15596:292;15739:149;;15596:292;;;404:40381;;15739:149;-1:-1:-1;;;;;15819:10:10;404:40381;;15811:66;;;;;;404:40381;;-1:-1:-1;;;15811:66:10;;15856:4;404:40381;15811:66;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;15811:66;;;;;;;;;;;15739:149;;;;15811:66;;;;:::i;:::-;404:40381;;15811:66;;;;15743:52;404:40381;;;;;;15774:16;404:40381;;-1:-1:-1;;;;;404:40381:10;;;;;15760:10;:35;15743:52;;15599:41;404:40381;-1:-1:-1;;;;;404:40381:10;;;15619:10;:21;15599:41;;404:40381;;;;;;;;;;;;;;;;38427:1;404:40381;;;38417:9;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;38685:16;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;:::i;:::-;7494:10;404:40381;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;-1:-1:-1;;;;;404:40381:10;;;14551:10;404:40381;;14543:72;;;;;404:40381;;-1:-1:-1;;;14543:72:10;;-1:-1:-1;;;;;404:40381:10;;;14543:72;;404:40381;14604:4;404:40381;;;;;;;;;;;;;;;;;;;;;;14543:72;;;;;;;;404:40381;;;14750:32;404:40381;;;14673:37;404:40381;;;;;;;;;14625:16;404:40381;;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;14673:11;404:40381;;;;;14673:37;:::i;:::-;14720:15;404:40381;;14720:15;404:40381;;;14720:15;:::i;:::-;404:40381;;;;;;14720:15;404:40381;;;;;;14750:32;404:40381;;14543:72;;;;:::i;:::-;404:40381;;14543:72;;;;404:40381;;;;;;;;;;;;;3161:30;404:40381;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;37370:20;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;-1:-1:-1;;;;;404:40381:10;;:::i;:::-;;;;3310:51;404:40381;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;7494:10;;404:40381;;;;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;22418:1;22404:15;;;22418:1;;404:40381;;;;25842:15;404:40381;22638:30;404:40381;;;;;;;;22456:19;404:40381;;-1:-1:-1;;;;;404:40381:10;22435:59;404:40381;;;;;;;;;22443:37;;;22435:59;:::i;:::-;404:40381;;;22456:19;404:40381;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;-1:-1:-1;;404:40381:10;;;22600:18;404:40381;;22600:18;404:40381;;;22600:18;:::i;:::-;404:40381;;;;;;22600:18;404:40381;;;;;;22638:30;22400:3398;25842:15;;;:::i;:::-;25868:18;;404:40381;25868:18;:::i;:::-;;404:40381;-1:-1:-1;;;;;404:40381:10;;;25897:64;;;;;;404:40381;;-1:-1:-1;;;25897:64:10;;25939:4;404:40381;25897:64;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;25897:64;404:40381;22400:3398;22703:1;22689:15;;;22703:1;;404:40381;;;;;25842:15;404:40381;22916:28;404:40381;;;;;;;;22741:17;404:40381;;-1:-1:-1;;;;;404:40381:10;22720:57;404:40381;;;;;;;;;22728:35;;;22720:57;:::i;:::-;404:40381;;;22741:17;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;22881:16;;404:40381;;;;;;22881:16;:::i;:::-;404:40381;;;;;;;;22881:16;404:40381;;;;;;22916:28;22400:3398;;22685:3113;404:40381;;;22965:15;;;22979:1;;404:40381;;;;;;;;;;;23017:20;404:40381;;-1:-1:-1;;;;;404:40381:10;22996:60;404:40381;;;;;;;;;23004:38;;;22996:60;:::i;:::-;404:40381;;;23017:20;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;26653:9;404:40381;;;;;;;;;26686:303;26702:5;;;;;;26686:303;404:40381;;;;;;;;23207:31;404:40381;;;25842:15;404:40381;;;;;;23207:31;22400:3398;;26690:10;404:40381;;;;;;;;;26727:19;404:40381;;;;26727:19;:::i;:::-;404:40381;;;;;;;26727:26;404:40381;;;;;;;;;;;;;;;;;;;;26795:24;;26773:19;23207:31;26795:24;;;;;;;;26773:46;26795:24;25842:15;26795:24;;;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;26773:19;:::i;:46::-;404:40381;;;;26837:20;404:40381;;;26837:20;:::i;:::-;26878:5;;;;;;;;;;26724:255;404:40381;;;26956:8;26690:10;;22961:2837;23259:15;;;;404:40381;23259:15;;404:40381;;;;;;;;25842:15;404:40381;23489:29;404:40381;;;;;;;;23311:18;404:40381;;-1:-1:-1;;;;;404:40381:10;23290:58;404:40381;;;;;;;;;23298:36;;;23290:58;:::i;:::-;404:40381;;;23311:18;404:40381;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;-1:-1:-1;;404:40381:10;;;23453:17;404:40381;;23453:17;404:40381;;;23453:17;:::i;:::-;404:40381;;;;;;23453:17;404:40381;;;;;;23489:29;22400:3398;;23255:2543;23539:15;;;23553:1;23539:15;;23553:1;;404:40381;;;;;;;;;;23591:18;404:40381;;-1:-1:-1;;;;;404:40381:10;23570:58;404:40381;;;;;;;;;23578:36;;;23570:58;:::i;:::-;404:40381;;;23591:18;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;26653:9;404:40381;;;;;;;;26690:10;404:40381;26686:303;26702:5;;;;;;26686:303;404:40381;;;;;;;;;23777:29;404:40381;;;25842:15;404:40381;;;;;;23777:29;22400:3398;;26690:10;404:40381;;;;;;;;26727:19;404:40381;;;;26727:19;:::i;:::-;404:40381;;;;;;;26727:26;404:40381;;;;;;;;;;;;;;;;;;;;;;26795:24;;26773:19;23777:29;26795:24;;;;;;;;26773:46;26795:24;25842:15;26795:24;;;;:::i;26773:46::-;404:40381;;;;26837:20;404:40381;;;26837:20;:::i;:::-;26878:5;;;;;;;;;;;26724:255;404:40381;;;26956:8;26690:10;;23535:2263;23827:15;;;-1:-1:-1;23841:1:10;23827:15;;23841:1;;404:40381;;;;;;25842:15;404:40381;24063:31;404:40381;;;;;;;;23879:20;404:40381;;-1:-1:-1;;;;;404:40381:10;23858:60;404:40381;;;;;;;;;23866:38;;;23858:60;:::i;:::-;404:40381;;;23879:20;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;24025:19;;404:40381;;;;;;24025:19;:::i;:::-;404:40381;;;;;;;;24025:19;404:40381;;;;;;24063:31;22400:3398;;23823:1975;7480:13;24115:15;;7480:13;;404:40381;;;;;;25842:15;404:40381;24345:29;404:40381;;;;;;;;24167:18;404:40381;;-1:-1:-1;;;;;404:40381:10;24146:58;404:40381;;;;;;;;;24154:36;;;24146:58;:::i;:::-;404:40381;;;24167:18;404:40381;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;-1:-1:-1;;404:40381:10;;;24309:17;404:40381;;24309:17;404:40381;;;24309:17;:::i;:::-;404:40381;;;;;;24309:17;404:40381;;;;;;24345:29;22400:3398;;24111:1687;24409:1;24395:15;;24409:1;;404:40381;;;;;;25842:15;404:40381;24628:30;404:40381;;;;;;;;24447:19;404:40381;;-1:-1:-1;;;;;404:40381:10;24426:59;404:40381;;;;;;;;;24434:37;;;24426:59;:::i;:::-;404:40381;;;24447:19;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;24591:18;;404:40381;;;;;;24591:18;:::i;:::-;404:40381;;;;;;;;24591:18;404:40381;;;;;;24628:30;22400:3398;;24391:1407;24693:1;24679:15;;24693:1;;404:40381;;;;;;;;;;24731:22;404:40381;;-1:-1:-1;;;;;404:40381:10;24710:62;404:40381;;;;;;;;;24718:40;;;24710:62;:::i;:::-;404:40381;;;24731:22;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;26653:9;404:40381;;;;;;;;26690:10;404:40381;26686:303;26702:5;;;;;;26686:303;404:40381;;;;;;;;24925:33;25842:15;404:40381;;;;;;;;;24925:33;22400:3398;;26690:10;404:40381;;;;;;;;26727:19;404:40381;;;;26727:19;:::i;:::-;404:40381;;;;;;;26727:26;404:40381;;;;;;;;;;;;;;;;;;;;;;26795:24;;26773:19;26795:24;;;;24925:33;26795:24;;;26773:46;26795:24;25842:15;26795:24;;;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;26773:19;:::i;:46::-;404:40381;;;;;26837:20;404:40381;;;26837:20;:::i;:::-;26878:5;;;;;;;;;;26724:255;404:40381;;;26956:8;26690:10;;24675:1123;24979:16;;;24993:2;24979:16;;24993:2;;404:40381;;;;;;25842:15;404:40381;25204:27;404:40381;;;;;;;;25032:16;404:40381;;-1:-1:-1;;;;;404:40381:10;25011:56;404:40381;;;;;;;;;25019:34;;;25011:56;:::i;:::-;404:40381;;;25032:16;404:40381;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;-1:-1:-1;;404:40381:10;;;25170:15;404:40381;;25170:15;404:40381;;;25170:15;:::i;:::-;404:40381;;;;;;25170:15;404:40381;;;;;;25204:27;22400:3398;;24975:823;25266:2;25252:16;;25266:2;;404:40381;;;;;;25842:15;404:40381;25477:27;404:40381;;;;;;;;25305:16;404:40381;;-1:-1:-1;;;;;404:40381:10;25284:56;404:40381;;;;;;;;;25292:34;;;25284:56;:::i;:::-;404:40381;;;25305:16;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;25443:15;;404:40381;;;25443:15;404:40381;;25443:15;:::i;:::-;;404:40381;;;;;;;25443:15;404:40381;;;;;;25477:27;22400:3398;;25248:550;25539:2;25525:16;25521:277;;25248:550;;;;;;25842:15;25248:550;22400:3398;;25521:277;404:40381;;;;;;;;25578:16;404:40381;;-1:-1:-1;;;;;404:40381:10;25557:56;404:40381;;;;;;;;;25565:34;;;25557:56;:::i;:::-;404:40381;;;25578:16;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;26653:9;404:40381;;;;;;;;26690:10;404:40381;26686:303;26702:5;;;;;;26686:303;404:40381;;;;;;;;25760:27;25842:15;404:40381;;;;;;;;;25760:27;25521:277;;;;26690:10;404:40381;;;;;;;;26727:19;404:40381;;;;26727:19;:::i;:::-;404:40381;;;;;;;26727:26;404:40381;;;;;;;;;;;;;;;;;;;;;;26795:24;;;;;26773:19;25760:27;26795:24;;;25842:15;26795:24;;;;26773:46;26795:24;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;26773:19;:::i;:46::-;404:40381;;;;26837:20;404:40381;;;26837:20;:::i;:::-;26878:5;;;;;;;;;;26724:255;404:40381;;;26956:8;26690:10;;404:40381;;;;;;;;;;;;;;;40763:13;404:40381;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;:::i;:::-;;;:::i;:::-;14100:16;404:40381;;;;;;14100:41;;;404:40381;14097:284;;;404:40381;-1:-1:-1;;;;;404:40381:10;;;14157:61;;;;;;404:40381;;-1:-1:-1;;;14157:61:10;;14197:4;404:40381;14157:61;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;14157:61;404:40381;14097:284;404:40381;;14239:54;;;14097:284;14235:146;;14097:284;;;404:40381;;14235:146;-1:-1:-1;;;;;404:40381:10;;;14309:61;;;;;;404:40381;;-1:-1:-1;;;14309:61:10;;14349:4;404:40381;14309:61;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;14309:61;404:40381;14239:54;404:40381;;;;;;14270:18;404:40381;;-1:-1:-1;;;;;404:40381:10;;;;;14256:10;:37;14239:54;;14100:41;404:40381;-1:-1:-1;;;;;404:40381:10;;;14120:10;:21;14100:41;;404:40381;;;;;;;;;;;;;;;39062:13;404:40381;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;38801:16;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;:::i;:::-;7494:10;404:40381;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;-1:-1:-1;;;;;7359:14:10;404:40381;;7359:37;;;;;404:40381;;;7359:37;;-1:-1:-1;;;;;404:40381:10;;;;7359:37;;404:40381;;;;;;;;;;;;;;;;;;7359:37;404:40381;;;;;;;;;;;;;;;3094:31;404:40381;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;37249:17;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;404:40381:10;;;8349:21;404:40381;;;;;;;8349:21;404:40381;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;7494:10;404:40381;;;;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;11458:1;11439:20;;;:44;;;404:40381;;;;-1:-1:-1;;;;;404:40381:10;;;;;;11509:67;;;;;404:40381;;-1:-1:-1;;;11509:67:10;;-1:-1:-1;;;;;404:40381:10;;;11509:67;;404:40381;11565:4;404:40381;;;;;;;;;;;;;;;;;;;;;;11509:67;;;;;;;;404:40381;;;;11733:56;404:40381;;11831:34;404:40381;;;;;;11586:18;404:40381;;;;;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;;11636:8;404:40381;;11636:35;404:40381;;;;11636:35;:::i;:::-;404:40381;;;11681:19;404:40381;;;;;;;;;;;;;;;;;11733:13;404:40381;;;;;;;;;;;;;11733:56;:::i;:::-;11799:17;404:40381;;11799:17;:::i;:::-;404:40381;;;;;;;11831:34;404:40381;;11509:67;;;;:::i;:::-;404:40381;;11509:67;;;;404:40381;;;;;;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;11439:44;11463:20;11482:1;11463:20;;;11439:44;;404:40381;;;;;;;;;;;;;1063:62:0;;:::i;:::-;404:40381:10;-1:-1:-1;;;;;404:40381:10;;-1:-1:-1;;;;;;404:40381:10;;;;;2573:40:0;;;;404:40381:10;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;404:40381:10;;8634:1;;8599:11;8645:3;404:40381;;;8642:1;8637:6;;;;8645:3;404:40381;8664:39;404:40381;;;;8671:15;404:40381;;;;;;;;;;;;;;8664:39;;:::i;:::-;8645:3;;:::i;:::-;8624:11;;;8637:6;8634:1;8637:6;;;;;8771:3;404:40381;;;8642:1;8763:6;;;;8771:3;404:40381;8790:38;404:40381;;;;8798:13;404:40381;;;;;;;;;;;;;;8790:38;;:::i;:::-;8771:3;;:::i;:::-;8750:11;;;8763:6;;8873:10;8763:6;;8873:10;:::i;:::-;404:40381;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;7494:10;404:40381;;;;7480:13;404:40381;;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;27553:2279;404:40381;27729:10;404:40381;;27722:17;404:40381;;;;;27754:12;;27750:1910;404:40381;;;-1:-1:-1;404:40381:10;;27806:15;;404:40381;;-1:-1:-1;;404:40381:10;;;27890:8;404:40381;;;;;;;29702:7;;404:40381;27890:40;;404:40381;27902:27;;;:::i;:::-;27890:40;;:::i;:::-;404:40381;;;;;;;;;;;;;;27864:18;404:40381;;;;;;;;;;;;;;27957:19;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;27999:18;404:40381;;27999:18;404:40381;;;27999:18;:::i;:::-;404:40381;;;;;;27999:18;404:40381;27802:466;29702:7;;:::i;:::-;404:40381;;;;29720:60;;;;;404:40381;;-1:-1:-1;;;29720:60:10;;29762:4;404:40381;29720:60;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;29720:60;;;;;;;;27750:1910;404:40381;;;;29795:30;404:40381;;;;;;;;;;;;29795:30;404:40381;;;;;;29720:60;;;;;:::i;:::-;404:40381;;29720:60;;;27802:466;28042:15;;;;28056:1;28042:15;28038:230;;27802:466;;;29702:7;27802:466;;;28038:230;404:40381;;;28126:9;404:40381;;;;;;;;;-1:-1:-1;29702:7:10;;404:40381;28126:44;;28140:28;;404:40381;28140:28;:::i;28126:44::-;404:40381;;;;;;;;;;;;;;28098:20;404:40381;;;;;;;;;;;;;;28197:17;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;28237:16;;404:40381;;;;;;28237:16;:::i;:::-;404:40381;;;;;;;;28237:16;404:40381;28038:230;;;;27750:1910;28288:12;;;;;;;28299:1;28288:12;;28299:1;;404:40381;;;;;;;;;28359:15;28355:231;;28284:1376;;29702:7;28284:1376;27750:1910;;28355:231;28299:1;404:40381;;28442:9;404:40381;;;;;;;;;-1:-1:-1;29702:7:10;;404:40381;28442:44;;28456:28;;404:40381;28456:28;:::i;28442:44::-;404:40381;;;;;;;;;;;;;;28416:18;404:40381;;;;;;;;;;;;;;28513:18;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;28554:17;404:40381;;28554:17;404:40381;;;28554:17;:::i;:::-;404:40381;;;;;;28554:17;404:40381;28355:231;;;;28284:1376;404:40381;;28606:12;;;28617:1;;-1:-1:-1;404:40381:10;28667:2;28653:16;;28667:2;;-1:-1:-1;404:40381:10;;;28735:8;404:40381;;;;;;;;;-1:-1:-1;29702:7:10;;28735:40;;28747:27;;404:40381;28747:27;:::i;28735:40::-;404:40381;;;;;;;;;;;;28709:18;404:40381;;;;;;;;;;;;;;28802:16;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;28841:15;404:40381;;28841:15;404:40381;;;28841:15;:::i;:::-;404:40381;;;;;;28841:15;404:40381;27750:1910;;28649:467;28895:2;28881:16;28877:239;;28649:467;;29702:7;28649:467;;;;27750:1910;;28877:239;404:40381;;;28961:9;404:40381;;;;;;;;;-1:-1:-1;29702:7:10;;28961:44;;28975:28;;404:40381;28975:28;:::i;28961:44::-;404:40381;;;;;;;;;;;;28937:16;404:40381;;;;;;;;;;;;;;29032:16;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;29071:15;;404:40381;;;29071:15;404:40381;;29071:15;:::i;:::-;;404:40381;;;;;;;29071:15;404:40381;28877:239;;;;;28602:1058;404:40381;29136:12;29132:528;;28602:1058;;;;29702:7;28602:1058;;;;27750:1910;;29132:528;404:40381;7480:13;29183:15;;7480:13;;-1:-1:-1;404:40381:10;;;29266:8;404:40381;;;;;;;;;-1:-1:-1;29702:7:10;;29266:40;;29278:27;;404:40381;29278:27;:::i;29266:40::-;404:40381;;;;;;;;;;;;29240:18;404:40381;;;;;;;;;;;;;;29333:18;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;29374:17;404:40381;;29374:17;404:40381;;;29374:17;:::i;:::-;404:40381;;;;;;29374:17;404:40381;29179:471;29132:528;;;;;;;29179:471;29430:1;29416:15;29412:238;;29179:471;;29702:7;29179:471;;;;;;29412:238;404:40381;;;29504:9;404:40381;;;;;;;;;-1:-1:-1;29702:7:10;;29504:44;;29518:28;;404:40381;29518:28;:::i;29504:44::-;404:40381;;;;;;;;;;;;29474:22;404:40381;;;;;;;;;;;;;;29575:19;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;29617:18;;404:40381;;;;;;29617:18;:::i;:::-;404:40381;;;;;;;;29617:18;404:40381;29412:238;;;;;404:40381;;;;;;;;;;;;;;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;37493:19;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;39589:19;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;38082:18;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;39468:18;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;:::i;:::-;1063:62:0;;:::i;:::-;404:40381:10;-1:-1:-1;;;;;;7807:31:10;404:40381;;;7807:31;404:40381;;;;;;;;;;;;;;;;;;39824:15;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9987:14;;10015:11;-1:-1:-1;;;;;10025:1:10;404:40381;;10011:95;10036:3;404:40381;;;10033:1;10028:6;;;;10036:3;404:40381;10055:40;404:40381;;;;10065:13;404:40381;;;;;;;;;;;;;;10055:40;;:::i;10036:3::-;10015:11;;;10028:6;;;10131:20;10028:6;;10131:20;:::i;:::-;10161:10;10185:11;10025:1;10206:3;404:40381;;;10033:1;10198:6;;;;404:40381;;;10065:13;404:40381;;;;;;;;;;;;;;;10285:10;;10281:134;10297:5;;;;;;10206:3;;;;;;;:::i;:::-;10185:11;;10304:3;404:40381;;10397:3;10304;404:40381;;;;;;;;;;;;;;;;;;;;;;10352:26;404:40381;;;;10352:26;:::i;10304:3::-;10285:10;;;;;;;;;404:40381;;;;;;;;;;;;;;;37707:14;404:40381;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;7494:10;;404:40381;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;;;;;12010:18;404:40381;;-1:-1:-1;;;;;404:40381:10;11989:58;404:40381;;;;;;;;;11997:36;11989:58;:::i;:::-;404:40381;;;;;12057:62;;;;;404:40381;;-1:-1:-1;;;12057:62:10;;12097:4;404:40381;12057:62;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;12057:62;;;;;;;;404:40381;;;;;;;;12010:18;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;12176:19;404:40381;;;;;;;;;;;;;;;;;12256:13;404:40381;;;;;;;;;;;;;;;;;12318:10;12314:401;12330:5;;;;;;12314:401;404:40381;;;;;;;;12736:8;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;12800:1;404:40381;12874:5;;;;;;12858:1066;404:40381;;13976:29;404:40381;;;13943:17;404:40381;;13943:17;:::i;:::-;404:40381;;;;;;;;;;13976:29;;404:40381;;12862:10;404:40381;;;;;12736:8;404:40381;;;12903:28;404:40381;;;;12903:28;:::i;:::-;404:40381;;;;;;;;;;;12903:33;12900:1010;404:40381;;;;;12960:64;404:40381;;;12960:28;404:40381;12991:33;404:40381;;;13976:29;404:40381;;;;;;;12736:8;404:40381;;;;;;;12991:33;:::i;:::-;404:40381;;;;;;;;;;;;;12736:8;404:40381;;;;;12960:28;:::i;:64::-;404:40381;;;12736:8;404:40381;;13046:29;404:40381;;;13046:29;:::i;:::-;13100:5;;;;;;;;;12900:1010;404:40381;;;;;12736:8;404:40381;;;13133:36;404:40381;;;;;;;;;13133:36;;:::i;:::-;404:40381;;;;;;;;;;;;;13133:41;404:40381;;;;13198:64;404:40381;;;13198:28;404:40381;13229:33;404:40381;;;13976:29;404:40381;;;;;;;12736:8;404:40381;;;;;;;13229:33;:::i;13130:780::-;404:40381;;;;;12736:8;404:40381;;;13371:32;404:40381;;;;;;13371:32;;:::i;:::-;404:40381;;;;;;;;;;;;;13371:37;404:40381;;;;13432:64;404:40381;;;13432:28;404:40381;13463:33;404:40381;;;13976:29;404:40381;;;;;;;12736:8;404:40381;;;;;;;13463:33;:::i;13368:542::-;404:40381;;;;;12736:8;404:40381;;;13605:32;404:40381;;;;;;13605:32;;:::i;:::-;404:40381;;;;;;;;;;;;;13605:37;404:40381;;;;13666:64;404:40381;;;13666:28;404:40381;13697:33;404:40381;;;13976:29;404:40381;;;;;;;12736:8;404:40381;;;;;;;13697:33;:::i;13602:308::-;404:40381;12800:1;404:40381;13883:8;12862:10;;404:40381;;;-1:-1:-1;;;404:40381:10;;;;;;12318:10;404:40381;;;;;;;;;;;;;;;;;;12355:44;404:40381;;;;12355:44;:::i;:::-;404:40381;;;;;;;;;;;;;;;12355:49;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12424:96;12471:49;;;12424:44;12471:49;404:40381;12471:49;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;;12424:44;:::i;:96::-;404:40381;;;;;;;;;;;;;;;;;12538:45;404:40381;;;12538:45;:::i;:::-;12604:5;;;;;404:40381;;;-1:-1:-1;;;404:40381:10;;;;;;12352:353;404:40381;;;;;12682:8;12318:10;;12057:62;;;;:::i;:::-;404:40381;;12057:62;;;;404:40381;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;404:40381:10;8453:24;404:40381;;;;;;;;;;;;8453:24;404:40381;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;468:32:10;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;;40033:9;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;40349:8;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;3678:25;404:40381;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;-1:-1:-1;;;;;404:40381:10;;:::i;:::-;;;;;;;9635:15;404:40381;;;;;;;;;;;;;;;;;;;;;;9696:20;;;;:::i;:::-;9731:10;;9743;;;;;;404:40381;;;;;;;:::i;9731:10::-;404:40381;;;;;;;;;;;;;;;;;9796:31;404:40381;;;;9796:31;:::i;:::-;404:40381;;;;;;;9770:58;;;;:::i;:::-;404:40381;;9731:10;;404:40381;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;;:::i;:::-;7494:10;;404:40381;;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;;;;;;;;;14902:16;404:40381;;-1:-1:-1;;;;;404:40381:10;;;;;;;;14881:56;404:40381;;;14889:34;;;14881:56;:::i;:::-;14955:10;404:40381;;14947:67;;;;;;404:40381;;-1:-1:-1;;;14947:67:10;;14992:4;404:40381;14947:67;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;;14947:67;;;;;;;;;;;;;404:40381;;;;;14902:16;404:40381;;;;;-1:-1:-1;;;;;;404:40381:10;;;;;;;;15074:11;404:40381;;;;;;;;15117:10;;15113:327;15129:5;;;;;;15113:327;-1:-1:-1;;15449:15:10;404:40381;15479:27;;404:40381;;15449:15;404:40381;;;15449:15;:::i;15117:10::-;404:40381;;;;;;;;;15154:25;404:40381;;;;15154:25;:::i;:::-;404:40381;;;;;;;;;15154:32;404:40381;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;15234:30;15206:58;15234:30;;15479:27;15234:30;;;;15206:25;15234:30;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;15206:25;:::i;:58::-;404:40381;;;;;15282:26;404:40381;;;15282:26;:::i;:::-;15329:5;;;;;;404:40381;;;-1:-1:-1;;;404:40381:10;;;;;;15151:279;404:40381;;;;;15407:8;15117:10;;14947:67;;;;:::i;:::-;404:40381;;14947:67;;;;404:40381;;;;;;;;;;;;;;-1:-1:-1;;;;;506:28:10;404:40381;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;726:79:10;404:40381;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;38204:20;404:40381;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::i;:::-;;;;37962:18;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;38522:17;404:40381;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;3709:28;404:40381;;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;7494:10;404:40381;;;;7480:13;404:40381;;7472:64;404:40381;;;;;;7472:64;:::i;:::-;404:40381;;;;;;;30147:10;30140:17;29950:2255;404:40381;30172:12;;404:40381;;;30251:44;404:40381;;;30261:1;404:40381;;30251:9;404:40381;;30265:28;404:40381;;;;;;;;30265:28;;:::i;30251:44::-;404:40381;;;;;;;;;;;;;;30225:18;404:40381;;;;;;;;30311:294;;30315:24;;;404:40381;;;;;30392:54;;;;;;404:40381;;-1:-1:-1;;;30392:54:10;;-1:-1:-1;;;;;404:40381:10;;;;30392:54;;404:40381;;;;;;;;;;;;;;;;;;;;;;;;30392:54;;;;;;;;30311:294;;;404:40381;30311:294;;32168:30;30311:294;;;404:40381;;;;30625:20;404:40381;;;-1:-1:-1;;;;;;404:40381:10;;;;;30168:1986;404:40381;;;;;;;;;;;32168:30;404:40381;;;;;;30392:54;;;;;:::i;:::-;404:40381;;30392:54;;;;404:40381;;;;;;;;;30311:294;404:40381;;;;;30530:60;;;;;404:40381;;-1:-1:-1;;;30530:60:10;;30572:4;404:40381;30530:60;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;30530:60;;;;;;;;30311:294;;;404:40381;30311:294;;32168:30;30311:294;;;;30530:60;;;;;:::i;:::-;404:40381;;30530:60;;;30168:1986;30682:1;30671:12;;30682:1;;404:40381;30750:44;404:40381;;;30682:1;404:40381;;30750:9;404:40381;;30764:28;404:40381;;;;;;;;30764:28;;:::i;30750:44::-;404:40381;;;;;;;;;;;;;;30724:18;404:40381;;;;;;;;30810:294;;30814:24;;;404:40381;;;;;30891:54;;;;;;404:40381;;-1:-1:-1;;;30891:54:10;;-1:-1:-1;;;;;404:40381:10;;;;30891:54;;404:40381;;;;;;;;;;;;;;;;;;;;;;;;30891:54;;;;;;;;30810:294;;;404:40381;30810:294;;32168:30;30810:294;;;404:40381;;;;31124:20;404:40381;;;-1:-1:-1;;;;;;404:40381:10;;;;;30168:1986;;30891:54;;;;;:::i;:::-;404:40381;;30891:54;;;30810:294;404:40381;;;;;31029:60;;;;;404:40381;;-1:-1:-1;;;31029:60:10;;31071:4;404:40381;31029:60;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;31029:60;;;;;;;;30810:294;;;404:40381;30810:294;;32168:30;30810:294;;;;31029:60;;;;;:::i;:::-;404:40381;;31029:60;;;30667:1487;404:40381;;31170:12;;;31181:1;;404:40381;;;31245:44;404:40381;;30682:1;404:40381;;31245:9;404:40381;;31259:28;404:40381;;;;;;;;31259:28;;:::i;31245:44::-;404:40381;;;;;;;;;;;;;;31219:18;404:40381;;;;;;;;31305:294;;31309:24;;;404:40381;;31386:54;;;;;;404:40381;;-1:-1:-1;;;31386:54:10;;-1:-1:-1;;;;;404:40381:10;;;;31386:54;;404:40381;;;;;;;;;;;;;;;;;;;;;;;;31386:54;;;;;;;;31305:294;;;404:40381;31305:294;;32168:30;31305:294;;;404:40381;;;;31619:16;404:40381;;;-1:-1:-1;;;;;;404:40381:10;;;;;30168:1986;;31386:54;;;;;:::i;:::-;404:40381;;31386:54;;;31305:294;404:40381;;;-1:-1:-1;;31524:60:10;;;;;404:40381;;-1:-1:-1;;;31524:60:10;;31566:4;404:40381;31524:60;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;31524:60;;;;;;;;31305:294;;;404:40381;31305:294;;32168:30;31305:294;;;;31524:60;;;;;:::i;:::-;404:40381;;31524:60;;;31166:988;31661:12;;;;;;;;404:40381;31661:12;31657:497;;31166:988;;;;;;;;;32168:30;31166:988;30168:1986;;31657:497;404:40381;;;;31742:44;404:40381;;30682:1;404:40381;;31742:9;404:40381;;31756:28;404:40381;;;;;;;;31756:28;;:::i;31742:44::-;404:40381;;;;;;;;;;;;;;31716:18;404:40381;;;;;;;;;31708:80;;31802:294;;31806:24;;;404:40381;;31883:54;;;;;404:40381;;-1:-1:-1;;;31883:54:10;;-1:-1:-1;;;;;404:40381:10;;;;31883:54;;404:40381;;;;;;;;;;;;;;;;;;;;;;;;31883:54;;;;;;;;31802:294;;;404:40381;31802:294;;32168:30;31802:294;;;404:40381;;;;32116:22;404:40381;;;-1:-1:-1;;;;;;404:40381:10;;;;;31657:497;;;;;;;31883:54;;;;;:::i;:::-;404:40381;;31883:54;;;31802:294;404:40381;;;-1:-1:-1;;;32021:60:10;;;;;404:40381;;-1:-1:-1;;;32021:60:10;;32063:4;404:40381;32021:60;;404:40381;-1:-1:-1;;;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;32021:60;;;;;;;;;404:40381;32021:60;32168:30;32021:60;;;;;31802:294;;;;;32021:60;;;;:::i;:::-;;;;404:40381;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1063:62:0;;;:::i;:::-;404:40381:10;;;40150:13;404:40381;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;;;;;:::i;:::-;;;;954:49;404:40381;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;404:40381:10;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1359:130:0:-;-1:-1:-1;;;;;1273:6:0;404:40381:10;;719:10:6;1422:23:0;404:40381:10;;1359:130:0:o;404:40381:10:-;;;;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;-1:-1:-1;;404:40381:10;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;404:40381:10;;;-1:-1:-1;404:40381:10;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;404:40381:10;;:::o;25974:590::-;;;;-1:-1:-1;;;;;404:40381:10;-1:-1:-1;;404:40381:10;;;;26087:15;404:40381;;;;;;;;;;;;;;;;;;;;;;;26151:10;26147:411;26163:5;;;;;;26147:411;25974:590;;;;;;;;;;:::o;26151:10::-;404:40381;;;;;;;;;;;;;;26188:46;404:40381;;;;26188:46;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;26188:53;26185:363;404:40381;;;-1:-1:-1;404:40381:10;;;;;;;;;;;;;;;;;-1:-1:-1;;404:40381:10;;;;;;;26310:51;26379:47;26310:51;;;;26261:46;26310:51;26261:100;26310:51;;:::i;:::-;404:40381;;;;;;;;;;;;;;;;;;;;;;;;26261:46;:::i;:100::-;404:40381;;;;;;;;;;;;26379:47;:::i;:::-;26447:5;;;;;;;;;;;26185:363;404:40381;;;;;;;;26525:8;26151:10;;404:40381;;;;;;;:::o;:::-;-1:-1:-1;;;404:40381:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://90ad14d3cbe7c32d98e42e3f2db2e72bb27c64d6683e6f7c052a499fb95ef107

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.