false
false
0

Contract Address Details

0x99047a2CbC32c521278c83Bb5d83d9178F6e0B9f

Contract Name
AddressUpdater
Creator
0xfe4dbb–f54ef8 at 0xed4086–0bcf54
Balance
0 CFLR
Tokens
Fetching tokens...
Transactions
3 Transactions
Transfers
0 Transfers
Gas Used
1,010,000
Last Balance Update
15280955
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
AddressUpdater




Optimization enabled
true
Compiler version
v0.7.6+commit.7338295f




Optimization runs
200
Verified at
2022-02-24T08:44:05.944996Z

Constructor Arguments

000000000000000000000000fe4dbb048428c3583e91a8e8f03bc64f09f54ef8

Arg [0] (address) : 0xfe4dbb048428c3583e91a8e8f03bc64f09f54ef8

              

./contracts/addressUpdater/implementation/AddressUpdater.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;

import "../../governance/implementation/Governed.sol";
import "../interface/IIAddressUpdatable.sol";


contract AddressUpdater is Governed {

    string internal constant ERR_ARRAY_LENGTHS = "array lengths do not match";
    string internal constant ERR_ADDRESS_ZERO = "address zero";

    string[] internal contractNames;
    mapping(bytes32 => address) internal contractAddresses;

    constructor(address _governance) Governed(_governance) {}

    /**
     * @notice set/update contract names/addresses and then apply changes to other contracts
     * @param _contractNames                contracts names
     * @param _contractAddresses            addresses of corresponding contracts names
     * @param _contractsToUpdate            contracts to be updated
     */
    function update(
        string[] memory _contractNames,
        address[] memory _contractAddresses,
        IIAddressUpdatable[] memory _contractsToUpdate
    )
        external onlyGovernance
    {
        _addOrUpdateContractNamesAndAddresses(_contractNames, _contractAddresses);
        _updateContractAddresses(_contractsToUpdate);
    }
    
    /**
     * @notice Updates contract addresses on all contracts implementing IIAddressUpdatable interface
     * @param _contractsToUpdate            contracts to be updated
     */
    function updateContractAddresses(IIAddressUpdatable[] memory _contractsToUpdate) external onlyGovernance {
        _updateContractAddresses(_contractsToUpdate);
    }

    /**
     * @notice Add or update contract names and addreses that are later used in updateContractAddresses calls
     * @param _contractNames                contracts names
     * @param _contractAddresses            addresses of corresponding contracts names
     */
    function addOrUpdateContractNamesAndAddresses(
        string[] memory _contractNames,
        address[] memory _contractAddresses
    )
        external
        onlyGovernance
    {
        _addOrUpdateContractNamesAndAddresses(_contractNames, _contractAddresses);
    }

    /**
     * @notice Returns the contract names and the corresponding addresses
     */
    function getContractNamesAndAddresses() external view returns(
        string[] memory _contractNames,
        address[] memory _contractAddresses
    ) {
        _contractNames = contractNames;
        uint256 len = _contractNames.length;
        _contractAddresses = new address[](len);
        while (len > 0) {
            len--;
            _contractAddresses[len] = contractAddresses[_keccak256AbiEncode(_contractNames[len])];
        }
    }

    /**
     * @notice Returns contract address for the given name and reverts if address(0)
     */
    function getContractAddress(string memory _name) external view returns(address) {
        address a = contractAddresses[_keccak256AbiEncode(_name)];
        require(a != address(0), ERR_ADDRESS_ZERO);
        return a;
    }
    
    /**
     * @notice Add or update contract names and addreses that are later used in updateContractAddresses calls
     * @param _contractNames                contracts names
     * @param _contractAddresses            addresses of corresponding contracts names
     */
    function _addOrUpdateContractNamesAndAddresses(
        string[] memory _contractNames,
        address[] memory _contractAddresses
    )
        internal
    {
        uint256 len = _contractNames.length;
        require(len == _contractAddresses.length, ERR_ARRAY_LENGTHS);

        for (uint256 i = 0; i < len; i++) {
            require(_contractAddresses[i] != address(0), ERR_ADDRESS_ZERO);
            bytes32 nameHash = _keccak256AbiEncode(_contractNames[i]);
            // add new contract name if address is not known yet
            if (contractAddresses[nameHash] == address(0)) {
                contractNames.push(_contractNames[i]);
            }
            // set or update contract address
            contractAddresses[nameHash] = _contractAddresses[i];
        }
    }

    /**
     * @notice Updates contract addresses on all contracts implementing IIAddressUpdatable interface
     * @param _contractsToUpdate            contracts to be updated
     */
    function _updateContractAddresses(IIAddressUpdatable[] memory _contractsToUpdate) internal {
        uint256 len = contractNames.length;
        bytes32[] memory nameHashes = new bytes32[](len);
        address[] memory addresses = new address[](len);
        while (len > 0) {
            len--;
            nameHashes[len] = _keccak256AbiEncode(contractNames[len]);
            addresses[len] = contractAddresses[nameHashes[len]];
        }

        for (uint256 i = 0; i < _contractsToUpdate.length; i++) {
            _contractsToUpdate[i].updateContractAddresses(nameHashes, addresses);
        }
    }

    /**
     * @notice Returns hash from string value
     */
    function _keccak256AbiEncode(string memory _value) internal pure returns(bytes32) {
        return keccak256(abi.encode(_value));
    }
}
        

