false
false

Contract Address Details

0x94f557dddb245b11d031f57ba7f2c4f28c4a203e

Contract Name
Diamond
Creator
0x453d39–348393 at 0xca5020–423191
Implementation
0xad99bce30fb071f08e40ac77ea2fb741180216ca
Balance
9.66083007186908 Xai ( )
Tokens
Fetching tokens...
Transactions
36,402 Transactions
Transfers
183,240 Transfers
Gas Used
5,319,263,933
Last Balance Update
39628076
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x699fbe944ded6811d407e928ab91896712248f5a.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
Diamond




Optimization enabled
true
Compiler version
v0.8.19+commit.7dd6d404




Optimization runs
999999
Verified at
2024-05-20T18:42:00.058934Z

lib/@lagunagames/lg-diamond-template/src/diamond/LGDiamond.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

// Adapted from the Diamond 3 reference implementation by Nick Mudge:
// https://github.com/mudgen/diamond-3-hardhat

import {IDiamondCut} from '../interfaces/IDiamondCut.sol';
import {LibContractOwner} from '../libraries/LibContractOwner.sol';
import {LibDiamond} from '../libraries/LibDiamond.sol';

contract Diamond {
    error FunctionDoesNotExist(bytes4 methodSelector);
    error DiamondAlreadyInitialized();

    constructor(address diamondCutFacet) payable {
        initializeDiamond(diamondCutFacet);
    }

    // Find facet for function that is called and execute the
    // function if a facet is found and return any value.
    fallback() external payable {
        /* solhint-disable no-inline-assembly */
        // get facet from function selector
        address facet = LibDiamond.diamondStorage().selectorToFacetAndPosition[msg.sig].facetAddress;
        if (facet == address(0)) revert FunctionDoesNotExist(msg.sig);
        // Execute external function from facet using delegatecall and return any value.
        assembly {
            // copy function selector and any arguments
            calldatacopy(0, 0, calldatasize())
            // execute function call using the facet
            let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)
            // get any return value
            returndatacopy(0, 0, returndatasize())
            // return any return value or error back to the caller
            switch result
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
        /* solhint-enable no-inline-assembly */
    }

    /// @notice Initializes the diamond, by adding the `diamondCut` method and setting the owner.
    /// @dev This function is automatically called by the constructor.
    /// @dev The code is separated out to facilitate on-chain copying utilities.
    function initializeDiamond(address diamondCutFacet) public {
        LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage();
        if (ds.initialized) revert DiamondAlreadyInitialized();

        // Attach the diamondCut function from the diamondCutFacet
        IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1);
        cut[0] = IDiamondCut.FacetCut({
            facetAddress: diamondCutFacet,
            action: IDiamondCut.FacetCutAction.Add,
            functionSelectors: new bytes4[](1)
        });
        cut[0].functionSelectors[0] = IDiamondCut.diamondCut.selector;

        LibDiamond.diamondCut(cut);

        //  When deployed from an EOA this will be the owner wallet,
        //  when deployed from the clone function, the copier contract will be the owner.
        LibContractOwner.setContractOwner(msg.sender);

        ds.initialized = true;
    }

    receive() external payable {}
}
        

lib/@lagunagames/lg-diamond-template/src/interfaces/IDiamondCut.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.19;

