ETH Price: $2,347.40 (+1.30%)

Contract

0x93BB030735747708b4D33093A98d4c804Cd6B58C

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

> 10 Internal Transactions found.

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
715678442023-03-19 22:11:571050 days ago1679263917
Livepeer: Target L2 Migrator
0 ETH
715678162023-03-19 22:11:501050 days ago1679263910
Livepeer: Target L2 Migrator
0 ETH
715530602023-03-19 21:09:131051 days ago1679260153
Livepeer: Target L2 Migrator
0 ETH
709838092023-03-18 5:15:031052 days ago1679116503
Livepeer: Target L2 Migrator
0 ETH
692302212023-03-12 20:05:471058 days ago1678651547
Livepeer: Target L2 Migrator
0 ETH
686735652023-03-10 23:31:081059 days ago1678491068
Livepeer: Target L2 Migrator
0 ETH
685462992023-03-10 13:43:311060 days ago1678455811
Livepeer: Target L2 Migrator
0 ETH
684260542023-03-10 5:02:091060 days ago1678424529
Livepeer: Target L2 Migrator
0 ETH
674246052023-03-06 23:14:151063 days ago1678144455
Livepeer: Target L2 Migrator
0 ETH
671214542023-03-05 23:39:221064 days ago1678059562
Livepeer: Target L2 Migrator
0 ETH
667716952023-03-04 18:57:431066 days ago1677956263
Livepeer: Target L2 Migrator
0 ETH
667711652023-03-04 18:55:111066 days ago1677956111
Livepeer: Target L2 Migrator
0 ETH
665078192023-03-03 22:38:201066 days ago1677883100
Livepeer: Target L2 Migrator
0 ETH
661273002023-03-02 17:24:591068 days ago1677777899
Livepeer: Target L2 Migrator
0 ETH
651728582023-02-27 19:01:161071 days ago1677524476
Livepeer: Target L2 Migrator
0 ETH
638296132023-02-23 16:14:131075 days ago1677168853
Livepeer: Target L2 Migrator
0 ETH
636286612023-02-23 2:19:471075 days ago1677118787
Livepeer: Target L2 Migrator
0 ETH
632634832023-02-22 0:33:421076 days ago1677026022
Livepeer: Target L2 Migrator
0 ETH
616168532023-02-17 0:39:411081 days ago1676594381
Livepeer: Target L2 Migrator
0 ETH
613449282023-02-16 4:01:391082 days ago1676520099
Livepeer: Target L2 Migrator
0 ETH
612651572023-02-15 21:37:481083 days ago1676497068
Livepeer: Target L2 Migrator
0 ETH
606926162023-02-13 23:58:351084 days ago1676332715
Livepeer: Target L2 Migrator
0 ETH
605681182023-02-13 13:38:181085 days ago1676295498
Livepeer: Target L2 Migrator
0 ETH
605012012023-02-13 8:41:421085 days ago1676277702
Livepeer: Target L2 Migrator
0 ETH
599958622023-02-11 13:38:111087 days ago1676122691
Livepeer: Target L2 Migrator
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
L2Migrator

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import {L2ArbitrumMessenger} from "./L2ArbitrumMessenger.sol";
import {IMigrator} from "../../interfaces/IMigrator.sol";
import "../../proxy/ManagerProxyTarget.sol";
import "@openzeppelin/contracts/proxy/Clones.sol";

interface IBondingManager {
    function bondForWithHint(
        uint256 _amount,
        address _owner,
        address _to,
        address _oldDelegateNewPosPrev,
        address _oldDelegateNewPosNext,
        address _newDelegateNewPosPrev,
        address _newDelegateNewPosNext
    ) external;
}

interface ITicketBroker {
    function fundDepositAndReserveFor(
        address _addr,
        uint256 _depositAmount,
        uint256 _reserveAmount
    ) external payable;
}

interface IMerkleSnapshot {
    function verify(
        bytes32 _id,
        bytes32[] memory _proof,
        bytes32 _leaf
    ) external view returns (bool);
}

interface IDelegatorPool {
    function initialize(address _bondingManager) external;

    function claim(address _addr, uint256 _stake) external;
}

interface ApproveLike {
    function approve(address _addr, uint256 _amount) external;
}

