ETH Price: $3,377.25 (-1.94%)
Gas: 2 Gwei

Contract

0x6113Fd2c91514e84e6149C6edE47F2e09545253a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Pay Artist192903282024-02-23 12:35:47126 days ago1708691747IN
0x6113Fd2c...09545253a
0 ETH0.0026331936.28435539
Accept Addresses...192903232024-02-23 12:34:47126 days ago1708691687IN
0x6113Fd2c...09545253a
0 ETH0.0016121436.74325856
Propose Secondar...192903182024-02-23 12:33:47126 days ago1708691627IN
0x6113Fd2c...09545253a
0 ETH0.0057513535.9181415
Propose Primary ...192903162024-02-23 12:33:23126 days ago1708691603IN
0x6113Fd2c...09545253a
0 ETH0.0060926538.02896917
Set Primary And ...192887482024-02-23 7:17:23126 days ago1708672643IN
0x6113Fd2c...09545253a
0 ETH0.0043094835.29992111
Mint191943662024-02-10 1:14:11139 days ago1707527651IN
0x6113Fd2c...09545253a
0.06529 ETH0.0012290430
Set Collection P...191853872024-02-08 19:00:23141 days ago1707418823IN
0x6113Fd2c...09545253a
0 ETH0.0024729750.05212568
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.0044398470.77585847
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.004499771.77585847
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.01634621260.77585847
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.0188181300
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.04706625750
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.0473317755
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.2751756850
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.27590664858.77585847
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.2930028905
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.33170641,025
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.33176791,025
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.35610961,100
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.433174821,338
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.43693021,350
Mint191853362024-02-08 18:50:11141 days ago1707418211IN
0x6113Fd2c...09545253a
0.06529 ETH0.530110351,650
Mint191853352024-02-08 18:49:59141 days ago1707418199IN
0x6113Fd2c...09545253a
0.06529 ETH0.0021589660.24396675
Set Collection P...191852892024-02-08 18:40:47141 days ago1707417647IN
0x6113Fd2c...09545253a
0 ETH0.004864182.29743747
Mint191852812024-02-08 18:39:11141 days ago1707417551IN
0x6113Fd2c...09545253a
0.06529 ETH0.0252600779.04024859
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
192903282024-02-23 12:35:47126 days ago1708691747
0x6113Fd2c...09545253a
24.1573 ETH
192903282024-02-23 12:35:47126 days ago1708691747
0x6113Fd2c...09545253a
41.1327 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NextGenMinterContract

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 7: MinterContract.sol
// SPDX-License-Identifier: MIT

/**
 *
 *  @title: NextGen 6529 - Minter Contract
 *  @date: 20-December-2023
 *  @version: 1.10
 *  @author: 6529 team
 */

pragma solidity ^0.8.19;

import "./INextGenCore.sol";
import "./IDelegationManagementContract.sol";
import "./MerkleProof.sol";
import "./INextGenAdmins.sol";
import "./IERC721.sol";

contract NextGenMinterContract {

    // total funds collected during minting per collection
    mapping (uint256 => uint256) public collectionTotalAmount;

    // timestamp of last mint for used in sales model 3
    mapping (uint256 => uint) public lastMintDate;

    // tokens airdropped per collection
    mapping (uint256 => uint256) public excludeTokensCounter;

    // burn or swap address during burnOrSwap functionality
    mapping (bytes32 => address) public burnOrSwapAddress;

    // token ids set during burnOrSwap functionality
    mapping (bytes32 => uint256[2]) private burnOrSwapIds;

    // burnToMint initialization --> burn a token on a NextGen collection and mint a token on a new NextGen collection
    mapping (uint256 => mapping (uint256 => bool)) public burnToMintCollections;

    // burnOrSwap initialization --> burn a token on an external ERC721 collection and mint a token on a NextGen collection
    mapping (bytes32 => mapping (uint256 => bool)) public burnExternalToMintCollections;

    // checks if minting costs for a collectionwere set
    mapping (uint256 => bool) private setMintingCosts;

    // struct that holds minting costs and phases
    struct collectionPhasesDataStructure {
        uint allowlistStartTime;
        uint allowlistEndTime;
        uint publicStartTime;
        uint publicEndTime;
        bytes32 merkleRoot;
        uint256 collectionMintCost;
        uint256 collectionEndMintCost;
        uint256 timePeriod;
        uint256 rate;
        uint8 salesOption;
        address delAddress;
    }

    // mapping of collectionPhasesData struct
    mapping (uint256 => collectionPhasesDataStructure) private collectionPhases;

    // struct that holds primary royalties
    struct royaltiesPrimarySplits {
        uint256 artistPercentage;
        uint256 teamPercentage;
    }

    // mapping of royaltiesPrimarySplits struct
    mapping (uint256 => royaltiesPrimarySplits) private collectionRoyaltiesPrimarySplits;

    // struct that holds addresses and percentages for primary splits
    struct collectionPrimaryAddresses {
        address primaryAdd1;
        address primaryAdd2;
        address primaryAdd3;
        uint256 add1Percentage;
        uint256 add2Percentage;
        uint256 add3Percentage;
        bool setStatus;
        bool approvedStatus;
    }

    // mapping of collectionPrimaryAndSecondaryAddresses struct
    mapping (uint256 => collectionPrimaryAddresses) private collectionArtistPrimaryAddresses;

    // struct that holds secondary royalties
    struct royaltiesSecondarySplits {
        uint256 artistPercentage;
        uint256 teamPercentage;
    }

    // mapping of royaltiesSecondarySplits struct

    mapping (uint256 => royaltiesSecondarySplits) private collectionRoyaltiesSecondarySplits;

    // struct that holds addresses and percentages for secondary splits
    struct collectionSecondaryAddresses {
        address secondaryAdd1;
        address secondaryAdd2;
        address secondaryAdd3;
        uint256 add1Percentage;
        uint256 add2Percentage;
        uint256 add3Percentage;
        bool setStatus;
        bool approvedStatus;
    }

    // mapping of collectionSecondaryAddresses struct
    mapping (uint256 => collectionSecondaryAddresses) private collectionArtistSecondaryAddresses;

    // mapping that holds the auction end time when a token is sent to auction
    mapping (uint256 => uint) private mintToAuctionData;

    // mapping that holds the auction status when a token is sent to auction
    mapping (uint256 => bool) private mintToAuctionStatus;

    //external contracts declaration
    INextGenCore public gencore;
    IDelegationManagementContract public dmc;
    INextGenAdmins private adminsContract;

    // events
    event Withdraw(address indexed _add, bool status, uint256 indexed funds);

    // constructor
    constructor (address _gencore, address _del, address _adminsContract) {
        gencore = INextGenCore(_gencore);
        dmc = IDelegationManagementContract(_del);
        adminsContract = INextGenAdmins(_adminsContract);
    }

    // certain functions can only be called by an admin or the artist

    modifier ArtistOrAdminRequired(uint256 _collectionID, bytes4 _selector) {
      require(msg.sender == gencore.retrieveArtistAddress(_collectionID) || adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true, "Not allowed");
      _;
    }

    // certain functions can only be called by a global or function admin

    modifier FunctionAdminRequired(bytes4 _selector) {
      require(adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true , "Not allowed");
      _;
    }

    // certain functions can only be called by a collection, global or function admin

    modifier CollectionAdminRequired(uint256 _collectionID, bytes4 _selector) {
      require(adminsContract.retrieveCollectionAdmin(msg.sender,_collectionID) == true || adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true, "Not allowed");
      _;
    }

    // function to add a collection's minting costs

    function setCollectionCosts(uint256 _collectionID, uint256 _collectionMintCost, uint256 _collectionEndMintCost, uint256 _rate, uint256 _timePeriod, uint8 _salesOption, address _delAddress) public CollectionAdminRequired(_collectionID, this.setCollectionCosts.selector) {
        require(gencore.retrievewereDataAdded(_collectionID) == true, "Add data");
        collectionPhases[_collectionID].collectionMintCost = _collectionMintCost;
        collectionPhases[_collectionID].collectionEndMintCost = _collectionEndMintCost;
        collectionPhases[_collectionID].rate = _rate;
        collectionPhases[_collectionID].timePeriod = _timePeriod;
        collectionPhases[_collectionID].salesOption = _salesOption;
        collectionPhases[_collectionID].delAddress = _delAddress;
        setMintingCosts[_collectionID] = true;
    }

    // function to add a collection's minting phases and merkleroot

    function setCollectionPhases(uint256 _collectionID, uint _allowlistStartTime, uint _allowlistEndTime, uint _publicStartTime, uint _publicEndTime, bytes32 _merkleRoot) public CollectionAdminRequired(_collectionID, this.setCollectionPhases.selector) {
        require(setMintingCosts[_collectionID] == true, "Set Costs");
        collectionPhases[_collectionID].allowlistStartTime = _allowlistStartTime;
        collectionPhases[_collectionID].allowlistEndTime = _allowlistEndTime;
        collectionPhases[_collectionID].merkleRoot = _merkleRoot;
        collectionPhases[_collectionID].publicStartTime = _publicStartTime;
        collectionPhases[_collectionID].publicEndTime = _publicEndTime;
    }

    // airdrop function
    
    function airDropTokens(address[] memory _recipients, string[] memory _tokenData, uint256[] memory _saltfun_o, uint256 _collectionID, uint256[] memory _numberOfTokens) public FunctionAdminRequired(this.airDropTokens.selector) {
        require(gencore.retrievewereDataAdded(_collectionID) == true, "Add data");
        uint256 collectionTokenMintIndex;
        for (uint256 y=0; y< _recipients.length; y++) {
            collectionTokenMintIndex = gencore.viewTokensIndexMin(_collectionID) + gencore.viewCirSupply(_collectionID) + _numberOfTokens[y] - 1;
            require(collectionTokenMintIndex <= gencore.viewTokensIndexMax(_collectionID), "No supply");
            for(uint256 i = 0; i < _numberOfTokens[y]; i++) {
                uint256 mintIndex = gencore.viewTokensIndexMin(_collectionID) + gencore.viewCirSupply(_collectionID);
                gencore.airDropTokens(mintIndex, _recipients[y], _tokenData[y], _saltfun_o[y], _collectionID);
            }
        }
    }

    // mint function for allowlist or public minting

    function mint(uint256 _collectionID, uint256 _numberOfTokens, uint256 _maxAllowance, string memory _tokenData, address _mintTo, bytes32[] calldata merkleProof, address _delegator, uint256 _saltfun_o) public payable {
        require(setMintingCosts[_collectionID] == true && _numberOfTokens > 0, "err");
        uint256 col = _collectionID;
        address mintingAddress;
        uint256 phase;
        string memory tokData = _tokenData;
        if (block.timestamp >= collectionPhases[col].allowlistStartTime && block.timestamp < collectionPhases[col].allowlistEndTime) {
            phase = 1;
            bytes32 node;
            if (_delegator != 0x0000000000000000000000000000000000000000) {
                bool isAllowedToMint;
                isAllowedToMint = dmc.retrieveGlobalStatusOfDelegation(_delegator, 0x8888888888888888888888888888888888888888, msg.sender, 1) || dmc.retrieveGlobalStatusOfDelegation(_delegator, 0x8888888888888888888888888888888888888888, msg.sender, 2);
                if (isAllowedToMint == false) {
                isAllowedToMint = dmc.retrieveGlobalStatusOfDelegation(_delegator, collectionPhases[col].delAddress, msg.sender, 1) || dmc.retrieveGlobalStatusOfDelegation(_delegator, collectionPhases[col].delAddress, msg.sender, 2);    
                }
                require(isAllowedToMint == true, "No delegation");
                node = keccak256(bytes.concat(keccak256((abi.encodePacked(_delegator, _maxAllowance, tokData)))));
                require(_maxAllowance >= gencore.retrieveTokensMintedALPerAddress(col, _delegator) + _numberOfTokens, "AL limit");
                mintingAddress = _delegator;
            } else {
                node = keccak256(bytes.concat(keccak256((abi.encodePacked(msg.sender, _maxAllowance, tokData)))));
                require(_maxAllowance >= gencore.retrieveTokensMintedALPerAddress(col, msg.sender) + _numberOfTokens, "AL limit");
                mintingAddress = msg.sender;
            }
            require(MerkleProof.verifyCalldata(merkleProof, collectionPhases[col].merkleRoot, node), 'invalid proof');
        } else if (block.timestamp >= collectionPhases[col].publicStartTime && block.timestamp <= collectionPhases[col].publicEndTime) {
            phase = 2;
            require(_numberOfTokens <= gencore.viewMaxAllowance(col), "Change no of tokens");
            require(gencore.retrieveTokensMintedPublicPerAddress(col, msg.sender) + _numberOfTokens <= gencore.viewMaxAllowance(col), "Max");
            mintingAddress = msg.sender;
            tokData = '"public"';
        } else {
            revert("No minting");
        }
        uint256 collectionTokenMintIndex;
        collectionTokenMintIndex = gencore.viewTokensIndexMin(col) + gencore.viewCirSupply(col) + _numberOfTokens - 1;
        require(collectionTokenMintIndex <= gencore.viewTokensIndexMax(col), "No supply");
        require(msg.value >= (getPrice(col) * _numberOfTokens), "Wrong ETH");
        // refund excess
        {
            uint256 excess = calculateExcess(msg.value, getPrice(col) * _numberOfTokens);
            collectionTotalAmount[col] = collectionTotalAmount[col] + msg.value - excess;
        }
        // check mechanism for sale option 3
        if (collectionPhases[col].salesOption == 3) {
            uint timeOfLastMint;
            if (lastMintDate[col] == 0) {
                // for only public minting set the allowliststarttime as publicstarttime
                timeOfLastMint = collectionPhases[col].allowlistStartTime - collectionPhases[col].timePeriod;
            } else {
                timeOfLastMint =  lastMintDate[col];
            }
            // calculate periods and check if a period has passed in order to allow minting
            uint tDiff = (block.timestamp - timeOfLastMint) / collectionPhases[col].timePeriod;
            // users are able to mint after a period passes
            // unminted tokens from previous periods are transferred for minting into new periods
            // 1 mint at a time period
            require(tDiff>=1 && _numberOfTokens == 1, "1 mint/period");
            // exclude tokens ex. airdrop tokens so they do not affect lastMintDate
            lastMintDate[col] = collectionPhases[col].allowlistStartTime + (collectionPhases[col].timePeriod * (gencore.viewCirSupply(col) - excludeTokensCounter[col]));
        }
        // mint tokens
        for(uint256 i = 0; i < _numberOfTokens; i++) {
            uint256 mintIndex = gencore.viewTokensIndexMin(col) + gencore.viewCirSupply(col);
            gencore.mint(mintIndex, mintingAddress, _mintTo, tokData, _saltfun_o, col, phase);
        }
    }

    // burn to mint function (does not require contract approval)

    function burnToMint(uint256 _burnCollectionID, uint256 _tokenId, uint256 _mintCollectionID, uint256 _saltfun_o) public payable {
        require(setMintingCosts[_mintCollectionID] == true && burnToMintCollections[_burnCollectionID][_mintCollectionID] == true, "init err");
        require(block.timestamp >= collectionPhases[_mintCollectionID].publicStartTime && block.timestamp <= collectionPhases[_mintCollectionID].publicEndTime,"No minting");
        require ((_tokenId >= gencore.viewTokensIndexMin(_burnCollectionID)) && (_tokenId <= gencore.viewTokensIndexMax(_burnCollectionID)), "col/token id error");
        uint256 collectionTokenMintIndex;
        collectionTokenMintIndex = gencore.viewTokensIndexMin(_mintCollectionID) + gencore.viewCirSupply(_mintCollectionID);
        require(collectionTokenMintIndex <= gencore.viewTokensIndexMax(_mintCollectionID), "No supply");
        require(msg.value >= getPrice(_mintCollectionID), "Wrong ETH");
        // refund excess
        {
            uint256 excess = calculateExcess(msg.value, getPrice(_mintCollectionID));
            collectionTotalAmount[_mintCollectionID] = collectionTotalAmount[_mintCollectionID] + msg.value - excess;
        }
        uint256 mintIndex = gencore.viewTokensIndexMin(_mintCollectionID) + gencore.viewCirSupply(_mintCollectionID);
        // burn and mint token
        address burner = msg.sender;
        gencore.burnToMint(mintIndex, _burnCollectionID, _tokenId, _mintCollectionID, _saltfun_o, burner);
    }

    // mint and auction
    
    function mintAndAuction(address _recipient, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID, uint _auctionEndTime) public FunctionAdminRequired(this.mintAndAuction.selector) {
        require(gencore.retrievewereDataAdded(_collectionID) == true, "Add data");
        uint256 collectionTokenMintIndex;
        collectionTokenMintIndex = gencore.viewTokensIndexMin(_collectionID) + gencore.viewCirSupply(_collectionID);
        require(collectionTokenMintIndex <= gencore.viewTokensIndexMax(_collectionID), "No supply");
        uint256 mintIndex = gencore.viewTokensIndexMin(_collectionID) + gencore.viewCirSupply(_collectionID);
        uint timeOfLastMint;
        // 1 token per period can be minted and send to auction
        // time period can be set for any sales model
        if (lastMintDate[_collectionID] == 0) {
        // for public sale set the allowliststarttime the same time as publicstarttime
            timeOfLastMint = collectionPhases[_collectionID].allowlistStartTime - collectionPhases[_collectionID].timePeriod;
        } else {
            timeOfLastMint =  lastMintDate[_collectionID];
        }
        // calculate periods and check if a period has passed in order to allow minting
        uint tDiff = (block.timestamp - timeOfLastMint) / collectionPhases[_collectionID].timePeriod;
        // admins are able to mint after a period passes
        require(tDiff>=1, "1 mint/period");
        lastMintDate[_collectionID] = collectionPhases[_collectionID].allowlistStartTime + (collectionPhases[_collectionID].timePeriod * ((gencore.viewCirSupply(_collectionID) - excludeTokensCounter[_collectionID])));
        require(_auctionEndTime >= block.timestamp + 600); // 10mins min auction
        mintToAuctionData[mintIndex] = _auctionEndTime;
        mintToAuctionStatus[mintIndex] = true;
        // token is airdropped to the _recipient address
        gencore.airDropTokens(mintIndex, _recipient, _tokenData, _saltfun_o, _collectionID);
    }

    // function to exclude a specific no of tokens during sales model 3 or reset lastMintDate

    function excludeTokensOrResetLD(uint256 _option, uint256 _collectionID, uint256 _excludeCounter) public FunctionAdminRequired(this.excludeTokensOrResetLD.selector) { 
        if (_option == 1) {
            excludeTokensCounter[_collectionID] = _excludeCounter;
        } else {
            lastMintDate[_collectionID] = 0;
        }  
    }

    // function to refund any excess amount

    function calculateExcess(uint256 _value, uint256 _price) internal returns(uint256) {
        uint256 excess;
        excess = _value - _price;
        (bool success1, ) = payable(msg.sender).call{value: excess}("");
        require(success1, "ETH failed");
        return(excess);
    }

    // function to initialize burn to mint for NextGen collections

    function initializeBurn(uint256 _burnCollectionID, uint256 _mintCollectionID, bool _status) public FunctionAdminRequired(this.initializeBurn.selector) { 
        require((gencore.retrievewereDataAdded(_burnCollectionID) == true) && (gencore.retrievewereDataAdded(_mintCollectionID) == true), "No data");
        burnToMintCollections[_burnCollectionID][_mintCollectionID] = _status;
    }

    // function to initialize external burn or swap to mint

    function initializeExternalBurnOrSwap(address _erc721Collection, uint256 _burnCollectionID, uint256 _mintCollectionID, uint256 _tokmin, uint256 _tokmax, address _burnOrSwapAddress, bool _status) public FunctionAdminRequired(this.initializeExternalBurnOrSwap.selector) { 
        bytes32 externalCol = keccak256(abi.encodePacked(_erc721Collection,_burnCollectionID));
        require((gencore.retrievewereDataAdded(_mintCollectionID) == true), "No data");
        burnExternalToMintCollections[externalCol][_mintCollectionID] = _status;
        burnOrSwapAddress[externalCol] = _burnOrSwapAddress;
        burnOrSwapIds[externalCol][0] = _tokmin;
        burnOrSwapIds[externalCol][1] = _tokmax;
    }

    // burn or swap to mint (requires contract approval)

    function burnOrSwapExternalToMint(address _erc721Collection, uint256 _burnCollectionID, uint256 _tokenId, uint256 _mintCollectionID, string memory _tokenData, bytes32[] calldata merkleProof, uint256 _saltfun_o) public payable {
        bytes32 externalCol = keccak256(abi.encodePacked(_erc721Collection,_burnCollectionID));
        require(setMintingCosts[_mintCollectionID] == true && burnExternalToMintCollections[externalCol][_mintCollectionID] == true, "init err");
        address ownerOfToken = IERC721(_erc721Collection).ownerOf(_tokenId);
        if (msg.sender != ownerOfToken) {
            bool isAllowedToMint;
            isAllowedToMint = dmc.retrieveGlobalStatusOfDelegation(ownerOfToken, 0x8888888888888888888888888888888888888888, msg.sender, 1) || dmc.retrieveGlobalStatusOfDelegation(ownerOfToken, 0x8888888888888888888888888888888888888888, msg.sender, 2);
            if (isAllowedToMint == false) {
            isAllowedToMint = dmc.retrieveGlobalStatusOfDelegation(ownerOfToken, _erc721Collection, msg.sender, 1) || dmc.retrieveGlobalStatusOfDelegation(ownerOfToken, _erc721Collection, msg.sender, 2);    
            }
            require(isAllowedToMint == true, "No delegation");
        }
        require(_tokenId >= burnOrSwapIds[externalCol][0] && _tokenId <= burnOrSwapIds[externalCol][1], "Token id does not match");
        IERC721(_erc721Collection).safeTransferFrom(ownerOfToken, burnOrSwapAddress[externalCol], _tokenId);
        uint256 col = _mintCollectionID;
        address mintingAddress;
        uint256 phase;
        string memory tokData = _tokenData;
        if (block.timestamp >= collectionPhases[col].allowlistStartTime && block.timestamp < collectionPhases[col].allowlistEndTime) {
            phase = 1;
            bytes32 node;
            node = keccak256(bytes.concat(keccak256((abi.encodePacked(_tokenId, tokData)))));
            mintingAddress = ownerOfToken;
            require(MerkleProof.verifyCalldata(merkleProof, collectionPhases[col].merkleRoot, node), 'invalid proof');            
        } else if (block.timestamp >= collectionPhases[col].publicStartTime && block.timestamp <= collectionPhases[col].publicEndTime) {
            phase = 2;
            mintingAddress = ownerOfToken;
            tokData = '"public"';
        } else {
            revert("No minting");
        }
        uint256 collectionTokenMintIndex;
        collectionTokenMintIndex = gencore.viewTokensIndexMin(col) + gencore.viewCirSupply(col);
        require(collectionTokenMintIndex <= gencore.viewTokensIndexMax(col), "No supply");
        require(msg.value >= getPrice(col), "Wrong ETH");
        // refund excess
        {
            uint256 excess = calculateExcess(msg.value, getPrice(col));
            collectionTotalAmount[col] = collectionTotalAmount[col] + msg.value - excess;
        }
        uint256 mintIndex = gencore.viewTokensIndexMin(col) + gencore.viewCirSupply(col);
        gencore.mint(mintIndex, mintingAddress, ownerOfToken, tokData, _saltfun_o, col, phase);
    }

    // function to set primary splits

    function setPrimaryAndSecondarySplits(uint256 _collectionID, uint256 _artistPrSplit, uint256 _teamPrSplit, uint256 _artistSecSplit, uint256 _teamSecSplit) public FunctionAdminRequired(this.setPrimaryAndSecondarySplits.selector) {
        require(_artistPrSplit + _teamPrSplit == 100, "splits need to be 100%");
        require(_artistSecSplit + _teamSecSplit == 100, "splits need to be 100%");
        collectionRoyaltiesPrimarySplits[_collectionID].artistPercentage = _artistPrSplit;
        collectionRoyaltiesPrimarySplits[_collectionID].teamPercentage = _teamPrSplit;
        collectionRoyaltiesSecondarySplits[_collectionID].artistPercentage = _artistSecSplit;
        collectionRoyaltiesSecondarySplits[_collectionID].teamPercentage = _teamSecSplit;
    }

    // function to propose primary addresses and percentages for each address

    function proposePrimaryAddressesAndPercentages(uint256 _collectionID, address _primaryAdd1, address _primaryAdd2, address _primaryAdd3, uint256 _add1Percentage, uint256 _add2Percentage, uint256 _add3Percentage) public ArtistOrAdminRequired(_collectionID, this.proposePrimaryAddressesAndPercentages.selector) {
        require (collectionArtistPrimaryAddresses[_collectionID].approvedStatus == false, "Already approved");
        require (_add1Percentage + _add2Percentage + _add3Percentage == collectionRoyaltiesPrimarySplits[_collectionID].artistPercentage, "Check %");
        collectionArtistPrimaryAddresses[_collectionID].primaryAdd1 = _primaryAdd1;
        collectionArtistPrimaryAddresses[_collectionID].primaryAdd2 = _primaryAdd2;
        collectionArtistPrimaryAddresses[_collectionID].primaryAdd3 = _primaryAdd3;
        collectionArtistPrimaryAddresses[_collectionID].add1Percentage = _add1Percentage;
        collectionArtistPrimaryAddresses[_collectionID].add2Percentage = _add2Percentage;
        collectionArtistPrimaryAddresses[_collectionID].add3Percentage = _add3Percentage;
        collectionArtistPrimaryAddresses[_collectionID].setStatus = true;
        collectionArtistPrimaryAddresses[_collectionID].approvedStatus = false;
    }

    // function to propose secondary addresses and percentages for each address

    function proposeSecondaryAddressesAndPercentages(uint256 _collectionID, address _secondaryAdd1, address _secondaryAdd2, address _secondaryAdd3, uint256 _add1Percentage, uint256 _add2Percentage, uint256 _add3Percentage) public ArtistOrAdminRequired(_collectionID, this.proposeSecondaryAddressesAndPercentages.selector) {
        require (collectionArtistSecondaryAddresses[_collectionID].approvedStatus == false, "Already approved");
        require (_add1Percentage + _add2Percentage + _add3Percentage == collectionRoyaltiesSecondarySplits[_collectionID].artistPercentage, "Check %");
        collectionArtistSecondaryAddresses[_collectionID].secondaryAdd1 = _secondaryAdd1;
        collectionArtistSecondaryAddresses[_collectionID].secondaryAdd2 = _secondaryAdd2;
        collectionArtistSecondaryAddresses[_collectionID].secondaryAdd3 = _secondaryAdd3;
        collectionArtistSecondaryAddresses[_collectionID].add1Percentage = _add1Percentage;
        collectionArtistSecondaryAddresses[_collectionID].add2Percentage = _add2Percentage;
        collectionArtistSecondaryAddresses[_collectionID].add3Percentage = _add3Percentage;
        collectionArtistSecondaryAddresses[_collectionID].setStatus = true;
        collectionArtistSecondaryAddresses[_collectionID].approvedStatus = false;
    }

    // function to accept primary addresses and percentages

    function acceptAddressesAndPercentages(uint256 _collectionID, bool _statusPrimary, bool _statusSecondary) public FunctionAdminRequired(this.acceptAddressesAndPercentages.selector) {
        require(collectionArtistPrimaryAddresses[_collectionID].setStatus == true && collectionArtistSecondaryAddresses[_collectionID].setStatus == true, "Propose Addresses");
        collectionArtistPrimaryAddresses[_collectionID].approvedStatus = _statusPrimary;
        collectionArtistSecondaryAddresses[_collectionID].approvedStatus = _statusSecondary;
        if (_statusPrimary == false) {
            collectionArtistPrimaryAddresses[_collectionID].setStatus = false;
        } else if (_statusSecondary == false) {
            collectionArtistSecondaryAddresses[_collectionID].setStatus = false;
        }
    }

    // function to transfer funds to the artist and team

    function payArtist(uint256 _collectionID, address _team1, address _team2, uint256 _teamperc1, uint256 _teamperc2) public FunctionAdminRequired(this.payArtist.selector) {
        require(collectionArtistPrimaryAddresses[_collectionID].approvedStatus == true, "Accept Royalties");
        require(collectionTotalAmount[_collectionID] > 0, "Collection Balance must be grater than 0");
        require(collectionRoyaltiesPrimarySplits[_collectionID].artistPercentage + _teamperc1 + _teamperc2 == 100, "Change percentages");
        uint256 royalties = collectionTotalAmount[_collectionID];
        collectionTotalAmount[_collectionID] = 0;
        address tm1 = _team1;
        address tm2 = _team2;
        uint256 colId = _collectionID;
        uint256 artistRoyalties1;
        uint256 artistRoyalties2;
        uint256 artistRoyalties3;
        uint256 teamRoyalties1;
        uint256 teamRoyalties2;
        artistRoyalties1 = royalties * collectionArtistPrimaryAddresses[colId].add1Percentage / 100;
        artistRoyalties2 = royalties * collectionArtistPrimaryAddresses[colId].add2Percentage / 100;
        artistRoyalties3 = royalties * collectionArtistPrimaryAddresses[colId].add3Percentage / 100;
        teamRoyalties1 = royalties * _teamperc1 / 100;
        teamRoyalties2 = royalties * _teamperc2 / 100;
        (bool success1, ) = payable(collectionArtistPrimaryAddresses[colId].primaryAdd1).call{value: artistRoyalties1}("");
        (bool success2, ) = payable(collectionArtistPrimaryAddresses[colId].primaryAdd2).call{value: artistRoyalties2}("");
        (bool success3, ) = payable(collectionArtistPrimaryAddresses[colId].primaryAdd3).call{value: artistRoyalties3}("");
        (bool success4, ) = payable(tm1).call{value: teamRoyalties1}("");
        (bool success5, ) = payable(tm2).call{value: teamRoyalties2}("");
        require(success1, "ETH failed");
        require(success2, "ETH failed");
        require(success3, "ETH failed");
        require(success4, "ETH failed");
        require(success5, "ETH failed");
    }

    // function to update core contract

    function updateCoreContract(address _gencore) public FunctionAdminRequired(this.updateCoreContract.selector) { 
        gencore = INextGenCore(_gencore);
    }

    // function to update admin contract

    function updateAdminContract(address _newadminsContract) public FunctionAdminRequired(this.updateAdminContract.selector) {
        require(INextGenAdmins(_newadminsContract).isAdminContract() == true, "Contract is not Admin");
        adminsContract = INextGenAdmins(_newadminsContract);
    }

    // function to withdraw any balance from the smart contract

    function emergencyWithdraw() public FunctionAdminRequired(this.emergencyWithdraw.selector) {
        uint balance = address(this).balance;
        address admin = adminsContract.owner();
        (bool success, ) = payable(admin).call{value: balance}("");
        require(success, "ETH failed");
        emit Withdraw(msg.sender, success, balance);
    }

    // function to retrieve primary splits between artist and team

    function retrievePrimarySplits(uint256 _collectionID) public view returns(uint256, uint256){
        return (collectionRoyaltiesPrimarySplits[_collectionID].artistPercentage, collectionRoyaltiesPrimarySplits[_collectionID].teamPercentage);
    }

    // function to retrieve primary addresses and percentages

    function retrievePrimaryAddressesAndPercentages(uint256 _collectionID) public view returns(address, address, address, uint256, uint256, uint256, bool){
        return (collectionArtistPrimaryAddresses[_collectionID].primaryAdd1, collectionArtistPrimaryAddresses[_collectionID].primaryAdd2, collectionArtistPrimaryAddresses[_collectionID].primaryAdd3, collectionArtistPrimaryAddresses[_collectionID].add1Percentage, collectionArtistPrimaryAddresses[_collectionID].add2Percentage, collectionArtistPrimaryAddresses[_collectionID].add3Percentage, collectionArtistPrimaryAddresses[_collectionID].approvedStatus);
    }

    // function to retrieve secondary splits between artist and team

    function retrieveSecondarySplits(uint256 _collectionID) public view returns(uint256, uint256){
        return (collectionRoyaltiesSecondarySplits[_collectionID].artistPercentage, collectionRoyaltiesSecondarySplits[_collectionID].teamPercentage);
    }

    // function to retrieve secondary addresses and percentages

    function retrieveSecondaryAddressesAndPercentages(uint256 _collectionID) public view returns(address, address, address, uint256, uint256, uint256, bool){
        return (collectionArtistSecondaryAddresses[_collectionID].secondaryAdd1, collectionArtistSecondaryAddresses[_collectionID].secondaryAdd2, collectionArtistSecondaryAddresses[_collectionID].secondaryAdd3, collectionArtistSecondaryAddresses[_collectionID].add1Percentage, collectionArtistSecondaryAddresses[_collectionID].add2Percentage, collectionArtistSecondaryAddresses[_collectionID].add3Percentage, collectionArtistSecondaryAddresses[_collectionID].approvedStatus);
    }

    // function to retrieve the phases and merkle root of a collection

    function retrieveCollectionPhases(uint256 _collectionID) public view returns(uint, uint, bytes32, uint, uint){
        return (collectionPhases[_collectionID].allowlistStartTime, collectionPhases[_collectionID].allowlistEndTime, collectionPhases[_collectionID].merkleRoot, collectionPhases[_collectionID].publicStartTime, collectionPhases[_collectionID].publicEndTime);
    }

    // function to retrieve the minting details of a collection

    function retrieveCollectionMintingDetails(uint256 _collectionID) public view returns(uint256, uint256, uint256, uint256, uint8, address){
        return (collectionPhases[_collectionID].collectionMintCost, collectionPhases[_collectionID].collectionEndMintCost, collectionPhases[_collectionID].rate, collectionPhases[_collectionID].timePeriod, collectionPhases[_collectionID].salesOption, collectionPhases[_collectionID].delAddress);
    }

    // retrieve minter contract status

    function isMinterContract() external view returns (bool) {
        return true;
    }

    // retrieve minting end time

    function getEndTime(uint256 _collectionID) external view returns (uint) {
        return collectionPhases[_collectionID].publicEndTime;
    }

    // retrieve auction end time

    function getAuctionEndTime(uint256 _tokenId) external view returns (uint) {
        return mintToAuctionData[_tokenId];
    }

    // retrieve auction status

    function getAuctionStatus(uint256 _tokenId) external view  returns (bool) {
        return mintToAuctionStatus[_tokenId];
    }

    // retrieve the minting price of collection

    function getPrice(uint256 _collectionId) public view returns (uint256) {
        uint tDiff;
        if (collectionPhases[_collectionId].salesOption == 3) {
            // periodic sale model
            // if rate > 0 minting price increases by rate (percentage) during each mint
            if (collectionPhases[_collectionId].rate > 0) {
                return collectionPhases[_collectionId].collectionMintCost + ((collectionPhases[_collectionId].collectionMintCost * collectionPhases[_collectionId].rate / 100) * (gencore.viewCirSupply(_collectionId) - excludeTokensCounter[_collectionId]));
            } else {
                return collectionPhases[_collectionId].collectionMintCost;
            }
        } else if (collectionPhases[_collectionId].salesOption == 2 && block.timestamp >= collectionPhases[_collectionId].allowlistStartTime && block.timestamp <= collectionPhases[_collectionId].publicEndTime){
            // decreases during a time period
            // if only public minting set allowlistStartTime = publicStartTime
            // if rate = 0 exponential descending model, otherwise, linear descending model
            // if rate is set the linear decrase each period per rate
            tDiff = (block.timestamp - collectionPhases[_collectionId].allowlistStartTime) / collectionPhases[_collectionId].timePeriod;
            uint256 price;
            uint256 decreaserate;
            if (collectionPhases[_collectionId].rate == 0) {
                price = collectionPhases[_collectionId].collectionMintCost / (tDiff + 1);
                decreaserate = ((price - (collectionPhases[_collectionId].collectionMintCost / (tDiff + 2))) / collectionPhases[_collectionId].timePeriod) * ((block.timestamp - (tDiff * collectionPhases[_collectionId].timePeriod) - collectionPhases[_collectionId].allowlistStartTime));
            } else {
                if (((collectionPhases[_collectionId].collectionMintCost - collectionPhases[_collectionId].collectionEndMintCost) / (collectionPhases[_collectionId].rate)) >= tDiff) {
                    price = collectionPhases[_collectionId].collectionMintCost - (tDiff * collectionPhases[_collectionId].rate);
                } else {
                    price = collectionPhases[_collectionId].collectionEndMintCost;
                }
            }
            if (price - decreaserate > collectionPhases[_collectionId].collectionEndMintCost) {
                return price - decreaserate; 
            } else {
                return collectionPhases[_collectionId].collectionEndMintCost;
            }
        } else {
            // fixed price model
            return collectionPhases[_collectionId].collectionMintCost;
        }
    }

}