/******************************************************************************\
* Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/

interface IDiamondCut {
    enum FacetCutAction {
        Add,
        Replace,
        Remove
    }
    // Add=0, Replace=1, Remove=2

    struct FacetCut {
        address facetAddress;
        FacetCutAction action;
        bytes4[] functionSelectors;
    }

    /// @notice Add/replace/remove any number of functions and optionally execute
    ///         a function with delegatecall
    /// @param _diamondCut Contains the facet addresses and function selectors
    /// @param _init The address of the contract or facet to execute _calldata
    /// @param _calldata A function call, including function selector and arguments
    ///                  _calldata is executed with delegatecall on _init
    function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external;

    event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}
          

lib/@lagunagames/lg-diamond-template/src/libraries/LibContractOwner.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

/// @title Library for the common LG implementation of ERC-173 Contract Ownership Standard
/// @author [email protected]
/// @custom:storage-location erc1967:eip1967.proxy.admin
library LibContractOwner {
    error CallerIsNotContractOwner();

    /// @notice This emits when ownership of a contract changes.
    /// @dev ERC-173
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @notice Emitted when the admin account has changed.
    /// @dev ERC-1967
    event AdminChanged(address previousAdmin, address newAdmin);

    //  @dev Standard storage slot for the ERC-1967 admin address
    //  @dev bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)
    bytes32 private constant ADMIN_SLOT_POSITION = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;

    struct LibOwnerStorage {
        address contractOwner;
    }

    /// @notice Storage slot for Contract Owner state data
    function ownerStorage() internal pure returns (LibOwnerStorage storage storageSlot) {
        bytes32 position = ADMIN_SLOT_POSITION;

        // solhint-disable-next-line no-inline-assembly
        assembly {
            storageSlot.slot := position
        }
    }

    /// @notice Sets the contract owner
    /// @param newOwner The new owner
    /// @custom:emits OwnershipTransferred
    function setContractOwner(address newOwner) internal {
        LibOwnerStorage storage ls = ownerStorage();
        address previousOwner = ls.contractOwner;
        ls.contractOwner = newOwner;
        emit OwnershipTransferred(previousOwner, newOwner);
        emit AdminChanged(previousOwner, newOwner);
    }

    /// @notice Gets the contract owner wallet
    /// @return owner The contract owner
    function contractOwner() internal view returns (address owner) {
        owner = ownerStorage().contractOwner;
    }

    /// @notice Ensures that the caller is the contract owner, or throws an error.
    /// @custom:throws LibAccess: Must be contract owner
    function enforceIsContractOwner() internal view {
        if (msg.sender != ownerStorage().contractOwner) revert CallerIsNotContractOwner();
    }
}
          

lib/@lagunagames/lg-diamond-template/src/libraries/LibDiamond.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import {IDiamondCut} from '../interfaces/IDiamondCut.sol';
import {LibContractOwner} from './LibContractOwner.sol';

/// @title LibDiamond
/// @notice Library for the common LG implementation of ERC-2535 Diamond Proxy
/// @notice Adapted from the Diamond 3 reference implementation by Nick Mudge:
/// @notice https://github.com/mudgen/diamond-3-hardhat
/// @custom:storage-location erc2535:diamond.standard.diamond.storage
library LibDiamond {
    error InvalidFacetCutAction(IDiamondCut.FacetCutAction action);

    /// @notice Emitted when facets are added or removed
    /// @dev ERC-2535
    event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);

    //  @dev Standard storage slot for the ERC-2535 Diamond storage
    //  @dev keccak256('diamond.standard.diamond.storage')
    bytes32 internal constant DIAMOND_STORAGE_POSITION =
        0xc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c;

    struct FacetAddressAndPosition {
        address facetAddress;
        uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
    }

    struct FacetFunctionSelectors {
        bytes4[] functionSelectors;
        uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
    }

    struct DiamondStorage {
        // maps function selector to the facet address and
        // the position of the selector in the facetFunctionSelectors.selectors array
        mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
        // maps facet addresses to function selectors
        mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
        // facet addresses
        address[] facetAddresses;
        // true if the diamond has been initialized
        bool initialized; //  THIS IS ONLY SET BY THE DIAMOND CONSTRUCTOR!
    }

    /// @notice Storage slot for Diamond storage
    function diamondStorage() internal pure returns (DiamondStorage storage ds) {
        bytes32 position = DIAMOND_STORAGE_POSITION;
        assembly {
            ds.slot := position
        }
    }

    /// @notice Ensures that the caller is the contract owner, or throws an error.
    /// @dev Passthrough to LibContractOwner.enforceIsContractOwner()
    /// @custom:throws LibAccess: Must be contract owner
    function enforceIsContractOwner() internal view {
        LibContractOwner.enforceIsContractOwner();
    }

    // Internal function version of diamondCut
    function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut) internal {
        for (uint256 facetIndex; facetIndex < _diamondCut.length; ++facetIndex) {
            IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
            if (action == IDiamondCut.FacetCutAction.Add) {
                addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
            } else if (action == IDiamondCut.FacetCutAction.Replace) {
                replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
            } else if (action == IDiamondCut.FacetCutAction.Remove) {
                removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
            } else {
                revert InvalidFacetCutAction(action);
            }
        }
        emit DiamondCut(_diamondCut, address(0), '');
    }

    function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
        require(_functionSelectors.length > 0, 'LibDiamondCut: No selectors in facet to cut');
        DiamondStorage storage ds = diamondStorage();
        require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
        uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
        // add new facet address if it does not exist
        if (selectorPosition == 0) {
            addFacet(ds, _facetAddress);
        }
        for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; ++selectorIndex) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
            require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists");
            addFunction(ds, selector, selectorPosition, _facetAddress);
            ++selectorPosition;
        }
    }

    function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
        require(_functionSelectors.length > 0, 'LibDiamondCut: No selectors in facet to cut');
        DiamondStorage storage ds = diamondStorage();
        require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
        uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
        // add new facet address if it does not exist
        if (selectorPosition == 0) {
            addFacet(ds, _facetAddress);
        }
        for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; ++selectorIndex) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
            require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function");
            removeFunction(ds, oldFacetAddress, selector);
            addFunction(ds, selector, selectorPosition, _facetAddress);
            ++selectorPosition;
        }
    }

    function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
        require(_functionSelectors.length > 0, 'LibDiamondCut: No selectors in facet to cut');
        DiamondStorage storage ds = diamondStorage();
        // if function does not exist then do nothing and return
        require(_facetAddress == address(0), 'LibDiamondCut: Remove facet address must be address(0)');
        for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; ++selectorIndex) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
            removeFunction(ds, oldFacetAddress, selector);
        }
    }

    function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
        enforceHasContractCode(_facetAddress, 'LibDiamondCut: New facet has no code');
        ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length;
        ds.facetAddresses.push(_facetAddress);
    }

    function addFunction(
        DiamondStorage storage ds,
        bytes4 _selector,
        uint96 _selectorPosition,
        address _facetAddress
    ) internal {
        ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;
        ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
        ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
    }

    function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal {
        require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist");
        // an immutable function is a function defined directly in a diamond
        require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function");
        // replace selector with last selector, then delete last selector
        uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;
        uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;
        // if not the same then replace _selector with lastSelector
        if (selectorPosition != lastSelectorPosition) {
            bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];
            ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;
            ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition);
        }
        // delete the last selector
        ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
        delete ds.selectorToFacetAndPosition[_selector];

        // if no more selectors for facet address then delete the facet address
        if (lastSelectorPosition == 0) {
            // replace facet address with last facet address and delete last facet address
            uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
            uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
            if (facetAddressPosition != lastFacetAddressPosition) {
                address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
                ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition;
            }
            ds.facetAddresses.pop();
            delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
        }
    }

    function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {
        uint256 contractSize;
        assembly {
            contractSize := extcodesize(_contract)
        }
        require(contractSize > 0, _errorMessage);
    }
}
          

Compiler Settings

{"viaIR":true,"remappings":["ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/"],"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":999999,"enabled":true,"details":{"yulDetails":{"stackAllocation":true,"optimizerSteps":"dhfoDgvulfnTUtnIf"},"yul":true,"peephole":true,"inliner":true,"deduplicate":true,"cse":true}},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"payable","inputs":[{"type":"address","name":"diamondCutFacet","internalType":"address"}]},{"type":"error","name":"DiamondAlreadyInitialized","inputs":[]},{"type":"error","name":"FunctionDoesNotExist","inputs":[{"type":"bytes4","name":"methodSelector","internalType":"bytes4"}]},{"type":"error","name":"InvalidFacetCutAction","inputs":[{"type":"uint8","name":"action","internalType":"enum IDiamondCut.FacetCutAction"}]},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initializeDiamond","inputs":[{"type":"address","name":"diamondCutFacet","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60806040526200001862000012620000cd565b620000f0565b604051611a706200167d8239611a7090f35b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200006257604052565b6200002a565b906200007f6200007760405190565b928362000040565b565b6001600160a01b031690565b90565b6001600160a01b03811603620000a257565b600080fd5b905051906200007f8262000090565b90602082820312620000a2576200008d91620000a7565b6200008d620030ed80380380620000e48162000068565b928339810190620000b6565b6200007f9062000293565b6200008d6200008d6200008d9290565b6001600160401b038111620000625760208091020190565b906200013962000133836200010b565b62000068565b918252565b6200008d606062000068565b620001546200013e565b600080825260208201526060604082015290565b6200008d6200014a565b60005b8281106200018257505050565b6020906200018f62000168565b818401520162000175565b906200007f620001b5620001ae8462000123565b936200010b565b601f19016020840162000172565b369037565b906200007f620001dc620001ae8462000123565b601f190160208401620001c3565b9052565b634e487b7160e01b600052602160045260246000fd5b600311156200020f57565b620001ee565b906200007f8262000204565b90620001ea9062000215565b634e487b7160e01b600052603260045260246000fd5b906200024d825190565b8110156200025f576020809102010190565b6200022d565b9060ff905b9181191691161790565b90620002876200008d6200028f92151590565b825462000265565b9055565b60036200029f62000547565b0190620002ad825460ff1690565b620003ae576200007f916200039d60019262000397620002cd85620000fb565b620002d8816200019a565b926200031f620002ea600093620001c8565b62000309620002f86200013e565b6001600160a01b0390941685850152565b62000318846020850162000221565b6040830152565b620003356200032e83620000fb565b8562000243565b526200034c6200034582620000fb565b8462000243565b506307e4c70760e21b906200038890620003816040620003776200037084620000fb565b8862000243565b51015191620000fb565b9062000243565b906001600160e01b0319169052565b62000739565b620003a83362000436565b62000274565b604051639289b96160e01b8152600490fd5b0390fd5b906001600160a01b03906200026a565b6200008d9062000081906001600160a01b031682565b6200008d90620003d4565b6200008d90620003ea565b90620004146200008d6200028f92620003f5565b8254620003c4565b6001600160a01b0391821681529116602082015260400190565b60006200044262000512565b019062000462816200045b84546001600160a01b031690565b9362000400565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06200048e83620003f5565b6200049983620003f5565b91620004a460405190565b600090a37f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91620004e2620004d860405190565b928392836200041c565b0390a1565b6200008d7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103620000fb565b6200008d620004e7565b6200008d7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c620000fb565b6200008d6200051c565b634e487b7160e01b600052601160045260246000fd5b6000198114620005775760010190565b62000551565b6200008d905162000215565b6200008d9062000215565b620001ea9062000589565b6020810192916200007f919062000594565b620000816200008d6200008d9290565b6200008d90620005b1565b0190565b90620005f3620005ec620005e2845190565b8084529260200190565b9260200190565b9060005b818110620006055750505090565b9091926200062e6200062760019286516001600160e01b031916815260200190565b9460200190565b929101620005f7565b80516001600160a01b031682526200008d916060810191604090620006656020820151602085019062000594565b0151906040818403910152620005d0565b906200008d9162000637565b906200069a62000690835190565b8083529160200190565b9081620006ad6020830284019460200190565b926000915b838310620006c257505050505090565b90919293946020620006e8620006e18385600195038752895162000676565b9760200190565b9301930191939290620006b2565b60608082526200008d9392620007279162000715919084019062000682565b6001600160a01b039093166020830152565b60408183039101526000815260200190565b9060005b6200074a6200008d845190565b8110156200089f576200076c602062000764838662000243565b51016200057d565b6000906200077a8262000215565b620007858262000215565b03620007d9575090620007cd620007b5620007d393620007a6848862000243565b5101516001600160a01b031690565b6040620007c3848862000243565b5101519062000a82565b62000567565b6200073d565b620007e5600162000215565b620007f08262000215565b0362000829575090620007cd62000811620007d393620007a6848862000243565b60406200081f848862000243565b5101519062000c68565b62000835600262000215565b620008408262000215565b0362000879575090620007cd62000861620007d393620007a6848862000243565b60406200086f848862000243565b5101519062000df7565b620003c0906200088860405190565b6332191c2960e01b8152918291600483016200059f565b5090620008ad6000620005c1565b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67391620004e2620008dd60405190565b92839283620006f6565b15620008ef57565b60405162461bcd60e51b815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201526a1858d95d081d1bc818dd5d60aa1b6064820152608490fd5b156200095057565b60405162461bcd60e51b815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201526b65206164647265737328302960a01b6064820152608490fd5b90620009b690620003f5565b600052602052604060002090565b620009d46200008d6200008d9290565b6001600160601b031690565b906001600160e01b031916620009b6565b15620009f957565b60405162461bcd60e51b815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c72656164792065786973747300000000000000000000006064820152608490fd5b6001600160601b03166001600160601b038114620005775760010190565b919062000a8d815190565b62000aae60009162000aa762000aa384620000fb565b9190565b11620008e7565b62000ab862000547565b62000ac382620005c1565b62000ae46001600160a01b0382166001600160a01b0388165b141562000948565b62000b0762000b018462000afc8960018701620009aa565b015490565b620009c4565b938462000b2562000b1886620009c4565b916001600160601b031690565b1462000be3575b6000945b62000b3d6200008d835190565b86101562000bd95762000bcb8162000bc58a62000bd2948962000bbe62000b9b8262000b8d8f62000b838f9162000b75908f62000243565b516001600160e01b03191690565b95869101620009e0565b01546001600160a01b031690565b62000bb76001600160a01b038c165b916001600160a01b031690565b14620009f1565b89620010fe565b62000a64565b9562000567565b9462000b30565b5050505050509050565b62000bef878462000fc8565b62000b2c565b1562000bfd57565b60405162461bcd60e51b815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e00000000000000006064820152608490fd5b815191929162000c8360009162000aa762000aa384620000fb565b62000c8d62000547565b9062000cb162000ca16200008183620005c1565b6001600160a01b03851662000adc565b62000cc962000b018262000afc8660018701620009aa565b948562000cda62000b1884620009c4565b1462000d72575b6000955b62000cf26200008d835190565b87101562000d695762000d5b8162000bc58762000d62948762000bbe8a62000d348f62000b8d62000d2962000b7587938f62000243565b8096819501620009e0565b62000d546001600160a01b0387166001600160a01b038316141562000bf5565b8c620013a2565b9662000567565b9562000ce5565b50505050509050565b62000d7e848462000fc8565b62000ce1565b1562000d8c57565b60405162461bcd60e51b815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d7573742062652061646472657373283029000000000000000000006064820152608490fd5b8151600093929062000e129062000aa762000aa387620000fb565b62000e3b62000e2062000547565b9262000e3462000baa6200008188620005c1565b1462000d84565b60005b62000e4b6200008d835190565b81101562000e8c5780620007cd62000e6c62000b7562000e86948662000243565b62000e7f8862000b8d83828a01620009e0565b86620013a2565b62000e3e565b5050509050565b6001600160401b0381116200006257602090601f01601f19160190565b9062000139620001338362000e93565b62000ecc602462000eb0565b7f4c69624469616d6f6e644375743a204e657720666163657420686173206e6f20602082015263636f646560e01b604082015290565b6200008d62000ec0565b90600019906200026a565b9062000f2b6200008d6200028f92620000fb565b825462000f0c565b80548210156200025f5762000f4f600191600052602060002090565b91020190600090565b916001600160a01b0360089290920291821b911b6200026a565b921b90565b919062000f8c6200008d6200028f93620003f5565b90835462000f58565b908154916801000000000000000083101562000062578262000fc19160016200007f9501815562000f33565b9062000f77565b90620010106200007f9262000fe762000fe062000f02565b846200165e565b6200008d6002820191600162001009868262001001875490565b9401620009aa565b0162000f17565b62000f95565b906001600160a01b03199060a01b6200026a565b6200008d90620009d4906001600160601b031682565b90620010546200008d6200028f926200102a565b825462001016565b80549192918310156200025f5760086200107d600492600052602060002090565b8185040193060290565b919060086200026a91029162000f7263ffffffff841b90565b9190620010c2620010bc6200028f936001600160e01b03191690565b60e01c90565b90835462001087565b9081549168010000000000000000831015620000625782620010f79160016200007f950181556200105c565b90620010a0565b818493620011466000946200114086620005cc6200007f9a60016200114c99620011398582019986620011328a8d620009e0565b0162001040565b01620009aa565b620010cb565b620009e0565b0162000400565b156200115b57565b60405162461bcd60e51b815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e27742065786973740000000000000000006064820152608490fd5b15620011ce57565b60405162461bcd60e51b815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201526d3a30b1363290333ab731ba34b7b760911b6064820152608490fd5b6200008d9060a01c620009d4565b6200008d90546200122a565b6200008d9081906001600160601b031681565b919082039182116200057757565b6200008d916008021c60e01b90565b906200008d915462001265565b634e487b7160e01b600052603160045260246000fd5b6200007f91600091620010a0565b80548015620012cd576000190190620012ca620012c383836200105c565b9062001297565b55565b62001281565b634e487b7160e01b600052600060045260246000fd5b90600003620012f85760009055565b620012d3565b6200008d9081565b6200008d9054620012fe565b6200008d916008021c62000081565b906200008d915462001312565b6200007f9160009162000f77565b80548015620012cd576000190190620012ca6200135a838362000f33565b906200132e565b9160001960089290920291821b911b6200026a565b91906200138b6200008d6200028f93620000fb565b90835462001361565b6200007f9160009162001376565b620014569092919283600093620013d3620013c16200008187620005c1565b6001600160a01b038416141562001153565b620013f8620013e66200008130620003f5565b6001600160a01b0384161415620011c6565b6200148f8562001489818601936200142762001421846200141a8489620009e0565b0162001238565b62001244565b946200143c8462000afc8960018c01620009aa565b87858a60019c8d946200144f86620000fb565b9062001257565b809a620014608290565b81036200155f575b50506200148392506200114693620005cc91019e8f620009aa565b620012a5565b620012e9565b6200149e62000aa386620000fb565b14620014ac575b5050505050565b6200151494620015076200150160026200150d9501620014d9620014ce825490565b6200144f89620000fb565b620014f188620014ea8888620009aa565b0162001306565b888282036200151f575b50505090565b6200133c565b620009aa565b0162001394565b3880808080620014a5565b620010096200153e6200153762001556958762000f33565b9062001321565b6200154f8162000fc1868962000f33565b88620009aa565b388088620014fb565b62000b0185620010f7838762001594620015a26200159b620015ab9984620015b39f6200159490620011329e01998a620009aa565b016200105c565b9062001274565b9a8b95620009aa565b9285620009e0565b8887858a893862001468565b60005b838110620015d35750506000910152565b8181015183820152602001620015c2565b6200160962001613602093620005cc93620015fd815190565b80835293849260200190565b95869101620015bf565b601f01601f191690565b60208082526200008d92910190620015e4565b15620016395750565b620003c0906200164860405190565b62461bcd60e51b8152918291600483016200161d565b6200007f91903b6200167562000aa36000620000fb565b116200163056fe60806040526004361015610015575b366100f557005b60003560e01c630751e5b50361000e5761008c565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b73ffffffffffffffffffffffffffffffffffffffff81160361006457565b600080fd5b9050359061007682610046565b565b906020828203126100645761004391610069565b34610064576100a461009f366004610078565b61047f565b604051005b907fffffffff00000000000000000000000000000000000000000000000000000000165b600052602052604060002090565b61002a6100436100439290565b610043906100db565b9052565b61014c600061013181610106610776565b017fffffffff00000000000000000000000000000000000000000000000000000000833516906100a9565b015473ffffffffffffffffffffffffffffffffffffffff1690565b60009061015b61002a836100e8565b73ffffffffffffffffffffffffffffffffffffffff82161461019457818091368280378136915af43d82803e15610190573d90f35b3d90fd5b61021a7fffffffff000000000000000000000000000000000000000000000000000000008335166101c460405190565b9182917ff8473e6b000000000000000000000000000000000000000000000000000000008352600483017fffffffff00000000000000000000000000000000000000000000000000000000909116815260200190565b0390fd5b6100436100436100439290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810190811067ffffffffffffffff82111761029a57604052565b61022b565b906100766102ac60405190565b928361025a565b67ffffffffffffffff811161029a5760208091020190565b906102dd6102d8836102b3565b61029f565b918252565b610043606061029f565b6102f46102e2565b600080825260208201526060604082015290565b6100436102ec565b60005b82811061031f57505050565b60209061032a610308565b8184015201610313565b9061007661034a610344846102cb565b936102b3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00160208401610310565b369037565b9061007661038a610344846102cb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00160208401610375565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600311156103ee57565b6103b5565b90610076826103e4565b906100f1906103f3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9061043f825190565b811015610450576020809102010190565b610407565b9060ff905b9181191691161790565b9061047461004361047b92151590565b8254610455565b9055565b6003610489610776565b0190610496825460ff1690565b6105b157610076916105a360019261059e6104b08561021e565b6104b981610334565b926105056104c860009361037a565b6104f16104d36102e2565b73ffffffffffffffffffffffffffffffffffffffff90941685850152565b6104fe84602085016103fd565b6040830152565b6105176105118361021e565b85610436565b5261052a6105248261021e565b84610436565b51506105777f1f931c1c000000000000000000000000000000000000000000000000000000009161057160406105686105628461021e565b88610436565b5101519161021e565b90610436565b907fffffffff00000000000000000000000000000000000000000000000000000000169052565b610991565b6105ac3361066b565b610464565b6040517f9289b961000000000000000000000000000000000000000000000000000000008152600490fd5b9073ffffffffffffffffffffffffffffffffffffffff9061045a565b61002a6100436100439273ffffffffffffffffffffffffffffffffffffffff1690565b610043906105f8565b6100439061061b565b9061063d61004361047b92610624565b82546105dc565b73ffffffffffffffffffffffffffffffffffffffff91821681529116602082015260400190565b6000610675610745565b019061069f81610699845473ffffffffffffffffffffffffffffffffffffffff1690565b9361062d565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06106c983610624565b6106d283610624565b916106dc60405190565b600090a37f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9161071761070e60405190565b92839283610644565b0390a1565b6100437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610361021e565b61004361071c565b6100437fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c61021e565b61004361074d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107da5760010190565b61077e565b61004390516103f3565b610043906103f3565b6100f1906107e9565b60208101929161007691906107f2565b0190565b9061082f61082861081e845190565b8084529260200190565b9260200190565b9060005b8181106108405750505090565b90919261087f61087860019286517fffffffff0000000000000000000000000000000000000000000000000000000016815260200190565b9460200190565b929101610833565b805173ffffffffffffffffffffffffffffffffffffffff1682526100439160608101916040906108bf602082015160208501906107f2565b015190604081840391015261080f565b9061004391610887565b906108ef6108e5835190565b8083529160200190565b90816109016020830284019460200190565b926000915b83831061091557505050505090565b90919293946020610938610931838560019503875289516108cf565b9760200190565b9301930191939290610906565b6060808252610043939261097f9161096091908401906108d9565b73ffffffffffffffffffffffffffffffffffffffff9093166020830152565b60408183039101526000815260200190565b9060005b6109a0610043845190565b811015610aea576109bd60206109b68386610436565b51016107df565b6000906109c9826103f3565b6109d2826103f3565b03610a28575090610a1e610a09610a23936109ed8488610436565b51015173ffffffffffffffffffffffffffffffffffffffff1690565b6040610a158488610436565b51015190610d20565b6107ad565b610995565b610a3260016103f3565b610a3b826103f3565b03610a6b575090610a1e610a56610a23936109ed8488610436565b6040610a628488610436565b51015190610f37565b610a7560026103f3565b610a7e826103f3565b03610aae575090610a1e610a99610a23936109ed8488610436565b6040610aa58488610436565b510151906110de565b61021a90610abb60405190565b9182917f32191c29000000000000000000000000000000000000000000000000000000008352600483016107fb565b5090610af660006100e8565b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67391610717610b2460405190565b92839283610945565b15610b3457565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f206375740000000000000000000000000000000000000000006064820152608490fd5b15610bc057565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f65206164647265737328302900000000000000000000000000000000000000006064820152608490fd5b906100cd90610624565b610c5c6100436100439290565b6bffffffffffffffffffffffff1690565b15610c7457565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c72656164792065786973747300000000000000000000006064820152608490fd5b6bffffffffffffffffffffffff166bffffffffffffffffffffffff81146107da5760010190565b9190610d2a815190565b610d46600091610d40610d3c8461021e565b9190565b11610b2d565b610d4e610776565b610d57826100e8565b610d9073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff88165b1415610bb9565b610dae610da984610da48960018701610c45565b015490565b610c4f565b9384610dce610dbc86610c4f565b916bffffffffffffffffffffffff1690565b14610e9c575b6000945b610de3610043835190565b861015610e9257610e8681610e818a610e8c9489610e7b610e40826101318f610e378f91610e11908f610436565b517fffffffff000000000000000000000000000000000000000000000000000000001690565b958691016100a9565b610e7573ffffffffffffffffffffffffffffffffffffffff8c165b9173ffffffffffffffffffffffffffffffffffffffff1690565b14610c6d565b8961142b565b610cf9565b956107ad565b94610dd8565b5050505050509050565b610ea687846112df565b610dd4565b15610eb257565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e00000000000000006064820152608490fd5b8151919291610f4e600091610d40610d3c8461021e565b610f56610776565b90610f82610f6661002a836100e8565b73ffffffffffffffffffffffffffffffffffffffff8516610d89565b610f96610da982610da48660018701610c45565b9485610fa4610dbc84610c4f565b14611043575b6000955b610fb9610043835190565b87101561103a5761102e81610e81876110349487610e7b8a610ff08f610131610fe6610e1187938f610436565b80968195016100a9565b61102873ffffffffffffffffffffffffffffffffffffffff871673ffffffffffffffffffffffffffffffffffffffff83161415610eab565b8c611770565b966107ad565b95610fae565b50505050509050565b61104d84846112df565b610faa565b1561105957565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d7573742062652061646472657373283029000000000000000000006064820152608490fd5b815160009392906110f590610d40610d3c8761021e565b611116611100610776565b92611110610e5b61002a886100e8565b14611052565b60005b611124610043835190565b81101561115a5780610a1e61113f610e116111559486610436565b61114f8861013183828a016100a9565b86611770565b611119565b5050509050565b67ffffffffffffffff811161029a57602090601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b906102dd6102d883611161565b6111b3602461119c565b7f4c69624469616d6f6e644375743a204e657720666163657420686173206e6f2060208201527f636f646500000000000000000000000000000000000000000000000000000000604082015290565b6100436111a9565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9061045a565b9061124261004361047b9261021e565b825461120a565b805482101561045057611263600191600052602060002090565b91020190600090565b9190600861045a91029161129373ffffffffffffffffffffffffffffffffffffffff841b90565b921b90565b91906112a961004361047b93610624565b90835461126c565b908154916801000000000000000083101561029a57826112d991600161007695018155611249565b90611298565b9061131c610076926112f86112f2611202565b84611a21565b61004360028201916001611316868261130f875490565b9401610c45565b01611232565b6112b1565b907fffffffffffffffffffffffff00000000000000000000000000000000000000009060a01b61045a565b610c5c610043610043926bffffffffffffffffffffffff1690565b9061137761004361047b9261134c565b8254611321565b805491929183101561045057600861139d600492600052602060002090565b8185040193060290565b9190600861045a91029161129363ffffffff841b90565b91906113f56113ef61047b937fffffffff000000000000000000000000000000000000000000000000000000001690565b60e01c90565b9083546113a7565b908154916801000000000000000083101561029a57826114259160016100769501815561137e565b906113be565b8184936114686000946114638661080b6100769a600161146d9961145d85820199866114578a8d6100a9565b01611367565b01610c45565b6113fd565b6100a9565b0161062d565b1561147a57565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e27742065786973740000000000000000006064820152608490fd5b1561150657565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201527f7461626c652066756e6374696f6e0000000000000000000000000000000000006064820152608490fd5b6100439060a01c610c5c565b610043905461158b565b610043610043610043926bffffffffffffffffffffffff1690565b919082039182116107da57565b610043916008021c60e01b90565b9061004391546115c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b610076916000916113be565b8054801561165e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061165b611655838361137e565b90611611565b55565b6115e2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b906000036116a05760009055565b611663565b6100439081565b61004390546116a5565b610043916008021c61002a565b9061004391546116b6565b61007691600091611298565b8054801561165e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061165b6117128383611249565b906116ce565b9190600861045a9102916112937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841b90565b919061175c61004361047b9361021e565b908354611718565b6100769160009161174b565b61182590929192836000936117a861178a61002a876100e8565b73ffffffffffffffffffffffffffffffffffffffff84161415611473565b6117d56117b761002a30610624565b73ffffffffffffffffffffffffffffffffffffffff841614156114ff565b61185685611851818601936117fc6117f7846117f184896100a9565b01611597565b6115a1565b9461180e84610da48960018c01610c45565b87858a60019c8d9461181f8661021e565b906115bc565b809a61182e8290565b8103611906575b505061184c92506114689361080b91019e8f610c45565b61161d565b611692565b611862610d3c8661021e565b1461186f575b5050505050565b6118c7946118bc6118b760026118c1950161189461188b825490565b61181f8961021e565b6118a8886118a28888610c45565b016116ac565b888282036118d1575b50505090565b6116da565b610c45565b01611764565b3880808080611868565b6113166118ea6118e46118fe9587611249565b906116c3565b6118f8816112d98689611249565b88610c45565b3880886118b1565b610da985611425838761193161193d611937611945998461194c9f611931906114579e01998a610c45565b0161137e565b906115d7565b9a8b95610c45565b92856100a9565b8887858a8938611835565b60005b83811061196a5750506000910152565b818101518382015260200161195a565b61199b6119a460209361080b9361198f815190565b80835293849260200190565b95869101611957565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b60208082526100439291019061197a565b156119e55750565b61021a906119f260405190565b9182917f08c379a0000000000000000000000000000000000000000000000000000000008352600483016119cc565b61007691903b611a34610d3c600061021e565b116119dd56fea264697066735822122088a2abace83ea1422d9077a1c7995d26ab25a5fcc23a713b0d9e721d442752f864736f6c63430008130033000000000000000000000000efd739b52045d112c37c5d89a8771b31c165879c

Deployed ByteCode

0x60806040526004361015610015575b366100f557005b60003560e01c630751e5b50361000e5761008c565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b73ffffffffffffffffffffffffffffffffffffffff81160361006457565b600080fd5b9050359061007682610046565b565b906020828203126100645761004391610069565b34610064576100a461009f366004610078565b61047f565b604051005b907fffffffff00000000000000000000000000000000000000000000000000000000165b600052602052604060002090565b61002a6100436100439290565b610043906100db565b9052565b61014c600061013181610106610776565b017fffffffff00000000000000000000000000000000000000000000000000000000833516906100a9565b015473ffffffffffffffffffffffffffffffffffffffff1690565b60009061015b61002a836100e8565b73ffffffffffffffffffffffffffffffffffffffff82161461019457818091368280378136915af43d82803e15610190573d90f35b3d90fd5b61021a7fffffffff000000000000000000000000000000000000000000000000000000008335166101c460405190565b9182917ff8473e6b000000000000000000000000000000000000000000000000000000008352600483017fffffffff00000000000000000000000000000000000000000000000000000000909116815260200190565b0390fd5b6100436100436100439290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810190811067ffffffffffffffff82111761029a57604052565b61022b565b906100766102ac60405190565b928361025a565b67ffffffffffffffff811161029a5760208091020190565b906102dd6102d8836102b3565b61029f565b918252565b610043606061029f565b6102f46102e2565b600080825260208201526060604082015290565b6100436102ec565b60005b82811061031f57505050565b60209061032a610308565b8184015201610313565b9061007661034a610344846102cb565b936102b3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00160208401610310565b369037565b9061007661038a610344846102cb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00160208401610375565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600311156103ee57565b6103b5565b90610076826103e4565b906100f1906103f3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9061043f825190565b811015610450576020809102010190565b610407565b9060ff905b9181191691161790565b9061047461004361047b92151590565b8254610455565b9055565b6003610489610776565b0190610496825460ff1690565b6105b157610076916105a360019261059e6104b08561021e565b6104b981610334565b926105056104c860009361037a565b6104f16104d36102e2565b73ffffffffffffffffffffffffffffffffffffffff90941685850152565b6104fe84602085016103fd565b6040830152565b6105176105118361021e565b85610436565b5261052a6105248261021e565b84610436565b51506105777f1f931c1c000000000000000000000000000000000000000000000000000000009161057160406105686105628461021e565b88610436565b5101519161021e565b90610436565b907fffffffff00000000000000000000000000000000000000000000000000000000169052565b610991565b6105ac3361066b565b610464565b6040517f9289b961000000000000000000000000000000000000000000000000000000008152600490fd5b9073ffffffffffffffffffffffffffffffffffffffff9061045a565b61002a6100436100439273ffffffffffffffffffffffffffffffffffffffff1690565b610043906105f8565b6100439061061b565b9061063d61004361047b92610624565b82546105dc565b73ffffffffffffffffffffffffffffffffffffffff91821681529116602082015260400190565b6000610675610745565b019061069f81610699845473ffffffffffffffffffffffffffffffffffffffff1690565b9361062d565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06106c983610624565b6106d283610624565b916106dc60405190565b600090a37f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9161071761070e60405190565b92839283610644565b0390a1565b6100437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610361021e565b61004361071c565b6100437fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c61021e565b61004361074d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107da5760010190565b61077e565b61004390516103f3565b610043906103f3565b6100f1906107e9565b60208101929161007691906107f2565b0190565b9061082f61082861081e845190565b8084529260200190565b9260200190565b9060005b8181106108405750505090565b90919261087f61087860019286517fffffffff0000000000000000000000000000000000000000000000000000000016815260200190565b9460200190565b929101610833565b805173ffffffffffffffffffffffffffffffffffffffff1682526100439160608101916040906108bf602082015160208501906107f2565b015190604081840391015261080f565b9061004391610887565b906108ef6108e5835190565b8083529160200190565b90816109016020830284019460200190565b926000915b83831061091557505050505090565b90919293946020610938610931838560019503875289516108cf565b9760200190565b9301930191939290610906565b6060808252610043939261097f9161096091908401906108d9565b73ffffffffffffffffffffffffffffffffffffffff9093166020830152565b60408183039101526000815260200190565b9060005b6109a0610043845190565b811015610aea576109bd60206109b68386610436565b51016107df565b6000906109c9826103f3565b6109d2826103f3565b03610a28575090610a1e610a09610a23936109ed8488610436565b51015173ffffffffffffffffffffffffffffffffffffffff1690565b6040610a158488610436565b51015190610d20565b6107ad565b610995565b610a3260016103f3565b610a3b826103f3565b03610a6b575090610a1e610a56610a23936109ed8488610436565b6040610a628488610436565b51015190610f37565b610a7560026103f3565b610a7e826103f3565b03610aae575090610a1e610a99610a23936109ed8488610436565b6040610aa58488610436565b510151906110de565b61021a90610abb60405190565b9182917f32191c29000000000000000000000000000000000000000000000000000000008352600483016107fb565b5090610af660006100e8565b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67391610717610b2460405190565b92839283610945565b15610b3457565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f206375740000000000000000000000000000000000000000006064820152608490fd5b15610bc057565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260448201527f65206164647265737328302900000000000000000000000000000000000000006064820152608490fd5b906100cd90610624565b610c5c6100436100439290565b6bffffffffffffffffffffffff1690565b15610c7457565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c72656164792065786973747300000000000000000000006064820152608490fd5b6bffffffffffffffffffffffff166bffffffffffffffffffffffff81146107da5760010190565b9190610d2a815190565b610d46600091610d40610d3c8461021e565b9190565b11610b2d565b610d4e610776565b610d57826100e8565b610d9073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff88165b1415610bb9565b610dae610da984610da48960018701610c45565b015490565b610c4f565b9384610dce610dbc86610c4f565b916bffffffffffffffffffffffff1690565b14610e9c575b6000945b610de3610043835190565b861015610e9257610e8681610e818a610e8c9489610e7b610e40826101318f610e378f91610e11908f610436565b517fffffffff000000000000000000000000000000000000000000000000000000001690565b958691016100a9565b610e7573ffffffffffffffffffffffffffffffffffffffff8c165b9173ffffffffffffffffffffffffffffffffffffffff1690565b14610c6d565b8961142b565b610cf9565b956107ad565b94610dd8565b5050505050509050565b610ea687846112df565b610dd4565b15610eb257565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e00000000000000006064820152608490fd5b8151919291610f4e600091610d40610d3c8461021e565b610f56610776565b90610f82610f6661002a836100e8565b73ffffffffffffffffffffffffffffffffffffffff8516610d89565b610f96610da982610da48660018701610c45565b9485610fa4610dbc84610c4f565b14611043575b6000955b610fb9610043835190565b87101561103a5761102e81610e81876110349487610e7b8a610ff08f610131610fe6610e1187938f610436565b80968195016100a9565b61102873ffffffffffffffffffffffffffffffffffffffff871673ffffffffffffffffffffffffffffffffffffffff83161415610eab565b8c611770565b966107ad565b95610fae565b50505050509050565b61104d84846112df565b610faa565b1561105957565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d7573742062652061646472657373283029000000000000000000006064820152608490fd5b815160009392906110f590610d40610d3c8761021e565b611116611100610776565b92611110610e5b61002a886100e8565b14611052565b60005b611124610043835190565b81101561115a5780610a1e61113f610e116111559486610436565b61114f8861013183828a016100a9565b86611770565b611119565b5050509050565b67ffffffffffffffff811161029a57602090601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b906102dd6102d883611161565b6111b3602461119c565b7f4c69624469616d6f6e644375743a204e657720666163657420686173206e6f2060208201527f636f646500000000000000000000000000000000000000000000000000000000604082015290565b6100436111a9565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9061045a565b9061124261004361047b9261021e565b825461120a565b805482101561045057611263600191600052602060002090565b91020190600090565b9190600861045a91029161129373ffffffffffffffffffffffffffffffffffffffff841b90565b921b90565b91906112a961004361047b93610624565b90835461126c565b908154916801000000000000000083101561029a57826112d991600161007695018155611249565b90611298565b9061131c610076926112f86112f2611202565b84611a21565b61004360028201916001611316868261130f875490565b9401610c45565b01611232565b6112b1565b907fffffffffffffffffffffffff00000000000000000000000000000000000000009060a01b61045a565b610c5c610043610043926bffffffffffffffffffffffff1690565b9061137761004361047b9261134c565b8254611321565b805491929183101561045057600861139d600492600052602060002090565b8185040193060290565b9190600861045a91029161129363ffffffff841b90565b91906113f56113ef61047b937fffffffff000000000000000000000000000000000000000000000000000000001690565b60e01c90565b9083546113a7565b908154916801000000000000000083101561029a57826114259160016100769501815561137e565b906113be565b8184936114686000946114638661080b6100769a600161146d9961145d85820199866114578a8d6100a9565b01611367565b01610c45565b6113fd565b6100a9565b0161062d565b1561147a57565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e27742065786973740000000000000000006064820152608490fd5b1561150657565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201527f7461626c652066756e6374696f6e0000000000000000000000000000000000006064820152608490fd5b6100439060a01c610c5c565b610043905461158b565b610043610043610043926bffffffffffffffffffffffff1690565b919082039182116107da57565b610043916008021c60e01b90565b9061004391546115c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b610076916000916113be565b8054801561165e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061165b611655838361137e565b90611611565b55565b6115e2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b906000036116a05760009055565b611663565b6100439081565b61004390546116a5565b610043916008021c61002a565b9061004391546116b6565b61007691600091611298565b8054801561165e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061165b6117128383611249565b906116ce565b9190600861045a9102916112937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841b90565b919061175c61004361047b9361021e565b908354611718565b6100769160009161174b565b61182590929192836000936117a861178a61002a876100e8565b73ffffffffffffffffffffffffffffffffffffffff84161415611473565b6117d56117b761002a30610624565b73ffffffffffffffffffffffffffffffffffffffff841614156114ff565b61185685611851818601936117fc6117f7846117f184896100a9565b01611597565b6115a1565b9461180e84610da48960018c01610c45565b87858a60019c8d9461181f8661021e565b906115bc565b809a61182e8290565b8103611906575b505061184c92506114689361080b91019e8f610c45565b61161d565b611692565b611862610d3c8661021e565b1461186f575b5050505050565b6118c7946118bc6118b760026118c1950161189461188b825490565b61181f8961021e565b6118a8886118a28888610c45565b016116ac565b888282036118d1575b50505090565b6116da565b610c45565b01611764565b3880808080611868565b6113166118ea6118e46118fe9587611249565b906116c3565b6118f8816112d98689611249565b88610c45565b3880886118b1565b610da985611425838761193161193d611937611945998461194c9f611931906114579e01998a610c45565b0161137e565b906115d7565b9a8b95610c45565b92856100a9565b8887858a8938611835565b60005b83811061196a5750506000910152565b818101518382015260200161195a565b61199b6119a460209361080b9361198f815190565b80835293849260200190565b95869101611957565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b60208082526100439291019061197a565b156119e55750565b61021a906119f260405190565b9182917f08c379a0000000000000000000000000000000000000000000000000000000008352600483016119cc565b61007691903b611a34610d3c600061021e565b116119dd56fea264697066735822122088a2abace83ea1422d9077a1c7995d26ab25a5fcc23a713b0d9e721d442752f864736f6c63430008130033