ETH Price: $2,177.84 (+3.59%)

Contract

0x53aD4Cd1F1e52DD02aa9FC4A8250A1b74F351CA2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Campaign246670962026-03-16 2:31:5916 mins ago1773628319IN
0x53aD4Cd1...74F351CA2
0.00032849 ETH0.000046790.15198278
Create Campaign246670952026-03-16 2:31:4716 mins ago1773628307IN
0x53aD4Cd1...74F351CA2
0.00032849 ETH0.000047930.15327987
Create Campaign246670922026-03-16 2:31:1117 mins ago1773628271IN
0x53aD4Cd1...74F351CA2
0.00032849 ETH0.000048430.15490563
Create Campaign246670622026-03-16 2:25:1123 mins ago1773627911IN
0x53aD4Cd1...74F351CA2
0.00033058 ETH0.0000480.15456151
Create Campaign246670432026-03-16 2:21:2326 mins ago1773627683IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000047830.15165619
Create Campaign246670422026-03-16 2:21:1127 mins ago1773627671IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000047680.15118859
Create Campaign246670412026-03-16 2:20:5927 mins ago1773627659IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000047150.14950935
Create Campaign246670392026-03-16 2:20:3527 mins ago1773627635IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000044180.1400988
Create Campaign246670382026-03-16 2:20:1128 mins ago1773627611IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000044470.14100294
Create Campaign246670372026-03-16 2:19:5928 mins ago1773627599IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000044620.14148285
Create Campaign246670362026-03-16 2:19:4728 mins ago1773627587IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000045380.14391049
Create Campaign246670342026-03-16 2:19:2328 mins ago1773627563IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000044540.14123028
Create Campaign246670312026-03-16 2:18:4729 mins ago1773627527IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.00004510.14300186
Create Campaign246670302026-03-16 2:18:3529 mins ago1773627515IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000045010.14270733
Create Campaign246670292026-03-16 2:18:2329 mins ago1773627503IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.00004370.13856122
Create Campaign246670272026-03-16 2:17:5930 mins ago1773627479IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.00004450.14110702
Manage Campaign246669252026-03-16 1:57:3550 mins ago1773626255IN
0x53aD4Cd1...74F351CA2
0.00028758 ETH0.000039980.13661105
Manage Campaign246669082026-03-16 1:54:1154 mins ago1773626051IN
0x53aD4Cd1...74F351CA2
0.00028758 ETH0.000037540.12829044
Create Campaign246667452026-03-16 1:21:351 hr ago1773624095IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000052890.17029218
Create Campaign246667442026-03-16 1:21:231 hr ago1773624083IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000053610.1699914
Create Campaign246667442026-03-16 1:21:231 hr ago1773624083IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000053610.1699914
Create Campaign246667432026-03-16 1:21:111 hr ago1773624071IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000051690.16390524
Create Campaign246667432026-03-16 1:21:111 hr ago1773624071IN
0x53aD4Cd1...74F351CA2
0.00033049 ETH0.000051690.16390524
Create Campaign246503062026-03-13 18:22:112 days ago1773426131IN
0x53aD4Cd1...74F351CA2
0.00032875 ETH0.000079890.26501175
Create Campaign246502972026-03-13 18:20:232 days ago1773426023IN
0x53aD4Cd1...74F351CA2
0.00032875 ETH0.000076920.25516401
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Send Message246670962026-03-16 2:31:5916 mins ago1773628319
0x53aD4Cd1...74F351CA2
0.00032849 ETH
Send Message246670952026-03-16 2:31:4716 mins ago1773628307
0x53aD4Cd1...74F351CA2
0.00032849 ETH
Send Message246670922026-03-16 2:31:1117 mins ago1773628271
0x53aD4Cd1...74F351CA2
0.00032849 ETH
Send Message246670622026-03-16 2:25:1123 mins ago1773627911
0x53aD4Cd1...74F351CA2
0.00033058 ETH
Send Message246670432026-03-16 2:21:2326 mins ago1773627683
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670422026-03-16 2:21:1127 mins ago1773627671
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670412026-03-16 2:20:5927 mins ago1773627659
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670392026-03-16 2:20:3527 mins ago1773627635
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670382026-03-16 2:20:1128 mins ago1773627611
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670372026-03-16 2:19:5928 mins ago1773627599
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670362026-03-16 2:19:4728 mins ago1773627587
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670342026-03-16 2:19:2328 mins ago1773627563
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670312026-03-16 2:18:4729 mins ago1773627527
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670302026-03-16 2:18:3529 mins ago1773627515
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670292026-03-16 2:18:2329 mins ago1773627503
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246670272026-03-16 2:17:5930 mins ago1773627479
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246669252026-03-16 1:57:3550 mins ago1773626255
0x53aD4Cd1...74F351CA2
0.00028758 ETH
Send Message246669082026-03-16 1:54:1154 mins ago1773626051
0x53aD4Cd1...74F351CA2
0.00028758 ETH
Send Message246667452026-03-16 1:21:351 hr ago1773624095
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246667442026-03-16 1:21:231 hr ago1773624083
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246667442026-03-16 1:21:231 hr ago1773624083
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246667432026-03-16 1:21:111 hr ago1773624071
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246667432026-03-16 1:21:111 hr ago1773624071
0x53aD4Cd1...74F351CA2
0.00033049 ETH
Send Message246651962026-03-15 20:10:476 hrs ago1773605447
0x53aD4Cd1...74F351CA2
0.00205 ETH
Create Campaign246651962026-03-15 20:10:476 hrs ago1773605447
0x53aD4Cd1...74F351CA2
0.00205 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CampaignRemoteManager

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion, GNU AGPLv3 license
/**
 *Submitted for verification at Etherscan.io on 2025-02-17
*/

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity =0.8.19 ^0.8.4;

// node_modules/solady/src/auth/Ownable.sol

/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The caller is not authorized to call the function.
    error Unauthorized();

    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();

    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();

    /// @dev Cannot double-initialize.
    error AlreadyInitialized();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership is transferred from `oldOwner` to `newOwner`.
    /// This event is intentionally kept the same as OpenZeppelin's Ownable to be
    /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
    /// despite it not being as lightweight as a single argument event.
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);

    /// @dev An ownership handover to `pendingOwner` has been requested.
    event OwnershipHandoverRequested(address indexed pendingOwner);

    /// @dev The ownership handover to `pendingOwner` has been canceled.
    event OwnershipHandoverCanceled(address indexed pendingOwner);

    /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
    uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
        0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;

    /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
        0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;

    /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
        0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The owner slot is given by:
    /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
    /// It is intentionally chosen to be a high value
    /// to avoid collision with lower slots.
    /// The choice of manual storage layout is to enable compatibility
    /// with both regular and upgradeable contracts.
    bytes32 internal constant _OWNER_SLOT =
        0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;

    /// The ownership handover slot of `newOwner` is given by:
    /// ```
    ///     mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
    ///     let handoverSlot := keccak256(0x00, 0x20)
    /// ```
    /// It stores the expiry timestamp of the two-step ownership handover.
    uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     INTERNAL FUNCTIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
    function _guardInitializeOwner() internal pure virtual returns (bool guard) {}

    /// @dev Initializes the owner directly without authorization guard.
    /// This function must be called upon initialization,
    /// regardless of whether the contract is upgradeable or not.
    /// This is to enable generalization to both regular and upgradeable contracts,
    /// and to save gas in case the initial owner is not the caller.
    /// For performance reasons, this function will not check if there
    /// is an existing owner.
    function _initializeOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                if sload(ownerSlot) {
                    mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
                    revert(0x1c, 0x04)
                }
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(_OWNER_SLOT, newOwner)
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        }
    }

    /// @dev Sets the owner directly without authorization guard.
    function _setOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, newOwner)
            }
        }
    }

    /// @dev Throws if the sender is not the owner.
    function _checkOwner() internal view virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // If the caller is not the stored owner, revert.
            if iszero(eq(caller(), sload(_OWNER_SLOT))) {
                mstore(0x00, 0x82b42900) // `Unauthorized()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns how long a two-step ownership handover is valid for in seconds.
    /// Override to return a different value if needed.
    /// Made internal to conserve bytecode. Wrap it in a public function if needed.
    function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
        return 48 * 3600;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  PUBLIC UPDATE FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Allows the owner to transfer the ownership to `newOwner`.
    function transferOwnership(address newOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(shl(96, newOwner)) {
                mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
                revert(0x1c, 0x04)
            }
        }
        _setOwner(newOwner);
    }

    /// @dev Allows the owner to renounce their ownership.
    function renounceOwnership() public payable virtual onlyOwner {
        _setOwner(address(0));
    }

    /// @dev Request a two-step ownership handover to the caller.
    /// The request will automatically expire in 48 hours (172800 seconds) by default.
    function requestOwnershipHandover() public payable virtual {
        unchecked {
            uint256 expires = block.timestamp + _ownershipHandoverValidFor();
            /// @solidity memory-safe-assembly
            assembly {
                // Compute and set the handover slot to `expires`.
                mstore(0x0c, _HANDOVER_SLOT_SEED)
                mstore(0x00, caller())
                sstore(keccak256(0x0c, 0x20), expires)
                // Emit the {OwnershipHandoverRequested} event.
                log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
            }
        }
    }

    /// @dev Cancels the two-step ownership handover to the caller, if any.
    function cancelOwnershipHandover() public payable virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x20), 0)
            // Emit the {OwnershipHandoverCanceled} event.
            log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
        }
    }

    /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
    /// Reverts if there is no existing ownership handover requested by `pendingOwner`.
    function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            let handoverSlot := keccak256(0x0c, 0x20)
            // If the handover does not exist, or has expired.
            if gt(timestamp(), sload(handoverSlot)) {
                mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
                revert(0x1c, 0x04)
            }
            // Set the handover slot to 0.
            sstore(handoverSlot, 0)
        }
        _setOwner(pendingOwner);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   PUBLIC READ FUNCTIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of the contract.
    function owner() public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_OWNER_SLOT)
        }
    }

    /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
    function ownershipHandoverExpiresAt(address pendingOwner)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the handover slot.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            // Load the handover slot.
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         MODIFIERS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Marks a function as only callable by the owner.
    modifier onlyOwner() virtual {
        _checkOwner();
        _;
    }
}

// node_modules/solady/src/utils/EnumerableSetLib.sol

/// @notice Library for managing enumerable sets in storage.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/EnumerableSetLib.sol)
///
/// @dev Note:
/// In many applications, the number of elements in an enumerable set is small.
/// This enumerable set implementation avoids storing the length and indices
/// for up to 3 elements. Once the length exceeds 3 for the first time, the length
/// and indices will be initialized. The amortized cost of adding elements is O(1).
///
/// The AddressSet implementation packs the length with the 0th entry.
library EnumerableSetLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The index must be less than the length.
    error IndexOutOfBounds();

    /// @dev The value cannot be the zero sentinel.
    error ValueIsZeroSentinel();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev A sentinel value to denote the zero value in storage.
    /// No elements can be equal to this value.
    /// `uint72(bytes9(keccak256(bytes("_ZERO_SENTINEL"))))`.
    uint256 private constant _ZERO_SENTINEL = 0xfbb67fda52d4bfb8bf;

    /// @dev The storage layout is given by:
    /// ```
    ///     mstore(0x04, _ENUMERABLE_ADDRESS_SET_SLOT_SEED)
    ///     mstore(0x00, set.slot)
    ///     let rootSlot := keccak256(0x00, 0x24)
    ///     mstore(0x20, rootSlot)
    ///     mstore(0x00, shr(96, shl(96, value)))
    ///     let positionSlot := keccak256(0x00, 0x40)
    ///     let valueSlot := add(rootSlot, sload(positionSlot))
    ///     let valueInStorage := shr(96, sload(valueSlot))
    ///     let lazyLength := shr(160, shl(160, sload(rootSlot)))
    /// ```
    uint256 private constant _ENUMERABLE_ADDRESS_SET_SLOT_SEED = 0x978aab92;

    /// @dev The storage layout is given by:
    /// ```
    ///     mstore(0x04, _ENUMERABLE_WORD_SET_SLOT_SEED)
    ///     mstore(0x00, set.slot)
    ///     let rootSlot := keccak256(0x00, 0x24)
    ///     mstore(0x20, rootSlot)
    ///     mstore(0x00, value)
    ///     let positionSlot := keccak256(0x00, 0x40)
    ///     let valueSlot := add(rootSlot, sload(positionSlot))
    ///     let valueInStorage := sload(valueSlot)
    ///     let lazyLength := sload(not(rootSlot))
    /// ```
    uint256 private constant _ENUMERABLE_WORD_SET_SLOT_SEED = 0x18fb5864;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STRUCTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev An enumerable address set in storage.
    struct AddressSet {
        uint256 _spacer;
    }

    /// @dev An enumerable bytes32 set in storage.
    struct Bytes32Set {
        uint256 _spacer;
    }

    /// @dev An enumerable uint256 set in storage.
    struct Uint256Set {
        uint256 _spacer;
    }

    /// @dev An enumerable int256 set in storage.
    struct Int256Set {
        uint256 _spacer;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     GETTERS / SETTERS                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the number of elements in the set.
    function length(AddressSet storage set) internal view returns (uint256 result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            let rootPacked := sload(rootSlot)
            let n := shr(160, shl(160, rootPacked))
            result := shr(1, n)
            for {} iszero(or(iszero(shr(96, rootPacked)), n)) {} {
                result := 1
                if iszero(sload(add(rootSlot, result))) { break }
                result := 2
                if iszero(sload(add(rootSlot, result))) { break }
                result := 3
                break
            }
        }
    }

    /// @dev Returns the number of elements in the set.
    function length(Bytes32Set storage set) internal view returns (uint256 result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            let n := sload(not(rootSlot))
            result := shr(1, n)
            for {} iszero(n) {} {
                result := 0
                if iszero(sload(add(rootSlot, result))) { break }
                result := 1
                if iszero(sload(add(rootSlot, result))) { break }
                result := 2
                if iszero(sload(add(rootSlot, result))) { break }
                result := 3
                break
            }
        }
    }

    /// @dev Returns the number of elements in the set.
    function length(Uint256Set storage set) internal view returns (uint256 result) {
        result = length(_toBytes32Set(set));
    }

    /// @dev Returns the number of elements in the set.
    function length(Int256Set storage set) internal view returns (uint256 result) {
        result = length(_toBytes32Set(set));
    }

    /// @dev Returns whether `value` is in the set.
    function contains(AddressSet storage set, address value) internal view returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            value := shr(96, shl(96, value))
            if eq(value, _ZERO_SENTINEL) {
                mstore(0x00, 0xf5a267f1) // `ValueIsZeroSentinel()`.
                revert(0x1c, 0x04)
            }
            if iszero(value) { value := _ZERO_SENTINEL }
            let rootPacked := sload(rootSlot)
            for {} 1 {} {
                if iszero(shr(160, shl(160, rootPacked))) {
                    result := 1
                    if eq(shr(96, rootPacked), value) { break }
                    if eq(shr(96, sload(add(rootSlot, 1))), value) { break }
                    if eq(shr(96, sload(add(rootSlot, 2))), value) { break }
                    result := 0
                    break
                }
                mstore(0x20, rootSlot)
                mstore(0x00, value)
                result := iszero(iszero(sload(keccak256(0x00, 0x40))))
                break
            }
        }
    }

    /// @dev Returns whether `value` is in the set.
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            if eq(value, _ZERO_SENTINEL) {
                mstore(0x00, 0xf5a267f1) // `ValueIsZeroSentinel()`.
                revert(0x1c, 0x04)
            }
            if iszero(value) { value := _ZERO_SENTINEL }
            for {} 1 {} {
                if iszero(sload(not(rootSlot))) {
                    result := 1
                    if eq(sload(rootSlot), value) { break }
                    if eq(sload(add(rootSlot, 1)), value) { break }
                    if eq(sload(add(rootSlot, 2)), value) { break }
                    result := 0
                    break
                }
                mstore(0x20, rootSlot)
                mstore(0x00, value)
                result := iszero(iszero(sload(keccak256(0x00, 0x40))))
                break
            }
        }
    }

    /// @dev Returns whether `value` is in the set.
    function contains(Uint256Set storage set, uint256 value) internal view returns (bool result) {
        result = contains(_toBytes32Set(set), bytes32(value));
    }

    /// @dev Returns whether `value` is in the set.
    function contains(Int256Set storage set, int256 value) internal view returns (bool result) {
        result = contains(_toBytes32Set(set), bytes32(uint256(value)));
    }

    /// @dev Adds `value` to the set. Returns whether `value` was not in the set.
    function add(AddressSet storage set, address value) internal returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            value := shr(96, shl(96, value))
            if eq(value, _ZERO_SENTINEL) {
                mstore(0x00, 0xf5a267f1) // `ValueIsZeroSentinel()`.
                revert(0x1c, 0x04)
            }
            if iszero(value) { value := _ZERO_SENTINEL }
            let rootPacked := sload(rootSlot)
            for { let n := shr(160, shl(160, rootPacked)) } 1 {} {
                mstore(0x20, rootSlot)
                if iszero(n) {
                    let v0 := shr(96, rootPacked)
                    if iszero(v0) {
                        sstore(rootSlot, shl(96, value))
                        result := 1
                        break
                    }
                    if eq(v0, value) { break }
                    let v1 := shr(96, sload(add(rootSlot, 1)))
                    if iszero(v1) {
                        sstore(add(rootSlot, 1), shl(96, value))
                        result := 1
                        break
                    }
                    if eq(v1, value) { break }
                    let v2 := shr(96, sload(add(rootSlot, 2)))
                    if iszero(v2) {
                        sstore(add(rootSlot, 2), shl(96, value))
                        result := 1
                        break
                    }
                    if eq(v2, value) { break }
                    mstore(0x00, v0)
                    sstore(keccak256(0x00, 0x40), 1)
                    mstore(0x00, v1)
                    sstore(keccak256(0x00, 0x40), 2)
                    mstore(0x00, v2)
                    sstore(keccak256(0x00, 0x40), 3)
                    rootPacked := or(rootPacked, 7)
                    n := 7
                }
                mstore(0x00, value)
                let p := keccak256(0x00, 0x40)
                if iszero(sload(p)) {
                    n := shr(1, n)
                    sstore(add(rootSlot, n), shl(96, value))
                    sstore(p, add(1, n))
                    sstore(rootSlot, add(2, rootPacked))
                    result := 1
                    break
                }
                break
            }
        }
    }

    /// @dev Adds `value` to the set. Returns whether `value` was not in the set.
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            if eq(value, _ZERO_SENTINEL) {
                mstore(0x00, 0xf5a267f1) // `ValueIsZeroSentinel()`.
                revert(0x1c, 0x04)
            }
            if iszero(value) { value := _ZERO_SENTINEL }
            for { let n := sload(not(rootSlot)) } 1 {} {
                mstore(0x20, rootSlot)
                if iszero(n) {
                    let v0 := sload(rootSlot)
                    if iszero(v0) {
                        sstore(rootSlot, value)
                        result := 1
                        break
                    }
                    if eq(v0, value) { break }
                    let v1 := sload(add(rootSlot, 1))
                    if iszero(v1) {
                        sstore(add(rootSlot, 1), value)
                        result := 1
                        break
                    }
                    if eq(v1, value) { break }
                    let v2 := sload(add(rootSlot, 2))
                    if iszero(v2) {
                        sstore(add(rootSlot, 2), value)
                        result := 1
                        break
                    }
                    if eq(v2, value) { break }
                    mstore(0x00, v0)
                    sstore(keccak256(0x00, 0x40), 1)
                    mstore(0x00, v1)
                    sstore(keccak256(0x00, 0x40), 2)
                    mstore(0x00, v2)
                    sstore(keccak256(0x00, 0x40), 3)
                    n := 7
                }
                mstore(0x00, value)
                let p := keccak256(0x00, 0x40)
                if iszero(sload(p)) {
                    n := shr(1, n)
                    sstore(add(rootSlot, n), value)
                    sstore(p, add(1, n))
                    sstore(not(rootSlot), or(1, shl(1, add(1, n))))
                    result := 1
                    break
                }
                break
            }
        }
    }

    /// @dev Adds `value` to the set. Returns whether `value` was not in the set.
    function add(Uint256Set storage set, uint256 value) internal returns (bool result) {
        result = add(_toBytes32Set(set), bytes32(value));
    }

    /// @dev Adds `value` to the set. Returns whether `value` was not in the set.
    function add(Int256Set storage set, int256 value) internal returns (bool result) {
        result = add(_toBytes32Set(set), bytes32(uint256(value)));
    }

    /// @dev Removes `value` from the set. Returns whether `value` was in the set.
    function remove(AddressSet storage set, address value) internal returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            value := shr(96, shl(96, value))
            if eq(value, _ZERO_SENTINEL) {
                mstore(0x00, 0xf5a267f1) // `ValueIsZeroSentinel()`.
                revert(0x1c, 0x04)
            }
            if iszero(value) { value := _ZERO_SENTINEL }
            let rootPacked := sload(rootSlot)
            for { let n := shr(160, shl(160, rootPacked)) } 1 {} {
                if iszero(n) {
                    result := 1
                    if eq(shr(96, rootPacked), value) {
                        sstore(rootSlot, sload(add(rootSlot, 1)))
                        sstore(add(rootSlot, 1), sload(add(rootSlot, 2)))
                        sstore(add(rootSlot, 2), 0)
                        break
                    }
                    if eq(shr(96, sload(add(rootSlot, 1))), value) {
                        sstore(add(rootSlot, 1), sload(add(rootSlot, 2)))
                        sstore(add(rootSlot, 2), 0)
                        break
                    }
                    if eq(shr(96, sload(add(rootSlot, 2))), value) {
                        sstore(add(rootSlot, 2), 0)
                        break
                    }
                    result := 0
                    break
                }
                mstore(0x20, rootSlot)
                mstore(0x00, value)
                let p := keccak256(0x00, 0x40)
                let position := sload(p)
                if iszero(position) { break }
                n := sub(shr(1, n), 1)
                if iszero(eq(sub(position, 1), n)) {
                    let lastValue := shr(96, sload(add(rootSlot, n)))
                    sstore(add(rootSlot, sub(position, 1)), shl(96, lastValue))
                    sstore(add(rootSlot, n), 0)
                    mstore(0x00, lastValue)
                    sstore(keccak256(0x00, 0x40), position)
                }
                sstore(rootSlot, or(shl(96, shr(96, sload(rootSlot))), or(shl(1, n), 1)))
                sstore(p, 0)
                result := 1
                break
            }
        }
    }

    /// @dev Removes `value` from the set. Returns whether `value` was in the set.
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            if eq(value, _ZERO_SENTINEL) {
                mstore(0x00, 0xf5a267f1) // `ValueIsZeroSentinel()`.
                revert(0x1c, 0x04)
            }
            if iszero(value) { value := _ZERO_SENTINEL }
            for { let n := sload(not(rootSlot)) } 1 {} {
                if iszero(n) {
                    result := 1
                    if eq(sload(rootSlot), value) {
                        sstore(rootSlot, sload(add(rootSlot, 1)))
                        sstore(add(rootSlot, 1), sload(add(rootSlot, 2)))
                        sstore(add(rootSlot, 2), 0)
                        break
                    }
                    if eq(sload(add(rootSlot, 1)), value) {
                        sstore(add(rootSlot, 1), sload(add(rootSlot, 2)))
                        sstore(add(rootSlot, 2), 0)
                        break
                    }
                    if eq(sload(add(rootSlot, 2)), value) {
                        sstore(add(rootSlot, 2), 0)
                        break
                    }
                    result := 0
                    break
                }
                mstore(0x20, rootSlot)
                mstore(0x00, value)
                let p := keccak256(0x00, 0x40)
                let position := sload(p)
                if iszero(position) { break }
                n := sub(shr(1, n), 1)
                if iszero(eq(sub(position, 1), n)) {
                    let lastValue := sload(add(rootSlot, n))
                    sstore(add(rootSlot, sub(position, 1)), lastValue)
                    sstore(add(rootSlot, n), 0)
                    mstore(0x00, lastValue)
                    sstore(keccak256(0x00, 0x40), position)
                }
                sstore(not(rootSlot), or(shl(1, n), 1))
                sstore(p, 0)
                result := 1
                break
            }
        }
    }

    /// @dev Removes `value` from the set. Returns whether `value` was in the set.
    function remove(Uint256Set storage set, uint256 value) internal returns (bool result) {
        result = remove(_toBytes32Set(set), bytes32(value));
    }

    /// @dev Removes `value` from the set. Returns whether `value` was in the set.
    function remove(Int256Set storage set, int256 value) internal returns (bool result) {
        result = remove(_toBytes32Set(set), bytes32(uint256(value)));
    }

    /// @dev Returns all of the values in the set.
    /// Note: This can consume more gas than the block gas limit for large sets.
    function values(AddressSet storage set) internal view returns (address[] memory result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            let zs := _ZERO_SENTINEL
            let rootPacked := sload(rootSlot)
            let n := shr(160, shl(160, rootPacked))
            result := mload(0x40)
            let o := add(0x20, result)
            let v := shr(96, rootPacked)
            mstore(o, mul(v, iszero(eq(v, zs))))
            for {} 1 {} {
                if iszero(n) {
                    if v {
                        n := 1
                        v := shr(96, sload(add(rootSlot, n)))
                        if v {
                            n := 2
                            mstore(add(o, 0x20), mul(v, iszero(eq(v, zs))))
                            v := shr(96, sload(add(rootSlot, n)))
                            if v {
                                n := 3
                                mstore(add(o, 0x40), mul(v, iszero(eq(v, zs))))
                            }
                        }
                    }
                    break
                }
                n := shr(1, n)
                for { let i := 1 } lt(i, n) { i := add(i, 1) } {
                    v := shr(96, sload(add(rootSlot, i)))
                    mstore(add(o, shl(5, i)), mul(v, iszero(eq(v, zs))))
                }
                break
            }
            mstore(result, n)
            mstore(0x40, add(o, shl(5, n)))
        }
    }

    /// @dev Returns all of the values in the set.
    /// Note: This can consume more gas than the block gas limit for large sets.
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            let zs := _ZERO_SENTINEL
            let n := sload(not(rootSlot))
            result := mload(0x40)
            let o := add(0x20, result)
            for {} 1 {} {
                if iszero(n) {
                    let v := sload(rootSlot)
                    if v {
                        n := 1
                        mstore(o, mul(v, iszero(eq(v, zs))))
                        v := sload(add(rootSlot, n))
                        if v {
                            n := 2
                            mstore(add(o, 0x20), mul(v, iszero(eq(v, zs))))
                            v := sload(add(rootSlot, n))
                            if v {
                                n := 3
                                mstore(add(o, 0x40), mul(v, iszero(eq(v, zs))))
                            }
                        }
                    }
                    break
                }
                n := shr(1, n)
                for { let i := 0 } lt(i, n) { i := add(i, 1) } {
                    let v := sload(add(rootSlot, i))
                    mstore(add(o, shl(5, i)), mul(v, iszero(eq(v, zs))))
                }
                break
            }
            mstore(result, n)
            mstore(0x40, add(o, shl(5, n)))
        }
    }

    /// @dev Returns all of the values in the set.
    /// Note: This can consume more gas than the block gas limit for large sets.
    function values(Uint256Set storage set) internal view returns (uint256[] memory result) {
        result = _toUints(values(_toBytes32Set(set)));
    }

    /// @dev Returns all of the values in the set.
    /// Note: This can consume more gas than the block gas limit for large sets.
    function values(Int256Set storage set) internal view returns (int256[] memory result) {
        result = _toInts(values(_toBytes32Set(set)));
    }

    /// @dev Returns the element at index `i` in the set.
    function at(AddressSet storage set, uint256 i) internal view returns (address result) {
        bytes32 rootSlot = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            result := shr(96, sload(add(rootSlot, i)))
            result := mul(result, iszero(eq(result, _ZERO_SENTINEL)))
        }
        if (i >= length(set)) revert IndexOutOfBounds();
    }

    /// @dev Returns the element at index `i` in the set.
    function at(Bytes32Set storage set, uint256 i) internal view returns (bytes32 result) {
        result = _rootSlot(set);
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(add(result, i))
            result := mul(result, iszero(eq(result, _ZERO_SENTINEL)))
        }
        if (i >= length(set)) revert IndexOutOfBounds();
    }

    /// @dev Returns the element at index `i` in the set.
    function at(Uint256Set storage set, uint256 i) internal view returns (uint256 result) {
        result = uint256(at(_toBytes32Set(set), i));
    }

    /// @dev Returns the element at index `i` in the set.
    function at(Int256Set storage set, uint256 i) internal view returns (int256 result) {
        result = int256(uint256(at(_toBytes32Set(set), i)));
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      PRIVATE HELPERS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the root slot.
    function _rootSlot(AddressSet storage s) private pure returns (bytes32 r) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x04, _ENUMERABLE_ADDRESS_SET_SLOT_SEED)
            mstore(0x00, s.slot)
            r := keccak256(0x00, 0x24)
        }
    }

    /// @dev Returns the root slot.
    function _rootSlot(Bytes32Set storage s) private pure returns (bytes32 r) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x04, _ENUMERABLE_WORD_SET_SLOT_SEED)
            mstore(0x00, s.slot)
            r := keccak256(0x00, 0x24)
        }
    }

    /// @dev Casts to a Bytes32Set.
    function _toBytes32Set(Uint256Set storage s) private pure returns (Bytes32Set storage c) {
        /// @solidity memory-safe-assembly
        assembly {
            c.slot := s.slot
        }
    }

    /// @dev Casts to a Bytes32Set.
    function _toBytes32Set(Int256Set storage s) private pure returns (Bytes32Set storage c) {
        /// @solidity memory-safe-assembly
        assembly {
            c.slot := s.slot
        }
    }

    /// @dev Casts to a uint256 array.
    function _toUints(bytes32[] memory a) private pure returns (uint256[] memory c) {
        /// @solidity memory-safe-assembly
        assembly {
            c := a
        }
    }

    /// @dev Casts to a int256 array.
    function _toInts(bytes32[] memory a) private pure returns (int256[] memory c) {
        /// @solidity memory-safe-assembly
        assembly {
            c := a
        }
    }
}

