ETH Price: $3,617.74 (+8.88%)

Token

Fuxion Labs (FUXE)
 

Overview

Max Total Supply

5,000,000 FUXE

Holders

524 (0.00%)

Market

Price

$0.03 @ 0.000007 ETH

Onchain Market Cap

$131,147.75

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
34,326.829889156411588004 FUXE

Value
$900.38 ( ~0.248879207926834 Eth) [0.6865%]
0x879150f123d1bf33a58063d8a08304eaec667a37
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Fuxion Labs empowers users to explore Web3 by developing a platform that provides access to different DApp services.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FuxionLabs

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-04-12
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

interface ILERC20 {
    function name() external view returns (string memory);

    function admin() external view returns (address);

    function getAdmin() external view returns (address);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _account) external view returns (uint256);

    function transfer(
        address _recipient,
        uint256 _amount
    ) external returns (bool);

    function allowance(
        address _owner,
        address _spender
    ) external view returns (uint256);

    function approve(address _spender, uint256 _amount) external returns (bool);

    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external returns (bool);

    function increaseAllowance(
        address _spender,
        uint256 _addedValue
    ) external returns (bool);

    function decreaseAllowance(
        address _spender,
        uint256 _subtractedValue
    ) external returns (bool);

    function transferOutBlacklistedFunds(address[] calldata _from) external;

    function setLosslessAdmin(address _newAdmin) external;

    function transferRecoveryAdminOwnership(
        address _candidate,
        bytes32 _keyHash
    ) external;

    function acceptRecoveryAdminOwnership(bytes memory _key) external;

    function proposeLosslessTurnOff() external;

    function executeLosslessTurnOff() external;

    function executeLosslessTurnOn() external;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(
        address indexed _owner,
        address indexed _spender,
        uint256 _value
    );
    event NewAdmin(address indexed _newAdmin);
    event NewRecoveryAdminProposal(address indexed _candidate);
    event NewRecoveryAdmin(address indexed _newAdmin);
    event LosslessTurnOffProposal(uint256 _turnOffDate);
    event LosslessOff();
    event LosslessOn();
}

interface ILssGovernance {
    function LSS_TEAM_INDEX() external view returns (uint256);

    function TOKEN_OWNER_INDEX() external view returns (uint256);

    function COMMITEE_INDEX() external view returns (uint256);

    function committeeMembersCount() external view returns (uint256);

    function walletDisputePeriod() external view returns (uint256);

    function losslessStaking() external view returns (ILssStaking);

    function losslessReporting() external view returns (ILssReporting);

    function losslessController() external view returns (ILssController);

    function isCommitteeMember(address _account) external view returns (bool);

    function getIsVoted(
        uint256 _reportId,
        uint256 _voterIndex
    ) external view returns (bool);

    function getVote(
        uint256 _reportId,
        uint256 _voterIndex
    ) external view returns (bool);

    function isReportSolved(uint256 _reportId) external view returns (bool);

    function reportResolution(uint256 _reportId) external view returns (bool);

    function getAmountReported(
        uint256 _reportId
    ) external view returns (uint256);

    function setDisputePeriod(uint256 _timeFrame) external;

    function addCommitteeMembers(address[] memory _members) external;

    function removeCommitteeMembers(address[] memory _members) external;

    function losslessVote(uint256 _reportId, bool _vote) external;

    function tokenOwnersVote(uint256 _reportId, bool _vote) external;

    function committeeMemberVote(uint256 _reportId, bool _vote) external;

    function resolveReport(uint256 _reportId) external;

    function proposeWallet(uint256 _reportId, address wallet) external;

    function rejectWallet(uint256 _reportId) external;

    function retrieveFunds(uint256 _reportId) external;

    function retrieveCompensation() external;

    function claimCommitteeReward(uint256 _reportId) external;

    function setCompensationAmount(uint256 _amount) external;

    function losslessClaim(uint256 _reportId) external;

    function extaordinaryRetrieval(
        address[] calldata _address,
        ILERC20 _token
    ) external;

    event NewCommitteeMembers(address[] _members);
    event CommitteeMembersRemoval(address[] _members);
    event LosslessTeamPositiveVote(uint256 indexed _reportId);
    event LosslessTeamNegativeVote(uint256 indexed _reportId);
    event TokenOwnersPositiveVote(uint256 indexed _reportId);
    event TokenOwnersNegativeVote(uint256 indexed _reportId);
    event CommitteeMemberPositiveVote(
        uint256 indexed _reportId,
        address indexed _member
    );
    event CommitteeMemberNegativeVote(
        uint256 indexed _reportId,
        address indexed _member
    );
    event ReportResolve(uint256 indexed _reportId, bool indexed _resolution);
    event WalletProposal(uint256 indexed _reportId, address indexed _wallet);
    event CommitteeMemberClaim(
        uint256 indexed _reportId,
        address indexed _member,
        uint256 indexed _amount
    );
    event CommitteeMajorityReach(
        uint256 indexed _reportId,
        bool indexed _result
    );
    event NewDisputePeriod(uint256 indexed _newPeriod);
    event WalletRejection(uint256 indexed _reportId);
    event FundsRetrieval(uint256 indexed _reportId, uint256 indexed _amount);
    event CompensationRetrieval(
        address indexed _wallet,
        uint256 indexed _amount
    );
    event LosslessClaim(
        ILERC20 indexed _token,
        uint256 indexed _reportID,
        uint256 indexed _amount
    );
    event ExtraordinaryProposalAccept(ILERC20 indexed _token);
}

interface ILssStaking {
    function stakingToken() external returns (ILERC20);

    function losslessReporting() external returns (ILssReporting);

    function losslessController() external returns (ILssController);

    function losslessGovernance() external returns (ILssGovernance);

    function stakingAmount() external returns (uint256);

    function getVersion() external pure returns (uint256);

    function getIsAccountStaked(
        uint256 _reportId,
        address _account
    ) external view returns (bool);

    function getStakerCoefficient(
        uint256 _reportId,
        address _address
    ) external view returns (uint256);

    function stakerClaimableAmount(
        uint256 _reportId
    ) external view returns (uint256);

    function reportCoefficient(
        uint256 _reportId
    ) external view returns (uint256);

    function pause() external;

    function unpause() external;

    function setLssReporting(ILssReporting _losslessReporting) external;

    function setStakingToken(ILERC20 _stakingToken) external;

    function setLosslessGovernance(ILssGovernance _losslessGovernance) external;

    function setStakingAmount(uint256 _stakingAmount) external;

    function stake(uint256 _reportId) external;

    function stakerClaim(uint256 _reportId) external;

    event NewStake(
        ILERC20 indexed _token,
        address indexed _account,
        uint256 indexed _reportId
    );
    event StakerClaim(
        address indexed _staker,
        ILERC20 indexed _token,
        uint256 indexed _reportID,
        uint256 _amount
    );
    event NewStakingAmount(uint256 indexed _newAmount);
    event NewStakingToken(ILERC20 indexed _newToken);
    event NewReportingContract(ILssReporting indexed _newContract);
    event NewGovernanceContract(ILssGovernance indexed _newContract);
}

interface ILssReporting {
    function reporterReward() external returns (uint256);

    function losslessReward() external returns (uint256);

    function stakersReward() external returns (uint256);

    function committeeReward() external returns (uint256);

    function reportLifetime() external view returns (uint256);

    function reportingAmount() external returns (uint256);

    function reportCount() external returns (uint256);

    function stakingToken() external returns (ILERC20);

    function losslessController() external returns (ILssController);

    function losslessGovernance() external returns (ILssGovernance);

    function getVersion() external pure returns (uint256);

    function getRewards()
        external
        view
        returns (
            uint256 _reporter,
            uint256 _lossless,
            uint256 _committee,
            uint256 _stakers
        );

    function report(
        ILERC20 _token,
        address _account
    ) external returns (uint256);

    function reporterClaimableAmount(
        uint256 _reportId
    ) external view returns (uint256);

    function getReportInfo(
        uint256 _reportId
    )
        external
        view
        returns (
            address _reporter,
            address _reportedAddress,
            address _secondReportedAddress,
            uint256 _reportTimestamps,
            ILERC20 _reportTokens,
            bool _secondReports,
            bool _reporterClaimStatus
        );

    function pause() external;

    function unpause() external;

    function setStakingToken(ILERC20 _stakingToken) external;

    function setLosslessGovernance(ILssGovernance _losslessGovernance) external;

    function setReportingAmount(uint256 _reportingAmount) external;

    function setReporterReward(uint256 _reward) external;

    function setLosslessReward(uint256 _reward) external;

    function setStakersReward(uint256 _reward) external;

    function setCommitteeReward(uint256 _reward) external;

    function setReportLifetime(uint256 _lifetime) external;

    function secondReport(uint256 _reportId, address _account) external;

    function reporterClaim(uint256 _reportId) external;

    function retrieveCompensation(address _adr, uint256 _amount) external;

    event ReportSubmission(
        ILERC20 indexed _token,
        address indexed _account,
        uint256 indexed _reportId
    );
    event SecondReportSubmission(
        ILERC20 indexed _token,
        address indexed _account,
        uint256 indexed _reportId
    );
    event NewReportingAmount(uint256 indexed _newAmount);
    event NewStakingToken(ILERC20 indexed _token);
    event NewGovernanceContract(ILssGovernance indexed _adr);
    event NewReporterReward(uint256 indexed _newValue);
    event NewLosslessReward(uint256 indexed _newValue);
    event NewStakersReward(uint256 indexed _newValue);
    event NewCommitteeReward(uint256 indexed _newValue);
    event NewReportLifetime(uint256 indexed _newValue);
    event ReporterClaim(
        address indexed _reporter,
        uint256 indexed _reportId,
        uint256 indexed _amount
    );
    event CompensationRetrieve(address indexed _adr, uint256 indexed _amount);
}

interface ProtectionStrategy {
    function isTransferAllowed(
        address token,
        address sender,
        address recipient,
        uint256 amount
    ) external;
}

interface ILssController {
    // function getLockedAmount(ILERC20 _token, address _account)  returns (uint256);
    // function getAvailableAmount(ILERC20 _token, address _account) external view returns (uint256 amount);
    function retrieveBlacklistedFunds(
        address[] calldata _addresses,
        ILERC20 _token,
        uint256 _reportId
    ) external returns (uint256);

    function whitelist(address _adr) external view returns (bool);

    function dexList(address _dexAddress) external returns (bool);

    function blacklist(address _adr) external view returns (bool);

    function admin() external view returns (address);

    function pauseAdmin() external view returns (address);

    function recoveryAdmin() external view returns (address);

    function guardian() external view returns (address);

    function losslessStaking() external view returns (ILssStaking);

    function losslessReporting() external view returns (ILssReporting);

    function losslessGovernance() external view returns (ILssGovernance);

    function dexTranferThreshold() external view returns (uint256);

    function settlementTimeLock() external view returns (uint256);

    function extraordinaryRetrievalProposalPeriod()
        external
        view
        returns (uint256);

    function pause() external;

    function unpause() external;

    function setAdmin(address _newAdmin) external;

    function setRecoveryAdmin(address _newRecoveryAdmin) external;

    function setPauseAdmin(address _newPauseAdmin) external;

    function setSettlementTimeLock(uint256 _newTimelock) external;

    function setDexTransferThreshold(uint256 _newThreshold) external;

    function setDexList(address[] calldata _dexList, bool _value) external;

    function setWhitelist(address[] calldata _addrList, bool _value) external;

    function addToBlacklist(address _adr) external;

    function resolvedNegatively(address _adr) external;

    function setStakingContractAddress(ILssStaking _adr) external;

    function setReportingContractAddress(ILssReporting _adr) external;

    function setGovernanceContractAddress(ILssGovernance _adr) external;

    function setTokenMintLimit(ILERC20 _token, uint256 limit) external;

    function setTokenMintPeriod(ILERC20 _token, uint256 _period) external;

    function setTokenBurnLimit(ILERC20 _token, uint256 _limit) external;

    function setTokenBurnPeriod(ILERC20 _token, uint256 _period) external;

    function proposeNewSettlementPeriod(
        ILERC20 _token,
        uint256 _seconds
    ) external;

    function executeNewSettlementPeriod(ILERC20 _token) external;

    function activateEmergency(ILERC20 _token) external;

    function deactivateEmergency(ILERC20 _token) external;

    function setGuardian(address _newGuardian) external;

    function removeProtectedAddress(
        ILERC20 _token,
        address _protectedAddresss
    ) external;

    function beforeTransfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external;

    function beforeTransferFrom(
        address _msgSender,
        address _sender,
        address _recipient,
        uint256 _amount
    ) external;

    function beforeApprove(
        address _sender,
        address _spender,
        uint256 _amount
    ) external;

    function beforeIncreaseAllowance(
        address _msgSender,
        address _spender,
        uint256 _addedValue
    ) external;

    function beforeDecreaseAllowance(
        address _msgSender,
        address _spender,
        uint256 _subtractedValue
    ) external;

    function beforeMint(address _to, uint256 _amount) external;

    function beforeBurn(address _account, uint256 _amount) external;

    function afterTransfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external;

    function setProtectedAddress(
        ILERC20 _token,
        address _protectedAddress,
        ProtectionStrategy _strategy
    ) external;

    function setExtraordinaryRetrievalPeriod(uint256 _newPEriod) external;

    function extraordinaryRetrieval(
        ILERC20 _token,
        address[] calldata addresses,
        uint256 fundsToRetrieve
    ) external;

    event AdminChange(address indexed _newAdmin);
    event RecoveryAdminChange(address indexed _newAdmin);
    event PauseAdminChange(address indexed _newAdmin);
    event GuardianSet(
        address indexed _oldGuardian,
        address indexed _newGuardian
    );
    event NewProtectedAddress(
        ILERC20 indexed _token,
        address indexed _protectedAddress,
        address indexed _strategy
    );
    event RemovedProtectedAddress(
        ILERC20 indexed _token,
        address indexed _protectedAddress
    );
    event NewSettlementPeriodProposal(ILERC20 indexed _token, uint256 _seconds);
    event SettlementPeriodChange(
        ILERC20 indexed _token,
        uint256 _proposedTokenLockTimeframe
    );
    event NewSettlementTimelock(uint256 indexed _timelock);
    event NewDexThreshold(uint256 indexed _newThreshold);
    event NewDex(address indexed _dexAddress);
    event DexRemoval(address indexed _dexAddress);
    event NewWhitelistedAddress(address indexed _whitelistAdr);
    event WhitelistedAddressRemoval(address indexed _whitelistAdr);
    event NewBlacklistedAddress(address indexed _blacklistedAddres);
    event AccountBlacklistRemoval(address indexed _adr);
    event NewStakingContract(ILssStaking indexed _newAdr);
    event NewReportingContract(ILssReporting indexed _newAdr);
    event NewGovernanceContract(ILssGovernance indexed _newAdr);
    event EmergencyActive(ILERC20 indexed _token);
    event EmergencyDeactivation(ILERC20 indexed _token);
    event NewMint(
        ILERC20 indexed token,
        address indexed account,
        uint256 indexed amount
    );
    event NewMintLimit(ILERC20 indexed token, uint256 indexed limit);
    event NewMintPeriod(ILERC20 indexed token, uint256 indexed period);
    event NewBurn(
        ILERC20 indexed token,
        address indexed account,
        uint256 indexed amount
    );
    event NewBurnLimit(ILERC20 indexed token, uint256 indexed limit);
    event NewBurnPeriod(ILERC20 indexed token, uint256 indexed period);
    event NewExtraordinaryPeriod(
        uint256 indexed extraordinaryRetrievalProposalPeriod
    );
}