contract L2Migrator is ManagerProxyTarget, L2ArbitrumMessenger, IMigrator {
    address public bondingManagerAddr;
    address public ticketBrokerAddr;
    address public merkleSnapshotAddr;
    address public tokenAddr;

    address public l1MigratorAddr;
    address public delegatorPoolImpl;
    bool public claimStakeEnabled;

    mapping(address => bool) public migratedDelegators;
    mapping(address => address) public delegatorPools;
    mapping(address => uint256) public claimedDelegatedStake;
    mapping(address => mapping(uint256 => bool)) public migratedUnbondingLocks;
    mapping(address => bool) public migratedSenders;

    event L1MigratorUpdate(address _l1MigratorAddr);

    event ControllerContractUpdate(bytes32 id, address addr);

    event MigrateDelegatorFinalized(MigrateDelegatorParams params);

    event MigrateUnbondingLocksFinalized(MigrateUnbondingLocksParams params);

    event MigrateSenderFinalized(MigrateSenderParams params);

    event DelegatorPoolImplUpdate(address _delegatorPoolImpl);

    event DelegatorPoolCreated(address indexed l1Addr, address delegatorPool);

    event ClaimStakeEnabled(bool _enabled);

    event StakeClaimed(
        address indexed delegator,
        address delegate,
        uint256 stake,
        uint256 fees
    );

    /**
     * @notice L2Migrator constructor. Only invokes constructor of base Manager contract with provided Controller address
     * @dev This constructor will not initialize any state variables besides `controller`.
     * - initialize() function must be called on a proxy that uses this implementation contract immediately after deployment
     * @param _controller Address of Controller that this contract will be registered with
     */
    constructor(address _controller) Manager(_controller) {}

    function initialize(address _l1MigratorAddr, address _delegatorPoolImpl)
        external
        onlyControllerOwner
    {
        l1MigratorAddr = _l1MigratorAddr;
        delegatorPoolImpl = _delegatorPoolImpl;

        syncControllerContracts();
    }

    /**
     * @notice Sets L1Migrator
     * @param _l1MigratorAddr L1Migrator address
     */
    function setL1Migrator(address _l1MigratorAddr)
        external
        onlyControllerOwner
    {
        l1MigratorAddr = _l1MigratorAddr;
        emit L1MigratorUpdate(_l1MigratorAddr);
    }

    /**
     * @notice Sets DelegatorPool implementation contract
     * @param _delegatorPoolImpl DelegatorPool implementation contract
     */
    function setDelegatorPoolImpl(address _delegatorPoolImpl)
        external
        onlyControllerOwner
    {
        delegatorPoolImpl = _delegatorPoolImpl;
        emit DelegatorPoolImplUpdate(_delegatorPoolImpl);
    }

    /**
     * @notice Enable/disable claimStake()
     * @param _enabled True/false indicating claimStake() enabled/disabled
     */
    function setClaimStakeEnabled(bool _enabled) external onlyControllerOwner {
        claimStakeEnabled = _enabled;
        emit ClaimStakeEnabled(_enabled);
    }

    /**
     * @notice Called by L1Migrator to complete transcoder/delegator state migration
     * @param _params L1 state relevant for migration
     */
    function finalizeMigrateDelegator(MigrateDelegatorParams calldata _params)
        external
        onlyL1Counterpart(l1MigratorAddr)
    {
        require(
            !migratedDelegators[_params.l1Addr],
            "DELEGATOR_ALREADY_MIGRATED"
        );

        migratedDelegators[_params.l1Addr] = true;

        if (_params.l1Addr == _params.delegate) {
            // l1Addr is an orchestrator on L1:
            // 1. Stake _params.stake on behalf of _params.l2Addr
            // 2. Create delegator pool
            // 3. Stake non-self delegated stake on behalf of the delegator pool
            bondFor(_params.stake, _params.l2Addr, _params.l2Addr);

            // _params.delegatedStake includes _params.stake which is the orchestrator's self-stake
            // Subtract _params.stake to get the orchestrator's non-self delegated stake
            uint256 nonSelfDelegatedStake = _params.delegatedStake -
                _params.stake;
            uint256 unclaimedNonSelfDelegatedStake = nonSelfDelegatedStake -
                claimedDelegatedStake[_params.l1Addr];
            if (unclaimedNonSelfDelegatedStake > 0) {
                address poolAddr = Clones.clone(delegatorPoolImpl);

                delegatorPools[_params.l1Addr] = poolAddr;

                bondFor(
                    unclaimedNonSelfDelegatedStake,
                    poolAddr,
                    _params.l2Addr
                );

                IDelegatorPool(poolAddr).initialize(bondingManagerAddr);

                emit DelegatorPoolCreated(_params.l1Addr, poolAddr);
            }
        } else {
            // l1Addr is a delegator on L1:
            // If a delegator pool exists for _params.delegate claim stake which
            // was already migrated by delegate on behalf of _params.l2Addr.
            // Otherwise, stake _params.stake on behalf of _params.l2Addr.
            address pool = delegatorPools[_params.delegate];

            if (pool != address(0)) {
                // Claim stake that is held by the delegator pool
                IDelegatorPool(pool).claim(_params.l2Addr, _params.stake);
            } else {
                bondFor(_params.stake, _params.l2Addr, _params.delegate);
            }
        }

        claimedDelegatedStake[_params.delegate] += _params.stake;

        // Use .call() since l2Addr could be a contract that needs more gas than
        // the stipend provided by .transfer()
        // The .call() is safe without a re-entrancy guard because this function cannot be re-entered
        // by _params.l2Addr since the function can only be called by the L1Migrator via a cross-chain retryable ticket
        if (_params.fees > 0) {
            (bool ok, ) = _params.l2Addr.call{value: _params.fees}("");
            require(ok, "FINALIZE_DELEGATOR:FAIL_FEE");
        }

        emit MigrateDelegatorFinalized(_params);
    }

    /**
     * @notice Called by L1Migrator to complete unbonding locks migration
     * @param _params L1 state relevant for migration
     */
    function finalizeMigrateUnbondingLocks(
        MigrateUnbondingLocksParams calldata _params
    ) external onlyL1Counterpart(l1MigratorAddr) {
        uint256 unbondingLockIdsLen = _params.unbondingLockIds.length;
        for (uint256 i; i < unbondingLockIdsLen; i++) {
            uint256 id = _params.unbondingLockIds[i];
            require(
                !migratedUnbondingLocks[_params.l1Addr][id],
                "UNBONDING_LOCK_ALREADY_MIGRATED"
            );
            migratedUnbondingLocks[_params.l1Addr][id] = true;
        }

        bondFor(_params.total, _params.l2Addr, _params.delegate);

        emit MigrateUnbondingLocksFinalized(_params);
    }

    /**
     * @notice Called by L1Migrator to complete sender deposit/reserve migration
     * @param _params L1 state relevant for migration
     */
    function finalizeMigrateSender(MigrateSenderParams calldata _params)
        external
        onlyL1Counterpart(l1MigratorAddr)
    {
        require(!migratedSenders[_params.l1Addr], "SENDER_ALREADY_MIGRATED");

        migratedSenders[_params.l1Addr] = true;

        // msg.value for this call must be equal to deposit + reserve amounts
        ITicketBroker(ticketBrokerAddr).fundDepositAndReserveFor{
            value: _params.deposit + _params.reserve
        }(_params.l2Addr, _params.deposit, _params.reserve);

        emit MigrateSenderFinalized(_params);
    }

    receive() external payable {}

    /**
     * @notice Completes delegator migration using a Merkle proof that a delegator's state was included in a state
     * snapshot represented by a Merkle tree root
     * @dev Assume that only EOAs are included in the snapshot
     * Regardless of the caller of this function, the EOA from L1 will be able to access its stake on L2
     * @param _delegate Address that is migrating
     * @param _stake Stake of delegator on L1
     * @param _fees Fees of delegator on L1
     * @param _proof Merkle proof of inclusion in Merkle tree state snapshot
     * @param _newDelegate Optional address of a new delegate on L2
     */
    function claimStake(
        address _delegate,
        uint256 _stake,
        uint256 _fees,
        bytes32[] calldata _proof,
        address _newDelegate
    ) external {
        require(claimStakeEnabled, "CLAIM_STAKE_DISABLED");

        address delegator = msg.sender;

        require(!migratedDelegators[delegator], "CLAIM_STAKE:ALREADY_MIGRATED");

        IMerkleSnapshot merkleSnapshot = IMerkleSnapshot(merkleSnapshotAddr);

        bytes32 leaf = keccak256(
            abi.encodePacked(delegator, _delegate, _stake, _fees)
        );

        require(
            merkleSnapshot.verify(keccak256("LIP-73"), _proof, leaf),
            "CLAIM_STAKE:INVALID_PROOF"
        );

        migratedDelegators[delegator] = true;

        if (_delegate != address(0)) {
            claimedDelegatedStake[_delegate] += _stake;

            address pool = delegatorPools[_delegate];

            address delegate = _delegate;
            if (_newDelegate != address(0)) {
                delegate = _newDelegate;
            }

            if (pool != address(0)) {
                // Claim stake that is held by the delegator pool
                IDelegatorPool(pool).claim(delegator, _stake);
            } else {
                bondFor(_stake, delegator, delegate);
            }
        }

        // Only EOAs are included in the snapshot so we do not need to worry about
        // the insufficeint gas stipend with transfer()
        if (_fees > 0) {
            payable(delegator).transfer(_fees);
        }

        emit StakeClaimed(delegator, _delegate, _stake, _fees);
    }

    function bondFor(
        uint256 _amount,
        address _owner,
        address _to
    ) private {
        IBondingManager bondingManager = IBondingManager(bondingManagerAddr);

        ApproveLike(tokenAddr).approve(address(bondingManager), _amount);
        bondingManager.bondForWithHint(
            _amount,
            _owner,
            _to,
            address(0),
            address(0),
            address(0),
            address(0)
        );
    }

    /**
     * @notice Fetches addresses and sets bondingManagerAddr, ticketBrokerAddr, merkleSnapshotAddr
     * if they are different from the stored addresses
     */
    function syncControllerContracts() public {
        // Check and update BondingManager address
        bytes32 bondingManagerId = keccak256("BondingManager");
        address _bondingManagerAddr = controller.getContract(bondingManagerId);

        if (_bondingManagerAddr != bondingManagerAddr) {
            bondingManagerAddr = _bondingManagerAddr;
            emit ControllerContractUpdate(
                bondingManagerId,
                _bondingManagerAddr
            );
        }

        // Check and update TicketBroker address
        bytes32 ticketBrokerId = keccak256("TicketBroker");
        address _ticketBrokerAddr = controller.getContract(ticketBrokerId);

        if (_ticketBrokerAddr != ticketBrokerAddr) {
            ticketBrokerAddr = _ticketBrokerAddr;
            emit ControllerContractUpdate(ticketBrokerId, _ticketBrokerAddr);
        }

        // Check and update MerkleSnapshot address
        bytes32 merkleSnapshotId = keccak256("MerkleSnapshot");
        address _merkleSnapshotAddr = controller.getContract(merkleSnapshotId);

        if (_merkleSnapshotAddr != merkleSnapshotAddr) {
            merkleSnapshotAddr = _merkleSnapshotAddr;
            emit ControllerContractUpdate(
                merkleSnapshotId,
                _merkleSnapshotAddr
            );
        }

        // Check and update LivepeerToken address
        bytes32 tokenId = keccak256("LivepeerToken");
        address _tokenAddr = controller.getContract(tokenId);

        if (_tokenAddr != tokenAddr) {
            tokenAddr = _tokenAddr;
            emit ControllerContractUpdate(tokenId, _tokenAddr);
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol)

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
        internal
        view
        returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

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

import {IArbSys} from "../../arbitrum/IArbSys.sol";

abstract contract L2ArbitrumMessenger {
    event TxToL1(
        address indexed _from,
        address indexed _to,
        uint256 indexed _id,
        bytes _data
    );

    function sendTxToL1(
        address user,
        address to,
        bytes memory data
    ) internal returns (uint256) {
        // note: this method doesn't support sending ether to L1 together with a call
        uint256 id = IArbSys(address(100)).sendTxToL1(to, data);
        emit TxToL1(user, to, id, data);
        return id;
    }

    modifier onlyL1Counterpart(address l1Counterpart) {
        require(
            msg.sender == applyL1ToL2Alias(l1Counterpart),
            "ONLY_COUNTERPART_GATEWAY"
        );
        _;
    }

    uint160 internal constant OFFSET =
        uint160(0x1111000000000000000000000000000000001111);

    // l1 addresses are transformed durng l1->l2 calls
    function applyL1ToL2Alias(address l1Address)
        internal
        pure
        returns (address l2Address)
    {
        l2Address = address(uint160(l1Address) + OFFSET);
    }
}

// SPDX-License-Identifier: Apache-2.0

/*
 * Copyright 2021, Offchain Labs, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

pragma solidity 0.8.9;

/**
 * @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality.
 */
interface IArbSys {
    /**
     * @notice Get internal version number identifying an ArbOS build
     * @return version number as int
     */
    function arbOSVersion() external pure returns (uint256);

    function arbChainID() external view returns (uint256);

    /**
     * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)
     * @return block number as int
     */
    function arbBlockNumber() external view returns (uint256);

    /**
     * @notice Send given amount of Eth to dest from sender.
     * This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1.
     * @param destination recipient address on L1
     * @return unique identifier for this L2-to-L1 transaction.
     */
    function withdrawEth(address destination)
        external
        payable
        returns (uint256);

    /**
     * @notice Send a transaction to L1
     * @param destination recipient address on L1
     * @param calldataForL1 (optional) calldata for L1 contract call
     * @return a unique identifier for this L2-to-L1 transaction.
     */
    function sendTxToL1(address destination, bytes calldata calldataForL1)
        external
        payable
        returns (uint256);

    /**
     * @notice get the number of transactions issued by the given external account or the account sequence number of the given contract
     * @param account target account
     * @return the number of transactions issued by the given external account or the account sequence number of the given contract
     */
    function getTransactionCount(address account)
        external
        view
        returns (uint256);

    /**
     * @notice get the value of target L2 storage slot
     * This function is only callable from address 0 to prevent contracts from being able to call it
     * @param account target account
     * @param index target index of storage slot
     * @return stotage value for the given account at the given index
     */
    function getStorageAt(address account, uint256 index)
        external
        view
        returns (uint256);

    /**
     * @notice check if current call is coming from l1
     * @return true if the caller of this was called directly from L1
     */
    function isTopLevelCall() external view returns (bool);

    event EthWithdrawal(address indexed destAddr, uint256 amount);

    event L2ToL1Transaction(
        address caller,
        address indexed destination,
        uint256 indexed uniqueId,
        uint256 indexed batchNumber,
        uint256 indexInBatch,
        uint256 arbBlockNum,
        uint256 ethBlockNum,
        uint256 timestamp,
        uint256 callvalue,
        bytes data
    );
}

File 5 of 9 : IMigrator.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IMigrator {
    struct MigrateDelegatorParams {
        // Address that is migrating from L1
        address l1Addr;
        // Address to use on L2
        // If null, l1Addr is used on L2
        address l2Addr;
        // Stake of l1Addr on L1
        uint256 stake;
        // Delegated stake of l1Addr on L1
        uint256 delegatedStake;
        // Fees of l1Addr on L1
        uint256 fees;
        // Delegate of l1Addr on L1
        address delegate;
    }

    struct MigrateUnbondingLocksParams {
        // Address that is migrating from L1
        address l1Addr;
        // Address to use on L2
        // If null, l1Addr is used on L2
        address l2Addr;
        // Total tokens in unbonding locks
        uint256 total;
        // IDs of unbonding locks being migrated
        uint256[] unbondingLockIds;
        // Delegate of l1Addr on L1
        address delegate;
    }

    struct MigrateSenderParams {
        // Address that is migrating from L1
        address l1Addr;
        // Address to use on L2
        // If null, l1Addr is used on L2
        address l2Addr;
        // Deposit of l1Addr on L1
        uint256 deposit;
        // Reserve of l1Addr on L1
        uint256 reserve;
    }
}

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

interface IController {
    function owner() external view returns (address);

    function paused() external view returns (bool);

    function getContract(bytes32 _id) external view returns (address);
}

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

interface IManager {
    event SetController(address controller);

    function setController(address _controller) external;
}

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

import {IManager} from "./IManager.sol";
import {IController} from "./IController.sol";

// Copy of https://github.com/livepeer/protocol/blob/confluence/contracts/Manager.sol
// Tests at https://github.com/livepeer/protocol/blob/confluence/test/unit/ManagerProxy.js
contract Manager is IManager {
    // Controller that contract is registered with
    IController public controller;

    // Check if sender is controller
    modifier onlyController() {
        _onlyController();
        _;
    }

    // Check if sender is controller owner
    modifier onlyControllerOwner() {
        _onlyControllerOwner();
        _;
    }

    // Check if controller is not paused
    modifier whenSystemNotPaused() {
        _whenSystemNotPaused();
        _;
    }

    // Check if controller is paused
    modifier whenSystemPaused() {
        _whenSystemPaused();
        _;
    }

    constructor(address _controller) {
        controller = IController(_controller);
    }

    /**
     * @notice Set controller. Only callable by current controller
     * @param _controller Controller contract address
     */
    function setController(address _controller) external onlyController {
        controller = IController(_controller);

        emit SetController(_controller);
    }

    function _onlyController() private view {
        require(msg.sender == address(controller), "caller must be Controller");
    }

    function _onlyControllerOwner() private view {
        require(
            msg.sender == controller.owner(),
            "caller must be Controller owner"
        );
    }

    function _whenSystemNotPaused() private view {
        require(!controller.paused(), "system is paused");
    }

    function _whenSystemPaused() private view {
        require(controller.paused(), "system is not paused");
    }
}

File 9 of 9 : ManagerProxyTarget.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import "./Manager.sol";

/**
 * @title ManagerProxyTarget
 * @notice The base contract that target contracts used by a proxy contract should inherit from
 * @dev Both the target contract and the proxy contract (implemented as ManagerProxy) MUST inherit from ManagerProxyTarget in order to guarantee
 that both contracts have the same storage layout. Differing storage layouts in a proxy contract and target contract can
 potentially break the delegate proxy upgradeability mechanism
 */
abstract contract ManagerProxyTarget is Manager {
    // Used to look up target contract address in controller's registry
    bytes32 public targetContractId;
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"ClaimStakeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ControllerContractUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"l1Addr","type":"address"},{"indexed":false,"internalType":"address","name":"delegatorPool","type":"address"}],"name":"DelegatorPoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_delegatorPoolImpl","type":"address"}],"name":"DelegatorPoolImplUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_l1MigratorAddr","type":"address"}],"name":"L1MigratorUpdate","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address","name":"delegate","type":"address"}],"indexed":false,"internalType":"struct IMigrator.MigrateDelegatorParams","name":"params","type":"tuple"}],"name":"MigrateDelegatorFinalized","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"indexed":false,"internalType":"struct IMigrator.MigrateSenderParams","name":"params","type":"tuple"}],"name":"MigrateSenderFinalized","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256[]","name":"unbondingLockIds","type":"uint256[]"},{"internalType":"address","name":"delegate","type":"address"}],"indexed":false,"internalType":"struct IMigrator.MigrateUnbondingLocksParams","name":"params","type":"tuple"}],"name":"MigrateUnbondingLocksFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"controller","type":"address"}],"name":"SetController","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"}],"name":"StakeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"TxToL1","type":"event"},{"inputs":[],"name":"bondingManagerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"uint256","name":"_stake","type":"uint256"},{"internalType":"uint256","name":"_fees","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"address","name":"_newDelegate","type":"address"}],"name":"claimStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStakeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedDelegatedStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegatorPoolImpl","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegatorPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address","name":"delegate","type":"address"}],"internalType":"struct IMigrator.MigrateDelegatorParams","name":"_params","type":"tuple"}],"name":"finalizeMigrateDelegator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"internalType":"struct IMigrator.MigrateSenderParams","name":"_params","type":"tuple"}],"name":"finalizeMigrateSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256[]","name":"unbondingLockIds","type":"uint256[]"},{"internalType":"address","name":"delegate","type":"address"}],"internalType":"struct IMigrator.MigrateUnbondingLocksParams","name":"_params","type":"tuple"}],"name":"finalizeMigrateUnbondingLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1MigratorAddr","type":"address"},{"internalType":"address","name":"_delegatorPoolImpl","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l1MigratorAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleSnapshotAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"migratedDelegators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"migratedSenders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"migratedUnbondingLocks","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setClaimStakeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegatorPoolImpl","type":"address"}],"name":"setDelegatorPoolImpl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1MigratorAddr","type":"address"}],"name":"setL1Migrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syncControllerContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetContractId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ticketBrokerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162003952380380620039528339818101604052810190620000379190620000ea565b80806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200011c565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b28262000085565b9050919050565b620000c481620000a5565b8114620000d057600080fd5b50565b600081519050620000e481620000b9565b92915050565b60006020828403121562000103576200010262000080565b5b60006200011384828501620000d3565b91505092915050565b613826806200012c6000396000f3fe60806040526004361061014f5760003560e01c80638a716fbb116100b6578063b76087361161006f578063b760873614610487578063cc14c988146104b0578063d0b1cba2146104d9578063d2f40c5a14610504578063e89320e514610541578063f77c47911461056c57610156565b80638a716fbb146103795780638f2c17ed146103b6578063923f475c146103e157806392eefe9b1461040a57806396f995a214610433578063b3f5ccae1461045e57610156565b8063485cc95511610108578063485cc955146102555780635118d8cf1461027e57806351720b41146102bb5780635cf207f8146102e65780635fbe4d1d1461031157806389bec3441461033c57610156565b80631a0725d81461015b57806324583d97146101845780633aceba5d146101ad5780633f1c49cc146101ea5780633f23f8de146102135780634413a2e71461022a57610156565b3661015657005b600080fd5b34801561016757600080fd5b50610182600480360381019061017d919061261f565b610597565b005b34801561019057600080fd5b506101ab60048036038101906101a691906126aa565b610cf8565b005b3480156101b957600080fd5b506101d460048036038101906101cf91906126aa565b610d7b565b6040516101e191906126f2565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c91906127a8565b610d9b565b005b34801561021f57600080fd5b506102286112a8565b005b34801561023657600080fd5b5061023f61193e565b60405161024c9190612851565b60405180910390f35b34801561026157600080fd5b5061027c6004803603810190610277919061286c565b611964565b005b34801561028a57600080fd5b506102a560048036038101906102a091906126aa565b6119fa565b6040516102b291906128bb565b60405180910390f35b3480156102c757600080fd5b506102d0611a12565b6040516102dd91906128ef565b60405180910390f35b3480156102f257600080fd5b506102fb611a18565b6040516103089190612851565b60405180910390f35b34801561031d57600080fd5b50610326611a3e565b6040516103339190612851565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e919061290a565b611a64565b60405161037091906126f2565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b91906126aa565b611a93565b6040516103ad91906126f2565b60405180910390f35b3480156103c257600080fd5b506103cb611ab3565b6040516103d89190612851565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190612976565b611ad9565b005b34801561041657600080fd5b50610431600480360381019061042c91906126aa565b611b35565b005b34801561043f57600080fd5b50610448611bb7565b60405161045591906126f2565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906129c2565b611bca565b005b34801561049357600080fd5b506104ae60048036038101906104a991906126aa565b611e66565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190612a0e565b611ee9565b005b3480156104e557600080fd5b506104ee61217e565b6040516104fb9190612851565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906126aa565b6121a4565b6040516105389190612851565b60405180910390f35b34801561054d57600080fd5b506105566121d7565b6040516105639190612851565b60405180910390f35b34801561057857600080fd5b506105816121fd565b60405161058e9190612ab6565b60405180910390f35b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166105c381612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062790612b2e565b60405180910390fd5b6008600083600001602081019061064791906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156106cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c690612b9a565b60405180910390fd5b6001600860008460000160208101906106e891906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508160a001602081019061074c91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1682600001602081019061077591906126aa565b73ffffffffffffffffffffffffffffffffffffffff161415610a18576107c482604001358360200160208101906107ac91906126aa565b8460200160208101906107bf91906126aa565b61224a565b6000826040013583606001356107da9190612be9565b90506000600a60008560000160208101906107f591906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261083b9190612be9565b90506000811115610a11576000610873600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661237f565b9050806009600087600001602081019061088d91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610922828287602001602081019061091d91906126aa565b61224a565b8073ffffffffffffffffffffffffffffffffffffffff1663c4d66de8600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161097d9190612851565b600060405180830381600087803b15801561099757600080fd5b505af11580156109ab573d6000803e3d6000fd5b505050508460000160208101906109c291906126aa565b73ffffffffffffffffffffffffffffffffffffffff167ff8a0d4273560c59d7022f3feaae470fc5b68c55cff078a6ab7e618203b53041882604051610a079190612851565b60405180910390a2505b5050610b80565b6000600960008460a0016020810190610a3191906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b4a578073ffffffffffffffffffffffffffffffffffffffff1663aad3ec96846020016020810190610af191906126aa565b85604001356040518363ffffffff1660e01b8152600401610b13929190612c1d565b600060405180830381600087803b158015610b2d57600080fd5b505af1158015610b41573d6000803e3d6000fd5b50505050610b7e565b610b7d8360400135846020016020810190610b6591906126aa565b8560a0016020810190610b7891906126aa565b61224a565b5b505b8160400135600a60008460a0016020810190610b9c91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610be59190612c46565b92505081905550600082608001351115610cbd576000826020016020810190610c0e91906126aa565b73ffffffffffffffffffffffffffffffffffffffff168360800135604051610c3590612ccd565b60006040518083038185875af1925050503d8060008114610c72576040519150601f19603f3d011682016040523d82523d6000602084013e610c77565b606091505b5050905080610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290612d2e565b60405180910390fd5b505b7fab2cb96eeb8726c709227935b01f6a5c6f7e9b518ab69eda0670c7ceda752d1a82604051610cec9190612e45565b60405180910390a15050565b610d00612454565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff274fcfe10d70df2c1a3555476ecfb830e80115781fd0c9a10024291df991b2f81604051610d709190612851565b60405180910390a150565b600c6020528060005260406000206000915054906101000a900460ff1681565b600760149054906101000a900460ff16610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190612eac565b60405180910390fd5b6000339050600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390612f18565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600082898989604051602001610ebc9493929190612fa1565b6040516020818303038152906040528051906020012090508173ffffffffffffffffffffffffffffffffffffffff16630a02831c7facef05f736f89c16facc0f940c13f4c3a386cf48a9b54b50f59defd8b301c40a8888856040518563ffffffff1660e01b8152600401610f339493929190613070565b60206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8391906130c5565b610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb99061313e565b60405180910390fd5b6001600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146111fa5787600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461109d9190612c46565b925050819055506000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008a9050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611145578590505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146111eb578173ffffffffffffffffffffffffffffffffffffffff1663aad3ec96868c6040518363ffffffff1660e01b81526004016111b4929190612c1d565b600060405180830381600087803b1580156111ce57600080fd5b505af11580156111e2573d6000803e3d6000fd5b505050506111f7565b6111f68a868361224a565b5b50505b600087111561124b578273ffffffffffffffffffffffffffffffffffffffff166108fc889081150290604051600060405180830381858888f19350505050158015611249573d6000803e3d6000fd5b505b8273ffffffffffffffffffffffffffffffffffffffff167fc08c27d872ca12215b2df3f441676fe2c084a204a487086d7436a4ac433d417a8a8a8a6040516112959392919061315e565b60405180910390a2505050505050505050565b60007f2517d59a36a86548e38734e8ab416f42afff4bca78706a66ad65750dae7f9e37905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161132991906128ef565b60206040518083038186803b15801561134157600080fd5b505afa158015611355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137991906131aa565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461144b5780600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516114429291906131d7565b60405180910390a15b60007fbd1aa3e8d2464256d7fd3dcf645c16418d5d8c51d971f1ad7d57e7b1b5eee239905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b81526004016114cc91906128ef565b60206040518083038186803b1580156114e457600080fd5b505afa1580156114f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151c91906131aa565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115ee5780600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516115e59291906131d7565b60405180910390a15b60007fb6138afe6f306a47bdf645c5aebcb9781efe787d221a1880e62d1f76dae58b84905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161166f91906128ef565b60206040518083038186803b15801561168757600080fd5b505afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf91906131aa565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117915780600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516117889291906131d7565b60405180910390a15b60007f3443e257065fe41dd0e4d1f5a1b73a22a62e300962b57f30cddf41d0f8273ba7905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161181291906128ef565b60206040518083038186803b15801561182a57600080fd5b505afa15801561183e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186291906131aa565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119345780600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d828260405161192b9291906131d7565b60405180910390a15b5050505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61196c612454565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119f66112a8565b5050565b600a6020528060005260406000206000915090505481565b60015481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60086020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ae1612454565b80600760146101000a81548160ff0219169083151502179055507f370171e543b14c71782f52c505a6b233744e5b2a35486e12ddf379221e49dfaf81604051611b2a91906126f2565b60405180910390a150565b611b3d612561565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f7081604051611bac9190612851565b60405180910390a150565b600760149054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611bf681612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a90612b2e565b60405180910390fd5b600c6000836000016020810190611c7a91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061324c565b60405180910390fd5b6001600c6000846000016020810190611d1b91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663989f789c83606001358460400135611dbe9190612c46565b846020016020810190611dd191906126aa565b856040013586606001356040518563ffffffff1660e01b8152600401611df99392919061315e565b6000604051808303818588803b158015611e1257600080fd5b505af1158015611e26573d6000803e3d6000fd5b50505050507f71adb0cec7763a4cfefd893fc873369117ed172979f7b8f7b683f6a5787c52c082604051611e5a91906132e1565b60405180910390a15050565b611e6e612454565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe51b4d409fd6629b39368b4863ab2212c8e0e0a970dccfaa5800888e507ce79d81604051611ede9190612851565b60405180910390a150565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f1581612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990612b2e565b60405180910390fd5b6000828060600190611f94919061330b565b9050905060005b8181101561210e576000848060600190611fb5919061330b565b83818110611fc657611fc561336e565b5b905060200201359050600b6000866000016020810190611fe691906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff161561207f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612076906133e9565b60405180910390fd5b6001600b600087600001602081019061209891906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061210690613409565b915050611f9b565b50612142836040013584602001602081019061212a91906126aa565b85608001602081019061213d91906126aa565b61224a565b7f9e36876ab9fc404649651fb29b8aebacf24393e00799e53abef98a59c5a003948360405161217191906135d1565b60405180910390a1505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007311110000000000000000000000000000000011118261224391906135f3565b9050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382866040518363ffffffff1660e01b81526004016122ce929190612c1d565b600060405180830381600087803b1580156122e857600080fd5b505af11580156122fc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663ee4e804a8585856000806000806040518863ffffffff1660e01b8152600401612347979695949392919061363d565b600060405180830381600087803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b5050505050505050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f0915050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906136f8565b60405180910390fd5b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124ba57600080fd5b505afa1580156124ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f291906131aa565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690613764565b60405180910390fd5b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e6906137d0565b60405180910390fd5b565b600080fd5b600080fd5b600080fd5b600060c08284031215612616576126156125fb565b5b81905092915050565b600060c08284031215612635576126346125f1565b5b600061264384828501612600565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126778261264c565b9050919050565b6126878161266c565b811461269257600080fd5b50565b6000813590506126a48161267e565b92915050565b6000602082840312156126c0576126bf6125f1565b5b60006126ce84828501612695565b91505092915050565b60008115159050919050565b6126ec816126d7565b82525050565b600060208201905061270760008301846126e3565b92915050565b6000819050919050565b6127208161270d565b811461272b57600080fd5b50565b60008135905061273d81612717565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261276857612767612743565b5b8235905067ffffffffffffffff81111561278557612784612748565b5b6020830191508360208202830111156127a1576127a061274d565b5b9250929050565b60008060008060008060a087890312156127c5576127c46125f1565b5b60006127d389828a01612695565b96505060206127e489828a0161272e565b95505060406127f589828a0161272e565b945050606087013567ffffffffffffffff811115612816576128156125f6565b5b61282289828a01612752565b9350935050608061283589828a01612695565b9150509295509295509295565b61284b8161266c565b82525050565b60006020820190506128666000830184612842565b92915050565b60008060408385031215612883576128826125f1565b5b600061289185828601612695565b92505060206128a285828601612695565b9150509250929050565b6128b58161270d565b82525050565b60006020820190506128d060008301846128ac565b92915050565b6000819050919050565b6128e9816128d6565b82525050565b600060208201905061290460008301846128e0565b92915050565b60008060408385031215612921576129206125f1565b5b600061292f85828601612695565b92505060206129408582860161272e565b9150509250929050565b612953816126d7565b811461295e57600080fd5b50565b6000813590506129708161294a565b92915050565b60006020828403121561298c5761298b6125f1565b5b600061299a84828501612961565b91505092915050565b6000608082840312156129b9576129b86125fb565b5b81905092915050565b6000608082840312156129d8576129d76125f1565b5b60006129e6848285016129a3565b91505092915050565b600060a08284031215612a0557612a046125fb565b5b81905092915050565b600060208284031215612a2457612a236125f1565b5b600082013567ffffffffffffffff811115612a4257612a416125f6565b5b612a4e848285016129ef565b91505092915050565b6000819050919050565b6000612a7c612a77612a728461264c565b612a57565b61264c565b9050919050565b6000612a8e82612a61565b9050919050565b6000612aa082612a83565b9050919050565b612ab081612a95565b82525050565b6000602082019050612acb6000830184612aa7565b92915050565b600082825260208201905092915050565b7f4f4e4c595f434f554e544552504152545f474154455741590000000000000000600082015250565b6000612b18601883612ad1565b9150612b2382612ae2565b602082019050919050565b60006020820190508181036000830152612b4781612b0b565b9050919050565b7f44454c454741544f525f414c52454144595f4d49475241544544000000000000600082015250565b6000612b84601a83612ad1565b9150612b8f82612b4e565b602082019050919050565b60006020820190508181036000830152612bb381612b77565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bf48261270d565b9150612bff8361270d565b925082821015612c1257612c11612bba565b5b828203905092915050565b6000604082019050612c326000830185612842565b612c3f60208301846128ac565b9392505050565b6000612c518261270d565b9150612c5c8361270d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9157612c90612bba565b5b828201905092915050565b600081905092915050565b50565b6000612cb7600083612c9c565b9150612cc282612ca7565b600082019050919050565b6000612cd882612caa565b9150819050919050565b7f46494e414c495a455f44454c454741544f523a4641494c5f4645450000000000600082015250565b6000612d18601b83612ad1565b9150612d2382612ce2565b602082019050919050565b60006020820190508181036000830152612d4781612d0b565b9050919050565b6000612d5d6020840184612695565b905092915050565b612d6e8161266c565b82525050565b6000612d83602084018461272e565b905092915050565b612d948161270d565b82525050565b60c08201612dab6000830183612d4e565b612db86000850182612d65565b50612dc66020830183612d4e565b612dd36020850182612d65565b50612de16040830183612d74565b612dee6040850182612d8b565b50612dfc6060830183612d74565b612e096060850182612d8b565b50612e176080830183612d74565b612e246080850182612d8b565b50612e3260a0830183612d4e565b612e3f60a0850182612d65565b50505050565b600060c082019050612e5a6000830184612d9a565b92915050565b7f434c41494d5f5354414b455f44495341424c4544000000000000000000000000600082015250565b6000612e96601483612ad1565b9150612ea182612e60565b602082019050919050565b60006020820190508181036000830152612ec581612e89565b9050919050565b7f434c41494d5f5354414b453a414c52454144595f4d4947524154454400000000600082015250565b6000612f02601c83612ad1565b9150612f0d82612ecc565b602082019050919050565b60006020820190508181036000830152612f3181612ef5565b9050919050565b60008160601b9050919050565b6000612f5082612f38565b9050919050565b6000612f6282612f45565b9050919050565b612f7a612f758261266c565b612f57565b82525050565b6000819050919050565b612f9b612f968261270d565b612f80565b82525050565b6000612fad8287612f69565b601482019150612fbd8286612f69565b601482019150612fcd8285612f8a565b602082019150612fdd8284612f8a565b60208201915081905095945050505050565b600082825260208201905092915050565b600080fd5b82818337600083830152505050565b60006130208385612fef565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561305357613052613000565b5b602083029250613064838584613005565b82840190509392505050565b600060608201905061308560008301876128e0565b8181036020830152613098818587613014565b90506130a760408301846128e0565b95945050505050565b6000815190506130bf8161294a565b92915050565b6000602082840312156130db576130da6125f1565b5b60006130e9848285016130b0565b91505092915050565b7f434c41494d5f5354414b453a494e56414c49445f50524f4f4600000000000000600082015250565b6000613128601983612ad1565b9150613133826130f2565b602082019050919050565b600060208201905081810360008301526131578161311b565b9050919050565b60006060820190506131736000830186612842565b61318060208301856128ac565b61318d60408301846128ac565b949350505050565b6000815190506131a48161267e565b92915050565b6000602082840312156131c0576131bf6125f1565b5b60006131ce84828501613195565b91505092915050565b60006040820190506131ec60008301856128e0565b6131f96020830184612842565b9392505050565b7f53454e4445525f414c52454144595f4d49475241544544000000000000000000600082015250565b6000613236601783612ad1565b915061324182613200565b602082019050919050565b6000602082019050818103600083015261326581613229565b9050919050565b6080820161327d6000830183612d4e565b61328a6000850182612d65565b506132986020830183612d4e565b6132a56020850182612d65565b506132b36040830183612d74565b6132c06040850182612d8b565b506132ce6060830183612d74565b6132db6060850182612d8b565b50505050565b60006080820190506132f6600083018461326c565b92915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613328576133276132fc565b5b80840192508235915067ffffffffffffffff82111561334a57613349613301565b5b60208301925060208202360383131561336657613365613306565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f554e424f4e44494e475f4c4f434b5f414c52454144595f4d4947524154454400600082015250565b60006133d3601f83612ad1565b91506133de8261339d565b602082019050919050565b60006020820190508181036000830152613402816133c6565b9050919050565b60006134148261270d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561344757613446612bba565b5b600182019050919050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261347e5761347d61345c565b5b83810192508235915060208301925067ffffffffffffffff8211156134a6576134a5613452565b5b6020820236038413156134bc576134bb613457565b5b509250929050565b600082825260208201905092915050565b60006134e183856134c4565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561351457613513613000565b5b602083029250613525838584613005565b82840190509392505050565b600060a083016135446000840184612d4e565b6135516000860182612d65565b5061355f6020840184612d4e565b61356c6020860182612d65565b5061357a6040840184612d74565b6135876040860182612d8b565b506135956060840184613461565b85830360608701526135a88382846134d5565b925050506135b96080840184612d4e565b6135c66080860182612d65565b508091505092915050565b600060208201905081810360008301526135eb8184613531565b905092915050565b60006135fe8261264c565b91506136098361264c565b92508273ffffffffffffffffffffffffffffffffffffffff0382111561363257613631612bba565b5b828201905092915050565b600060e082019050613652600083018a6128ac565b61365f6020830189612842565b61366c6040830188612842565b6136796060830187612842565b6136866080830186612842565b61369360a0830185612842565b6136a060c0830184612842565b98975050505050505050565b7f455243313136373a20637265617465206661696c656400000000000000000000600082015250565b60006136e2601683612ad1565b91506136ed826136ac565b602082019050919050565b60006020820190508181036000830152613711816136d5565b9050919050565b7f63616c6c6572206d75737420626520436f6e74726f6c6c6572206f776e657200600082015250565b600061374e601f83612ad1565b915061375982613718565b602082019050919050565b6000602082019050818103600083015261377d81613741565b9050919050565b7f63616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000600082015250565b60006137ba601983612ad1565b91506137c582613784565b602082019050919050565b600060208201905081810360008301526137e9816137ad565b905091905056fea264697066735822122066b86eceb7ddfc038bc8e5be0f564cb4e2c604e36eababd132fa6d053e0abd6864736f6c63430008090033000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee4