// node_modules/solady/src/utils/SafeTransferLib.sol

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Permit2 operations from (https://github.com/Uniswap/permit2/blob/main/src/libraries/Permit2Lib.sol)
///
/// @dev Note:
/// - For ETH transfers, please use `forceSafeTransferETH` for DoS protection.
/// - For ERC20s, this implementation won't check that a token has code,
///   responsibility is delegated to the caller.
library SafeTransferLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ETH transfer has failed.
    error ETHTransferFailed();

    /// @dev The ERC20 `transferFrom` has failed.
    error TransferFromFailed();

    /// @dev The ERC20 `transfer` has failed.
    error TransferFailed();

    /// @dev The ERC20 `approve` has failed.
    error ApproveFailed();

    /// @dev The Permit2 operation has failed.
    error Permit2Failed();

    /// @dev The Permit2 amount must be less than `2**160 - 1`.
    error Permit2AmountOverflow();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Suggested gas stipend for contract receiving ETH that disallows any storage writes.
    uint256 internal constant GAS_STIPEND_NO_STORAGE_WRITES = 2300;

    /// @dev Suggested gas stipend for contract receiving ETH to perform a few
    /// storage reads and writes, but low enough to prevent griefing.
    uint256 internal constant GAS_STIPEND_NO_GRIEF = 100000;

    /// @dev The unique EIP-712 domain domain separator for the DAI token contract.
    bytes32 internal constant DAI_DOMAIN_SEPARATOR =
        0xdbb8cf42e1ecb028be3f3dbc922e1d878b963f411dc388ced501601c60f7c6f7;

    /// @dev The address for the WETH9 contract on Ethereum mainnet.
    address internal constant WETH9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    /// @dev The canonical Permit2 address.
    /// [Github](https://github.com/Uniswap/permit2)
    /// [Etherscan](https://etherscan.io/address/0x000000000022D473030F116dDEE9F6B43aC78BA3)
    address internal constant PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       ETH OPERATIONS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // If the ETH transfer MUST succeed with a reasonable gas budget, use the force variants.
    //
    // The regular variants:
    // - Forwards all remaining gas to the target.
    // - Reverts if the target reverts.
    // - Reverts if the current contract has insufficient balance.
    //
    // The force variants:
    // - Forwards with an optional gas stipend
    //   (defaults to `GAS_STIPEND_NO_GRIEF`, which is sufficient for most cases).
    // - If the target reverts, or if the gas stipend is exhausted,
    //   creates a temporary contract to force send the ETH via `SELFDESTRUCT`.
    //   Future compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758.
    // - Reverts if the current contract has insufficient balance.
    //
    // The try variants:
    // - Forwards with a mandatory gas stipend.
    // - Instead of reverting, returns whether the transfer succeeded.

    /// @dev Sends `amount` (in wei) ETH to `to`.
    function safeTransferETH(address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(call(gas(), to, amount, codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, 0xb12d13eb) // `ETHTransferFailed()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Sends all the ETH in the current contract to `to`.
    function safeTransferAllETH(address to) internal {
        /// @solidity memory-safe-assembly
        assembly {
            // Transfer all the ETH and check if it succeeded or not.
            if iszero(call(gas(), to, selfbalance(), codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, 0xb12d13eb) // `ETHTransferFailed()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Force sends `amount` (in wei) ETH to `to`, with a `gasStipend`.
    function forceSafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal {
        /// @solidity memory-safe-assembly
        assembly {
            if lt(selfbalance(), amount) {
                mstore(0x00, 0xb12d13eb) // `ETHTransferFailed()`.
                revert(0x1c, 0x04)
            }
            if iszero(call(gasStipend, to, amount, codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                if iszero(create(amount, 0x0b, 0x16)) { revert(codesize(), codesize()) } // For gas estimation.
            }
        }
    }

    /// @dev Force sends all the ETH in the current contract to `to`, with a `gasStipend`.
    function forceSafeTransferAllETH(address to, uint256 gasStipend) internal {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(call(gasStipend, to, selfbalance(), codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                if iszero(create(selfbalance(), 0x0b, 0x16)) { revert(codesize(), codesize()) } // For gas estimation.
            }
        }
    }

    /// @dev Force sends `amount` (in wei) ETH to `to`, with `GAS_STIPEND_NO_GRIEF`.
    function forceSafeTransferETH(address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            if lt(selfbalance(), amount) {
                mstore(0x00, 0xb12d13eb) // `ETHTransferFailed()`.
                revert(0x1c, 0x04)
            }
            if iszero(call(GAS_STIPEND_NO_GRIEF, to, amount, codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                if iszero(create(amount, 0x0b, 0x16)) { revert(codesize(), codesize()) } // For gas estimation.
            }
        }
    }

    /// @dev Force sends all the ETH in the current contract to `to`, with `GAS_STIPEND_NO_GRIEF`.
    function forceSafeTransferAllETH(address to) internal {
        /// @solidity memory-safe-assembly
        assembly {
            // forgefmt: disable-next-item
            if iszero(call(GAS_STIPEND_NO_GRIEF, to, selfbalance(), codesize(), 0x00, codesize(), 0x00)) {
                mstore(0x00, to) // Store the address in scratch space.
                mstore8(0x0b, 0x73) // Opcode `PUSH20`.
                mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`.
                if iszero(create(selfbalance(), 0x0b, 0x16)) { revert(codesize(), codesize()) } // For gas estimation.
            }
        }
    }

    /// @dev Sends `amount` (in wei) ETH to `to`, with a `gasStipend`.
    function trySafeTransferETH(address to, uint256 amount, uint256 gasStipend)
        internal
        returns (bool success)
    {
        /// @solidity memory-safe-assembly
        assembly {
            success := call(gasStipend, to, amount, codesize(), 0x00, codesize(), 0x00)
        }
    }

    /// @dev Sends all the ETH in the current contract to `to`, with a `gasStipend`.
    function trySafeTransferAllETH(address to, uint256 gasStipend)
        internal
        returns (bool success)
    {
        /// @solidity memory-safe-assembly
        assembly {
            success := call(gasStipend, to, selfbalance(), codesize(), 0x00, codesize(), 0x00)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      ERC20 OPERATIONS                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to`.
    /// Reverts upon failure.
    ///
    /// The `from` account must have at least `amount` approved for
    /// the current contract to manage.
    function safeTransferFrom(address token, address from, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x60, amount) // Store the `amount` argument.
            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(96, from)) // Store the `from` argument.
            mstore(0x0c, 0x23b872dd000000000000000000000000) // `transferFrom(address,address,uint256)`.
            // Perform the transfer, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    or(eq(mload(0x00), 1), iszero(returndatasize())), // Returned 1 or nothing.
                    call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
                )
            ) {
                mstore(0x00, 0x7939f424) // `TransferFromFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to`.
    ///
    /// The `from` account must have at least `amount` approved for the current contract to manage.
    function trySafeTransferFrom(address token, address from, address to, uint256 amount)
        internal
        returns (bool success)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x60, amount) // Store the `amount` argument.
            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(96, from)) // Store the `from` argument.
            mstore(0x0c, 0x23b872dd000000000000000000000000) // `transferFrom(address,address,uint256)`.
            success :=
                and( // The arguments of `and` are evaluated from right to left.
                    or(eq(mload(0x00), 1), iszero(returndatasize())), // Returned 1 or nothing.
                    call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
                )
            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Sends all of ERC20 `token` from `from` to `to`.
    /// Reverts upon failure.
    ///
    /// The `from` account must have their entire balance approved for the current contract to manage.
    function safeTransferAllFrom(address token, address from, address to)
        internal
        returns (uint256 amount)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(96, from)) // Store the `from` argument.
            mstore(0x0c, 0x70a08231000000000000000000000000) // `balanceOf(address)`.
            // Read the balance, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                    staticcall(gas(), token, 0x1c, 0x24, 0x60, 0x20)
                )
            ) {
                mstore(0x00, 0x7939f424) // `TransferFromFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x00, 0x23b872dd) // `transferFrom(address,address,uint256)`.
            amount := mload(0x60) // The `amount` is already at 0x60. We'll need to return it.
            // Perform the transfer, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    or(eq(mload(0x00), 1), iszero(returndatasize())), // Returned 1 or nothing.
                    call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
                )
            ) {
                mstore(0x00, 0x7939f424) // `TransferFromFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`.
    /// Reverts upon failure.
    function safeTransfer(address token, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            mstore(0x00, 0xa9059cbb000000000000000000000000) // `transfer(address,uint256)`.
            // Perform the transfer, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    or(eq(mload(0x00), 1), iszero(returndatasize())), // Returned 1 or nothing.
                    call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                )
            ) {
                mstore(0x00, 0x90b8ec18) // `TransferFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x34, 0) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    /// @dev Sends all of ERC20 `token` from the current contract to `to`.
    /// Reverts upon failure.
    function safeTransferAll(address token, address to) internal returns (uint256 amount) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, 0x70a08231) // Store the function selector of `balanceOf(address)`.
            mstore(0x20, address()) // Store the address of the current contract.
            // Read the balance, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                    staticcall(gas(), token, 0x1c, 0x24, 0x34, 0x20)
                )
            ) {
                mstore(0x00, 0x90b8ec18) // `TransferFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x14, to) // Store the `to` argument.
            amount := mload(0x34) // The `amount` is already at 0x34. We'll need to return it.
            mstore(0x00, 0xa9059cbb000000000000000000000000) // `transfer(address,uint256)`.
            // Perform the transfer, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    or(eq(mload(0x00), 1), iszero(returndatasize())), // Returned 1 or nothing.
                    call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                )
            ) {
                mstore(0x00, 0x90b8ec18) // `TransferFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x34, 0) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract.
    /// Reverts upon failure.
    function safeApprove(address token, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            mstore(0x00, 0x095ea7b3000000000000000000000000) // `approve(address,uint256)`.
            // Perform the approval, reverting upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    or(eq(mload(0x00), 1), iszero(returndatasize())), // Returned 1 or nothing.
                    call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                )
            ) {
                mstore(0x00, 0x3e3f8f73) // `ApproveFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x34, 0) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract.
    /// If the initial attempt to approve fails, attempts to reset the approved amount to zero,
    /// then retries the approval again (some tokens, e.g. USDT, requires this).
    /// Reverts upon failure.
    function safeApproveWithRetry(address token, address to, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            mstore(0x00, 0x095ea7b3000000000000000000000000) // `approve(address,uint256)`.
            // Perform the approval, retrying upon failure.
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    or(eq(mload(0x00), 1), iszero(returndatasize())), // Returned 1 or nothing.
                    call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                )
            ) {
                mstore(0x34, 0) // Store 0 for the `amount`.
                mstore(0x00, 0x095ea7b3000000000000000000000000) // `approve(address,uint256)`.
                pop(call(gas(), token, 0, 0x10, 0x44, codesize(), 0x00)) // Reset the approval.
                mstore(0x34, amount) // Store back the original `amount`.
                // Retry the approval, reverting upon failure.
                if iszero(
                    and(
                        or(eq(mload(0x00), 1), iszero(returndatasize())), // Returned 1 or nothing.
                        call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
                    )
                ) {
                    mstore(0x00, 0x3e3f8f73) // `ApproveFailed()`.
                    revert(0x1c, 0x04)
                }
            }
            mstore(0x34, 0) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    /// @dev Returns the amount of ERC20 `token` owned by `account`.
    /// Returns zero if the `token` does not exist.
    function balanceOf(address token, address account) internal view returns (uint256 amount) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x14, account) // Store the `account` argument.
            mstore(0x00, 0x70a08231000000000000000000000000) // `balanceOf(address)`.
            amount :=
                mul( // The arguments of `mul` are evaluated from right to left.
                    mload(0x20),
                    and( // The arguments of `and` are evaluated from right to left.
                        gt(returndatasize(), 0x1f), // At least 32 bytes returned.
                        staticcall(gas(), token, 0x10, 0x24, 0x20, 0x20)
                    )
                )
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to`.
    /// If the initial attempt fails, try to use Permit2 to transfer the token.
    /// Reverts upon failure.
    ///
    /// The `from` account must have at least `amount` approved for the current contract to manage.
    function safeTransferFrom2(address token, address from, address to, uint256 amount) internal {
        if (!trySafeTransferFrom(token, from, to, amount)) {
            permit2TransferFrom(token, from, to, amount);
        }
    }

    /// @dev Sends `amount` of ERC20 `token` from `from` to `to` via Permit2.
    /// Reverts upon failure.
    function permit2TransferFrom(address token, address from, address to, uint256 amount)
        internal
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(add(m, 0x74), shr(96, shl(96, token)))
            mstore(add(m, 0x54), amount)
            mstore(add(m, 0x34), to)
            mstore(add(m, 0x20), shl(96, from))
            // `transferFrom(address,address,uint160,address)`.
            mstore(m, 0x36c78516000000000000000000000000)
            let p := PERMIT2
            let exists := eq(chainid(), 1)
            if iszero(exists) { exists := iszero(iszero(extcodesize(p))) }
            if iszero(and(call(gas(), p, 0, add(m, 0x10), 0x84, codesize(), 0x00), exists)) {
                mstore(0x00, 0x7939f4248757f0fd) // `TransferFromFailed()` or `Permit2AmountOverflow()`.
                revert(add(0x18, shl(2, iszero(iszero(shr(160, amount))))), 0x04)
            }
        }
    }

    /// @dev Permit a user to spend a given amount of
    /// another user's tokens via native EIP-2612 permit if possible, falling
    /// back to Permit2 if native permit fails or is not implemented on the token.
    function permit2(
        address token,
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        bool success;
        /// @solidity memory-safe-assembly
        assembly {
            for {} shl(96, xor(token, WETH9)) {} {
                mstore(0x00, 0x3644e515) // `DOMAIN_SEPARATOR()`.
                if iszero(
                    and( // The arguments of `and` are evaluated from right to left.
                        lt(iszero(mload(0x00)), eq(returndatasize(), 0x20)), // Returns 1 non-zero word.
                        // Gas stipend to limit gas burn for tokens that don't refund gas when
                        // an non-existing function is called. 5K should be enough for a SLOAD.
                        staticcall(5000, token, 0x1c, 0x04, 0x00, 0x20)
                    )
                ) { break }
                // After here, we can be sure that token is a contract.
                let m := mload(0x40)
                mstore(add(m, 0x34), spender)
                mstore(add(m, 0x20), shl(96, owner))
                mstore(add(m, 0x74), deadline)
                if eq(mload(0x00), DAI_DOMAIN_SEPARATOR) {
                    mstore(0x14, owner)
                    mstore(0x00, 0x7ecebe00000000000000000000000000) // `nonces(address)`.
                    mstore(add(m, 0x94), staticcall(gas(), token, 0x10, 0x24, add(m, 0x54), 0x20))
                    mstore(m, 0x8fcbaf0c000000000000000000000000) // `IDAIPermit.permit`.
                    // `nonces` is already at `add(m, 0x54)`.
                    // `1` is already stored at `add(m, 0x94)`.
                    mstore(add(m, 0xb4), and(0xff, v))
                    mstore(add(m, 0xd4), r)
                    mstore(add(m, 0xf4), s)
                    success := call(gas(), token, 0, add(m, 0x10), 0x104, codesize(), 0x00)
                    break
                }
                mstore(m, 0xd505accf000000000000000000000000) // `IERC20Permit.permit`.
                mstore(add(m, 0x54), amount)
                mstore(add(m, 0x94), and(0xff, v))
                mstore(add(m, 0xb4), r)
                mstore(add(m, 0xd4), s)
                success := call(gas(), token, 0, add(m, 0x10), 0xe4, codesize(), 0x00)
                break
            }
        }
        if (!success) simplePermit2(token, owner, spender, amount, deadline, v, r, s);
    }

    /// @dev Simple permit on the Permit2 contract.
    function simplePermit2(
        address token,
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40)
            mstore(m, 0x927da105) // `allowance(address,address,address)`.
            {
                let addressMask := shr(96, not(0))
                mstore(add(m, 0x20), and(addressMask, owner))
                mstore(add(m, 0x40), and(addressMask, token))
                mstore(add(m, 0x60), and(addressMask, spender))
                mstore(add(m, 0xc0), and(addressMask, spender))
            }
            let p := mul(PERMIT2, iszero(shr(160, amount)))
            if iszero(
                and( // The arguments of `and` are evaluated from right to left.
                    gt(returndatasize(), 0x5f), // Returns 3 words: `amount`, `expiration`, `nonce`.
                    staticcall(gas(), p, add(m, 0x1c), 0x64, add(m, 0x60), 0x60)
                )
            ) {
                mstore(0x00, 0x6b836e6b8757f0fd) // `Permit2Failed()` or `Permit2AmountOverflow()`.
                revert(add(0x18, shl(2, iszero(p))), 0x04)
            }
            mstore(m, 0x2b67b570) // `Permit2.permit` (PermitSingle variant).
            // `owner` is already `add(m, 0x20)`.
            // `token` is already at `add(m, 0x40)`.
            mstore(add(m, 0x60), amount)
            mstore(add(m, 0x80), 0xffffffffffff) // `expiration = type(uint48).max`.
            // `nonce` is already at `add(m, 0xa0)`.
            // `spender` is already at `add(m, 0xc0)`.
            mstore(add(m, 0xe0), deadline)
            mstore(add(m, 0x100), 0x100) // `signature` offset.
            mstore(add(m, 0x120), 0x41) // `signature` length.
            mstore(add(m, 0x140), r)
            mstore(add(m, 0x160), s)
            mstore(add(m, 0x180), shl(248, v))
            if iszero(call(gas(), p, 0, add(m, 0x1c), 0x184, codesize(), 0x00)) {
                mstore(0x00, 0x6b836e6b) // `Permit2Failed()`.
                revert(0x1c, 0x04)
            }
        }
    }
}

// src/interfaces/ILaPoste.sol

interface ILaPoste {
    struct Token {
        address tokenAddress;
        uint256 amount;
    }

    struct TokenMetadata {
        string name;
        string symbol;
        uint8 decimals;
    }

    struct MessageParams {
        uint256 destinationChainId;
        address to;
        Token[] tokens;
        bytes payload;
    }

    struct Message {
        uint256 destinationChainId;
        address to;
        address sender;
        Token[] tokens;
        TokenMetadata[] tokenMetadata;
        bytes payload;
        uint256 nonce;
    }

    function tokenFactory() external view returns (address);

    function receiveMessage(uint256 chainId, bytes calldata payload) external;
    function sendMessage(MessageParams memory params, uint256 additionalGasLimit, address refundAddress)
        external
        payable;
}

// src/interfaces/ITokenFactory.sol

interface ITokenFactory {
    function isWrapped(address token) external view returns (bool);
    function nativeTokens(address token) external view returns (address);
    function wrappedTokens(address token) external view returns (address);
}

// node_modules/@stake-dao/votemarket/src/interfaces/IVotemarket.sol

////////////////////////////////////////////////////////////////
/// --- DATA STRUCTURE DEFINITIONS
///////////////////////////////////////////////////////////////

struct Campaign {
    /// @notice Chain Id of the destination chain where the gauge is deployed.
    uint256 chainId;
    /// @notice Destination gauge address.
    address gauge;
    /// @notice Address to manage the campaign.
    address manager;
    /// @notice Main reward token.
    address rewardToken;
    /// @notice Duration of the campaign in weeks.
    uint8 numberOfPeriods;
    /// @notice Maximum reward per vote to distribute, to avoid overspending.
    uint256 maxRewardPerVote;
    /// @notice Total reward amount to distribute.
    uint256 totalRewardAmount;
    /// @notice Total reward amount distributed.
    uint256 totalDistributed;
    /// @notice Start timestamp of the campaign.
    uint256 startTimestamp;
    /// @notice End timestamp of the campaign.
    uint256 endTimestamp;
    /// Hook address.
    address hook;
}

/// @notice Claim data struct to avoid stack too deep errors.
struct ClaimData {
    /// @notice Campaign ID.
    uint256 campaignId;
    /// @notice Account address.
    address account;
    /// @notice Receiver address.
    address receiver;
    /// @notice Epoch to claim.
    uint256 epoch;
    /// @notice Amount to claim.
    uint256 amountToClaim;
    /// @notice Fee amount.
    uint256 feeAmount;
}

struct Period {
    /// @notice Amount of reward reserved for the period.
    uint256 rewardPerPeriod;
    /// @notice Reward Per Vote.
    uint256 rewardPerVote;
    /// @notice  Leftover amount.
    uint256 leftover;
    /// @notice Flag to indicate if the period is updated.
    bool updated;
}

struct CampaignUpgrade {
    /// @notice Number of periods after increase.
    uint8 numberOfPeriods;
    /// @notice Total reward amount after increase.
    uint256 totalRewardAmount;
    /// @notice New max reward per vote after increase.
    uint256 maxRewardPerVote;
    /// @notice New end timestamp after increase.
    uint256 endTimestamp;
}

interface IVotemarket {
    function createCampaign(
        uint256 chainId,
        address gauge,
        address manager,
        address rewardToken,
        uint8 numberOfPeriods,
        uint256 maxRewardPerVote,
        uint256 totalRewardAmount,
        address[] memory addresses,
        address hook,
        bool whitelist
    ) external returns (uint256 campaignId);

    function manageCampaign(
        uint256 campaignId,
        uint8 numberOfPeriods,
        uint256 totalRewardAmount,
        uint256 maxRewardPerVote
    ) external;

    function getCampaign(uint256 campaignId) external view returns (Campaign memory);

    function claim(uint256 campaignId, address account, uint256 epoch, bytes calldata hookData)
        external
        returns (uint256 claimed);

    function updateEpoch(uint256 campaignId, uint256 epoch, bytes calldata hookData) external;

    function updateManager(uint256 campaignId, address newManager) external;

    function closeCampaign(uint256 campaignId) external;
}

// src/remote/CampaignRemoteManager.sol

/// @notice A module for creating and managing campaigns from L1.
contract CampaignRemoteManager is Ownable {
    using SafeTransferLib for address;

    ////////////////////////////////////////////////////////////////
    /// --- STRUCTS
    ///////////////////////////////////////////////////////////////

    enum ActionType {
        CREATE_CAMPAIGN,
        MANAGE_CAMPAIGN,
        CLOSE_CAMPAIGN,
        UPDATE_MANAGER
    }

    struct Payload {
        ActionType actionType;
        address sender;
        address votemarket;
        bytes parameters;
    }

    struct CampaignCreationParams {
        uint256 chainId;
        address gauge;
        address manager;
        address rewardToken;
        uint8 numberOfPeriods;
        uint256 maxRewardPerVote;
        uint256 totalRewardAmount;
        address[] addresses;
        address hook;
        bool isWhitelist;
    }

    struct CampaignManagementParams {
        uint256 campaignId;
        address rewardToken;
        uint8 numberOfPeriods;
        uint256 totalRewardAmount;
        uint256 maxRewardPerVote;
    }

    struct CampaignClosingParams {
        uint256 campaignId;
    }

    ////////////////////////////////////////////////////////////////
    /// --- STATE VARIABLES
    ///////////////////////////////////////////////////////////////

    /// @notice The La Poste address.
    address public immutable LA_POSTE;

    /// @notice The token factory address.
    address public immutable TOKEN_FACTORY;

    /// @notice Mapping of whitelisted votemarket platforms
    mapping(address => bool) public whitelistedPlatforms;

    /// @notice The error thrown when the block hash is sent too soon.
    error TooSoon();

    /// @notice The error thrown when the sender is not the La Poste address.
    error NotLaPoste();

    /// @notice The error thrown when the sender is invalid.
    error InvalidSender();

    /// @notice The error thrown when the chain id is invalid.
    error InvalidChainId();

    /// @notice The error thrown when the reward token is invalid.
    error InvalidRewardToken();

    /// @notice The error thrown when the campaign manager is invalid.
    error InvalidCampaignManager();

    /// @notice The error thrown when the action type is invalid.
    error InvalidActionType();

    /// @notice The error thrown when the platform is not whitelisted
    error PlatformNotWhitelisted();

    /// @notice The event emitted when a campaign creation payload is sent.
    event CampaignCreationPayloadSent(CampaignCreationParams indexed params);

    /// @notice The event emitted when a campaign management payload is sent.
    event CampaignManagementPayloadSent(CampaignManagementParams indexed params);

    /// @notice The event emitted when a campaign closing payload is sent.
    event CampaignClosingPayloadSent(CampaignClosingParams indexed params);

    /// @notice The event emitted when a campaign update manager payload is sent.
    event CampaignUpdateManagerPayloadSent(address indexed sender, uint256 indexed campaignId, address indexed newManager);

    /// @notice Event emitted when a platform is whitelisted/unwhitelisted
    event PlatformWhitelistUpdated(address indexed platform, bool whitelisted);

    ////////////////////////////////////////////////////////////////
    /// --- MODIFIERS
    ///////////////////////////////////////////////////////////////

    modifier onlyLaPoste() {
        if (msg.sender != LA_POSTE) revert NotLaPoste();
        _;
    }

    constructor(address _laPoste, address _tokenFactory, address _owner) {
        LA_POSTE = _laPoste;
        TOKEN_FACTORY = _tokenFactory;

        _initializeOwner(_owner);
    }

    /// @notice Creates a campaign on L2.
    /// @param params The campaign creation parameters
    /// @param destinationChainId The destination chain id
    /// @param additionalGasLimit The additional gas limit
    /// @param votemarket The Votemarket address on L2
    function createCampaign(
        CampaignCreationParams memory params,
        uint256 destinationChainId,
        uint256 additionalGasLimit,
        address votemarket
    ) external payable {
        if (block.chainid != 1) revert InvalidChainId();
        if (!whitelistedPlatforms[votemarket]) revert PlatformNotWhitelisted();

        bytes memory parameters = abi.encode(params);
        bytes memory payload = abi.encode(
            Payload({
                actionType: ActionType.CREATE_CAMPAIGN,
                sender: msg.sender,
                votemarket: votemarket,
                parameters: parameters
            })
        );

        SafeTransferLib.safeTransferFrom({
            token: params.rewardToken,
            from: msg.sender,
            to: address(this),
            amount: params.totalRewardAmount
        });

        SafeTransferLib.safeApprove({token: params.rewardToken, to: TOKEN_FACTORY, amount: params.totalRewardAmount});

        ILaPoste.Token[] memory tokens = new ILaPoste.Token[](1);
        tokens[0] = ILaPoste.Token({tokenAddress: params.rewardToken, amount: params.totalRewardAmount});

        ILaPoste.MessageParams memory messageParams = ILaPoste.MessageParams({
            destinationChainId: destinationChainId,
            to: address(this),
            tokens: tokens,
            payload: payload
        });

        ILaPoste(LA_POSTE).sendMessage{value: msg.value}(messageParams, additionalGasLimit, msg.sender);

        emit CampaignCreationPayloadSent(params);
    }

    /// @notice Manages a campaign on L2.
    /// @param params The campaign management parameters
    /// @param destinationChainId The destination chain id
    /// @param additionalGasLimit The additional gas limit
    /// @param votemarket The Votemarket address on L2
    /// @dev This function is the most useful if the campaign manager wants to increase the reward amount. Otherwise,
    /// the manager should directly call the `manageCampaign` function on the Votemarket on L2.
    function manageCampaign(
        CampaignManagementParams memory params,
        uint256 destinationChainId,
        uint256 additionalGasLimit,
        address votemarket
    ) external payable {
        if (block.chainid != 1) revert InvalidChainId();
        if (!whitelistedPlatforms[votemarket]) revert PlatformNotWhitelisted();

        bytes memory parameters = abi.encode(params);
        bytes memory payload = abi.encode(
            Payload({
                actionType: ActionType.MANAGE_CAMPAIGN,
                sender: msg.sender,
                votemarket: votemarket,
                parameters: parameters
            })
        );

        ILaPoste.Token[] memory tokens;

        if (params.totalRewardAmount > 0) {
            tokens = new ILaPoste.Token[](1);
            tokens[0] = ILaPoste.Token({tokenAddress: params.rewardToken, amount: params.totalRewardAmount});

            SafeTransferLib.safeTransferFrom({
                token: params.rewardToken,
                from: msg.sender,
                to: address(this),
                amount: params.totalRewardAmount
            });

            SafeTransferLib.safeApprove({token: params.rewardToken, to: TOKEN_FACTORY, amount: params.totalRewardAmount});
        }

        ILaPoste.MessageParams memory messageParams = ILaPoste.MessageParams({
            destinationChainId: destinationChainId,
            to: address(this),
            tokens: tokens,
            payload: payload
        });

        ILaPoste(LA_POSTE).sendMessage{value: msg.value}(messageParams, additionalGasLimit, msg.sender);

        emit CampaignManagementPayloadSent(params);
    }

    /// @notice Updates the manager for a campaign on L2.
    /// @param campaignId The campaign id
    /// @param newManager The new manager address
    /// @param destinationChainId The destination chain id
    /// @param additionalGasLimit The additional gas limit
    /// @param votemarket The Votemarket address on L2
    function updateManager(
        uint256 campaignId,
        address newManager,
        uint256 destinationChainId,
        uint256 additionalGasLimit,
        address votemarket
    ) external payable {
        if (block.chainid != 1) revert InvalidChainId();
        if (!whitelistedPlatforms[votemarket]) revert PlatformNotWhitelisted();

        bytes memory parameters = abi.encode(campaignId, newManager);
        bytes memory payload = abi.encode(
            Payload({
                actionType: ActionType.UPDATE_MANAGER,
                sender: msg.sender,
                votemarket: votemarket,
                parameters: parameters
            })
        );

        ILaPoste.MessageParams memory messageParams = ILaPoste.MessageParams({
            destinationChainId: destinationChainId,
            to: address(this),
            tokens: new ILaPoste.Token[](0),
            payload: payload
        });

        ILaPoste(LA_POSTE).sendMessage{value: msg.value}(messageParams, additionalGasLimit, msg.sender);

        emit CampaignUpdateManagerPayloadSent(msg.sender, campaignId, newManager);
    }

    /// @notice Closes a campaign on L2.
    /// @param params The campaign closing parameters
    /// @param destinationChainId The destination chain id
    /// @param additionalGasLimit The additional gas limit
    /// @param votemarket The Votemarket address on L2
    function closeCampaign(
        CampaignClosingParams memory params,
        uint256 destinationChainId,
        uint256 additionalGasLimit,
        address votemarket
    ) external payable {
        if (block.chainid != 1) revert InvalidChainId();
        if (!whitelistedPlatforms[votemarket]) revert PlatformNotWhitelisted();

        bytes memory parameters = abi.encode(params);
        bytes memory payload = abi.encode(
            Payload({
                actionType: ActionType.CLOSE_CAMPAIGN,
                sender: msg.sender,
                votemarket: votemarket,
                parameters: parameters
            })
        );

        ILaPoste.MessageParams memory messageParams = ILaPoste.MessageParams({
            destinationChainId: destinationChainId,
            to: address(this),
            tokens: new ILaPoste.Token[](0),
            payload: payload
        });

        ILaPoste(LA_POSTE).sendMessage{value: msg.value}(messageParams, additionalGasLimit, msg.sender);

        emit CampaignClosingPayloadSent(params);
    }

    /// @notice Receives a message from La Poste.
    /// @param chainId The chain id
    /// @param sender The sender address
    /// @param payload The payload
    /// @dev Handle the cases of creating and managing campaigns. It makes sure that the sender is the manager of the
    /// campaign and that the chain id is valid.
    function receiveMessage(uint256 chainId, address sender, bytes calldata payload) external onlyLaPoste {
        if (chainId != 1) revert InvalidChainId();
        if (sender != address(this)) revert InvalidSender();

        Payload memory _payload = abi.decode(payload, (Payload));

        if (_payload.actionType == ActionType.CREATE_CAMPAIGN) {
            CampaignCreationParams memory params = abi.decode(_payload.parameters, (CampaignCreationParams));

            address wrappedToken = ITokenFactory(TOKEN_FACTORY).wrappedTokens(params.rewardToken);

            SafeTransferLib.safeApprove({token: wrappedToken, to: _payload.votemarket, amount: params.totalRewardAmount});

            IVotemarket(_payload.votemarket).createCampaign({
                chainId: params.chainId,
                gauge: params.gauge,
                manager: params.manager,
                rewardToken: wrappedToken,
                numberOfPeriods: params.numberOfPeriods,
                maxRewardPerVote: params.maxRewardPerVote,
                totalRewardAmount: params.totalRewardAmount,
                addresses: params.addresses,
                hook: params.hook,
                whitelist: params.isWhitelist
            });
        } else if (_payload.actionType == ActionType.MANAGE_CAMPAIGN) {
            CampaignManagementParams memory params = abi.decode(_payload.parameters, (CampaignManagementParams));
            Campaign memory campaign = IVotemarket(_payload.votemarket).getCampaign(params.campaignId);
            if (campaign.manager != _payload.sender) revert InvalidCampaignManager();

            if (params.totalRewardAmount > 0) {
                address wrappedToken = ITokenFactory(TOKEN_FACTORY).wrappedTokens(params.rewardToken);
                if (campaign.rewardToken != wrappedToken) revert InvalidRewardToken();

                SafeTransferLib.safeApprove({
                    token: wrappedToken,
                    to: _payload.votemarket,
                    amount: params.totalRewardAmount
                });
            }

            IVotemarket(_payload.votemarket).manageCampaign(
                params.campaignId, params.numberOfPeriods, params.totalRewardAmount, params.maxRewardPerVote
            );
        } else if (_payload.actionType == ActionType.CLOSE_CAMPAIGN) {
            CampaignClosingParams memory params = abi.decode(_payload.parameters, (CampaignClosingParams));
            Campaign memory campaign = IVotemarket(_payload.votemarket).getCampaign(params.campaignId);
            if (campaign.manager != _payload.sender) revert InvalidCampaignManager();

            IVotemarket(_payload.votemarket).closeCampaign(params.campaignId);
        } else if (_payload.actionType == ActionType.UPDATE_MANAGER) {
            (uint256 campaignId, address newManager) = abi.decode(_payload.parameters, (uint256, address));
            Campaign memory campaign = IVotemarket(_payload.votemarket).getCampaign(campaignId);
            if (campaign.manager != _payload.sender) revert InvalidCampaignManager();

            IVotemarket(_payload.votemarket).updateManager(campaignId, newManager);
        } else {
            revert InvalidActionType();
        }
    }

    /// @notice Recovers ERC20 tokens from the contract.
    /// @param token The token address
    /// @param amount The amount of tokens to recover
    function recoverERC20(address token, uint256 amount) external onlyOwner {
        SafeTransferLib.safeTransfer(token, msg.sender, amount);
    }

    /// @notice Whitelist or unwhitelist a platform
    /// @param platform The platform address to whitelist/unwhitelist
    /// @param whitelisted The whitelist status
    function setPlatformWhitelist(address platform, bool whitelisted) external onlyOwner {
        whitelistedPlatforms[platform] = whitelisted;
        emit PlatformWhitelistUpdated(platform, whitelisted);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_laPoste","type":"address"},{"internalType":"address","name":"_tokenFactory","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"InvalidActionType","type":"error"},{"inputs":[],"name":"InvalidCampaignManager","type":"error"},{"inputs":[],"name":"InvalidChainId","type":"error"},{"inputs":[],"name":"InvalidRewardToken","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"NotLaPoste","type":"error"},{"inputs":[],"name":"PlatformNotWhitelisted","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"campaignId","type":"uint256"}],"indexed":true,"internalType":"struct CampaignRemoteManager.CampaignClosingParams","name":"params","type":"tuple"}],"name":"CampaignClosingPayloadSent","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint8","name":"numberOfPeriods","type":"uint8"},{"internalType":"uint256","name":"maxRewardPerVote","type":"uint256"},{"internalType":"uint256","name":"totalRewardAmount","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"address","name":"hook","type":"address"},{"internalType":"bool","name":"isWhitelist","type":"bool"}],"indexed":true,"internalType":"struct CampaignRemoteManager.CampaignCreationParams","name":"params","type":"tuple"}],"name":"CampaignCreationPayloadSent","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"campaignId","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint8","name":"numberOfPeriods","type":"uint8"},{"internalType":"uint256","name":"totalRewardAmount","type":"uint256"},{"internalType":"uint256","name":"maxRewardPerVote","type":"uint256"}],"indexed":true,"internalType":"struct CampaignRemoteManager.CampaignManagementParams","name":"params","type":"tuple"}],"name":"CampaignManagementPayloadSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"campaignId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"CampaignUpdateManagerPayloadSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"platform","type":"address"},{"indexed":false,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"PlatformWhitelistUpdated","type":"event"},{"inputs":[],"name":"LA_POSTE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"campaignId","type":"uint256"}],"internalType":"struct CampaignRemoteManager.CampaignClosingParams","name":"params","type":"tuple"},{"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"internalType":"uint256","name":"additionalGasLimit","type":"uint256"},{"internalType":"address","name":"votemarket","type":"address"}],"name":"closeCampaign","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint8","name":"numberOfPeriods","type":"uint8"},{"internalType":"uint256","name":"maxRewardPerVote","type":"uint256"},{"internalType":"uint256","name":"totalRewardAmount","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"address","name":"hook","type":"address"},{"internalType":"bool","name":"isWhitelist","type":"bool"}],"internalType":"struct CampaignRemoteManager.CampaignCreationParams","name":"params","type":"tuple"},{"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"internalType":"uint256","name":"additionalGasLimit","type":"uint256"},{"internalType":"address","name":"votemarket","type":"address"}],"name":"createCampaign","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"campaignId","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint8","name":"numberOfPeriods","type":"uint8"},{"internalType":"uint256","name":"totalRewardAmount","type":"uint256"},{"internalType":"uint256","name":"maxRewardPerVote","type":"uint256"}],"internalType":"struct CampaignRemoteManager.CampaignManagementParams","name":"params","type":"tuple"},{"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"internalType":"uint256","name":"additionalGasLimit","type":"uint256"},{"internalType":"address","name":"votemarket","type":"address"}],"name":"manageCampaign","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"receiveMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"platform","type":"address"},{"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"setPlatformWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"campaignId","type":"uint256"},{"internalType":"address","name":"newManager","type":"address"},{"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"internalType":"uint256","name":"additionalGasLimit","type":"uint256"},{"internalType":"address","name":"votemarket","type":"address"}],"name":"updateManager","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedPlatforms","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5060405162003a9338038062003a9383398181016040528101906200003791906200020e565b8273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620000b081620000b960201b60201c565b5050506200026a565b620000c96200019f60201b60201c565b1562000147577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278054156200010657630dc149f06000526004601cfd5b8160601b60601c9150811560ff1b821781558160007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3506200019c565b8060601b60601c9050807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a35b50565b600090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b620001e881620001c9565b8114620001f457600080fd5b50565b6000815190506200020881620001dd565b92915050565b6000806000606084860312156200022a5762000229620001a4565b5b60006200023a86828701620001f7565b93505060206200024d86828701620001f7565b92505060406200026086828701620001f7565b9150509250925092565b60805160a0516137c4620002cf600039600081816104c60152818161078801528181610d6f01528181610f120152611a3301526000818161034101528181611023015281816113060152818161145b015281816117210152611a9a01526137c46000f3fe6080604052600436106100fe5760003560e01c80638980f11f11610095578063c533f30511610064578063c533f30514610292578063d717b354146102ae578063f04e283e146102ca578063f2fde38b146102e6578063fee81cf414610302576100fe565b80638980f11f146101ea5780638da5cb5b14610213578063b82325541461023e578063c3ef672b14610269576100fe565b80636509497d116100d15780636509497d1461016b578063715018a61461018757806379f72caf146101915780638924ec96146101ad576100fe565b80631885c2f914610103578063256929621461012c57806354d1f13d146101365780635a58fe4b14610140575b600080fd5b34801561010f57600080fd5b5061012a60048036038101906101259190611f44565b61033f565b005b610134610cdd565b005b61013e610d31565b005b34801561014c57600080fd5b50610155610d6d565b6040516101629190611fc7565b60405180910390f35b610185600480360381019061018091906122be565b610d91565b005b61018f6110fd565b005b6101ab60048036038101906101a69190612341565b611111565b005b3480156101b957600080fd5b506101d460048036038101906101cf91906123bc565b6113f9565b6040516101e191906123f8565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612413565b611419565b005b34801561021f57600080fd5b50610228611430565b6040516102359190611fc7565b60405180910390f35b34801561024a57600080fd5b50610253611459565b6040516102609190611fc7565b60405180910390f35b34801561027557600080fd5b50610290600480360381019061028b9190612453565b61147d565b005b6102ac60048036038101906102a791906124cf565b61152d565b005b6102c860048036038101906102c391906125c2565b6117fa565b005b6102e460048036038101906102df91906123bc565b611b74565b005b61030060048036038101906102fb91906123bc565b611bb5565b005b34801561030e57600080fd5b50610329600480360381019061032491906123bc565b611bdf565b6040516103369190612639565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c4576040517ff7f5e02c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184146103fe576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610463576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828281019061047491906127c2565b90506000600381111561048a5761048961280b565b5b816000015160038111156104a1576104a061280b565b5b0361063757600081606001518060200190518101906104c09190612a37565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d5c6b50483606001516040518263ffffffff1660e01b81526004016105219190611fc7565b602060405180830381865afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105629190612a80565b90506105778184604001518460c00151611bfa565b826040015173ffffffffffffffffffffffffffffffffffffffff1663b956358c8360000151846020015185604001518587608001518860a001518960c001518a60e001518b61010001518c61012001516040518b63ffffffff1660e01b81526004016105ec9a99989796959493929190612b7a565b6020604051808303816000875af115801561060b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062f9190612c1d565b505050610cd6565b6001600381111561064b5761064a61280b565b5b816000015160038111156106625761066161280b565b5b0361093057600081606001518060200190518101906106819190612cd6565b90506000826040015173ffffffffffffffffffffffffffffffffffffffff16635598f8cc83600001516040518263ffffffff1660e01b81526004016106c69190612639565b61016060405180830381865afa1580156106e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107089190612e0f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614610777576040517fb886ee5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826060015111156108a45760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d5c6b50484602001516040518263ffffffff1660e01b81526004016107e39190611fc7565b602060405180830381865afa158015610800573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108249190612a80565b90508073ffffffffffffffffffffffffffffffffffffffff16826060015173ffffffffffffffffffffffffffffffffffffffff161461088f576040517fdfde867100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a28185604001518560600151611bfa565b505b826040015173ffffffffffffffffffffffffffffffffffffffff16636dbb501183600001518460400151856060015186608001516040518563ffffffff1660e01b81526004016108f79493929190612e3d565b600060405180830381600087803b15801561091157600080fd5b505af1158015610925573d6000803e3d6000fd5b505050505050610cd5565b600260038111156109445761094361280b565b5b8160000151600381111561095b5761095a61280b565b5b03610aea576000816060015180602001905181019061097a9190612ebe565b90506000826040015173ffffffffffffffffffffffffffffffffffffffff16635598f8cc83600001516040518263ffffffff1660e01b81526004016109bf9190612639565b61016060405180830381865afa1580156109dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a019190612e0f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614610a70576040517fb886ee5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826040015173ffffffffffffffffffffffffffffffffffffffff1663b0e1c1e183600001516040518263ffffffff1660e01b8152600401610ab19190612639565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b505050505050610cd4565b600380811115610afd57610afc61280b565b5b81600001516003811115610b1457610b1361280b565b5b03610ca1576000808260600151806020019051810190610b349190612f29565b915091506000836040015173ffffffffffffffffffffffffffffffffffffffff16635598f8cc846040518263ffffffff1660e01b8152600401610b779190612639565b61016060405180830381865afa158015610b95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb99190612e0f565b9050836020015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614610c28576040517fb886ee5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836040015173ffffffffffffffffffffffffffffffffffffffff1663ef2c408284846040518363ffffffff1660e01b8152600401610c67929190612f69565b600060405180830381600087803b158015610c8157600080fd5b505af1158015610c95573d6000803e3d6000fd5b50505050505050610cd3565b6040517f88dd20d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b5050505050565b6000610ce7611c49565b67ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b7f000000000000000000000000000000000000000000000000000000000000000081565b60014614610dcb576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e4d576040517f8569f7b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084604051602001610e609190613108565b60405160208183030381529060405290506000604051806080016040528060006003811115610e9257610e9161280b565b5b81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815250604051602001610ee39190613254565b6040516020818303038152906040529050610f08866060015133308960c00151611c54565b610f3b86606001517f00000000000000000000000000000000000000000000000000000000000000008860c00151611bfa565b6000600167ffffffffffffffff811115610f5857610f57611ff8565b5b604051908082528060200260200182016040528015610f9157816020015b610f7e611e07565b815260200190600190039081610f765790505b5090506040518060400160405280886060015173ffffffffffffffffffffffffffffffffffffffff1681526020018860c0015181525081600081518110610fdb57610fda613276565b5b6020026020010181905250600060405180608001604052808881526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018481525090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632be9a5fc348389336040518563ffffffff1660e01b815260040161107f939291906133ed565b6000604051808303818588803b15801561109857600080fd5b505af11580156110ac573d6000803e3d6000fd5b5050505050876040516110bf9190613609565b60405180910390207f4aae98d337a0a5163a588f53c6f71e48434770a50edfaed755ab46d6b78b069560405160405180910390a25050505050505050565b611105611cb3565b61110f6000611ceb565b565b6001461461114b576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111cd576040517f8569f7b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085856040516020016111e2929190612f69565b6040516020818303038152906040529050600060405180608001604052806003808111156112135761121261280b565b5b81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152506040516020016112649190613254565b6040516020818303038152906040529050600060405180608001604052808781526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff8111156112bf576112be611ff8565b5b6040519080825280602002602001820160405280156112f857816020015b6112e5611e07565b8152602001906001900390816112dd5790505b5081526020018381525090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632be9a5fc348388336040518563ffffffff1660e01b8152600401611362939291906133ed565b6000604051808303818588803b15801561137b57600080fd5b505af115801561138f573d6000803e3d6000fd5b50505050508673ffffffffffffffffffffffffffffffffffffffff16883373ffffffffffffffffffffffffffffffffffffffff167ff4dac78be1c21b136c376aaeca75578933f879779645f2ecbe7922acd6daed6860405160405180910390a45050505050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b611421611cb3565b61142c823383611db3565b5050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b611485611cb3565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f10e044199752f36cd954b8ea3850de8317639444d605b34fca03e119fc18e4f28260405161152191906123f8565b60405180910390a25050565b60014614611567576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115e9576040517f8569f7b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000846040516020016115fc919061363c565b6040516020818303038152906040529050600060405180608001604052806002600381111561162e5761162d61280b565b5b81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381525060405160200161167f9190613254565b6040516020818303038152906040529050600060405180608001604052808781526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff8111156116da576116d9611ff8565b5b60405190808252806020026020018201604052801561171357816020015b611700611e07565b8152602001906001900390816116f85790505b5081526020018381525090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632be9a5fc348388336040518563ffffffff1660e01b815260040161177d939291906133ed565b6000604051808303818588803b15801561179657600080fd5b505af11580156117aa573d6000803e3d6000fd5b5050505050866040516117bd9190613672565b60405180910390207fc2777135af21b673acfb520535a74f921ac9528406c8519680841d38a4a86afb60405160405180910390a250505050505050565b60014614611834576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118b6576040517f8569f7b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000846040516020016118c991906136f5565b604051602081830303815290604052905060006040518060800160405280600160038111156118fb576118fa61280b565b5b81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381525060405160200161194c9190613254565b60405160208183030381529060405290506060600087606001511115611a5d57600167ffffffffffffffff81111561198757611986611ff8565b5b6040519080825280602002602001820160405280156119c057816020015b6119ad611e07565b8152602001906001900390816119a55790505b5090506040518060400160405280886020015173ffffffffffffffffffffffffffffffffffffffff168152602001886060015181525081600081518110611a0a57611a09613276565b5b6020026020010181905250611a29876020015133308a60600151611c54565b611a5c87602001517f00000000000000000000000000000000000000000000000000000000000000008960600151611bfa565b5b600060405180608001604052808881526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018481525090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632be9a5fc348389336040518563ffffffff1660e01b8152600401611af6939291906133ed565b6000604051808303818588803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b505050505087604051611b369190613773565b60405180910390207f45f4b0b01168bf869ef12edb3bbadd7b3f87625c391622287175b57bdea9df6b60405160405180910390a25050505050505050565b611b7c611cb3565b63389a75e1600c52806000526020600c208054421115611ba457636f5e88186000526004601cfd5b6000815550611bb281611ceb565b50565b611bbd611cb3565b8060601b611bd357637448fbae6000526004601cfd5b611bdc81611ceb565b50565b600063389a75e1600c52816000526020600c20549050919050565b81601452806034526f095ea7b300000000000000000000000060005260206000604460106000875af13d156001600051141716611c3f57633e3f8f736000526004601cfd5b6000603452505050565b60006202a300905090565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d156001600051141716611ca357637939f4246000526004601cfd5b6000606052806040525050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314611ce9576382b429006000526004601cfd5b565b611cf3611e02565b15611d59577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3811560ff1b8217815550611db0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3818155505b50565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d156001600051141716611df8576390b8ec186000526004601cfd5b6000603452505050565b600090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611e5e81611e4b565b8114611e6957600080fd5b50565b600081359050611e7b81611e55565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611eac82611e81565b9050919050565b611ebc81611ea1565b8114611ec757600080fd5b50565b600081359050611ed981611eb3565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611f0457611f03611edf565b5b8235905067ffffffffffffffff811115611f2157611f20611ee4565b5b602083019150836001820283011115611f3d57611f3c611ee9565b5b9250929050565b60008060008060608587031215611f5e57611f5d611e41565b5b6000611f6c87828801611e6c565b9450506020611f7d87828801611eca565b935050604085013567ffffffffffffffff811115611f9e57611f9d611e46565b5b611faa87828801611eee565b925092505092959194509250565b611fc181611ea1565b82525050565b6000602082019050611fdc6000830184611fb8565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61203082611fe7565b810181811067ffffffffffffffff8211171561204f5761204e611ff8565b5b80604052505050565b6000612062611e37565b905061206e8282612027565b919050565b600080fd5b600060ff82169050919050565b61208e81612078565b811461209957600080fd5b50565b6000813590506120ab81612085565b92915050565b600067ffffffffffffffff8211156120cc576120cb611ff8565b5b602082029050602081019050919050565b60006120f06120eb846120b1565b612058565b9050808382526020820190506020840283018581111561211357612112611ee9565b5b835b8181101561213c57806121288882611eca565b845260208401935050602081019050612115565b5050509392505050565b600082601f83011261215b5761215a611edf565b5b813561216b8482602086016120dd565b91505092915050565b60008115159050919050565b61218981612174565b811461219457600080fd5b50565b6000813590506121a681612180565b92915050565b600061014082840312156121c3576121c2611fe2565b5b6121ce610140612058565b905060006121de84828501611e6c565b60008301525060206121f284828501611eca565b602083015250604061220684828501611eca565b604083015250606061221a84828501611eca565b606083015250608061222e8482850161209c565b60808301525060a061224284828501611e6c565b60a08301525060c061225684828501611e6c565b60c08301525060e082013567ffffffffffffffff81111561227a57612279612073565b5b61228684828501612146565b60e08301525061010061229b84828501611eca565b610100830152506101206122b184828501612197565b6101208301525092915050565b600080600080608085870312156122d8576122d7611e41565b5b600085013567ffffffffffffffff8111156122f6576122f5611e46565b5b612302878288016121ac565b945050602061231387828801611e6c565b935050604061232487828801611e6c565b925050606061233587828801611eca565b91505092959194509250565b600080600080600060a0868803121561235d5761235c611e41565b5b600061236b88828901611e6c565b955050602061237c88828901611eca565b945050604061238d88828901611e6c565b935050606061239e88828901611e6c565b92505060806123af88828901611eca565b9150509295509295909350565b6000602082840312156123d2576123d1611e41565b5b60006123e084828501611eca565b91505092915050565b6123f281612174565b82525050565b600060208201905061240d60008301846123e9565b92915050565b6000806040838503121561242a57612429611e41565b5b600061243885828601611eca565b925050602061244985828601611e6c565b9150509250929050565b6000806040838503121561246a57612469611e41565b5b600061247885828601611eca565b925050602061248985828601612197565b9150509250929050565b6000602082840312156124a9576124a8611fe2565b5b6124b36020612058565b905060006124c384828501611e6c565b60008301525092915050565b600080600080608085870312156124e9576124e8611e41565b5b60006124f787828801612493565b945050602061250887828801611e6c565b935050604061251987828801611e6c565b925050606061252a87828801611eca565b91505092959194509250565b600060a0828403121561254c5761254b611fe2565b5b61255660a0612058565b9050600061256684828501611e6c565b600083015250602061257a84828501611eca565b602083015250604061258e8482850161209c565b60408301525060606125a284828501611e6c565b60608301525060806125b684828501611e6c565b60808301525092915050565b60008060008061010085870312156125dd576125dc611e41565b5b60006125eb87828801612536565b94505060a06125fc87828801611e6c565b93505060c061260d87828801611e6c565b92505060e061261e87828801611eca565b91505092959194509250565b61263381611e4b565b82525050565b600060208201905061264e600083018461262a565b92915050565b6004811061266157600080fd5b50565b60008135905061267381612654565b92915050565b600080fd5b600067ffffffffffffffff82111561269957612698611ff8565b5b6126a282611fe7565b9050602081019050919050565b82818337600083830152505050565b60006126d16126cc8461267e565b612058565b9050828152602081018484840111156126ed576126ec612679565b5b6126f88482856126af565b509392505050565b600082601f83011261271557612714611edf565b5b81356127258482602086016126be565b91505092915050565b60006080828403121561274457612743611fe2565b5b61274e6080612058565b9050600061275e84828501612664565b600083015250602061277284828501611eca565b602083015250604061278684828501611eca565b604083015250606082013567ffffffffffffffff8111156127aa576127a9612073565b5b6127b684828501612700565b60608301525092915050565b6000602082840312156127d8576127d7611e41565b5b600082013567ffffffffffffffff8111156127f6576127f5611e46565b5b6128028482850161272e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008151905061284981611e55565b92915050565b60008151905061285e81611eb3565b92915050565b60008151905061287381612085565b92915050565b600061288c612887846120b1565b612058565b905080838252602082019050602084028301858111156128af576128ae611ee9565b5b835b818110156128d857806128c4888261284f565b8452602084019350506020810190506128b1565b5050509392505050565b600082601f8301126128f7576128f6611edf565b5b8151612907848260208601612879565b91505092915050565b60008151905061291f81612180565b92915050565b6000610140828403121561293c5761293b611fe2565b5b612947610140612058565b905060006129578482850161283a565b600083015250602061296b8482850161284f565b602083015250604061297f8482850161284f565b60408301525060606129938482850161284f565b60608301525060806129a784828501612864565b60808301525060a06129bb8482850161283a565b60a08301525060c06129cf8482850161283a565b60c08301525060e082015167ffffffffffffffff8111156129f3576129f2612073565b5b6129ff848285016128e2565b60e083015250610100612a148482850161284f565b61010083015250610120612a2a84828501612910565b6101208301525092915050565b600060208284031215612a4d57612a4c611e41565b5b600082015167ffffffffffffffff811115612a6b57612a6a611e46565b5b612a7784828501612925565b91505092915050565b600060208284031215612a9657612a95611e41565b5b6000612aa48482850161284f565b91505092915050565b612ab681612078565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612af181611ea1565b82525050565b6000612b038383612ae8565b60208301905092915050565b6000602082019050919050565b6000612b2782612abc565b612b318185612ac7565b9350612b3c83612ad8565b8060005b83811015612b6d578151612b548882612af7565b9750612b5f83612b0f565b925050600181019050612b40565b5085935050505092915050565b600061014082019050612b90600083018d61262a565b612b9d602083018c611fb8565b612baa604083018b611fb8565b612bb7606083018a611fb8565b612bc46080830189612aad565b612bd160a083018861262a565b612bde60c083018761262a565b81810360e0830152612bf08186612b1c565b9050612c00610100830185611fb8565b612c0e6101208301846123e9565b9b9a5050505050505050505050565b600060208284031215612c3357612c32611e41565b5b6000612c418482850161283a565b91505092915050565b600060a08284031215612c6057612c5f611fe2565b5b612c6a60a0612058565b90506000612c7a8482850161283a565b6000830152506020612c8e8482850161284f565b6020830152506040612ca284828501612864565b6040830152506060612cb68482850161283a565b6060830152506080612cca8482850161283a565b60808301525092915050565b600060a08284031215612cec57612ceb611e41565b5b6000612cfa84828501612c4a565b91505092915050565b60006101608284031215612d1a57612d19611fe2565b5b612d25610160612058565b90506000612d358482850161283a565b6000830152506020612d498482850161284f565b6020830152506040612d5d8482850161284f565b6040830152506060612d718482850161284f565b6060830152506080612d8584828501612864565b60808301525060a0612d998482850161283a565b60a08301525060c0612dad8482850161283a565b60c08301525060e0612dc18482850161283a565b60e083015250610100612dd68482850161283a565b61010083015250610120612dec8482850161283a565b61012083015250610140612e028482850161284f565b6101408301525092915050565b60006101608284031215612e2657612e25611e41565b5b6000612e3484828501612d03565b91505092915050565b6000608082019050612e52600083018761262a565b612e5f6020830186612aad565b612e6c604083018561262a565b612e79606083018461262a565b95945050505050565b600060208284031215612e9857612e97611fe2565b5b612ea26020612058565b90506000612eb28482850161283a565b60008301525092915050565b600060208284031215612ed457612ed3611e41565b5b6000612ee284828501612e82565b91505092915050565b6000612ef682611e81565b9050919050565b612f0681612eeb565b8114612f1157600080fd5b50565b600081519050612f2381612efd565b92915050565b60008060408385031215612f4057612f3f611e41565b5b6000612f4e8582860161283a565b9250506020612f5f85828601612f14565b9150509250929050565b6000604082019050612f7e600083018561262a565b612f8b6020830184611fb8565b9392505050565b612f9b81611e4b565b82525050565b612faa81612078565b82525050565b600082825260208201905092915050565b6000612fcc82612abc565b612fd68185612fb0565b9350612fe183612ad8565b8060005b83811015613012578151612ff98882612af7565b975061300483612b0f565b925050600181019050612fe5565b5085935050505092915050565b61302881612174565b82525050565b6000610140830160008301516130476000860182612f92565b50602083015161305a6020860182612ae8565b50604083015161306d6040860182612ae8565b5060608301516130806060860182612ae8565b5060808301516130936080860182612fa1565b5060a08301516130a660a0860182612f92565b5060c08301516130b960c0860182612f92565b5060e083015184820360e08601526130d18282612fc1565b9150506101008301516130e8610100860182612ae8565b506101208301516130fd61012086018261301f565b508091505092915050565b60006020820190508181036000830152613122818461302e565b905092915050565b6004811061313b5761313a61280b565b5b50565b600081905061314c8261312a565b919050565b600061315c8261313e565b9050919050565b61316c81613151565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131ac578082015181840152602081019050613191565b60008484015250505050565b60006131c382613172565b6131cd818561317d565b93506131dd81856020860161318e565b6131e681611fe7565b840191505092915050565b60006080830160008301516132096000860182613163565b50602083015161321c6020860182612ae8565b50604083015161322f6040860182612ae8565b506060830151848203606086015261324782826131b8565b9150508091505092915050565b6000602082019050818103600083015261326e81846131f1565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6040820160008201516132e76000850182612ae8565b5060208201516132fa6020850182612f92565b50505050565b600061330c83836132d1565b60408301905092915050565b6000602082019050919050565b6000613330826132a5565b61333a81856132b0565b9350613345836132c1565b8060005b8381101561337657815161335d8882613300565b975061336883613318565b925050600181019050613349565b5085935050505092915050565b600060808301600083015161339b6000860182612f92565b5060208301516133ae6020860182612ae8565b50604083015184820360408601526133c68282613325565b915050606083015184820360608601526133e082826131b8565b9150508091505092915050565b600060608201905081810360008301526134078186613383565b9050613416602083018561262a565b6134236040830184611fb8565b949350505050565b61343481611e4b565b82525050565b6000613446838361342b565b60208301905092915050565b61345b81611ea1565b82525050565b600061346d8383613452565b60208301905092915050565b61348281612078565b82525050565b60006134948383613479565b60208301905092915050565b600081905092915050565b60006134b682612abc565b6134c081856134a0565b93506134cb83612ad8565b8060005b838110156134fc5781516134e38882613461565b97506134ee83612b0f565b9250506001810190506134cf565b5085935050505092915050565b600061351583836134ab565b905092915050565b61352681612174565b82525050565b6000613538838361351d565b60208301905092915050565b60008083016000830151613558858261343a565b945050602083015161356a8582613461565b945050604083015161357c8582613461565b945050606083015161358e8582613461565b94505060808301516135a08582613488565b94505060a08301516135b2858261343a565b94505060c08301516135c4858261343a565b94505060e08301516135d68582613509565b9450506101008301516135e98582613461565b9450506101208301516135fc858261352c565b9450508391505092915050565b60006136158284613544565b915081905092915050565b6020820160008201516136366000850182612f92565b50505050565b60006020820190506136516000830184613620565b92915050565b60008201600082015161366a848261343a565b935050505050565b600061367e8284613657565b60208201915081905092915050565b60a0820160008201516136a36000850182612f92565b5060208201516136b66020850182612ae8565b5060408201516136c96040850182612fa1565b5060608201516136dc6060850182612f92565b5060808201516136ef6080850182612f92565b50505050565b600060a08201905061370a600083018461368d565b92915050565b600082016000820151613723848261343a565b93505060208201516137358482613461565b93505060408201516137478482613488565b9350506060820151613759848261343a565b935050608082015161376b848261343a565b935050505050565b600061377f8284613710565b60a0820191508190509291505056fea26469706673582212204181f10dab12e9db00ebfe91431ae7839b8fef96090093b061c4a7bcca5a0ee664736f6c63430008130033000000000000000000000000f0000058000021003e4754dca700c766de7601c200000000000000000000000096006425da428e45c282008b00004a00002b345e000000000000000000000000606a503e5178908f10597894b35b2be8685eab90

Deployed Bytecode

0x6080604052600436106100fe5760003560e01c80638980f11f11610095578063c533f30511610064578063c533f30514610292578063d717b354146102ae578063f04e283e146102ca578063f2fde38b146102e6578063fee81cf414610302576100fe565b80638980f11f146101ea5780638da5cb5b14610213578063b82325541461023e578063c3ef672b14610269576100fe565b80636509497d116100d15780636509497d1461016b578063715018a61461018757806379f72caf146101915780638924ec96146101ad576100fe565b80631885c2f914610103578063256929621461012c57806354d1f13d146101365780635a58fe4b14610140575b600080fd5b34801561010f57600080fd5b5061012a60048036038101906101259190611f44565b61033f565b005b610134610cdd565b005b61013e610d31565b005b34801561014c57600080fd5b50610155610d6d565b6040516101629190611fc7565b60405180910390f35b610185600480360381019061018091906122be565b610d91565b005b61018f6110fd565b005b6101ab60048036038101906101a69190612341565b611111565b005b3480156101b957600080fd5b506101d460048036038101906101cf91906123bc565b6113f9565b6040516101e191906123f8565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612413565b611419565b005b34801561021f57600080fd5b50610228611430565b6040516102359190611fc7565b60405180910390f35b34801561024a57600080fd5b50610253611459565b6040516102609190611fc7565b60405180910390f35b34801561027557600080fd5b50610290600480360381019061028b9190612453565b61147d565b005b6102ac60048036038101906102a791906124cf565b61152d565b005b6102c860048036038101906102c391906125c2565b6117fa565b005b6102e460048036038101906102df91906123bc565b611b74565b005b61030060048036038101906102fb91906123bc565b611bb5565b005b34801561030e57600080fd5b50610329600480360381019061032491906123bc565b611bdf565b6040516103369190612639565b60405180910390f35b7f000000000000000000000000f0000058000021003e4754dca700c766de7601c273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c4576040517ff7f5e02c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184146103fe576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610463576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828281019061047491906127c2565b90506000600381111561048a5761048961280b565b5b816000015160038111156104a1576104a061280b565b5b0361063757600081606001518060200190518101906104c09190612a37565b905060007f00000000000000000000000096006425da428e45c282008b00004a00002b345e73ffffffffffffffffffffffffffffffffffffffff1663d5c6b50483606001516040518263ffffffff1660e01b81526004016105219190611fc7565b602060405180830381865afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105629190612a80565b90506105778184604001518460c00151611bfa565b826040015173ffffffffffffffffffffffffffffffffffffffff1663b956358c8360000151846020015185604001518587608001518860a001518960c001518a60e001518b61010001518c61012001516040518b63ffffffff1660e01b81526004016105ec9a99989796959493929190612b7a565b6020604051808303816000875af115801561060b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062f9190612c1d565b505050610cd6565b6001600381111561064b5761064a61280b565b5b816000015160038111156106625761066161280b565b5b0361093057600081606001518060200190518101906106819190612cd6565b90506000826040015173ffffffffffffffffffffffffffffffffffffffff16635598f8cc83600001516040518263ffffffff1660e01b81526004016106c69190612639565b61016060405180830381865afa1580156106e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107089190612e0f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614610777576040517fb886ee5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826060015111156108a45760007f00000000000000000000000096006425da428e45c282008b00004a00002b345e73ffffffffffffffffffffffffffffffffffffffff1663d5c6b50484602001516040518263ffffffff1660e01b81526004016107e39190611fc7565b602060405180830381865afa158015610800573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108249190612a80565b90508073ffffffffffffffffffffffffffffffffffffffff16826060015173ffffffffffffffffffffffffffffffffffffffff161461088f576040517fdfde867100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a28185604001518560600151611bfa565b505b826040015173ffffffffffffffffffffffffffffffffffffffff16636dbb501183600001518460400151856060015186608001516040518563ffffffff1660e01b81526004016108f79493929190612e3d565b600060405180830381600087803b15801561091157600080fd5b505af1158015610925573d6000803e3d6000fd5b505050505050610cd5565b600260038111156109445761094361280b565b5b8160000151600381111561095b5761095a61280b565b5b03610aea576000816060015180602001905181019061097a9190612ebe565b90506000826040015173ffffffffffffffffffffffffffffffffffffffff16635598f8cc83600001516040518263ffffffff1660e01b81526004016109bf9190612639565b61016060405180830381865afa1580156109dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a019190612e0f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614610a70576040517fb886ee5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826040015173ffffffffffffffffffffffffffffffffffffffff1663b0e1c1e183600001516040518263ffffffff1660e01b8152600401610ab19190612639565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b505050505050610cd4565b600380811115610afd57610afc61280b565b5b81600001516003811115610b1457610b1361280b565b5b03610ca1576000808260600151806020019051810190610b349190612f29565b915091506000836040015173ffffffffffffffffffffffffffffffffffffffff16635598f8cc846040518263ffffffff1660e01b8152600401610b779190612639565b61016060405180830381865afa158015610b95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb99190612e0f565b9050836020015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614610c28576040517fb886ee5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836040015173ffffffffffffffffffffffffffffffffffffffff1663ef2c408284846040518363ffffffff1660e01b8152600401610c67929190612f69565b600060405180830381600087803b158015610c8157600080fd5b505af1158015610c95573d6000803e3d6000fd5b50505050505050610cd3565b6040517f88dd20d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b5050505050565b6000610ce7611c49565b67ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b7f00000000000000000000000096006425da428e45c282008b00004a00002b345e81565b60014614610dcb576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e4d576040517f8569f7b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084604051602001610e609190613108565b60405160208183030381529060405290506000604051806080016040528060006003811115610e9257610e9161280b565b5b81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815250604051602001610ee39190613254565b6040516020818303038152906040529050610f08866060015133308960c00151611c54565b610f3b86606001517f00000000000000000000000096006425da428e45c282008b00004a00002b345e8860c00151611bfa565b6000600167ffffffffffffffff811115610f5857610f57611ff8565b5b604051908082528060200260200182016040528015610f9157816020015b610f7e611e07565b815260200190600190039081610f765790505b5090506040518060400160405280886060015173ffffffffffffffffffffffffffffffffffffffff1681526020018860c0015181525081600081518110610fdb57610fda613276565b5b6020026020010181905250600060405180608001604052808881526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018481525090507f000000000000000000000000f0000058000021003e4754dca700c766de7601c273ffffffffffffffffffffffffffffffffffffffff16632be9a5fc348389336040518563ffffffff1660e01b815260040161107f939291906133ed565b6000604051808303818588803b15801561109857600080fd5b505af11580156110ac573d6000803e3d6000fd5b5050505050876040516110bf9190613609565b60405180910390207f4aae98d337a0a5163a588f53c6f71e48434770a50edfaed755ab46d6b78b069560405160405180910390a25050505050505050565b611105611cb3565b61110f6000611ceb565b565b6001461461114b576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111cd576040517f8569f7b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085856040516020016111e2929190612f69565b6040516020818303038152906040529050600060405180608001604052806003808111156112135761121261280b565b5b81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152506040516020016112649190613254565b6040516020818303038152906040529050600060405180608001604052808781526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff8111156112bf576112be611ff8565b5b6040519080825280602002602001820160405280156112f857816020015b6112e5611e07565b8152602001906001900390816112dd5790505b5081526020018381525090507f000000000000000000000000f0000058000021003e4754dca700c766de7601c273ffffffffffffffffffffffffffffffffffffffff16632be9a5fc348388336040518563ffffffff1660e01b8152600401611362939291906133ed565b6000604051808303818588803b15801561137b57600080fd5b505af115801561138f573d6000803e3d6000fd5b50505050508673ffffffffffffffffffffffffffffffffffffffff16883373ffffffffffffffffffffffffffffffffffffffff167ff4dac78be1c21b136c376aaeca75578933f879779645f2ecbe7922acd6daed6860405160405180910390a45050505050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b611421611cb3565b61142c823383611db3565b5050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754905090565b7f000000000000000000000000f0000058000021003e4754dca700c766de7601c281565b611485611cb3565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f10e044199752f36cd954b8ea3850de8317639444d605b34fca03e119fc18e4f28260405161152191906123f8565b60405180910390a25050565b60014614611567576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115e9576040517f8569f7b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000846040516020016115fc919061363c565b6040516020818303038152906040529050600060405180608001604052806002600381111561162e5761162d61280b565b5b81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381525060405160200161167f9190613254565b6040516020818303038152906040529050600060405180608001604052808781526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff8111156116da576116d9611ff8565b5b60405190808252806020026020018201604052801561171357816020015b611700611e07565b8152602001906001900390816116f85790505b5081526020018381525090507f000000000000000000000000f0000058000021003e4754dca700c766de7601c273ffffffffffffffffffffffffffffffffffffffff16632be9a5fc348388336040518563ffffffff1660e01b815260040161177d939291906133ed565b6000604051808303818588803b15801561179657600080fd5b505af11580156117aa573d6000803e3d6000fd5b5050505050866040516117bd9190613672565b60405180910390207fc2777135af21b673acfb520535a74f921ac9528406c8519680841d38a4a86afb60405160405180910390a250505050505050565b60014614611834576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118b6576040517f8569f7b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000846040516020016118c991906136f5565b604051602081830303815290604052905060006040518060800160405280600160038111156118fb576118fa61280b565b5b81526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381525060405160200161194c9190613254565b60405160208183030381529060405290506060600087606001511115611a5d57600167ffffffffffffffff81111561198757611986611ff8565b5b6040519080825280602002602001820160405280156119c057816020015b6119ad611e07565b8152602001906001900390816119a55790505b5090506040518060400160405280886020015173ffffffffffffffffffffffffffffffffffffffff168152602001886060015181525081600081518110611a0a57611a09613276565b5b6020026020010181905250611a29876020015133308a60600151611c54565b611a5c87602001517f00000000000000000000000096006425da428e45c282008b00004a00002b345e8960600151611bfa565b5b600060405180608001604052808881526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018481525090507f000000000000000000000000f0000058000021003e4754dca700c766de7601c273ffffffffffffffffffffffffffffffffffffffff16632be9a5fc348389336040518563ffffffff1660e01b8152600401611af6939291906133ed565b6000604051808303818588803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b505050505087604051611b369190613773565b60405180910390207f45f4b0b01168bf869ef12edb3bbadd7b3f87625c391622287175b57bdea9df6b60405160405180910390a25050505050505050565b611b7c611cb3565b63389a75e1600c52806000526020600c208054421115611ba457636f5e88186000526004601cfd5b6000815550611bb281611ceb565b50565b611bbd611cb3565b8060601b611bd357637448fbae6000526004601cfd5b611bdc81611ceb565b50565b600063389a75e1600c52816000526020600c20549050919050565b81601452806034526f095ea7b300000000000000000000000060005260206000604460106000875af13d156001600051141716611c3f57633e3f8f736000526004601cfd5b6000603452505050565b60006202a300905090565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d156001600051141716611ca357637939f4246000526004601cfd5b6000606052806040525050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314611ce9576382b429006000526004601cfd5b565b611cf3611e02565b15611d59577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3811560ff1b8217815550611db0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3818155505b50565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d156001600051141716611df8576390b8ec186000526004601cfd5b6000603452505050565b600090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611e5e81611e4b565b8114611e6957600080fd5b50565b600081359050611e7b81611e55565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611eac82611e81565b9050919050565b611ebc81611ea1565b8114611ec757600080fd5b50565b600081359050611ed981611eb3565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611f0457611f03611edf565b5b8235905067ffffffffffffffff811115611f2157611f20611ee4565b5b602083019150836001820283011115611f3d57611f3c611ee9565b5b9250929050565b60008060008060608587031215611f5e57611f5d611e41565b5b6000611f6c87828801611e6c565b9450506020611f7d87828801611eca565b935050604085013567ffffffffffffffff811115611f9e57611f9d611e46565b5b611faa87828801611eee565b925092505092959194509250565b611fc181611ea1565b82525050565b6000602082019050611fdc6000830184611fb8565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61203082611fe7565b810181811067ffffffffffffffff8211171561204f5761204e611ff8565b5b80604052505050565b6000612062611e37565b905061206e8282612027565b919050565b600080fd5b600060ff82169050919050565b61208e81612078565b811461209957600080fd5b50565b6000813590506120ab81612085565b92915050565b600067ffffffffffffffff8211156120cc576120cb611ff8565b5b602082029050602081019050919050565b60006120f06120eb846120b1565b612058565b9050808382526020820190506020840283018581111561211357612112611ee9565b5b835b8181101561213c57806121288882611eca565b845260208401935050602081019050612115565b5050509392505050565b600082601f83011261215b5761215a611edf565b5b813561216b8482602086016120dd565b91505092915050565b60008115159050919050565b61218981612174565b811461219457600080fd5b50565b6000813590506121a681612180565b92915050565b600061014082840312156121c3576121c2611fe2565b5b6121ce610140612058565b905060006121de84828501611e6c565b60008301525060206121f284828501611eca565b602083015250604061220684828501611eca565b604083015250606061221a84828501611eca565b606083015250608061222e8482850161209c565b60808301525060a061224284828501611e6c565b60a08301525060c061225684828501611e6c565b60c08301525060e082013567ffffffffffffffff81111561227a57612279612073565b5b61228684828501612146565b60e08301525061010061229b84828501611eca565b610100830152506101206122b184828501612197565b6101208301525092915050565b600080600080608085870312156122d8576122d7611e41565b5b600085013567ffffffffffffffff8111156122f6576122f5611e46565b5b612302878288016121ac565b945050602061231387828801611e6c565b935050604061232487828801611e6c565b925050606061233587828801611eca565b91505092959194509250565b600080600080600060a0868803121561235d5761235c611e41565b5b600061236b88828901611e6c565b955050602061237c88828901611eca565b945050604061238d88828901611e6c565b935050606061239e88828901611e6c565b92505060806123af88828901611eca565b9150509295509295909350565b6000602082840312156123d2576123d1611e41565b5b60006123e084828501611eca565b91505092915050565b6123f281612174565b82525050565b600060208201905061240d60008301846123e9565b92915050565b6000806040838503121561242a57612429611e41565b5b600061243885828601611eca565b925050602061244985828601611e6c565b9150509250929050565b6000806040838503121561246a57612469611e41565b5b600061247885828601611eca565b925050602061248985828601612197565b9150509250929050565b6000602082840312156124a9576124a8611fe2565b5b6124b36020612058565b905060006124c384828501611e6c565b60008301525092915050565b600080600080608085870312156124e9576124e8611e41565b5b60006124f787828801612493565b945050602061250887828801611e6c565b935050604061251987828801611e6c565b925050606061252a87828801611eca565b91505092959194509250565b600060a0828403121561254c5761254b611fe2565b5b61255660a0612058565b9050600061256684828501611e6c565b600083015250602061257a84828501611eca565b602083015250604061258e8482850161209c565b60408301525060606125a284828501611e6c565b60608301525060806125b684828501611e6c565b60808301525092915050565b60008060008061010085870312156125dd576125dc611e41565b5b60006125eb87828801612536565b94505060a06125fc87828801611e6c565b93505060c061260d87828801611e6c565b92505060e061261e87828801611eca565b91505092959194509250565b61263381611e4b565b82525050565b600060208201905061264e600083018461262a565b92915050565b6004811061266157600080fd5b50565b60008135905061267381612654565b92915050565b600080fd5b600067ffffffffffffffff82111561269957612698611ff8565b5b6126a282611fe7565b9050602081019050919050565b82818337600083830152505050565b60006126d16126cc8461267e565b612058565b9050828152602081018484840111156126ed576126ec612679565b5b6126f88482856126af565b509392505050565b600082601f83011261271557612714611edf565b5b81356127258482602086016126be565b91505092915050565b60006080828403121561274457612743611fe2565b5b61274e6080612058565b9050600061275e84828501612664565b600083015250602061277284828501611eca565b602083015250604061278684828501611eca565b604083015250606082013567ffffffffffffffff8111156127aa576127a9612073565b5b6127b684828501612700565b60608301525092915050565b6000602082840312156127d8576127d7611e41565b5b600082013567ffffffffffffffff8111156127f6576127f5611e46565b5b6128028482850161272e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008151905061284981611e55565b92915050565b60008151905061285e81611eb3565b92915050565b60008151905061287381612085565b92915050565b600061288c612887846120b1565b612058565b905080838252602082019050602084028301858111156128af576128ae611ee9565b5b835b818110156128d857806128c4888261284f565b8452602084019350506020810190506128b1565b5050509392505050565b600082601f8301126128f7576128f6611edf565b5b8151612907848260208601612879565b91505092915050565b60008151905061291f81612180565b92915050565b6000610140828403121561293c5761293b611fe2565b5b612947610140612058565b905060006129578482850161283a565b600083015250602061296b8482850161284f565b602083015250604061297f8482850161284f565b60408301525060606129938482850161284f565b60608301525060806129a784828501612864565b60808301525060a06129bb8482850161283a565b60a08301525060c06129cf8482850161283a565b60c08301525060e082015167ffffffffffffffff8111156129f3576129f2612073565b5b6129ff848285016128e2565b60e083015250610100612a148482850161284f565b61010083015250610120612a2a84828501612910565b6101208301525092915050565b600060208284031215612a4d57612a4c611e41565b5b600082015167ffffffffffffffff811115612a6b57612a6a611e46565b5b612a7784828501612925565b91505092915050565b600060208284031215612a9657612a95611e41565b5b6000612aa48482850161284f565b91505092915050565b612ab681612078565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612af181611ea1565b82525050565b6000612b038383612ae8565b60208301905092915050565b6000602082019050919050565b6000612b2782612abc565b612b318185612ac7565b9350612b3c83612ad8565b8060005b83811015612b6d578151612b548882612af7565b9750612b5f83612b0f565b925050600181019050612b40565b5085935050505092915050565b600061014082019050612b90600083018d61262a565b612b9d602083018c611fb8565b612baa604083018b611fb8565b612bb7606083018a611fb8565b612bc46080830189612aad565b612bd160a083018861262a565b612bde60c083018761262a565b81810360e0830152612bf08186612b1c565b9050612c00610100830185611fb8565b612c0e6101208301846123e9565b9b9a5050505050505050505050565b600060208284031215612c3357612c32611e41565b5b6000612c418482850161283a565b91505092915050565b600060a08284031215612c6057612c5f611fe2565b5b612c6a60a0612058565b90506000612c7a8482850161283a565b6000830152506020612c8e8482850161284f565b6020830152506040612ca284828501612864565b6040830152506060612cb68482850161283a565b6060830152506080612cca8482850161283a565b60808301525092915050565b600060a08284031215612cec57612ceb611e41565b5b6000612cfa84828501612c4a565b91505092915050565b60006101608284031215612d1a57612d19611fe2565b5b612d25610160612058565b90506000612d358482850161283a565b6000830152506020612d498482850161284f565b6020830152506040612d5d8482850161284f565b6040830152506060612d718482850161284f565b6060830152506080612d8584828501612864565b60808301525060a0612d998482850161283a565b60a08301525060c0612dad8482850161283a565b60c08301525060e0612dc18482850161283a565b60e083015250610100612dd68482850161283a565b61010083015250610120612dec8482850161283a565b61012083015250610140612e028482850161284f565b6101408301525092915050565b60006101608284031215612e2657612e25611e41565b5b6000612e3484828501612d03565b91505092915050565b6000608082019050612e52600083018761262a565b612e5f6020830186612aad565b612e6c604083018561262a565b612e79606083018461262a565b95945050505050565b600060208284031215612e9857612e97611fe2565b5b612ea26020612058565b90506000612eb28482850161283a565b60008301525092915050565b600060208284031215612ed457612ed3611e41565b5b6000612ee284828501612e82565b91505092915050565b6000612ef682611e81565b9050919050565b612f0681612eeb565b8114612f1157600080fd5b50565b600081519050612f2381612efd565b92915050565b60008060408385031215612f4057612f3f611e41565b5b6000612f4e8582860161283a565b9250506020612f5f85828601612f14565b9150509250929050565b6000604082019050612f7e600083018561262a565b612f8b6020830184611fb8565b9392505050565b612f9b81611e4b565b82525050565b612faa81612078565b82525050565b600082825260208201905092915050565b6000612fcc82612abc565b612fd68185612fb0565b9350612fe183612ad8565b8060005b83811015613012578151612ff98882612af7565b975061300483612b0f565b925050600181019050612fe5565b5085935050505092915050565b61302881612174565b82525050565b6000610140830160008301516130476000860182612f92565b50602083015161305a6020860182612ae8565b50604083015161306d6040860182612ae8565b5060608301516130806060860182612ae8565b5060808301516130936080860182612fa1565b5060a08301516130a660a0860182612f92565b5060c08301516130b960c0860182612f92565b5060e083015184820360e08601526130d18282612fc1565b9150506101008301516130e8610100860182612ae8565b506101208301516130fd61012086018261301f565b508091505092915050565b60006020820190508181036000830152613122818461302e565b905092915050565b6004811061313b5761313a61280b565b5b50565b600081905061314c8261312a565b919050565b600061315c8261313e565b9050919050565b61316c81613151565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131ac578082015181840152602081019050613191565b60008484015250505050565b60006131c382613172565b6131cd818561317d565b93506131dd81856020860161318e565b6131e681611fe7565b840191505092915050565b60006080830160008301516132096000860182613163565b50602083015161321c6020860182612ae8565b50604083015161322f6040860182612ae8565b506060830151848203606086015261324782826131b8565b9150508091505092915050565b6000602082019050818103600083015261326e81846131f1565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6040820160008201516132e76000850182612ae8565b5060208201516132fa6020850182612f92565b50505050565b600061330c83836132d1565b60408301905092915050565b6000602082019050919050565b6000613330826132a5565b61333a81856132b0565b9350613345836132c1565b8060005b8381101561337657815161335d8882613300565b975061336883613318565b925050600181019050613349565b5085935050505092915050565b600060808301600083015161339b6000860182612f92565b5060208301516133ae6020860182612ae8565b50604083015184820360408601526133c68282613325565b915050606083015184820360608601526133e082826131b8565b9150508091505092915050565b600060608201905081810360008301526134078186613383565b9050613416602083018561262a565b6134236040830184611fb8565b949350505050565b61343481611e4b565b82525050565b6000613446838361342b565b60208301905092915050565b61345b81611ea1565b82525050565b600061346d8383613452565b60208301905092915050565b61348281612078565b82525050565b60006134948383613479565b60208301905092915050565b600081905092915050565b60006134b682612abc565b6134c081856134a0565b93506134cb83612ad8565b8060005b838110156134fc5781516134e38882613461565b97506134ee83612b0f565b9250506001810190506134cf565b5085935050505092915050565b600061351583836134ab565b905092915050565b61352681612174565b82525050565b6000613538838361351d565b60208301905092915050565b60008083016000830151613558858261343a565b945050602083015161356a8582613461565b945050604083015161357c8582613461565b945050606083015161358e8582613461565b94505060808301516135a08582613488565b94505060a08301516135b2858261343a565b94505060c08301516135c4858261343a565b94505060e08301516135d68582613509565b9450506101008301516135e98582613461565b9450506101208301516135fc858261352c565b9450508391505092915050565b60006136158284613544565b915081905092915050565b6020820160008201516136366000850182612f92565b50505050565b60006020820190506136516000830184613620565b92915050565b60008201600082015161366a848261343a565b935050505050565b600061367e8284613657565b60208201915081905092915050565b60a0820160008201516136a36000850182612f92565b5060208201516136b66020850182612ae8565b5060408201516136c96040850182612fa1565b5060608201516136dc6060850182612f92565b5060808201516136ef6080850182612f92565b50505050565b600060a08201905061370a600083018461368d565b92915050565b600082016000820151613723848261343a565b93505060208201516137358482613461565b93505060408201516137478482613488565b9350506060820151613759848261343a565b935050608082015161376b848261343a565b935050505050565b600061377f8284613710565b60a0820191508190509291505056fea26469706673582212204181f10dab12e9db00ebfe91431ae7839b8fef96090093b061c4a7bcca5a0ee664736f6c63430008130033

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

000000000000000000000000f0000058000021003e4754dca700c766de7601c200000000000000000000000096006425da428e45c282008b00004a00002b345e000000000000000000000000606a503e5178908f10597894b35b2be8685eab90

-----Decoded View---------------
Arg [0] : _laPoste (address): 0xF0000058000021003E4754dCA700C766DE7601C2
Arg [1] : _tokenFactory (address): 0x96006425Da428E45c282008b00004a00002B345e
Arg [2] : _owner (address): 0x606A503e5178908F10597894B35b2Be8685EAB90

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0000058000021003e4754dca700c766de7601c2
Arg [1] : 00000000000000000000000096006425da428e45c282008b00004a00002b345e
Arg [2] : 000000000000000000000000606a503e5178908f10597894b35b2be8685eab90


Deployed Bytecode Sourcemap

70610:14955:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81588:3275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9277:630;;;:::i;:::-;;9992:466;;;:::i;:::-;;72054:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74623:1578;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9012:102;;;:::i;:::-;;78732:1147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72162:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85024:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11717:187;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71968:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85351:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80160:1085;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76702:1693;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10649:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8586:358;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12010:449;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81588:3275;74099:8;74085:22;;:10;:22;;;74081:47;;74116:12;;;;;;;;;;;;;;74081:47;81716:1:::1;81705:7;:12;81701:41;;81726:16;;;;;;;;;;;;;;81701:41;81775:4;81757:23;;:6;:23;;;81753:51;;81789:15;;;;;;;;;;;;;;81753:51;81817:23;81854:7;;81843:30;;;;;;;:::i;:::-;81817:56;;81913:26;81890:49;;;;;;;;:::i;:::-;;:8;:19;;;:49;;;;;;;;:::i;:::-;;::::0;81886:2970:::1;;81956:36;82006:8;:19;;;81995:57;;;;;;;;;;;;:::i;:::-;81956:96;;82069:20;82106:13;82092:42;;;82135:6;:18;;;82092:62;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82069:85;;82171:109;82207:12;82225:8;:19;;;82254:6;:24;;;82171:27;:109::i;:::-;82309:8;:19;;;82297:47;;;82373:6;:14;;;82413:6;:12;;;82453:6;:14;;;82499:12;82547:6;:22;;;82606:6;:23;;;82667:6;:24;;;82721:6;:16;;;82762:6;:11;;;82803:6;:18;;;82297:540;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81941:908;;81886:2970;;;82882:26;82859:49;;;;;;;;:::i;:::-;;:8;:19;;;:49;;;;;;;;:::i;:::-;;::::0;82855:2001:::1;;82925:38;82977:8;:19;;;82966:59;;;;;;;;;;;;:::i;:::-;82925:100;;83040:24;83079:8;:19;;;83067:44;;;83112:6;:17;;;83067:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83040:90;;83169:8;:15;;;83149:35;;:8;:16;;;:35;;;83145:72;;83193:24;;;;;;;;;;;;;;83145:72;83265:1;83238:6;:24;;;:28;83234:454;;;83287:20;83324:13;83310:42;;;83353:6;:18;;;83310:62;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83287:85;;83419:12;83395:36;;:8;:20;;;:36;;;83391:69;;83440:20;;;;;;;;;;;;;;83391:69;83481:191;83539:12;83578:8;:19;;;83628:6;:24;;;83481:27;:191::i;:::-;83268:420;83234:454;83716:8;:19;;;83704:47;;;83770:6;:17;;;83789:6;:22;;;83813:6;:24;;;83839:6;:23;;;83704:173;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;82910:979;;82855:2001;;;83922:25;83899:48;;;;;;;;:::i;:::-;;:8;:19;;;:48;;;;;;;;:::i;:::-;;::::0;83895:961:::1;;83964:35;84013:8;:19;;;84002:56;;;;;;;;;;;;:::i;:::-;83964:94;;84073:24;84112:8;:19;;;84100:44;;;84145:6;:17;;;84100:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84073:90;;84202:8;:15;;;84182:35;;:8;:16;;;:35;;;84178:72;;84226:24;;;;;;;;;;;;;;84178:72;84279:8;:19;;;84267:46;;;84314:6;:17;;;84267:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;83949:395;;83895:961;;;84377:25;84354:48:::0;::::1;;;;;;;:::i;:::-;;:8;:19;;;:48;;;;;;;;:::i;:::-;;::::0;84350:506:::1;;84420:18;84440::::0;84473:8:::1;:19;;;84462:51;;;;;;;;;;;;:::i;:::-;84419:94;;;;84528:24;84567:8;:19;;;84555:44;;;84600:10;84555:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84528:83;;84650:8;:15;;;84630:35;;:8;:16;;;:35;;;84626:72;;84674:24;;;;;;;;;;;;;;84626:72;84727:8;:19;;;84715:46;;;84762:10;84774;84715:70;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;84404:393;;;84350:506;;;84825:19;;;;;;;;;;;;;;84350:506;83895:961;82855:2001;81886:2970;81690:3173;81588:3275:::0;;;;:::o;9277:630::-;9372:15;9408:28;:26;:28::i;:::-;9390:46;;:15;:46;9372:64;;9608:19;9602:4;9595:33;9659:8;9653:4;9646:22;9716:7;9709:4;9703;9693:21;9686:38;9865:8;9818:45;9815:1;9812;9807:67;9508:381;9277:630::o;9992:466::-;10198:19;10192:4;10185:33;10245:8;10239:4;10232:22;10298:1;10291:4;10285;10275:21;10268:32;10431:8;10385:44;10382:1;10379;10374:66;9992:466::o;72054:38::-;;;:::o;74623:1578::-;74853:1;74836:13;:18;74832:47;;74863:16;;;;;;;;;;;;;;74832:47;74895:20;:32;74916:10;74895:32;;;;;;;;;;;;;;;;;;;;;;;;;74890:70;;74936:24;;;;;;;;;;;;;;74890:70;74973:23;75010:6;74999:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;74973:44;;75028:20;75076:200;;;;;;;;75115:26;75076:200;;;;;;;;:::i;:::-;;;;;;75168:10;75076:200;;;;;;75209:10;75076:200;;;;;;75250:10;75076:200;;;75051:236;;;;;;;;:::i;:::-;;;;;;;;;;;;;75028:259;;75300:195;75355:6;:18;;;75394:10;75431:4;75459:6;:24;;;75300:32;:195::i;:::-;75508:109;75544:6;:18;;;75568:13;75591:6;:24;;;75508:27;:109::i;:::-;75630:30;75684:1;75663:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75630:56;;75709:84;;;;;;;;75739:6;:18;;;75709:84;;;;;;75767:6;:24;;;75709:84;;;75697:6;75704:1;75697:9;;;;;;;;:::i;:::-;;;;;;;:96;;;;75806:43;75852:180;;;;;;;;75910:18;75852:180;;;;75955:4;75852:180;;;;;;75983:6;75852:180;;;;76013:7;75852:180;;;75806:226;;76054:8;76045:30;;;76083:9;76094:13;76109:18;76129:10;76045:95;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76186:6;76158:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;74821:1380;;;;74623:1578;;;;:::o;9012:102::-;12856:13;:11;:13::i;:::-;9085:21:::1;9103:1;9085:9;:21::i;:::-;9012:102::o:0;78732:1147::-;78972:1;78955:13;:18;78951:47;;78982:16;;;;;;;;;;;;;;78951:47;79014:20;:32;79035:10;79014:32;;;;;;;;;;;;;;;;;;;;;;;;;79009:70;;79055:24;;;;;;;;;;;;;;79009:70;79092:23;79129:10;79141;79118:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79092:60;;79163:20;79211:199;;;;;;;;79250:25;79211:199;;;;;;;;:::i;:::-;;;;;;79302:10;79211:199;;;;;;79343:10;79211:199;;;;;;79384:10;79211:199;;;79186:235;;;;;;;;:::i;:::-;;;;;;;;;;;;;79163:258;;79434:43;79480:197;;;;;;;;79538:18;79480:197;;;;79583:4;79480:197;;;;;;79632:1;79611:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;79480:197;;;;79658:7;79480:197;;;79434:243;;79699:8;79690:30;;;79728:9;79739:13;79754:18;79774:10;79690:95;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79860:10;79803:68;;79848:10;79836;79803:68;;;;;;;;;;;;78940:939;;;78732:1147;;;;;:::o;72162:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;85024:146::-;12856:13;:11;:13::i;:::-;85107:55:::1;85136:5;85143:10;85155:6;85107:28;:55::i;:::-;85024:146:::0;;:::o;11717:187::-;11763:14;11874:11;11868:18;11858:28;;11717:187;:::o;71968:33::-;;;:::o;85351:211::-;12856:13;:11;:13::i;:::-;85480:11:::1;85447:20;:30:::0;85468:8:::1;85447:30;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;85532:8;85507:47;;;85542:11;85507:47;;;;;;:::i;:::-;;;;;;;;85351:211:::0;;:::o;80160:1085::-;80388:1;80371:13;:18;80367:47;;80398:16;;;;;;;;;;;;;;80367:47;80430:20;:32;80451:10;80430:32;;;;;;;;;;;;;;;;;;;;;;;;;80425:70;;80471:24;;;;;;;;;;;;;;80425:70;80508:23;80545:6;80534:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;80508:44;;80563:20;80611:199;;;;;;;;80650:25;80611:199;;;;;;;;:::i;:::-;;;;;;80702:10;80611:199;;;;;;80743:10;80611:199;;;;;;80784:10;80611:199;;;80586:235;;;;;;;;:::i;:::-;;;;;;;;;;;;;80563:258;;80834:43;80880:197;;;;;;;;80938:18;80880:197;;;;80983:4;80880:197;;;;;;81032:1;81011:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;80880:197;;;;81058:7;80880:197;;;80834:243;;81099:8;81090:30;;;81128:9;81139:13;81154:18;81174:10;81090:95;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81230:6;81203:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;80356:889;;;80160:1085;;;;:::o;76702:1693::-;76934:1;76917:13;:18;76913:47;;76944:16;;;;;;;;;;;;;;76913:47;76976:20;:32;76997:10;76976:32;;;;;;;;;;;;;;;;;;;;;;;;;76971:70;;77017:24;;;;;;;;;;;;;;76971:70;77054:23;77091:6;77080:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;77054:44;;77109:20;77157:200;;;;;;;;77196:26;77157:200;;;;;;;;:::i;:::-;;;;;;77249:10;77157:200;;;;;;77290:10;77157:200;;;;;;77331:10;77157:200;;;77132:236;;;;;;;;:::i;:::-;;;;;;;;;;;;;77109:259;;77381:30;77455:1;77428:6;:24;;;:28;77424:562;;;77503:1;77482:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;77473:32;;77532:84;;;;;;;;77562:6;:18;;;77532:84;;;;;;77590:6;:24;;;77532:84;;;77520:6;77527:1;77520:9;;;;;;;;:::i;:::-;;;;;;;:96;;;;77633:215;77692:6;:18;;;77735:10;77776:4;77808:6;:24;;;77633:32;:215::i;:::-;77865:109;77901:6;:18;;;77925:13;77948:6;:24;;;77865:27;:109::i;:::-;77424:562;77998:43;78044:180;;;;;;;;78102:18;78044:180;;;;78147:4;78044:180;;;;;;78175:6;78044:180;;;;78205:7;78044:180;;;77998:226;;78246:8;78237:30;;;78275:9;78286:13;78301:18;78321:10;78237:95;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78380:6;78350:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;76902:1493;;;;76702:1693;;;;:::o;10649:724::-;12856:13;:11;:13::i;:::-;10887:19:::1;10881:4;10874:33;10934:12;10928:4;10921:26;10997:4;10991;10981:21;11105:12;11099:19;11086:11;11083:36;11080:160;;;11152:10;11146:4;11139:24;11220:4;11214;11207:18;11080:160;11319:1;11305:12;11298:23;10803:529;11342:23;11352:12;11342:9;:23::i;:::-;10649:724:::0;:::o;8586:358::-;12856:13;:11;:13::i;:::-;8761:8:::1;8757:2;8753:17;8743:153;;8804:10;8798:4;8791:24;8876:4;8870;8863:18;8743:153;8917:19;8927:8;8917:9;:19::i;:::-;8586:358:::0;:::o;12010:449::-;12133:14;12289:19;12283:4;12276:33;12336:12;12330:4;12323:26;12435:4;12429;12419:21;12413:28;12403:38;;12010:449;;;:::o;55536:954::-;55701:2;55695:4;55688:16;55759:6;55753:4;55746:20;55825:34;55819:4;55812:48;56218:4;56212;56206;56200;56197:1;56190:5;56183;56178:45;56111:16;56104:24;56100:1;56093:4;56087:11;56084:18;56081:48;55995:247;55967:407;;56290:10;56284:4;56277:24;56354:4;56348;56341:18;55967:407;56401:1;56395:4;56388:15;55536:954;;;:::o;8107:112::-;8176:6;8202:9;8195:16;;8107:112;:::o;48237:1160::-;48423:4;48417:11;48489:6;48483:4;48476:20;48555:2;48549:4;48542:16;48621:4;48617:2;48613:13;48607:4;48600:27;48684:34;48678:4;48671:48;49090:4;49084;49078;49072;49069:1;49062:5;49055;49050:45;48983:16;48976:24;48972:1;48965:4;48959:11;48956:18;48953:48;48867:247;48839:412;;49162:10;49156:4;49149:24;49231:4;49225;49218:18;48839:412;49278:1;49272:4;49265:15;49341:1;49335:4;49328:15;48393:997;48237:1160;;;;:::o;7507:364::-;7723:11;7717:18;7707:8;7704:32;7694:159;;7770:10;7764:4;7757:24;7833:4;7827;7820:18;7694:159;7507:364::o;6333:1113::-;6402:23;:21;:23::i;:::-;6398:1041;;;6535:11;6637:8;6633:2;6629:17;6625:2;6621:26;6609:38;;6793:8;6781:9;6775:16;6735:38;6732:1;6729;6724:78;6908:8;6901:16;6896:3;6892:26;6882:8;6879:40;6868:9;6861:59;6499:436;6398:1041;;;7060:11;7162:8;7158:2;7154:17;7150:2;7146:26;7134:38;;7318:8;7306:9;7300:16;7260:38;7257:1;7254;7249:78;7404:8;7393:9;7386:27;7024:404;6398:1041;6333:1113;:::o;52684:957::-;52850:2;52844:4;52837:16;52908:6;52902:4;52895:20;52974:34;52968:4;52961:48;53368:4;53362;53356;53350;53347:1;53340:5;53333;53328:45;53261:16;53254:24;53250:1;53243:4;53237:11;53234:18;53231:48;53145:247;53117:408;;53440:10;53434:4;53427:24;53505:4;53499;53492:18;53117:408;53552:1;53546:4;53539:15;52684:957;;;:::o;4497:78::-;4561:10;4497:78;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:126::-;727:7;767:42;760:5;756:54;745:65;;690:126;;;:::o;822:96::-;859:7;888:24;906:5;888:24;:::i;:::-;877:35;;822:96;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:117::-;1306:1;1303;1296:12;1320:117;1429:1;1426;1419:12;1443:117;1552:1;1549;1542:12;1579:552;1636:8;1646:6;1696:3;1689:4;1681:6;1677:17;1673:27;1663:122;;1704:79;;:::i;:::-;1663:122;1817:6;1804:20;1794:30;;1847:18;1839:6;1836:30;1833:117;;;1869:79;;:::i;:::-;1833:117;1983:4;1975:6;1971:17;1959:29;;2037:3;2029:4;2021:6;2017:17;2007:8;2003:32;2000:41;1997:128;;;2044:79;;:::i;:::-;1997:128;1579:552;;;;;:::o;2137:817::-;2225:6;2233;2241;2249;2298:2;2286:9;2277:7;2273:23;2269:32;2266:119;;;2304:79;;:::i;:::-;2266:119;2424:1;2449:53;2494:7;2485:6;2474:9;2470:22;2449:53;:::i;:::-;2439:63;;2395:117;2551:2;2577:53;2622:7;2613:6;2602:9;2598:22;2577:53;:::i;:::-;2567:63;;2522:118;2707:2;2696:9;2692:18;2679:32;2738:18;2730:6;2727:30;2724:117;;;2760:79;;:::i;:::-;2724:117;2873:64;2929:7;2920:6;2909:9;2905:22;2873:64;:::i;:::-;2855:82;;;;2650:297;2137:817;;;;;;;:::o;2960:118::-;3047:24;3065:5;3047:24;:::i;:::-;3042:3;3035:37;2960:118;;:::o;3084:222::-;3177:4;3215:2;3204:9;3200:18;3192:26;;3228:71;3296:1;3285:9;3281:17;3272:6;3228:71;:::i;:::-;3084:222;;;;:::o;3312:117::-;3421:1;3418;3411:12;3435:102;3476:6;3527:2;3523:7;3518:2;3511:5;3507:14;3503:28;3493:38;;3435:102;;;:::o;3543:180::-;3591:77;3588:1;3581:88;3688:4;3685:1;3678:15;3712:4;3709:1;3702:15;3729:281;3812:27;3834:4;3812:27;:::i;:::-;3804:6;3800:40;3942:6;3930:10;3927:22;3906:18;3894:10;3891:34;3888:62;3885:88;;;3953:18;;:::i;:::-;3885:88;3993:10;3989:2;3982:22;3772:238;3729:281;;:::o;4016:129::-;4050:6;4077:20;;:::i;:::-;4067:30;;4106:33;4134:4;4126:6;4106:33;:::i;:::-;4016:129;;;:::o;4151:117::-;4260:1;4257;4250:12;4274:86;4309:7;4349:4;4342:5;4338:16;4327:27;;4274:86;;;:::o;4366:118::-;4437:22;4453:5;4437:22;:::i;:::-;4430:5;4427:33;4417:61;;4474:1;4471;4464:12;4417:61;4366:118;:::o;4490:135::-;4534:5;4572:6;4559:20;4550:29;;4588:31;4613:5;4588:31;:::i;:::-;4490:135;;;;:::o;4631:311::-;4708:4;4798:18;4790:6;4787:30;4784:56;;;4820:18;;:::i;:::-;4784:56;4870:4;4862:6;4858:17;4850:25;;4930:4;4924;4920:15;4912:23;;4631:311;;;:::o;4965:710::-;5061:5;5086:81;5102:64;5159:6;5102:64;:::i;:::-;5086:81;:::i;:::-;5077:90;;5187:5;5216:6;5209:5;5202:21;5250:4;5243:5;5239:16;5232:23;;5303:4;5295:6;5291:17;5283:6;5279:30;5332:3;5324:6;5321:15;5318:122;;;5351:79;;:::i;:::-;5318:122;5466:6;5449:220;5483:6;5478:3;5475:15;5449:220;;;5558:3;5587:37;5620:3;5608:10;5587:37;:::i;:::-;5582:3;5575:50;5654:4;5649:3;5645:14;5638:21;;5525:144;5509:4;5504:3;5500:14;5493:21;;5449:220;;;5453:21;5067:608;;4965:710;;;;;:::o;5698:370::-;5769:5;5818:3;5811:4;5803:6;5799:17;5795:27;5785:122;;5826:79;;:::i;:::-;5785:122;5943:6;5930:20;5968:94;6058:3;6050:6;6043:4;6035:6;6031:17;5968:94;:::i;:::-;5959:103;;5775:293;5698:370;;;;:::o;6074:90::-;6108:7;6151:5;6144:13;6137:21;6126:32;;6074:90;;;:::o;6170:116::-;6240:21;6255:5;6240:21;:::i;:::-;6233:5;6230:32;6220:60;;6276:1;6273;6266:12;6220:60;6170:116;:::o;6292:133::-;6335:5;6373:6;6360:20;6351:29;;6389:30;6413:5;6389:30;:::i;:::-;6292:133;;;;:::o;6490:2133::-;6579:5;6623:6;6611:9;6606:3;6602:19;6598:32;6595:119;;;6633:79;;:::i;:::-;6595:119;6732:23;6748:6;6732:23;:::i;:::-;6723:32;;6817:1;6857:49;6902:3;6893:6;6882:9;6878:22;6857:49;:::i;:::-;6850:4;6843:5;6839:16;6832:75;6765:153;6978:2;7019:49;7064:3;7055:6;7044:9;7040:22;7019:49;:::i;:::-;7012:4;7005:5;7001:16;6994:75;6928:152;7142:2;7183:49;7228:3;7219:6;7208:9;7204:22;7183:49;:::i;:::-;7176:4;7169:5;7165:16;7158:75;7090:154;7310:2;7351:49;7396:3;7387:6;7376:9;7372:22;7351:49;:::i;:::-;7344:4;7337:5;7333:16;7326:75;7254:158;7482:3;7524:47;7567:3;7558:6;7547:9;7543:22;7524:47;:::i;:::-;7517:4;7510:5;7506:16;7499:73;7422:161;7654:3;7696:49;7741:3;7732:6;7721:9;7717:22;7696:49;:::i;:::-;7689:4;7682:5;7678:16;7671:75;7593:164;7829:3;7871:49;7916:3;7907:6;7896:9;7892:22;7871:49;:::i;:::-;7864:4;7857:5;7853:16;7846:75;7767:165;8024:3;8013:9;8009:19;7996:33;8056:18;8048:6;8045:30;8042:117;;;8078:79;;:::i;:::-;8042:117;8198:74;8268:3;8259:6;8248:9;8244:22;8198:74;:::i;:::-;8191:4;8184:5;8180:16;8173:100;7942:342;8343:3;8387:49;8432:3;8423:6;8412:9;8408:22;8387:49;:::i;:::-;8378:6;8371:5;8367:18;8360:77;8294:154;8514:3;8558:46;8600:3;8591:6;8580:9;8576:22;8558:46;:::i;:::-;8549:6;8542:5;8538:18;8531:74;8458:158;6490:2133;;;;:::o;8629:1005::-;8755:6;8763;8771;8779;8828:3;8816:9;8807:7;8803:23;8799:33;8796:120;;;8835:79;;:::i;:::-;8796:120;8983:1;8972:9;8968:17;8955:31;9013:18;9005:6;9002:30;8999:117;;;9035:79;;:::i;:::-;8999:117;9140:93;9225:7;9216:6;9205:9;9201:22;9140:93;:::i;:::-;9130:103;;8926:317;9282:2;9308:53;9353:7;9344:6;9333:9;9329:22;9308:53;:::i;:::-;9298:63;;9253:118;9410:2;9436:53;9481:7;9472:6;9461:9;9457:22;9436:53;:::i;:::-;9426:63;;9381:118;9538:2;9564:53;9609:7;9600:6;9589:9;9585:22;9564:53;:::i;:::-;9554:63;;9509:118;8629:1005;;;;;;;:::o;9640:911::-;9735:6;9743;9751;9759;9767;9816:3;9804:9;9795:7;9791:23;9787:33;9784:120;;;9823:79;;:::i;:::-;9784:120;9943:1;9968:53;10013:7;10004:6;9993:9;9989:22;9968:53;:::i;:::-;9958:63;;9914:117;10070:2;10096:53;10141:7;10132:6;10121:9;10117:22;10096:53;:::i;:::-;10086:63;;10041:118;10198:2;10224:53;10269:7;10260:6;10249:9;10245:22;10224:53;:::i;:::-;10214:63;;10169:118;10326:2;10352:53;10397:7;10388:6;10377:9;10373:22;10352:53;:::i;:::-;10342:63;;10297:118;10454:3;10481:53;10526:7;10517:6;10506:9;10502:22;10481:53;:::i;:::-;10471:63;;10425:119;9640:911;;;;;;;;:::o;10557:329::-;10616:6;10665:2;10653:9;10644:7;10640:23;10636:32;10633:119;;;10671:79;;:::i;:::-;10633:119;10791:1;10816:53;10861:7;10852:6;10841:9;10837:22;10816:53;:::i;:::-;10806:63;;10762:117;10557:329;;;;:::o;10892:109::-;10973:21;10988:5;10973:21;:::i;:::-;10968:3;10961:34;10892:109;;:::o;11007:210::-;11094:4;11132:2;11121:9;11117:18;11109:26;;11145:65;11207:1;11196:9;11192:17;11183:6;11145:65;:::i;:::-;11007:210;;;;:::o;11223:474::-;11291:6;11299;11348:2;11336:9;11327:7;11323:23;11319:32;11316:119;;;11354:79;;:::i;:::-;11316:119;11474:1;11499:53;11544:7;11535:6;11524:9;11520:22;11499:53;:::i;:::-;11489:63;;11445:117;11601:2;11627:53;11672:7;11663:6;11652:9;11648:22;11627:53;:::i;:::-;11617:63;;11572:118;11223:474;;;;;:::o;11703:468::-;11768:6;11776;11825:2;11813:9;11804:7;11800:23;11796:32;11793:119;;;11831:79;;:::i;:::-;11793:119;11951:1;11976:53;12021:7;12012:6;12001:9;11997:22;11976:53;:::i;:::-;11966:63;;11922:117;12078:2;12104:50;12146:7;12137:6;12126:9;12122:22;12104:50;:::i;:::-;12094:60;;12049:115;11703:468;;;;;:::o;12235:433::-;12323:5;12367:4;12355:9;12350:3;12346:19;12342:30;12339:117;;;12375:79;;:::i;:::-;12339:117;12474:21;12490:4;12474:21;:::i;:::-;12465:30;;12560:1;12600:49;12645:3;12636:6;12625:9;12621:22;12600:49;:::i;:::-;12593:4;12586:5;12582:16;12575:75;12505:156;12235:433;;;;:::o;12674:843::-;12799:6;12807;12815;12823;12872:3;12860:9;12851:7;12847:23;12843:33;12840:120;;;12879:79;;:::i;:::-;12840:120;12999:1;13024:92;13108:7;13099:6;13088:9;13084:22;13024:92;:::i;:::-;13014:102;;12970:156;13165:2;13191:53;13236:7;13227:6;13216:9;13212:22;13191:53;:::i;:::-;13181:63;;13136:118;13293:2;13319:53;13364:7;13355:6;13344:9;13340:22;13319:53;:::i;:::-;13309:63;;13264:118;13421:2;13447:53;13492:7;13483:6;13472:9;13468:22;13447:53;:::i;:::-;13437:63;;13392:118;12674:843;;;;;;;:::o;13584:1122::-;13675:5;13719:4;13707:9;13702:3;13698:19;13694:30;13691:117;;;13727:79;;:::i;:::-;13691:117;13826:21;13842:4;13826:21;:::i;:::-;13817:30;;13912:1;13952:49;13997:3;13988:6;13977:9;13973:22;13952:49;:::i;:::-;13945:4;13938:5;13934:16;13927:75;13857:156;14079:2;14120:49;14165:3;14156:6;14145:9;14141:22;14120:49;:::i;:::-;14113:4;14106:5;14102:16;14095:75;14023:158;14251:2;14292:47;14335:3;14326:6;14315:9;14311:22;14292:47;:::i;:::-;14285:4;14278:5;14274:16;14267:73;14191:160;14423:2;14464:49;14509:3;14500:6;14489:9;14485:22;14464:49;:::i;:::-;14457:4;14450:5;14446:16;14439:75;14361:164;14596:3;14638:49;14683:3;14674:6;14663:9;14659:22;14638:49;:::i;:::-;14631:4;14624:5;14620:16;14613:75;14535:164;13584:1122;;;;:::o;14712:852::-;14840:6;14848;14856;14864;14913:3;14901:9;14892:7;14888:23;14884:33;14881:120;;;14920:79;;:::i;:::-;14881:120;15040:1;15065:95;15152:7;15143:6;15132:9;15128:22;15065:95;:::i;:::-;15055:105;;15011:159;15209:3;15236:53;15281:7;15272:6;15261:9;15257:22;15236:53;:::i;:::-;15226:63;;15180:119;15338:3;15365:53;15410:7;15401:6;15390:9;15386:22;15365:53;:::i;:::-;15355:63;;15309:119;15467:3;15494:53;15539:7;15530:6;15519:9;15515:22;15494:53;:::i;:::-;15484:63;;15438:119;14712:852;;;;;;;:::o;15570:118::-;15657:24;15675:5;15657:24;:::i;:::-;15652:3;15645:37;15570:118;;:::o;15694:222::-;15787:4;15825:2;15814:9;15810:18;15802:26;;15838:71;15906:1;15895:9;15891:17;15882:6;15838:71;:::i;:::-;15694:222;;;;:::o;15922:114::-;16010:1;16003:5;16000:12;15990:40;;16026:1;16023;16016:12;15990:40;15922:114;:::o;16042:169::-;16103:5;16141:6;16128:20;16119:29;;16157:48;16199:5;16157:48;:::i;:::-;16042:169;;;;:::o;16217:117::-;16326:1;16323;16316:12;16340:307;16401:4;16491:18;16483:6;16480:30;16477:56;;;16513:18;;:::i;:::-;16477:56;16551:29;16573:6;16551:29;:::i;:::-;16543:37;;16635:4;16629;16625:15;16617:23;;16340:307;;;:::o;16653:146::-;16750:6;16745:3;16740;16727:30;16791:1;16782:6;16777:3;16773:16;16766:27;16653:146;;;:::o;16805:423::-;16882:5;16907:65;16923:48;16964:6;16923:48;:::i;:::-;16907:65;:::i;:::-;16898:74;;16995:6;16988:5;16981:21;17033:4;17026:5;17022:16;17071:3;17062:6;17057:3;17053:16;17050:25;17047:112;;;17078:79;;:::i;:::-;17047:112;17168:54;17215:6;17210:3;17205;17168:54;:::i;:::-;16888:340;16805:423;;;;;:::o;17247:338::-;17302:5;17351:3;17344:4;17336:6;17332:17;17328:27;17318:122;;17359:79;;:::i;:::-;17318:122;17476:6;17463:20;17501:78;17575:3;17567:6;17560:4;17552:6;17548:17;17501:78;:::i;:::-;17492:87;;17308:277;17247:338;;;;:::o;17635:1100::-;17709:5;17753:4;17741:9;17736:3;17732:19;17728:30;17725:117;;;17761:79;;:::i;:::-;17725:117;17860:21;17876:4;17860:21;:::i;:::-;17851:30;;17946:1;17986:64;18046:3;18037:6;18026:9;18022:22;17986:64;:::i;:::-;17979:4;17972:5;17968:16;17961:90;17891:171;18123:2;18164:49;18209:3;18200:6;18189:9;18185:22;18164:49;:::i;:::-;18157:4;18150:5;18146:16;18139:75;18072:153;18290:2;18331:49;18376:3;18367:6;18356:9;18352:22;18331:49;:::i;:::-;18324:4;18317:5;18313:16;18306:75;18235:157;18485:2;18474:9;18470:18;18457:32;18516:18;18508:6;18505:30;18502:117;;;18538:79;;:::i;:::-;18502:117;18658:58;18712:3;18703:6;18692:9;18688:22;18658:58;:::i;:::-;18651:4;18644:5;18640:16;18633:84;18402:326;17635:1100;;;;:::o;18741:539::-;18825:6;18874:2;18862:9;18853:7;18849:23;18845:32;18842:119;;;18880:79;;:::i;:::-;18842:119;19028:1;19017:9;19013:17;19000:31;19058:18;19050:6;19047:30;19044:117;;;19080:79;;:::i;:::-;19044:117;19185:78;19255:7;19246:6;19235:9;19231:22;19185:78;:::i;:::-;19175:88;;18971:302;18741:539;;;;:::o;19286:180::-;19334:77;19331:1;19324:88;19431:4;19428:1;19421:15;19455:4;19452:1;19445:15;19472:143;19529:5;19560:6;19554:13;19545:22;;19576:33;19603:5;19576:33;:::i;:::-;19472:143;;;;:::o;19621:::-;19678:5;19709:6;19703:13;19694:22;;19725:33;19752:5;19725:33;:::i;:::-;19621:143;;;;:::o;19770:139::-;19825:5;19856:6;19850:13;19841:22;;19872:31;19897:5;19872:31;:::i;:::-;19770:139;;;;:::o;19932:732::-;20039:5;20064:81;20080:64;20137:6;20080:64;:::i;:::-;20064:81;:::i;:::-;20055:90;;20165:5;20194:6;20187:5;20180:21;20228:4;20221:5;20217:16;20210:23;;20281:4;20273:6;20269:17;20261:6;20257:30;20310:3;20302:6;20299:15;20296:122;;;20329:79;;:::i;:::-;20296:122;20444:6;20427:231;20461:6;20456:3;20453:15;20427:231;;;20536:3;20565:48;20609:3;20597:10;20565:48;:::i;:::-;20560:3;20553:61;20643:4;20638:3;20634:14;20627:21;;20503:155;20487:4;20482:3;20478:14;20471:21;;20427:231;;;20431:21;20045:619;;19932:732;;;;;:::o;20687:385::-;20769:5;20818:3;20811:4;20803:6;20799:17;20795:27;20785:122;;20826:79;;:::i;:::-;20785:122;20936:6;20930:13;20961:105;21062:3;21054:6;21047:4;21039:6;21035:17;20961:105;:::i;:::-;20952:114;;20775:297;20687:385;;;;:::o;21078:137::-;21132:5;21163:6;21157:13;21148:22;;21179:30;21203:5;21179:30;:::i;:::-;21078:137;;;;:::o;21280:2247::-;21380:5;21424:6;21412:9;21407:3;21403:19;21399:32;21396:119;;;21434:79;;:::i;:::-;21396:119;21533:23;21549:6;21533:23;:::i;:::-;21524:32;;21618:1;21658:60;21714:3;21705:6;21694:9;21690:22;21658:60;:::i;:::-;21651:4;21644:5;21640:16;21633:86;21566:164;21790:2;21831:60;21887:3;21878:6;21867:9;21863:22;21831:60;:::i;:::-;21824:4;21817:5;21813:16;21806:86;21740:163;21965:2;22006:60;22062:3;22053:6;22042:9;22038:22;22006:60;:::i;:::-;21999:4;21992:5;21988:16;21981:86;21913:165;22144:2;22185:60;22241:3;22232:6;22221:9;22217:22;22185:60;:::i;:::-;22178:4;22171:5;22167:16;22160:86;22088:169;22327:3;22369:58;22423:3;22414:6;22403:9;22399:22;22369:58;:::i;:::-;22362:4;22355:5;22351:16;22344:84;22267:172;22510:3;22552:60;22608:3;22599:6;22588:9;22584:22;22552:60;:::i;:::-;22545:4;22538:5;22534:16;22527:86;22449:175;22696:3;22738:60;22794:3;22785:6;22774:9;22770:22;22738:60;:::i;:::-;22731:4;22724:5;22720:16;22713:86;22634:176;22895:3;22884:9;22880:19;22874:26;22927:18;22919:6;22916:30;22913:117;;;22949:79;;:::i;:::-;22913:117;23069:85;23150:3;23141:6;23130:9;23126:22;23069:85;:::i;:::-;23062:4;23055:5;23051:16;23044:111;22820:346;23225:3;23269:60;23325:3;23316:6;23305:9;23301:22;23269:60;:::i;:::-;23260:6;23253:5;23249:18;23242:88;23176:165;23407:3;23451:57;23504:3;23495:6;23484:9;23480:22;23451:57;:::i;:::-;23442:6;23435:5;23431:18;23424:85;23351:169;21280:2247;;;;:::o;23533:584::-;23643:6;23692:2;23680:9;23671:7;23667:23;23663:32;23660:119;;;23698:79;;:::i;:::-;23660:119;23839:1;23828:9;23824:17;23818:24;23869:18;23861:6;23858:30;23855:117;;;23891:79;;:::i;:::-;23855:117;23996:104;24092:7;24083:6;24072:9;24068:22;23996:104;:::i;:::-;23986:114;;23789:321;23533:584;;;;:::o;24123:351::-;24193:6;24242:2;24230:9;24221:7;24217:23;24213:32;24210:119;;;24248:79;;:::i;:::-;24210:119;24368:1;24393:64;24449:7;24440:6;24429:9;24425:22;24393:64;:::i;:::-;24383:74;;24339:128;24123:351;;;;:::o;24480:112::-;24563:22;24579:5;24563:22;:::i;:::-;24558:3;24551:35;24480:112;;:::o;24598:114::-;24665:6;24699:5;24693:12;24683:22;;24598:114;;;:::o;24718:184::-;24817:11;24851:6;24846:3;24839:19;24891:4;24886:3;24882:14;24867:29;;24718:184;;;;:::o;24908:132::-;24975:4;24998:3;24990:11;;25028:4;25023:3;25019:14;25011:22;;24908:132;;;:::o;25046:108::-;25123:24;25141:5;25123:24;:::i;:::-;25118:3;25111:37;25046:108;;:::o;25160:179::-;25229:10;25250:46;25292:3;25284:6;25250:46;:::i;:::-;25328:4;25323:3;25319:14;25305:28;;25160:179;;;;:::o;25345:113::-;25415:4;25447;25442:3;25438:14;25430:22;;25345:113;;;:::o;25494:732::-;25613:3;25642:54;25690:5;25642:54;:::i;:::-;25712:86;25791:6;25786:3;25712:86;:::i;:::-;25705:93;;25822:56;25872:5;25822:56;:::i;:::-;25901:7;25932:1;25917:284;25942:6;25939:1;25936:13;25917:284;;;26018:6;26012:13;26045:63;26104:3;26089:13;26045:63;:::i;:::-;26038:70;;26131:60;26184:6;26131:60;:::i;:::-;26121:70;;25977:224;25964:1;25961;25957:9;25952:14;;25917:284;;;25921:14;26217:3;26210:10;;25618:608;;;25494:732;;;;:::o;26232:1350::-;26617:4;26655:3;26644:9;26640:19;26632:27;;26669:71;26737:1;26726:9;26722:17;26713:6;26669:71;:::i;:::-;26750:72;26818:2;26807:9;26803:18;26794:6;26750:72;:::i;:::-;26832;26900:2;26889:9;26885:18;26876:6;26832:72;:::i;:::-;26914;26982:2;26971:9;26967:18;26958:6;26914:72;:::i;:::-;26996:69;27060:3;27049:9;27045:19;27036:6;26996:69;:::i;:::-;27075:73;27143:3;27132:9;27128:19;27119:6;27075:73;:::i;:::-;27158;27226:3;27215:9;27211:19;27202:6;27158:73;:::i;:::-;27279:9;27273:4;27269:20;27263:3;27252:9;27248:19;27241:49;27307:108;27410:4;27401:6;27307:108;:::i;:::-;27299:116;;27425:73;27493:3;27482:9;27478:19;27469:6;27425:73;:::i;:::-;27508:67;27570:3;27559:9;27555:19;27546:6;27508:67;:::i;:::-;26232:1350;;;;;;;;;;;;;:::o;27588:351::-;27658:6;27707:2;27695:9;27686:7;27682:23;27678:32;27675:119;;;27713:79;;:::i;:::-;27675:119;27833:1;27858:64;27914:7;27905:6;27894:9;27890:22;27858:64;:::i;:::-;27848:74;;27804:128;27588:351;;;;:::o;28006:1188::-;28108:5;28152:4;28140:9;28135:3;28131:19;28127:30;28124:117;;;28160:79;;:::i;:::-;28124:117;28259:21;28275:4;28259:21;:::i;:::-;28250:30;;28345:1;28385:60;28441:3;28432:6;28421:9;28417:22;28385:60;:::i;:::-;28378:4;28371:5;28367:16;28360:86;28290:167;28523:2;28564:60;28620:3;28611:6;28600:9;28596:22;28564:60;:::i;:::-;28557:4;28550:5;28546:16;28539:86;28467:169;28706:2;28747:58;28801:3;28792:6;28781:9;28777:22;28747:58;:::i;:::-;28740:4;28733:5;28729:16;28722:84;28646:171;28889:2;28930:60;28986:3;28977:6;28966:9;28962:22;28930:60;:::i;:::-;28923:4;28916:5;28912:16;28905:86;28827:175;29073:3;29115:60;29171:3;29162:6;29151:9;29147:22;29115:60;:::i;:::-;29108:4;29101:5;29097:16;29090:86;29012:175;28006:1188;;;;:::o;29200:436::-;29312:6;29361:3;29349:9;29340:7;29336:23;29332:33;29329:120;;;29368:79;;:::i;:::-;29329:120;29488:1;29513:106;29611:7;29602:6;29591:9;29587:22;29513:106;:::i;:::-;29503:116;;29459:170;29200:436;;;;:::o;29665:2251::-;29751:5;29795:6;29783:9;29778:3;29774:19;29770:32;29767:119;;;29805:79;;:::i;:::-;29767:119;29904:23;29920:6;29904:23;:::i;:::-;29895:32;;29989:1;30029:60;30085:3;30076:6;30065:9;30061:22;30029:60;:::i;:::-;30022:4;30015:5;30011:16;30004:86;29937:164;30161:2;30202:60;30258:3;30249:6;30238:9;30234:22;30202:60;:::i;:::-;30195:4;30188:5;30184:16;30177:86;30111:163;30336:2;30377:60;30433:3;30424:6;30413:9;30409:22;30377:60;:::i;:::-;30370:4;30363:5;30359:16;30352:86;30284:165;30515:2;30556:60;30612:3;30603:6;30592:9;30588:22;30556:60;:::i;:::-;30549:4;30542:5;30538:16;30531:86;30459:169;30698:3;30740:58;30794:3;30785:6;30774:9;30770:22;30740:58;:::i;:::-;30733:4;30726:5;30722:16;30715:84;30638:172;30881:3;30923:60;30979:3;30970:6;30959:9;30955:22;30923:60;:::i;:::-;30916:4;30909:5;30905:16;30898:86;30820:175;31067:3;31109:60;31165:3;31156:6;31145:9;31141:22;31109:60;:::i;:::-;31102:4;31095:5;31091:16;31084:86;31005:176;31252:3;31294:60;31350:3;31341:6;31330:9;31326:22;31294:60;:::i;:::-;31287:4;31280:5;31276:16;31269:86;31191:175;31435:3;31479:60;31535:3;31526:6;31515:9;31511:22;31479:60;:::i;:::-;31470:6;31463:5;31459:18;31452:88;31376:175;31618:3;31662:60;31718:3;31709:6;31698:9;31694:22;31662:60;:::i;:::-;31653:6;31646:5;31642:18;31635:88;31561:173;31793:3;31837:60;31893:3;31884:6;31873:9;31869:22;31837:60;:::i;:::-;31828:6;31821:5;31817:18;31810:88;31744:165;29665:2251;;;;:::o;31922:404::-;32018:6;32067:3;32055:9;32046:7;32042:23;32038:33;32035:120;;;32074:79;;:::i;:::-;32035:120;32194:1;32219:90;32301:7;32292:6;32281:9;32277:22;32219:90;:::i;:::-;32209:100;;32165:154;31922:404;;;;:::o;32332:545::-;32505:4;32543:3;32532:9;32528:19;32520:27;;32557:71;32625:1;32614:9;32610:17;32601:6;32557:71;:::i;:::-;32638:68;32702:2;32691:9;32687:18;32678:6;32638:68;:::i;:::-;32716:72;32784:2;32773:9;32769:18;32760:6;32716:72;:::i;:::-;32798;32866:2;32855:9;32851:18;32842:6;32798:72;:::i;:::-;32332:545;;;;;;;:::o;32941:455::-;33040:5;33084:4;33072:9;33067:3;33063:19;33059:30;33056:117;;;33092:79;;:::i;:::-;33056:117;33191:21;33207:4;33191:21;:::i;:::-;33182:30;;33277:1;33317:60;33373:3;33364:6;33353:9;33349:22;33317:60;:::i;:::-;33310:4;33303:5;33299:16;33292:86;33222:167;32941:455;;;;:::o;33402:429::-;33511:6;33560:2;33548:9;33539:7;33535:23;33531:32;33528:119;;;33566:79;;:::i;:::-;33528:119;33686:1;33711:103;33806:7;33797:6;33786:9;33782:22;33711:103;:::i;:::-;33701:113;;33657:167;33402:429;;;;:::o;33837:104::-;33882:7;33911:24;33929:5;33911:24;:::i;:::-;33900:35;;33837:104;;;:::o;33947:138::-;34028:32;34054:5;34028:32;:::i;:::-;34021:5;34018:43;34008:71;;34075:1;34072;34065:12;34008:71;33947:138;:::o;34091:159::-;34156:5;34187:6;34181:13;34172:22;;34203:41;34238:5;34203:41;:::i;:::-;34091:159;;;;:::o;34256:523::-;34343:6;34351;34400:2;34388:9;34379:7;34375:23;34371:32;34368:119;;;34406:79;;:::i;:::-;34368:119;34526:1;34551:64;34607:7;34598:6;34587:9;34583:22;34551:64;:::i;:::-;34541:74;;34497:128;34664:2;34690:72;34754:7;34745:6;34734:9;34730:22;34690:72;:::i;:::-;34680:82;;34635:137;34256:523;;;;;:::o;34785:332::-;34906:4;34944:2;34933:9;34929:18;34921:26;;34957:71;35025:1;35014:9;35010:17;35001:6;34957:71;:::i;:::-;35038:72;35106:2;35095:9;35091:18;35082:6;35038:72;:::i;:::-;34785:332;;;;;:::o;35123:108::-;35200:24;35218:5;35200:24;:::i;:::-;35195:3;35188:37;35123:108;;:::o;35237:102::-;35310:22;35326:5;35310:22;:::i;:::-;35305:3;35298:35;35237:102;;:::o;35345:174::-;35434:11;35468:6;35463:3;35456:19;35508:4;35503:3;35499:14;35484:29;;35345:174;;;;:::o;35555:712::-;35664:3;35693:54;35741:5;35693:54;:::i;:::-;35763:76;35832:6;35827:3;35763:76;:::i;:::-;35756:83;;35863:56;35913:5;35863:56;:::i;:::-;35942:7;35973:1;35958:284;35983:6;35980:1;35977:13;35958:284;;;36059:6;36053:13;36086:63;36145:3;36130:13;36086:63;:::i;:::-;36079:70;;36172:60;36225:6;36172:60;:::i;:::-;36162:70;;36018:224;36005:1;36002;35998:9;35993:14;;35958:284;;;35962:14;36258:3;36251:10;;35669:598;;;35555:712;;;;:::o;36273:99::-;36344:21;36359:5;36344:21;:::i;:::-;36339:3;36332:34;36273:99;;:::o;36492:2120::-;36641:3;36677:6;36672:3;36668:16;36769:4;36762:5;36758:16;36752:23;36788:63;36845:4;36840:3;36836:14;36822:12;36788:63;:::i;:::-;36694:167;36944:4;36937:5;36933:16;36927:23;36963:63;37020:4;37015:3;37011:14;36997:12;36963:63;:::i;:::-;36871:165;37121:4;37114:5;37110:16;37104:23;37140:63;37197:4;37192:3;37188:14;37174:12;37140:63;:::i;:::-;37046:167;37302:4;37295:5;37291:16;37285:23;37321:63;37378:4;37373:3;37369:14;37355:12;37321:63;:::i;:::-;37223:171;37487:4;37480:5;37476:16;37470:23;37506:59;37559:4;37554:3;37550:14;37536:12;37506:59;:::i;:::-;37404:171;37669:4;37662:5;37658:16;37652:23;37688:63;37745:4;37740:3;37736:14;37722:12;37688:63;:::i;:::-;37585:176;37856:4;37849:5;37845:16;37839:23;37875:63;37932:4;37927:3;37923:14;37909:12;37875:63;:::i;:::-;37771:177;38035:4;38028:5;38024:16;38018:23;38088:3;38082:4;38078:14;38071:4;38066:3;38062:14;38055:38;38114:103;38212:4;38198:12;38114:103;:::i;:::-;38106:111;;37958:270;38310:6;38303:5;38299:18;38293:25;38331:65;38388:6;38383:3;38379:16;38365:12;38331:65;:::i;:::-;38238:168;38495:6;38488:5;38484:18;38478:25;38516:59;38567:6;38562:3;38558:16;38544:12;38516:59;:::i;:::-;38416:169;38602:4;38595:11;;36646:1966;36492:2120;;;;:::o;38618:433::-;38791:4;38829:2;38818:9;38814:18;38806:26;;38878:9;38872:4;38868:20;38864:1;38853:9;38849:17;38842:47;38906:138;39039:4;39030:6;38906:138;:::i;:::-;38898:146;;38618:433;;;;:::o;39057:120::-;39145:1;39138:5;39135:12;39125:46;;39151:18;;:::i;:::-;39125:46;39057:120;:::o;39183:141::-;39235:7;39264:5;39253:16;;39270:48;39312:5;39270:48;:::i;:::-;39183:141;;;:::o;39330:::-;39393:9;39426:39;39459:5;39426:39;:::i;:::-;39413:52;;39330:141;;;:::o;39477:147::-;39567:50;39611:5;39567:50;:::i;:::-;39562:3;39555:63;39477:147;;:::o;39630:98::-;39681:6;39715:5;39709:12;39699:22;;39630:98;;;:::o;39734:158::-;39807:11;39841:6;39836:3;39829:19;39881:4;39876:3;39872:14;39857:29;;39734:158;;;;:::o;39898:246::-;39979:1;39989:113;40003:6;40000:1;39997:13;39989:113;;;40088:1;40083:3;40079:11;40073:18;40069:1;40064:3;40060:11;40053:39;40025:2;40022:1;40018:10;40013:15;;39989:113;;;40136:1;40127:6;40122:3;40118:16;40111:27;39960:184;39898:246;;;:::o;40150:353::-;40226:3;40254:38;40286:5;40254:38;:::i;:::-;40308:60;40361:6;40356:3;40308:60;:::i;:::-;40301:67;;40377:65;40435:6;40430:3;40423:4;40416:5;40412:16;40377:65;:::i;:::-;40467:29;40489:6;40467:29;:::i;:::-;40462:3;40458:39;40451:46;;40230:273;40150:353;;;;:::o;40593:985::-;40712:3;40748:4;40743:3;40739:14;40841:4;40834:5;40830:16;40824:23;40860:76;40930:4;40925:3;40921:14;40907:12;40860:76;:::i;:::-;40763:183;41030:4;41023:5;41019:16;41013:23;41049:63;41106:4;41101:3;41097:14;41083:12;41049:63;:::i;:::-;40956:166;41210:4;41203:5;41199:16;41193:23;41229:63;41286:4;41281:3;41277:14;41263:12;41229:63;:::i;:::-;41132:170;41390:4;41383:5;41379:16;41373:23;41443:3;41437:4;41433:14;41426:4;41421:3;41417:14;41410:38;41469:71;41535:4;41521:12;41469:71;:::i;:::-;41461:79;;41312:239;41568:4;41561:11;;40717:861;40593:985;;;;:::o;41584:373::-;41727:4;41765:2;41754:9;41750:18;41742:26;;41814:9;41808:4;41804:20;41800:1;41789:9;41785:17;41778:47;41842:108;41945:4;41936:6;41842:108;:::i;:::-;41834:116;;41584:373;;;;:::o;41963:180::-;42011:77;42008:1;42001:88;42108:4;42105:1;42098:15;42132:4;42129:1;42122:15;42149:137;42239:6;42273:5;42267:12;42257:22;;42149:137;;;:::o;42292:197::-;42404:11;42438:6;42433:3;42426:19;42478:4;42473:3;42469:14;42454:29;;42292:197;;;;:::o;42495:155::-;42585:4;42608:3;42600:11;;42638:4;42633:3;42629:14;42621:22;;42495:155;;;:::o;42710:503::-;42843:4;42838:3;42834:14;42938:4;42931:5;42927:16;42921:23;42957:63;43014:4;43009:3;43005:14;42991:12;42957:63;:::i;:::-;42858:172;43114:4;43107:5;43103:16;43097:23;43133:63;43190:4;43185:3;43181:14;43167:12;43133:63;:::i;:::-;43040:166;42812:401;42710:503;;:::o;43219:271::-;43334:10;43355:92;43443:3;43435:6;43355:92;:::i;:::-;43479:4;43474:3;43470:14;43456:28;;43219:271;;;;:::o;43496:136::-;43589:4;43621;43616:3;43612:14;43604:22;;43496:136;;;:::o;43696:896::-;43851:3;43880:77;43951:5;43880:77;:::i;:::-;43973:99;44065:6;44060:3;43973:99;:::i;:::-;43966:106;;44096:79;44169:5;44096:79;:::i;:::-;44198:7;44229:1;44214:353;44239:6;44236:1;44233:13;44214:353;;;44315:6;44309:13;44342:109;44447:3;44432:13;44342:109;:::i;:::-;44335:116;;44474:83;44550:6;44474:83;:::i;:::-;44464:93;;44274:293;44261:1;44258;44254:9;44249:14;;44214:353;;;44218:14;44583:3;44576:10;;43856:736;;;43696:896;;;;:::o;44668:1128::-;44799:3;44835:4;44830:3;44826:14;44936:4;44929:5;44925:16;44919:23;44955:63;45012:4;45007:3;45003:14;44989:12;44955:63;:::i;:::-;44850:178;45108:4;45101:5;45097:16;45091:23;45127:63;45184:4;45179:3;45175:14;45161:12;45127:63;:::i;:::-;45038:162;45284:4;45277:5;45273:16;45267:23;45337:3;45331:4;45327:14;45320:4;45315:3;45311:14;45304:38;45363:149;45507:4;45493:12;45363:149;:::i;:::-;45355:157;;45210:313;45608:4;45601:5;45597:16;45591:23;45661:3;45655:4;45651:14;45644:4;45639:3;45635:14;45628:38;45687:71;45753:4;45739:12;45687:71;:::i;:::-;45679:79;;45533:236;45786:4;45779:11;;44804:992;44668:1128;;;;:::o;45802:617::-;46013:4;46051:2;46040:9;46036:18;46028:26;;46100:9;46094:4;46090:20;46086:1;46075:9;46071:17;46064:47;46128:120;46243:4;46234:6;46128:120;:::i;:::-;46120:128;;46258:72;46326:2;46315:9;46311:18;46302:6;46258:72;:::i;:::-;46340;46408:2;46397:9;46393:18;46384:6;46340:72;:::i;:::-;45802:617;;;;;;:::o;46425:116::-;46510:24;46528:5;46510:24;:::i;:::-;46505:3;46498:37;46425:116;;:::o;46547:195::-;46624:10;46645:54;46695:3;46687:6;46645:54;:::i;:::-;46731:4;46726:3;46722:14;46708:28;;46547:195;;;;:::o;46748:116::-;46833:24;46851:5;46833:24;:::i;:::-;46828:3;46821:37;46748:116;;:::o;46870:195::-;46947:10;46968:54;47018:3;47010:6;46968:54;:::i;:::-;47054:4;47049:3;47045:14;47031:28;;46870:195;;;;:::o;47071:110::-;47152:22;47168:5;47152:22;:::i;:::-;47147:3;47140:35;47071:110;;:::o;47187:187::-;47260:10;47281:50;47327:3;47319:6;47281:50;:::i;:::-;47363:4;47358:3;47354:14;47340:28;;47187:187;;;;:::o;47380:143::-;47477:11;47514:3;47499:18;;47380:143;;;;:::o;47559:736::-;47676:3;47705:54;47753:5;47705:54;:::i;:::-;47775:84;47852:6;47847:3;47775:84;:::i;:::-;47768:91;;47883:56;47933:5;47883:56;:::i;:::-;47962:7;47993:1;47978:292;48003:6;48000:1;47997:13;47978:292;;;48079:6;48073:13;48106:71;48173:3;48158:13;48106:71;:::i;:::-;48099:78;;48200:60;48253:6;48200:60;:::i;:::-;48190:70;;48038:232;48025:1;48022;48018:9;48013:14;;47978:292;;;47982:14;48286:3;48279:10;;47681:614;;;47559:736;;;;:::o;48301:272::-;48428:10;48463:104;48563:3;48555:6;48463:104;:::i;:::-;48449:118;;48301:272;;;;:::o;48579:107::-;48658:21;48673:5;48658:21;:::i;:::-;48653:3;48646:34;48579:107;;:::o;48692:183::-;48763:10;48784:48;48828:3;48820:6;48784:48;:::i;:::-;48864:4;48859:3;48855:14;48841:28;;48692:183;;;;:::o;48995:2220::-;49162:3;49198:4;49193:3;49189:14;49288:4;49281:5;49277:16;49271:23;49314:70;49380:3;49366:12;49314:70;:::i;:::-;49307:77;;49213:181;49477:4;49470:5;49466:16;49460:23;49503:70;49569:3;49555:12;49503:70;:::i;:::-;49496:77;;49404:179;49668:4;49661:5;49657:16;49651:23;49694:70;49760:3;49746:12;49694:70;:::i;:::-;49687:77;;49593:181;49863:4;49856:5;49852:16;49846:23;49889:70;49955:3;49941:12;49889:70;:::i;:::-;49882:77;;49784:185;50062:4;50055:5;50051:16;50045:23;50088:66;50150:3;50136:12;50088:66;:::i;:::-;50081:73;;49979:185;50258:4;50251:5;50247:16;50241:23;50284:70;50350:3;50336:12;50284:70;:::i;:::-;50277:77;;50174:190;50459:4;50452:5;50448:16;50442:23;50485:70;50551:3;50537:12;50485:70;:::i;:::-;50478:77;;50374:191;50652:4;50645:5;50641:16;50635:23;50678:120;50794:3;50780:12;50678:120;:::i;:::-;50671:127;;50575:233;50890:6;50883:5;50879:18;50873:25;50918:70;50984:3;50970:12;50918:70;:::i;:::-;50911:77;;50818:180;51087:6;51080:5;51076:18;51070:25;51115:64;51175:3;51161:12;51115:64;:::i;:::-;51108:71;;51008:181;51206:3;51199:10;;49167:2048;48995:2220;;;;:::o;51221:395::-;51413:3;51435:155;51586:3;51577:6;51435:155;:::i;:::-;51428:162;;51607:3;51600:10;;51221:395;;;;:::o;51734:367::-;51909:4;51904:3;51900:14;52002:4;51995:5;51991:16;51985:23;52021:63;52078:4;52073:3;52069:14;52055:12;52021:63;:::i;:::-;51924:170;51878:223;51734:367;;:::o;52107:378::-;52278:4;52316:2;52305:9;52301:18;52293:26;;52329:149;52475:1;52464:9;52460:17;52451:6;52329:149;:::i;:::-;52107:378;;;;:::o;52603:399::-;52796:4;52791:3;52787:14;52889:4;52882:5;52878:16;52872:23;52915:70;52981:3;52967:12;52915:70;:::i;:::-;52908:77;;52811:184;52765:237;52603:399;;:::o;53008:412::-;53198:3;53213:153;53362:3;53353:6;53213:153;:::i;:::-;53391:2;53386:3;53382:12;53375:19;;53411:3;53404:10;;53008:412;;;;:::o;53544:1108::-;53725:4;53720:3;53716:14;53818:4;53811:5;53807:16;53801:23;53837:63;53894:4;53889:3;53885:14;53871:12;53837:63;:::i;:::-;53740:170;53999:4;53992:5;53988:16;53982:23;54018:63;54075:4;54070:3;54066:14;54052:12;54018:63;:::i;:::-;53920:171;54184:4;54177:5;54173:16;54167:23;54203:59;54256:4;54251:3;54247:14;54233:12;54203:59;:::i;:::-;54101:171;54367:4;54360:5;54356:16;54350:23;54386:63;54443:4;54438:3;54434:14;54420:12;54386:63;:::i;:::-;54282:177;54553:4;54546:5;54542:16;54536:23;54572:63;54629:4;54624:3;54620:14;54606:12;54572:63;:::i;:::-;54469:176;53694:958;53544:1108;;:::o;54658:391::-;54835:4;54873:3;54862:9;54858:19;54850:27;;54887:155;55039:1;55028:9;55024:17;55015:6;54887:155;:::i;:::-;54658:391;;;;:::o;55173:1196::-;55372:4;55367:3;55363:14;55465:4;55458:5;55454:16;55448:23;55491:70;55557:3;55543:12;55491:70;:::i;:::-;55484:77;;55387:184;55660:4;55653:5;55649:16;55643:23;55686:70;55752:3;55738:12;55686:70;:::i;:::-;55679:77;;55581:185;55859:4;55852:5;55848:16;55842:23;55885:66;55947:3;55933:12;55885:66;:::i;:::-;55878:73;;55776:185;56056:4;56049:5;56045:16;56039:23;56082:70;56148:3;56134:12;56082:70;:::i;:::-;56075:77;;55971:191;56256:4;56249:5;56245:16;56239:23;56282:70;56348:3;56334:12;56282:70;:::i;:::-;56275:77;;56172:190;55341:1028;55173:1196;;:::o;56375:425::-;56571:3;56586:159;56741:3;56732:6;56586:159;:::i;:::-;56770:3;56765;56761:13;56754:20;;56791:3;56784:10;;56375:425;;;;:::o

Swarm Source

ipfs://4181f10dab12e9db00ebfe91431ae7839b8fef96090093b061c4a7bcca5a0ee6

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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