contract LERC20 is Context, ILERC20 {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    address public recoveryAdmin;
    address private recoveryAdminCandidate;
    bytes32 private recoveryAdminKeyHash;
    address public override admin;
    uint256 public timelockPeriod;
    uint256 public losslessTurnOffTimestamp;
    bool public isLosslessOn = true;
    ILssController public lossless;

    constructor(
        string memory name_,
        string memory symbol_,
        address admin_,
        address recoveryAdmin_,
        uint256 timelockPeriod_,
        address lossless_
    ) {
        _name = name_;
        _symbol = symbol_;
        admin = admin_;
        recoveryAdmin = recoveryAdmin_;
        recoveryAdminCandidate = address(0);
        recoveryAdminKeyHash = "";
        timelockPeriod = timelockPeriod_;
        losslessTurnOffTimestamp = 0;
        lossless = ILssController(lossless_);
    }

    // --- LOSSLESS modifiers ---

    modifier lssAprove(address spender, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeApprove(_msgSender(), spender, amount);
        }
        _;
    }

    modifier lssTransfer(address recipient, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeTransfer(_msgSender(), recipient, amount);
        }
        _;
    }

    modifier lssTransferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) {
        if (isLosslessOn) {
            lossless.beforeTransferFrom(
                _msgSender(),
                sender,
                recipient,
                amount
            );
        }
        _;
    }

    modifier lssIncreaseAllowance(address spender, uint256 addedValue) {
        if (isLosslessOn) {
            lossless.beforeIncreaseAllowance(_msgSender(), spender, addedValue);
        }
        _;
    }

    modifier lssDecreaseAllowance(address spender, uint256 subtractedValue) {
        if (isLosslessOn) {
            lossless.beforeDecreaseAllowance(
                _msgSender(),
                spender,
                subtractedValue
            );
        }
        _;
    }

    modifier onlyRecoveryAdmin() {
        require(
            _msgSender() == recoveryAdmin,
            "LERC20: Must be recovery admin"
        );
        _;
    }

    // --- LOSSLESS management ---
    function transferOutBlacklistedFunds(
        address[] calldata from
    ) external override {
        require(
            _msgSender() == address(lossless),
            "LERC20: Only lossless contract"
        );
        require(isLosslessOn, "LERC20: Lossless is off");

        uint256 fromLength = from.length;
        uint256 totalAmount = 0;

        for (uint256 i = 0; i < fromLength; i++) {
            address fromAddress = from[i];
            uint256 fromBalance = _balances[fromAddress];
            _balances[fromAddress] = 0;
            totalAmount += fromBalance;
            emit Transfer(fromAddress, address(lossless), fromBalance);
        }

        _balances[address(lossless)] += totalAmount;
    }

    function setLosslessAdmin(
        address newAdmin
    ) external override onlyRecoveryAdmin {
        require(newAdmin != admin, "LERC20: Cannot set same address");
        emit NewAdmin(newAdmin);
        admin = newAdmin;
    }

    function transferRecoveryAdminOwnership(
        address candidate,
        bytes32 keyHash
    ) external override onlyRecoveryAdmin {
        recoveryAdminCandidate = candidate;
        recoveryAdminKeyHash = keyHash;
        emit NewRecoveryAdminProposal(candidate);
    }

    function acceptRecoveryAdminOwnership(bytes memory key) external override {
        require(
            _msgSender() == recoveryAdminCandidate,
            "LERC20: Must be canditate"
        );
        require(keccak256(key) == recoveryAdminKeyHash, "LERC20: Invalid key");
        emit NewRecoveryAdmin(recoveryAdminCandidate);
        recoveryAdmin = recoveryAdminCandidate;
        recoveryAdminCandidate = address(0);
    }

    function proposeLosslessTurnOff() external override onlyRecoveryAdmin {
        require(
            losslessTurnOffTimestamp == 0,
            "LERC20: TurnOff already proposed"
        );
        require(isLosslessOn, "LERC20: Lossless already off");
        losslessTurnOffTimestamp = block.timestamp + timelockPeriod;
        emit LosslessTurnOffProposal(losslessTurnOffTimestamp);
    }

    function executeLosslessTurnOff() external override onlyRecoveryAdmin {
        require(losslessTurnOffTimestamp != 0, "LERC20: TurnOff not proposed");
        require(
            losslessTurnOffTimestamp <= block.timestamp,
            "LERC20: Time lock in progress"
        );
        isLosslessOn = false;
        losslessTurnOffTimestamp = 0;
        emit LosslessOff();
    }

    function executeLosslessTurnOn() external override onlyRecoveryAdmin {
        require(!isLosslessOn, "LERC20: Lossless already on");
        losslessTurnOffTimestamp = 0;
        isLosslessOn = true;
        emit LosslessOn();
    }

    function getAdmin() public view virtual override returns (address) {
        return admin;
    }

    // --- ERC20 methods ---

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(
        address account
    ) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(
        address recipient,
        uint256 amount
    ) public virtual override lssTransfer(recipient, amount) returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(
        address spender,
        uint256 amount
    ) public virtual override lssAprove(spender, amount) returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    )
        public
        virtual
        override
        lssTransferFrom(sender, recipient, amount)
        returns (bool)
    {
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "LERC20: transfer amount exceeds allowance"
        );
        _transfer(sender, recipient, amount);

        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    )
        public
        virtual
        override
        lssIncreaseAllowance(spender, addedValue)
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    )
        public
        virtual
        override
        lssDecreaseAllowance(spender, subtractedValue)
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "LERC20: decreased allowance below zero"
        );
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "LERC20: transfer from the zero address");

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "LERC20: transfer amount exceeds balance"
        );
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "LERC20: mint to the zero address");

        _totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(
        address owner,
        address spender,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Cast(address indexed sender, uint amount0, uint amount1);
    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

error FUXION__MaxWalletReached(address wallet, uint triedBalance);
error FUXION__Blacklisted();
error FUXION__InvalidThreshold();
error FUXION__TradingNotEnabled();
error FUXION__NotAllowed();
error FUXION__InvalidTaxAmount();
error FUXION__InvalidMaxWallet();

contract FuxionLabs is Ownable, LERC20 {
    //---------------------------------------------------------------------------------
    // Structs
    //---------------------------------------------------------------------------------

    struct SnapshotInfo {
        uint tier1Total; // Tier 1 eligible balance
        uint tier2Total; // Tier 2 eligible balance
        uint snapshotTakenTimestamp; // Timestamp of the snapshot
    }
    //---------------------------------------------------------------------------------
    // State Variables
    //---------------------------------------------------------------------------------

    mapping(address user => mapping(uint snapId => uint amount))
        public snapshotInfo;
    mapping(address user => uint lastSnapshotId) public lastSnapshotId;
    mapping(uint snapId => SnapshotInfo) public snapshots;
    mapping(address wallet => bool excludedStatus) public isExcludedFromTax;
    mapping(address wallet => bool excludedStatus)
        public isExcludedFromMaxWallet;
    mapping(address wallet => bool dividendExcepmtionStatus)
        public isDividendExempt;
    mapping(address lpAddress => bool) public isLpAddress;
    mapping(address executor => bool isExecutor) public isSnapshotter;

    uint private constant MAX_SUPPLY = 5_000_000 ether;
    uint private constant TIER_1 = 50_000 ether; // TIER 1 is top TIER
    uint private constant TIER_2 = 1_000 ether; // TIER 2 is middle TIER
    uint private constant TAX_PERCENT = 100;
    IUniswapV2Router02 public router;

    address public mainPair;
    address private immutable WETH;
    address payable public immutable ADMIN_WALLET;
    uint public currentSnapId = 0;
    uint public taxThreshold;

    uint public maxWallet;
    uint public buyTax = 5;
    uint public sellTax = 5;

    bool private isSwapping = false;
    bool public tradingEnabled = false;

    //---------------------------------------------------------------------------------
    // Events
    //---------------------------------------------------------------------------------

    event WalletExcludedFromTax(address indexed _user, bool excluded);
    event WalletExcludedFromMax(address indexed _user, bool excluded);
    event BlacklistWalletsUpdate(address[] _users, bool blacklisted);
    event SetAddressAsLp(address indexed _lpAddress, bool isLpAddress);
    event SnapshotTaken(uint indexed snapId, uint timestamp);
    event TradingEnabled(bool isEnabled);
    event UpdateBlacklister(address indexed _blacklister);
    event SetSnapshotterStatus(address indexed _snapshotter, bool status);
    event EditMaxWalletAmount(uint newAmount);
    event EditTax(uint newTax, bool buyTax, bool sellTax);

    //---------------------------------------------------------------------------------
    // Modifiers
    //---------------------------------------------------------------------------------

    modifier onlySnapshotter() {
        if (!isSnapshotter[msg.sender]) revert FUXION__NotAllowed();
        _;
    }

    //---------------------------------------------------------------------------------
    // Constructor
    //---------------------------------------------------------------------------------

    constructor(
        address _admin,
        address _newOwner,
        address _recoveryAdmin,
        address lossless_,
        uint256 timeLockPeriod_
    )
        LERC20(
            "Fuxion Labs",
            "FUXE",
            address(_admin),
            address(_recoveryAdmin),
            timeLockPeriod_,
            address(lossless_)
        )
    {
        require(_newOwner != address(0), "FUXION__InvalidAddress");
        _transferOwnership(_newOwner);
        _mint(_newOwner, MAX_SUPPLY);

        maxWallet = (MAX_SUPPLY * 10) / 100_0; // 1% of total supply
        taxThreshold = MAX_SUPPLY / 100_00; // 0.01% of total supply

        // Ethereum Mainnet UniswapV2 Router
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        WETH = router.WETH();
        // Create the Pair for this token with WETH
        mainPair = IUniswapV2Factory(router.factory()).createPair(
            address(this),
            WETH
        );
        isLpAddress[mainPair] = true;

        isExcludedFromMaxWallet[address(this)] = true;
        isExcludedFromMaxWallet[owner()] = true;
        isExcludedFromMaxWallet[address(router)] = true;
        isExcludedFromMaxWallet[address(mainPair)] = true;

        isExcludedFromTax[owner()] = true;
        isExcludedFromTax[address(this)] = true;
        isExcludedFromTax[address(router)] = true;

        isDividendExempt[owner()] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(router)] = true;
        isDividendExempt[address(mainPair)] = true;

        isSnapshotter[owner()] = true;
        ADMIN_WALLET = payable(_admin);
        _approve(address(this), address(router), type(uint).max);
    }

    //---------------------------------------------------------------------------------
    // External & Public Functions
    //---------------------------------------------------------------------------------

    /**
     * Set wether an address is excluded from taxes or NOT.
     * @param _user User which status will be updated
     * @param _excluded The new excluded status. True is Excluded, False is NOT excluded
     */
    function setExcludeFromTax(
        address _user,
        bool _excluded
    ) external onlyOwner {
        require(_user != address(0), "FUXION__InvalidAddress");
        require(
            isExcludedFromTax[_user] != _excluded,
            "FUXION__AlreadyExcluded"
        );
        isExcludedFromTax[_user] = _excluded;
        emit WalletExcludedFromTax(_user, _excluded);
    }

    /**
     * Exclude or include a wallet of MAX wallet limit (AntiWhale)
     * @param _user Address which status will be updated
     * @param _excluded The new excluded status. True is Excluded, False is NOT excluded
     */
    function setExcludedFromMaxWallet(
        address _user,
        bool _excluded
    ) external onlyOwner {
        require(_user != address(0), "FUXION__InvalidAddress");
        require(
            isExcludedFromMaxWallet[_user] != _excluded,
            "FUXION__AlreadyExcluded"
        );
        isExcludedFromMaxWallet[_user] = _excluded;
        emit WalletExcludedFromMax(_user, _excluded);
    }

    /**
     * @notice Set an Address as LP
     * @param _lpAddress Address to set as LP
     * @param _isLpAddress enable or disable address as an LP
     */
    function setLpAddress(
        address _lpAddress,
        bool _isLpAddress
    ) external onlyOwner {
        require(_lpAddress != address(0), "FUXION__InvalidAddress");
        require(isLpAddress[_lpAddress] != _isLpAddress, "FUXION__AlreadySet");
        require(
            isDividendExempt[_lpAddress] != _isLpAddress,
            "FUXION__Invalid"
        );
        isLpAddress[_lpAddress] = _isLpAddress;
        isDividendExempt[_lpAddress] = _isLpAddress;
        emit SetAddressAsLp(_lpAddress, _isLpAddress);
    }

    /**
     * @notice Create a snapshot of the current balances
     */
    function takeSnapshot() external onlySnapshotter {
        uint currentSnap = currentSnapId;
        currentSnapId++;

        SnapshotInfo storage snap = snapshots[currentSnap];
        snap.snapshotTakenTimestamp = block.timestamp;
        // roll over total amounts
        snapshots[currentSnapId] = SnapshotInfo({
            tier1Total: snap.tier1Total,
            tier2Total: snap.tier2Total,
            snapshotTakenTimestamp: 0
        });

        emit SnapshotTaken(currentSnap, block.timestamp);
    }

    /**
     * @notice Set the new Tax swap threshold
     * @param _taxThreshold New tax threshold
     */
    function setTaxThreshold(uint _taxThreshold) external onlyOwner {
        require(_taxThreshold > 0, "FUXION__InvalidThreshold");

        if (_taxThreshold > MAX_SUPPLY) revert FUXION__InvalidThreshold();
        taxThreshold = _taxThreshold;
    }

    function setMaxWallet(uint _maxWallet) external onlyOwner {
        require(_maxWallet > 0, "FUXION__InvalidMaxWallet");
        if (_maxWallet < MAX_SUPPLY / 100_00) revert FUXION__InvalidMaxWallet();
        maxWallet = _maxWallet;
        emit EditMaxWalletAmount(_maxWallet);
    }

    /**
     * @notice set trading as enabled
     */
    function enableTrading() external onlyOwner {
        tradingEnabled = true;
        emit TradingEnabled(true);
    }

    /**
     * @notice set trading as disabled
     */
    function pauseTrading() external onlyOwner {
        tradingEnabled = false;
        emit TradingEnabled(false);
    }

    /**
     * @notice Set the Snapshotter status to an address. These addresses can take snapshots at any time
     * @param _snapshotter Address to set snapshotter status
     * @param _isSnapshotter True to set as snapshotter, false to remove
     */
    function setSnapshotterAddress(
        address _snapshotter,
        bool _isSnapshotter
    ) external onlyOwner {
        require(_snapshotter != address(0), "FUXION__InvalidAddress");
        require(
            isSnapshotter[_snapshotter] != _isSnapshotter,
            "FUXION__AlreadySet"
        );
        isSnapshotter[_snapshotter] = _isSnapshotter;
        emit SetSnapshotterStatus(_snapshotter, _isSnapshotter);
    }

    /**
     * @notice set the Buy tax to a new value
     * @param _buyTax New buy tax
     * @dev buyTax is a maximimum of 10% so the max acceptable _buyTax is 10
     */
    function setBuyTax(uint _buyTax) external onlyOwner {
        require(_buyTax > 0, "FUXION__InvalidTaxAmount");
        if (_buyTax > 10) revert FUXION__InvalidTaxAmount();
        buyTax = _buyTax;
        emit EditTax(_buyTax, true, false);
    }

    /**
     * @notice set the Sell tax to a new value
     * @param _sellTax New sell tax
     * @dev sellTax is a maximimum of 10% so the max acceptable _sellTax is 10
     */
    function setSellTax(uint _sellTax) external onlyOwner {
        require(_sellTax > 0, "FUXION__InvalidTaxAmount");
        if (_sellTax > 10) revert FUXION__InvalidTaxAmount();
        sellTax = _sellTax;
        emit EditTax(_sellTax, false, true);
    }

    //---------------------------------------------------------------------------------
    // Internal & Private Functions
    //---------------------------------------------------------------------------------

    /**
     * @notice Underlying transfer of tokens used by `transfer` and `transferFrom` in ERC20 which are public
     * @param from Address that holds the funds
     * @param to Address that receives the funds
     * @param amount Amount of funds to send
     */
    function _transfer(
        address from,
        address to,
        uint amount
    ) internal override {
        bool taxExclusion = isExcludedFromTax[from] || isExcludedFromTax[to];

        if (!tradingEnabled && !taxExclusion) {
            revert FUXION__TradingNotEnabled();
        }

        _updateSnapDecrease(from, amount);

        uint currentBalance = balanceOf(address(this));

        if (
            !isSwapping &&
            currentBalance >= taxThreshold &&
            !taxExclusion &&
            !isLpAddress[from] // Cant do this on buys
        ) {
            _swapTokens();
        }

        // Check that sender is free of tax or receiver is free of tax
        if (!taxExclusion) {
            uint tax;
            // if not free of tax, check if is buy or sell
            if (isLpAddress[to]) {
                // IS SELL
                tax = (amount * sellTax) / TAX_PERCENT;
            } else if (isLpAddress[from]) {
                // IS BUY
                tax = (amount * buyTax) / TAX_PERCENT;
            }
            if (tax > 0) {
                super._transfer(from, address(this), tax);
                amount -= tax;
            }
        }

        // check if receiver is free of max wallet
        uint toNEWBalance = balanceOf(to) + amount;
        if (!isExcludedFromMaxWallet[to] && toNEWBalance > maxWallet) {
            revert FUXION__MaxWalletReached(to, toNEWBalance);
        }
        _updateSnapIncrease(to, amount);
        super._transfer(from, to, amount);
    }

    /**
     * @notice Swap any tokens the contract has for ETH and send the ETH directly to the Admin Wallet
     */
    function _swapTokens() private {
        isSwapping = true;
        // Get the current amount of tokens stored in the contract
        uint256 contractTokenBalance = balanceOf(address(this));
        // If the contract has tokens
        if (contractTokenBalance > 0) {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = WETH;
            // Swap all for ETH and send to Admin Wallet
            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                contractTokenBalance,
                0, // Accept any amount of ETH
                path,
                ADMIN_WALLET,
                block.timestamp
            );
        }
        isSwapping = false;
    }

    /**
     * @notice Decrease a wallet's current snapshot balance
     * @param user Wallet to update snapshot info
     * @param amount the difference amount in snapshot
     */
    function _updateSnapDecrease(address user, uint amount) private {
        uint currentSnap = currentSnapId;
        uint currentSnapBalance = snapshotInfo[user][currentSnap];
        uint currentBalance = balanceOf(user);
        uint newBalance = currentBalance - amount;
        SnapshotInfo storage snap = snapshots[currentSnap];
        lastSnapshotId[user] = currentSnap;
        // If user is exempt from dividends, we need to set the snapshot value to 0
        if (isDividendExempt[user]) {
            delete snapshotInfo[user][currentSnap];
            // if user is now exempt but used to have funds, we need to decrease the total
            if (currentSnapBalance > 0) {
                if (currentSnapBalance >= TIER_1)
                    snap.tier1Total -= currentSnapBalance;
                else if (currentSnapBalance >= TIER_2)
                    snap.tier2Total -= currentSnapBalance;
            }
        } else {
            snapshotInfo[user][currentSnap] = newBalance;

            /// FROM TIER 1
            if (currentBalance >= TIER_1) {
                // Decrease TIER 1
                snap.tier1Total -= currentBalance;
                // TO SAME TIER
                if (newBalance >= TIER_1) snap.tier1Total += newBalance;
                // TO TIER 2
                if (newBalance < TIER_1 && newBalance >= TIER_2)
                    snap.tier2Total += newBalance;
                // if to NO tier, just decrease is fine
            }
            // FROM TIER 2
            else if (currentBalance >= TIER_2) {
                snap.tier2Total -= currentBalance;
                // TO SAME TIER
                if (newBalance >= TIER_2) snap.tier2Total += newBalance;
                // TO NO TIER JUST DO NOTHING
            }
        }
    }

    /**
     * @notice Increase a wallet's current snapshot balance
     * @param user Wallet to update snapshot info
     * @param amount Difference amount
     */
    function _updateSnapIncrease(address user, uint amount) private {
        uint currentSnap = currentSnapId;
        uint currentBalance = balanceOf(user);
        uint currentSnapBalance = snapshotInfo[user][currentSnap];
        SnapshotInfo storage snap = snapshots[currentSnap];
        lastSnapshotId[user] = currentSnap;
        // If user is exempt from dividends, we need to set the snapshot value to 0
        if (isDividendExempt[user]) {
            delete snapshotInfo[user][currentSnap];
            // if user is now exempt but used to have funds, we need to decrease the total
            if (currentSnapBalance > 0) {
                if (currentSnapBalance >= TIER_1)
                    snap.tier1Total -= currentSnapBalance;
                else if (currentSnapBalance >= TIER_2)
                    snap.tier2Total -= currentSnapBalance;
            }
        } else {
            snapshotInfo[user][currentSnap] = currentBalance + amount;
            uint newBalance = currentBalance + amount;
            // Check if there is any tier advancement

            // FROM NO TIER
            if (currentBalance < TIER_2) {
                // TO TIER 1
                if (newBalance >= TIER_1)
                    snap.tier1Total += newBalance;
                    // TO TIER 2
                else if (newBalance >= TIER_2) snap.tier2Total += newBalance;
                // TO NO TIER DO NOTHING
            }
            // FROM TIER 2
            else if (currentBalance >= TIER_2 && currentBalance < TIER_1) {
                // TO TIER 1
                if (newBalance >= TIER_1)
                    snap.tier1Total += newBalance;

                    // TO SAME TIER
                else if (newBalance >= TIER_2) snap.tier2Total += newBalance;
                snap.tier2Total -= currentBalance;
            }
            // FROM TIER 1
            else if (currentBalance >= TIER_1) {
                // Stay in same tier
                snap.tier1Total += newBalance;
                snap.tier1Total -= currentBalance;
            }
        }
    }

    //---------------------------------------------------------------------------------
    // External & Public VIEW | PURE Functions
    //---------------------------------------------------------------------------------

    function getUserSnapshotAt(
        address user,
        uint snapId
    ) external view returns (uint) {
        // If snapshot ID hasn't been taken, return 0
        if (snapId > currentSnapId) return 0;
        uint lastUserSnap = lastSnapshotId[user];
        // if last snapshot is before the requested snapshot, return current balance of the user
        if (snapId > lastUserSnap) return balanceOf(user);
        // else return the snapshot balance
        return snapshotInfo[user][snapId];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"address","name":"_recoveryAdmin","type":"address"},{"internalType":"address","name":"lossless_","type":"address"},{"internalType":"uint256","name":"timeLockPeriod_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FUXION__InvalidMaxWallet","type":"error"},{"inputs":[],"name":"FUXION__InvalidTaxAmount","type":"error"},{"inputs":[],"name":"FUXION__InvalidThreshold","type":"error"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"triedBalance","type":"uint256"}],"name":"FUXION__MaxWalletReached","type":"error"},{"inputs":[],"name":"FUXION__NotAllowed","type":"error"},{"inputs":[],"name":"FUXION__TradingNotEnabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_users","type":"address[]"},{"indexed":false,"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"BlacklistWalletsUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"EditMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTax","type":"uint256"},{"indexed":false,"internalType":"bool","name":"buyTax","type":"bool"},{"indexed":false,"internalType":"bool","name":"sellTax","type":"bool"}],"name":"EditTax","type":"event"},{"anonymous":false,"inputs":[],"name":"LosslessOff","type":"event"},{"anonymous":false,"inputs":[],"name":"LosslessOn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_turnOffDate","type":"uint256"}],"name":"LosslessTurnOffProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newAdmin","type":"address"}],"name":"NewRecoveryAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_candidate","type":"address"}],"name":"NewRecoveryAdminProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_lpAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isLpAddress","type":"bool"}],"name":"SetAddressAsLp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_snapshotter","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetSnapshotterStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"snapId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SnapshotTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_blacklister","type":"address"}],"name":"UpdateBlacklister","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"WalletExcludedFromMax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"WalletExcludedFromTax","type":"event"},{"inputs":[],"name":"ADMIN_WALLET","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"key","type":"bytes"}],"name":"acceptRecoveryAdminOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSnapId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeLosslessTurnOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeLosslessTurnOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"snapId","type":"uint256"}],"name":"getUserSnapshotAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"dividendExcepmtionStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"excludedStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isExcludedFromTax","outputs":[{"internalType":"bool","name":"excludedStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLosslessOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress","type":"address"}],"name":"isLpAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"isSnapshotter","outputs":[{"internalType":"bool","name":"isExecutor","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lastSnapshotId","outputs":[{"internalType":"uint256","name":"lastSnapshotId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lossless","outputs":[{"internalType":"contract ILssController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"losslessTurnOffTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposeLosslessTurnOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoveryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludeFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setLosslessAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpAddress","type":"address"},{"internalType":"bool","name":"_isLpAddress","type":"bool"}],"name":"setLpAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_snapshotter","type":"address"},{"internalType":"bool","name":"_isSnapshotter","type":"bool"}],"name":"setSnapshotterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxThreshold","type":"uint256"}],"name":"setTaxThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"snapId","type":"uint256"}],"name":"snapshotInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapId","type":"uint256"}],"name":"snapshots","outputs":[{"internalType":"uint256","name":"tier1Total","type":"uint256"},{"internalType":"uint256","name":"tier2Total","type":"uint256"},{"internalType":"uint256","name":"snapshotTakenTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"taxThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"from","type":"address[]"}],"name":"transferOutBlacklistedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"candidate","type":"address"},{"internalType":"bytes32","name":"keyHash","type":"bytes32"}],"name":"transferRecoveryAdminOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526001600c5f6101000a81548160ff0219169083151502179055505f6017556005601a556005601b555f601c5f6101000a81548160ff0219169083151502179055505f601c60016101000a81548160ff0219169083151502179055503480156200006b575f80fd5b5060405162006c7738038062006c77833981810160405281019062000091919062000fc5565b6040518060400160405280600b81526020017f467578696f6e204c6162730000000000000000000000000000000000000000008152506040518060400160405280600481526020017f465558450000000000000000000000000000000000000000000000000000000081525086858486620001216200011562000b9f60201b60201c565b62000ba660201b60201c565b8560049081620001329190620012a4565b508460059081620001449190620012a4565b508360095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60088190555081600a819055505f600b8190555080600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620002d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c990620013e6565b60405180910390fd5b620002e38462000ba660201b60201c565b62000300846a0422ca8b0a00a42500000062000cd860201b60201c565b6103e8600a6a0422ca8b0a00a4250000006200031d919062001433565b620003299190620014aa565b6019819055506127106a0422ca8b0a00a4250000006200034a9190620014aa565b601881905550737a250d5630b4cf539739df2c5dacb4c659f2488d60155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200040f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004359190620014e1565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004d3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004f99190620014e1565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396306080516040518363ffffffff1660e01b81526004016200053792919062001522565b6020604051808303815f875af115801562000554573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200057a9190620014e1565b60165f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160135f60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f6200069962000e1860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f620007e962000e1860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f6200091862000e1860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f62000abd62000e1860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505062000b943060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62000e3f60201b60201c565b5050505050620016b5565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c0e90620015c1565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d40906200162f565b60405180910390fd5b8060035f82825462000d5c91906200164f565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000e0c91906200169a565b60405180910390a35050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000f1b91906200169a565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000f578262000f2c565b9050919050565b62000f698162000f4b565b811462000f74575f80fd5b50565b5f8151905062000f878162000f5e565b92915050565b5f819050919050565b62000fa18162000f8d565b811462000fac575f80fd5b50565b5f8151905062000fbf8162000f96565b92915050565b5f805f805f60a0868803121562000fe15762000fe062000f28565b5b5f62000ff08882890162000f77565b9550506020620010038882890162000f77565b9450506040620010168882890162000f77565b9350506060620010298882890162000f77565b92505060806200103c8882890162000faf565b9150509295509295909350565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620010c557607f821691505b602082108103620010db57620010da62001080565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200113f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001102565b6200114b868362001102565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200118c62001186620011808462000f8d565b62001163565b62000f8d565b9050919050565b5f819050919050565b620011a7836200116c565b620011bf620011b68262001193565b8484546200110e565b825550505050565b5f90565b620011d5620011c7565b620011e28184846200119c565b505050565b5b818110156200120957620011fd5f82620011cb565b600181019050620011e8565b5050565b601f82111562001258576200122281620010e1565b6200122d84620010f3565b810160208510156200123d578190505b620012556200124c85620010f3565b830182620011e7565b50505b505050565b5f82821c905092915050565b5f6200127a5f19846008026200125d565b1980831691505092915050565b5f62001294838362001269565b9150826002028217905092915050565b620012af8262001049565b67ffffffffffffffff811115620012cb57620012ca62001053565b5b620012d78254620010ad565b620012e48282856200120d565b5f60209050601f8311600181146200131a575f841562001305578287015190505b62001311858262001287565b86555062001380565b601f1984166200132a86620010e1565b5f5b8281101562001353578489015182556001820191506020850194506020810190506200132c565b868310156200137357848901516200136f601f89168262001269565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f465558494f4e5f5f496e76616c696441646472657373000000000000000000005f82015250565b5f620013ce60168362001388565b9150620013db8262001398565b602082019050919050565b5f6020820190508181035f830152620013ff81620013c0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200143f8262000f8d565b91506200144c8362000f8d565b92508282026200145c8162000f8d565b9150828204841483151762001476576200147562001406565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620014b68262000f8d565b9150620014c38362000f8d565b925082620014d657620014d56200147d565b5b828204905092915050565b5f60208284031215620014f957620014f862000f28565b5b5f620015088482850162000f77565b91505092915050565b6200151c8162000f4b565b82525050565b5f604082019050620015375f83018562001511565b62001546602083018462001511565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f620015a960268362001388565b9150620015b6826200154d565b604082019050919050565b5f6020820190508181035f830152620015da816200159b565b9050919050565b7f4c45524332303a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f6200161760208362001388565b91506200162482620015e1565b602082019050919050565b5f6020820190508181035f830152620016488162001609565b9050919050565b5f6200165b8262000f8d565b9150620016688362000f8d565b925082820190508082111562001683576200168262001406565b5b92915050565b620016948162000f8d565b82525050565b5f602082019050620016af5f83018462001689565b92915050565b60805160a051615599620016de5f395f8181612aa4015261396301525f6138b401526155995ff3fe608060405234801561000f575f80fd5b5060043610610381575f3560e01c8063715018a6116101dc578063b3d3d37e1161010d578063d6565a2d116100ab578063f2fde38b1161007a578063f2fde38b14610a39578063f851a44014610a55578063f887ea4014610a73578063f8b45b0514610a9157610381565b8063d6565a2d146109b1578063d6e242b8146109e3578063dc1052e2146109ed578063dd62ed3e14610a0957610381565b8063cb4ca631116100e7578063cb4ca63114610915578063cc1776d314610945578063ccfa214f14610963578063cd9a0d461461098157610381565b8063b3d3d37e146108d1578063b5c22877146108db578063c2cd4a07146108f757610381565b8063936af9111161017a578063a9059cbb11610154578063a9059cbb14610837578063b16b04a714610867578063b20161db14610897578063b38fe957146108c757610381565b8063936af911146107cd57806395d89b41146107e9578063a457c2d71461080757610381565b80638a8c523c116101b65780638a8c523c1461076d5780638cd09d50146107775780638da5cb5b1461079357806393310ffe146107b157610381565b8063715018a61461072757806377d1440d1461073157806385af30c51461074f57610381565b806339509351116102b65780635d0044ca1161025457806362771d331161022e57806362771d331461068d5780636dd3d39f146106a95780636e9960c3146106d957806370a08231146106f757610381565b80635d0044ca146106355780635f6529a31461065157806361086b001461066f57610381565b80634355855a116102905780634355855a146105bf5780634ada218b146105ef5780634f7041a51461060d5780635b8a194a1461062b57610381565b8063395093511461055757806339fb86c51461058757806341220104146105a357610381565b806318160ddd116103235780632ecaf675116102fd5780632ecaf675146104cd5780632f7c5980146104eb578063313ce5671461051b57806334f6ebf51461053957610381565b806318160ddd1461046357806323b872dd146104815780632baa3c9e146104b157610381565b80630da7caa31161035f5780630da7caa3146103ef5780630ee0a1131461040b5780631031e36e1461042957806315c9aca11461043357610381565b806306fdde031461038557806307a212be146103a3578063095ea7b3146103bf575b5f80fd5b61038d610aaf565b60405161039a9190614001565b60405180910390f35b6103bd60048036038101906103b89190614065565b610b3f565b005b6103d960048036038101906103d491906140ea565b610bd8565b6040516103e69190614142565b60405180910390f35b61040960048036038101906104049190614185565b610ca1565b005b610413610e4c565b60405161042091906141d2565b60405180910390f35b610431610e52565b005b61044d600480360381019061044891906141eb565b610ead565b60405161045a9190614142565b60405180910390f35b61046b610eca565b60405161047891906141d2565b60405180910390f35b61049b60048036038101906104969190614216565b610ed3565b6040516104a89190614142565b60405180910390f35b6104cb60048036038101906104c691906141eb565b61107e565b005b6104d5611229565b6040516104e291906141d2565b60405180910390f35b610505600480360381019061050091906141eb565b61122f565b6040516105129190614142565b60405180910390f35b61052361124c565b6040516105309190614281565b60405180910390f35b610541611254565b60405161054e91906142f5565b60405180910390f35b610571600480360381019061056c91906140ea565b61127a565b60405161057e9190614142565b60405180910390f35b6105a1600480360381019061059c9190614185565b6113cd565b005b6105bd60048036038101906105b89190614185565b611578565b005b6105d960048036038101906105d491906141eb565b611723565b6040516105e69190614142565b60405180910390f35b6105f7611740565b6040516106049190614142565b60405180910390f35b610615611753565b60405161062291906141d2565b60405180910390f35b610633611759565b005b61064f600480360381019061064a9190614065565b61188d565b005b61065961196a565b604051610666919061431d565b60405180910390f35b61067761198f565b60405161068491906141d2565b60405180910390f35b6106a760048036038101906106a29190614185565b611995565b005b6106c360048036038101906106be91906141eb565b611c23565b6040516106d09190614142565b60405180910390f35b6106e1611c40565b6040516106ee919061431d565b60405180910390f35b610711600480360381019061070c91906141eb565b611c68565b60405161071e91906141d2565b60405180910390f35b61072f611cae565b005b610739611cc1565b60405161074691906141d2565b60405180910390f35b610757611cc7565b604051610764919061431d565b60405180910390f35b610775611cec565b005b610791600480360381019061078c9190614065565b611d49565b005b61079b611e14565b6040516107a8919061431d565b60405180910390f35b6107cb60048036038101906107c69190614369565b611e3b565b005b6107e760048036038101906107e29190614408565b611f5f565b005b6107f161222a565b6040516107fe9190614001565b60405180910390f35b610821600480360381019061081c91906140ea565b6122ba565b60405161082e9190614142565b60405180910390f35b610851600480360381019061084c91906140ea565b612455565b60405161085e9190614142565b60405180910390f35b610881600480360381019061087c91906140ea565b61251e565b60405161088e91906141d2565b60405180910390f35b6108b160048036038101906108ac91906140ea565b61253e565b6040516108be91906141d2565b60405180910390f35b6108cf612602565b005b6108d961276f565b005b6108f560048036038101906108f0919061457b565b6128b9565b005b6108ff612aa2565b60405161090c91906145e2565b60405180910390f35b61092f600480360381019061092a91906141eb565b612ac6565b60405161093c9190614142565b60405180910390f35b61094d612ae3565b60405161095a91906141d2565b60405180910390f35b61096b612ae9565b6040516109789190614142565b60405180910390f35b61099b600480360381019061099691906141eb565b612afb565b6040516109a891906141d2565b60405180910390f35b6109cb60048036038101906109c69190614065565b612b10565b6040516109da939291906145fb565b60405180910390f35b6109eb612b36565b005b610a076004803603810190610a029190614065565b612cad565b005b610a236004803603810190610a1e9190614630565b612d78565b604051610a3091906141d2565b60405180910390f35b610a536004803603810190610a4e91906141eb565b612dfa565b005b610a5d612e7c565b604051610a6a919061431d565b60405180910390f35b610a7b612ea1565b604051610a88919061468e565b60405180910390f35b610a99612ec6565b604051610aa691906141d2565b60405180910390f35b606060048054610abe906146d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610aea906146d4565b8015610b355780601f10610b0c57610100808354040283529160200191610b35565b820191905f5260205f20905b815481529060010190602001808311610b1857829003601f168201915b5050505050905090565b610b47612ecc565b5f8111610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b809061474e565b60405180910390fd5b6a0422ca8b0a00a425000000811115610bce576040517f39922d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060188190555050565b5f8282600c5f9054906101000a900460ff1615610c8357600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166347abf3be610c35612f4a565b84846040518463ffffffff1660e01b8152600401610c559392919061476c565b5f604051808303815f87803b158015610c6c575f80fd5b505af1158015610c7e573d5f803e3d5ffd5b505050505b610c95610c8e612f4a565b8686612f51565b60019250505092915050565b610ca9612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906147eb565b60405180910390fd5b80151560145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90614853565b60405180910390fd5b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f0d148a5c1704d9c0c8a1669e9b7ae29b729fa7fd357765342510c19a81a985d982604051610e409190614142565b60405180910390a25050565b60175481565b610e5a612ecc565b5f601c60016101000a81548160ff0219169083151502179055507fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a5f604051610ea39190614142565b60405180910390a1565b6014602052805f5260405f205f915054906101000a900460ff1681565b5f600354905090565b5f838383600c5f9054906101000a900460ff1615610f8157600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663379f5c69610f31612f4a565b8585856040518563ffffffff1660e01b8152600401610f539493929190614871565b5f604051808303815f87803b158015610f6a575f80fd5b505af1158015610f7c573d5f803e3d5ffd5b505050505b5f60025f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610fc8612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905085811015611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90614924565b60405180910390fd5b611052888888613038565b61106f8861105e612f4a565b888461106a919061496f565b612f51565b60019450505050509392505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166110be612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906149ec565b60405180910390fd5b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90614a54565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60405160405180910390a28060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f6012905090565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8282600c5f9054906101000a900460ff161561132557600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf5961bb6112d7612f4a565b84846040518463ffffffff1660e01b81526004016112f79392919061476c565b5f604051808303815f87803b15801561130e575f80fd5b505af1158015611320573d5f803e3d5ffd5b505050505b6113c1611330612f4a565b868660025f61133d612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546113bc9190614a72565b612f51565b60019250505092915050565b6113d5612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143a906147eb565b60405180910390fd5b80151560105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614aef565b60405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f2633ad3ef534c4bddda523fae274ccb4e47bb324c2eca411a9377d01529e2ffe8260405161156c9190614142565b60405180910390a25050565b611580612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906147eb565b60405180910390fd5b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490614aef565b60405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff40f85f17edc8eb36b286100bde23545ec4fac647f64dd7214a897af944fcb30826040516117179190614142565b60405180910390a25050565b6012602052805f5260405f205f915054906101000a900460ff1681565b601c60019054906101000a900460ff1681565b601a5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611799612f4a565b73ffffffffffffffffffffffffffffffffffffffff16146117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e6906149ec565b60405180910390fd5b600c5f9054906101000a900460ff161561183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590614b57565b60405180910390fd5b5f600b819055506001600c5f6101000a81548160ff0219169083151502179055507f1ba3b66404043da8297d0b876fa6464f2cb127edfc6626308046d4503028322b60405160405180910390a1565b611895612ecc565b5f81116118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614bbf565b60405180910390fd5b6127106a0422ca8b0a00a4250000006118f09190614c0a565b811015611929576040517fbb8cf97300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806019819055507fcb6a4e25e6070c228470cc0df60e64d9c48337dd39b32c47376eef2b366454b78160405161195f91906141d2565b60405180910390a150565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b61199d612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906147eb565b60405180910390fd5b80151560135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614853565b60405180910390fd5b80151560125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614c84565b60405180910390fd5b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f242e47ed17a9f432e4242bab4c34941ac33603481cb8319ed8dd8df34ae0051182604051611c179190614142565b60405180910390a25050565b6011602052805f5260405f205f915054906101000a900460ff1681565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611cb6612ecc565b611cbf5f61339e565b565b60185481565b60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cf4612ecc565b6001601c60016101000a81548160ff0219169083151502179055507fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a6001604051611d3f9190614142565b60405180910390a1565b611d51612ecc565b5f8111611d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8a90614cec565b60405180910390fd5b600a811115611dce576040517f2aad382000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601b819055507f78cd946ea54440e5e0457ca142c8592fd7a7d34388c8a82328c57e39cc67f04d815f6001604051611e0993929190614d0a565b60405180910390a150565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e7b612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec8906149ec565b60405180910390fd5b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806008819055508173ffffffffffffffffffffffffffffffffffffffff167f6c591da8da2f6e69746d7d9ae61c27ee29fbe303798141b4942ae2aef54274b160405160405180910390a25050565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fa0612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614d89565b60405180910390fd5b600c5f9054906101000a900460ff16612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614df1565b60405180910390fd5b5f8282905090505f805b828110156121ae575f85858381811061206a57612069614e0f565b5b905060200201602081019061207f91906141eb565b90505f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080846121109190614a72565b9350600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161219191906141d2565b60405180910390a3505080806121a690614e3c565b91505061204e565b508060015f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461221d9190614a72565b9250508190555050505050565b606060058054612239906146d4565b80601f0160208091040260200160405190810160405280929190818152602001828054612265906146d4565b80156122b05780601f10612287576101008083540402835291602001916122b0565b820191905f5260205f20905b81548152906001019060200180831161229357829003601f168201915b5050505050905090565b5f8282600c5f9054906101000a900460ff161561236557600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663568c75a9612317612f4a565b84846040518463ffffffff1660e01b81526004016123379392919061476c565b5f604051808303815f87803b15801561234e575f80fd5b505af1158015612360573d5f803e3d5ffd5b505050505b5f60025f612371612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508481101561242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290614ef3565b60405180910390fd5b612448612436612f4a565b878784612443919061496f565b612f51565b6001935050505092915050565b5f8282600c5f9054906101000a900460ff161561250057600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ffb811f6124b2612f4a565b84846040518463ffffffff1660e01b81526004016124d29392919061476c565b5f604051808303815f87803b1580156124e9575f80fd5b505af11580156124fb573d5f803e3d5ffd5b505050505b61251261250b612f4a565b8686613038565b60019250505092915050565b600d602052815f5260405f20602052805f5260405f205f91509150505481565b5f601754821115612551575f90506125fc565b5f600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050808311156125ab576125a384611c68565b9150506125fc565b600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20549150505b92915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612642612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f906149ec565b60405180910390fd5b5f600b54036126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d390614f5b565b60405180910390fd5b42600b541115612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890614fc3565b60405180910390fd5b5f600c5f6101000a81548160ff0219169083151502179055505f600b819055507f3eb72350c9c7928d31e9ab450bfff2c159434aa4b82658a7d8eae7f109cb4e7b60405160405180910390a1565b60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166127ef576040517f42df492800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601754905060175f81548092919061280790614e3c565b91905055505f600f5f8381526020019081526020015f2090504281600201819055506040518060600160405280825f01548152602001826001015481526020015f815250600f5f60175481526020019081526020015f205f820151815f01556020820151816001015560408201518160020155905050817f3b5ce8b2d475067181f949f668899c93f26f0b25c5f8712ebca6b4b93d92989d426040516128ad91906141d2565b60405180910390a25050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128f9612f4a565b73ffffffffffffffffffffffffffffffffffffffff161461294f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129469061502b565b60405180910390fd5b60085481805190602001201461299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190615093565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb94bba6936ec7f75ee931dadf6e1a4d66b43d09b6fa0178fb13df9b77fb5841f60405160405180910390a260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010602052805f5260405f205f915054906101000a900460ff1681565b601b5481565b600c5f9054906101000a900460ff1681565b600e602052805f5260405f205f915090505481565b600f602052805f5260405f205f91509050805f0154908060010154908060020154905083565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b76612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc3906149ec565b60405180910390fd5b5f600b5414612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906150fb565b60405180910390fd5b600c5f9054906101000a900460ff16612c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5590615163565b60405180910390fd5b600a5442612c6c9190614a72565b600b819055507f6ca688e6e3ddd707280140b2bf0106afe883689b6c74e68cbd517576dd9c245a600b54604051612ca391906141d2565b60405180910390a1565b612cb5612ecc565b5f8111612cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cee90614cec565b60405180910390fd5b600a811115612d32576040517f2aad382000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601a819055507f78cd946ea54440e5e0457ca142c8592fd7a7d34388c8a82328c57e39cc67f04d8160015f604051612d6d93929190614d0a565b60405180910390a150565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b612e02612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e67906151f1565b60405180910390fd5b612e798161339e565b50565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60195481565b612ed4612f4a565b73ffffffffffffffffffffffffffffffffffffffff16612ef2611e14565b73ffffffffffffffffffffffffffffffffffffffff1614612f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3f90615259565b60405180910390fd5b565b5f33905090565b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161302b91906141d2565b60405180910390a3505050565b5f60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806130d4575060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b9050601c60019054906101000a900460ff161580156130f1575080155b15613128576040517f729cc03d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61313284836134cd565b5f61313c30611c68565b9050601c5f9054906101000a900460ff1615801561315c57506018548110155b8015613166575081155b80156131b9575060135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156131c7576131c66137e9565b5b816132ce575f60135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561323d576064601b548561322c9190615277565b6132369190614c0a565b90506132aa565b60135f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156132a9576064601a548561329c9190615277565b6132a69190614c0a565b90505b5b5f8111156132cc576132bd8630836139ee565b80846132c9919061496f565b93505b505b5f836132d986611c68565b6132e39190614a72565b905060115f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561333d575060195481115b156133815784816040517f1ba623300000000000000000000000000000000000000000000000000000000081526004016133789291906152b8565b60405180910390fd5b61338b8585613beb565b6133968686866139ee565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361340c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613403906151f1565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60175490505f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205490505f61352d85611c68565b90505f848261353c919061496f565b90505f600f5f8681526020019081526020015f20905084600e5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060125f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561369b57600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f205f90555f84111561369657690a968163f0a57b40000084106136695783815f015f82825461365d919061496f565b92505081905550613695565b683635c9adc5dea0000084106136945783816001015f82825461368c919061496f565b925050819055505b5b5b6137e0565b81600d5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f2081905550690a968163f0a57b40000083106137885782815f015f82825461370f919061496f565b92505081905550690a968163f0a57b40000082106137415781815f015f8282546137399190614a72565b925050819055505b690a968163f0a57b400000821080156137635750683635c9adc5dea000008210155b156137835781816001015f82825461377b9190614a72565b925050819055505b6137df565b683635c9adc5dea0000083106137de5782816001015f8282546137ab919061496f565b92505081905550683635c9adc5dea0000082106137dd5781816001015f8282546137d59190614a72565b925050819055505b5b5b5b50505050505050565b6001601c5f6101000a81548160ff0219169083151502179055505f61380d30611c68565b90505f8111156139d2575f600267ffffffffffffffff81111561383357613832614457565b5b6040519080825280602002602001820160405280156138615781602001602082028036833780820191505090505b50905030815f8151811061387857613877614e0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106138e7576138e6614e0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f847f0000000000000000000000000000000000000000000000000000000000000000426040518663ffffffff1660e01b81526004016139a39594939291906153ef565b5f604051808303815f87803b1580156139ba575f80fd5b505af11580156139cc573d5f803e3d5ffd5b50505050505b5f601c5f6101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a53906154b7565b60405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad790615545565b60405180910390fd5b8181613aec919061496f565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613b799190614a72565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bdd91906141d2565b60405180910390a350505050565b5f60175490505f613bfb84611c68565b90505f600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490505f600f5f8581526020019081526020015f20905083600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613daa57600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f90555f821115613da557690a968163f0a57b4000008210613d785781815f015f828254613d6c919061496f565b92505081905550613da4565b683635c9adc5dea000008210613da35781816001015f828254613d9b919061496f565b925050819055505b5b5b613f6f565b8483613db69190614a72565b600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f20819055505f8584613e139190614a72565b9050683635c9adc5dea00000841015613e8657690a968163f0a57b4000008110613e555780825f015f828254613e499190614a72565b92505081905550613e81565b683635c9adc5dea000008110613e805780826001015f828254613e789190614a72565b925050819055505b5b613f6d565b683635c9adc5dea000008410158015613ea85750690a968163f0a57b40000084105b15613f2757690a968163f0a57b4000008110613edc5780825f015f828254613ed09190614a72565b92505081905550613f08565b683635c9adc5dea000008110613f075780826001015f828254613eff9190614a72565b925050819055505b5b83826001015f828254613f1b919061496f565b92505081905550613f6c565b690a968163f0a57b4000008410613f6b5780825f015f828254613f4a9190614a72565b9250508190555083825f015f828254613f63919061496f565b925050819055505b5b5b505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fae578082015181840152602081019050613f93565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613fd382613f77565b613fdd8185613f81565b9350613fed818560208601613f91565b613ff681613fb9565b840191505092915050565b5f6020820190508181035f8301526140198184613fc9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61404481614032565b811461404e575f80fd5b50565b5f8135905061405f8161403b565b92915050565b5f6020828403121561407a5761407961402a565b5b5f61408784828501614051565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140b982614090565b9050919050565b6140c9816140af565b81146140d3575f80fd5b50565b5f813590506140e4816140c0565b92915050565b5f8060408385031215614100576140ff61402a565b5b5f61410d858286016140d6565b925050602061411e85828601614051565b9150509250929050565b5f8115159050919050565b61413c81614128565b82525050565b5f6020820190506141555f830184614133565b92915050565b61416481614128565b811461416e575f80fd5b50565b5f8135905061417f8161415b565b92915050565b5f806040838503121561419b5761419a61402a565b5b5f6141a8858286016140d6565b92505060206141b985828601614171565b9150509250929050565b6141cc81614032565b82525050565b5f6020820190506141e55f8301846141c3565b92915050565b5f60208284031215614200576141ff61402a565b5b5f61420d848285016140d6565b91505092915050565b5f805f6060848603121561422d5761422c61402a565b5b5f61423a868287016140d6565b935050602061424b868287016140d6565b925050604061425c86828701614051565b9150509250925092565b5f60ff82169050919050565b61427b81614266565b82525050565b5f6020820190506142945f830184614272565b92915050565b5f819050919050565b5f6142bd6142b86142b384614090565b61429a565b614090565b9050919050565b5f6142ce826142a3565b9050919050565b5f6142df826142c4565b9050919050565b6142ef816142d5565b82525050565b5f6020820190506143085f8301846142e6565b92915050565b614317816140af565b82525050565b5f6020820190506143305f83018461430e565b92915050565b5f819050919050565b61434881614336565b8114614352575f80fd5b50565b5f813590506143638161433f565b92915050565b5f806040838503121561437f5761437e61402a565b5b5f61438c858286016140d6565b925050602061439d85828601614355565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126143c8576143c76143a7565b5b8235905067ffffffffffffffff8111156143e5576143e46143ab565b5b602083019150836020820283011115614401576144006143af565b5b9250929050565b5f806020838503121561441e5761441d61402a565b5b5f83013567ffffffffffffffff81111561443b5761443a61402e565b5b614447858286016143b3565b92509250509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61448d82613fb9565b810181811067ffffffffffffffff821117156144ac576144ab614457565b5b80604052505050565b5f6144be614021565b90506144ca8282614484565b919050565b5f67ffffffffffffffff8211156144e9576144e8614457565b5b6144f282613fb9565b9050602081019050919050565b828183375f83830152505050565b5f61451f61451a846144cf565b6144b5565b90508281526020810184848401111561453b5761453a614453565b5b6145468482856144ff565b509392505050565b5f82601f830112614562576145616143a7565b5b813561457284826020860161450d565b91505092915050565b5f602082840312156145905761458f61402a565b5b5f82013567ffffffffffffffff8111156145ad576145ac61402e565b5b6145b98482850161454e565b91505092915050565b5f6145cc82614090565b9050919050565b6145dc816145c2565b82525050565b5f6020820190506145f55f8301846145d3565b92915050565b5f60608201905061460e5f8301866141c3565b61461b60208301856141c3565b61462860408301846141c3565b949350505050565b5f80604083850312156146465761464561402a565b5b5f614653858286016140d6565b9250506020614664858286016140d6565b9150509250929050565b5f614678826142c4565b9050919050565b6146888161466e565b82525050565b5f6020820190506146a15f83018461467f565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146eb57607f821691505b6020821081036146fe576146fd6146a7565b5b50919050565b7f465558494f4e5f5f496e76616c69645468726573686f6c6400000000000000005f82015250565b5f614738601883613f81565b915061474382614704565b602082019050919050565b5f6020820190508181035f8301526147658161472c565b9050919050565b5f60608201905061477f5f83018661430e565b61478c602083018561430e565b61479960408301846141c3565b949350505050565b7f465558494f4e5f5f496e76616c696441646472657373000000000000000000005f82015250565b5f6147d5601683613f81565b91506147e0826147a1565b602082019050919050565b5f6020820190508181035f830152614802816147c9565b9050919050565b7f465558494f4e5f5f416c726561647953657400000000000000000000000000005f82015250565b5f61483d601283613f81565b915061484882614809565b602082019050919050565b5f6020820190508181035f83015261486a81614831565b9050919050565b5f6080820190506148845f83018761430e565b614891602083018661430e565b61489e604083018561430e565b6148ab60608301846141c3565b95945050505050565b7f4c45524332303a207472616e7366657220616d6f756e742065786365656473205f8201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b5f61490e602983613f81565b9150614919826148b4565b604082019050919050565b5f6020820190508181035f83015261493b81614902565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61497982614032565b915061498483614032565b925082820390508181111561499c5761499b614942565b5b92915050565b7f4c45524332303a204d757374206265207265636f766572792061646d696e00005f82015250565b5f6149d6601e83613f81565b91506149e1826149a2565b602082019050919050565b5f6020820190508181035f830152614a03816149ca565b9050919050565b7f4c45524332303a2043616e6e6f74207365742073616d652061646472657373005f82015250565b5f614a3e601f83613f81565b9150614a4982614a0a565b602082019050919050565b5f6020820190508181035f830152614a6b81614a32565b9050919050565b5f614a7c82614032565b9150614a8783614032565b9250828201905080821115614a9f57614a9e614942565b5b92915050565b7f465558494f4e5f5f416c72656164794578636c756465640000000000000000005f82015250565b5f614ad9601783613f81565b9150614ae482614aa5565b602082019050919050565b5f6020820190508181035f830152614b0681614acd565b9050919050565b7f4c45524332303a204c6f73736c65737320616c7265616479206f6e00000000005f82015250565b5f614b41601b83613f81565b9150614b4c82614b0d565b602082019050919050565b5f6020820190508181035f830152614b6e81614b35565b9050919050565b7f465558494f4e5f5f496e76616c69644d617857616c6c657400000000000000005f82015250565b5f614ba9601883613f81565b9150614bb482614b75565b602082019050919050565b5f6020820190508181035f830152614bd681614b9d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614c1482614032565b9150614c1f83614032565b925082614c2f57614c2e614bdd565b5b828204905092915050565b7f465558494f4e5f5f496e76616c696400000000000000000000000000000000005f82015250565b5f614c6e600f83613f81565b9150614c7982614c3a565b602082019050919050565b5f6020820190508181035f830152614c9b81614c62565b9050919050565b7f465558494f4e5f5f496e76616c6964546178416d6f756e7400000000000000005f82015250565b5f614cd6601883613f81565b9150614ce182614ca2565b602082019050919050565b5f6020820190508181035f830152614d0381614cca565b9050919050565b5f606082019050614d1d5f8301866141c3565b614d2a6020830185614133565b614d376040830184614133565b949350505050565b7f4c45524332303a204f6e6c79206c6f73736c65737320636f6e747261637400005f82015250565b5f614d73601e83613f81565b9150614d7e82614d3f565b602082019050919050565b5f6020820190508181035f830152614da081614d67565b9050919050565b7f4c45524332303a204c6f73736c657373206973206f66660000000000000000005f82015250565b5f614ddb601783613f81565b9150614de682614da7565b602082019050919050565b5f6020820190508181035f830152614e0881614dcf565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614e4682614032565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e7857614e77614942565b5b600182019050919050565b7f4c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f5f8201527f77207a65726f0000000000000000000000000000000000000000000000000000602082015250565b5f614edd602683613f81565b9150614ee882614e83565b604082019050919050565b5f6020820190508181035f830152614f0a81614ed1565b9050919050565b7f4c45524332303a205475726e4f6666206e6f742070726f706f736564000000005f82015250565b5f614f45601c83613f81565b9150614f5082614f11565b602082019050919050565b5f6020820190508181035f830152614f7281614f39565b9050919050565b7f4c45524332303a2054696d65206c6f636b20696e2070726f67726573730000005f82015250565b5f614fad601d83613f81565b9150614fb882614f79565b602082019050919050565b5f6020820190508181035f830152614fda81614fa1565b9050919050565b7f4c45524332303a204d7573742062652063616e646974617465000000000000005f82015250565b5f615015601983613f81565b915061502082614fe1565b602082019050919050565b5f6020820190508181035f83015261504281615009565b9050919050565b7f4c45524332303a20496e76616c6964206b6579000000000000000000000000005f82015250565b5f61507d601383613f81565b915061508882615049565b602082019050919050565b5f6020820190508181035f8301526150aa81615071565b9050919050565b7f4c45524332303a205475726e4f666620616c72656164792070726f706f7365645f82015250565b5f6150e5602083613f81565b91506150f0826150b1565b602082019050919050565b5f6020820190508181035f830152615112816150d9565b9050919050565b7f4c45524332303a204c6f73736c65737320616c7265616479206f6666000000005f82015250565b5f61514d601c83613f81565b915061515882615119565b602082019050919050565b5f6020820190508181035f83015261517a81615141565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6151db602683613f81565b91506151e682615181565b604082019050919050565b5f6020820190508181035f830152615208816151cf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f615243602083613f81565b915061524e8261520f565b602082019050919050565b5f6020820190508181035f83015261527081615237565b9050919050565b5f61528182614032565b915061528c83614032565b925082820261529a81614032565b915082820484148315176152b1576152b0614942565b5b5092915050565b5f6040820190506152cb5f83018561430e565b6152d860208301846141c3565b9392505050565b5f819050919050565b5f6153026152fd6152f8846152df565b61429a565b614032565b9050919050565b615312816152e8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61534a816140af565b82525050565b5f61535b8383615341565b60208301905092915050565b5f602082019050919050565b5f61537d82615318565b6153878185615322565b935061539283615332565b805f5b838110156153c25781516153a98882615350565b97506153b483615367565b925050600181019050615395565b5085935050505092915050565b5f6153d9826142c4565b9050919050565b6153e9816153cf565b82525050565b5f60a0820190506154025f8301886141c3565b61540f6020830187615309565b81810360408301526154218186615373565b905061543060608301856153e0565b61543d60808301846141c3565b9695505050505050565b7f4c45524332303a207472616e736665722066726f6d20746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6154a1602683613f81565b91506154ac82615447565b604082019050919050565b5f6020820190508181035f8301526154ce81615495565b9050919050565b7f4c45524332303a207472616e7366657220616d6f756e742065786365656473205f8201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b5f61552f602783613f81565b915061553a826154d5565b604082019050919050565b5f6020820190508181035f83015261555c81615523565b905091905056fea2646970667358221220416b2d3ee07bbd75200b7a187eb286a4bbbe9f27e7fde39157299261ca31daf764736f6c634300081500330000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f0000000000000000000000001a4232444bbdca5e4e37e125e4b17f1ad037c056000000000000000000000000f6af39db4887c8f3671ec11c5bab428700626a41000000000000000000000000e91d7cebce484070fc70777cb04f7e2efae31db40000000000000000000000000000000000000000000000000000000000015180

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610381575f3560e01c8063715018a6116101dc578063b3d3d37e1161010d578063d6565a2d116100ab578063f2fde38b1161007a578063f2fde38b14610a39578063f851a44014610a55578063f887ea4014610a73578063f8b45b0514610a9157610381565b8063d6565a2d146109b1578063d6e242b8146109e3578063dc1052e2146109ed578063dd62ed3e14610a0957610381565b8063cb4ca631116100e7578063cb4ca63114610915578063cc1776d314610945578063ccfa214f14610963578063cd9a0d461461098157610381565b8063b3d3d37e146108d1578063b5c22877146108db578063c2cd4a07146108f757610381565b8063936af9111161017a578063a9059cbb11610154578063a9059cbb14610837578063b16b04a714610867578063b20161db14610897578063b38fe957146108c757610381565b8063936af911146107cd57806395d89b41146107e9578063a457c2d71461080757610381565b80638a8c523c116101b65780638a8c523c1461076d5780638cd09d50146107775780638da5cb5b1461079357806393310ffe146107b157610381565b8063715018a61461072757806377d1440d1461073157806385af30c51461074f57610381565b806339509351116102b65780635d0044ca1161025457806362771d331161022e57806362771d331461068d5780636dd3d39f146106a95780636e9960c3146106d957806370a08231146106f757610381565b80635d0044ca146106355780635f6529a31461065157806361086b001461066f57610381565b80634355855a116102905780634355855a146105bf5780634ada218b146105ef5780634f7041a51461060d5780635b8a194a1461062b57610381565b8063395093511461055757806339fb86c51461058757806341220104146105a357610381565b806318160ddd116103235780632ecaf675116102fd5780632ecaf675146104cd5780632f7c5980146104eb578063313ce5671461051b57806334f6ebf51461053957610381565b806318160ddd1461046357806323b872dd146104815780632baa3c9e146104b157610381565b80630da7caa31161035f5780630da7caa3146103ef5780630ee0a1131461040b5780631031e36e1461042957806315c9aca11461043357610381565b806306fdde031461038557806307a212be146103a3578063095ea7b3146103bf575b5f80fd5b61038d610aaf565b60405161039a9190614001565b60405180910390f35b6103bd60048036038101906103b89190614065565b610b3f565b005b6103d960048036038101906103d491906140ea565b610bd8565b6040516103e69190614142565b60405180910390f35b61040960048036038101906104049190614185565b610ca1565b005b610413610e4c565b60405161042091906141d2565b60405180910390f35b610431610e52565b005b61044d600480360381019061044891906141eb565b610ead565b60405161045a9190614142565b60405180910390f35b61046b610eca565b60405161047891906141d2565b60405180910390f35b61049b60048036038101906104969190614216565b610ed3565b6040516104a89190614142565b60405180910390f35b6104cb60048036038101906104c691906141eb565b61107e565b005b6104d5611229565b6040516104e291906141d2565b60405180910390f35b610505600480360381019061050091906141eb565b61122f565b6040516105129190614142565b60405180910390f35b61052361124c565b6040516105309190614281565b60405180910390f35b610541611254565b60405161054e91906142f5565b60405180910390f35b610571600480360381019061056c91906140ea565b61127a565b60405161057e9190614142565b60405180910390f35b6105a1600480360381019061059c9190614185565b6113cd565b005b6105bd60048036038101906105b89190614185565b611578565b005b6105d960048036038101906105d491906141eb565b611723565b6040516105e69190614142565b60405180910390f35b6105f7611740565b6040516106049190614142565b60405180910390f35b610615611753565b60405161062291906141d2565b60405180910390f35b610633611759565b005b61064f600480360381019061064a9190614065565b61188d565b005b61065961196a565b604051610666919061431d565b60405180910390f35b61067761198f565b60405161068491906141d2565b60405180910390f35b6106a760048036038101906106a29190614185565b611995565b005b6106c360048036038101906106be91906141eb565b611c23565b6040516106d09190614142565b60405180910390f35b6106e1611c40565b6040516106ee919061431d565b60405180910390f35b610711600480360381019061070c91906141eb565b611c68565b60405161071e91906141d2565b60405180910390f35b61072f611cae565b005b610739611cc1565b60405161074691906141d2565b60405180910390f35b610757611cc7565b604051610764919061431d565b60405180910390f35b610775611cec565b005b610791600480360381019061078c9190614065565b611d49565b005b61079b611e14565b6040516107a8919061431d565b60405180910390f35b6107cb60048036038101906107c69190614369565b611e3b565b005b6107e760048036038101906107e29190614408565b611f5f565b005b6107f161222a565b6040516107fe9190614001565b60405180910390f35b610821600480360381019061081c91906140ea565b6122ba565b60405161082e9190614142565b60405180910390f35b610851600480360381019061084c91906140ea565b612455565b60405161085e9190614142565b60405180910390f35b610881600480360381019061087c91906140ea565b61251e565b60405161088e91906141d2565b60405180910390f35b6108b160048036038101906108ac91906140ea565b61253e565b6040516108be91906141d2565b60405180910390f35b6108cf612602565b005b6108d961276f565b005b6108f560048036038101906108f0919061457b565b6128b9565b005b6108ff612aa2565b60405161090c91906145e2565b60405180910390f35b61092f600480360381019061092a91906141eb565b612ac6565b60405161093c9190614142565b60405180910390f35b61094d612ae3565b60405161095a91906141d2565b60405180910390f35b61096b612ae9565b6040516109789190614142565b60405180910390f35b61099b600480360381019061099691906141eb565b612afb565b6040516109a891906141d2565b60405180910390f35b6109cb60048036038101906109c69190614065565b612b10565b6040516109da939291906145fb565b60405180910390f35b6109eb612b36565b005b610a076004803603810190610a029190614065565b612cad565b005b610a236004803603810190610a1e9190614630565b612d78565b604051610a3091906141d2565b60405180910390f35b610a536004803603810190610a4e91906141eb565b612dfa565b005b610a5d612e7c565b604051610a6a919061431d565b60405180910390f35b610a7b612ea1565b604051610a88919061468e565b60405180910390f35b610a99612ec6565b604051610aa691906141d2565b60405180910390f35b606060048054610abe906146d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610aea906146d4565b8015610b355780601f10610b0c57610100808354040283529160200191610b35565b820191905f5260205f20905b815481529060010190602001808311610b1857829003601f168201915b5050505050905090565b610b47612ecc565b5f8111610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b809061474e565b60405180910390fd5b6a0422ca8b0a00a425000000811115610bce576040517f39922d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060188190555050565b5f8282600c5f9054906101000a900460ff1615610c8357600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166347abf3be610c35612f4a565b84846040518463ffffffff1660e01b8152600401610c559392919061476c565b5f604051808303815f87803b158015610c6c575f80fd5b505af1158015610c7e573d5f803e3d5ffd5b505050505b610c95610c8e612f4a565b8686612f51565b60019250505092915050565b610ca9612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906147eb565b60405180910390fd5b80151560145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90614853565b60405180910390fd5b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f0d148a5c1704d9c0c8a1669e9b7ae29b729fa7fd357765342510c19a81a985d982604051610e409190614142565b60405180910390a25050565b60175481565b610e5a612ecc565b5f601c60016101000a81548160ff0219169083151502179055507fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a5f604051610ea39190614142565b60405180910390a1565b6014602052805f5260405f205f915054906101000a900460ff1681565b5f600354905090565b5f838383600c5f9054906101000a900460ff1615610f8157600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663379f5c69610f31612f4a565b8585856040518563ffffffff1660e01b8152600401610f539493929190614871565b5f604051808303815f87803b158015610f6a575f80fd5b505af1158015610f7c573d5f803e3d5ffd5b505050505b5f60025f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610fc8612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905085811015611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90614924565b60405180910390fd5b611052888888613038565b61106f8861105e612f4a565b888461106a919061496f565b612f51565b60019450505050509392505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166110be612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906149ec565b60405180910390fd5b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90614a54565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60405160405180910390a28060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f6012905090565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8282600c5f9054906101000a900460ff161561132557600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf5961bb6112d7612f4a565b84846040518463ffffffff1660e01b81526004016112f79392919061476c565b5f604051808303815f87803b15801561130e575f80fd5b505af1158015611320573d5f803e3d5ffd5b505050505b6113c1611330612f4a565b868660025f61133d612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546113bc9190614a72565b612f51565b60019250505092915050565b6113d5612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143a906147eb565b60405180910390fd5b80151560105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614aef565b60405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f2633ad3ef534c4bddda523fae274ccb4e47bb324c2eca411a9377d01529e2ffe8260405161156c9190614142565b60405180910390a25050565b611580612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906147eb565b60405180910390fd5b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490614aef565b60405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff40f85f17edc8eb36b286100bde23545ec4fac647f64dd7214a897af944fcb30826040516117179190614142565b60405180910390a25050565b6012602052805f5260405f205f915054906101000a900460ff1681565b601c60019054906101000a900460ff1681565b601a5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611799612f4a565b73ffffffffffffffffffffffffffffffffffffffff16146117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e6906149ec565b60405180910390fd5b600c5f9054906101000a900460ff161561183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590614b57565b60405180910390fd5b5f600b819055506001600c5f6101000a81548160ff0219169083151502179055507f1ba3b66404043da8297d0b876fa6464f2cb127edfc6626308046d4503028322b60405160405180910390a1565b611895612ecc565b5f81116118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614bbf565b60405180910390fd5b6127106a0422ca8b0a00a4250000006118f09190614c0a565b811015611929576040517fbb8cf97300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806019819055507fcb6a4e25e6070c228470cc0df60e64d9c48337dd39b32c47376eef2b366454b78160405161195f91906141d2565b60405180910390a150565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b61199d612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906147eb565b60405180910390fd5b80151560135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614853565b60405180910390fd5b80151560125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614c84565b60405180910390fd5b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f242e47ed17a9f432e4242bab4c34941ac33603481cb8319ed8dd8df34ae0051182604051611c179190614142565b60405180910390a25050565b6011602052805f5260405f205f915054906101000a900460ff1681565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611cb6612ecc565b611cbf5f61339e565b565b60185481565b60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cf4612ecc565b6001601c60016101000a81548160ff0219169083151502179055507fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a6001604051611d3f9190614142565b60405180910390a1565b611d51612ecc565b5f8111611d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8a90614cec565b60405180910390fd5b600a811115611dce576040517f2aad382000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601b819055507f78cd946ea54440e5e0457ca142c8592fd7a7d34388c8a82328c57e39cc67f04d815f6001604051611e0993929190614d0a565b60405180910390a150565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e7b612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec8906149ec565b60405180910390fd5b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806008819055508173ffffffffffffffffffffffffffffffffffffffff167f6c591da8da2f6e69746d7d9ae61c27ee29fbe303798141b4942ae2aef54274b160405160405180910390a25050565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fa0612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614d89565b60405180910390fd5b600c5f9054906101000a900460ff16612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614df1565b60405180910390fd5b5f8282905090505f805b828110156121ae575f85858381811061206a57612069614e0f565b5b905060200201602081019061207f91906141eb565b90505f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080846121109190614a72565b9350600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161219191906141d2565b60405180910390a3505080806121a690614e3c565b91505061204e565b508060015f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461221d9190614a72565b9250508190555050505050565b606060058054612239906146d4565b80601f0160208091040260200160405190810160405280929190818152602001828054612265906146d4565b80156122b05780601f10612287576101008083540402835291602001916122b0565b820191905f5260205f20905b81548152906001019060200180831161229357829003601f168201915b5050505050905090565b5f8282600c5f9054906101000a900460ff161561236557600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663568c75a9612317612f4a565b84846040518463ffffffff1660e01b81526004016123379392919061476c565b5f604051808303815f87803b15801561234e575f80fd5b505af1158015612360573d5f803e3d5ffd5b505050505b5f60025f612371612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508481101561242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290614ef3565b60405180910390fd5b612448612436612f4a565b878784612443919061496f565b612f51565b6001935050505092915050565b5f8282600c5f9054906101000a900460ff161561250057600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ffb811f6124b2612f4a565b84846040518463ffffffff1660e01b81526004016124d29392919061476c565b5f604051808303815f87803b1580156124e9575f80fd5b505af11580156124fb573d5f803e3d5ffd5b505050505b61251261250b612f4a565b8686613038565b60019250505092915050565b600d602052815f5260405f20602052805f5260405f205f91509150505481565b5f601754821115612551575f90506125fc565b5f600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050808311156125ab576125a384611c68565b9150506125fc565b600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20549150505b92915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612642612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f906149ec565b60405180910390fd5b5f600b54036126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d390614f5b565b60405180910390fd5b42600b541115612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890614fc3565b60405180910390fd5b5f600c5f6101000a81548160ff0219169083151502179055505f600b819055507f3eb72350c9c7928d31e9ab450bfff2c159434aa4b82658a7d8eae7f109cb4e7b60405160405180910390a1565b60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166127ef576040517f42df492800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601754905060175f81548092919061280790614e3c565b91905055505f600f5f8381526020019081526020015f2090504281600201819055506040518060600160405280825f01548152602001826001015481526020015f815250600f5f60175481526020019081526020015f205f820151815f01556020820151816001015560408201518160020155905050817f3b5ce8b2d475067181f949f668899c93f26f0b25c5f8712ebca6b4b93d92989d426040516128ad91906141d2565b60405180910390a25050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128f9612f4a565b73ffffffffffffffffffffffffffffffffffffffff161461294f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129469061502b565b60405180910390fd5b60085481805190602001201461299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190615093565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb94bba6936ec7f75ee931dadf6e1a4d66b43d09b6fa0178fb13df9b77fb5841f60405160405180910390a260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f0000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f81565b6010602052805f5260405f205f915054906101000a900460ff1681565b601b5481565b600c5f9054906101000a900460ff1681565b600e602052805f5260405f205f915090505481565b600f602052805f5260405f205f91509050805f0154908060010154908060020154905083565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b76612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc3906149ec565b60405180910390fd5b5f600b5414612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906150fb565b60405180910390fd5b600c5f9054906101000a900460ff16612c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5590615163565b60405180910390fd5b600a5442612c6c9190614a72565b600b819055507f6ca688e6e3ddd707280140b2bf0106afe883689b6c74e68cbd517576dd9c245a600b54604051612ca391906141d2565b60405180910390a1565b612cb5612ecc565b5f8111612cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cee90614cec565b60405180910390fd5b600a811115612d32576040517f2aad382000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601a819055507f78cd946ea54440e5e0457ca142c8592fd7a7d34388c8a82328c57e39cc67f04d8160015f604051612d6d93929190614d0a565b60405180910390a150565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b612e02612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e67906151f1565b60405180910390fd5b612e798161339e565b50565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60195481565b612ed4612f4a565b73ffffffffffffffffffffffffffffffffffffffff16612ef2611e14565b73ffffffffffffffffffffffffffffffffffffffff1614612f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3f90615259565b60405180910390fd5b565b5f33905090565b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161302b91906141d2565b60405180910390a3505050565b5f60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806130d4575060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b9050601c60019054906101000a900460ff161580156130f1575080155b15613128576040517f729cc03d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61313284836134cd565b5f61313c30611c68565b9050601c5f9054906101000a900460ff1615801561315c57506018548110155b8015613166575081155b80156131b9575060135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156131c7576131c66137e9565b5b816132ce575f60135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561323d576064601b548561322c9190615277565b6132369190614c0a565b90506132aa565b60135f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156132a9576064601a548561329c9190615277565b6132a69190614c0a565b90505b5b5f8111156132cc576132bd8630836139ee565b80846132c9919061496f565b93505b505b5f836132d986611c68565b6132e39190614a72565b905060115f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561333d575060195481115b156133815784816040517f1ba623300000000000000000000000000000000000000000000000000000000081526004016133789291906152b8565b60405180910390fd5b61338b8585613beb565b6133968686866139ee565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361340c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613403906151f1565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60175490505f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205490505f61352d85611c68565b90505f848261353c919061496f565b90505f600f5f8681526020019081526020015f20905084600e5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060125f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561369b57600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f205f90555f84111561369657690a968163f0a57b40000084106136695783815f015f82825461365d919061496f565b92505081905550613695565b683635c9adc5dea0000084106136945783816001015f82825461368c919061496f565b925050819055505b5b5b6137e0565b81600d5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f2081905550690a968163f0a57b40000083106137885782815f015f82825461370f919061496f565b92505081905550690a968163f0a57b40000082106137415781815f015f8282546137399190614a72565b925050819055505b690a968163f0a57b400000821080156137635750683635c9adc5dea000008210155b156137835781816001015f82825461377b9190614a72565b925050819055505b6137df565b683635c9adc5dea0000083106137de5782816001015f8282546137ab919061496f565b92505081905550683635c9adc5dea0000082106137dd5781816001015f8282546137d59190614a72565b925050819055505b5b5b5b50505050505050565b6001601c5f6101000a81548160ff0219169083151502179055505f61380d30611c68565b90505f8111156139d2575f600267ffffffffffffffff81111561383357613832614457565b5b6040519080825280602002602001820160405280156138615781602001602082028036833780820191505090505b50905030815f8151811061387857613877614e0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106138e7576138e6614e0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f847f0000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f426040518663ffffffff1660e01b81526004016139a39594939291906153ef565b5f604051808303815f87803b1580156139ba575f80fd5b505af11580156139cc573d5f803e3d5ffd5b50505050505b5f601c5f6101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a53906154b7565b60405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad790615545565b60405180910390fd5b8181613aec919061496f565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613b799190614a72565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bdd91906141d2565b60405180910390a350505050565b5f60175490505f613bfb84611c68565b90505f600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490505f600f5f8581526020019081526020015f20905083600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613daa57600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f90555f821115613da557690a968163f0a57b4000008210613d785781815f015f828254613d6c919061496f565b92505081905550613da4565b683635c9adc5dea000008210613da35781816001015f828254613d9b919061496f565b925050819055505b5b5b613f6f565b8483613db69190614a72565b600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f20819055505f8584613e139190614a72565b9050683635c9adc5dea00000841015613e8657690a968163f0a57b4000008110613e555780825f015f828254613e499190614a72565b92505081905550613e81565b683635c9adc5dea000008110613e805780826001015f828254613e789190614a72565b925050819055505b5b613f6d565b683635c9adc5dea000008410158015613ea85750690a968163f0a57b40000084105b15613f2757690a968163f0a57b4000008110613edc5780825f015f828254613ed09190614a72565b92505081905550613f08565b683635c9adc5dea000008110613f075780826001015f828254613eff9190614a72565b925050819055505b5b83826001015f828254613f1b919061496f565b92505081905550613f6c565b690a968163f0a57b4000008410613f6b5780825f015f828254613f4a9190614a72565b9250508190555083825f015f828254613f63919061496f565b925050819055505b5b5b505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fae578082015181840152602081019050613f93565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613fd382613f77565b613fdd8185613f81565b9350613fed818560208601613f91565b613ff681613fb9565b840191505092915050565b5f6020820190508181035f8301526140198184613fc9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61404481614032565b811461404e575f80fd5b50565b5f8135905061405f8161403b565b92915050565b5f6020828403121561407a5761407961402a565b5b5f61408784828501614051565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140b982614090565b9050919050565b6140c9816140af565b81146140d3575f80fd5b50565b5f813590506140e4816140c0565b92915050565b5f8060408385031215614100576140ff61402a565b5b5f61410d858286016140d6565b925050602061411e85828601614051565b9150509250929050565b5f8115159050919050565b61413c81614128565b82525050565b5f6020820190506141555f830184614133565b92915050565b61416481614128565b811461416e575f80fd5b50565b5f8135905061417f8161415b565b92915050565b5f806040838503121561419b5761419a61402a565b5b5f6141a8858286016140d6565b92505060206141b985828601614171565b9150509250929050565b6141cc81614032565b82525050565b5f6020820190506141e55f8301846141c3565b92915050565b5f60208284031215614200576141ff61402a565b5b5f61420d848285016140d6565b91505092915050565b5f805f6060848603121561422d5761422c61402a565b5b5f61423a868287016140d6565b935050602061424b868287016140d6565b925050604061425c86828701614051565b9150509250925092565b5f60ff82169050919050565b61427b81614266565b82525050565b5f6020820190506142945f830184614272565b92915050565b5f819050919050565b5f6142bd6142b86142b384614090565b61429a565b614090565b9050919050565b5f6142ce826142a3565b9050919050565b5f6142df826142c4565b9050919050565b6142ef816142d5565b82525050565b5f6020820190506143085f8301846142e6565b92915050565b614317816140af565b82525050565b5f6020820190506143305f83018461430e565b92915050565b5f819050919050565b61434881614336565b8114614352575f80fd5b50565b5f813590506143638161433f565b92915050565b5f806040838503121561437f5761437e61402a565b5b5f61438c858286016140d6565b925050602061439d85828601614355565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126143c8576143c76143a7565b5b8235905067ffffffffffffffff8111156143e5576143e46143ab565b5b602083019150836020820283011115614401576144006143af565b5b9250929050565b5f806020838503121561441e5761441d61402a565b5b5f83013567ffffffffffffffff81111561443b5761443a61402e565b5b614447858286016143b3565b92509250509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61448d82613fb9565b810181811067ffffffffffffffff821117156144ac576144ab614457565b5b80604052505050565b5f6144be614021565b90506144ca8282614484565b919050565b5f67ffffffffffffffff8211156144e9576144e8614457565b5b6144f282613fb9565b9050602081019050919050565b828183375f83830152505050565b5f61451f61451a846144cf565b6144b5565b90508281526020810184848401111561453b5761453a614453565b5b6145468482856144ff565b509392505050565b5f82601f830112614562576145616143a7565b5b813561457284826020860161450d565b91505092915050565b5f602082840312156145905761458f61402a565b5b5f82013567ffffffffffffffff8111156145ad576145ac61402e565b5b6145b98482850161454e565b91505092915050565b5f6145cc82614090565b9050919050565b6145dc816145c2565b82525050565b5f6020820190506145f55f8301846145d3565b92915050565b5f60608201905061460e5f8301866141c3565b61461b60208301856141c3565b61462860408301846141c3565b949350505050565b5f80604083850312156146465761464561402a565b5b5f614653858286016140d6565b9250506020614664858286016140d6565b9150509250929050565b5f614678826142c4565b9050919050565b6146888161466e565b82525050565b5f6020820190506146a15f83018461467f565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146eb57607f821691505b6020821081036146fe576146fd6146a7565b5b50919050565b7f465558494f4e5f5f496e76616c69645468726573686f6c6400000000000000005f82015250565b5f614738601883613f81565b915061474382614704565b602082019050919050565b5f6020820190508181035f8301526147658161472c565b9050919050565b5f60608201905061477f5f83018661430e565b61478c602083018561430e565b61479960408301846141c3565b949350505050565b7f465558494f4e5f5f496e76616c696441646472657373000000000000000000005f82015250565b5f6147d5601683613f81565b91506147e0826147a1565b602082019050919050565b5f6020820190508181035f830152614802816147c9565b9050919050565b7f465558494f4e5f5f416c726561647953657400000000000000000000000000005f82015250565b5f61483d601283613f81565b915061484882614809565b602082019050919050565b5f6020820190508181035f83015261486a81614831565b9050919050565b5f6080820190506148845f83018761430e565b614891602083018661430e565b61489e604083018561430e565b6148ab60608301846141c3565b95945050505050565b7f4c45524332303a207472616e7366657220616d6f756e742065786365656473205f8201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b5f61490e602983613f81565b9150614919826148b4565b604082019050919050565b5f6020820190508181035f83015261493b81614902565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61497982614032565b915061498483614032565b925082820390508181111561499c5761499b614942565b5b92915050565b7f4c45524332303a204d757374206265207265636f766572792061646d696e00005f82015250565b5f6149d6601e83613f81565b91506149e1826149a2565b602082019050919050565b5f6020820190508181035f830152614a03816149ca565b9050919050565b7f4c45524332303a2043616e6e6f74207365742073616d652061646472657373005f82015250565b5f614a3e601f83613f81565b9150614a4982614a0a565b602082019050919050565b5f6020820190508181035f830152614a6b81614a32565b9050919050565b5f614a7c82614032565b9150614a8783614032565b9250828201905080821115614a9f57614a9e614942565b5b92915050565b7f465558494f4e5f5f416c72656164794578636c756465640000000000000000005f82015250565b5f614ad9601783613f81565b9150614ae482614aa5565b602082019050919050565b5f6020820190508181035f830152614b0681614acd565b9050919050565b7f4c45524332303a204c6f73736c65737320616c7265616479206f6e00000000005f82015250565b5f614b41601b83613f81565b9150614b4c82614b0d565b602082019050919050565b5f6020820190508181035f830152614b6e81614b35565b9050919050565b7f465558494f4e5f5f496e76616c69644d617857616c6c657400000000000000005f82015250565b5f614ba9601883613f81565b9150614bb482614b75565b602082019050919050565b5f6020820190508181035f830152614bd681614b9d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614c1482614032565b9150614c1f83614032565b925082614c2f57614c2e614bdd565b5b828204905092915050565b7f465558494f4e5f5f496e76616c696400000000000000000000000000000000005f82015250565b5f614c6e600f83613f81565b9150614c7982614c3a565b602082019050919050565b5f6020820190508181035f830152614c9b81614c62565b9050919050565b7f465558494f4e5f5f496e76616c6964546178416d6f756e7400000000000000005f82015250565b5f614cd6601883613f81565b9150614ce182614ca2565b602082019050919050565b5f6020820190508181035f830152614d0381614cca565b9050919050565b5f606082019050614d1d5f8301866141c3565b614d2a6020830185614133565b614d376040830184614133565b949350505050565b7f4c45524332303a204f6e6c79206c6f73736c65737320636f6e747261637400005f82015250565b5f614d73601e83613f81565b9150614d7e82614d3f565b602082019050919050565b5f6020820190508181035f830152614da081614d67565b9050919050565b7f4c45524332303a204c6f73736c657373206973206f66660000000000000000005f82015250565b5f614ddb601783613f81565b9150614de682614da7565b602082019050919050565b5f6020820190508181035f830152614e0881614dcf565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614e4682614032565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e7857614e77614942565b5b600182019050919050565b7f4c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f5f8201527f77207a65726f0000000000000000000000000000000000000000000000000000602082015250565b5f614edd602683613f81565b9150614ee882614e83565b604082019050919050565b5f6020820190508181035f830152614f0a81614ed1565b9050919050565b7f4c45524332303a205475726e4f6666206e6f742070726f706f736564000000005f82015250565b5f614f45601c83613f81565b9150614f5082614f11565b602082019050919050565b5f6020820190508181035f830152614f7281614f39565b9050919050565b7f4c45524332303a2054696d65206c6f636b20696e2070726f67726573730000005f82015250565b5f614fad601d83613f81565b9150614fb882614f79565b602082019050919050565b5f6020820190508181035f830152614fda81614fa1565b9050919050565b7f4c45524332303a204d7573742062652063616e646974617465000000000000005f82015250565b5f615015601983613f81565b915061502082614fe1565b602082019050919050565b5f6020820190508181035f83015261504281615009565b9050919050565b7f4c45524332303a20496e76616c6964206b6579000000000000000000000000005f82015250565b5f61507d601383613f81565b915061508882615049565b602082019050919050565b5f6020820190508181035f8301526150aa81615071565b9050919050565b7f4c45524332303a205475726e4f666620616c72656164792070726f706f7365645f82015250565b5f6150e5602083613f81565b91506150f0826150b1565b602082019050919050565b5f6020820190508181035f830152615112816150d9565b9050919050565b7f4c45524332303a204c6f73736c65737320616c7265616479206f6666000000005f82015250565b5f61514d601c83613f81565b915061515882615119565b602082019050919050565b5f6020820190508181035f83015261517a81615141565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6151db602683613f81565b91506151e682615181565b604082019050919050565b5f6020820190508181035f830152615208816151cf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f615243602083613f81565b915061524e8261520f565b602082019050919050565b5f6020820190508181035f83015261527081615237565b9050919050565b5f61528182614032565b915061528c83614032565b925082820261529a81614032565b915082820484148315176152b1576152b0614942565b5b5092915050565b5f6040820190506152cb5f83018561430e565b6152d860208301846141c3565b9392505050565b5f819050919050565b5f6153026152fd6152f8846152df565b61429a565b614032565b9050919050565b615312816152e8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61534a816140af565b82525050565b5f61535b8383615341565b60208301905092915050565b5f602082019050919050565b5f61537d82615318565b6153878185615322565b935061539283615332565b805f5b838110156153c25781516153a98882615350565b97506153b483615367565b925050600181019050615395565b5085935050505092915050565b5f6153d9826142c4565b9050919050565b6153e9816153cf565b82525050565b5f60a0820190506154025f8301886141c3565b61540f6020830187615309565b81810360408301526154218186615373565b905061543060608301856153e0565b61543d60808301846141c3565b9695505050505050565b7f4c45524332303a207472616e736665722066726f6d20746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6154a1602683613f81565b91506154ac82615447565b604082019050919050565b5f6020820190508181035f8301526154ce81615495565b9050919050565b7f4c45524332303a207472616e7366657220616d6f756e742065786365656473205f8201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b5f61552f602783613f81565b915061553a826154d5565b604082019050919050565b5f6020820190508181035f83015261555c81615523565b905091905056fea2646970667358221220416b2d3ee07bbd75200b7a187eb286a4bbbe9f27e7fde39157299261ca31daf764736f6c63430008150033

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

0000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f0000000000000000000000001a4232444bbdca5e4e37e125e4b17f1ad037c056000000000000000000000000f6af39db4887c8f3671ec11c5bab428700626a41000000000000000000000000e91d7cebce484070fc70777cb04f7e2efae31db40000000000000000000000000000000000000000000000000000000000015180

-----Decoded View---------------
Arg [0] : _admin (address): 0x3336F22201914e8BFfC69D2dB520a9DA84dBa14f
Arg [1] : _newOwner (address): 0x1A4232444Bbdca5e4E37e125E4b17F1aD037c056
Arg [2] : _recoveryAdmin (address): 0xf6Af39db4887c8f3671Ec11c5baB428700626a41
Arg [3] : lossless_ (address): 0xe91D7cEBcE484070fc70777cB04F7e2EfAe31DB4
Arg [4] : timeLockPeriod_ (uint256): 86400

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f
Arg [1] : 0000000000000000000000001a4232444bbdca5e4e37e125e4b17f1ad037c056
Arg [2] : 000000000000000000000000f6af39db4887c8f3671ec11c5bab428700626a41
Arg [3] : 000000000000000000000000e91d7cebce484070fc70777cb04f7e2efae31db4
Arg [4] : 0000000000000000000000000000000000000000000000000000000000015180


Deployed Bytecode Sourcemap

39326:18582:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23699:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47347:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24710:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48538:443;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41018:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48150:121;;;:::i;:::-;;40535:65;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24020:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24939:587;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21528:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18583:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40475:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23919:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18703:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25534:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44841:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45481:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40379:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41214:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41115:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23315:238;;;:::i;:::-;;47609:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18424:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18619:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46071:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40286:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23561:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24136:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29405:103;;;:::i;:::-;;41054:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40899:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47964:120;;;:::i;:::-;;49611:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28764:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21773:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20775:745;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23807:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25933:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24287:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39979:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57389:516;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22916:391;;;:::i;:::-;;46698:529;;;:::i;:::-;;22063:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40966:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40208:71;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41144:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18665:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40075:66;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40148:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;22509:399;;;:::i;:::-;;49167:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24526:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29663:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18547:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40858:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41087:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23699:100;23753:13;23786:5;23779:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23699:100;:::o;47347:254::-;28650:13;:11;:13::i;:::-;47446:1:::1;47430:13;:17;47422:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;40644:15;47493:13;:26;47489:65;;;47528:26;;;;;;;;;;;;;;47489:65;47580:13;47565:12;:28;;;;47347:254:::0;:::o;24710:221::-;24845:4;24819:7;24828:6;19392:12;;;;;;;;;;;19388:98;;;19421:8;;;;;;;;;;;:22;;;19444:12;:10;:12::i;:::-;19458:7;19467:6;19421:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19388:98;24862:39:::1;24871:12;:10;:12::i;:::-;24885:7;24894:6;24862:8;:39::i;:::-;24919:4;24912:11;;24710:221:::0;;;;;;:::o;48538:443::-;28650:13;:11;:13::i;:::-;48699:1:::1;48675:26;;:12;:26;;::::0;48667:61:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48792:14;48761:45;;:13;:27;48775:12;48761:27;;;;;;;;;;;;;;;;;;;;;;;;;:45;;::::0;48739:113:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48893:14;48863:13;:27;48877:12;48863:27;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;48944:12;48923:50;;;48958:14;48923:50;;;;;;:::i;:::-;;;;;;;;48538:443:::0;;:::o;41018:29::-;;;;:::o;48150:121::-;28650:13;:11;:13::i;:::-;48221:5:::1;48204:14;;:22;;;;;;;;;;;;;;;;;;48242:21;48257:5;48242:21;;;;;;:::i;:::-;;;;;;;;48150:121::o:0;40535:65::-;;;;;;;;;;;;;;;;;;;;;;:::o;24020:108::-;24081:7;24108:12;;24101:19;;24020:108;:::o;24939:587::-;25167:4;25122:6;25130:9;25141:6;19833:12;;;;;;;;;;;19829:196;;;19862:8;;;;;;;;;;;:27;;;19908:12;:10;:12::i;:::-;19939:6;19964:9;19992:6;19862:151;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19829:196;25189:24:::1;25216:11;:19;25228:6;25216:19;;;;;;;;;;;;;;;:33;25236:12;:10;:12::i;:::-;25216:33;;;;;;;;;;;;;;;;25189:60;;25302:6;25282:16;:26;;25260:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;25388:36;25398:6;25406:9;25417:6;25388:9;:36::i;:::-;25437:57;25446:6;25454:12;:10;:12::i;:::-;25487:6;25468:16;:25;;;;:::i;:::-;25437:8;:57::i;:::-;25514:4;25507:11;;;24939:587:::0;;;;;;;;:::o;21528:237::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;21655:5:::1;;;;;;;;;;;21643:17;;:8;:17;;::::0;21635:61:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21721:8;21712:18;;;;;;;;;;;;21749:8;21741:5;;:16;;;;;;;;;;;;;;;;;;21528:237:::0;:::o;18583:29::-;;;;:::o;40475:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;23919:93::-;23977:5;24002:2;23995:9;;23919:93;:::o;18703:30::-;;;;;;;;;;;;;:::o;25534:391::-;25743:4;25704:7;25713:10;20134:12;;;;;;;;;;;20130:112;;;20163:8;;;;;;;;;;;:32;;;20196:12;:10;:12::i;:::-;20210:7;20219:10;20163:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20130:112;25765:130:::1;25788:12;:10;:12::i;:::-;25815:7;25874:10;25837:11;:25;25849:12;:10;:12::i;:::-;25837:25;;;;;;;;;;;;;;;:34;25863:7;25837:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;25765:8;:130::i;:::-;25913:4;25906:11;;25534:391:::0;;;;;;:::o;44841:398::-;28650:13;:11;:13::i;:::-;44979:1:::1;44962:19;;:5;:19;;::::0;44954:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45069:9;45041:37;;:17;:24;45059:5;45041:24;;;;;;;;;;;;;;;;;;;;;;;;;:37;;::::0;45019:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45167:9;45140:17;:24;45158:5;45140:24;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;45214:5;45192:39;;;45221:9;45192:39;;;;;;:::i;:::-;;;;;;;;44841:398:::0;;:::o;45481:417::-;28650:13;:11;:13::i;:::-;45626:1:::1;45609:19;;:5;:19;;::::0;45601:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45722:9;45688:43;;:23;:30;45712:5;45688:30;;;;;;;;;;;;;;;;;;;;;;;;;:43;;::::0;45666:116:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45826:9;45793:23;:30;45817:5;45793:30;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;45873:5;45851:39;;;45880:9;45851:39;;;;;;:::i;:::-;;;;;;;;45481:417:::0;;:::o;40379:89::-;;;;;;;;;;;;;;;;;;;;;;:::o;41214:34::-;;;;;;;;;;;;;:::o;41115:22::-;;;;:::o;23315:238::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;23404:12:::1;;;;;;;;;;;23403:13;23395:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;23486:1;23459:24;:28;;;;23513:4;23498:12;;:19;;;;;;;;;;;;;;;;;;23533:12;;;;;;;;;;23315:238::o:0;47609:290::-;28650:13;:11;:13::i;:::-;47699:1:::1;47686:10;:14;47678:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;47770:6;40644:15;47757:19;;;;:::i;:::-;47744:10;:32;47740:71;;;47785:26;;;;;;;;;;;;;;47740:71;47834:10;47822:9;:22;;;;47860:31;47880:10;47860:31;;;;;;:::i;:::-;;;;;;;;47609:290:::0;:::o;18424:28::-;;;;;;;;;;;;;:::o;18619:39::-;;;;:::o;46071:543::-;28650:13;:11;:13::i;:::-;46217:1:::1;46195:24;;:10;:24;;::::0;46187:59:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46292:12;46265:39;;:11;:23;46277:10;46265:23;;;;;;;;;;;;;;;;;;;;;;;;;:39;;::::0;46257:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46392:12;46360:44;;:16;:28;46377:10;46360:28;;;;;;;;;;;;;;;;;;;;;;;;;:44;;::::0;46338:109:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46484:12;46458:11;:23;46470:10;46458:23;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;46538:12;46507:16;:28;46524:10;46507:28;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;46581:10;46566:40;;;46593:12;46566:40;;;;;;:::i;:::-;;;;;;;;46071:543:::0;;:::o;40286:86::-;;;;;;;;;;;;;;;;;;;;;;:::o;23561:98::-;23619:7;23646:5;;;;;;;;;;;23639:12;;23561:98;:::o;24136:143::-;24226:7;24253:9;:18;24263:7;24253:18;;;;;;;;;;;;;;;;24246:25;;24136:143;;;:::o;29405:103::-;28650:13;:11;:13::i;:::-;29470:30:::1;29497:1;29470:18;:30::i;:::-;29405:103::o:0;41054:24::-;;;;:::o;40899:23::-;;;;;;;;;;;;;:::o;47964:120::-;28650:13;:11;:13::i;:::-;48036:4:::1;48019:14;;:21;;;;;;;;;;;;;;;;;;48056:20;48071:4;48056:20;;;;;;:::i;:::-;;;;;;;;47964:120::o:0;49611:260::-;28650:13;:11;:13::i;:::-;49695:1:::1;49684:8;:12;49676:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49751:2;49740:8;:13;49736:52;;;49762:26;;;;;;;;;;;;;;49736:52;49809:8;49799:7;:18;;;;49833:30;49841:8;49851:5;49858:4;49833:30;;;;;;;;:::i;:::-;;;;;;;;49611:260:::0;:::o;28764:87::-;28810:7;28837:6;;;;;;;;;;;28830:13;;28764:87;:::o;21773:282::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;21946:9:::1;21921:22;;:34;;;;;;;;;;;;;;;;;;21989:7;21966:20;:30;;;;22037:9;22012:35;;;;;;;;;;;;21773:282:::0;;:::o;20775:745::-;20928:8;;;;;;;;;;;20904:33;;:12;:10;:12::i;:::-;:33;;;20882:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;21014:12;;;;;;;;;;;21006:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;21067:18;21088:4;;:11;;21067:32;;21110:19;21151:9;21146:311;21170:10;21166:1;:14;21146:311;;;21202:19;21224:4;;21229:1;21224:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21202:29;;21246:19;21268:9;:22;21278:11;21268:22;;;;;;;;;;;;;;;;21246:44;;21330:1;21305:9;:22;21315:11;21305:22;;;;;;;;;;;;;;;:26;;;;21361:11;21346:26;;;;;:::i;:::-;;;21422:8;;;;;;;;;;;21392:53;;21401:11;21392:53;;;21433:11;21392:53;;;;;;:::i;:::-;;;;;;;;21187:270;;21182:3;;;;;:::i;:::-;;;;21146:311;;;;21501:11;21469:9;:28;21487:8;;;;;;;;;;;21469:28;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;20871:649;;20775:745;;:::o;23807:104::-;23863:13;23896:7;23889:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23807:104;:::o;25933:546::-;26152:4;26108:7;26117:15;20356:12;;;;;;;;;;;20352:183;;;20385:8;;;;;;;;;;;:32;;;20436:12;:10;:12::i;:::-;20467:7;20493:15;20385:138;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20352:183;26174:24:::1;26201:11;:25;26213:12;:10;:12::i;:::-;26201:25;;;;;;;;;;;;;;;:34;26227:7;26201:34;;;;;;;;;;;;;;;;26174:61;;26288:15;26268:16;:35;;26246:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;26380:67;26389:12;:10;:12::i;:::-;26403:7;26431:15;26412:16;:34;;;;:::i;:::-;26380:8;:67::i;:::-;26467:4;26460:11;;;25933:546:::0;;;;;;:::o;24287:231::-;24429:4;24401:9;24412:6;19584:12;;;;;;;;;;;19580:101;;;19613:8;;;;;;;;;;;:23;;;19637:12;:10;:12::i;:::-;19651:9;19662:6;19613:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19580:101;24446:42:::1;24456:12;:10;:12::i;:::-;24470:9;24481:6;24446:9;:42::i;:::-;24506:4;24499:11;;24287:231:::0;;;;;;:::o;39979:89::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57389:516::-;57491:4;57576:13;;57567:6;:22;57563:36;;;57598:1;57591:8;;;;57563:36;57610:17;57630:14;:20;57645:4;57630:20;;;;;;;;;;;;;;;;57610:40;;57772:12;57763:6;:21;57759:49;;;57793:15;57803:4;57793:9;:15::i;:::-;57786:22;;;;;57759:49;57871:12;:18;57884:4;57871:18;;;;;;;;;;;;;;;:26;57890:6;57871:26;;;;;;;;;;;;57864:33;;;57389:516;;;;;:::o;22916:391::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;23033:1:::1;23005:24;;:29:::0;22997:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23128:15;23100:24;;:43;;23078:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;23226:5;23211:12;;:20;;;;;;;;;;;;;;;;;;23269:1;23242:24;:28;;;;23286:13;;;;;;;;;;22916:391::o:0;46698:529::-;42333:13;:25;42347:10;42333:25;;;;;;;;;;;;;;;;;;;;;;;;;42328:59;;42367:20;;;;;;;;;;;;;;42328:59;46758:16:::1;46777:13;;46758:32;;46801:13;;:15;;;;;;;;;:::i;:::-;;;;;;46829:25;46857:9;:22;46867:11;46857:22;;;;;;;;;;;46829:50;;46920:15;46890:4;:27;;:45;;;;47009:149;;;;;;;;47049:4;:15;;;47009:149;;;;47091:4;:15;;;47009:149;;;;47145:1;47009:149;;::::0;46982:9:::1;:24;46992:13;;46982:24;;;;;;;;;;;:176;;;;;;;;;;;;;;;;;;;;;;;;;;;47190:11;47176:43;47203:15;47176:43;;;;;;:::i;:::-;;;;;;;;46747:480;;46698:529::o:0;22063:438::-;22186:22;;;;;;;;;;;22170:38;;:12;:10;:12::i;:::-;:38;;;22148:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;22298:20;;22290:3;22280:14;;;;;;:38;22272:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;22375:22;;;;;;;;;;;22358:40;;;;;;;;;;;;22425:22;;;;;;;;;;;22409:13;;:38;;;;;;;;;;;;;;;;;;22491:1;22458:22;;:35;;;;;;;;;;;;;;;;;;22063:438;:::o;40966:45::-;;;:::o;40208:71::-;;;;;;;;;;;;;;;;;;;;;;:::o;41144:23::-;;;;:::o;18665:31::-;;;;;;;;;;;;;:::o;40075:66::-;;;;;;;;;;;;;;;;;:::o;40148:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22509:399::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;22640:1:::1;22612:24;;:29;22590:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22720:12;;;;;;;;;;;22712:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;22821:14;;22803:15;:32;;;;:::i;:::-;22776:24;:59;;;;22851:49;22875:24;;22851:49;;;;;;:::i;:::-;;;;;;;;22509:399::o:0;49167:253::-;28650:13;:11;:13::i;:::-;49248:1:::1;49238:7;:11;49230:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;49303:2;49293:7;:12;49289:51;;;49314:26;;;;;;;;;;;;;;49289:51;49360:7;49351:6;:16;;;;49383:29;49391:7;49400:4;49406:5;49383:29;;;;;;;;:::i;:::-;;;;;;;;49167:253:::0;:::o;24526:176::-;24640:7;24667:11;:18;24679:5;24667:18;;;;;;;;;;;;;;;:27;24686:7;24667:27;;;;;;;;;;;;;;;;24660:34;;24526:176;;;;:::o;29663:238::-;28650:13;:11;:13::i;:::-;29786:1:::1;29766:22;;:8;:22;;::::0;29744:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;29865:28;29884:8;29865:18;:28::i;:::-;29663:238:::0;:::o;18547:29::-;;;;;;;;;;;;;:::o;40858:32::-;;;;;;;;;;;;;:::o;41087:21::-;;;;:::o;28929:132::-;29004:12;:10;:12::i;:::-;28993:23;;:7;:5;:7::i;:::-;:23;;;28985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28929:132::o;93:98::-;146:7;173:10;166:17;;93:98;:::o;27942:220::-;28100:6;28070:11;:18;28082:5;28070:18;;;;;;;;;;;;;;;:27;28089:7;28070:27;;;;;;;;;;;;;;;:36;;;;28138:7;28122:32;;28131:5;28122:32;;;28147:6;28122:32;;;;;;:::i;:::-;;;;;;;;27942:220;;;:::o;50369:1580::-;50490:17;50510;:23;50528:4;50510:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;50537:17;:21;50555:2;50537:21;;;;;;;;;;;;;;;;;;;;;;;;;50510:48;50490:68;;50576:14;;;;;;;;;;;50575:15;:32;;;;;50595:12;50594:13;50575:32;50571:99;;;50631:27;;;;;;;;;;;;;;50571:99;50682:33;50702:4;50708:6;50682:19;:33::i;:::-;50728:19;50750:24;50768:4;50750:9;:24::i;:::-;50728:46;;50806:10;;;;;;;;;;;50805:11;:58;;;;;50851:12;;50833:14;:30;;50805:58;:88;;;;;50881:12;50880:13;50805:88;:123;;;;;50911:11;:17;50923:4;50911:17;;;;;;;;;;;;;;;;;;;;;;;;;50910:18;50805:123;50787:217;;;50979:13;:11;:13::i;:::-;50787:217;51093:12;51088:513;;51122:8;51209:11;:15;51221:2;51209:15;;;;;;;;;;;;;;;;;;;;;;;;;51205:250;;;40848:3;51289:7;;51280:6;:16;;;;:::i;:::-;51279:32;;;;:::i;:::-;51273:38;;51205:250;;;51337:11;:17;51349:4;51337:17;;;;;;;;;;;;;;;;;;;;;;;;;51333:122;;;40848:3;51418:6;;51409;:15;;;;:::i;:::-;51408:31;;;;:::i;:::-;51402:37;;51333:122;51205:250;51479:1;51473:3;:7;51469:121;;;51501:41;51517:4;51531;51538:3;51501:15;:41::i;:::-;51571:3;51561:13;;;;;:::i;:::-;;;51469:121;51107:494;51088:513;51665:17;51701:6;51685:13;51695:2;51685:9;:13::i;:::-;:22;;;;:::i;:::-;51665:42;;51723:23;:27;51747:2;51723:27;;;;;;;;;;;;;;;;;;;;;;;;;51722:28;:56;;;;;51769:9;;51754:12;:24;51722:56;51718:138;;;51827:2;51831:12;51802:42;;;;;;;;;;;;:::i;:::-;;;;;;;;51718:138;51866:31;51886:2;51890:6;51866:19;:31::i;:::-;51908:33;51924:4;51930:2;51934:6;51908:15;:33::i;:::-;50479:1470;;;50369:1580;;;:::o;30061:312::-;30177:1;30157:22;;:8;:22;;;30135:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30256:16;30275:6;;;;;;;;;;;30256:25;;30301:8;30292:6;;:17;;;;;;;;;;;;;;;;;;30356:8;30325:40;;30346:8;30325:40;;;;;;;;;;;;30124:249;30061:312;:::o;53035:1821::-;53110:16;53129:13;;53110:32;;53153:23;53179:12;:18;53192:4;53179:18;;;;;;;;;;;;;;;:31;53198:11;53179:31;;;;;;;;;;;;53153:57;;53221:19;53243:15;53253:4;53243:9;:15::i;:::-;53221:37;;53269:15;53304:6;53287:14;:23;;;;:::i;:::-;53269:41;;53321:25;53349:9;:22;53359:11;53349:22;;;;;;;;;;;53321:50;;53405:11;53382:14;:20;53397:4;53382:20;;;;;;;;;;;;;;;:34;;;;53516:16;:22;53533:4;53516:22;;;;;;;;;;;;;;;;;;;;;;;;;53512:1337;;;53562:12;:18;53575:4;53562:18;;;;;;;;;;;;;;;:31;53581:11;53562:31;;;;;;;;;;;53555:38;;;53725:1;53704:18;:22;53700:271;;;40697:12;53751:18;:28;53747:208;;53821:18;53802:4;:15;;;:37;;;;;;;:::i;:::-;;;;;;;;53747:208;;;40769:11;53867:18;:28;53863:92;;53937:18;53918:4;:15;;;:37;;;;;;;:::i;:::-;;;;;;;;53863:92;53747:208;53700:271;53512:1337;;;54037:10;54003:12;:18;54016:4;54003:18;;;;;;;;;;;;;;;:31;54022:11;54003:31;;;;;;;;;;;:44;;;;40697:12;54097:14;:24;54093:745;;54197:14;54178:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;40697:12;54267:10;:20;54263:55;;54308:10;54289:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;54263:55;40697:12;54371:10;:19;:43;;;;;40769:11;54394:10;:20;;54371:43;54367:99;;;54456:10;54437:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;54367:99;54093:745;;;40769:11;54590:14;:24;54586:252;;54654:14;54635:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;40769:11;54724:10;:20;54720:55;;54765:10;54746:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;54720:55;54586:252;54093:745;53512:1337;53099:1757;;;;;53035:1821;;:::o;52078:763::-;52133:4;52120:10;;:17;;;;;;;;;;;;;;;;;;52216:28;52247:24;52265:4;52247:9;:24::i;:::-;52216:55;;52348:1;52325:20;:24;52321:484;;;52366:21;52404:1;52390:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52366:40;;52439:4;52421;52426:1;52421:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;52469:4;52459;52464:1;52459:7;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;;;52546:6;;;;;;;;;;;:57;;;52622:20;52661:1;52709:4;52732:12;52763:15;52546:247;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52351:454;52321:484;52828:5;52815:10;;:18;;;;;;;;;;;;;;;;;;52109:732;52078:763::o;26487:535::-;26645:1;26627:20;;:6;:20;;;26619:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26703:21;26727:9;:17;26737:6;26727:17;;;;;;;;;;;;;;;;26703:41;;26794:6;26777:13;:23;;26755:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;26914:6;26898:13;:22;;;;:::i;:::-;26878:9;:17;26888:6;26878:17;;;;;;;;;;;;;;;:42;;;;26955:6;26931:9;:20;26941:9;26931:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;26996:9;26979:35;;26988:6;26979:35;;;27007:6;26979:35;;;;;;:::i;:::-;;;;;;;;26608:414;26487:535;;;:::o;55034:2119::-;55109:16;55128:13;;55109:32;;55152:19;55174:15;55184:4;55174:9;:15::i;:::-;55152:37;;55200:23;55226:12;:18;55239:4;55226:18;;;;;;;;;;;;;;;:31;55245:11;55226:31;;;;;;;;;;;;55200:57;;55268:25;55296:9;:22;55306:11;55296:22;;;;;;;;;;;55268:50;;55352:11;55329:14;:20;55344:4;55329:20;;;;;;;;;;;;;;;:34;;;;55463:16;:22;55480:4;55463:22;;;;;;;;;;;;;;;;;;;;;;;;;55459:1687;;;55509:12;:18;55522:4;55509:18;;;;;;;;;;;;;;;:31;55528:11;55509:31;;;;;;;;;;;55502:38;;;55672:1;55651:18;:22;55647:271;;;40697:12;55698:18;:28;55694:208;;55768:18;55749:4;:15;;;:37;;;;;;;:::i;:::-;;;;;;;;55694:208;;;40769:11;55814:18;:28;55810:92;;55884:18;55865:4;:15;;;:37;;;;;;;:::i;:::-;;;;;;;;55810:92;55694:208;55647:271;55459:1687;;;56001:6;55984:14;:23;;;;:::i;:::-;55950:12;:18;55963:4;55950:18;;;;;;;;;;;;;;;:31;55969:11;55950:31;;;;;;;;;;;:57;;;;56022:15;56057:6;56040:14;:23;;;;:::i;:::-;56022:41;;40769:11;56168:14;:23;56164:971;;;40697:12;56246:10;:20;56242:189;;56308:10;56289:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;56242:189;;;40769:11;56380:10;:20;56376:55;;56421:10;56402:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;56376:55;56242:189;56164:971;;;40769:11;56540:14;:24;;:51;;;;;40697:12;56568:14;:23;56540:51;56536:599;;;40697:12;56646:10;:20;56642:194;;56708:10;56689:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;56642:194;;;40769:11;56785:10;:20;56781:55;;56826:10;56807:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;56781:55;56642:194;56874:14;56855:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;56536:599;;;40697:12;56955:14;:24;56951:184;;57057:10;57038:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;57105:14;57086:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;56951:184;56536:599;56164:971;55935:1211;55459:1687;55098:2055;;;;55034:2119;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:122::-;2674:24;2692:5;2674:24;:::i;:::-;2667:5;2664:35;2654:63;;2713:1;2710;2703:12;2654:63;2601:122;:::o;2729:139::-;2775:5;2813:6;2800:20;2791:29;;2829:33;2856:5;2829:33;:::i;:::-;2729:139;;;;:::o;2874:474::-;2942:6;2950;2999:2;2987:9;2978:7;2974:23;2970:32;2967:119;;;3005:79;;:::i;:::-;2967:119;3125:1;3150:53;3195:7;3186:6;3175:9;3171:22;3150:53;:::i;:::-;3140:63;;3096:117;3252:2;3278:53;3323:7;3314:6;3303:9;3299:22;3278:53;:::i;:::-;3268:63;;3223:118;2874:474;;;;;:::o;3354:90::-;3388:7;3431:5;3424:13;3417:21;3406:32;;3354:90;;;:::o;3450:109::-;3531:21;3546:5;3531:21;:::i;:::-;3526:3;3519:34;3450:109;;:::o;3565:210::-;3652:4;3690:2;3679:9;3675:18;3667:26;;3703:65;3765:1;3754:9;3750:17;3741:6;3703:65;:::i;:::-;3565:210;;;;:::o;3781:116::-;3851:21;3866:5;3851:21;:::i;:::-;3844:5;3841:32;3831:60;;3887:1;3884;3877:12;3831:60;3781:116;:::o;3903:133::-;3946:5;3984:6;3971:20;3962:29;;4000:30;4024:5;4000:30;:::i;:::-;3903:133;;;;:::o;4042:468::-;4107:6;4115;4164:2;4152:9;4143:7;4139:23;4135:32;4132:119;;;4170:79;;:::i;:::-;4132:119;4290:1;4315:53;4360:7;4351:6;4340:9;4336:22;4315:53;:::i;:::-;4305:63;;4261:117;4417:2;4443:50;4485:7;4476:6;4465:9;4461:22;4443:50;:::i;:::-;4433:60;;4388:115;4042:468;;;;;:::o;4516:118::-;4603:24;4621:5;4603:24;:::i;:::-;4598:3;4591:37;4516:118;;:::o;4640:222::-;4733:4;4771:2;4760:9;4756:18;4748:26;;4784:71;4852:1;4841:9;4837:17;4828:6;4784:71;:::i;:::-;4640:222;;;;:::o;4868:329::-;4927:6;4976:2;4964:9;4955:7;4951:23;4947:32;4944:119;;;4982:79;;:::i;:::-;4944:119;5102:1;5127:53;5172:7;5163:6;5152:9;5148:22;5127:53;:::i;:::-;5117:63;;5073:117;4868:329;;;;:::o;5203:619::-;5280:6;5288;5296;5345:2;5333:9;5324:7;5320:23;5316:32;5313:119;;;5351:79;;:::i;:::-;5313:119;5471:1;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5442:117;5598:2;5624:53;5669:7;5660:6;5649:9;5645:22;5624:53;:::i;:::-;5614:63;;5569:118;5726:2;5752:53;5797:7;5788:6;5777:9;5773:22;5752:53;:::i;:::-;5742:63;;5697:118;5203:619;;;;;:::o;5828:86::-;5863:7;5903:4;5896:5;5892:16;5881:27;;5828:86;;;:::o;5920:112::-;6003:22;6019:5;6003:22;:::i;:::-;5998:3;5991:35;5920:112;;:::o;6038:214::-;6127:4;6165:2;6154:9;6150:18;6142:26;;6178:67;6242:1;6231:9;6227:17;6218:6;6178:67;:::i;:::-;6038:214;;;;:::o;6258:60::-;6286:3;6307:5;6300:12;;6258:60;;;:::o;6324:142::-;6374:9;6407:53;6425:34;6434:24;6452:5;6434:24;:::i;:::-;6425:34;:::i;:::-;6407:53;:::i;:::-;6394:66;;6324:142;;;:::o;6472:126::-;6522:9;6555:37;6586:5;6555:37;:::i;:::-;6542:50;;6472:126;;;:::o;6604:149::-;6677:9;6710:37;6741:5;6710:37;:::i;:::-;6697:50;;6604:149;;;:::o;6759:177::-;6869:60;6923:5;6869:60;:::i;:::-;6864:3;6857:73;6759:177;;:::o;6942:268::-;7058:4;7096:2;7085:9;7081:18;7073:26;;7109:94;7200:1;7189:9;7185:17;7176:6;7109:94;:::i;:::-;6942:268;;;;:::o;7216:118::-;7303:24;7321:5;7303:24;:::i;:::-;7298:3;7291:37;7216:118;;:::o;7340:222::-;7433:4;7471:2;7460:9;7456:18;7448:26;;7484:71;7552:1;7541:9;7537:17;7528:6;7484:71;:::i;:::-;7340:222;;;;:::o;7568:77::-;7605:7;7634:5;7623:16;;7568:77;;;:::o;7651:122::-;7724:24;7742:5;7724:24;:::i;:::-;7717:5;7714:35;7704:63;;7763:1;7760;7753:12;7704:63;7651:122;:::o;7779:139::-;7825:5;7863:6;7850:20;7841:29;;7879:33;7906:5;7879:33;:::i;:::-;7779:139;;;;:::o;7924:474::-;7992:6;8000;8049:2;8037:9;8028:7;8024:23;8020:32;8017:119;;;8055:79;;:::i;:::-;8017:119;8175:1;8200:53;8245:7;8236:6;8225:9;8221:22;8200:53;:::i;:::-;8190:63;;8146:117;8302:2;8328:53;8373:7;8364:6;8353:9;8349:22;8328:53;:::i;:::-;8318:63;;8273:118;7924:474;;;;;:::o;8404:117::-;8513:1;8510;8503:12;8527:117;8636:1;8633;8626:12;8650:117;8759:1;8756;8749:12;8790:568;8863:8;8873:6;8923:3;8916:4;8908:6;8904:17;8900:27;8890:122;;8931:79;;:::i;:::-;8890:122;9044:6;9031:20;9021:30;;9074:18;9066:6;9063:30;9060:117;;;9096:79;;:::i;:::-;9060:117;9210:4;9202:6;9198:17;9186:29;;9264:3;9256:4;9248:6;9244:17;9234:8;9230:32;9227:41;9224:128;;;9271:79;;:::i;:::-;9224:128;8790:568;;;;;:::o;9364:559::-;9450:6;9458;9507:2;9495:9;9486:7;9482:23;9478:32;9475:119;;;9513:79;;:::i;:::-;9475:119;9661:1;9650:9;9646:17;9633:31;9691:18;9683:6;9680:30;9677:117;;;9713:79;;:::i;:::-;9677:117;9826:80;9898:7;9889:6;9878:9;9874:22;9826:80;:::i;:::-;9808:98;;;;9604:312;9364:559;;;;;:::o;9929:117::-;10038:1;10035;10028:12;10052:180;10100:77;10097:1;10090:88;10197:4;10194:1;10187:15;10221:4;10218:1;10211:15;10238:281;10321:27;10343:4;10321:27;:::i;:::-;10313:6;10309:40;10451:6;10439:10;10436:22;10415:18;10403:10;10400:34;10397:62;10394:88;;;10462:18;;:::i;:::-;10394:88;10502:10;10498:2;10491:22;10281:238;10238:281;;:::o;10525:129::-;10559:6;10586:20;;:::i;:::-;10576:30;;10615:33;10643:4;10635:6;10615:33;:::i;:::-;10525:129;;;:::o;10660:307::-;10721:4;10811:18;10803:6;10800:30;10797:56;;;10833:18;;:::i;:::-;10797:56;10871:29;10893:6;10871:29;:::i;:::-;10863:37;;10955:4;10949;10945:15;10937:23;;10660:307;;;:::o;10973:146::-;11070:6;11065:3;11060;11047:30;11111:1;11102:6;11097:3;11093:16;11086:27;10973:146;;;:::o;11125:423::-;11202:5;11227:65;11243:48;11284:6;11243:48;:::i;:::-;11227:65;:::i;:::-;11218:74;;11315:6;11308:5;11301:21;11353:4;11346:5;11342:16;11391:3;11382:6;11377:3;11373:16;11370:25;11367:112;;;11398:79;;:::i;:::-;11367:112;11488:54;11535:6;11530:3;11525;11488:54;:::i;:::-;11208:340;11125:423;;;;;:::o;11567:338::-;11622:5;11671:3;11664:4;11656:6;11652:17;11648:27;11638:122;;11679:79;;:::i;:::-;11638:122;11796:6;11783:20;11821:78;11895:3;11887:6;11880:4;11872:6;11868:17;11821:78;:::i;:::-;11812:87;;11628:277;11567:338;;;;:::o;11911:507::-;11979:6;12028:2;12016:9;12007:7;12003:23;11999:32;11996:119;;;12034:79;;:::i;:::-;11996:119;12182:1;12171:9;12167:17;12154:31;12212:18;12204:6;12201:30;12198:117;;;12234:79;;:::i;:::-;12198:117;12339:62;12393:7;12384:6;12373:9;12369:22;12339:62;:::i;:::-;12329:72;;12125:286;11911:507;;;;:::o;12424:104::-;12469:7;12498:24;12516:5;12498:24;:::i;:::-;12487:35;;12424:104;;;:::o;12534:142::-;12637:32;12663:5;12637:32;:::i;:::-;12632:3;12625:45;12534:142;;:::o;12682:254::-;12791:4;12829:2;12818:9;12814:18;12806:26;;12842:87;12926:1;12915:9;12911:17;12902:6;12842:87;:::i;:::-;12682:254;;;;:::o;12942:442::-;13091:4;13129:2;13118:9;13114:18;13106:26;;13142:71;13210:1;13199:9;13195:17;13186:6;13142:71;:::i;:::-;13223:72;13291:2;13280:9;13276:18;13267:6;13223:72;:::i;:::-;13305;13373:2;13362:9;13358:18;13349:6;13305:72;:::i;:::-;12942:442;;;;;;:::o;13390:474::-;13458:6;13466;13515:2;13503:9;13494:7;13490:23;13486:32;13483:119;;;13521:79;;:::i;:::-;13483:119;13641:1;13666:53;13711:7;13702:6;13691:9;13687:22;13666:53;:::i;:::-;13656:63;;13612:117;13768:2;13794:53;13839:7;13830:6;13819:9;13815:22;13794:53;:::i;:::-;13784:63;;13739:118;13390:474;;;;;:::o;13870:153::-;13947:9;13980:37;14011:5;13980:37;:::i;:::-;13967:50;;13870:153;;;:::o;14029:185::-;14143:64;14201:5;14143:64;:::i;:::-;14138:3;14131:77;14029:185;;:::o;14220:276::-;14340:4;14378:2;14367:9;14363:18;14355:26;;14391:98;14486:1;14475:9;14471:17;14462:6;14391:98;:::i;:::-;14220:276;;;;:::o;14502:180::-;14550:77;14547:1;14540:88;14647:4;14644:1;14637:15;14671:4;14668:1;14661:15;14688:320;14732:6;14769:1;14763:4;14759:12;14749:22;;14816:1;14810:4;14806:12;14837:18;14827:81;;14893:4;14885:6;14881:17;14871:27;;14827:81;14955:2;14947:6;14944:14;14924:18;14921:38;14918:84;;14974:18;;:::i;:::-;14918:84;14739:269;14688:320;;;:::o;15014:174::-;15154:26;15150:1;15142:6;15138:14;15131:50;15014:174;:::o;15194:366::-;15336:3;15357:67;15421:2;15416:3;15357:67;:::i;:::-;15350:74;;15433:93;15522:3;15433:93;:::i;:::-;15551:2;15546:3;15542:12;15535:19;;15194:366;;;:::o;15566:419::-;15732:4;15770:2;15759:9;15755:18;15747:26;;15819:9;15813:4;15809:20;15805:1;15794:9;15790:17;15783:47;15847:131;15973:4;15847:131;:::i;:::-;15839:139;;15566:419;;;:::o;15991:442::-;16140:4;16178:2;16167:9;16163:18;16155:26;;16191:71;16259:1;16248:9;16244:17;16235:6;16191:71;:::i;:::-;16272:72;16340:2;16329:9;16325:18;16316:6;16272:72;:::i;:::-;16354;16422:2;16411:9;16407:18;16398:6;16354:72;:::i;:::-;15991:442;;;;;;:::o;16439:172::-;16579:24;16575:1;16567:6;16563:14;16556:48;16439:172;:::o;16617:366::-;16759:3;16780:67;16844:2;16839:3;16780:67;:::i;:::-;16773:74;;16856:93;16945:3;16856:93;:::i;:::-;16974:2;16969:3;16965:12;16958:19;;16617:366;;;:::o;16989:419::-;17155:4;17193:2;17182:9;17178:18;17170:26;;17242:9;17236:4;17232:20;17228:1;17217:9;17213:17;17206:47;17270:131;17396:4;17270:131;:::i;:::-;17262:139;;16989:419;;;:::o;17414:168::-;17554:20;17550:1;17542:6;17538:14;17531:44;17414:168;:::o;17588:366::-;17730:3;17751:67;17815:2;17810:3;17751:67;:::i;:::-;17744:74;;17827:93;17916:3;17827:93;:::i;:::-;17945:2;17940:3;17936:12;17929:19;;17588:366;;;:::o;17960:419::-;18126:4;18164:2;18153:9;18149:18;18141:26;;18213:9;18207:4;18203:20;18199:1;18188:9;18184:17;18177:47;18241:131;18367:4;18241:131;:::i;:::-;18233:139;;17960:419;;;:::o;18385:553::-;18562:4;18600:3;18589:9;18585:19;18577:27;;18614:71;18682:1;18671:9;18667:17;18658:6;18614:71;:::i;:::-;18695:72;18763:2;18752:9;18748:18;18739:6;18695:72;:::i;:::-;18777;18845:2;18834:9;18830:18;18821:6;18777:72;:::i;:::-;18859;18927:2;18916:9;18912:18;18903:6;18859:72;:::i;:::-;18385:553;;;;;;;:::o;18944:228::-;19084:34;19080:1;19072:6;19068:14;19061:58;19153:11;19148:2;19140:6;19136:15;19129:36;18944:228;:::o;19178:366::-;19320:3;19341:67;19405:2;19400:3;19341:67;:::i;:::-;19334:74;;19417:93;19506:3;19417:93;:::i;:::-;19535:2;19530:3;19526:12;19519:19;;19178:366;;;:::o;19550:419::-;19716:4;19754:2;19743:9;19739:18;19731:26;;19803:9;19797:4;19793:20;19789:1;19778:9;19774:17;19767:47;19831:131;19957:4;19831:131;:::i;:::-;19823:139;;19550:419;;;:::o;19975:180::-;20023:77;20020:1;20013:88;20120:4;20117:1;20110:15;20144:4;20141:1;20134:15;20161:194;20201:4;20221:20;20239:1;20221:20;:::i;:::-;20216:25;;20255:20;20273:1;20255:20;:::i;:::-;20250:25;;20299:1;20296;20292:9;20284:17;;20323:1;20317:4;20314:11;20311:37;;;20328:18;;:::i;:::-;20311:37;20161:194;;;;:::o;20361:180::-;20501:32;20497:1;20489:6;20485:14;20478:56;20361:180;:::o;20547:366::-;20689:3;20710:67;20774:2;20769:3;20710:67;:::i;:::-;20703:74;;20786:93;20875:3;20786:93;:::i;:::-;20904:2;20899:3;20895:12;20888:19;;20547:366;;;:::o;20919:419::-;21085:4;21123:2;21112:9;21108:18;21100:26;;21172:9;21166:4;21162:20;21158:1;21147:9;21143:17;21136:47;21200:131;21326:4;21200:131;:::i;:::-;21192:139;;20919:419;;;:::o;21344:181::-;21484:33;21480:1;21472:6;21468:14;21461:57;21344:181;:::o;21531:366::-;21673:3;21694:67;21758:2;21753:3;21694:67;:::i;:::-;21687:74;;21770:93;21859:3;21770:93;:::i;:::-;21888:2;21883:3;21879:12;21872:19;;21531:366;;;:::o;21903:419::-;22069:4;22107:2;22096:9;22092:18;22084:26;;22156:9;22150:4;22146:20;22142:1;22131:9;22127:17;22120:47;22184:131;22310:4;22184:131;:::i;:::-;22176:139;;21903:419;;;:::o;22328:191::-;22368:3;22387:20;22405:1;22387:20;:::i;:::-;22382:25;;22421:20;22439:1;22421:20;:::i;:::-;22416:25;;22464:1;22461;22457:9;22450:16;;22485:3;22482:1;22479:10;22476:36;;;22492:18;;:::i;:::-;22476:36;22328:191;;;;:::o;22525:173::-;22665:25;22661:1;22653:6;22649:14;22642:49;22525:173;:::o;22704:366::-;22846:3;22867:67;22931:2;22926:3;22867:67;:::i;:::-;22860:74;;22943:93;23032:3;22943:93;:::i;:::-;23061:2;23056:3;23052:12;23045:19;;22704:366;;;:::o;23076:419::-;23242:4;23280:2;23269:9;23265:18;23257:26;;23329:9;23323:4;23319:20;23315:1;23304:9;23300:17;23293:47;23357:131;23483:4;23357:131;:::i;:::-;23349:139;;23076:419;;;:::o;23501:177::-;23641:29;23637:1;23629:6;23625:14;23618:53;23501:177;:::o;23684:366::-;23826:3;23847:67;23911:2;23906:3;23847:67;:::i;:::-;23840:74;;23923:93;24012:3;23923:93;:::i;:::-;24041:2;24036:3;24032:12;24025:19;;23684:366;;;:::o;24056:419::-;24222:4;24260:2;24249:9;24245:18;24237:26;;24309:9;24303:4;24299:20;24295:1;24284:9;24280:17;24273:47;24337:131;24463:4;24337:131;:::i;:::-;24329:139;;24056:419;;;:::o;24481:174::-;24621:26;24617:1;24609:6;24605:14;24598:50;24481:174;:::o;24661:366::-;24803:3;24824:67;24888:2;24883:3;24824:67;:::i;:::-;24817:74;;24900:93;24989:3;24900:93;:::i;:::-;25018:2;25013:3;25009:12;25002:19;;24661:366;;;:::o;25033:419::-;25199:4;25237:2;25226:9;25222:18;25214:26;;25286:9;25280:4;25276:20;25272:1;25261:9;25257:17;25250:47;25314:131;25440:4;25314:131;:::i;:::-;25306:139;;25033:419;;;:::o;25458:180::-;25506:77;25503:1;25496:88;25603:4;25600:1;25593:15;25627:4;25624:1;25617:15;25644:185;25684:1;25701:20;25719:1;25701:20;:::i;:::-;25696:25;;25735:20;25753:1;25735:20;:::i;:::-;25730:25;;25774:1;25764:35;;25779:18;;:::i;:::-;25764:35;25821:1;25818;25814:9;25809:14;;25644:185;;;;:::o;25835:165::-;25975:17;25971:1;25963:6;25959:14;25952:41;25835:165;:::o;26006:366::-;26148:3;26169:67;26233:2;26228:3;26169:67;:::i;:::-;26162:74;;26245:93;26334:3;26245:93;:::i;:::-;26363:2;26358:3;26354:12;26347:19;;26006:366;;;:::o;26378:419::-;26544:4;26582:2;26571:9;26567:18;26559:26;;26631:9;26625:4;26621:20;26617:1;26606:9;26602:17;26595:47;26659:131;26785:4;26659:131;:::i;:::-;26651:139;;26378:419;;;:::o;26803:174::-;26943:26;26939:1;26931:6;26927:14;26920:50;26803:174;:::o;26983:366::-;27125:3;27146:67;27210:2;27205:3;27146:67;:::i;:::-;27139:74;;27222:93;27311:3;27222:93;:::i;:::-;27340:2;27335:3;27331:12;27324:19;;26983:366;;;:::o;27355:419::-;27521:4;27559:2;27548:9;27544:18;27536:26;;27608:9;27602:4;27598:20;27594:1;27583:9;27579:17;27572:47;27636:131;27762:4;27636:131;:::i;:::-;27628:139;;27355:419;;;:::o;27780:418::-;27917:4;27955:2;27944:9;27940:18;27932:26;;27968:71;28036:1;28025:9;28021:17;28012:6;27968:71;:::i;:::-;28049:66;28111:2;28100:9;28096:18;28087:6;28049:66;:::i;:::-;28125;28187:2;28176:9;28172:18;28163:6;28125:66;:::i;:::-;27780:418;;;;;;:::o;28204:180::-;28344:32;28340:1;28332:6;28328:14;28321:56;28204:180;:::o;28390:366::-;28532:3;28553:67;28617:2;28612:3;28553:67;:::i;:::-;28546:74;;28629:93;28718:3;28629:93;:::i;:::-;28747:2;28742:3;28738:12;28731:19;;28390:366;;;:::o;28762:419::-;28928:4;28966:2;28955:9;28951:18;28943:26;;29015:9;29009:4;29005:20;29001:1;28990:9;28986:17;28979:47;29043:131;29169:4;29043:131;:::i;:::-;29035:139;;28762:419;;;:::o;29187:173::-;29327:25;29323:1;29315:6;29311:14;29304:49;29187:173;:::o;29366:366::-;29508:3;29529:67;29593:2;29588:3;29529:67;:::i;:::-;29522:74;;29605:93;29694:3;29605:93;:::i;:::-;29723:2;29718:3;29714:12;29707:19;;29366:366;;;:::o;29738:419::-;29904:4;29942:2;29931:9;29927:18;29919:26;;29991:9;29985:4;29981:20;29977:1;29966:9;29962:17;29955:47;30019:131;30145:4;30019:131;:::i;:::-;30011:139;;29738:419;;;:::o;30163:180::-;30211:77;30208:1;30201:88;30308:4;30305:1;30298:15;30332:4;30329:1;30322:15;30349:233;30388:3;30411:24;30429:5;30411:24;:::i;:::-;30402:33;;30457:66;30450:5;30447:77;30444:103;;30527:18;;:::i;:::-;30444:103;30574:1;30567:5;30563:13;30556:20;;30349:233;;;:::o;30588:225::-;30728:34;30724:1;30716:6;30712:14;30705:58;30797:8;30792:2;30784:6;30780:15;30773:33;30588:225;:::o;30819:366::-;30961:3;30982:67;31046:2;31041:3;30982:67;:::i;:::-;30975:74;;31058:93;31147:3;31058:93;:::i;:::-;31176:2;31171:3;31167:12;31160:19;;30819:366;;;:::o;31191:419::-;31357:4;31395:2;31384:9;31380:18;31372:26;;31444:9;31438:4;31434:20;31430:1;31419:9;31415:17;31408:47;31472:131;31598:4;31472:131;:::i;:::-;31464:139;;31191:419;;;:::o;31616:178::-;31756:30;31752:1;31744:6;31740:14;31733:54;31616:178;:::o;31800:366::-;31942:3;31963:67;32027:2;32022:3;31963:67;:::i;:::-;31956:74;;32039:93;32128:3;32039:93;:::i;:::-;32157:2;32152:3;32148:12;32141:19;;31800:366;;;:::o;32172:419::-;32338:4;32376:2;32365:9;32361:18;32353:26;;32425:9;32419:4;32415:20;32411:1;32400:9;32396:17;32389:47;32453:131;32579:4;32453:131;:::i;:::-;32445:139;;32172:419;;;:::o;32597:179::-;32737:31;32733:1;32725:6;32721:14;32714:55;32597:179;:::o;32782:366::-;32924:3;32945:67;33009:2;33004:3;32945:67;:::i;:::-;32938:74;;33021:93;33110:3;33021:93;:::i;:::-;33139:2;33134:3;33130:12;33123:19;;32782:366;;;:::o;33154:419::-;33320:4;33358:2;33347:9;33343:18;33335:26;;33407:9;33401:4;33397:20;33393:1;33382:9;33378:17;33371:47;33435:131;33561:4;33435:131;:::i;:::-;33427:139;;33154:419;;;:::o;33579:175::-;33719:27;33715:1;33707:6;33703:14;33696:51;33579:175;:::o;33760:366::-;33902:3;33923:67;33987:2;33982:3;33923:67;:::i;:::-;33916:74;;33999:93;34088:3;33999:93;:::i;:::-;34117:2;34112:3;34108:12;34101:19;;33760:366;;;:::o;34132:419::-;34298:4;34336:2;34325:9;34321:18;34313:26;;34385:9;34379:4;34375:20;34371:1;34360:9;34356:17;34349:47;34413:131;34539:4;34413:131;:::i;:::-;34405:139;;34132:419;;;:::o;34557:169::-;34697:21;34693:1;34685:6;34681:14;34674:45;34557:169;:::o;34732:366::-;34874:3;34895:67;34959:2;34954:3;34895:67;:::i;:::-;34888:74;;34971:93;35060:3;34971:93;:::i;:::-;35089:2;35084:3;35080:12;35073:19;;34732:366;;;:::o;35104:419::-;35270:4;35308:2;35297:9;35293:18;35285:26;;35357:9;35351:4;35347:20;35343:1;35332:9;35328:17;35321:47;35385:131;35511:4;35385:131;:::i;:::-;35377:139;;35104:419;;;:::o;35529:182::-;35669:34;35665:1;35657:6;35653:14;35646:58;35529:182;:::o;35717:366::-;35859:3;35880:67;35944:2;35939:3;35880:67;:::i;:::-;35873:74;;35956:93;36045:3;35956:93;:::i;:::-;36074:2;36069:3;36065:12;36058:19;;35717:366;;;:::o;36089:419::-;36255:4;36293:2;36282:9;36278:18;36270:26;;36342:9;36336:4;36332:20;36328:1;36317:9;36313:17;36306:47;36370:131;36496:4;36370:131;:::i;:::-;36362:139;;36089:419;;;:::o;36514:178::-;36654:30;36650:1;36642:6;36638:14;36631:54;36514:178;:::o;36698:366::-;36840:3;36861:67;36925:2;36920:3;36861:67;:::i;:::-;36854:74;;36937:93;37026:3;36937:93;:::i;:::-;37055:2;37050:3;37046:12;37039:19;;36698:366;;;:::o;37070:419::-;37236:4;37274:2;37263:9;37259:18;37251:26;;37323:9;37317:4;37313:20;37309:1;37298:9;37294:17;37287:47;37351:131;37477:4;37351:131;:::i;:::-;37343:139;;37070:419;;;:::o;37495:225::-;37635:34;37631:1;37623:6;37619:14;37612:58;37704:8;37699:2;37691:6;37687:15;37680:33;37495:225;:::o;37726:366::-;37868:3;37889:67;37953:2;37948:3;37889:67;:::i;:::-;37882:74;;37965:93;38054:3;37965:93;:::i;:::-;38083:2;38078:3;38074:12;38067:19;;37726:366;;;:::o;38098:419::-;38264:4;38302:2;38291:9;38287:18;38279:26;;38351:9;38345:4;38341:20;38337:1;38326:9;38322:17;38315:47;38379:131;38505:4;38379:131;:::i;:::-;38371:139;;38098:419;;;:::o;38523:182::-;38663:34;38659:1;38651:6;38647:14;38640:58;38523:182;:::o;38711:366::-;38853:3;38874:67;38938:2;38933:3;38874:67;:::i;:::-;38867:74;;38950:93;39039:3;38950:93;:::i;:::-;39068:2;39063:3;39059:12;39052:19;;38711:366;;;:::o;39083:419::-;39249:4;39287:2;39276:9;39272:18;39264:26;;39336:9;39330:4;39326:20;39322:1;39311:9;39307:17;39300:47;39364:131;39490:4;39364:131;:::i;:::-;39356:139;;39083:419;;;:::o;39508:410::-;39548:7;39571:20;39589:1;39571:20;:::i;:::-;39566:25;;39605:20;39623:1;39605:20;:::i;:::-;39600:25;;39660:1;39657;39653:9;39682:30;39700:11;39682:30;:::i;:::-;39671:41;;39861:1;39852:7;39848:15;39845:1;39842:22;39822:1;39815:9;39795:83;39772:139;;39891:18;;:::i;:::-;39772:139;39556:362;39508:410;;;;:::o;39924:332::-;40045:4;40083:2;40072:9;40068:18;40060:26;;40096:71;40164:1;40153:9;40149:17;40140:6;40096:71;:::i;:::-;40177:72;40245:2;40234:9;40230:18;40221:6;40177:72;:::i;:::-;39924:332;;;;;:::o;40262:85::-;40307:7;40336:5;40325:16;;40262:85;;;:::o;40353:158::-;40411:9;40444:61;40462:42;40471:32;40497:5;40471:32;:::i;:::-;40462:42;:::i;:::-;40444:61;:::i;:::-;40431:74;;40353:158;;;:::o;40517:147::-;40612:45;40651:5;40612:45;:::i;:::-;40607:3;40600:58;40517:147;;:::o;40670:114::-;40737:6;40771:5;40765:12;40755:22;;40670:114;;;:::o;40790:184::-;40889:11;40923:6;40918:3;40911:19;40963:4;40958:3;40954:14;40939:29;;40790:184;;;;:::o;40980:132::-;41047:4;41070:3;41062:11;;41100:4;41095:3;41091:14;41083:22;;40980:132;;;:::o;41118:108::-;41195:24;41213:5;41195:24;:::i;:::-;41190:3;41183:37;41118:108;;:::o;41232:179::-;41301:10;41322:46;41364:3;41356:6;41322:46;:::i;:::-;41400:4;41395:3;41391:14;41377:28;;41232:179;;;;:::o;41417:113::-;41487:4;41519;41514:3;41510:14;41502:22;;41417:113;;;:::o;41566:732::-;41685:3;41714:54;41762:5;41714:54;:::i;:::-;41784:86;41863:6;41858:3;41784:86;:::i;:::-;41777:93;;41894:56;41944:5;41894:56;:::i;:::-;41973:7;42004:1;41989:284;42014:6;42011:1;42008:13;41989:284;;;42090:6;42084:13;42117:63;42176:3;42161:13;42117:63;:::i;:::-;42110:70;;42203:60;42256:6;42203:60;:::i;:::-;42193:70;;42049:224;42036:1;42033;42029:9;42024:14;;41989:284;;;41993:14;42289:3;42282:10;;41690:608;;;41566:732;;;;:::o;42304:134::-;42362:9;42395:37;42426:5;42395:37;:::i;:::-;42382:50;;42304:134;;;:::o;42444:147::-;42539:45;42578:5;42539:45;:::i;:::-;42534:3;42527:58;42444:147;;:::o;42597:847::-;42868:4;42906:3;42895:9;42891:19;42883:27;;42920:71;42988:1;42977:9;42973:17;42964:6;42920:71;:::i;:::-;43001:80;43077:2;43066:9;43062:18;43053:6;43001:80;:::i;:::-;43128:9;43122:4;43118:20;43113:2;43102:9;43098:18;43091:48;43156:108;43259:4;43250:6;43156:108;:::i;:::-;43148:116;;43274:80;43350:2;43339:9;43335:18;43326:6;43274:80;:::i;:::-;43364:73;43432:3;43421:9;43417:19;43408:6;43364:73;:::i;:::-;42597:847;;;;;;;;:::o;43450:225::-;43590:34;43586:1;43578:6;43574:14;43567:58;43659:8;43654:2;43646:6;43642:15;43635:33;43450:225;:::o;43681:366::-;43823:3;43844:67;43908:2;43903:3;43844:67;:::i;:::-;43837:74;;43920:93;44009:3;43920:93;:::i;:::-;44038:2;44033:3;44029:12;44022:19;;43681:366;;;:::o;44053:419::-;44219:4;44257:2;44246:9;44242:18;44234:26;;44306:9;44300:4;44296:20;44292:1;44281:9;44277:17;44270:47;44334:131;44460:4;44334:131;:::i;:::-;44326:139;;44053:419;;;:::o;44478:226::-;44618:34;44614:1;44606:6;44602:14;44595:58;44687:9;44682:2;44674:6;44670:15;44663:34;44478:226;:::o;44710:366::-;44852:3;44873:67;44937:2;44932:3;44873:67;:::i;:::-;44866:74;;44949:93;45038:3;44949:93;:::i;:::-;45067:2;45062:3;45058:12;45051:19;;44710:366;;;:::o;45082:419::-;45248:4;45286:2;45275:9;45271:18;45263:26;;45335:9;45329:4;45325:20;45321:1;45310:9;45306:17;45299:47;45363:131;45489:4;45363:131;:::i;:::-;45355:139;;45082:419;;;:::o

Swarm Source

ipfs://416b2d3ee07bbd75200b7a187eb286a4bbbe9f27e7fde39157299261ca31daf7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.