File 2 of 7: IDelegationManagementContract.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.18;

/**
 * @dev Interface module which provides a basic access control mechanism of the NFT Delegation Smart Contract
 */

interface IDelegationManagementContract {
    
    /**
     * @notice Returns an array of all delegation addresses (active AND inactive) assigned by a delegator for a specific use case on a specific NFT collection
     */

    function retrieveDelegationAddresses(address _delegatorAddress, address _collectionAddress, uint256 _useCase) external view returns (address[] memory);
    
    /**
     * @notice Returns an array of all delegators (active AND inactive) that delegated to a delegationAddress for a specific use case on a specific NFT collection
     */

     function retrieveDelegators(address _delegationAddress, address _collectionAddress, uint256 _useCase) external view returns (address[] memory);

    /**
     * @notice Returns an array of all active delegators on a certain date for a specific use case on a specific NFT collection given a delegation Address
    */

     function retrieveActiveDelegators(address _delegationAddress, address _collectionAddress, uint256 _date, uint256 _useCase) external view returns (address[] memory);

     /**
     * @notice Returns the most recent delegation address delegated for a specific use case on a specific NFT collection
     */

    function retrieveMostRecentDelegation(address _delegatorAddress, address _collectionAddress, uint256 _useCase) external view returns (address);

    /**
     * @notice Returns the most recent delegator for a specific use case on a specific NFT collection given a delegation Address
     */

    function retrieveMostRecentDelegator(address _delegationAddress, address _collectionAddress, uint256 _useCase) external view returns (address);

    /**
     * @notice Returns the status of a delegation given the delegator address as well as the delegation address
     */

    function retrieveGlobalStatusOfDelegation(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _useCase) external view returns (bool);

    /**
     * @notice Returns the status of a delegation given the delegator address, the collection address, the delegation address as well as a specific token id
     */

    function retrieveTokenStatus(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _useCase, uint256 _tokenId) external view returns (bool);

    /**
     * @notice Checks if the delegation address performing actions is the most recent delegated by the specific delegator
     */

    function retrieveStatusOfMostRecentDelegation(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _useCase) external view returns (bool);

     /**
     * @notice Checks if a delegator granted subdelegation status to an Address
     */

    function retrieveSubDelegationStatus(address _delegatorAddress, address _collectionAddress, address _delegationAddress) external view returns (bool);

     /**
     * @notice Checks the status of an active delegator for a delegation Address
     */

    function retrieveStatusOfActiveDelegator(address _delegatorAddress, address _collectionAddress, address _delegationAddress, uint256 _date, uint256 _useCase) external view returns (bool);

    /**
     * @notice This function checks the Consolidation status between 2 addresses
     */

    function checkConsolidationStatus(address _wallet1, address _wallet2, address _collectionAddress) external view returns (bool);

}

File 3 of 7: 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);
}

File 4 of 7: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */

import "./IERC165.sol";

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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 5 of 7: INextGenAdmins.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface INextGenAdmins {

    // retrieve global admin
    function retrieveGlobalAdmin(address _address) external view returns(bool);

    // retrieve function admin
    function retrieveFunctionAdmin(address _address, bytes4 _selector) external view returns(bool);

    // retrieve collection admin
    function retrieveCollectionAdmin(address _address, uint256 _collectionID) external view returns(bool);

    // retrieve if the contract is admin contract
    function isAdminContract() external view returns (bool);

    // retrieve owner
    function owner() external view returns (address);

}

File 6 of 7: INextGenCore.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface INextGenCore {

    function retrievewereDataAdded(uint256 _collectionID) external view returns(bool);

    function viewTokensIndexMin(uint256 _collectionID) external view returns (uint256);

    function viewTokensIndexMax(uint256 _collectionID) external view returns (uint256);

    function viewCirSupply(uint256 _collectionID) external view returns (uint256);

    function airDropTokens(uint256 mintIndex, address _recipient, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID) external;

    function mint(uint256 mintIndex, address _mintingAddress , address _mintTo, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID, uint256 phase) external;

    function collectionFreezeStatus(uint256 _collectionID) external view returns(bool);

    function viewMaxAllowance(uint256 _collectionID) external view returns (uint256);

    function retrieveTokensMintedALPerAddress(uint256 _collectionID, address _address) external view returns(uint256);

    function retrieveTokensMintedPublicPerAddress(uint256 _collectionID, address _address) external view returns(uint256);

    function viewColIDforTokenID(uint256 _tokenid) external view returns (uint256);

    function burnToMint(uint256 mintIndex, uint256 _burnCollectionID, uint256 _tokenId, uint256 _mintCollectionID, uint256 _saltfun_o, address burner) external;

    function retrieveArtistAddress(uint256 _collectionID) external view returns(address);

    function setTokenHash(uint256 _collectionID, uint256 _mintIndex, bytes32 _hash) external;

    function retrieveTokenHash(uint256 _tokenid) external view returns(bytes32);

}