Deployed Bytecode

0x60806040526004361061014f5760003560e01c80638a716fbb116100b6578063b76087361161006f578063b760873614610487578063cc14c988146104b0578063d0b1cba2146104d9578063d2f40c5a14610504578063e89320e514610541578063f77c47911461056c57610156565b80638a716fbb146103795780638f2c17ed146103b6578063923f475c146103e157806392eefe9b1461040a57806396f995a214610433578063b3f5ccae1461045e57610156565b8063485cc95511610108578063485cc955146102555780635118d8cf1461027e57806351720b41146102bb5780635cf207f8146102e65780635fbe4d1d1461031157806389bec3441461033c57610156565b80631a0725d81461015b57806324583d97146101845780633aceba5d146101ad5780633f1c49cc146101ea5780633f23f8de146102135780634413a2e71461022a57610156565b3661015657005b600080fd5b34801561016757600080fd5b50610182600480360381019061017d919061261f565b610597565b005b34801561019057600080fd5b506101ab60048036038101906101a691906126aa565b610cf8565b005b3480156101b957600080fd5b506101d460048036038101906101cf91906126aa565b610d7b565b6040516101e191906126f2565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c91906127a8565b610d9b565b005b34801561021f57600080fd5b506102286112a8565b005b34801561023657600080fd5b5061023f61193e565b60405161024c9190612851565b60405180910390f35b34801561026157600080fd5b5061027c6004803603810190610277919061286c565b611964565b005b34801561028a57600080fd5b506102a560048036038101906102a091906126aa565b6119fa565b6040516102b291906128bb565b60405180910390f35b3480156102c757600080fd5b506102d0611a12565b6040516102dd91906128ef565b60405180910390f35b3480156102f257600080fd5b506102fb611a18565b6040516103089190612851565b60405180910390f35b34801561031d57600080fd5b50610326611a3e565b6040516103339190612851565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e919061290a565b611a64565b60405161037091906126f2565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b91906126aa565b611a93565b6040516103ad91906126f2565b60405180910390f35b3480156103c257600080fd5b506103cb611ab3565b6040516103d89190612851565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190612976565b611ad9565b005b34801561041657600080fd5b50610431600480360381019061042c91906126aa565b611b35565b005b34801561043f57600080fd5b50610448611bb7565b60405161045591906126f2565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906129c2565b611bca565b005b34801561049357600080fd5b506104ae60048036038101906104a991906126aa565b611e66565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190612a0e565b611ee9565b005b3480156104e557600080fd5b506104ee61217e565b6040516104fb9190612851565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906126aa565b6121a4565b6040516105389190612851565b60405180910390f35b34801561054d57600080fd5b506105566121d7565b6040516105639190612851565b60405180910390f35b34801561057857600080fd5b506105816121fd565b60405161058e9190612ab6565b60405180910390f35b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166105c381612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062790612b2e565b60405180910390fd5b6008600083600001602081019061064791906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156106cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c690612b9a565b60405180910390fd5b6001600860008460000160208101906106e891906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508160a001602081019061074c91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1682600001602081019061077591906126aa565b73ffffffffffffffffffffffffffffffffffffffff161415610a18576107c482604001358360200160208101906107ac91906126aa565b8460200160208101906107bf91906126aa565b61224a565b6000826040013583606001356107da9190612be9565b90506000600a60008560000160208101906107f591906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261083b9190612be9565b90506000811115610a11576000610873600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661237f565b9050806009600087600001602081019061088d91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610922828287602001602081019061091d91906126aa565b61224a565b8073ffffffffffffffffffffffffffffffffffffffff1663c4d66de8600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161097d9190612851565b600060405180830381600087803b15801561099757600080fd5b505af11580156109ab573d6000803e3d6000fd5b505050508460000160208101906109c291906126aa565b73ffffffffffffffffffffffffffffffffffffffff167ff8a0d4273560c59d7022f3feaae470fc5b68c55cff078a6ab7e618203b53041882604051610a079190612851565b60405180910390a2505b5050610b80565b6000600960008460a0016020810190610a3191906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b4a578073ffffffffffffffffffffffffffffffffffffffff1663aad3ec96846020016020810190610af191906126aa565b85604001356040518363ffffffff1660e01b8152600401610b13929190612c1d565b600060405180830381600087803b158015610b2d57600080fd5b505af1158015610b41573d6000803e3d6000fd5b50505050610b7e565b610b7d8360400135846020016020810190610b6591906126aa565b8560a0016020810190610b7891906126aa565b61224a565b5b505b8160400135600a60008460a0016020810190610b9c91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610be59190612c46565b92505081905550600082608001351115610cbd576000826020016020810190610c0e91906126aa565b73ffffffffffffffffffffffffffffffffffffffff168360800135604051610c3590612ccd565b60006040518083038185875af1925050503d8060008114610c72576040519150601f19603f3d011682016040523d82523d6000602084013e610c77565b606091505b5050905080610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290612d2e565b60405180910390fd5b505b7fab2cb96eeb8726c709227935b01f6a5c6f7e9b518ab69eda0670c7ceda752d1a82604051610cec9190612e45565b60405180910390a15050565b610d00612454565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff274fcfe10d70df2c1a3555476ecfb830e80115781fd0c9a10024291df991b2f81604051610d709190612851565b60405180910390a150565b600c6020528060005260406000206000915054906101000a900460ff1681565b600760149054906101000a900460ff16610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190612eac565b60405180910390fd5b6000339050600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390612f18565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600082898989604051602001610ebc9493929190612fa1565b6040516020818303038152906040528051906020012090508173ffffffffffffffffffffffffffffffffffffffff16630a02831c7facef05f736f89c16facc0f940c13f4c3a386cf48a9b54b50f59defd8b301c40a8888856040518563ffffffff1660e01b8152600401610f339493929190613070565b60206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8391906130c5565b610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb99061313e565b60405180910390fd5b6001600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146111fa5787600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461109d9190612c46565b925050819055506000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008a9050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611145578590505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146111eb578173ffffffffffffffffffffffffffffffffffffffff1663aad3ec96868c6040518363ffffffff1660e01b81526004016111b4929190612c1d565b600060405180830381600087803b1580156111ce57600080fd5b505af11580156111e2573d6000803e3d6000fd5b505050506111f7565b6111f68a868361224a565b5b50505b600087111561124b578273ffffffffffffffffffffffffffffffffffffffff166108fc889081150290604051600060405180830381858888f19350505050158015611249573d6000803e3d6000fd5b505b8273ffffffffffffffffffffffffffffffffffffffff167fc08c27d872ca12215b2df3f441676fe2c084a204a487086d7436a4ac433d417a8a8a8a6040516112959392919061315e565b60405180910390a2505050505050505050565b60007f2517d59a36a86548e38734e8ab416f42afff4bca78706a66ad65750dae7f9e37905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161132991906128ef565b60206040518083038186803b15801561134157600080fd5b505afa158015611355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137991906131aa565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461144b5780600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516114429291906131d7565b60405180910390a15b60007fbd1aa3e8d2464256d7fd3dcf645c16418d5d8c51d971f1ad7d57e7b1b5eee239905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b81526004016114cc91906128ef565b60206040518083038186803b1580156114e457600080fd5b505afa1580156114f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151c91906131aa565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115ee5780600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516115e59291906131d7565b60405180910390a15b60007fb6138afe6f306a47bdf645c5aebcb9781efe787d221a1880e62d1f76dae58b84905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161166f91906128ef565b60206040518083038186803b15801561168757600080fd5b505afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf91906131aa565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117915780600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d82826040516117889291906131d7565b60405180910390a15b60007f3443e257065fe41dd0e4d1f5a1b73a22a62e300962b57f30cddf41d0f8273ba7905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e16c7d98836040518263ffffffff1660e01b815260040161181291906128ef565b60206040518083038186803b15801561182a57600080fd5b505afa15801561183e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186291906131aa565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119345780600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb8d523c5d6602683fc3e40e21a9be346f970802af52c8e045e813541394d264d828260405161192b9291906131d7565b60405180910390a15b5050505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61196c612454565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119f66112a8565b5050565b600a6020528060005260406000206000915090505481565b60015481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60086020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ae1612454565b80600760146101000a81548160ff0219169083151502179055507f370171e543b14c71782f52c505a6b233744e5b2a35486e12ddf379221e49dfaf81604051611b2a91906126f2565b60405180910390a150565b611b3d612561565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f7081604051611bac9190612851565b60405180910390a150565b600760149054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611bf681612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5a90612b2e565b60405180910390fd5b600c6000836000016020810190611c7a91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061324c565b60405180910390fd5b6001600c6000846000016020810190611d1b91906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663989f789c83606001358460400135611dbe9190612c46565b846020016020810190611dd191906126aa565b856040013586606001356040518563ffffffff1660e01b8152600401611df99392919061315e565b6000604051808303818588803b158015611e1257600080fd5b505af1158015611e26573d6000803e3d6000fd5b50505050507f71adb0cec7763a4cfefd893fc873369117ed172979f7b8f7b683f6a5787c52c082604051611e5a91906132e1565b60405180910390a15050565b611e6e612454565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe51b4d409fd6629b39368b4863ab2212c8e0e0a970dccfaa5800888e507ce79d81604051611ede9190612851565b60405180910390a150565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f1581612221565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990612b2e565b60405180910390fd5b6000828060600190611f94919061330b565b9050905060005b8181101561210e576000848060600190611fb5919061330b565b83818110611fc657611fc561336e565b5b905060200201359050600b6000866000016020810190611fe691906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff161561207f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612076906133e9565b60405180910390fd5b6001600b600087600001602081019061209891906126aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061210690613409565b915050611f9b565b50612142836040013584602001602081019061212a91906126aa565b85608001602081019061213d91906126aa565b61224a565b7f9e36876ab9fc404649651fb29b8aebacf24393e00799e53abef98a59c5a003948360405161217191906135d1565b60405180910390a1505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007311110000000000000000000000000000000011118261224391906135f3565b9050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382866040518363ffffffff1660e01b81526004016122ce929190612c1d565b600060405180830381600087803b1580156122e857600080fd5b505af11580156122fc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663ee4e804a8585856000806000806040518863ffffffff1660e01b8152600401612347979695949392919061363d565b600060405180830381600087803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b5050505050505050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f0915050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906136f8565b60405180910390fd5b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124ba57600080fd5b505afa1580156124ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f291906131aa565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690613764565b60405180910390fd5b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e6906137d0565b60405180910390fd5b565b600080fd5b600080fd5b600080fd5b600060c08284031215612616576126156125fb565b5b81905092915050565b600060c08284031215612635576126346125f1565b5b600061264384828501612600565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126778261264c565b9050919050565b6126878161266c565b811461269257600080fd5b50565b6000813590506126a48161267e565b92915050565b6000602082840312156126c0576126bf6125f1565b5b60006126ce84828501612695565b91505092915050565b60008115159050919050565b6126ec816126d7565b82525050565b600060208201905061270760008301846126e3565b92915050565b6000819050919050565b6127208161270d565b811461272b57600080fd5b50565b60008135905061273d81612717565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261276857612767612743565b5b8235905067ffffffffffffffff81111561278557612784612748565b5b6020830191508360208202830111156127a1576127a061274d565b5b9250929050565b60008060008060008060a087890312156127c5576127c46125f1565b5b60006127d389828a01612695565b96505060206127e489828a0161272e565b95505060406127f589828a0161272e565b945050606087013567ffffffffffffffff811115612816576128156125f6565b5b61282289828a01612752565b9350935050608061283589828a01612695565b9150509295509295509295565b61284b8161266c565b82525050565b60006020820190506128666000830184612842565b92915050565b60008060408385031215612883576128826125f1565b5b600061289185828601612695565b92505060206128a285828601612695565b9150509250929050565b6128b58161270d565b82525050565b60006020820190506128d060008301846128ac565b92915050565b6000819050919050565b6128e9816128d6565b82525050565b600060208201905061290460008301846128e0565b92915050565b60008060408385031215612921576129206125f1565b5b600061292f85828601612695565b92505060206129408582860161272e565b9150509250929050565b612953816126d7565b811461295e57600080fd5b50565b6000813590506129708161294a565b92915050565b60006020828403121561298c5761298b6125f1565b5b600061299a84828501612961565b91505092915050565b6000608082840312156129b9576129b86125fb565b5b81905092915050565b6000608082840312156129d8576129d76125f1565b5b60006129e6848285016129a3565b91505092915050565b600060a08284031215612a0557612a046125fb565b5b81905092915050565b600060208284031215612a2457612a236125f1565b5b600082013567ffffffffffffffff811115612a4257612a416125f6565b5b612a4e848285016129ef565b91505092915050565b6000819050919050565b6000612a7c612a77612a728461264c565b612a57565b61264c565b9050919050565b6000612a8e82612a61565b9050919050565b6000612aa082612a83565b9050919050565b612ab081612a95565b82525050565b6000602082019050612acb6000830184612aa7565b92915050565b600082825260208201905092915050565b7f4f4e4c595f434f554e544552504152545f474154455741590000000000000000600082015250565b6000612b18601883612ad1565b9150612b2382612ae2565b602082019050919050565b60006020820190508181036000830152612b4781612b0b565b9050919050565b7f44454c454741544f525f414c52454144595f4d49475241544544000000000000600082015250565b6000612b84601a83612ad1565b9150612b8f82612b4e565b602082019050919050565b60006020820190508181036000830152612bb381612b77565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bf48261270d565b9150612bff8361270d565b925082821015612c1257612c11612bba565b5b828203905092915050565b6000604082019050612c326000830185612842565b612c3f60208301846128ac565b9392505050565b6000612c518261270d565b9150612c5c8361270d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9157612c90612bba565b5b828201905092915050565b600081905092915050565b50565b6000612cb7600083612c9c565b9150612cc282612ca7565b600082019050919050565b6000612cd882612caa565b9150819050919050565b7f46494e414c495a455f44454c454741544f523a4641494c5f4645450000000000600082015250565b6000612d18601b83612ad1565b9150612d2382612ce2565b602082019050919050565b60006020820190508181036000830152612d4781612d0b565b9050919050565b6000612d5d6020840184612695565b905092915050565b612d6e8161266c565b82525050565b6000612d83602084018461272e565b905092915050565b612d948161270d565b82525050565b60c08201612dab6000830183612d4e565b612db86000850182612d65565b50612dc66020830183612d4e565b612dd36020850182612d65565b50612de16040830183612d74565b612dee6040850182612d8b565b50612dfc6060830183612d74565b612e096060850182612d8b565b50612e176080830183612d74565b612e246080850182612d8b565b50612e3260a0830183612d4e565b612e3f60a0850182612d65565b50505050565b600060c082019050612e5a6000830184612d9a565b92915050565b7f434c41494d5f5354414b455f44495341424c4544000000000000000000000000600082015250565b6000612e96601483612ad1565b9150612ea182612e60565b602082019050919050565b60006020820190508181036000830152612ec581612e89565b9050919050565b7f434c41494d5f5354414b453a414c52454144595f4d4947524154454400000000600082015250565b6000612f02601c83612ad1565b9150612f0d82612ecc565b602082019050919050565b60006020820190508181036000830152612f3181612ef5565b9050919050565b60008160601b9050919050565b6000612f5082612f38565b9050919050565b6000612f6282612f45565b9050919050565b612f7a612f758261266c565b612f57565b82525050565b6000819050919050565b612f9b612f968261270d565b612f80565b82525050565b6000612fad8287612f69565b601482019150612fbd8286612f69565b601482019150612fcd8285612f8a565b602082019150612fdd8284612f8a565b60208201915081905095945050505050565b600082825260208201905092915050565b600080fd5b82818337600083830152505050565b60006130208385612fef565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561305357613052613000565b5b602083029250613064838584613005565b82840190509392505050565b600060608201905061308560008301876128e0565b8181036020830152613098818587613014565b90506130a760408301846128e0565b95945050505050565b6000815190506130bf8161294a565b92915050565b6000602082840312156130db576130da6125f1565b5b60006130e9848285016130b0565b91505092915050565b7f434c41494d5f5354414b453a494e56414c49445f50524f4f4600000000000000600082015250565b6000613128601983612ad1565b9150613133826130f2565b602082019050919050565b600060208201905081810360008301526131578161311b565b9050919050565b60006060820190506131736000830186612842565b61318060208301856128ac565b61318d60408301846128ac565b949350505050565b6000815190506131a48161267e565b92915050565b6000602082840312156131c0576131bf6125f1565b5b60006131ce84828501613195565b91505092915050565b60006040820190506131ec60008301856128e0565b6131f96020830184612842565b9392505050565b7f53454e4445525f414c52454144595f4d49475241544544000000000000000000600082015250565b6000613236601783612ad1565b915061324182613200565b602082019050919050565b6000602082019050818103600083015261326581613229565b9050919050565b6080820161327d6000830183612d4e565b61328a6000850182612d65565b506132986020830183612d4e565b6132a56020850182612d65565b506132b36040830183612d74565b6132c06040850182612d8b565b506132ce6060830183612d74565b6132db6060850182612d8b565b50505050565b60006080820190506132f6600083018461326c565b92915050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613328576133276132fc565b5b80840192508235915067ffffffffffffffff82111561334a57613349613301565b5b60208301925060208202360383131561336657613365613306565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f554e424f4e44494e475f4c4f434b5f414c52454144595f4d4947524154454400600082015250565b60006133d3601f83612ad1565b91506133de8261339d565b602082019050919050565b60006020820190508181036000830152613402816133c6565b9050919050565b60006134148261270d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561344757613446612bba565b5b600182019050919050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261347e5761347d61345c565b5b83810192508235915060208301925067ffffffffffffffff8211156134a6576134a5613452565b5b6020820236038413156134bc576134bb613457565b5b509250929050565b600082825260208201905092915050565b60006134e183856134c4565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561351457613513613000565b5b602083029250613525838584613005565b82840190509392505050565b600060a083016135446000840184612d4e565b6135516000860182612d65565b5061355f6020840184612d4e565b61356c6020860182612d65565b5061357a6040840184612d74565b6135876040860182612d8b565b506135956060840184613461565b85830360608701526135a88382846134d5565b925050506135b96080840184612d4e565b6135c66080860182612d65565b508091505092915050565b600060208201905081810360008301526135eb8184613531565b905092915050565b60006135fe8261264c565b91506136098361264c565b92508273ffffffffffffffffffffffffffffffffffffffff0382111561363257613631612bba565b5b828201905092915050565b600060e082019050613652600083018a6128ac565b61365f6020830189612842565b61366c6040830188612842565b6136796060830187612842565b6136866080830186612842565b61369360a0830185612842565b6136a060c0830184612842565b98975050505050505050565b7f455243313136373a20637265617465206661696c656400000000000000000000600082015250565b60006136e2601683612ad1565b91506136ed826136ac565b602082019050919050565b60006020820190508181036000830152613711816136d5565b9050919050565b7f63616c6c6572206d75737420626520436f6e74726f6c6c6572206f776e657200600082015250565b600061374e601f83612ad1565b915061375982613718565b602082019050919050565b6000602082019050818103600083015261377d81613741565b9050919050565b7f63616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000600082015250565b60006137ba601983612ad1565b91506137c582613784565b602082019050919050565b600060208201905081810360008301526137e9816137ad565b905091905056fea264697066735822122066b86eceb7ddfc038bc8e5be0f564cb4e2c604e36eababd132fa6d053e0abd6864736f6c63430008090033

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

000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee4

-----Decoded View---------------
Arg [0] : _controller (address): 0xD8E8328501E9645d16Cf49539efC04f734606ee4

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee4


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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