./contracts/governance/implementation/GovernedBase.sol

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


/**
 * @title Governed Base
 * @notice This abstract base class defines behaviors for a governed contract.
 * @dev This class is abstract so that specific behaviors can be defined for the constructor.
 *   Contracts should not be left ungoverned, but not all contract will have a constructor
 *   (for example those pre-defined in genesis).
 **/
abstract contract GovernedBase {
    address public governance;
    address public proposedGovernance;
    bool private initialised;

    event GovernanceProposed(address proposedGovernance);
    event GovernanceUpdated (address oldGovernance, address newGoveranance);

    modifier onlyGovernance () {
        _checkOnlyGovernance();
        _;
    }

    constructor(address _governance) {
        if (_governance != address(0)) {
            initialise(_governance);
        }
    }

    /**
     * @notice First of a two step process for turning over governance to another address.
     * @param _governance The address to propose to receive governance role.
     * @dev Must hold governance to propose another address.
     */
    function proposeGovernance(address _governance) external onlyGovernance {
        proposedGovernance = _governance;
        emit GovernanceProposed(_governance);
    }

    /**
     * @notice Once proposed, claimant can claim the governance role as the second of a two-step process.
     */
    function claimGovernance() external {
        require(msg.sender == proposedGovernance, "not claimaint");

        emit GovernanceUpdated(governance, proposedGovernance);
        governance = proposedGovernance;
        proposedGovernance = address(0);
    }

    /**
     * @notice In a one-step process, turn over governance to another address.
     * @dev Must hold governance to transfer.
     */
    function transferGovernance(address _governance) external onlyGovernance {
        emit GovernanceUpdated(governance, _governance);
        governance = _governance;
        proposedGovernance = address(0);
    }

    /**
     * @notice Initialize the governance address if not first initialized.
     */
    function initialise(address _governance) public virtual {
        require(initialised == false, "initialised != false");

        initialised = true;
        emit GovernanceUpdated(governance, _governance);
        governance = _governance;
        proposedGovernance = address(0);
    }

    function _checkOnlyGovernance() internal view {
        require(msg.sender == governance, "only governance");
    }
}
          

./contracts/addressUpdater/interface/IIAddressUpdatable.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.6 <0.9;


interface IIAddressUpdatable {
    /**
     * @notice Updates contract addresses - should be called only from AddressUpdater contract
     * @param _contractNameHashes       list of keccak256(abi.encode(...)) contract names
     * @param _contractAddresses        list of contract addresses corresponding to the contract names
     */
    function updateContractAddresses(
        bytes32[] memory _contractNameHashes,
        address[] memory _contractAddresses
        ) external;
}
          