File 7 of 7: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.18;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_gencore","type":"address"},{"internalType":"address","name":"_del","type":"address"},{"internalType":"address","name":"_adminsContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_add","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"},{"indexed":true,"internalType":"uint256","name":"funds","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"bool","name":"_statusPrimary","type":"bool"},{"internalType":"bool","name":"_statusSecondary","type":"bool"}],"name":"acceptAddressesAndPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"string[]","name":"_tokenData","type":"string[]"},{"internalType":"uint256[]","name":"_saltfun_o","type":"uint256[]"},{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256[]","name":"_numberOfTokens","type":"uint256[]"}],"name":"airDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnExternalToMintCollections","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"burnOrSwapAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721Collection","type":"address"},{"internalType":"uint256","name":"_burnCollectionID","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_mintCollectionID","type":"uint256"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"}],"name":"burnOrSwapExternalToMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnCollectionID","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_mintCollectionID","type":"uint256"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"}],"name":"burnToMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnToMintCollections","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionTotalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dmc","outputs":[{"internalType":"contract IDelegationManagementContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"excludeTokensCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"},{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_excludeCounter","type":"uint256"}],"name":"excludeTokensOrResetLD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gencore","outputs":[{"internalType":"contract INextGenCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getAuctionEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getAuctionStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"getEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnCollectionID","type":"uint256"},{"internalType":"uint256","name":"_mintCollectionID","type":"uint256"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"initializeBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721Collection","type":"address"},{"internalType":"uint256","name":"_burnCollectionID","type":"uint256"},{"internalType":"uint256","name":"_mintCollectionID","type":"uint256"},{"internalType":"uint256","name":"_tokmin","type":"uint256"},{"internalType":"uint256","name":"_tokmax","type":"uint256"},{"internalType":"address","name":"_burnOrSwapAddress","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"initializeExternalBurnOrSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isMinterContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastMintDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"_maxAllowance","type":"uint256"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"address","name":"_delegator","type":"address"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_auctionEndTime","type":"uint256"}],"name":"mintAndAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_team1","type":"address"},{"internalType":"address","name":"_team2","type":"address"},{"internalType":"uint256","name":"_teamperc1","type":"uint256"},{"internalType":"uint256","name":"_teamperc2","type":"uint256"}],"name":"payArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_primaryAdd1","type":"address"},{"internalType":"address","name":"_primaryAdd2","type":"address"},{"internalType":"address","name":"_primaryAdd3","type":"address"},{"internalType":"uint256","name":"_add1Percentage","type":"uint256"},{"internalType":"uint256","name":"_add2Percentage","type":"uint256"},{"internalType":"uint256","name":"_add3Percentage","type":"uint256"}],"name":"proposePrimaryAddressesAndPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_secondaryAdd1","type":"address"},{"internalType":"address","name":"_secondaryAdd2","type":"address"},{"internalType":"address","name":"_secondaryAdd3","type":"address"},{"internalType":"uint256","name":"_add1Percentage","type":"uint256"},{"internalType":"uint256","name":"_add2Percentage","type":"uint256"},{"internalType":"uint256","name":"_add3Percentage","type":"uint256"}],"name":"proposeSecondaryAddressesAndPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionMintingDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionPhases","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrievePrimaryAddressesAndPercentages","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrievePrimarySplits","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveSecondaryAddressesAndPercentages","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveSecondarySplits","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_collectionMintCost","type":"uint256"},{"internalType":"uint256","name":"_collectionEndMintCost","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint256","name":"_timePeriod","type":"uint256"},{"internalType":"uint8","name":"_salesOption","type":"uint8"},{"internalType":"address","name":"_delAddress","type":"address"}],"name":"setCollectionCosts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_allowlistStartTime","type":"uint256"},{"internalType":"uint256","name":"_allowlistEndTime","type":"uint256"},{"internalType":"uint256","name":"_publicStartTime","type":"uint256"},{"internalType":"uint256","name":"_publicEndTime","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setCollectionPhases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_artistPrSplit","type":"uint256"},{"internalType":"uint256","name":"_teamPrSplit","type":"uint256"},{"internalType":"uint256","name":"_artistSecSplit","type":"uint256"},{"internalType":"uint256","name":"_teamSecSplit","type":"uint256"}],"name":"setPrimaryAndSecondarySplits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newadminsContract","type":"address"}],"name":"updateAdminContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gencore","type":"address"}],"name":"updateCoreContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200606138038062006061833981016040819052620000349162000094565b600f80546001600160a01b039485166001600160a01b031991821617909155601080549385169382169390931790925560118054919093169116179055620000de565b80516001600160a01b03811681146200008f57600080fd5b919050565b600080600060608486031215620000aa57600080fd5b620000b58462000077565b9250620000c56020850162000077565b9150620000d56040850162000077565b90509250925092565b615f7380620000ee6000396000f3fe6080604052600436106101ea5760003560e01c8063930e79f111610113578063b986eaa7116100ab578063d418baec1161006f578063d418baec14610887578063d6516f47146108a7578063db2e21bc146108c7578063e7572230146108dc578063fb9422ff146108fc57600080fd5b8063b986eaa714610758578063bf40b89a14610778578063bfc4b8a7146107ad578063d2f4302f146107cd578063d3be0bc1146107ed57600080fd5b8063930e79f11461057557806394e76daf146105a257806395190946146106105780639e424a9314610653578063a048901c146106c5578063a3167156146106d8578063b047168f14610705578063b5bc955f14610718578063b85f97a01461073857600080fd5b806346372ba61161018657806346372ba6146103e25780634aa7df07146104025780634c29c6f21461044d5780635ac57d8b1461046d578063669ab82f1461048d57806371b084f3146104c85780637765c52c146104f55780637e04bcb7146105255780639067b6771461054557600080fd5b806302d61853146101ef578063037528501461022f5780631253e16d146102445780631c7a8b22146102645780632b673a2e146102845780632ebc24b3146102a4578063388d2c24146102c45780633b964798146102e45780633d205e081461032e575b600080fd5b3480156101fb57600080fd5b5061021c61020a366004615200565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b61024261023d366004615331565b610910565b005b34801561025057600080fd5b5061024261025f3660046153df565b611206565b34801561027057600080fd5b5061024261027f366004615418565b61144f565b34801561029057600080fd5b5061024261029f366004615486565b6116e5565b3480156102b057600080fd5b506102426102bf3660046154a3565b611820565b3480156102d057600080fd5b506102426102df366004615486565b611dad565b3480156102f057600080fd5b506103196102ff366004615200565b600090815260096020526040902080546001909101549091565b60408051928352602083019190915201610226565b34801561033a57600080fd5b5061039c610349366004615200565b6000908152600a602052604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b039586169794861696959093169491939092610100900460ff1690565b604080516001600160a01b039889168152968816602088015294909616938501939093526060840191909152608083015260a082015290151560c082015260e001610226565b3480156103ee57600080fd5b506102426103fd3660046154f5565b611f93565b34801561040e57600080fd5b5061043d61041d36600461555f565b600660209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610226565b34801561045957600080fd5b50610242610468366004615581565b6125a8565b34801561047957600080fd5b50610242610488366004615700565b6127e0565b34801561049957600080fd5b5061043d6104a836600461555f565b600560209081526000928352604080842090915290825290205460ff1681565b3480156104d457600080fd5b5061021c6104e3366004615200565b60016020526000908152604090205481565b34801561050157600080fd5b5061043d610510366004615200565b6000908152600e602052604090205460ff1690565b34801561053157600080fd5b50610242610540366004615418565b612d2b565b34801561055157600080fd5b5061021c610560366004615200565b60009081526008602052604090206003015490565b34801561058157600080fd5b5061021c610590366004615200565b6000908152600d602052604090205490565b3480156105ae57600080fd5b5061039c6105bd366004615200565b6000908152600c602052604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b039586169794861696959093169491939092610100900460ff1690565b34801561061c57600080fd5b5061064661062b366004615200565b6003602052600090815260409020546001600160a01b031681565b6040516102269190615814565b34801561065f57600080fd5b5061069d61066e366004615200565b600090815260086020526040902080546001820154600483015460028401546003909401549294919390929091565b604080519586526020860194909452928401919091526060830152608082015260a001610226565b6102426106d3366004615828565b612fc1565b3480156106e457600080fd5b5061021c6106f3366004615200565b60006020819052908152604090205481565b61024261071336600461585a565b6134ee565b34801561072457600080fd5b50600f54610646906001600160a01b031681565b34801561074457600080fd5b50610242610753366004615912565b614182565b34801561076457600080fd5b50610242610773366004615955565b61439e565b34801561078457600080fd5b50610319610793366004615200565b6000908152600b6020526040902080546001909101549091565b3480156107b957600080fd5b50601054610646906001600160a01b031681565b3480156107d957600080fd5b506102426107e8366004615981565b6144ea565b3480156107f957600080fd5b5061084e610808366004615200565b600090815260086020819052604090912060058101546006820154928201546007830154600990930154919490929160ff8116916101009091046001600160a01b031690565b60408051968752602087019590955293850192909252606084015260ff1660808301526001600160a01b031660a082015260c001610226565b34801561089357600080fd5b506102426108a23660046159e0565b61478a565b3480156108b357600080fd5b506102426108c2366004615a1b565b614922565b3480156108d357600080fd5b50610242614b48565b3480156108e857600080fd5b5061021c6108f7366004615200565b614d87565b34801561090857600080fd5b50600161043d565b60008888604051602001610925929190615a52565b60408051601f1981840301815291815281516020928301206000898152600790935291205490915060ff161515600114801561097f5750600081815260066020908152604080832089845290915290205460ff1615156001145b6109a45760405162461bcd60e51b815260040161099b90615a74565b60405180910390fd5b6040516331a9108f60e11b8152600481018890526000906001600160a01b038b1690636352211e90602401602060405180830381865afa1580156109ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a109190615a96565b9050336001600160a01b03821614610c6a5760105460405163d986ff6d60e01b81526000916001600160a01b03169063d986ff6d90610a6e908590738888888888888888888888888888888888888888903390600190600401615ab3565b602060405180830381865afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf9190615add565b80610b41575060105460405163d986ff6d60e01b81526001600160a01b039091169063d986ff6d90610b00908590738888888888888888888888888888888888888888903390600290600401615ab3565b602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b419190615add565b9050801515600003610c465760105460405163d986ff6d60e01b81526001600160a01b039091169063d986ff6d90610b849085908f903390600190600401615ab3565b602060405180830381865afa158015610ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc59190615add565b80610c43575060105460405163d986ff6d60e01b81526001600160a01b039091169063d986ff6d90610c029085908f903390600290600401615ab3565b602060405180830381865afa158015610c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c439190615add565b90505b600181151514610c685760405162461bcd60e51b815260040161099b90615afa565b505b6000828152600460205260409020548810801590610c9957506000828152600460205260409020600101548811155b610cdf5760405162461bcd60e51b81526020600482015260176024820152760a8ded6cadc40d2c840c8decae640dcdee840dac2e8c6d604b1b604482015260640161099b565b60008281526003602052604090819020549051632142170760e11b81526001600160a01b0383811660048301529182166024820152604481018a9052908b16906342842e0e90606401600060405180830381600087803b158015610d4257600080fd5b505af1158015610d56573d6000803e3d6000fd5b505050600088815260086020526040812054899250819089904210801590610d8e575060008481526008602052604090206001015442105b15610e28576001915060008c82604051602001610dac929190615b5b565b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052805190602001209050859350610e068a8a6008600089815260200190815260200160002060040154846150ee565b610e225760405162461bcd60e51b815260040161099b90615b81565b50610ea3565b6000848152600860205260409020600201544210801590610e5a57506000848152600860205260409020600301544211155b15610e8b57505060408051808201909152600881526711383ab13634b19160c11b6020820152839150600290610ea3565b60405162461bcd60e51b815260040161099b90615ba8565b600f54604051632bd5a7f560e21b8152600481018690526000916001600160a01b03169063af569fd490602401602060405180830381865afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f119190615bcc565b600f5460405163074dbd4360e51b8152600481018890526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015610f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e9190615bcc565b610f889190615bfb565b600f54604051633635558b60e11b8152600481018890529192506001600160a01b031690636c6aab1690602401602060405180830381865afa158015610fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff69190615bcc565b8111156110155760405162461bcd60e51b815260040161099b90615c0e565b61101e85614d87565b34101561103d5760405162461bcd60e51b815260040161099b90615c31565b60006110513461104c88614d87565b615106565b6000878152602081905260409020549091508190611070903490615bfb565b61107a9190615c54565b60008781526020819052604080822092909255600f549151632bd5a7f560e21b8152600481018990529092506001600160a01b039091169063af569fd490602401602060405180830381865afa1580156110d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fc9190615bcc565b600f5460405163074dbd4360e51b8152600481018990526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111699190615bcc565b6111739190615bfb565b9050600f60009054906101000a90046001600160a01b03166001600160a01b031663d3322d5382878a878e8c8b6040518863ffffffff1660e01b81526004016111c29796959493929190615c93565b600060405180830381600087803b1580156111dc57600080fd5b505af11580156111f0573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b60115460405163feb2e23360e01b8152631253e16d60e01b916001600160a01b03169063feb2e2339061123f9033908590600401615ce4565b602060405180830381865afa15801561125c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112809190615add565b151560011480611302575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906112bb903390600401615814565b602060405180830381865afa1580156112d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fc9190615add565b15156001145b61131e5760405162461bcd60e51b815260040161099b90615d07565b600f54604051620d374160ec1b8152600481018690526001600160a01b039091169063d374100090602401602060405180830381865afa158015611366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138a9190615add565b151560011480156114085750600f54604051620d374160ec1b8152600481018590526001600160a01b039091169063d374100090602401602060405180830381865afa1580156113de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114029190615add565b15156001145b6114245760405162461bcd60e51b815260040161099b90615d2c565b5060009283526005602090815260408085209385529290529120805460ff1916911515919091179055565b600f54604051631732052d60e31b8152600481018990528891630e3d459160e11b916001600160a01b039091169063b990296890602401602060405180830381865afa1580156114a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c79190615a96565b6001600160a01b0316336001600160a01b0316148061155a575060115460405163feb2e23360e01b81526001600160a01b039091169063feb2e233906115139033908590600401615ce4565b602060405180830381865afa158015611530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115549190615add565b15156001145b806115d7575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611590903390600401615814565b602060405180830381865afa1580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190615add565b15156001145b6115f35760405162461bcd60e51b815260040161099b90615d07565b6000898152600c6020526040902060060154610100900460ff161561162a5760405162461bcd60e51b815260040161099b90615d4d565b6000898152600b6020526040902054836116448688615bfb565b61164e9190615bfb565b1461166b5760405162461bcd60e51b815260040161099b90615d77565b50506000968752600c602052604090962080546001600160a01b039687166001600160a01b0319918216178255600180830180549789169783169790971790965560028201805495909716941693909317909455600382015560048101929092556005820192909255600601805461ffff19169091179055565b60115460405163feb2e23360e01b81526315b39d1760e11b916001600160a01b03169063feb2e2339061171e9033908590600401615ce4565b602060405180830381865afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f9190615add565b1515600114806117e1575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061179a903390600401615814565b602060405180830381865afa1580156117b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117db9190615add565b15156001145b6117fd5760405162461bcd60e51b815260040161099b90615d07565b50600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60115460405163feb2e23360e01b8152632ebc24b360e01b916001600160a01b03169063feb2e233906118599033908590600401615ce4565b602060405180830381865afa158015611876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189a9190615add565b15156001148061191c575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906118d5903390600401615814565b602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190615add565b15156001145b6119385760405162461bcd60e51b815260040161099b90615d07565b6000868152600a602052604090206006015460ff6101009091041615156001146119975760405162461bcd60e51b815260206004820152601060248201526f41636365707420526f79616c7469657360801b604482015260640161099b565b600086815260208190526040902054611a035760405162461bcd60e51b815260206004820152602860248201527f436f6c6c656374696f6e2042616c616e6365206d757374206265206772617465604482015267072207468616e20360c41b606482015260840161099b565b6000868152600960205260409020548290611a1f908590615bfb565b611a299190615bfb565b606414611a6d5760405162461bcd60e51b81526020600482015260126024820152714368616e67652070657263656e746167657360701b604482015260640161099b565b600086815260208181526040808320805490849055600a9092528220600301549091879187918a918190819081908190606490611aaa908b615d98565b611ab49190615daf565b6000878152600a6020526040902060040154909550606490611ad6908b615d98565b611ae09190615daf565b6000878152600a6020526040902060050154909450606490611b02908b615d98565b611b0c9190615daf565b92506064611b1a8d8b615d98565b611b249190615daf565b91506064611b328c8b615d98565b611b3c9190615daf565b6000878152600a602052604080822054905192935090916001600160a01b039091169087908381818185875af1925050503d8060008114611b99576040519150601f19603f3d011682016040523d82523d6000602084013e611b9e565b606091505b50506000888152600a602052604080822060010154905192935090916001600160a01b039091169087908381818185875af1925050503d8060008114611c00576040519150601f19603f3d011682016040523d82523d6000602084013e611c05565b606091505b50506000898152600a602052604080822060020154905192935090916001600160a01b039091169087908381818185875af1925050503d8060008114611c67576040519150601f19603f3d011682016040523d82523d6000602084013e611c6c565b606091505b5050905060008b6001600160a01b03168660405160006040518083038185875af1925050503d8060008114611cbd576040519150601f19603f3d011682016040523d82523d6000602084013e611cc2565b606091505b5050905060008b6001600160a01b03168660405160006040518083038185875af1925050503d8060008114611d13576040519150601f19603f3d011682016040523d82523d6000602084013e611d18565b606091505b5050905084611d395760405162461bcd60e51b815260040161099b90615dd1565b83611d565760405162461bcd60e51b815260040161099b90615dd1565b82611d735760405162461bcd60e51b815260040161099b90615dd1565b81611d905760405162461bcd60e51b815260040161099b90615dd1565b806111f05760405162461bcd60e51b815260040161099b90615dd1565b60115460405163feb2e23360e01b8152630e234b0960e21b916001600160a01b03169063feb2e23390611de69033908590600401615ce4565b602060405180830381865afa158015611e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e279190615add565b151560011480611ea9575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611e62903390600401615814565b602060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea39190615add565b15156001145b611ec55760405162461bcd60e51b815260040161099b90615d07565b816001600160a01b0316639068edac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f279190615add565b1515600114611f705760405162461bcd60e51b815260206004820152601560248201527421b7b73a3930b1ba1034b9903737ba1020b236b4b760591b604482015260640161099b565b50601180546001600160a01b0319166001600160a01b0392909216919091179055565b60115460405163feb2e23360e01b815263231b95d360e11b916001600160a01b03169063feb2e23390611fcc9033908590600401615ce4565b602060405180830381865afa158015611fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200d9190615add565b15156001148061208f575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612048903390600401615814565b602060405180830381865afa158015612065573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120899190615add565b15156001145b6120ab5760405162461bcd60e51b815260040161099b90615d07565b600f54604051620d374160ec1b8152600481018590526001600160a01b039091169063d374100090602401602060405180830381865afa1580156120f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121179190615add565b15156001146121385760405162461bcd60e51b815260040161099b90615df5565b600f54604051632bd5a7f560e21b8152600481018590526000916001600160a01b03169063af569fd490602401602060405180830381865afa158015612182573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a69190615bcc565b600f5460405163074dbd4360e51b8152600481018790526001600160a01b039091169063e9b7a86090602401602060405180830381865afa1580156121ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122139190615bcc565b61221d9190615bfb565b600f54604051633635558b60e11b8152600481018790529192506001600160a01b031690636c6aab1690602401602060405180830381865afa158015612267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228b9190615bcc565b8111156122aa5760405162461bcd60e51b815260040161099b90615c0e565b600f54604051632bd5a7f560e21b8152600481018690526000916001600160a01b03169063af569fd490602401602060405180830381865afa1580156122f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123189190615bcc565b600f5460405163074dbd4360e51b8152600481018890526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015612361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123859190615bcc565b61238f9190615bfb565b6000868152600160205260408120549192509081036123ce576000868152600860205260409020600781015490546123c79190615c54565b90506123df565b506000858152600160205260409020545b6000868152600860205260408120600701546123fb8342615c54565b6124059190615daf565b905060018110156124285760405162461bcd60e51b815260040161099b90615e17565b6000878152600260205260409081902054600f549151632bd5a7f560e21b8152600481018a905290916001600160a01b03169063af569fd490602401602060405180830381865afa158015612481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a59190615bcc565b6124af9190615c54565b6000888152600860205260409020600701546124cb9190615d98565b6000888152600860205260409020546124e49190615bfb565b6000888152600160205260409020556124ff42610258615bfb565b86101561250b57600080fd5b6000838152600d60209081526040808320899055600e90915290819020805460ff19166001179055600f5490516379ae0a2960e11b81526001600160a01b039091169063f35c14529061256a9086908e908e908e908e90600401615e3e565b600060405180830381600087803b15801561258457600080fd5b505af1158015612598573d6000803e3d6000fd5b5050505050505050505050505050565b60115460405163feb2e23360e01b8152632614e37960e11b916001600160a01b03169063feb2e233906125e19033908590600401615ce4565b602060405180830381865afa1580156125fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126229190615add565b1515600114806126a4575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061265d903390600401615814565b602060405180830381865afa15801561267a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269e9190615add565b15156001145b6126c05760405162461bcd60e51b815260040161099b90615d07565b600088886040516020016126d5929190615a52565b60408051808303601f19018152908290528051602090910120600f54620d374160ec1b8352600483018a90529092506001600160a01b03169063d374100090602401602060405180830381865afa158015612734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127589190615add565b15156001146127795760405162461bcd60e51b815260040161099b90615d2c565b6000818152600660209081526040808320998352988152888220805460ff1916951515959095179094559081526003835286812080546001600160a01b0319166001600160a01b039590951694909417909355506004905292909220908155600101555050565b60115460405163feb2e23360e01b8152635ac57d8b60e01b916001600160a01b03169063feb2e233906128199033908590600401615ce4565b602060405180830381865afa158015612836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285a9190615add565b1515600114806128dc575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612895903390600401615814565b602060405180830381865afa1580156128b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d69190615add565b15156001145b6128f85760405162461bcd60e51b815260040161099b90615d07565b600f54604051620d374160ec1b8152600481018590526001600160a01b039091169063d374100090602401602060405180830381865afa158015612940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129649190615add565b15156001146129855760405162461bcd60e51b815260040161099b90615df5565b6000805b8751811015612d215760018482815181106129a6576129a6615b21565b6020908102919091010151600f54604051632bd5a7f560e21b8152600481018990526001600160a01b039091169063af569fd490602401602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e9190615bcc565b600f5460405163074dbd4360e51b8152600481018a90526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b9190615bcc565b612a959190615bfb565b612a9f9190615bfb565b612aa99190615c54565b600f54604051633635558b60e11b8152600481018890529193506001600160a01b031690636c6aab1690602401602060405180830381865afa158015612af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b179190615bcc565b821115612b365760405162461bcd60e51b815260040161099b90615c0e565b60005b848281518110612b4b57612b4b615b21565b6020026020010151811015612d0e57600f54604051632bd5a7f560e21b8152600481018890526000916001600160a01b03169063af569fd490602401602060405180830381865afa158015612ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc89190615bcc565b600f5460405163074dbd4360e51b8152600481018a90526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015612c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c359190615bcc565b612c3f9190615bfb565b600f548b519192506001600160a01b03169063f35c14529083908d9087908110612c6b57612c6b615b21565b60200260200101518c8781518110612c8557612c85615b21565b60200260200101518c8881518110612c9f57612c9f615b21565b60200260200101518c6040518663ffffffff1660e01b8152600401612cc8959493929190615e3e565b600060405180830381600087803b158015612ce257600080fd5b505af1158015612cf6573d6000803e3d6000fd5b50505050508080612d0690615e7c565b915050612b39565b5080612d1981615e7c565b915050612989565b5050505050505050565b600f54604051631732052d60e31b8152600481018990528891637e04bcb760e01b916001600160a01b039091169063b990296890602401602060405180830381865afa158015612d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da39190615a96565b6001600160a01b0316336001600160a01b03161480612e36575060115460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390612def9033908590600401615ce4565b602060405180830381865afa158015612e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e309190615add565b15156001145b80612eb3575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612e6c903390600401615814565b602060405180830381865afa158015612e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ead9190615add565b15156001145b612ecf5760405162461bcd60e51b815260040161099b90615d07565b6000898152600a6020526040902060060154610100900460ff1615612f065760405162461bcd60e51b815260040161099b90615d4d565b60008981526009602052604090205483612f208688615bfb565b612f2a9190615bfb565b14612f475760405162461bcd60e51b815260040161099b90615d77565b50506000968752600a602052604090962080546001600160a01b039687166001600160a01b0319918216178255600180830180549789169783169790971790965560028201805495909716941693909317909455600382015560048101929092556005820192909255600601805461ffff19169091179055565b60008281526007602052604090205460ff16151560011480156130025750600084815260056020908152604080832085845290915290205460ff1615156001145b61301e5760405162461bcd60e51b815260040161099b90615a74565b600082815260086020526040902060020154421080159061305057506000828152600860205260409020600301544211155b61306c5760405162461bcd60e51b815260040161099b90615ba8565b600f5460405163074dbd4360e51b8152600481018690526001600160a01b039091169063e9b7a86090602401602060405180830381865afa1580156130b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d99190615bcc565b83101580156131545750600f54604051633635558b60e11b8152600481018690526001600160a01b0390911690636c6aab1690602401602060405180830381865afa15801561312c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131509190615bcc565b8311155b6131955760405162461bcd60e51b815260206004820152601260248201527131b7b617ba37b5b2b71034b21032b93937b960711b604482015260640161099b565b600f54604051632bd5a7f560e21b8152600481018490526000916001600160a01b03169063af569fd490602401602060405180830381865afa1580156131df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132039190615bcc565b600f5460405163074dbd4360e51b8152600481018690526001600160a01b039091169063e9b7a86090602401602060405180830381865afa15801561324c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132709190615bcc565b61327a9190615bfb565b600f54604051633635558b60e11b8152600481018690529192506001600160a01b031690636c6aab1690602401602060405180830381865afa1580156132c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e89190615bcc565b8111156133075760405162461bcd60e51b815260040161099b90615c0e565b61331083614d87565b34101561332f5760405162461bcd60e51b815260040161099b90615c31565b600061333e3461104c86614d87565b600085815260208190526040902054909150819061335d903490615bfb565b6133679190615c54565b60008581526020819052604080822092909255600f549151632bd5a7f560e21b8152600481018790529092506001600160a01b039091169063af569fd490602401602060405180830381865afa1580156133c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e99190615bcc565b600f5460405163074dbd4360e51b8152600481018790526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015613432573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134569190615bcc565b6134609190615bfb565b600f546040516339143a1d60e01b815260048101839052602481018990526044810188905260648101879052608481018690523360a482018190529293506001600160a01b03909116906339143a1d9060c401600060405180830381600087803b1580156134cd57600080fd5b505af11580156134e1573d6000803e3d6000fd5b5050505050505050505050565b60008981526007602052604090205460ff16151560011480156135115750600088115b6135435760405162461bcd60e51b815260206004820152600360248201526232b93960e91b604482015260640161099b565b6000898152600860205260408120548a9190819089904210801590613578575060008481526008602052604090206001015442105b15613a25576001915060006001600160a01b038716156138fb5760105460405163d986ff6d60e01b81526000916001600160a01b03169063d986ff6d906135de908b90738888888888888888888888888888888888888888903390600190600401615ab3565b602060405180830381865afa1580156135fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361f9190615add565b806136b1575060105460405163d986ff6d60e01b81526001600160a01b039091169063d986ff6d90613670908b90738888888888888888888888888888888888888888903390600290600401615ab3565b602060405180830381865afa15801561368d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b19190615add565b90508015156000036137ec576010546000878152600860205260409081902060090154905163d986ff6d60e01b81526001600160a01b039283169263d986ff6d9261370f928d92610100909204909116903390600190600401615ab3565b602060405180830381865afa15801561372c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137509190615add565b806137e957506010546000878152600860205260409081902060090154905163d986ff6d60e01b81526001600160a01b039283169263d986ff6d926137a8928d92610100909204909116903390600290600401615ab3565b602060405180830381865afa1580156137c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e99190615add565b90505b60018115151461380e5760405162461bcd60e51b815260040161099b90615afa565b878d8460405160200161382393929190615e95565b60408051808303601f19018152828252805160209182012081840152815180840382018152838301928390528051910120600f5463065b6b3f60e51b90925293508f916001600160a01b039091169063cb6d67e090613888908a908d90604401615ed4565b602060405180830381865afa1580156138a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c99190615bcc565b6138d39190615bfb565b8d10156138f25760405162461bcd60e51b815260040161099b90615eeb565b879450506139e3565b338c8360405160200161391093929190615e95565b60408051808303601f19018152828252805160209182012081840152815180840382018152838301928390528051910120600f5463065b6b3f60e51b90925292508e916001600160a01b039091169063cb6d67e0906139759089903390604401615ed4565b602060405180830381865afa158015613992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b69190615bcc565b6139c09190615bfb565b8c10156139df5760405162461bcd60e51b815260040161099b90615eeb565b3393505b600085815260086020526040902060040154613a03908a908a90846150ee565b613a1f5760405162461bcd60e51b815260040161099b90615b81565b50613c54565b6000848152600860205260409020600201544210801590613a5757506000848152600860205260409020600301544211155b15610e8b57600f5460405163945e549b60e01b815260048101869052600293506001600160a01b039091169063945e549b90602401602060405180830381865afa158015613aa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acd9190615bcc565b8c1115613b125760405162461bcd60e51b81526020600482015260136024820152724368616e6765206e6f206f6620746f6b656e7360681b604482015260640161099b565b600f5460405163945e549b60e01b8152600481018690526001600160a01b039091169063945e549b90602401602060405180830381865afa158015613b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7f9190615bcc565b600f5460405163e943a2c760e01b81528e916001600160a01b03169063e943a2c790613bb19089903390600401615ed4565b602060405180830381865afa158015613bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf29190615bcc565b613bfc9190615bfb565b1115613c305760405162461bcd60e51b815260206004820152600360248201526209ac2f60eb1b604482015260640161099b565b5060408051808201909152600881526711383ab13634b19160c11b60208201523392505b600f54604051632bd5a7f560e21b8152600481018690526000916001918f916001600160a01b03169063af569fd490602401602060405180830381865afa158015613ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc79190615bcc565b600f5460405163074dbd4360e51b8152600481018a90526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015613d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d349190615bcc565b613d3e9190615bfb565b613d489190615bfb565b613d529190615c54565b600f54604051633635558b60e11b8152600481018890529192506001600160a01b031690636c6aab1690602401602060405180830381865afa158015613d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc09190615bcc565b811115613ddf5760405162461bcd60e51b815260040161099b90615c0e565b8c613de986614d87565b613df39190615d98565b341015613e125760405162461bcd60e51b815260040161099b90615c31565b6000613e2c348f613e2289614d87565b61104c9190615d98565b6000878152602081905260409020549091508190613e4b903490615bfb565b613e559190615c54565b6000878152602081815260408083209390935560089052206009015460ff166003039050613fec576000858152600160205260408120548103613eb857600086815260086020526040902060078101549054613eb19190615c54565b9050613ec9565b506000858152600160205260409020545b600086815260086020526040812060070154613ee58342615c54565b613eef9190615daf565b905060018110158015613f0257508e6001145b613f1e5760405162461bcd60e51b815260040161099b90615e17565b6000878152600260205260409081902054600f549151632bd5a7f560e21b8152600481018a905290916001600160a01b03169063af569fd490602401602060405180830381865afa158015613f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9b9190615bcc565b613fa59190615c54565b600088815260086020526040902060070154613fc19190615d98565b600088815260086020526040902054613fda9190615bfb565b60008881526001602052604090205550505b60005b8d81101561417157600f54604051632bd5a7f560e21b8152600481018890526000916001600160a01b03169063af569fd490602401602060405180830381865afa158015614041573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140659190615bcc565b600f5460405163074dbd4360e51b8152600481018a90526001600160a01b039091169063e9b7a86090602401602060405180830381865afa1580156140ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d29190615bcc565b6140dc9190615bfb565b9050600f60009054906101000a90046001600160a01b03166001600160a01b031663d3322d5382888f888d8d8c6040518863ffffffff1660e01b815260040161412b9796959493929190615c93565b600060405180830381600087803b15801561414557600080fd5b505af1158015614159573d6000803e3d6000fd5b5050505050808061416990615e7c565b915050613fef565b505050505050505050505050505050565b601154604051630cab15dd60e31b81523360048201526024810188905287916305c2fcbd60e51b916001600160a01b0390911690636558aee890604401602060405180830381865afa1580156141dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142009190615add565b151560011480614284575060115460405163feb2e23360e01b81526001600160a01b039091169063feb2e2339061423d9033908590600401615ce4565b602060405180830381865afa15801561425a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061427e9190615add565b15156001145b80614301575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906142ba903390600401615814565b602060405180830381865afa1580156142d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142fb9190615add565b15156001145b61431d5760405162461bcd60e51b815260040161099b90615d07565b60008881526007602052604090205460ff16151560011461436c5760405162461bcd60e51b815260206004820152600960248201526853657420436f73747360b81b604482015260640161099b565b505060009586526008602052604090952093845560018401929092556004830193909355600282019290925560030155565b60115460405163feb2e23360e01b815263b986eaa760e01b916001600160a01b03169063feb2e233906143d79033908590600401615ce4565b602060405180830381865afa1580156143f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144189190615add565b15156001148061449a575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590614453903390600401615814565b602060405180830381865afa158015614470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144949190615add565b15156001145b6144b65760405162461bcd60e51b815260040161099b90615d07565b836001036144d45760008381526002602052604090208290556144e4565b6000838152600160205260408120555b50505050565b601154604051630cab15dd60e31b815233600482015260248101899052889163d2f4302f60e01b916001600160a01b0390911690636558aee890604401602060405180830381865afa158015614544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145689190615add565b1515600114806145ec575060115460405163feb2e23360e01b81526001600160a01b039091169063feb2e233906145a59033908590600401615ce4565b602060405180830381865afa1580156145c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145e69190615add565b15156001145b80614669575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590614622903390600401615814565b602060405180830381865afa15801561463f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146639190615add565b15156001145b6146855760405162461bcd60e51b815260040161099b90615d07565b600f54604051620d374160ec1b8152600481018b90526001600160a01b039091169063d374100090602401602060405180830381865afa1580156146cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f19190615add565b15156001146147125760405162461bcd60e51b815260040161099b90615df5565b50506000968752600860208181526040808a206005810199909955600689019790975590870194909455600780870193909355600990950180546001600160a01b03909616610100026001600160a81b031990961660ff9092169190911794909417909355919091529020805460ff19166001179055565b60115460405163feb2e23360e01b81526335062ebb60e21b916001600160a01b03169063feb2e233906147c39033908590600401615ce4565b602060405180830381865afa1580156147e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148049190615add565b151560011480614886575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061483f903390600401615814565b602060405180830381865afa15801561485c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148809190615add565b15156001145b6148a25760405162461bcd60e51b815260040161099b90615d07565b6148ac8486615bfb565b6064146148cb5760405162461bcd60e51b815260040161099b90615f0d565b6148d58284615bfb565b6064146148f45760405162461bcd60e51b815260040161099b90615f0d565b506000948552600960209081526040808720958655600195860194909455600b905291909320928355910155565b60115460405163feb2e23360e01b815263d6516f4760e01b916001600160a01b03169063feb2e2339061495b9033908590600401615ce4565b602060405180830381865afa158015614978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061499c9190615add565b151560011480614a1e575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906149d7903390600401615814565b602060405180830381865afa1580156149f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a189190615add565b15156001145b614a3a5760405162461bcd60e51b815260040161099b90615d07565b6000848152600a602052604090206006015460ff1615156001148015614a7657506000848152600c602052604090206006015460ff1615156001145b614ab65760405162461bcd60e51b815260206004820152601160248201527050726f706f73652041646472657373657360781b604482015260640161099b565b6000848152600a602090815260408083206006908101805488151561010081810261ff001993841617909355600c9095529285209091018054871515909202919092161790559003614b20576000848152600a60205260409020600601805460ff191690556144e4565b8115156000036144e4575050506000908152600c60205260409020600601805460ff19169055565b60115460405163feb2e23360e01b81526336cb886f60e21b916001600160a01b03169063feb2e23390614b819033908590600401615ce4565b602060405180830381865afa158015614b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bc29190615add565b151560011480614c44575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590614bfd903390600401615814565b602060405180830381865afa158015614c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c3e9190615add565b15156001145b614c605760405162461bcd60e51b815260040161099b90615d07565b60115460408051638da5cb5b60e01b8152905147926000926001600160a01b0390911691638da5cb5b916004808201926020929091908290030181865afa158015614caf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cd39190615a96565b90506000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114614d22576040519150601f19603f3d011682016040523d82523d6000602084013e614d27565b606091505b5050905080614d485760405162461bcd60e51b815260040161099b90615dd1565b6040518115158152839033907f4a48cb98c5be023b78a0b3ec94107a01a0397b2e389d4b5f252aef518e633ec39060200160405180910390a350505050565b600081815260086020526040812060090154819060ff16600303614eb9576000838152600860208190526040909120015415614ea2576000838152600260205260409081902054600f549151632bd5a7f560e21b81526004810186905290916001600160a01b03169063af569fd490602401602060405180830381865afa158015614e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e3a9190615bcc565b614e449190615c54565b600084815260086020819052604090912090810154600590910154606491614e6b91615d98565b614e759190615daf565b614e7f9190615d98565b600084815260086020526040902060050154614e9b9190615bfb565b9392505050565b505060009081526008602052604090206005015490565b60008381526008602052604090206009015460ff166002148015614eeb57506000838152600860205260409020544210155b8015614f0857506000838152600860205260409020600301544211155b15614ea257600083815260086020526040902060078101549054614f2c9042615c54565b614f369190615daf565b600084815260086020819052604082200154919250908190810361501157614f5f836001615bfb565b600086815260086020526040902060050154614f7b9190615daf565b6000868152600860205260409020805460079091015491935090614f9f9085615d98565b614fa99042615c54565b614fb39190615c54565b600086815260086020526040902060070154614fd0856002615bfb565b600088815260086020526040902060050154614fec9190615daf565b614ff69085615c54565b6150009190615daf565b61500a9190615d98565b90506150a0565b6000858152600860208190526040909120908101546006820154600590920154859261503c91615c54565b6150469190615daf565b1061508b57600085815260086020819052604090912001546150689084615d98565b6000868152600860205260409020600501546150849190615c54565b91506150a0565b60008581526008602052604090206006015491505b6000858152600860205260409020600601546150bc8284615c54565b11156150d5576150cc8183615c54565b95945050505050565b5050506000918252506008602052604090206006015490565b6000826150fc868685615188565b1495945050505050565b6000806151138385615c54565b604051909150600090339083908381818185875af1925050503d8060008114615158576040519150601f19603f3d011682016040523d82523d6000602084013e61515d565b606091505b505090508061517e5760405162461bcd60e51b815260040161099b90615dd1565b5090505b92915050565b600081815b848110156151cb576151b7828787848181106151ab576151ab615b21565b905060200201356151d4565b9150806151c381615e7c565b91505061518d565b50949350505050565b60008183106151f0576000828152602084905260409020614e9b565b5060009182526020526040902090565b60006020828403121561521257600080fd5b5035919050565b6001600160a01b038116811461522e57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561526f5761526f615231565b604052919050565b600082601f83011261528857600080fd5b81356001600160401b038111156152a1576152a1615231565b6152b4601f8201601f1916602001615247565b8181528460208386010111156152c957600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f8401126152f857600080fd5b5081356001600160401b0381111561530f57600080fd5b6020830191508360208260051b850101111561532a57600080fd5b9250929050565b60008060008060008060008060e0898b03121561534d57600080fd5b883561535881615219565b975060208901359650604089013595506060890135945060808901356001600160401b038082111561538957600080fd5b6153958c838d01615277565b955060a08b01359150808211156153ab57600080fd5b506153b88b828c016152e6565b999c989b50969995989497949560c00135949350505050565b801515811461522e57600080fd5b6000806000606084860312156153f457600080fd5b8335925060208401359150604084013561540d816153d1565b809150509250925092565b600080600080600080600060e0888a03121561543357600080fd5b87359650602088013561544581615219565b9550604088013561545581615219565b9450606088013561546581615219565b9699959850939660808101359560a0820135955060c0909101359350915050565b60006020828403121561549857600080fd5b8135614e9b81615219565b600080600080600060a086880312156154bb57600080fd5b8535945060208601356154cd81615219565b935060408601356154dd81615219565b94979396509394606081013594506080013592915050565b600080600080600060a0868803121561550d57600080fd5b853561551881615219565b945060208601356001600160401b0381111561553357600080fd5b61553f88828901615277565b959895975050505060408401359360608101359360809091013592509050565b6000806040838503121561557257600080fd5b50508035926020909101359150565b600080600080600080600060e0888a03121561559c57600080fd5b87356155a781615219565b96506020880135955060408801359450606088013593506080880135925060a08801356155d381615219565b915060c08801356155e3816153d1565b8091505092959891949750929550565b60006001600160401b0382111561560c5761560c615231565b5060051b60200190565b600082601f83011261562757600080fd5b8135602061563c615637836155f3565b615247565b82815260059290921b8401810191818101908684111561565b57600080fd5b8286015b8481101561569a5780356001600160401b0381111561567e5760008081fd5b61568c8986838b0101615277565b84525091830191830161565f565b509695505050505050565b600082601f8301126156b657600080fd5b813560206156c6615637836155f3565b82815260059290921b840181019181810190868411156156e557600080fd5b8286015b8481101561569a57803583529183019183016156e9565b600080600080600060a0868803121561571857600080fd5b85356001600160401b038082111561572f57600080fd5b818801915088601f83011261574357600080fd5b81356020615753615637836155f3565b82815260059290921b8401810191818101908c84111561577257600080fd5b948201945b8386101561579957853561578a81615219565b82529482019490820190615777565b995050890135925050808211156157af57600080fd5b6157bb89838a01615616565b955060408801359150808211156157d157600080fd5b6157dd89838a016156a5565b94506060880135935060808801359150808211156157fa57600080fd5b50615807888289016156a5565b9150509295509295909350565b6001600160a01b0391909116815260200190565b6000806000806080858703121561583e57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060008060008060006101008a8c03121561587957600080fd5b8935985060208a0135975060408a0135965060608a01356001600160401b03808211156158a557600080fd5b6158b18d838e01615277565b975060808c013591506158c382615219565b90955060a08b013590808211156158d957600080fd5b506158e68c828d016152e6565b90955093505060c08a01356158fa81615219565b8092505060e08a013590509295985092959850929598565b60008060008060008060c0878903121561592b57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008060006060848603121561596a57600080fd5b505081359360208301359350604090920135919050565b600080600080600080600060e0888a03121561599c57600080fd5b873596506020880135955060408801359450606088013593506080880135925060a088013560ff811681146159d057600080fd5b915060c08801356155e381615219565b600080600080600060a086880312156159f857600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600060608486031215615a3057600080fd5b833592506020840135615a42816153d1565b9150604084013561540d816153d1565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b60208082526008908201526734b734ba1032b93960c11b604082015260600190565b600060208284031215615aa857600080fd5b8151614e9b81615219565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b600060208284031215615aef57600080fd5b8151614e9b816153d1565b6020808252600d908201526c2737903232b632b3b0ba34b7b760991b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60005b83811015615b52578181015183820152602001615b3a565b50506000910152565b82815260008251615b73816020850160208701615b37565b919091016020019392505050565b6020808252600d908201526c34b73b30b634b210383937b7b360991b604082015260600190565b6020808252600a90820152694e6f206d696e74696e6760b01b604082015260600190565b600060208284031215615bde57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561518257615182615be5565b6020808252600990820152684e6f20737570706c7960b81b604082015260600190565b6020808252600990820152680aee4dedcce408aa8960bb1b604082015260600190565b8181038181111561518257615182615be5565b60008151808452615c7f816020860160208601615b37565b601f01601f19169290920160200192915050565b8781526001600160a01b0387811660208301528616604082015260e060608201819052600090615cc590830187615c67565b60808301959095525060a081019290925260c090910152949350505050565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252600790820152664e6f206461746160c81b604082015260600190565b60208082526010908201526f105b1c9958591e48185c1c1c9bdd995960821b604082015260600190565b602080825260079082015266436865636b202560c81b604082015260600190565b808202811582820484141761518257615182615be5565b600082615dcc57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600a90820152691155120819985a5b195960b21b604082015260600190565b602080825260089082015267416464206461746160c01b604082015260600190565b6020808252600d908201526c0c481b5a5b9d0bdc195c9a5bd9609a1b604082015260600190565b8581526001600160a01b038516602082015260a060408201819052600090615e6890830186615c67565b606083019490945250608001529392505050565b600060018201615e8e57615e8e615be5565b5060010190565b6bffffffffffffffffffffffff198460601b16815282601482015260008251615ec5816034850160208701615b37565b91909101603401949350505050565b9182526001600160a01b0316602082015260400190565b6020808252600890820152671053081b1a5b5a5d60c21b604082015260600190565b60208082526016908201527573706c697473206e65656420746f206265203130302560501b60408201526060019056fea2646970667358221220b70160aef7eef99472bb263304952646fc6ef8b0f53546cfb6fe30368d304ad764736f6c634300081300330000000000000000000000002c8fdced22b28e13f1a472cf7f19e2f56c204c830000000000000000000000002202cb9c00487e7e8ef21e6d8e914b32e709f43d00000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f8

Deployed Bytecode

0x6080604052600436106101ea5760003560e01c8063930e79f111610113578063b986eaa7116100ab578063d418baec1161006f578063d418baec14610887578063d6516f47146108a7578063db2e21bc146108c7578063e7572230146108dc578063fb9422ff146108fc57600080fd5b8063b986eaa714610758578063bf40b89a14610778578063bfc4b8a7146107ad578063d2f4302f146107cd578063d3be0bc1146107ed57600080fd5b8063930e79f11461057557806394e76daf146105a257806395190946146106105780639e424a9314610653578063a048901c146106c5578063a3167156146106d8578063b047168f14610705578063b5bc955f14610718578063b85f97a01461073857600080fd5b806346372ba61161018657806346372ba6146103e25780634aa7df07146104025780634c29c6f21461044d5780635ac57d8b1461046d578063669ab82f1461048d57806371b084f3146104c85780637765c52c146104f55780637e04bcb7146105255780639067b6771461054557600080fd5b806302d61853146101ef578063037528501461022f5780631253e16d146102445780631c7a8b22146102645780632b673a2e146102845780632ebc24b3146102a4578063388d2c24146102c45780633b964798146102e45780633d205e081461032e575b600080fd5b3480156101fb57600080fd5b5061021c61020a366004615200565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b61024261023d366004615331565b610910565b005b34801561025057600080fd5b5061024261025f3660046153df565b611206565b34801561027057600080fd5b5061024261027f366004615418565b61144f565b34801561029057600080fd5b5061024261029f366004615486565b6116e5565b3480156102b057600080fd5b506102426102bf3660046154a3565b611820565b3480156102d057600080fd5b506102426102df366004615486565b611dad565b3480156102f057600080fd5b506103196102ff366004615200565b600090815260096020526040902080546001909101549091565b60408051928352602083019190915201610226565b34801561033a57600080fd5b5061039c610349366004615200565b6000908152600a602052604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b039586169794861696959093169491939092610100900460ff1690565b604080516001600160a01b039889168152968816602088015294909616938501939093526060840191909152608083015260a082015290151560c082015260e001610226565b3480156103ee57600080fd5b506102426103fd3660046154f5565b611f93565b34801561040e57600080fd5b5061043d61041d36600461555f565b600660209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610226565b34801561045957600080fd5b50610242610468366004615581565b6125a8565b34801561047957600080fd5b50610242610488366004615700565b6127e0565b34801561049957600080fd5b5061043d6104a836600461555f565b600560209081526000928352604080842090915290825290205460ff1681565b3480156104d457600080fd5b5061021c6104e3366004615200565b60016020526000908152604090205481565b34801561050157600080fd5b5061043d610510366004615200565b6000908152600e602052604090205460ff1690565b34801561053157600080fd5b50610242610540366004615418565b612d2b565b34801561055157600080fd5b5061021c610560366004615200565b60009081526008602052604090206003015490565b34801561058157600080fd5b5061021c610590366004615200565b6000908152600d602052604090205490565b3480156105ae57600080fd5b5061039c6105bd366004615200565b6000908152600c602052604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b039586169794861696959093169491939092610100900460ff1690565b34801561061c57600080fd5b5061064661062b366004615200565b6003602052600090815260409020546001600160a01b031681565b6040516102269190615814565b34801561065f57600080fd5b5061069d61066e366004615200565b600090815260086020526040902080546001820154600483015460028401546003909401549294919390929091565b604080519586526020860194909452928401919091526060830152608082015260a001610226565b6102426106d3366004615828565b612fc1565b3480156106e457600080fd5b5061021c6106f3366004615200565b60006020819052908152604090205481565b61024261071336600461585a565b6134ee565b34801561072457600080fd5b50600f54610646906001600160a01b031681565b34801561074457600080fd5b50610242610753366004615912565b614182565b34801561076457600080fd5b50610242610773366004615955565b61439e565b34801561078457600080fd5b50610319610793366004615200565b6000908152600b6020526040902080546001909101549091565b3480156107b957600080fd5b50601054610646906001600160a01b031681565b3480156107d957600080fd5b506102426107e8366004615981565b6144ea565b3480156107f957600080fd5b5061084e610808366004615200565b600090815260086020819052604090912060058101546006820154928201546007830154600990930154919490929160ff8116916101009091046001600160a01b031690565b60408051968752602087019590955293850192909252606084015260ff1660808301526001600160a01b031660a082015260c001610226565b34801561089357600080fd5b506102426108a23660046159e0565b61478a565b3480156108b357600080fd5b506102426108c2366004615a1b565b614922565b3480156108d357600080fd5b50610242614b48565b3480156108e857600080fd5b5061021c6108f7366004615200565b614d87565b34801561090857600080fd5b50600161043d565b60008888604051602001610925929190615a52565b60408051601f1981840301815291815281516020928301206000898152600790935291205490915060ff161515600114801561097f5750600081815260066020908152604080832089845290915290205460ff1615156001145b6109a45760405162461bcd60e51b815260040161099b90615a74565b60405180910390fd5b6040516331a9108f60e11b8152600481018890526000906001600160a01b038b1690636352211e90602401602060405180830381865afa1580156109ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a109190615a96565b9050336001600160a01b03821614610c6a5760105460405163d986ff6d60e01b81526000916001600160a01b03169063d986ff6d90610a6e908590738888888888888888888888888888888888888888903390600190600401615ab3565b602060405180830381865afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf9190615add565b80610b41575060105460405163d986ff6d60e01b81526001600160a01b039091169063d986ff6d90610b00908590738888888888888888888888888888888888888888903390600290600401615ab3565b602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b419190615add565b9050801515600003610c465760105460405163d986ff6d60e01b81526001600160a01b039091169063d986ff6d90610b849085908f903390600190600401615ab3565b602060405180830381865afa158015610ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc59190615add565b80610c43575060105460405163d986ff6d60e01b81526001600160a01b039091169063d986ff6d90610c029085908f903390600290600401615ab3565b602060405180830381865afa158015610c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c439190615add565b90505b600181151514610c685760405162461bcd60e51b815260040161099b90615afa565b505b6000828152600460205260409020548810801590610c9957506000828152600460205260409020600101548811155b610cdf5760405162461bcd60e51b81526020600482015260176024820152760a8ded6cadc40d2c840c8decae640dcdee840dac2e8c6d604b1b604482015260640161099b565b60008281526003602052604090819020549051632142170760e11b81526001600160a01b0383811660048301529182166024820152604481018a9052908b16906342842e0e90606401600060405180830381600087803b158015610d4257600080fd5b505af1158015610d56573d6000803e3d6000fd5b505050600088815260086020526040812054899250819089904210801590610d8e575060008481526008602052604090206001015442105b15610e28576001915060008c82604051602001610dac929190615b5b565b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052805190602001209050859350610e068a8a6008600089815260200190815260200160002060040154846150ee565b610e225760405162461bcd60e51b815260040161099b90615b81565b50610ea3565b6000848152600860205260409020600201544210801590610e5a57506000848152600860205260409020600301544211155b15610e8b57505060408051808201909152600881526711383ab13634b19160c11b6020820152839150600290610ea3565b60405162461bcd60e51b815260040161099b90615ba8565b600f54604051632bd5a7f560e21b8152600481018690526000916001600160a01b03169063af569fd490602401602060405180830381865afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f119190615bcc565b600f5460405163074dbd4360e51b8152600481018890526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015610f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e9190615bcc565b610f889190615bfb565b600f54604051633635558b60e11b8152600481018890529192506001600160a01b031690636c6aab1690602401602060405180830381865afa158015610fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff69190615bcc565b8111156110155760405162461bcd60e51b815260040161099b90615c0e565b61101e85614d87565b34101561103d5760405162461bcd60e51b815260040161099b90615c31565b60006110513461104c88614d87565b615106565b6000878152602081905260409020549091508190611070903490615bfb565b61107a9190615c54565b60008781526020819052604080822092909255600f549151632bd5a7f560e21b8152600481018990529092506001600160a01b039091169063af569fd490602401602060405180830381865afa1580156110d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fc9190615bcc565b600f5460405163074dbd4360e51b8152600481018990526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015611145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111699190615bcc565b6111739190615bfb565b9050600f60009054906101000a90046001600160a01b03166001600160a01b031663d3322d5382878a878e8c8b6040518863ffffffff1660e01b81526004016111c29796959493929190615c93565b600060405180830381600087803b1580156111dc57600080fd5b505af11580156111f0573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b60115460405163feb2e23360e01b8152631253e16d60e01b916001600160a01b03169063feb2e2339061123f9033908590600401615ce4565b602060405180830381865afa15801561125c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112809190615add565b151560011480611302575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906112bb903390600401615814565b602060405180830381865afa1580156112d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fc9190615add565b15156001145b61131e5760405162461bcd60e51b815260040161099b90615d07565b600f54604051620d374160ec1b8152600481018690526001600160a01b039091169063d374100090602401602060405180830381865afa158015611366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138a9190615add565b151560011480156114085750600f54604051620d374160ec1b8152600481018590526001600160a01b039091169063d374100090602401602060405180830381865afa1580156113de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114029190615add565b15156001145b6114245760405162461bcd60e51b815260040161099b90615d2c565b5060009283526005602090815260408085209385529290529120805460ff1916911515919091179055565b600f54604051631732052d60e31b8152600481018990528891630e3d459160e11b916001600160a01b039091169063b990296890602401602060405180830381865afa1580156114a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c79190615a96565b6001600160a01b0316336001600160a01b0316148061155a575060115460405163feb2e23360e01b81526001600160a01b039091169063feb2e233906115139033908590600401615ce4565b602060405180830381865afa158015611530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115549190615add565b15156001145b806115d7575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611590903390600401615814565b602060405180830381865afa1580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190615add565b15156001145b6115f35760405162461bcd60e51b815260040161099b90615d07565b6000898152600c6020526040902060060154610100900460ff161561162a5760405162461bcd60e51b815260040161099b90615d4d565b6000898152600b6020526040902054836116448688615bfb565b61164e9190615bfb565b1461166b5760405162461bcd60e51b815260040161099b90615d77565b50506000968752600c602052604090962080546001600160a01b039687166001600160a01b0319918216178255600180830180549789169783169790971790965560028201805495909716941693909317909455600382015560048101929092556005820192909255600601805461ffff19169091179055565b60115460405163feb2e23360e01b81526315b39d1760e11b916001600160a01b03169063feb2e2339061171e9033908590600401615ce4565b602060405180830381865afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f9190615add565b1515600114806117e1575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061179a903390600401615814565b602060405180830381865afa1580156117b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117db9190615add565b15156001145b6117fd5760405162461bcd60e51b815260040161099b90615d07565b50600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60115460405163feb2e23360e01b8152632ebc24b360e01b916001600160a01b03169063feb2e233906118599033908590600401615ce4565b602060405180830381865afa158015611876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189a9190615add565b15156001148061191c575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906118d5903390600401615814565b602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190615add565b15156001145b6119385760405162461bcd60e51b815260040161099b90615d07565b6000868152600a602052604090206006015460ff6101009091041615156001146119975760405162461bcd60e51b815260206004820152601060248201526f41636365707420526f79616c7469657360801b604482015260640161099b565b600086815260208190526040902054611a035760405162461bcd60e51b815260206004820152602860248201527f436f6c6c656374696f6e2042616c616e6365206d757374206265206772617465604482015267072207468616e20360c41b606482015260840161099b565b6000868152600960205260409020548290611a1f908590615bfb565b611a299190615bfb565b606414611a6d5760405162461bcd60e51b81526020600482015260126024820152714368616e67652070657263656e746167657360701b604482015260640161099b565b600086815260208181526040808320805490849055600a9092528220600301549091879187918a918190819081908190606490611aaa908b615d98565b611ab49190615daf565b6000878152600a6020526040902060040154909550606490611ad6908b615d98565b611ae09190615daf565b6000878152600a6020526040902060050154909450606490611b02908b615d98565b611b0c9190615daf565b92506064611b1a8d8b615d98565b611b249190615daf565b91506064611b328c8b615d98565b611b3c9190615daf565b6000878152600a602052604080822054905192935090916001600160a01b039091169087908381818185875af1925050503d8060008114611b99576040519150601f19603f3d011682016040523d82523d6000602084013e611b9e565b606091505b50506000888152600a602052604080822060010154905192935090916001600160a01b039091169087908381818185875af1925050503d8060008114611c00576040519150601f19603f3d011682016040523d82523d6000602084013e611c05565b606091505b50506000898152600a602052604080822060020154905192935090916001600160a01b039091169087908381818185875af1925050503d8060008114611c67576040519150601f19603f3d011682016040523d82523d6000602084013e611c6c565b606091505b5050905060008b6001600160a01b03168660405160006040518083038185875af1925050503d8060008114611cbd576040519150601f19603f3d011682016040523d82523d6000602084013e611cc2565b606091505b5050905060008b6001600160a01b03168660405160006040518083038185875af1925050503d8060008114611d13576040519150601f19603f3d011682016040523d82523d6000602084013e611d18565b606091505b5050905084611d395760405162461bcd60e51b815260040161099b90615dd1565b83611d565760405162461bcd60e51b815260040161099b90615dd1565b82611d735760405162461bcd60e51b815260040161099b90615dd1565b81611d905760405162461bcd60e51b815260040161099b90615dd1565b806111f05760405162461bcd60e51b815260040161099b90615dd1565b60115460405163feb2e23360e01b8152630e234b0960e21b916001600160a01b03169063feb2e23390611de69033908590600401615ce4565b602060405180830381865afa158015611e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e279190615add565b151560011480611ea9575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611e62903390600401615814565b602060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea39190615add565b15156001145b611ec55760405162461bcd60e51b815260040161099b90615d07565b816001600160a01b0316639068edac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f279190615add565b1515600114611f705760405162461bcd60e51b815260206004820152601560248201527421b7b73a3930b1ba1034b9903737ba1020b236b4b760591b604482015260640161099b565b50601180546001600160a01b0319166001600160a01b0392909216919091179055565b60115460405163feb2e23360e01b815263231b95d360e11b916001600160a01b03169063feb2e23390611fcc9033908590600401615ce4565b602060405180830381865afa158015611fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200d9190615add565b15156001148061208f575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612048903390600401615814565b602060405180830381865afa158015612065573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120899190615add565b15156001145b6120ab5760405162461bcd60e51b815260040161099b90615d07565b600f54604051620d374160ec1b8152600481018590526001600160a01b039091169063d374100090602401602060405180830381865afa1580156120f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121179190615add565b15156001146121385760405162461bcd60e51b815260040161099b90615df5565b600f54604051632bd5a7f560e21b8152600481018590526000916001600160a01b03169063af569fd490602401602060405180830381865afa158015612182573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a69190615bcc565b600f5460405163074dbd4360e51b8152600481018790526001600160a01b039091169063e9b7a86090602401602060405180830381865afa1580156121ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122139190615bcc565b61221d9190615bfb565b600f54604051633635558b60e11b8152600481018790529192506001600160a01b031690636c6aab1690602401602060405180830381865afa158015612267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228b9190615bcc565b8111156122aa5760405162461bcd60e51b815260040161099b90615c0e565b600f54604051632bd5a7f560e21b8152600481018690526000916001600160a01b03169063af569fd490602401602060405180830381865afa1580156122f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123189190615bcc565b600f5460405163074dbd4360e51b8152600481018890526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015612361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123859190615bcc565b61238f9190615bfb565b6000868152600160205260408120549192509081036123ce576000868152600860205260409020600781015490546123c79190615c54565b90506123df565b506000858152600160205260409020545b6000868152600860205260408120600701546123fb8342615c54565b6124059190615daf565b905060018110156124285760405162461bcd60e51b815260040161099b90615e17565b6000878152600260205260409081902054600f549151632bd5a7f560e21b8152600481018a905290916001600160a01b03169063af569fd490602401602060405180830381865afa158015612481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a59190615bcc565b6124af9190615c54565b6000888152600860205260409020600701546124cb9190615d98565b6000888152600860205260409020546124e49190615bfb565b6000888152600160205260409020556124ff42610258615bfb565b86101561250b57600080fd5b6000838152600d60209081526040808320899055600e90915290819020805460ff19166001179055600f5490516379ae0a2960e11b81526001600160a01b039091169063f35c14529061256a9086908e908e908e908e90600401615e3e565b600060405180830381600087803b15801561258457600080fd5b505af1158015612598573d6000803e3d6000fd5b5050505050505050505050505050565b60115460405163feb2e23360e01b8152632614e37960e11b916001600160a01b03169063feb2e233906125e19033908590600401615ce4565b602060405180830381865afa1580156125fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126229190615add565b1515600114806126a4575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061265d903390600401615814565b602060405180830381865afa15801561267a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269e9190615add565b15156001145b6126c05760405162461bcd60e51b815260040161099b90615d07565b600088886040516020016126d5929190615a52565b60408051808303601f19018152908290528051602090910120600f54620d374160ec1b8352600483018a90529092506001600160a01b03169063d374100090602401602060405180830381865afa158015612734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127589190615add565b15156001146127795760405162461bcd60e51b815260040161099b90615d2c565b6000818152600660209081526040808320998352988152888220805460ff1916951515959095179094559081526003835286812080546001600160a01b0319166001600160a01b039590951694909417909355506004905292909220908155600101555050565b60115460405163feb2e23360e01b8152635ac57d8b60e01b916001600160a01b03169063feb2e233906128199033908590600401615ce4565b602060405180830381865afa158015612836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285a9190615add565b1515600114806128dc575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612895903390600401615814565b602060405180830381865afa1580156128b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d69190615add565b15156001145b6128f85760405162461bcd60e51b815260040161099b90615d07565b600f54604051620d374160ec1b8152600481018590526001600160a01b039091169063d374100090602401602060405180830381865afa158015612940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129649190615add565b15156001146129855760405162461bcd60e51b815260040161099b90615df5565b6000805b8751811015612d215760018482815181106129a6576129a6615b21565b6020908102919091010151600f54604051632bd5a7f560e21b8152600481018990526001600160a01b039091169063af569fd490602401602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e9190615bcc565b600f5460405163074dbd4360e51b8152600481018a90526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b9190615bcc565b612a959190615bfb565b612a9f9190615bfb565b612aa99190615c54565b600f54604051633635558b60e11b8152600481018890529193506001600160a01b031690636c6aab1690602401602060405180830381865afa158015612af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b179190615bcc565b821115612b365760405162461bcd60e51b815260040161099b90615c0e565b60005b848281518110612b4b57612b4b615b21565b6020026020010151811015612d0e57600f54604051632bd5a7f560e21b8152600481018890526000916001600160a01b03169063af569fd490602401602060405180830381865afa158015612ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc89190615bcc565b600f5460405163074dbd4360e51b8152600481018a90526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015612c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c359190615bcc565b612c3f9190615bfb565b600f548b519192506001600160a01b03169063f35c14529083908d9087908110612c6b57612c6b615b21565b60200260200101518c8781518110612c8557612c85615b21565b60200260200101518c8881518110612c9f57612c9f615b21565b60200260200101518c6040518663ffffffff1660e01b8152600401612cc8959493929190615e3e565b600060405180830381600087803b158015612ce257600080fd5b505af1158015612cf6573d6000803e3d6000fd5b50505050508080612d0690615e7c565b915050612b39565b5080612d1981615e7c565b915050612989565b5050505050505050565b600f54604051631732052d60e31b8152600481018990528891637e04bcb760e01b916001600160a01b039091169063b990296890602401602060405180830381865afa158015612d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da39190615a96565b6001600160a01b0316336001600160a01b03161480612e36575060115460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390612def9033908590600401615ce4565b602060405180830381865afa158015612e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e309190615add565b15156001145b80612eb3575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612e6c903390600401615814565b602060405180830381865afa158015612e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ead9190615add565b15156001145b612ecf5760405162461bcd60e51b815260040161099b90615d07565b6000898152600a6020526040902060060154610100900460ff1615612f065760405162461bcd60e51b815260040161099b90615d4d565b60008981526009602052604090205483612f208688615bfb565b612f2a9190615bfb565b14612f475760405162461bcd60e51b815260040161099b90615d77565b50506000968752600a602052604090962080546001600160a01b039687166001600160a01b0319918216178255600180830180549789169783169790971790965560028201805495909716941693909317909455600382015560048101929092556005820192909255600601805461ffff19169091179055565b60008281526007602052604090205460ff16151560011480156130025750600084815260056020908152604080832085845290915290205460ff1615156001145b61301e5760405162461bcd60e51b815260040161099b90615a74565b600082815260086020526040902060020154421080159061305057506000828152600860205260409020600301544211155b61306c5760405162461bcd60e51b815260040161099b90615ba8565b600f5460405163074dbd4360e51b8152600481018690526001600160a01b039091169063e9b7a86090602401602060405180830381865afa1580156130b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d99190615bcc565b83101580156131545750600f54604051633635558b60e11b8152600481018690526001600160a01b0390911690636c6aab1690602401602060405180830381865afa15801561312c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131509190615bcc565b8311155b6131955760405162461bcd60e51b815260206004820152601260248201527131b7b617ba37b5b2b71034b21032b93937b960711b604482015260640161099b565b600f54604051632bd5a7f560e21b8152600481018490526000916001600160a01b03169063af569fd490602401602060405180830381865afa1580156131df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132039190615bcc565b600f5460405163074dbd4360e51b8152600481018690526001600160a01b039091169063e9b7a86090602401602060405180830381865afa15801561324c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132709190615bcc565b61327a9190615bfb565b600f54604051633635558b60e11b8152600481018690529192506001600160a01b031690636c6aab1690602401602060405180830381865afa1580156132c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e89190615bcc565b8111156133075760405162461bcd60e51b815260040161099b90615c0e565b61331083614d87565b34101561332f5760405162461bcd60e51b815260040161099b90615c31565b600061333e3461104c86614d87565b600085815260208190526040902054909150819061335d903490615bfb565b6133679190615c54565b60008581526020819052604080822092909255600f549151632bd5a7f560e21b8152600481018790529092506001600160a01b039091169063af569fd490602401602060405180830381865afa1580156133c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e99190615bcc565b600f5460405163074dbd4360e51b8152600481018790526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015613432573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134569190615bcc565b6134609190615bfb565b600f546040516339143a1d60e01b815260048101839052602481018990526044810188905260648101879052608481018690523360a482018190529293506001600160a01b03909116906339143a1d9060c401600060405180830381600087803b1580156134cd57600080fd5b505af11580156134e1573d6000803e3d6000fd5b5050505050505050505050565b60008981526007602052604090205460ff16151560011480156135115750600088115b6135435760405162461bcd60e51b815260206004820152600360248201526232b93960e91b604482015260640161099b565b6000898152600860205260408120548a9190819089904210801590613578575060008481526008602052604090206001015442105b15613a25576001915060006001600160a01b038716156138fb5760105460405163d986ff6d60e01b81526000916001600160a01b03169063d986ff6d906135de908b90738888888888888888888888888888888888888888903390600190600401615ab3565b602060405180830381865afa1580156135fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361f9190615add565b806136b1575060105460405163d986ff6d60e01b81526001600160a01b039091169063d986ff6d90613670908b90738888888888888888888888888888888888888888903390600290600401615ab3565b602060405180830381865afa15801561368d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b19190615add565b90508015156000036137ec576010546000878152600860205260409081902060090154905163d986ff6d60e01b81526001600160a01b039283169263d986ff6d9261370f928d92610100909204909116903390600190600401615ab3565b602060405180830381865afa15801561372c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137509190615add565b806137e957506010546000878152600860205260409081902060090154905163d986ff6d60e01b81526001600160a01b039283169263d986ff6d926137a8928d92610100909204909116903390600290600401615ab3565b602060405180830381865afa1580156137c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e99190615add565b90505b60018115151461380e5760405162461bcd60e51b815260040161099b90615afa565b878d8460405160200161382393929190615e95565b60408051808303601f19018152828252805160209182012081840152815180840382018152838301928390528051910120600f5463065b6b3f60e51b90925293508f916001600160a01b039091169063cb6d67e090613888908a908d90604401615ed4565b602060405180830381865afa1580156138a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c99190615bcc565b6138d39190615bfb565b8d10156138f25760405162461bcd60e51b815260040161099b90615eeb565b879450506139e3565b338c8360405160200161391093929190615e95565b60408051808303601f19018152828252805160209182012081840152815180840382018152838301928390528051910120600f5463065b6b3f60e51b90925292508e916001600160a01b039091169063cb6d67e0906139759089903390604401615ed4565b602060405180830381865afa158015613992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b69190615bcc565b6139c09190615bfb565b8c10156139df5760405162461bcd60e51b815260040161099b90615eeb565b3393505b600085815260086020526040902060040154613a03908a908a90846150ee565b613a1f5760405162461bcd60e51b815260040161099b90615b81565b50613c54565b6000848152600860205260409020600201544210801590613a5757506000848152600860205260409020600301544211155b15610e8b57600f5460405163945e549b60e01b815260048101869052600293506001600160a01b039091169063945e549b90602401602060405180830381865afa158015613aa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acd9190615bcc565b8c1115613b125760405162461bcd60e51b81526020600482015260136024820152724368616e6765206e6f206f6620746f6b656e7360681b604482015260640161099b565b600f5460405163945e549b60e01b8152600481018690526001600160a01b039091169063945e549b90602401602060405180830381865afa158015613b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7f9190615bcc565b600f5460405163e943a2c760e01b81528e916001600160a01b03169063e943a2c790613bb19089903390600401615ed4565b602060405180830381865afa158015613bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf29190615bcc565b613bfc9190615bfb565b1115613c305760405162461bcd60e51b815260206004820152600360248201526209ac2f60eb1b604482015260640161099b565b5060408051808201909152600881526711383ab13634b19160c11b60208201523392505b600f54604051632bd5a7f560e21b8152600481018690526000916001918f916001600160a01b03169063af569fd490602401602060405180830381865afa158015613ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc79190615bcc565b600f5460405163074dbd4360e51b8152600481018a90526001600160a01b039091169063e9b7a86090602401602060405180830381865afa158015613d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d349190615bcc565b613d3e9190615bfb565b613d489190615bfb565b613d529190615c54565b600f54604051633635558b60e11b8152600481018890529192506001600160a01b031690636c6aab1690602401602060405180830381865afa158015613d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc09190615bcc565b811115613ddf5760405162461bcd60e51b815260040161099b90615c0e565b8c613de986614d87565b613df39190615d98565b341015613e125760405162461bcd60e51b815260040161099b90615c31565b6000613e2c348f613e2289614d87565b61104c9190615d98565b6000878152602081905260409020549091508190613e4b903490615bfb565b613e559190615c54565b6000878152602081815260408083209390935560089052206009015460ff166003039050613fec576000858152600160205260408120548103613eb857600086815260086020526040902060078101549054613eb19190615c54565b9050613ec9565b506000858152600160205260409020545b600086815260086020526040812060070154613ee58342615c54565b613eef9190615daf565b905060018110158015613f0257508e6001145b613f1e5760405162461bcd60e51b815260040161099b90615e17565b6000878152600260205260409081902054600f549151632bd5a7f560e21b8152600481018a905290916001600160a01b03169063af569fd490602401602060405180830381865afa158015613f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9b9190615bcc565b613fa59190615c54565b600088815260086020526040902060070154613fc19190615d98565b600088815260086020526040902054613fda9190615bfb565b60008881526001602052604090205550505b60005b8d81101561417157600f54604051632bd5a7f560e21b8152600481018890526000916001600160a01b03169063af569fd490602401602060405180830381865afa158015614041573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140659190615bcc565b600f5460405163074dbd4360e51b8152600481018a90526001600160a01b039091169063e9b7a86090602401602060405180830381865afa1580156140ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d29190615bcc565b6140dc9190615bfb565b9050600f60009054906101000a90046001600160a01b03166001600160a01b031663d3322d5382888f888d8d8c6040518863ffffffff1660e01b815260040161412b9796959493929190615c93565b600060405180830381600087803b15801561414557600080fd5b505af1158015614159573d6000803e3d6000fd5b5050505050808061416990615e7c565b915050613fef565b505050505050505050505050505050565b601154604051630cab15dd60e31b81523360048201526024810188905287916305c2fcbd60e51b916001600160a01b0390911690636558aee890604401602060405180830381865afa1580156141dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142009190615add565b151560011480614284575060115460405163feb2e23360e01b81526001600160a01b039091169063feb2e2339061423d9033908590600401615ce4565b602060405180830381865afa15801561425a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061427e9190615add565b15156001145b80614301575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906142ba903390600401615814565b602060405180830381865afa1580156142d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142fb9190615add565b15156001145b61431d5760405162461bcd60e51b815260040161099b90615d07565b60008881526007602052604090205460ff16151560011461436c5760405162461bcd60e51b815260206004820152600960248201526853657420436f73747360b81b604482015260640161099b565b505060009586526008602052604090952093845560018401929092556004830193909355600282019290925560030155565b60115460405163feb2e23360e01b815263b986eaa760e01b916001600160a01b03169063feb2e233906143d79033908590600401615ce4565b602060405180830381865afa1580156143f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144189190615add565b15156001148061449a575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590614453903390600401615814565b602060405180830381865afa158015614470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144949190615add565b15156001145b6144b65760405162461bcd60e51b815260040161099b90615d07565b836001036144d45760008381526002602052604090208290556144e4565b6000838152600160205260408120555b50505050565b601154604051630cab15dd60e31b815233600482015260248101899052889163d2f4302f60e01b916001600160a01b0390911690636558aee890604401602060405180830381865afa158015614544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145689190615add565b1515600114806145ec575060115460405163feb2e23360e01b81526001600160a01b039091169063feb2e233906145a59033908590600401615ce4565b602060405180830381865afa1580156145c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145e69190615add565b15156001145b80614669575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590614622903390600401615814565b602060405180830381865afa15801561463f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146639190615add565b15156001145b6146855760405162461bcd60e51b815260040161099b90615d07565b600f54604051620d374160ec1b8152600481018b90526001600160a01b039091169063d374100090602401602060405180830381865afa1580156146cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146f19190615add565b15156001146147125760405162461bcd60e51b815260040161099b90615df5565b50506000968752600860208181526040808a206005810199909955600689019790975590870194909455600780870193909355600990950180546001600160a01b03909616610100026001600160a81b031990961660ff9092169190911794909417909355919091529020805460ff19166001179055565b60115460405163feb2e23360e01b81526335062ebb60e21b916001600160a01b03169063feb2e233906147c39033908590600401615ce4565b602060405180830381865afa1580156147e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148049190615add565b151560011480614886575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061483f903390600401615814565b602060405180830381865afa15801561485c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148809190615add565b15156001145b6148a25760405162461bcd60e51b815260040161099b90615d07565b6148ac8486615bfb565b6064146148cb5760405162461bcd60e51b815260040161099b90615f0d565b6148d58284615bfb565b6064146148f45760405162461bcd60e51b815260040161099b90615f0d565b506000948552600960209081526040808720958655600195860194909455600b905291909320928355910155565b60115460405163feb2e23360e01b815263d6516f4760e01b916001600160a01b03169063feb2e2339061495b9033908590600401615ce4565b602060405180830381865afa158015614978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061499c9190615add565b151560011480614a1e575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906149d7903390600401615814565b602060405180830381865afa1580156149f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a189190615add565b15156001145b614a3a5760405162461bcd60e51b815260040161099b90615d07565b6000848152600a602052604090206006015460ff1615156001148015614a7657506000848152600c602052604090206006015460ff1615156001145b614ab65760405162461bcd60e51b815260206004820152601160248201527050726f706f73652041646472657373657360781b604482015260640161099b565b6000848152600a602090815260408083206006908101805488151561010081810261ff001993841617909355600c9095529285209091018054871515909202919092161790559003614b20576000848152600a60205260409020600601805460ff191690556144e4565b8115156000036144e4575050506000908152600c60205260409020600601805460ff19169055565b60115460405163feb2e23360e01b81526336cb886f60e21b916001600160a01b03169063feb2e23390614b819033908590600401615ce4565b602060405180830381865afa158015614b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bc29190615add565b151560011480614c44575060115460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590614bfd903390600401615814565b602060405180830381865afa158015614c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c3e9190615add565b15156001145b614c605760405162461bcd60e51b815260040161099b90615d07565b60115460408051638da5cb5b60e01b8152905147926000926001600160a01b0390911691638da5cb5b916004808201926020929091908290030181865afa158015614caf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cd39190615a96565b90506000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114614d22576040519150601f19603f3d011682016040523d82523d6000602084013e614d27565b606091505b5050905080614d485760405162461bcd60e51b815260040161099b90615dd1565b6040518115158152839033907f4a48cb98c5be023b78a0b3ec94107a01a0397b2e389d4b5f252aef518e633ec39060200160405180910390a350505050565b600081815260086020526040812060090154819060ff16600303614eb9576000838152600860208190526040909120015415614ea2576000838152600260205260409081902054600f549151632bd5a7f560e21b81526004810186905290916001600160a01b03169063af569fd490602401602060405180830381865afa158015614e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e3a9190615bcc565b614e449190615c54565b600084815260086020819052604090912090810154600590910154606491614e6b91615d98565b614e759190615daf565b614e7f9190615d98565b600084815260086020526040902060050154614e9b9190615bfb565b9392505050565b505060009081526008602052604090206005015490565b60008381526008602052604090206009015460ff166002148015614eeb57506000838152600860205260409020544210155b8015614f0857506000838152600860205260409020600301544211155b15614ea257600083815260086020526040902060078101549054614f2c9042615c54565b614f369190615daf565b600084815260086020819052604082200154919250908190810361501157614f5f836001615bfb565b600086815260086020526040902060050154614f7b9190615daf565b6000868152600860205260409020805460079091015491935090614f9f9085615d98565b614fa99042615c54565b614fb39190615c54565b600086815260086020526040902060070154614fd0856002615bfb565b600088815260086020526040902060050154614fec9190615daf565b614ff69085615c54565b6150009190615daf565b61500a9190615d98565b90506150a0565b6000858152600860208190526040909120908101546006820154600590920154859261503c91615c54565b6150469190615daf565b1061508b57600085815260086020819052604090912001546150689084615d98565b6000868152600860205260409020600501546150849190615c54565b91506150a0565b60008581526008602052604090206006015491505b6000858152600860205260409020600601546150bc8284615c54565b11156150d5576150cc8183615c54565b95945050505050565b5050506000918252506008602052604090206006015490565b6000826150fc868685615188565b1495945050505050565b6000806151138385615c54565b604051909150600090339083908381818185875af1925050503d8060008114615158576040519150601f19603f3d011682016040523d82523d6000602084013e61515d565b606091505b505090508061517e5760405162461bcd60e51b815260040161099b90615dd1565b5090505b92915050565b600081815b848110156151cb576151b7828787848181106151ab576151ab615b21565b905060200201356151d4565b9150806151c381615e7c565b91505061518d565b50949350505050565b60008183106151f0576000828152602084905260409020614e9b565b5060009182526020526040902090565b60006020828403121561521257600080fd5b5035919050565b6001600160a01b038116811461522e57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561526f5761526f615231565b604052919050565b600082601f83011261528857600080fd5b81356001600160401b038111156152a1576152a1615231565b6152b4601f8201601f1916602001615247565b8181528460208386010111156152c957600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f8401126152f857600080fd5b5081356001600160401b0381111561530f57600080fd5b6020830191508360208260051b850101111561532a57600080fd5b9250929050565b60008060008060008060008060e0898b03121561534d57600080fd5b883561535881615219565b975060208901359650604089013595506060890135945060808901356001600160401b038082111561538957600080fd5b6153958c838d01615277565b955060a08b01359150808211156153ab57600080fd5b506153b88b828c016152e6565b999c989b50969995989497949560c00135949350505050565b801515811461522e57600080fd5b6000806000606084860312156153f457600080fd5b8335925060208401359150604084013561540d816153d1565b809150509250925092565b600080600080600080600060e0888a03121561543357600080fd5b87359650602088013561544581615219565b9550604088013561545581615219565b9450606088013561546581615219565b9699959850939660808101359560a0820135955060c0909101359350915050565b60006020828403121561549857600080fd5b8135614e9b81615219565b600080600080600060a086880312156154bb57600080fd5b8535945060208601356154cd81615219565b935060408601356154dd81615219565b94979396509394606081013594506080013592915050565b600080600080600060a0868803121561550d57600080fd5b853561551881615219565b945060208601356001600160401b0381111561553357600080fd5b61553f88828901615277565b959895975050505060408401359360608101359360809091013592509050565b6000806040838503121561557257600080fd5b50508035926020909101359150565b600080600080600080600060e0888a03121561559c57600080fd5b87356155a781615219565b96506020880135955060408801359450606088013593506080880135925060a08801356155d381615219565b915060c08801356155e3816153d1565b8091505092959891949750929550565b60006001600160401b0382111561560c5761560c615231565b5060051b60200190565b600082601f83011261562757600080fd5b8135602061563c615637836155f3565b615247565b82815260059290921b8401810191818101908684111561565b57600080fd5b8286015b8481101561569a5780356001600160401b0381111561567e5760008081fd5b61568c8986838b0101615277565b84525091830191830161565f565b509695505050505050565b600082601f8301126156b657600080fd5b813560206156c6615637836155f3565b82815260059290921b840181019181810190868411156156e557600080fd5b8286015b8481101561569a57803583529183019183016156e9565b600080600080600060a0868803121561571857600080fd5b85356001600160401b038082111561572f57600080fd5b818801915088601f83011261574357600080fd5b81356020615753615637836155f3565b82815260059290921b8401810191818101908c84111561577257600080fd5b948201945b8386101561579957853561578a81615219565b82529482019490820190615777565b995050890135925050808211156157af57600080fd5b6157bb89838a01615616565b955060408801359150808211156157d157600080fd5b6157dd89838a016156a5565b94506060880135935060808801359150808211156157fa57600080fd5b50615807888289016156a5565b9150509295509295909350565b6001600160a01b0391909116815260200190565b6000806000806080858703121561583e57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060008060008060006101008a8c03121561587957600080fd5b8935985060208a0135975060408a0135965060608a01356001600160401b03808211156158a557600080fd5b6158b18d838e01615277565b975060808c013591506158c382615219565b90955060a08b013590808211156158d957600080fd5b506158e68c828d016152e6565b90955093505060c08a01356158fa81615219565b8092505060e08a013590509295985092959850929598565b60008060008060008060c0878903121561592b57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008060006060848603121561596a57600080fd5b505081359360208301359350604090920135919050565b600080600080600080600060e0888a03121561599c57600080fd5b873596506020880135955060408801359450606088013593506080880135925060a088013560ff811681146159d057600080fd5b915060c08801356155e381615219565b600080600080600060a086880312156159f857600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600060608486031215615a3057600080fd5b833592506020840135615a42816153d1565b9150604084013561540d816153d1565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b60208082526008908201526734b734ba1032b93960c11b604082015260600190565b600060208284031215615aa857600080fd5b8151614e9b81615219565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b600060208284031215615aef57600080fd5b8151614e9b816153d1565b6020808252600d908201526c2737903232b632b3b0ba34b7b760991b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60005b83811015615b52578181015183820152602001615b3a565b50506000910152565b82815260008251615b73816020850160208701615b37565b919091016020019392505050565b6020808252600d908201526c34b73b30b634b210383937b7b360991b604082015260600190565b6020808252600a90820152694e6f206d696e74696e6760b01b604082015260600190565b600060208284031215615bde57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561518257615182615be5565b6020808252600990820152684e6f20737570706c7960b81b604082015260600190565b6020808252600990820152680aee4dedcce408aa8960bb1b604082015260600190565b8181038181111561518257615182615be5565b60008151808452615c7f816020860160208601615b37565b601f01601f19169290920160200192915050565b8781526001600160a01b0387811660208301528616604082015260e060608201819052600090615cc590830187615c67565b60808301959095525060a081019290925260c090910152949350505050565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252600790820152664e6f206461746160c81b604082015260600190565b60208082526010908201526f105b1c9958591e48185c1c1c9bdd995960821b604082015260600190565b602080825260079082015266436865636b202560c81b604082015260600190565b808202811582820484141761518257615182615be5565b600082615dcc57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600a90820152691155120819985a5b195960b21b604082015260600190565b602080825260089082015267416464206461746160c01b604082015260600190565b6020808252600d908201526c0c481b5a5b9d0bdc195c9a5bd9609a1b604082015260600190565b8581526001600160a01b038516602082015260a060408201819052600090615e6890830186615c67565b606083019490945250608001529392505050565b600060018201615e8e57615e8e615be5565b5060010190565b6bffffffffffffffffffffffff198460601b16815282601482015260008251615ec5816034850160208701615b37565b91909101603401949350505050565b9182526001600160a01b0316602082015260400190565b6020808252600890820152671053081b1a5b5a5d60c21b604082015260600190565b60208082526016908201527573706c697473206e65656420746f206265203130302560501b60408201526060019056fea2646970667358221220b70160aef7eef99472bb263304952646fc6ef8b0f53546cfb6fe30368d304ad764736f6c63430008130033

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

0000000000000000000000002c8fdced22b28e13f1a472cf7f19e2f56c204c830000000000000000000000002202cb9c00487e7e8ef21e6d8e914b32e709f43d00000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f8

-----Decoded View---------------
Arg [0] : _gencore (address): 0x2c8FdCeD22B28e13f1a472cf7f19e2f56C204c83
Arg [1] : _del (address): 0x2202CB9c00487e7e8EF21e6d8E914B32e709f43d
Arg [2] : _adminsContract (address): 0x26AD9C64930bf5e057cB895a183436b30ad140f8

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002c8fdced22b28e13f1a472cf7f19e2f56c204c83
Arg [1] : 0000000000000000000000002202cb9c00487e7e8ef21e6d8e914b32e709f43d
Arg [2] : 00000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f8


Deployed Bytecode Sourcemap

361:35744:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;679:56;;;;;;;;;;-1:-1:-1;679:56:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;;345:25:7;;;333:2;318:18;679:56:6;;;;;;;;18944:3075;;;;;;:::i;:::-;;:::i;:::-;;17707:391;;;;;;;;;;-1:-1:-1;17707:391:6;;;;;:::i;:::-;;:::i;24279:1305::-;;;;;;;;;;-1:-1:-1;24279:1305:6;;;;;:::i;:::-;;:::i;28658:161::-;;;;;;;;;;-1:-1:-1;28658:161:6;;;;;:::i;:::-;;:::i;26534:2073::-;;;;;;;;;;-1:-1:-1;26534:2073:6;;;;;:::i;:::-;;:::i;28871:296::-;;;;;;;;;;-1:-1:-1;28871:296:6;;;;;:::i;:::-;;:::i;29679:247::-;;;;;;;;;;-1:-1:-1;29679:247:6;;;;;:::i;:::-;29753:7;29789:47;;;:32;:47;;;;;:64;;29855:62;;;;;29789:64;;29679:247;;;;;5251:25:7;;;5307:2;5292:18;;5285:34;;;;5224:18;29679:247:6;5077:248:7;29999:615:6;;;;;;;;;;-1:-1:-1;29999:615:6;;;;;:::i;:::-;30090:7;30168:47;;;:32;:47;;;;;:59;;;30229;;;30290;;;;30351:62;;;;30415;;;;30479;;;;30543;;;;;-1:-1:-1;;;;;30168:59:6;;;;30229;;;;30290;;;;;30351:62;;30415;;30168:59;30543:62;;;;;29999:615;;;;;-1:-1:-1;;;;;5695:15:7;;;5677:34;;5747:15;;;5742:2;5727:18;;5720:43;5799:15;;;;5779:18;;;5772:43;;;;5846:2;5831:18;;5824:34;;;;5889:3;5874:19;;5867:35;5657:3;5918:19;;5911:35;5990:14;;5983:22;5977:3;5962:19;;5955:51;5626:3;5611:19;29999:615:6;5330:682:7;14814:2016:6;;;;;;;;;;-1:-1:-1;14814:2016:6;;;;;:::i;:::-;;:::i;1312:83::-;;;;;;;;;;-1:-1:-1;1312:83:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7103:14:7;;7096:22;7078:41;;7066:2;7051:18;1312:83:6;6938:187:7;18169:707:6;;;;;;;;;;-1:-1:-1;18169:707:6;;;;;:::i;:::-;;:::i;7409:990::-;;;;;;;;;;-1:-1:-1;7409:990:6;;;;;:::i;:::-;;:::i;1103:75::-;;;;;;;;;;-1:-1:-1;1103:75:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;584:45;;;;;;;;;;-1:-1:-1;584:45:6;;;;;:::i;:::-;;;;;;;;;;;;;;33170:129;;;;;;;;;;-1:-1:-1;33170:129:6;;;;;:::i;:::-;33238:4;33262:29;;;:19;:29;;;;;;;;;33170:129;22925:1263;;;;;;;;;;-1:-1:-1;22925:1263:6;;;;;:::i;:::-;;:::i;32814:143::-;;;;;;;;;;-1:-1:-1;32814:143:6;;;;;:::i;:::-;32880:4;32904:31;;;:16;:31;;;;;:45;;;;32814:143;33001:127;;;;;;;;;;-1:-1:-1;33001:127:6;;;;;:::i;:::-;33069:4;33093:27;;;:17;:27;;;;;;;33001:127;31022:637;;;;;;;;;;-1:-1:-1;31022:637:6;;;;;:::i;:::-;31115:7;31193:49;;;:34;:49;;;;;:63;;;31258;;;31323;;;;31388:64;;;;31454;;;;31520;;;;31586;;;;;-1:-1:-1;;;;;31193:63:6;;;;31258;;;;31323;;;;;31388:64;;31454;;31193:63;31586:64;;;;;31022:637;805:53;;;;;;;;;;-1:-1:-1;805:53:6;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;805:53:6;;;;;;;;;;:::i;31741:377::-;;;;;;;;;;-1:-1:-1;31741:377:6;;;;;:::i;:::-;31818:4;31869:31;;;:16;:31;;;;;:50;;31921:48;;;;31971:42;;;;32015:47;;;;32064:45;;;;;31869:50;;31921:48;;31971:42;;32015:47;;31741:377;;;;;12338:25:7;;;12394:2;12379:18;;12372:34;;;;12422:18;;;12415:34;;;;12480:2;12465:18;;12458:34;12523:3;12508:19;;12501:35;12325:3;12310:19;31741:377:6;12079:463:7;13256:1519:6;;;;;;:::i;:::-;;:::i;461:57::-;;;;;;;;;;-1:-1:-1;461:57:6;;;;;:::i;:::-;;;;;;;;;;;;;;;8463:4716;;;;;;:::i;:::-;;:::i;4083:27::-;;;;;;;;;;-1:-1:-1;4083:27:6;;;;-1:-1:-1;;;;;4083:27:6;;;6664:706;;;;;;;;;;-1:-1:-1;6664:706:6;;;;;:::i;:::-;;:::i;16935:347::-;;;;;;;;;;-1:-1:-1;16935:347:6;;;;;:::i;:::-;;:::i;30694:253::-;;;;;;;;;;-1:-1:-1;30694:253:6;;;;;:::i;:::-;30770:7;30806:49;;;:34;:49;;;;;:66;;30874:64;;;;;30806:66;;30694:253;4117:40;;;;;;;;;;-1:-1:-1;4117:40:6;;;;-1:-1:-1;;;;;4117:40:6;;;5746:839;;;;;;;;;;-1:-1:-1;5746:839:6;;;;;:::i;:::-;;:::i;32193:440::-;;;;;;;;;;-1:-1:-1;32193:440:6;;;;;:::i;:::-;32278:7;32348:31;;;:16;:31;;;;;;;;:50;;;;32400:53;;;;32455:36;;;;32493:42;;;;32537:43;;;;;32348:50;;32455:36;;32493:42;32537:43;;;;;32582:42;;;-1:-1:-1;;;;;32582:42:6;;32193:440;;;;;16517:25:7;;;16573:2;16558:18;;16551:34;;;;16601:18;;;16594:34;;;;16659:2;16644:18;;16637:34;16720:4;16708:17;16702:3;16687:19;;16680:46;-1:-1:-1;;;;;16763:32:7;16783:3;16742:19;;16735:61;16504:3;16489:19;32193:440:6;16234:568:7;22068:768:6;;;;;;;;;;-1:-1:-1;22068:768:6;;;;;:::i;:::-;;:::i;25655:811::-;;;;;;;;;;-1:-1:-1;25655:811:6;;;;;:::i;:::-;;:::i;29242:359::-;;;;;;;;;;;;;:::i;33358:2742::-;;;;;;;;;;-1:-1:-1;33358:2742:6;;;;;:::i;:::-;;:::i;32683:87::-;;;;;;;;;;-1:-1:-1;32758:4:6;32683:87;;18944:3075;19181:19;19230:17;19248;19213:53;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;19213:53:6;;;;;;;;;19203:64;;19213:53;19203:64;;;;19286:34;;;;:15;:34;;;;;;19203:64;;-1:-1:-1;19286:34:6;;:42;;:34;:42;:115;;;;-1:-1:-1;19332:42:6;;;;:29;:42;;;;;;;;:61;;;;;;;;;;;:69;;:61;:69;19286:115;19278:136;;;;-1:-1:-1;;;19278:136:6;;;;;;;:::i;:::-;;;;;;;;;19448:44;;-1:-1:-1;;;19448:44:6;;;;;345:25:7;;;19425:20:6;;-1:-1:-1;;;;;19448:34:6;;;;;318:18:7;;19448:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19425:67;-1:-1:-1;19507:10:6;-1:-1:-1;;;;;19507:26:6;;;19503:667;;19603:3;;:109;;-1:-1:-1;;;19603:109:6;;19550:20;;-1:-1:-1;;;;;19603:3:6;;:36;;:109;;19640:12;;19654:42;;19698:10;;19603:3;;:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:222;;;-1:-1:-1;19716:3:6;;:109;;-1:-1:-1;;;19716:109:6;;-1:-1:-1;;;;;19716:3:6;;;;:36;;:109;;19753:12;;19767:42;;19811:10;;19823:1;;19716:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19585:240;-1:-1:-1;19844:24:6;;;19863:5;19844:24;19840:255;;19903:3;;:84;;-1:-1:-1;;;19903:84:6;;-1:-1:-1;;;;;19903:3:6;;;;:36;;:84;;19940:12;;19954:17;;19973:10;;19903:3;;:84;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:172;;;-1:-1:-1;19991:3:6;;:84;;-1:-1:-1;;;19991:84:6;;-1:-1:-1;;;;;19991:3:6;;;;:36;;:84;;20028:12;;20042:17;;20061:10;;20073:1;;19991:84;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19885:190;;19840:255;20136:4;20117:23;;;;20109:49;;;;-1:-1:-1;;;20109:49:6;;;;;;;:::i;:::-;19535:635;19503:667;20200:26;;;;:13;:26;;;;;:29;20188:41;;;;;:86;;-1:-1:-1;20245:26:6;;;;:13;:26;;;;;20272:1;20245:29;;20233:8;:41;;20188:86;20180:122;;;;-1:-1:-1;;;20180:122:6;;20470:2:7;20180:122:6;;;20452:21:7;20509:2;20489:18;;;20482:30;-1:-1:-1;;;20528:18:7;;;20521:53;20591:18;;20180:122:6;20268:347:7;20180:122:6;20371:30;;;;:17;:30;;;;;;;;20313:99;;-1:-1:-1;;;20313:99:6;;-1:-1:-1;;;;;20878:15:7;;;20313:99:6;;;20860:34:7;20371:30:6;;;20910:18:7;;;20903:43;20962:18;;;20955:34;;;20313:43:6;;;;;;20795:18:7;;20313:99:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20423:11:6;20590:21;;;:16;:21;;;;;:40;20437:17;;-1:-1:-1;20423:11:6;;20546:10;;20571:15;:59;;;;:119;;-1:-1:-1;20652:21:6;;;;:16;:21;;;;;:38;;;20634:15;:56;20571:119;20567:753;;;20715:1;20707:9;;20731:12;20816:8;20826:7;20799:35;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;20799:35:6;;;;;;;;;20788:48;;20799:35;20788:48;;;;20775:62;;;21750:19:7;21785:12;20775:62:6;;;;;;;;;;;;20765:73;;;;;;20758:80;;20870:12;20853:29;;20905:79;20932:11;;20945:16;:21;20962:3;20945:21;;;;;;;;;;;:32;;;20979:4;20905:26;:79::i;:::-;20897:105;;;;-1:-1:-1;;;20897:105:6;;;;;;;:::i;:::-;20692:334;20567:753;;;21055:21;;;;:16;:21;;;;;:37;;;21036:15;:56;;;;:114;;-1:-1:-1;21115:21:6;;;;:16;:21;;;;;:35;;;21096:15;:54;;21036:114;21032:288;;;-1:-1:-1;;21235:20:6;;;;;;;;;;;;-1:-1:-1;;;21235:20:6;;;;21208:12;;-1:-1:-1;21175:1:6;;21032:288;;;21288:20;;-1:-1:-1;;;21288:20:6;;;;;;;:::i;21032:288::-;21434:7;;:26;;-1:-1:-1;;;21434:26:6;;;;;345:25:7;;;21330:32:6;;-1:-1:-1;;;;;21434:7:6;;:21;;318:18:7;;21434:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21400:7;;:31;;-1:-1:-1;;;21400:31:6;;;;;345:25:7;;;-1:-1:-1;;;;;21400:7:6;;;;:26;;318:18:7;;21400:31:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;;;:::i;:::-;21507:7;;:31;;-1:-1:-1;;;21507:31:6;;;;;345:25:7;;;21373:87:6;;-1:-1:-1;;;;;;21507:7:6;;:26;;318:18:7;;21507:31:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21479:24;:59;;21471:81;;;;-1:-1:-1;;;21471:81:6;;;;;;;:::i;:::-;21584:13;21593:3;21584:8;:13::i;:::-;21571:9;:26;;21563:48;;;;-1:-1:-1;;;21563:48:6;;;;;;;:::i;:::-;21663:14;21680:41;21696:9;21707:13;21716:3;21707:8;:13::i;:::-;21680:15;:41::i;:::-;21765:21;:26;;;;;;;;;;;21663:58;;-1:-1:-1;21663:58:6;;21765:38;;21794:9;;21765:38;:::i;:::-;:47;;;;:::i;:::-;21736:21;:26;;;;;;;;;;;:76;;;;21888:7;;:26;;-1:-1:-1;;;21888:26:6;;;;;345:25:7;;;21736:21:6;;-1:-1:-1;;;;;;21888:7:6;;;;:21;;318:18:7;;21888:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21854:7;;:31;;-1:-1:-1;;;21854:31:6;;;;;345:25:7;;;-1:-1:-1;;;;;21854:7:6;;;;:26;;318:18:7;;21854:31:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;;;:::i;:::-;21834:80;;21925:7;;;;;;;;;-1:-1:-1;;;;;21925:7:6;-1:-1:-1;;;;;21925:12:6;;21938:9;21949:14;21965:12;21979:7;21988:10;22000:3;22005:5;21925:86;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19170:2849;;;;;;;;18944:3075;;;;;;;;:::o;17707:391::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;17828:28:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;17828:28;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;17879:7:::1;::::0;:48:::1;::::0;-1:-1:-1;;;17879:48:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;17879:7:6;;::::1;::::0;:29:::1;::::0;318:18:7;;17879:48:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;17931:4;17879:56;17878:120:::0;::::1;;;-1:-1:-1::0;17941:7:6::1;::::0;:48:::1;::::0;-1:-1:-1;;;17941:48:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;17941:7:6;;::::1;::::0;:29:::1;::::0;318:18:7;;17941:48:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;17993:4;17941:56;17878:120;17870:140;;;;-1:-1:-1::0;;;17870:140:6::1;;;;;;;:::i;:::-;-1:-1:-1::0;18021:40:6::1;::::0;;;:21:::1;:40;::::0;;;;;;;:59;;;;;;;;:69;;-1:-1:-1;;18021:69:6::1;::::0;::::1;;::::0;;;::::1;::::0;;17707:391::o;24279:1305::-;4742:7;;:44;;-1:-1:-1;;;4742:44:6;;;;;345:25:7;;;24527:13:6;;-1:-1:-1;;;24542:53:6;-1:-1:-1;;;;;4742:7:6;;;;:29;;318:18:7;;4742:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4728:58:6;:10;-1:-1:-1;;;;;4728:58:6;;:129;;;-1:-1:-1;4790:14:6;;:59;;-1:-1:-1;;;4790:59:6;;-1:-1:-1;;;;;4790:14:6;;;;:36;;:59;;4827:10;;4839:9;;4790:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4853:4;4790:67;4728:129;:187;;;-1:-1:-1;4861:14:6;;:46;;-1:-1:-1;;;4861:46:6;;-1:-1:-1;;;;;4861:14:6;;;;:34;;:46;;4896:10;;4861:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4911:4;4861:54;4728:187;4720:211;;;;-1:-1:-1;;;4720:211:6;;;;;;;:::i;:::-;24617:49:::1;::::0;;;:34:::1;:49;::::0;;;;:64:::1;;::::0;::::1;::::0;::::1;;;:73;24608:103;;;;-1:-1:-1::0;;;24608:103:6::1;;;;;;;:::i;:::-;24786:49;::::0;;;:34:::1;:49;::::0;;;;:66;24767:15;24731:33:::1;24749:15:::0;24731;:33:::1;:::i;:::-;:51;;;;:::i;:::-;:121;24722:142;;;;-1:-1:-1::0;;;24722:142:6::1;;;;;;;:::i;:::-;-1:-1:-1::0;;24875:49:6::1;::::0;;;:34:::1;:49;::::0;;;;;:80;;-1:-1:-1;;;;;24875:80:6;;::::1;-1:-1:-1::0;;;;;;24875:80:6;;::::1;;::::0;;;24966:63;;::::1;:80:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;25057:63:::1;::::0;::::1;:80:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;25148:64:::1;::::0;::::1;:82:::0;25241:64:::1;::::0;::::1;:82:::0;;;;25334:64:::1;::::0;::::1;:82:::0;;;;25427:59:::1;;:66:::0;;-1:-1:-1;;25504:72:6;;;;;;24279:1305::o;28658:161::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;28733:32:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;28733:32;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;-1:-1:-1;28779:7:6::1;:32:::0;;-1:-1:-1;;;;;;28779:32:6::1;-1:-1:-1::0;;;;;28779:32:6;;;::::1;::::0;;;::::1;::::0;;28658:161::o;26534:2073::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;26677:23:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;26677:23;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;26721:47:::1;::::0;;;:32:::1;:47;::::0;;;;:62:::1;;::::0;::::1;;::::0;;::::1;;:70;;:62;:70;26713:99;;;::::0;-1:-1:-1;;;26713:99:6;;26596:2:7;26713:99:6::1;::::0;::::1;26578:21:7::0;26635:2;26615:18;;;26608:30;-1:-1:-1;;;26654:18:7;;;26647:46;26710:18;;26713:99:6::1;26394:340:7::0;26713:99:6::1;26870:1;26831:36:::0;;;::::1;::::0;;;;;;;26823:93:::1;;;::::0;-1:-1:-1;;;26823:93:6;;26941:2:7;26823:93:6::1;::::0;::::1;26923:21:7::0;26980:2;26960:18;;;26953:30;27019:34;26999:18;;;26992:62;-1:-1:-1;;;27070:18:7;;;27063:38;27118:19;;26823:93:6::1;26739:404:7::0;26823:93:6::1;26935:47;::::0;;;:32:::1;:47;::::0;;;;:64;27015:10;;26935:77:::1;::::0;27002:10;;26935:77:::1;:::i;:::-;:90;;;;:::i;:::-;27029:3;26935:97;26927:128;;;::::0;-1:-1:-1;;;26927:128:6;;27350:2:7;26927:128:6::1;::::0;::::1;27332:21:7::0;27389:2;27369:18;;;27362:30;-1:-1:-1;;;27408:18:7;;;27401:48;27466:18;;26927:128:6::1;27148:342:7::0;26927:128:6::1;27066:17;27086:36:::0;;;::::1;::::0;;;;;;;;;27133:40;;;;27488:32:::1;:39:::0;;;;;:54:::1;;::::0;27086:36;;27198:6;;27229;;27108:13;;27066:17;;;;;;;;27545:3:::1;::::0;27476:66:::1;::::0;27086:36;27476:66:::1;:::i;:::-;:72;;;;:::i;:::-;27590:39;::::0;;;:32:::1;:39;::::0;;;;:54:::1;;::::0;27457:91;;-1:-1:-1;27647:3:6::1;::::0;27578:66:::1;::::0;:9;:66:::1;:::i;:::-;:72;;;;:::i;:::-;27692:39;::::0;;;:32:::1;:39;::::0;;;;:54:::1;;::::0;27559:91;;-1:-1:-1;27749:3:6::1;::::0;27680:66:::1;::::0;:9;:66:::1;:::i;:::-;:72;;;;:::i;:::-;27661:91:::0;-1:-1:-1;27805:3:6::1;27780:22;27792:10:::0;27780:9;:22:::1;:::i;:::-;:28;;;;:::i;:::-;27763:45:::0;-1:-1:-1;27861:3:6::1;27836:22;27848:10:::0;27836:9;:22:::1;:::i;:::-;:28;;;;:::i;:::-;27876:13;27903:39:::0;;;:32:::1;:39;::::0;;;;;:51;27895:94;;27819:45;;-1:-1:-1;27876:13:6;;-1:-1:-1;;;;;27903:51:6;;::::1;::::0;27968:16;;27876:13;27895:94;27876:13;27895:94;27968:16;27903:51;27895:94:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28001:13:6::1;28028:39:::0;;;:32:::1;:39;::::0;;;;;:51:::1;;::::0;28020:94;;27875:114;;-1:-1:-1;28001:13:6;;-1:-1:-1;;;;;28028:51:6;;::::1;::::0;28093:16;;28001:13;28020:94;28001:13;28020:94;28093:16;28028:51;28020:94:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28126:13:6::1;28153:39:::0;;;:32:::1;:39;::::0;;;;;:51:::1;;::::0;28145:94;;28000:114;;-1:-1:-1;28126:13:6;;-1:-1:-1;;;;;28153:51:6;;::::1;::::0;28218:16;;28126:13;28145:94;28126:13;28145:94;28218:16;28153:51;28145:94:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28125:114;;;28251:13;28278:3;-1:-1:-1::0;;;;;28270:17:6::1;28295:14;28270:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28250:64;;;28326:13;28353:3;-1:-1:-1::0;;;;;28345:17:6::1;28370:14;28345:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28325:64;;;28408:8;28400:31;;;;-1:-1:-1::0;;;28400:31:6::1;;;;;;;:::i;:::-;28450:8;28442:31;;;;-1:-1:-1::0;;;28442:31:6::1;;;;;;;:::i;:::-;28492:8;28484:31;;;;-1:-1:-1::0;;;28484:31:6::1;;;;;;;:::i;:::-;28534:8;28526:31;;;;-1:-1:-1::0;;;28526:31:6::1;;;;;;;:::i;:::-;28576:8;28568:31;;;;-1:-1:-1::0;;;28568:31:6::1;;;;;;;:::i;28871:296::-:0;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;28957:33:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;28957:33;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;29026:18:::1;-1:-1:-1::0;;;;;29011:50:6::1;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;29067:4;29011:60;29003:94;;;::::0;-1:-1:-1;;;29003:94:6;;28641:2:7;29003:94:6::1;::::0;::::1;28623:21:7::0;28680:2;28660:18;;;28653:30;-1:-1:-1;;;28699:18:7;;;28692:51;28760:18;;29003:94:6::1;28439:345:7::0;29003:94:6::1;-1:-1:-1::0;29108:14:6::1;:51:::0;;-1:-1:-1;;;;;;29108:51:6::1;-1:-1:-1::0;;;;;29108:51:6;;;::::1;::::0;;;::::1;::::0;;28871:296::o;14814:2016::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;14978:28:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;14978:28;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;15027:7:::1;::::0;:44:::1;::::0;-1:-1:-1;;;15027:44:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;15027:7:6;;::::1;::::0;:29:::1;::::0;318:18:7;;15027:44:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;15075:4;15027:52;15019:73;;;;-1:-1:-1::0;;;15019:73:6::1;;;;;;;:::i;:::-;15217:7;::::0;:36:::1;::::0;-1:-1:-1;;;15217:36:6;;::::1;::::0;::::1;345:25:7::0;;;15103:32:6::1;::::0;-1:-1:-1;;;;;15217:7:6::1;::::0;:21:::1;::::0;318:18:7;;15217:36:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15173:7;::::0;:41:::1;::::0;-1:-1:-1;;;15173:41:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;15173:7:6;;::::1;::::0;:26:::1;::::0;318:18:7;;15173:41:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;;;:::i;:::-;15300:7;::::0;:41:::1;::::0;-1:-1:-1;;;15300:41:6;;::::1;::::0;::::1;345:25:7::0;;;15146:107:6;;-1:-1:-1;;;;;;15300:7:6::1;::::0;:26:::1;::::0;318:18:7;;15300:41:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15272:24;:69;;15264:91;;;;-1:-1:-1::0;;;15264:91:6::1;;;;;;;:::i;:::-;15430:7;::::0;:36:::1;::::0;-1:-1:-1;;;15430:36:6;;::::1;::::0;::::1;345:25:7::0;;;15366:17:6::1;::::0;-1:-1:-1;;;;;15430:7:6::1;::::0;:21:::1;::::0;318:18:7;;15430:36:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15386:7;::::0;:41:::1;::::0;-1:-1:-1;;;15386:41:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;15386:7:6;;::::1;::::0;:26:::1;::::0;318:18:7;;15386:41:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;;;:::i;:::-;15477:19;15631:27:::0;;;:12:::1;:27;::::0;;;;;15366:100;;-1:-1:-1;15477:19:6;15631:32;;15627:343:::1;;15838:31;::::0;;;:16:::1;:31;::::0;;;;:42:::1;::::0;::::1;::::0;15785:50;;:95:::1;::::0;15838:42;15785:95:::1;:::i;:::-;15768:112;;15627:343;;;-1:-1:-1::0;15931:27:6::1;::::0;;;:12:::1;:27;::::0;;;;;15627:343:::1;16069:10;16119:31:::0;;;:16:::1;:31;::::0;;;;:42:::1;;::::0;16083:32:::1;16101:14:::0;16083:15:::1;:32;:::i;:::-;16082:79;;;;:::i;:::-;16069:92;;16245:1;16238:5;:8;;16230:34;;;;-1:-1:-1::0;;;16230:34:6::1;;;;;;;:::i;:::-;16445:35;::::0;;;:20:::1;:35;::::0;;;;;;;16406:7:::1;::::0;:36;;-1:-1:-1;;;16406:36:6;;::::1;::::0;::::1;345:25:7::0;;;16445:35:6;;-1:-1:-1;;;;;16406:7:6::1;::::0;:21:::1;::::0;318:18:7;;16406:36:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;;:::i;:::-;16359:31;::::0;;;:16:::1;:31;::::0;;;;:42:::1;;::::0;:123:::1;::::0;;::::1;:::i;:::-;16305:31;::::0;;;:16:::1;:31;::::0;;;;:50;:178:::1;::::0;;::::1;:::i;:::-;16275:27;::::0;;;:12:::1;:27;::::0;;;;:208;16521:21:::1;:15;16539:3;16521:21;:::i;:::-;16502:15;:40;;16494:49;;;::::0;::::1;;16576:28;::::0;;;:17:::1;:28;::::0;;;;;;;:46;;;16633:19:::1;:30:::0;;;;;;;:37;;-1:-1:-1;;16633:37:6::1;16666:4;16633:37;::::0;;16739:7:::1;::::0;:83;;-1:-1:-1;;;16739:83:6;;-1:-1:-1;;;;;16739:7:6;;::::1;::::0;:21:::1;::::0;:83:::1;::::0;16594:9;;16772:10;;16784;;16796;;16808:13;;16739:83:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15008:1822;;;;14814:2016:::0;;;;;;:::o;18169:707::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;18393:42:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;18393:42;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;18449:19:::1;18498:17;18516;18481:53;;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;18481:53:6;;;;;;;18471:64;;18481:53:::1;18471:64:::0;;::::1;::::0;18555:7:::1;::::0;-1:-1:-1;;;18555:48:6;;::::1;::::0;::::1;345:25:7::0;;;18471:64:6;;-1:-1:-1;;;;;;18555:7:6::1;::::0;:29:::1;::::0;318:18:7;;18555:48:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;18607:4;18555:56;18546:78;;;;-1:-1:-1::0;;;18546:78:6::1;;;;;;;:::i;:::-;18635:42;::::0;;;:29:::1;:42;::::0;;;;;;;:61;;;;;;;;;:71;;-1:-1:-1;;18635:71:6::1;::::0;::::1;;::::0;;;::::1;::::0;;;18717:30;;;:17:::1;:30:::0;;;;;:51;;-1:-1:-1;;;;;;18717:51:6::1;-1:-1:-1::0;;;;;18717:51:6;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;18779:13:6::1;:26:::0;;;;;;:39;;;-1:-1:-1;18829:29:6::1;:39:::0;-1:-1:-1;;18169:707:6:o;7409:990::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;7605:27:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;7605:27;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;7653:7:::1;::::0;:44:::1;::::0;-1:-1:-1;;;7653:44:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;7653:7:6;;::::1;::::0;:29:::1;::::0;318:18:7;;7653:44:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;7701:4;7653:52;7645:73;;;;-1:-1:-1::0;;;7645:73:6::1;;;;;;;:::i;:::-;7729:32;::::0;7772:620:::1;7793:11;:18;7790:1;:21;7772:620;;;7964:1;7943:15;7959:1;7943:18;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;7904:7:::1;::::0;:36:::1;::::0;-1:-1:-1;;;7904:36:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;7904:7:6;;::::1;::::0;:21:::1;::::0;318:18:7;;7904:36:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7860:7;::::0;:41:::1;::::0;-1:-1:-1;;;7860:41:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;7860:7:6;;::::1;::::0;:26:::1;::::0;318:18:7;;7860:41:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;;;:::i;:::-;:101;;;;:::i;:::-;:105;;;;:::i;:::-;8016:7;::::0;:41:::1;::::0;-1:-1:-1;;;8016:41:6;;::::1;::::0;::::1;345:25:7::0;;;7833:132:6;;-1:-1:-1;;;;;;8016:7:6::1;::::0;:26:::1;::::0;318:18:7;;8016:41:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7988:24;:69;;7980:91;;;;-1:-1:-1::0;;;7980:91:6::1;;;;;;;:::i;:::-;8090:9;8086:295;8109:15;8125:1;8109:18;;;;;;;;:::i;:::-;;;;;;;8105:1;:22;8086:295;;;8217:7;::::0;:36:::1;::::0;-1:-1:-1;;;8217:36:6;;::::1;::::0;::::1;345:25:7::0;;;8153:17:6::1;::::0;-1:-1:-1;;;;;8217:7:6::1;::::0;:21:::1;::::0;318:18:7;;8217:36:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8173:7;::::0;:41:::1;::::0;-1:-1:-1;;;8173:41:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;8173:7:6;;::::1;::::0;:26:::1;::::0;318:18:7;;8173:41:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;;;:::i;:::-;8272:7;::::0;8305:14;;8153:100;;-1:-1:-1;;;;;;8272:7:6::1;::::0;:21:::1;::::0;8153:100;;8305:11;;8317:1;;8305:14;::::1;;;;;:::i;:::-;;;;;;;8321:10;8332:1;8321:13;;;;;;;;:::i;:::-;;;;;;;8336:10;8347:1;8336:13;;;;;;;;:::i;:::-;;;;;;;8351;8272:93;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8134:247;8129:3;;;;;:::i;:::-;;;;8086:295;;;-1:-1:-1::0;7813:3:6;::::1;::::0;::::1;:::i;:::-;;;;7772:620;;;;7634:765;7409:990:::0;;;;;;:::o;22925:1263::-;4742:7;;:44;;-1:-1:-1;;;4742:44:6;;;;;345:25:7;;;23165:13:6;;-1:-1:-1;;;23180:51:6;-1:-1:-1;;;;;4742:7:6;;;;:29;;318:18:7;;4742:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4728:58:6;:10;-1:-1:-1;;;;;4728:58:6;;:129;;;-1:-1:-1;4790:14:6;;:59;;-1:-1:-1;;;4790:59:6;;-1:-1:-1;;;;;4790:14:6;;;;:36;;:59;;4827:10;;4839:9;;4790:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4853:4;4790:67;4728:129;:187;;;-1:-1:-1;4861:14:6;;:46;;-1:-1:-1;;;4861:46:6;;-1:-1:-1;;;;;4861:14:6;;;;:34;;:46;;4896:10;;4861:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4911:4;4861:54;4728:187;4720:211;;;;-1:-1:-1;;;4720:211:6;;;;;;;:::i;:::-;23253:47:::1;::::0;;;:32:::1;:47;::::0;;;;:62:::1;;::::0;::::1;::::0;::::1;;;:71;23244:101;;;;-1:-1:-1::0;;;23244:101:6::1;;;;;;;:::i;:::-;23420:47;::::0;;;:32:::1;:47;::::0;;;;:64;23401:15;23365:33:::1;23383:15:::0;23365;:33:::1;:::i;:::-;:51;;;;:::i;:::-;:119;23356:140;;;;-1:-1:-1::0;;;23356:140:6::1;;;;;;;:::i;:::-;-1:-1:-1::0;;23507:47:6::1;::::0;;;:32:::1;:47;::::0;;;;;:74;;-1:-1:-1;;;;;23507:74:6;;::::1;-1:-1:-1::0;;;;;;23507:74:6;;::::1;;::::0;;;23592:59;;::::1;:74:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;23677:59:::1;::::0;::::1;:74:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;23762:62:::1;::::0;::::1;:80:::0;23853:62:::1;::::0;::::1;:80:::0;;;;23944:62:::1;::::0;::::1;:80:::0;;;;24035:57:::1;;:64:::0;;-1:-1:-1;;24110:70:6;;;;;;22925:1263::o;13256:1519::-;13402:34;;;;:15;:34;;;;;;;;:42;;:34;:42;:113;;;;-1:-1:-1;13448:40:6;;;;:21;:40;;;;;;;;:59;;;;;;;;;;;:67;;:59;:67;13402:113;13394:134;;;;-1:-1:-1;;;13394:134:6;;;;;;;:::i;:::-;13566:35;;;;:16;:35;;;;;:51;;;13547:15;:70;;;;:142;;-1:-1:-1;13640:35:6;;;;:16;:35;;;;;:49;;;13621:15;:68;;13547:142;13539:164;;;;-1:-1:-1;;;13539:164:6;;;;;;;:::i;:::-;13736:7;;:45;;-1:-1:-1;;;13736:45:6;;;;;345:25:7;;;-1:-1:-1;;;;;13736:7:6;;;;:26;;318:18:7;;13736:45:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13724:8;:57;;13723:122;;;;-1:-1:-1;13799:7:6;;:45;;-1:-1:-1;;;13799:45:6;;;;;345:25:7;;;-1:-1:-1;;;;;13799:7:6;;;;:26;;318:18:7;;13799:45:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13787:8;:57;;13723:122;13714:154;;;;-1:-1:-1;;;13714:154:6;;30347:2:7;13714:154:6;;;30329:21:7;30386:2;30366:18;;;30359:30;-1:-1:-1;;;30405:18:7;;;30398:48;30463:18;;13714:154:6;30145:342:7;13714:154:6;13997:7;;:40;;-1:-1:-1;;;13997:40:6;;;;;345:25:7;;;13879:32:6;;-1:-1:-1;;;;;13997:7:6;;:21;;318:18:7;;13997:40:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13949:7;;:45;;-1:-1:-1;;;13949:45:6;;;;;345:25:7;;;-1:-1:-1;;;;;13949:7:6;;;;:26;;318:18:7;;13949:45:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:88;;;;:::i;:::-;14084:7;;:45;;-1:-1:-1;;;14084:45:6;;;;;345:25:7;;;13922:115:6;;-1:-1:-1;;;;;;14084:7:6;;:26;;318:18:7;;14084:45:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14056:24;:73;;14048:95;;;;-1:-1:-1;;;14048:95:6;;;;;;;:::i;:::-;14175:27;14184:17;14175:8;:27::i;:::-;14162:9;:40;;14154:62;;;;-1:-1:-1;;;14154:62:6;;;;;;;:::i;:::-;14268:14;14285:55;14301:9;14312:27;14321:17;14312:8;:27::i;14285:55::-;14398:21;:40;;;;;;;;;;;14268:72;;-1:-1:-1;14268:72:6;;14398:52;;14441:9;;14398:52;:::i;:::-;:61;;;;:::i;:::-;14355:21;:40;;;;;;;;;;;:104;;;;14549:7;;:40;;-1:-1:-1;;;14549:40:6;;;;;345:25:7;;;14355:21:6;;-1:-1:-1;;;;;;14549:7:6;;;;:21;;318:18:7;;14549:40:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14501:7;;:45;;-1:-1:-1;;;14501:45:6;;;;;345:25:7;;;-1:-1:-1;;;;;14501:7:6;;;;:26;;318:18:7;;14501:45:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:88;;;;:::i;:::-;14670:7;;:97;;-1:-1:-1;;;14670:97:6;;;;;30779:25:7;;;30820:18;;;30813:34;;;30863:18;;;30856:34;;;30906:18;;;30899:34;;;30949:19;;;30942:35;;;14649:10:6;30993:19:7;;;30986:61;;;14481:108:6;;-1:-1:-1;;;;;;14670:7:6;;;;:18;;30751:19:7;;14670:97:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13383:1392;;;13256:1519;;;;:::o;8463:4716::-;8697:30;;;;:15;:30;;;;;;;;:38;;:30;:38;:61;;;;;8757:1;8739:15;:19;8697:61;8689:77;;;;-1:-1:-1;;;8689:77:6;;31260:2:7;8689:77:6;;;31242:21:7;31299:1;31279:18;;;31272:29;-1:-1:-1;;;31317:18:7;;;31310:33;31360:18;;8689:77:6;31058:326:7;8689:77:6;8777:11;8940:21;;;:16;:21;;;;;:40;8791:13;;8777:11;;;8896:10;;8921:15;:59;;;;:119;;-1:-1:-1;9002:21:6;;;;:16;:21;;;;;:38;;;8984:15;:56;8921:119;8917:2209;;;9065:1;;-1:-1:-1;9081:12:6;-1:-1:-1;;;;;9112:56:6;;;9108:1357;;9246:3;;:107;;-1:-1:-1;;;9246:107:6;;9189:20;;-1:-1:-1;;;;;9246:3:6;;:36;;:107;;9283:10;;9295:42;;9339:10;;9246:3;;:107;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:218;;;-1:-1:-1;9357:3:6;;:107;;-1:-1:-1;;;9357:107:6;;-1:-1:-1;;;;;9357:3:6;;;;:36;;:107;;9394:10;;9406:42;;9450:10;;9462:1;;9357:107;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9228:236;-1:-1:-1;9487:24:6;;;9506:5;9487:24;9483:289;;9550:3;;;9599:21;;;:16;:21;;;;;;;:32;;;9550:97;;-1:-1:-1;;;9550:97:6;;-1:-1:-1;;;;;9550:3:6;;;;:36;;:97;;9587:10;;9550:3;9599:32;;;;;;;9633:10;;9550:3;;:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:198;;;-1:-1:-1;9651:3:6;;;9700:21;;;:16;:21;;;;;;;:32;;;9651:97;;-1:-1:-1;;;9651:97:6;;-1:-1:-1;;;;;9651:3:6;;;;:36;;:97;;9688:10;;9651:3;9700:32;;;;;;;9734:10;;9746:1;;9651:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9532:216;;9483:289;9817:4;9798:23;;;;9790:49;;;;-1:-1:-1;;;9790:49:6;;;;;;;:::i;:::-;9916:10;9928:13;9943:7;9899:52;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;9899:52:6;;;;;;9888:65;;9899:52;9888:65;;;;9875:79;;;21750:19:7;9875:79:6;;;;;;;;;21785:12:7;;;9875:79:6;;;;9865:90;;;;;9999:7;;-1:-1:-1;;;9999:57:6;;;9865:90;-1:-1:-1;10059:15:6;;-1:-1:-1;;;;;9999:7:6;;;;:40;;:57;;10040:3;;10045:10;;9999:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;9982:13;:92;;9974:113;;;;-1:-1:-1;;;9974:113:6;;;;;;;:::i;:::-;10123:10;10106:27;;9170:979;9108:1357;;;10232:10;10244:13;10259:7;10215:52;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;10215:52:6;;;;;;10204:65;;10215:52;10204:65;;;;10191:79;;;21750:19:7;10191:79:6;;;;;;;;;21785:12:7;;;10191:79:6;;;;10181:90;;;;;10315:7;;-1:-1:-1;;;10315:57:6;;;10181:90;-1:-1:-1;10375:15:6;;-1:-1:-1;;;;;10315:7:6;;;;:40;;:57;;10356:3;;10361:10;;10315:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;10298:13;:92;;10290:113;;;;-1:-1:-1;;;10290:113:6;;;;;;;:::i;:::-;10439:10;10422:27;;9108:1357;10527:21;;;;:16;:21;;;;;:32;;;10487:79;;10514:11;;;;10561:4;10487:26;:79::i;:::-;10479:105;;;;-1:-1:-1;;;10479:105:6;;;;;;;:::i;:::-;9042:1554;8917:2209;;;10625:21;;;;:16;:21;;;;;:37;;;10606:15;:56;;;;:114;;-1:-1:-1;10685:21:6;;;;:16;:21;;;;;:35;;;10666:15;:54;;10606:114;10602:524;;;10788:7;;:29;;-1:-1:-1;;;10788:29:6;;;;;345:25:7;;;10745:1:6;;-1:-1:-1;;;;;;10788:7:6;;;;:24;;318:18:7;;10788:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10769:15;:48;;10761:80;;;;-1:-1:-1;;;10761:80:6;;32686:2:7;10761:80:6;;;32668:21:7;32725:2;32705:18;;;32698:30;-1:-1:-1;;;32744:18:7;;;32737:49;32803:18;;10761:80:6;32484:343:7;10761:80:6;10947:7;;:29;;-1:-1:-1;;;10947:29:6;;;;;345:25:7;;;-1:-1:-1;;;;;10947:7:6;;;;:24;;318:18:7;;10947:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10864:7;;:61;;-1:-1:-1;;;10864:61:6;;10928:15;;-1:-1:-1;;;;;10864:7:6;;:44;;:61;;10909:3;;10914:10;;10864:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:79;;;;:::i;:::-;:112;;10856:128;;;;-1:-1:-1;;;10856:128:6;;33034:2:7;10856:128:6;;;33016:21:7;33073:1;33053:18;;;33046:29;-1:-1:-1;;;33091:18:7;;;33084:33;33134:18;;10856:128:6;32832:326:7;10856:128:6;-1:-1:-1;11041:20:6;;;;;;;;;;;;-1:-1:-1;;;11041:20:6;;;;11016:10;;-1:-1:-1;10602:524:6;11240:7;;:26;;-1:-1:-1;;;11240:26:6;;;;;345:25:7;;;11136:32:6;;11287:1;;11269:15;;-1:-1:-1;;;;;11240:7:6;;:21;;318:18:7;;11240:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11206:7;;:31;;-1:-1:-1;;;11206:31:6;;;;;345:25:7;;;-1:-1:-1;;;;;11206:7:6;;;;:26;;318:18:7;;11206:31:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;;;:::i;:::-;:78;;;;:::i;:::-;:82;;;;:::i;:::-;11335:7;;:31;;-1:-1:-1;;;11335:31:6;;;;;345:25:7;;;11179:109:6;;-1:-1:-1;;;;;;11335:7:6;;:26;;318:18:7;;11335:31:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11307:24;:59;;11299:81;;;;-1:-1:-1;;;11299:81:6;;;;;;;:::i;:::-;11429:15;11413:13;11422:3;11413:8;:13::i;:::-;:31;;;;:::i;:::-;11399:9;:46;;11391:68;;;;-1:-1:-1;;;11391:68:6;;;;;;;:::i;:::-;11511:14;11528:59;11544:9;11571:15;11555:13;11564:3;11555:8;:13::i;:::-;:31;;;;:::i;11528:59::-;11631:21;:26;;;;;;;;;;;11511:76;;-1:-1:-1;11511:76:6;;11631:38;;11660:9;;11631:38;:::i;:::-;:47;;;;:::i;:::-;11602:21;:26;;;;;;;;;;;:76;;;;11750:16;:21;;;:33;;;;;11787:1;11750:38;;-1:-1:-1;11746:1144:6;;11805:19;11843:17;;;:12;:17;;;;;;:22;;11839:321;;12036:21;;;;:16;:21;;;;;:32;;;;11993:40;;:75;;12036:32;11993:75;:::i;:::-;11976:92;;11839:321;;;-1:-1:-1;12127:17:6;;;;:12;:17;;;;;;11839:321;12267:10;12317:21;;;:16;:21;;;;;:32;;;12281;12299:14;12281:15;:32;:::i;:::-;12280:69;;;;:::i;:::-;12267:82;;12579:1;12572:5;:8;;:32;;;;;12584:15;12603:1;12584:20;12572:32;12564:58;;;;-1:-1:-1;;;12564:58:6;;;;;;;:::i;:::-;12851:25;;;;:20;:25;;;;;;;;12822:7;;:26;;-1:-1:-1;;;12822:26:6;;;;;345:25:7;;;12851::6;;-1:-1:-1;;;;;12822:7:6;;:21;;318:18:7;;12822:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;12786:21;;;;:16;:21;;;;;:32;;;:91;;;;:::i;:::-;12742:21;;;;:16;:21;;;;;:40;:136;;;;:::i;:::-;12722:17;;;;:12;:17;;;;;:156;-1:-1:-1;;11746:1144:6;12928:9;12924:248;12947:15;12943:1;:19;12924:248;;;13038:7;;:26;;-1:-1:-1;;;13038:26:6;;;;;345:25:7;;;12984:17:6;;-1:-1:-1;;;;;13038:7:6;;:21;;318:18:7;;13038:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13004:7;;:31;;-1:-1:-1;;;13004:31:6;;;;;345:25:7;;;-1:-1:-1;;;;;13004:7:6;;;;:26;;318:18:7;;13004:31:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;;;:::i;:::-;12984:80;;13079:7;;;;;;;;;-1:-1:-1;;;;;13079:7:6;-1:-1:-1;;;;;13079:12:6;;13092:9;13103:14;13119:7;13128;13137:10;13149:3;13154:5;13079:81;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12969:203;12964:3;;;;;:::i;:::-;;;;12924:248;;;;8678:4501;;;;;8463:4716;;;;;;;;;:::o;6664:706::-;5448:14;;:64;;-1:-1:-1;;;5448:64:6;;5487:10;5448:64;;;33337:51:7;33404:18;;;33397:34;;;6862:13:6;;-1:-1:-1;;;6877:33:6;-1:-1:-1;;;;;5448:14:6;;;;:38;;33310:18:7;;5448:64:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;5516:4;5448:72;;:143;;-1:-1:-1;5524:14:6;;:59;;-1:-1:-1;;;5524:59:6;;-1:-1:-1;;;;;5524:14:6;;;;:36;;:59;;5561:10;;5573:9;;5524:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5587:4;5524:67;5448:143;:201;;;-1:-1:-1;5595:14:6;;:46;;-1:-1:-1;;;5595:46:6;;-1:-1:-1;;;;;5595:14:6;;;;:34;;:46;;5630:10;;5595:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5645:4;5595:54;5448:201;5440:225;;;;-1:-1:-1;;;5440:225:6;;;;;;;:::i;:::-;6931:30:::1;::::0;;;:15:::1;:30;::::0;;;;;::::1;;:38;;:30:::0;:38:::1;6923:60;;;::::0;-1:-1:-1;;;6923:60:6;;33644:2:7;6923:60:6::1;::::0;::::1;33626:21:7::0;33683:1;33663:18;;;33656:29;-1:-1:-1;;;33701:18:7;;;33694:39;33750:18;;6923:60:6::1;33442:332:7::0;6923:60:6::1;-1:-1:-1::0;;6994:31:6::1;::::0;;;:16:::1;:31;::::0;;;;;:72;;;7077:48:::1;::::0;::::1;:68:::0;;;;7156:42:::1;::::0;::::1;:56:::0;;;;7223:47:::1;::::0;::::1;:66:::0;;;;7300:45:::1;;:62:::0;6664:706::o;16935:347::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;17061:36:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;17061:36;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;17115:7:::1;17126:1;17115:12:::0;17111:162:::1;;17144:35;::::0;;;:20:::1;:35;::::0;;;;:53;;;17111:162:::1;;;17260:1;17230:27:::0;;;:12:::1;:27;::::0;;;;:31;17111:162:::1;16935:347:::0;;;;:::o;5746:839::-;5448:14;;:64;;-1:-1:-1;;;5448:64:6;;5487:10;5448:64;;;33337:51:7;33404:18;;;33397:34;;;5966:13:6;;-1:-1:-1;;;5981:32:6;-1:-1:-1;;;;;5448:14:6;;;;:38;;33310:18:7;;5448:64:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;5516:4;5448:72;;:143;;-1:-1:-1;5524:14:6;;:59;;-1:-1:-1;;;5524:59:6;;-1:-1:-1;;;;;5524:14:6;;;;:36;;:59;;5561:10;;5573:9;;5524:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5587:4;5524:67;5448:143;:201;;;-1:-1:-1;5595:14:6;;:46;;-1:-1:-1;;;5595:46:6;;-1:-1:-1;;;;;5595:14:6;;;;:34;;:46;;5630:10;;5595:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5645:4;5595:54;5448:201;5440:225;;;;-1:-1:-1;;;5440:225:6;;;;;;;:::i;:::-;6034:7:::1;::::0;:44:::1;::::0;-1:-1:-1;;;6034:44:6;;::::1;::::0;::::1;345:25:7::0;;;-1:-1:-1;;;;;6034:7:6;;::::1;::::0;:29:::1;::::0;318:18:7;;6034:44:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;6082:4;6034:52;6026:73;;;;-1:-1:-1::0;;;6026:73:6::1;;;;;;;:::i;:::-;-1:-1:-1::0;;6110:31:6::1;::::0;;;:16:::1;:31;::::0;;;;;;;:50:::1;::::0;::::1;:72:::0;;;;6193:53:::1;::::0;::::1;:78:::0;;;;6282:36;;::::1;:44:::0;;;;6337:42:::1;::::0;;::::1;:56:::0;;;;6404:43:::1;::::0;;::::1;:58:::0;;-1:-1:-1;;;;;6473:56:6;;::::1;6404:58;6473:56;-1:-1:-1::0;;;;;;6473:56:6;;;6404:58:::1;::::0;;::::1;6473:56:::0;;;;;;;::::1;::::0;;;6540:30;;;;;;:37;;-1:-1:-1;;6540:37:6::1;-1:-1:-1::0;6540:37:6::1;::::0;;5746:839::o;22068:768::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;22252:42:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;22252:42;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;22315:29:::1;22332:12:::0;22315:14;:29:::1;:::i;:::-;22348:3;22315:36;22307:71;;;;-1:-1:-1::0;;;22307:71:6::1;;;;;;;:::i;:::-;22397:31;22415:13:::0;22397:15;:31:::1;:::i;:::-;22432:3;22397:38;22389:73;;;;-1:-1:-1::0;;;22389:73:6::1;;;;;;;:::i;:::-;-1:-1:-1::0;22473:47:6::1;::::0;;;:32:::1;:47;::::0;;;;;;;:81;;;22565:62:::1;::::0;;::::1;:77:::0;;;;22653:34:::1;:49:::0;;;;;;:84;;;22748:64;::::1;:80:::0;22068:768::o;25655:811::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;25790:43:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;25790:43;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;25854:47:::1;::::0;;;:32:::1;:47;::::0;;;;:57:::1;;::::0;::::1;;:65;;:57:::0;:65:::1;:136:::0;::::1;;;-1:-1:-1::0;25923:49:6::1;::::0;;;:34:::1;:49;::::0;;;;:59:::1;;::::0;::::1;;:67;;:59:::0;:67:::1;25854:136;25846:166;;;::::0;-1:-1:-1;;;25846:166:6;;34332:2:7;25846:166:6::1;::::0;::::1;34314:21:7::0;34371:2;34351:18;;;34344:30;-1:-1:-1;;;34390:18:7;;;34383:47;34447:18;;25846:166:6::1;34130:341:7::0;25846:166:6::1;26023:47;::::0;;;:32:::1;:47;::::0;;;;;;;:62:::1;::::0;;::::1;:79:::0;;;::::1;;;::::0;;::::1;-1:-1:-1::0;;26023:79:6;;::::1;;::::0;;;26113:34:::1;:49:::0;;;;;;:64;;::::1;:83:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;;::::0;;26211:23;;26207:252:::1;;26311:5;26251:47:::0;;;:32:::1;:47;::::0;;;;:57:::1;;:65:::0;;-1:-1:-1;;26251:65:6::1;::::0;;26207:252:::1;;;26338:25:::0;::::1;;26358:5;26338:25:::0;26334:125:::1;;-1:-1:-1::0;;;26442:5:6::1;26380:49:::0;;;:34:::1;:49;::::0;;;;:59:::1;;:67:::0;;-1:-1:-1;;26380:67:6::1;::::0;;25655:811::o;29242:359::-;5100:14;;:59;;-1:-1:-1;;;5100:59:6;;-1:-1:-1;;;29300:31:6;-1:-1:-1;;;;;5100:14:6;;:36;;:59;;5137:10;;29300:31;;5100:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;5163:4;5100:67;;:125;;-1:-1:-1;5171:14:6;;:46;;-1:-1:-1;;;5171:46:6;;-1:-1:-1;;;;;5171:14:6;;;;:34;;:46;;5206:10;;5171:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;5221:4;5171:54;5100:125;5092:150;;;;-1:-1:-1;;;5092:150:6;;;;;;;:::i;:::-;29407:14:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;29407:22:6;;;;29359:21:::1;::::0;29344:12:::1;::::0;-1:-1:-1;;;;;29407:14:6;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:14;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29391:38;;29441:12;29467:5;-1:-1:-1::0;;;;;29459:19:6::1;29486:7;29459:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29440:58;;;29517:7;29509:30;;;;-1:-1:-1::0;;;29509:30:6::1;;;;;;;:::i;:::-;29555:38;::::0;7103:14:7;;7096:22;7078:41;;29585:7:6;;29564:10:::1;::::0;29555:38:::1;::::0;7066:2:7;7051:18;29555:38:6::1;;;;;;;29333:268;;;29242:359:::0;:::o;33358:2742::-;33420:7;33465:31;;;:16;:31;;;;;:43;;;33420:7;;33465:43;;33512:1;33465:48;33461:2632;;33699:1;33660:31;;;:16;:31;;;;;;;;:36;;:40;33656:417;;33922:35;;;;:20;:35;;;;;;;;33883:7;;:36;;-1:-1:-1;;;33883:36:6;;;;;345:25:7;;;33922:35:6;;-1:-1:-1;;;;;33883:7:6;;:21;;318:18:7;;33883:36:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;;:::i;:::-;33836:31;;;;:16;:31;;;;;;;;:36;;;;33783:50;;;;;33875:3;;33783:89;;;:::i;:::-;:95;;;;:::i;:::-;33782:176;;;;:::i;:::-;33728:31;;;;:16;:31;;;;;:50;;;:231;;;;:::i;:::-;33721:238;33358:2742;-1:-1:-1;;;33358:2742:6:o;33656:417::-;-1:-1:-1;;34007:31:6;;;;:16;:31;;;;;:50;;;;33358:2742::o;33461:2632::-;34094:31;;;;:16;:31;;;;;:43;;;;;34141:1;34094:48;:121;;;;-1:-1:-1;34165:31:6;;;;:16;:31;;;;;:50;34146:15;:69;;34094:121;:189;;;;-1:-1:-1;34238:31:6;;;;:16;:31;;;;;:45;;;34219:15;:64;;34094:189;34090:2003;;;34671:31;;;;:16;:31;;;;;:42;;;;34617:50;;34599:68;;:15;:68;:::i;:::-;34598:115;;;;:::i;:::-;34728:13;34795:31;;;:16;:31;;;;;;;:36;;34590:123;;-1:-1:-1;34728:13:6;;;34795:41;;34791:907;;34919:9;:5;34927:1;34919:9;:::i;:::-;34865:31;;;;:16;:31;;;;;:50;;;:64;;;;:::i;:::-;35164:31;;;;:16;:31;;;;;:50;;35118:42;;;;;34857:72;;-1:-1:-1;35164:50:6;35110;;:5;:50;:::i;:::-;35091:70;;:15;:70;:::i;:::-;:123;;;;:::i;:::-;35043:31;;;;:16;:31;;;;;:42;;;35028:9;:5;35036:1;35028:9;:::i;:::-;34974:31;;;;:16;:31;;;;;:50;;;:64;;;;:::i;:::-;34965:74;;:5;:74;:::i;:::-;34964:121;;;;:::i;:::-;34963:253;;;;:::i;:::-;34948:268;;34791:907;;;35374:31;;;;:16;:31;;;;;;;;:36;;;;35316:53;;;;35263:50;;;;;35416:5;;35263:106;;;:::i;:::-;35262:149;;;;:::i;:::-;35261:160;35257:426;;35516:31;;;;:16;:31;;;;;;;;:36;;35508:44;;:5;:44;:::i;:::-;35454:31;;;;:16;:31;;;;;:50;;;:99;;;;:::i;:::-;35446:107;;35257:426;;;35610:31;;;;:16;:31;;;;;:53;;;;-1:-1:-1;35257:426:6;35739:31;;;;:16;:31;;;;;:53;;;35716:20;35724:12;35716:5;:20;:::i;:::-;:76;35712:246;;;35820:20;35828:12;35820:5;:20;:::i;:::-;35813:27;33358:2742;-1:-1:-1;;;;;33358:2742:6:o;35712:246::-;-1:-1:-1;;;35889:31:6;;;;-1:-1:-1;35889:16:6;:31;;;;;:53;;;;33358:2742::o;1447:174:5:-;1548:4;1609;1572:33;1593:5;;1600:4;1572:20;:33::i;:::-;:41;;1447:174;-1:-1:-1;;;;;1447:174:5:o;17337:292:6:-;17411:7;;17465:15;17474:6;17465;:15;:::i;:::-;17511:43;;17456:24;;-1:-1:-1;17492:13:6;;17519:10;;17456:24;;17492:13;17511:43;17492:13;17511:43;17456:24;17519:10;17511:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17491:63;;;17573:8;17565:31;;;;-1:-1:-1;;;17565:31:6;;;;;;;:::i;:::-;-1:-1:-1;17614:6:6;-1:-1:-1;17337:292:6;;;;;:::o;2392:306:5:-;2485:7;2528:4;2485:7;2543:118;2563:16;;;2543:118;;;2616:33;2626:12;2640:5;;2646:1;2640:8;;;;;;;:::i;:::-;;;;;;;2616:9;:33::i;:::-;2601:48;-1:-1:-1;2581:3:5;;;;:::i;:::-;;;;2543:118;;;-1:-1:-1;2678:12:5;2392:306;-1:-1:-1;;;;2392:306:5:o;9186:149::-;9249:7;9280:1;9276;:5;:51;;9411:13;9505:15;;;9541:4;9534:15;;;9588:4;9572:21;;9276:51;;;-1:-1:-1;9411:13:5;9505:15;;;9541:4;9534:15;9588:4;9572:21;;;9186:149::o;14:180:7:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:7;;14:180;-1:-1:-1;14:180:7:o;381:131::-;-1:-1:-1;;;;;456:31:7;;446:42;;436:70;;502:1;499;492:12;436:70;381:131;:::o;517:127::-;578:10;573:3;569:20;566:1;559:31;609:4;606:1;599:15;633:4;630:1;623:15;649:275;720:2;714:9;785:2;766:13;;-1:-1:-1;;762:27:7;750:40;;-1:-1:-1;;;;;805:34:7;;841:22;;;802:62;799:88;;;867:18;;:::i;:::-;903:2;896:22;649:275;;-1:-1:-1;649:275:7:o;929:531::-;972:5;1025:3;1018:4;1010:6;1006:17;1002:27;992:55;;1043:1;1040;1033:12;992:55;1079:6;1066:20;-1:-1:-1;;;;;1101:2:7;1098:26;1095:52;;;1127:18;;:::i;:::-;1171:55;1214:2;1195:13;;-1:-1:-1;;1191:27:7;1220:4;1187:38;1171:55;:::i;:::-;1251:2;1242:7;1235:19;1297:3;1290:4;1285:2;1277:6;1273:15;1269:26;1266:35;1263:55;;;1314:1;1311;1304:12;1263:55;1379:2;1372:4;1364:6;1360:17;1353:4;1344:7;1340:18;1327:55;1427:1;1402:16;;;1420:4;1398:27;1391:38;;;;1406:7;929:531;-1:-1:-1;;;929:531:7:o;1465:367::-;1528:8;1538:6;1592:3;1585:4;1577:6;1573:17;1569:27;1559:55;;1610:1;1607;1600:12;1559:55;-1:-1:-1;1633:20:7;;-1:-1:-1;;;;;1665:30:7;;1662:50;;;1708:1;1705;1698:12;1662:50;1745:4;1737:6;1733:17;1721:29;;1805:3;1798:4;1788:6;1785:1;1781:14;1773:6;1769:27;1765:38;1762:47;1759:67;;;1822:1;1819;1812:12;1759:67;1465:367;;;;;:::o;1837:1069::-;1987:6;1995;2003;2011;2019;2027;2035;2043;2096:3;2084:9;2075:7;2071:23;2067:33;2064:53;;;2113:1;2110;2103:12;2064:53;2152:9;2139:23;2171:31;2196:5;2171:31;:::i;:::-;2221:5;-1:-1:-1;2273:2:7;2258:18;;2245:32;;-1:-1:-1;2324:2:7;2309:18;;2296:32;;-1:-1:-1;2375:2:7;2360:18;;2347:32;;-1:-1:-1;2430:3:7;2415:19;;2402:33;-1:-1:-1;;;;;2484:14:7;;;2481:34;;;2511:1;2508;2501:12;2481:34;2534:50;2576:7;2567:6;2556:9;2552:22;2534:50;:::i;:::-;2524:60;;2637:3;2626:9;2622:19;2609:33;2593:49;;2667:2;2657:8;2654:16;2651:36;;;2683:1;2680;2673:12;2651:36;;2722:72;2786:7;2775:8;2764:9;2760:24;2722:72;:::i;:::-;1837:1069;;;;-1:-1:-1;1837:1069:7;;;;;;2696:98;;2895:3;2880:19;2867:33;;1837:1069;-1:-1:-1;;;;1837:1069:7:o;2911:118::-;2997:5;2990:13;2983:21;2976:5;2973:32;2963:60;;3019:1;3016;3009:12;3034:377;3108:6;3116;3124;3177:2;3165:9;3156:7;3152:23;3148:32;3145:52;;;3193:1;3190;3183:12;3145:52;3229:9;3216:23;3206:33;;3286:2;3275:9;3271:18;3258:32;3248:42;;3340:2;3329:9;3325:18;3312:32;3353:28;3375:5;3353:28;:::i;:::-;3400:5;3390:15;;;3034:377;;;;;:::o;3416:805::-;3529:6;3537;3545;3553;3561;3569;3577;3630:3;3618:9;3609:7;3605:23;3601:33;3598:53;;;3647:1;3644;3637:12;3598:53;3683:9;3670:23;3660:33;;3743:2;3732:9;3728:18;3715:32;3756:31;3781:5;3756:31;:::i;:::-;3806:5;-1:-1:-1;3863:2:7;3848:18;;3835:32;3876:33;3835:32;3876:33;:::i;:::-;3928:7;-1:-1:-1;3987:2:7;3972:18;;3959:32;4000:33;3959:32;4000:33;:::i;:::-;3416:805;;;;-1:-1:-1;3416:805:7;;4106:3;4091:19;;4078:33;;4158:3;4143:19;;4130:33;;-1:-1:-1;4210:3:7;4195:19;;;4182:33;;-1:-1:-1;3416:805:7;-1:-1:-1;;3416:805:7:o;4226:247::-;4285:6;4338:2;4326:9;4317:7;4313:23;4309:32;4306:52;;;4354:1;4351;4344:12;4306:52;4393:9;4380:23;4412:31;4437:5;4412:31;:::i;4478:594::-;4573:6;4581;4589;4597;4605;4658:3;4646:9;4637:7;4633:23;4629:33;4626:53;;;4675:1;4672;4665:12;4626:53;4711:9;4698:23;4688:33;;4771:2;4760:9;4756:18;4743:32;4784:31;4809:5;4784:31;:::i;:::-;4834:5;-1:-1:-1;4891:2:7;4876:18;;4863:32;4904:33;4863:32;4904:33;:::i;:::-;4478:594;;;;-1:-1:-1;4956:7:7;;5010:2;4995:18;;4982:32;;-1:-1:-1;5061:3:7;5046:19;5033:33;;4478:594;-1:-1:-1;;4478:594:7:o;6017:663::-;6122:6;6130;6138;6146;6154;6207:3;6195:9;6186:7;6182:23;6178:33;6175:53;;;6224:1;6221;6214:12;6175:53;6263:9;6250:23;6282:31;6307:5;6282:31;:::i;:::-;6332:5;-1:-1:-1;6388:2:7;6373:18;;6360:32;-1:-1:-1;;;;;6404:30:7;;6401:50;;;6447:1;6444;6437:12;6401:50;6470;6512:7;6503:6;6492:9;6488:22;6470:50;:::i;:::-;6017:663;;6460:60;;-1:-1:-1;;;;6567:2:7;6552:18;;6539:32;;6618:2;6603:18;;6590:32;;6669:3;6654:19;;;6641:33;;-1:-1:-1;6017:663:7;-1:-1:-1;6017:663:7:o;6685:248::-;6753:6;6761;6814:2;6802:9;6793:7;6789:23;6785:32;6782:52;;;6830:1;6827;6820:12;6782:52;-1:-1:-1;;6853:23:7;;;6923:2;6908:18;;;6895:32;;-1:-1:-1;6685:248:7:o;7130:799::-;7240:6;7248;7256;7264;7272;7280;7288;7341:3;7329:9;7320:7;7316:23;7312:33;7309:53;;;7358:1;7355;7348:12;7309:53;7397:9;7384:23;7416:31;7441:5;7416:31;:::i;:::-;7466:5;-1:-1:-1;7518:2:7;7503:18;;7490:32;;-1:-1:-1;7569:2:7;7554:18;;7541:32;;-1:-1:-1;7620:2:7;7605:18;;7592:32;;-1:-1:-1;7671:3:7;7656:19;;7643:33;;-1:-1:-1;7728:3:7;7713:19;;7700:33;7742;7700;7742;:::i;:::-;7794:7;-1:-1:-1;7853:3:7;7838:19;;7825:33;7867:30;7825:33;7867:30;:::i;:::-;7916:7;7906:17;;;7130:799;;;;;;;;;;:::o;7934:183::-;7994:4;-1:-1:-1;;;;;8019:6:7;8016:30;8013:56;;;8049:18;;:::i;:::-;-1:-1:-1;8094:1:7;8090:14;8106:4;8086:25;;7934:183::o;8122:888::-;8175:5;8228:3;8221:4;8213:6;8209:17;8205:27;8195:55;;8246:1;8243;8236:12;8195:55;8282:6;8269:20;8308:4;8332:60;8348:43;8388:2;8348:43;:::i;:::-;8332:60;:::i;:::-;8426:15;;;8512:1;8508:10;;;;8496:23;;8492:32;;;8457:12;;;;8536:15;;;8533:35;;;8564:1;8561;8554:12;8533:35;8600:2;8592:6;8588:15;8612:369;8628:6;8623:3;8620:15;8612:369;;;8714:3;8701:17;-1:-1:-1;;;;;8737:11:7;8734:35;8731:125;;;8810:1;8839:2;8835;8828:14;8731:125;8881:57;8934:3;8929:2;8915:11;8907:6;8903:24;8899:33;8881:57;:::i;:::-;8869:70;;-1:-1:-1;8959:12:7;;;;8645;;8612:369;;;-1:-1:-1;8999:5:7;8122:888;-1:-1:-1;;;;;;8122:888:7:o;9015:662::-;9069:5;9122:3;9115:4;9107:6;9103:17;9099:27;9089:55;;9140:1;9137;9130:12;9089:55;9176:6;9163:20;9202:4;9226:60;9242:43;9282:2;9242:43;:::i;9226:60::-;9320:15;;;9406:1;9402:10;;;;9390:23;;9386:32;;;9351:12;;;;9430:15;;;9427:35;;;9458:1;9455;9448:12;9427:35;9494:2;9486:6;9482:15;9506:142;9522:6;9517:3;9514:15;9506:142;;;9588:17;;9576:30;;9626:12;;;;9539;;9506:142;;9682:1746;9887:6;9895;9903;9911;9919;9972:3;9960:9;9951:7;9947:23;9943:33;9940:53;;;9989:1;9986;9979:12;9940:53;10029:9;10016:23;-1:-1:-1;;;;;10099:2:7;10091:6;10088:14;10085:34;;;10115:1;10112;10105:12;10085:34;10153:6;10142:9;10138:22;10128:32;;10198:7;10191:4;10187:2;10183:13;10179:27;10169:55;;10220:1;10217;10210:12;10169:55;10256:2;10243:16;10278:4;10302:60;10318:43;10358:2;10318:43;:::i;10302:60::-;10396:15;;;10478:1;10474:10;;;;10466:19;;10462:28;;;10427:12;;;;10502:19;;;10499:39;;;10534:1;10531;10524:12;10499:39;10558:11;;;;10578:217;10594:6;10589:3;10586:15;10578:217;;;10674:3;10661:17;10691:31;10716:5;10691:31;:::i;:::-;10735:18;;10611:12;;;;10773;;;;10578:217;;;10814:5;-1:-1:-1;;10857:18:7;;10844:32;;-1:-1:-1;;10888:16:7;;;10885:36;;;10917:1;10914;10907:12;10885:36;10940:62;10994:7;10983:8;10972:9;10968:24;10940:62;:::i;:::-;10930:72;;11055:2;11044:9;11040:18;11027:32;11011:48;;11084:2;11074:8;11071:16;11068:36;;;11100:1;11097;11090:12;11068:36;11123:63;11178:7;11167:8;11156:9;11152:24;11123:63;:::i;:::-;11113:73;;11233:2;11222:9;11218:18;11205:32;11195:42;;11290:3;11279:9;11275:19;11262:33;11246:49;;11320:2;11310:8;11307:16;11304:36;;;11336:1;11333;11326:12;11304:36;;11359:63;11414:7;11403:8;11392:9;11388:24;11359:63;:::i;:::-;11349:73;;;9682:1746;;;;;;;;:::o;11871:203::-;-1:-1:-1;;;;;12035:32:7;;;;12017:51;;12005:2;11990:18;;11871:203::o;12547:385::-;12633:6;12641;12649;12657;12710:3;12698:9;12689:7;12685:23;12681:33;12678:53;;;12727:1;12724;12717:12;12678:53;-1:-1:-1;;12750:23:7;;;12820:2;12805:18;;12792:32;;-1:-1:-1;12871:2:7;12856:18;;12843:32;;12922:2;12907:18;12894:32;;-1:-1:-1;12547:385:7;-1:-1:-1;12547:385:7:o;12937:1211::-;13096:6;13104;13112;13120;13128;13136;13144;13152;13160;13213:3;13201:9;13192:7;13188:23;13184:33;13181:53;;;13230:1;13227;13220:12;13181:53;13266:9;13253:23;13243:33;;13323:2;13312:9;13308:18;13295:32;13285:42;;13374:2;13363:9;13359:18;13346:32;13336:42;;13429:2;13418:9;13414:18;13401:32;-1:-1:-1;;;;;13493:2:7;13485:6;13482:14;13479:34;;;13509:1;13506;13499:12;13479:34;13532:50;13574:7;13565:6;13554:9;13550:22;13532:50;:::i;:::-;13522:60;;13632:3;13621:9;13617:19;13604:33;13591:46;;13646:31;13671:5;13646:31;:::i;:::-;13696:5;;-1:-1:-1;13754:3:7;13739:19;;13726:33;;13771:16;;;13768:36;;;13800:1;13797;13790:12;13768:36;;13839:72;13903:7;13892:8;13881:9;13877:24;13839:72;:::i;:::-;13930:8;;-1:-1:-1;13813:98:7;-1:-1:-1;;14017:3:7;14002:19;;13989:33;14031;13989;14031;:::i;:::-;14083:7;14073:17;;;14137:3;14126:9;14122:19;14109:33;14099:43;;12937:1211;;;;;;;;;;;:::o;14381:523::-;14485:6;14493;14501;14509;14517;14525;14578:3;14566:9;14557:7;14553:23;14549:33;14546:53;;;14595:1;14592;14585:12;14546:53;-1:-1:-1;;14618:23:7;;;14688:2;14673:18;;14660:32;;-1:-1:-1;14739:2:7;14724:18;;14711:32;;14790:2;14775:18;;14762:32;;-1:-1:-1;14841:3:7;14826:19;;14813:33;;-1:-1:-1;14893:3:7;14878:19;14865:33;;-1:-1:-1;14381:523:7;-1:-1:-1;14381:523:7:o;14909:316::-;14986:6;14994;15002;15055:2;15043:9;15034:7;15030:23;15026:32;15023:52;;;15071:1;15068;15061:12;15023:52;-1:-1:-1;;15094:23:7;;;15164:2;15149:18;;15136:32;;-1:-1:-1;15215:2:7;15200:18;;;15187:32;;14909:316;-1:-1:-1;14909:316:7:o;15475:754::-;15586:6;15594;15602;15610;15618;15626;15634;15687:3;15675:9;15666:7;15662:23;15658:33;15655:53;;;15704:1;15701;15694:12;15655:53;15740:9;15727:23;15717:33;;15797:2;15786:9;15782:18;15769:32;15759:42;;15848:2;15837:9;15833:18;15820:32;15810:42;;15899:2;15888:9;15884:18;15871:32;15861:42;;15950:3;15939:9;15935:19;15922:33;15912:43;;16005:3;15994:9;15990:19;15977:33;16050:4;16043:5;16039:16;16032:5;16029:27;16019:55;;16070:1;16067;16060:12;16019:55;16093:5;-1:-1:-1;16150:3:7;16135:19;;16122:33;16164;16122;16164;:::i;16807:454::-;16902:6;16910;16918;16926;16934;16987:3;16975:9;16966:7;16962:23;16958:33;16955:53;;;17004:1;17001;16994:12;16955:53;-1:-1:-1;;17027:23:7;;;17097:2;17082:18;;17069:32;;-1:-1:-1;17148:2:7;17133:18;;17120:32;;17199:2;17184:18;;17171:32;;-1:-1:-1;17250:3:7;17235:19;17222:33;;-1:-1:-1;16807:454:7;-1:-1:-1;16807:454:7:o;17266:444::-;17337:6;17345;17353;17406:2;17394:9;17385:7;17381:23;17377:32;17374:52;;;17422:1;17419;17412:12;17374:52;17458:9;17445:23;17435:33;;17518:2;17507:9;17503:18;17490:32;17531:28;17553:5;17531:28;:::i;:::-;17578:5;-1:-1:-1;17635:2:7;17620:18;;17607:32;17648:30;17607:32;17648:30;:::i;17715:294::-;17892:2;17888:15;;;;-1:-1:-1;;17884:53:7;17872:66;;17963:2;17954:12;;17947:28;18000:2;17991:12;;17715:294::o;18014:331::-;18216:2;18198:21;;;18255:1;18235:18;;;18228:29;-1:-1:-1;;;18288:2:7;18273:18;;18266:38;18336:2;18321:18;;18014:331::o;18350:251::-;18420:6;18473:2;18461:9;18452:7;18448:23;18444:32;18441:52;;;18489:1;18486;18479:12;18441:52;18521:9;18515:16;18540:31;18565:5;18540:31;:::i;18606:464::-;-1:-1:-1;;;;;18901:15:7;;;18883:34;;18953:15;;;18948:2;18933:18;;18926:43;19005:15;;19000:2;18985:18;;18978:43;19052:2;19037:18;;19030:34;;;;18832:3;18817:19;;18606:464::o;19075:245::-;19142:6;19195:2;19183:9;19174:7;19170:23;19166:32;19163:52;;;19211:1;19208;19201:12;19163:52;19243:9;19237:16;19262:28;19284:5;19262:28;:::i;19794:337::-;19996:2;19978:21;;;20035:2;20015:18;;;20008:30;-1:-1:-1;;;20069:2:7;20054:18;;20047:43;20122:2;20107:18;;19794:337::o;20136:127::-;20197:10;20192:3;20188:20;20185:1;20178:31;20228:4;20225:1;20218:15;20252:4;20249:1;20242:15;21000:250;21085:1;21095:113;21109:6;21106:1;21103:13;21095:113;;;21185:11;;;21179:18;21166:11;;;21159:39;21131:2;21124:10;21095:113;;;-1:-1:-1;;21242:1:7;21224:16;;21217:27;21000:250::o;21255:361::-;21444:6;21439:3;21432:19;21414:3;21480:6;21474:13;21496:73;21562:6;21557:2;21552:3;21548:12;21543:2;21535:6;21531:15;21496:73;:::i;:::-;21589:16;;;;21607:2;21585:25;;21255:361;-1:-1:-1;;;21255:361:7:o;21808:337::-;22010:2;21992:21;;;22049:2;22029:18;;;22022:30;-1:-1:-1;;;22083:2:7;22068:18;;22061:43;22136:2;22121:18;;21808:337::o;22150:334::-;22352:2;22334:21;;;22391:2;22371:18;;;22364:30;-1:-1:-1;;;22425:2:7;22410:18;;22403:40;22475:2;22460:18;;22150:334::o;22489:184::-;22559:6;22612:2;22600:9;22591:7;22587:23;22583:32;22580:52;;;22628:1;22625;22618:12;22580:52;-1:-1:-1;22651:16:7;;22489:184;-1:-1:-1;22489:184:7:o;22678:127::-;22739:10;22734:3;22730:20;22727:1;22720:31;22770:4;22767:1;22760:15;22794:4;22791:1;22784:15;22810:125;22875:9;;;22896:10;;;22893:36;;;22909:18;;:::i;22940:332::-;23142:2;23124:21;;;23181:1;23161:18;;;23154:29;-1:-1:-1;;;23214:2:7;23199:18;;23192:39;23263:2;23248:18;;22940:332::o;23277:::-;23479:2;23461:21;;;23518:1;23498:18;;;23491:29;-1:-1:-1;;;23551:2:7;23536:18;;23529:39;23600:2;23585:18;;23277:332::o;23614:128::-;23681:9;;;23702:11;;;23699:37;;;23716:18;;:::i;23747:271::-;23789:3;23827:5;23821:12;23854:6;23849:3;23842:19;23870:76;23939:6;23932:4;23927:3;23923:14;23916:4;23909:5;23905:16;23870:76;:::i;:::-;24000:2;23979:15;-1:-1:-1;;23975:29:7;23966:39;;;;24007:4;23962:50;;23747:271;-1:-1:-1;;23747:271:7:o;24023:707::-;24322:25;;;-1:-1:-1;;;;;24421:15:7;;;24416:2;24401:18;;24394:43;24473:15;;24468:2;24453:18;;24446:43;24525:3;24520:2;24505:18;;24498:31;;;24303:4;;24546:46;;24572:19;;24564:6;24546:46;:::i;:::-;24623:3;24608:19;;24601:35;;;;-1:-1:-1;24667:3:7;24652:19;;24645:35;;;;24711:3;24696:19;;;24689:35;24538:54;24023:707;-1:-1:-1;;;;24023:707:7:o;24735:299::-;-1:-1:-1;;;;;24925:32:7;;;;24907:51;;-1:-1:-1;;;;;;24994:33:7;24989:2;24974:18;;24967:61;24895:2;24880:18;;24735:299::o;25039:335::-;25241:2;25223:21;;;25280:2;25260:18;;;25253:30;-1:-1:-1;;;25314:2:7;25299:18;;25292:41;25365:2;25350:18;;25039:335::o;25379:330::-;25581:2;25563:21;;;25620:1;25600:18;;;25593:29;-1:-1:-1;;;25653:2:7;25638:18;;25631:37;25700:2;25685:18;;25379:330::o;25714:340::-;25916:2;25898:21;;;25955:2;25935:18;;;25928:30;-1:-1:-1;;;25989:2:7;25974:18;;25967:46;26045:2;26030:18;;25714:340::o;26059:330::-;26261:2;26243:21;;;26300:1;26280:18;;;26273:29;-1:-1:-1;;;26333:2:7;26318:18;;26311:37;26380:2;26365:18;;26059:330::o;27495:168::-;27568:9;;;27599;;27616:15;;;27610:22;;27596:37;27586:71;;27637:18;;:::i;27668:217::-;27708:1;27734;27724:132;;27778:10;27773:3;27769:20;27766:1;27759:31;27813:4;27810:1;27803:15;27841:4;27838:1;27831:15;27724:132;-1:-1:-1;27870:9:7;;27668:217::o;28100:334::-;28302:2;28284:21;;;28341:2;28321:18;;;28314:30;-1:-1:-1;;;28375:2:7;28360:18;;28353:40;28425:2;28410:18;;28100:334::o;28789:331::-;28991:2;28973:21;;;29030:1;29010:18;;;29003:29;-1:-1:-1;;;29063:2:7;29048:18;;29041:38;29111:2;29096:18;;28789:331::o;29125:337::-;29327:2;29309:21;;;29366:2;29346:18;;;29339:30;-1:-1:-1;;;29400:2:7;29385:18;;29378:43;29453:2;29438:18;;29125:337::o;29467:533::-;29710:25;;;-1:-1:-1;;;;;29771:32:7;;29766:2;29751:18;;29744:60;29791:3;29835:2;29820:18;;29813:31;;;-1:-1:-1;;29861:46:7;;29887:19;;29879:6;29861:46;:::i;:::-;29938:2;29923:18;;29916:34;;;;-1:-1:-1;29981:3:7;29966:19;29959:35;29853:54;29467:533;-1:-1:-1;;;29467:533:7:o;30005:135::-;30044:3;30065:17;;;30062:43;;30085:18;;:::i;:::-;-1:-1:-1;30132:1:7;30121:13;;30005:135::o;31389:475::-;31631:26;31627:31;31618:6;31614:2;31610:15;31606:53;31601:3;31594:66;31690:6;31685:2;31680:3;31676:12;31669:28;31576:3;31726:6;31720:13;31742:75;31810:6;31805:2;31800:3;31796:12;31789:4;31781:6;31777:17;31742:75;:::i;:::-;31837:16;;;;31855:2;31833:25;;31389:475;-1:-1:-1;;;;31389:475:7:o;31869:274::-;32043:25;;;-1:-1:-1;;;;;32104:32:7;32099:2;32084:18;;32077:60;32031:2;32016:18;;31869:274::o;32148:331::-;32350:2;32332:21;;;32389:1;32369:18;;;32362:29;-1:-1:-1;;;32422:2:7;32407:18;;32400:38;32470:2;32455:18;;32148:331::o;33779:346::-;33981:2;33963:21;;;34020:2;34000:18;;;33993:30;-1:-1:-1;;;34054:2:7;34039:18;;34032:52;34116:2;34101:18;;33779:346::o

Swarm Source

ipfs://b70160aef7eef99472bb263304952646fc6ef8b0f53546cfb6fe30368d304ad7

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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