./contracts/governance/implementation/Governed.sol

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

import { GovernedBase } from "./GovernedBase.sol";


/**
 * @title Governed
 * @dev For deployed, governed contracts, enforce a non-zero address at create time.
 **/
contract Governed is GovernedBase {
    constructor(address _governance) GovernedBase(_governance) {
        require(_governance != address(0), "_governance zero");
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"event","name":"GovernanceProposed","inputs":[{"type":"address","name":"proposedGovernance","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceUpdated","inputs":[{"type":"address","name":"oldGovernance","internalType":"address","indexed":false},{"type":"address","name":"newGoveranance","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addOrUpdateContractNamesAndAddresses","inputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimGovernance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getContractAddress","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"}],"name":"getContractNamesAndAddresses","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialise","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"proposeGovernance","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"proposedGovernance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferGovernance","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"update","inputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"},{"type":"address[]","name":"_contractsToUpdate","internalType":"contract IIAddressUpdatable[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateContractAddresses","inputs":[{"type":"address[]","name":"_contractsToUpdate","internalType":"contract IIAddressUpdatable[]"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b5060405161126438038061126483398101604081905261002f91610182565b80806001600160a01b03811615610049576100498161009f565b506001600160a01b038116610098576040805162461bcd60e51b815260206004820152601060248201526f5f676f7665726e616e6365207a65726f60801b604482015290519081900360640190fd5b50506101b0565b600154600160a01b900460ff16156100fe576040805162461bcd60e51b815260206004820152601460248201527f696e697469616c6973656420213d2066616c7365000000000000000000000000604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b600060208284031215610193578081fd5b81516001600160a01b03811681146101a9578182fd5b9392505050565b6110a5806101bf6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806360f7ac971161007157806360f7ac97146101125780638246e4671461011a5780639933dba61461012d5780639d6a890f14610140578063c373a08e14610153578063d38bfff414610166576100a9565b806304433bbc146100ae5780631b0e2960146100d75780632f26c5c3146100ec5780635aa6e675146101025780635d36b1901461010a575b600080fd5b6100c16100bc366004610e65565b610179565b6040516100ce9190610f26565b60405180910390f35b6100ea6100e5366004610d45565b6101fb565b005b6100f461020f565b6040516100ce929190610f91565b6100c16103b5565b6100ea6103c4565b6100c1610486565b6100ea610128366004610d80565b610495565b6100ea61013b366004610de1565b6104ab565b6100ea61014e366004610d22565b6104cb565b6100ea610161366004610d22565b6105a5565b6100ea610174366004610d22565b610601565b600080600360006101898561067a565b81526020808201929092526040908101600020548151808301909252600c82526b61646472657373207a65726f60a01b928201929092526001600160a01b039091169150816101f45760405162461bcd60e51b81526004016101eb9190611005565b60405180910390fd5b5092915050565b6102036106aa565b61020c816106fd565b50565b6060806002805480602002602001604051908101604052809291908181526020016000905b828210156102df5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156102cb5780601f106102a0576101008083540402835291602001916102cb565b820191906000526020600020905b8154815290600101906020018083116102ae57829003601f168201915b505050505081526020019060010190610234565b505082519294508291505067ffffffffffffffff8111801561030057600080fd5b5060405190808252806020026020018201604052801561032a578160200160208202803683370190505b5091505b80156103b0578080600190039150506003600061035d85848151811061035057fe5b602002602001015161067a565b815260200190815260200160002060009054906101000a90046001600160a01b031682828151811061038b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061032e565b509091565b6000546001600160a01b031681565b6001546001600160a01b03163314610413576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd0818db185a5b585a5b9d609a1b604482015290519081900360640190fd5b600054600154604080516001600160a01b03938416815292909116602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001546001600160a01b031681565b61049d6106aa565b6104a78282610959565b5050565b6104b36106aa565b6104bd8383610959565b6104c6816106fd565b505050565b600154600160a01b900460ff1615610521576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6105ad6106aa565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f1f95fb40be3a947982072902a887b521248d1d8931a39eb38f84f4d6fd758b699181900360200190a150565b6106096106aa565b600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b60008160405160200161068d9190611005565b604051602081830303815290604052805190602001209050919050565b6000546001600160a01b031633146106fb576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b565b60025460008167ffffffffffffffff8111801561071957600080fd5b50604051908082528060200260200182016040528015610743578160200160208202803683370190505b50905060008267ffffffffffffffff8111801561075f57600080fd5b50604051908082528060200260200182016040528015610789578160200160208202803683370190505b5090505b82156108c757828060019003935050610844600284815481106107ac57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505061067a565b82848151811061085057fe5b6020026020010181815250506003600083858151811061086c57fe5b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03168184815181106108a257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061078d565b60005b8451811015610952578481815181106108df57fe5b60200260200101516001600160a01b031663b00c0b7684846040518363ffffffff1660e01b8152600401610914929190610f3a565b600060405180830381600087803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b5050600190920191506108ca9050565b5050505050565b8151815160408051808201909152601a81527f6172726179206c656e6774687320646f206e6f74206d6174636800000000000060208201529082146109b15760405162461bcd60e51b81526004016101eb9190611005565b5060005b81811015610ae95760006001600160a01b03168382815181106109d457fe5b60200260200101516001600160a01b031614156040518060400160405280600c81526020016b61646472657373207a65726f60a01b81525090610a2a5760405162461bcd60e51b81526004016101eb9190611005565b506000610a3c85838151811061035057fe5b6000818152600360205260409020549091506001600160a01b0316610a9d576002858381518110610a6957fe5b60209081029190910181015182546001810184556000938452928290208151610a9b9491909101929190910190610aef565b505b838281518110610aa957fe5b60209081029190910181015160009283526003909152604090912080546001600160a01b0319166001600160a01b039092169190911790556001016109b5565b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282610b255760008555610b6b565b82601f10610b3e57805160ff1916838001178555610b6b565b82800160010185558215610b6b579182015b82811115610b6b578251825591602001919060010190610b50565b50610b77929150610b7b565b5090565b5b80821115610b775760008155600101610b7c565b600082601f830112610ba0578081fd5b81356020610bb5610bb08361103c565b611018565b8281528181019085830183850287018401881015610bd1578586fd5b855b85811015610bf8578135610be68161105a565b84529284019290840190600101610bd3565b5090979650505050505050565b600082601f830112610c15578081fd5b81356020610c25610bb08361103c565b8281528181019085830183850287018401881015610c41578586fd5b855b85811015610bf8578135610c568161105a565b84529284019290840190600101610c43565b600082601f830112610c78578081fd5b81356020610c88610bb08361103c565b82815281810190858301855b85811015610bf857610cab898684358b0101610cbd565b84529284019290840190600101610c94565b600082601f830112610ccd578081fd5b813567ffffffffffffffff811115610ce157fe5b610cf4601f8201601f1916602001611018565b818152846020838601011115610d08578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215610d33578081fd5b8135610d3e8161105a565b9392505050565b600060208284031215610d56578081fd5b813567ffffffffffffffff811115610d6c578182fd5b610d7884828501610c05565b949350505050565b60008060408385031215610d92578081fd5b823567ffffffffffffffff80821115610da9578283fd5b610db586838701610c68565b93506020850135915080821115610dca578283fd5b50610dd785828601610b90565b9150509250929050565b600080600060608486031215610df5578081fd5b833567ffffffffffffffff80821115610e0c578283fd5b610e1887838801610c68565b94506020860135915080821115610e2d578283fd5b610e3987838801610b90565b93506040860135915080821115610e4e578283fd5b50610e5b86828701610c05565b9150509250925092565b600060208284031215610e76578081fd5b813567ffffffffffffffff811115610e8c578182fd5b610d7884828501610cbd565b6000815180845260208085019450808401835b83811015610ed05781516001600160a01b031687529582019590820190600101610eab565b509495945050505050565b60008151808452815b81811015610f0057602081850181015186830182015201610ee4565b81811115610f115782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015610f7357815184529284019290840190600101610f57565b50505083810382850152610f878186610e98565b9695505050505050565b60006040820160408352808551808352606085019150602092506060838202860101838801855b83811015610fe657605f19888403018552610fd4838351610edb565b94860194925090850190600101610fb8565b505085810384870152610ff98188610e98565b98975050505050505050565b600060208252610d3e6020830184610edb565b60405181810167ffffffffffffffff8111828210171561103457fe5b604052919050565b600067ffffffffffffffff82111561105057fe5b5060209081020190565b6001600160a01b038116811461020c57600080fdfea2646970667358221220fd68d41b161b9ba2c884aee3f81172cbd6e15339503e9a4754918556146c97a064736f6c63430007060033000000000000000000000000fe4dbb048428c3583e91a8e8f03bc64f09f54ef8

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806360f7ac971161007157806360f7ac97146101125780638246e4671461011a5780639933dba61461012d5780639d6a890f14610140578063c373a08e14610153578063d38bfff414610166576100a9565b806304433bbc146100ae5780631b0e2960146100d75780632f26c5c3146100ec5780635aa6e675146101025780635d36b1901461010a575b600080fd5b6100c16100bc366004610e65565b610179565b6040516100ce9190610f26565b60405180910390f35b6100ea6100e5366004610d45565b6101fb565b005b6100f461020f565b6040516100ce929190610f91565b6100c16103b5565b6100ea6103c4565b6100c1610486565b6100ea610128366004610d80565b610495565b6100ea61013b366004610de1565b6104ab565b6100ea61014e366004610d22565b6104cb565b6100ea610161366004610d22565b6105a5565b6100ea610174366004610d22565b610601565b600080600360006101898561067a565b81526020808201929092526040908101600020548151808301909252600c82526b61646472657373207a65726f60a01b928201929092526001600160a01b039091169150816101f45760405162461bcd60e51b81526004016101eb9190611005565b60405180910390fd5b5092915050565b6102036106aa565b61020c816106fd565b50565b6060806002805480602002602001604051908101604052809291908181526020016000905b828210156102df5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156102cb5780601f106102a0576101008083540402835291602001916102cb565b820191906000526020600020905b8154815290600101906020018083116102ae57829003601f168201915b505050505081526020019060010190610234565b505082519294508291505067ffffffffffffffff8111801561030057600080fd5b5060405190808252806020026020018201604052801561032a578160200160208202803683370190505b5091505b80156103b0578080600190039150506003600061035d85848151811061035057fe5b602002602001015161067a565b815260200190815260200160002060009054906101000a90046001600160a01b031682828151811061038b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061032e565b509091565b6000546001600160a01b031681565b6001546001600160a01b03163314610413576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd0818db185a5b585a5b9d609a1b604482015290519081900360640190fd5b600054600154604080516001600160a01b03938416815292909116602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001546001600160a01b031681565b61049d6106aa565b6104a78282610959565b5050565b6104b36106aa565b6104bd8383610959565b6104c6816106fd565b505050565b600154600160a01b900460ff1615610521576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6105ad6106aa565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f1f95fb40be3a947982072902a887b521248d1d8931a39eb38f84f4d6fd758b699181900360200190a150565b6106096106aa565b600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b60008160405160200161068d9190611005565b604051602081830303815290604052805190602001209050919050565b6000546001600160a01b031633146106fb576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b565b60025460008167ffffffffffffffff8111801561071957600080fd5b50604051908082528060200260200182016040528015610743578160200160208202803683370190505b50905060008267ffffffffffffffff8111801561075f57600080fd5b50604051908082528060200260200182016040528015610789578160200160208202803683370190505b5090505b82156108c757828060019003935050610844600284815481106107ac57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505061067a565b82848151811061085057fe5b6020026020010181815250506003600083858151811061086c57fe5b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03168184815181106108a257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061078d565b60005b8451811015610952578481815181106108df57fe5b60200260200101516001600160a01b031663b00c0b7684846040518363ffffffff1660e01b8152600401610914929190610f3a565b600060405180830381600087803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b5050600190920191506108ca9050565b5050505050565b8151815160408051808201909152601a81527f6172726179206c656e6774687320646f206e6f74206d6174636800000000000060208201529082146109b15760405162461bcd60e51b81526004016101eb9190611005565b5060005b81811015610ae95760006001600160a01b03168382815181106109d457fe5b60200260200101516001600160a01b031614156040518060400160405280600c81526020016b61646472657373207a65726f60a01b81525090610a2a5760405162461bcd60e51b81526004016101eb9190611005565b506000610a3c85838151811061035057fe5b6000818152600360205260409020549091506001600160a01b0316610a9d576002858381518110610a6957fe5b60209081029190910181015182546001810184556000938452928290208151610a9b9491909101929190910190610aef565b505b838281518110610aa957fe5b60209081029190910181015160009283526003909152604090912080546001600160a01b0319166001600160a01b039092169190911790556001016109b5565b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282610b255760008555610b6b565b82601f10610b3e57805160ff1916838001178555610b6b565b82800160010185558215610b6b579182015b82811115610b6b578251825591602001919060010190610b50565b50610b77929150610b7b565b5090565b5b80821115610b775760008155600101610b7c565b600082601f830112610ba0578081fd5b81356020610bb5610bb08361103c565b611018565b8281528181019085830183850287018401881015610bd1578586fd5b855b85811015610bf8578135610be68161105a565b84529284019290840190600101610bd3565b5090979650505050505050565b600082601f830112610c15578081fd5b81356020610c25610bb08361103c565b8281528181019085830183850287018401881015610c41578586fd5b855b85811015610bf8578135610c568161105a565b84529284019290840190600101610c43565b600082601f830112610c78578081fd5b81356020610c88610bb08361103c565b82815281810190858301855b85811015610bf857610cab898684358b0101610cbd565b84529284019290840190600101610c94565b600082601f830112610ccd578081fd5b813567ffffffffffffffff811115610ce157fe5b610cf4601f8201601f1916602001611018565b818152846020838601011115610d08578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215610d33578081fd5b8135610d3e8161105a565b9392505050565b600060208284031215610d56578081fd5b813567ffffffffffffffff811115610d6c578182fd5b610d7884828501610c05565b949350505050565b60008060408385031215610d92578081fd5b823567ffffffffffffffff80821115610da9578283fd5b610db586838701610c68565b93506020850135915080821115610dca578283fd5b50610dd785828601610b90565b9150509250929050565b600080600060608486031215610df5578081fd5b833567ffffffffffffffff80821115610e0c578283fd5b610e1887838801610c68565b94506020860135915080821115610e2d578283fd5b610e3987838801610b90565b93506040860135915080821115610e4e578283fd5b50610e5b86828701610c05565b9150509250925092565b600060208284031215610e76578081fd5b813567ffffffffffffffff811115610e8c578182fd5b610d7884828501610cbd565b6000815180845260208085019450808401835b83811015610ed05781516001600160a01b031687529582019590820190600101610eab565b509495945050505050565b60008151808452815b81811015610f0057602081850181015186830182015201610ee4565b81811115610f115782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015610f7357815184529284019290840190600101610f57565b50505083810382850152610f878186610e98565b9695505050505050565b60006040820160408352808551808352606085019150602092506060838202860101838801855b83811015610fe657605f19888403018552610fd4838351610edb565b94860194925090850190600101610fb8565b505085810384870152610ff98188610e98565b98975050505050505050565b600060208252610d3e6020830184610edb565b60405181810167ffffffffffffffff8111828210171561103457fe5b604052919050565b600067ffffffffffffffff82111561105057fe5b5060209081020190565b6001600160a01b038116811461020c57600080fdfea2646970667358221220fd68d41b161b9ba2c884aee3f81172cbd6e15339503e9a4754918556146c97a064736f6c63430007060033