More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 16,457 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Increase Amount | 36451925 | 11 mins ago | IN | 0 ETH | 0.00001086 | ||||
| Increase Amount | 36450303 | 22 mins ago | IN | 0 ETH | 0.00001076 | ||||
| Merge | 36442356 | 1 hr ago | IN | 0 ETH | 0.00001173 | ||||
| Merge | 36442326 | 1 hr ago | IN | 0 ETH | 0.00001235 | ||||
| Merge | 36442277 | 1 hr ago | IN | 0 ETH | 0.00001174 | ||||
| Merge | 36442245 | 1 hr ago | IN | 0 ETH | 0.00001235 | ||||
| Merge | 36442206 | 1 hr ago | IN | 0 ETH | 0.00001284 | ||||
| Merge | 36442178 | 1 hr ago | IN | 0 ETH | 0.00001284 | ||||
| Merge | 36442137 | 1 hr ago | IN | 0 ETH | 0.00001159 | ||||
| Merge | 36442107 | 1 hr ago | IN | 0 ETH | 0.00001378 | ||||
| Create Lock | 36441733 | 1 hr ago | IN | 0 ETH | 0.00001582 | ||||
| Lock Permanent | 36426528 | 2 hrs ago | IN | 0 ETH | 0.00000696 | ||||
| Increase Amount | 36426463 | 2 hrs ago | IN | 0 ETH | 0.0000107 | ||||
| Merge | 36426206 | 2 hrs ago | IN | 0 ETH | 0.00001154 | ||||
| Unlock Permanent | 36426142 | 2 hrs ago | IN | 0 ETH | 0.00000856 | ||||
| Merge | 36426029 | 2 hrs ago | IN | 0 ETH | 0.00001329 | ||||
| Unlock Permanent | 36425942 | 2 hrs ago | IN | 0 ETH | 0.00000829 | ||||
| Unlock Permanent | 36425670 | 2 hrs ago | IN | 0 ETH | 0.00000948 | ||||
| Merge | 36422523 | 3 hrs ago | IN | 0 ETH | 0.00001892 | ||||
| Unlock Permanent | 36422461 | 3 hrs ago | IN | 0 ETH | 0.00000981 | ||||
| Lock Permanent | 36417898 | 3 hrs ago | IN | 0 ETH | 0.00000686 | ||||
| Merge | 36417620 | 3 hrs ago | IN | 0 ETH | 0.00001219 | ||||
| Merge | 36417567 | 3 hrs ago | IN | 0 ETH | 0.00001237 | ||||
| Merge | 36417527 | 3 hrs ago | IN | 0 ETH | 0.00001302 | ||||
| Create Lock | 36417317 | 3 hrs ago | IN | 0 ETH | 0.00001389 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 20528262 | 112 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
VotingEscrow
Compiler Version
v0.8.19+commit.7dd6d404
ZkSolc Version
v1.5.15
Optimization Enabled:
Yes with Mode 3
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import {IVeArtProxy} from "./interfaces/IVeArtProxy.sol";
import {IVotingEscrow} from "./interfaces/IVotingEscrow.sol";
import {IVoter} from "./interfaces/IVoter.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IERC6372} from "@openzeppelin/contracts/interfaces/IERC6372.sol";
import {IReward} from "./interfaces/IReward.sol";
import {IFactoryRegistry} from "./interfaces/factories/IFactoryRegistry.sol";
import {IManagedRewardsFactory} from "./interfaces/factories/IManagedRewardsFactory.sol";
import {ERC2771Context} from "@openzeppelin/contracts/metatx/ERC2771Context.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {DelegationLogicLibrary} from "./libraries/DelegationLogicLibrary.sol";
import {BalanceLogicLibrary} from "./libraries/BalanceLogicLibrary.sol";
import {SafeCastLibrary} from "./libraries/SafeCastLibrary.sol";
/// @title Voting Escrow
/// @notice veNFT implementation that escrows ERC-20 tokens in the form of an ERC-721 NFT
/// @notice Votes have a weight depending on time, so that users are committed to the future of (whatever they are voting for)
/// @author Modified from Solidly (https://github.com/solidlyexchange/solidly/blob/master/contracts/ve.sol)
/// @author Modified from Curve (https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/VotingEscrow.vy)
/// @author aborean.finance, @figs999, @pegahcarter
/// @dev Vote weight decays linearly over time. Lock time cannot be more than `MAXTIME` (4 years).
contract VotingEscrow is IVotingEscrow, ERC2771Context, ReentrancyGuard {
using SafeERC20 for IERC20;
using SafeCastLibrary for uint256;
using SafeCastLibrary for int128;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotingEscrow
address public immutable forwarder;
/// @inheritdoc IVotingEscrow
address public immutable factoryRegistry;
/// @inheritdoc IVotingEscrow
address public immutable token;
/// @inheritdoc IVotingEscrow
address public distributor;
/// @inheritdoc IVotingEscrow
address public voter;
/// @inheritdoc IVotingEscrow
address public team;
/// @inheritdoc IVotingEscrow
address public artProxy;
/// @inheritdoc IVotingEscrow
address public allowedManager;
mapping(uint256 => GlobalPoint) internal _pointHistory; // epoch -> unsigned global point
/// @dev Mapping of interface id to bool about whether or not it's supported
mapping(bytes4 => bool) internal supportedInterfaces;
/// @dev ERC165 interface ID of ERC165
bytes4 internal constant ERC165_INTERFACE_ID = 0x01ffc9a7;
/// @dev ERC165 interface ID of ERC721
bytes4 internal constant ERC721_INTERFACE_ID = 0x80ac58cd;
/// @dev ERC165 interface ID of ERC721Metadata
bytes4 internal constant ERC721_METADATA_INTERFACE_ID = 0x5b5e139f;
/// @dev ERC165 interface ID of ERC4906
bytes4 internal constant ERC4906_INTERFACE_ID = 0x49064906;
/// @dev ERC165 interface ID of ERC6372
bytes4 internal constant ERC6372_INTERFACE_ID = 0xda287a1d;
/// @inheritdoc IVotingEscrow
uint256 public tokenId;
/// @param _forwarder address of trusted forwarder
/// @param _token `ABX` token address
/// @param _factoryRegistry Factory Registry address
constructor(address _forwarder, address _token, address _factoryRegistry) ERC2771Context(_forwarder) {
forwarder = _forwarder;
token = _token;
factoryRegistry = _factoryRegistry;
team = _msgSender();
voter = _msgSender();
_pointHistory[0].blk = block.number;
_pointHistory[0].ts = block.timestamp;
supportedInterfaces[ERC165_INTERFACE_ID] = true;
supportedInterfaces[ERC721_INTERFACE_ID] = true;
supportedInterfaces[ERC721_METADATA_INTERFACE_ID] = true;
supportedInterfaces[ERC4906_INTERFACE_ID] = true;
supportedInterfaces[ERC6372_INTERFACE_ID] = true;
// mint-ish
emit Transfer(address(0), address(this), tokenId);
// burn-ish
emit Transfer(address(this), address(0), tokenId);
}
/*///////////////////////////////////////////////////////////////
MANAGED NFT STORAGE
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotingEscrow
mapping(uint256 => EscrowType) public escrowType;
/// @inheritdoc IVotingEscrow
mapping(uint256 => uint256) public idToManaged;
/// @inheritdoc IVotingEscrow
mapping(uint256 => mapping(uint256 => uint256)) public weights;
/// @inheritdoc IVotingEscrow
mapping(uint256 => bool) public deactivated;
/// @inheritdoc IVotingEscrow
mapping(uint256 => address) public managedToLocked;
/// @inheritdoc IVotingEscrow
mapping(uint256 => address) public managedToFree;
/*///////////////////////////////////////////////////////////////
MANAGED NFT LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotingEscrow
function createManagedLockFor(address _to) external nonReentrant returns (uint256 _mTokenId) {
address sender = _msgSender();
if (sender != allowedManager && sender != IVoter(voter).governor()) revert NotGovernorOrManager();
_mTokenId = ++tokenId;
_mint(_to, _mTokenId);
_depositFor(_mTokenId, 0, 0, LockedBalance(0, 0, true), DepositType.CREATE_LOCK_TYPE);
escrowType[_mTokenId] = EscrowType.MANAGED;
(address _lockedManagedReward, address _freeManagedReward) = IManagedRewardsFactory(
IFactoryRegistry(factoryRegistry).managedRewardsFactory()
).createRewards(forwarder, voter);
managedToLocked[_mTokenId] = _lockedManagedReward;
managedToFree[_mTokenId] = _freeManagedReward;
emit CreateManaged(_to, _mTokenId, sender, _lockedManagedReward, _freeManagedReward);
}
/// @inheritdoc IVotingEscrow
function depositManaged(uint256 _tokenId, uint256 _mTokenId) external nonReentrant {
if (_msgSender() != voter) revert NotVoter();
if (escrowType[_mTokenId] != EscrowType.MANAGED) revert NotManagedNFT();
if (escrowType[_tokenId] != EscrowType.NORMAL) revert NotNormalNFT();
if (_balanceOfNFTAt(_tokenId, block.timestamp) == 0) revert ZeroBalance();
// adjust user nft
int128 _amount = _locked[_tokenId].amount;
if (_locked[_tokenId].isPermanent) {
permanentLockBalance -= _amount.toUint256();
_delegate(_tokenId, 0);
}
_checkpoint(_tokenId, _locked[_tokenId], LockedBalance(0, 0, false));
_locked[_tokenId] = LockedBalance(0, 0, false);
// adjust managed nft
uint256 _weight = _amount.toUint256();
permanentLockBalance += _weight;
LockedBalance memory newLocked = _locked[_mTokenId];
newLocked.amount += _amount;
_checkpointDelegatee(_delegates[_mTokenId], _weight, true);
_checkpoint(_mTokenId, _locked[_mTokenId], newLocked);
_locked[_mTokenId] = newLocked;
weights[_tokenId][_mTokenId] = _weight;
idToManaged[_tokenId] = _mTokenId;
escrowType[_tokenId] = EscrowType.LOCKED;
address _lockedManagedReward = managedToLocked[_mTokenId];
IReward(_lockedManagedReward)._deposit(_weight, _tokenId);
address _freeManagedReward = managedToFree[_mTokenId];
IReward(_freeManagedReward)._deposit(_weight, _tokenId);
emit DepositManaged(_ownerOf(_tokenId), _tokenId, _mTokenId, _weight, block.timestamp);
emit MetadataUpdate(_tokenId);
}
/// @inheritdoc IVotingEscrow
function withdrawManaged(uint256 _tokenId) external nonReentrant {
uint256 _mTokenId = idToManaged[_tokenId];
if (_msgSender() != voter) revert NotVoter();
if (_mTokenId == 0) revert InvalidManagedNFTId();
if (escrowType[_tokenId] != EscrowType.LOCKED) revert NotLockedNFT();
// update accrued rewards
address _lockedManagedReward = managedToLocked[_mTokenId];
address _freeManagedReward = managedToFree[_mTokenId];
uint256 _weight = weights[_tokenId][_mTokenId];
uint256 _reward = IReward(_lockedManagedReward).earned(address(token), _tokenId);
uint256 _total = _weight + _reward;
uint256 _unlockTime = ((block.timestamp + MAXTIME) / WEEK) * WEEK;
// claim locked rewards (rebases + compounded reward)
address[] memory rewards = new address[](1);
rewards[0] = address(token);
IReward(_lockedManagedReward).getReward(_tokenId, rewards);
// adjust user nft
LockedBalance memory newLockedNormal = LockedBalance(_total.toInt128(), _unlockTime, false);
_checkpoint(_tokenId, _locked[_tokenId], newLockedNormal);
_locked[_tokenId] = newLockedNormal;
// adjust managed nft
LockedBalance memory newLockedManaged = _locked[_mTokenId];
// do not expect _total > locked.amount / permanentLockBalance but just in case
newLockedManaged.amount -= (
_total.toInt128() < newLockedManaged.amount ? _total.toInt128() : newLockedManaged.amount
);
permanentLockBalance -= (_total < permanentLockBalance ? _total : permanentLockBalance);
_checkpointDelegatee(_delegates[_mTokenId], _total, false);
_checkpoint(_mTokenId, _locked[_mTokenId], newLockedManaged);
_locked[_mTokenId] = newLockedManaged;
IReward(_lockedManagedReward)._withdraw(_weight, _tokenId);
IReward(_freeManagedReward)._withdraw(_weight, _tokenId);
delete idToManaged[_tokenId];
delete weights[_tokenId][_mTokenId];
delete escrowType[_tokenId];
emit WithdrawManaged(_ownerOf(_tokenId), _tokenId, _mTokenId, _total, block.timestamp);
emit MetadataUpdate(_tokenId);
}
/// @inheritdoc IVotingEscrow
function setAllowedManager(address _allowedManager) external {
if (_msgSender() != IVoter(voter).governor()) revert NotGovernor();
if (_allowedManager == allowedManager) revert SameAddress();
if (_allowedManager == address(0)) revert ZeroAddress();
allowedManager = _allowedManager;
emit SetAllowedManager(_allowedManager);
}
/// @inheritdoc IVotingEscrow
function setManagedState(uint256 _mTokenId, bool _state) external {
if (_msgSender() != IVoter(voter).emergencyCouncil() && _msgSender() != IVoter(voter).governor())
revert NotEmergencyCouncilOrGovernor();
if (escrowType[_mTokenId] != EscrowType.MANAGED) revert NotManagedNFT();
if (deactivated[_mTokenId] == _state) revert SameState();
deactivated[_mTokenId] = _state;
}
/*///////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public constant name = "veNFT";
string public constant symbol = "veNFT";
string public constant version = "2.0.0";
uint8 public constant decimals = 18;
function setTeam(address _team) external {
if (_msgSender() != team) revert NotTeam();
if (_team == address(0)) revert ZeroAddress();
team = _team;
}
function setArtProxy(address _proxy) external {
if (_msgSender() != team) revert NotTeam();
artProxy = _proxy;
emit BatchMetadataUpdate(0, type(uint256).max);
}
/// @inheritdoc IVotingEscrow
function tokenURI(uint256 _tokenId) external view returns (string memory) {
if (_ownerOf(_tokenId) == address(0)) revert NonExistentToken();
return IVeArtProxy(artProxy).tokenURI(_tokenId);
}
/*//////////////////////////////////////////////////////////////
ERC721 BALANCE/OWNER STORAGE
//////////////////////////////////////////////////////////////*/
/// @dev Mapping from NFT ID to the address that owns it.
mapping(uint256 => address) internal idToOwner;
/// @dev Mapping from owner address to count of his tokens.
mapping(address => uint256) internal ownerToNFTokenCount;
function _ownerOf(uint256 _tokenId) internal view returns (address) {
return idToOwner[_tokenId];
}
/// @inheritdoc IVotingEscrow
function ownerOf(uint256 _tokenId) external view returns (address) {
return _ownerOf(_tokenId);
}
/// @inheritdoc IVotingEscrow
function balanceOf(address _owner) external view returns (uint256) {
return ownerToNFTokenCount[_owner];
}
/*//////////////////////////////////////////////////////////////
ERC721 APPROVAL STORAGE
//////////////////////////////////////////////////////////////*/
/// @dev Mapping from NFT ID to approved address.
mapping(uint256 => address) internal idToApprovals;
/// @dev Mapping from owner address to mapping of operator addresses.
mapping(address => mapping(address => bool)) internal ownerToOperators;
mapping(uint256 => uint256) internal ownershipChange;
/// @inheritdoc IVotingEscrow
function getApproved(uint256 _tokenId) external view returns (address) {
return idToApprovals[_tokenId];
}
/// @inheritdoc IVotingEscrow
function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
return (ownerToOperators[_owner])[_operator];
}
/// @inheritdoc IVotingEscrow
function isApprovedOrOwner(address _spender, uint256 _tokenId) external view returns (bool) {
return _isApprovedOrOwner(_spender, _tokenId);
}
function _isApprovedOrOwner(address _spender, uint256 _tokenId) internal view returns (bool) {
address owner = _ownerOf(_tokenId);
bool spenderIsOwner = owner == _spender;
bool spenderIsApproved = _spender == idToApprovals[_tokenId];
bool spenderIsApprovedForAll = (ownerToOperators[owner])[_spender];
return spenderIsOwner || spenderIsApproved || spenderIsApprovedForAll;
}
/*//////////////////////////////////////////////////////////////
ERC721 LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotingEscrow
function approve(address _approved, uint256 _tokenId) external {
address sender = _msgSender();
address owner = _ownerOf(_tokenId);
// Throws if `_tokenId` is not a valid NFT
if (owner == address(0)) revert ZeroAddress();
// Throws if `_approved` is the current owner
if (owner == _approved) revert SameAddress();
// Check requirements
bool senderIsOwner = (_ownerOf(_tokenId) == sender);
bool senderIsApprovedForAll = (ownerToOperators[owner])[sender];
if (!senderIsOwner && !senderIsApprovedForAll) revert NotApprovedOrOwner();
// Set the approval
idToApprovals[_tokenId] = _approved;
emit Approval(owner, _approved, _tokenId);
}
/// @inheritdoc IVotingEscrow
function setApprovalForAll(address _operator, bool _approved) external {
address sender = _msgSender();
// Throws if `_operator` is the `msg.sender`
if (_operator == sender) revert SameAddress();
ownerToOperators[sender][_operator] = _approved;
emit ApprovalForAll(sender, _operator, _approved);
}
/* TRANSFER FUNCTIONS */
function _transferFrom(address _from, address _to, uint256 _tokenId, address _sender) internal {
if (escrowType[_tokenId] == EscrowType.LOCKED) revert NotManagedOrNormalNFT();
// Check requirements
if (!_isApprovedOrOwner(_sender, _tokenId)) revert NotApprovedOrOwner();
// Clear approval. Throws if `_from` is not the current owner
if (_ownerOf(_tokenId) != _from) revert NotOwner();
delete idToApprovals[_tokenId];
// Remove NFT. Throws if `_tokenId` is not a valid NFT
_removeTokenFrom(_from, _tokenId);
// Update voting checkpoints
_checkpointDelegator(_tokenId, 0, _to);
// Add NFT
_addTokenTo(_to, _tokenId);
// Set the block of ownership transfer (for Flash NFT protection)
ownershipChange[_tokenId] = block.number;
// Log the transfer
emit Transfer(_from, _to, _tokenId);
}
/// @inheritdoc IVotingEscrow
function transferFrom(address _from, address _to, uint256 _tokenId) external {
_transferFrom(_from, _to, _tokenId, _msgSender());
}
/// @inheritdoc IVotingEscrow
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
safeTransferFrom(_from, _to, _tokenId, "");
}
function _isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/// @inheritdoc IVotingEscrow
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public {
address sender = _msgSender();
_transferFrom(_from, _to, _tokenId, sender);
if (_isContract(_to)) {
// Throws if transfer destination is a contract which does not implement 'onERC721Received'
try IERC721Receiver(_to).onERC721Received(sender, _from, _tokenId, _data) returns (bytes4 response) {
if (response != IERC721Receiver(_to).onERC721Received.selector) {
revert ERC721ReceiverRejectedTokens();
}
} catch (bytes memory reason) {
if (reason.length == 0) {
revert ERC721TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
/*//////////////////////////////////////////////////////////////
ERC165 LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotingEscrow
function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
return supportedInterfaces[_interfaceID];
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotingEscrow
mapping(address => mapping(uint256 => uint256)) public ownerToNFTokenIdList;
/// @dev Mapping from NFT ID to index of owner
mapping(uint256 => uint256) internal tokenToOwnerIndex;
/// @dev Add a NFT to an index mapping to a given address
/// @param _to address of the receiver
/// @param _tokenId uint ID Of the token to be added
function _addTokenToOwnerList(address _to, uint256 _tokenId) internal {
uint256 currentCount = ownerToNFTokenCount[_to];
ownerToNFTokenIdList[_to][currentCount] = _tokenId;
tokenToOwnerIndex[_tokenId] = currentCount;
}
/// @dev Add a NFT to a given address
/// Throws if `_tokenId` is owned by someone.
function _addTokenTo(address _to, uint256 _tokenId) internal {
// Throws if `_tokenId` is owned by someone
assert(_ownerOf(_tokenId) == address(0));
// Change the owner
idToOwner[_tokenId] = _to;
// Update owner token index tracking
_addTokenToOwnerList(_to, _tokenId);
// Change count tracking
ownerToNFTokenCount[_to] += 1;
}
/// @dev Function to mint tokens
/// Throws if `_to` is zero address.
/// Throws if `_tokenId` is owned by someone.
/// @param _to The address that will receive the minted tokens.
/// @param _tokenId The token id to mint.
/// @return A boolean that indicates if the operation was successful.
function _mint(address _to, uint256 _tokenId) internal returns (bool) {
// Throws if `_to` is zero address
assert(_to != address(0));
// Add NFT. Throws if `_tokenId` is owned by someone
_addTokenTo(_to, _tokenId);
// Update voting checkpoints
_checkpointDelegator(_tokenId, 0, _to);
emit Transfer(address(0), _to, _tokenId);
return true;
}
/// @dev Remove a NFT from an index mapping to a given address
/// @param _from address of the sender
/// @param _tokenId uint ID Of the token to be removed
function _removeTokenFromOwnerList(address _from, uint256 _tokenId) internal {
// Delete
uint256 currentCount = ownerToNFTokenCount[_from] - 1;
uint256 currentIndex = tokenToOwnerIndex[_tokenId];
if (currentCount == currentIndex) {
// update ownerToNFTokenIdList
ownerToNFTokenIdList[_from][currentCount] = 0;
// update tokenToOwnerIndex
tokenToOwnerIndex[_tokenId] = 0;
} else {
uint256 lastTokenId = ownerToNFTokenIdList[_from][currentCount];
// Add
// update ownerToNFTokenIdList
ownerToNFTokenIdList[_from][currentIndex] = lastTokenId;
// update tokenToOwnerIndex
tokenToOwnerIndex[lastTokenId] = currentIndex;
// Delete
// update ownerToNFTokenIdList
ownerToNFTokenIdList[_from][currentCount] = 0;
// update tokenToOwnerIndex
tokenToOwnerIndex[_tokenId] = 0;
}
}
/// @dev Remove a NFT from a given address
/// Throws if `_from` is not the current owner.
function _removeTokenFrom(address _from, uint256 _tokenId) internal {
// Throws if `_from` is not the current owner
assert(_ownerOf(_tokenId) == _from);
// Change the owner
idToOwner[_tokenId] = address(0);
// Update owner token index tracking
_removeTokenFromOwnerList(_from, _tokenId);
// Change count tracking
ownerToNFTokenCount[_from] -= 1;
}
/// @dev Must be called prior to updating `LockedBalance`
function _burn(uint256 _tokenId) internal {
address sender = _msgSender();
if (!_isApprovedOrOwner(sender, _tokenId)) revert NotApprovedOrOwner();
address owner = _ownerOf(_tokenId);
// Clear approval
delete idToApprovals[_tokenId];
// Update voting checkpoints
_checkpointDelegator(_tokenId, 0, address(0));
// Remove token
_removeTokenFrom(owner, _tokenId);
emit Transfer(owner, address(0), _tokenId);
}
/*//////////////////////////////////////////////////////////////
ESCROW STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal constant WEEK = 1 weeks;
uint256 internal constant MAXTIME = 4 * 365 * 86400;
int128 internal constant iMAXTIME = 4 * 365 * 86400;
uint256 internal constant MULTIPLIER = 1 ether;
/// @inheritdoc IVotingEscrow
uint256 public epoch;
/// @inheritdoc IVotingEscrow
uint256 public supply;
mapping(uint256 => LockedBalance) internal _locked;
mapping(uint256 => UserPoint[1000000000]) internal _userPointHistory;
mapping(uint256 => uint256) public userPointEpoch;
/// @inheritdoc IVotingEscrow
mapping(uint256 => int128) public slopeChanges;
/// @inheritdoc IVotingEscrow
mapping(address => bool) public canSplit;
/// @inheritdoc IVotingEscrow
uint256 public permanentLockBalance;
/// @inheritdoc IVotingEscrow
function locked(uint256 _tokenId) external view returns (LockedBalance memory) {
return _locked[_tokenId];
}
/// @inheritdoc IVotingEscrow
function userPointHistory(uint256 _tokenId, uint256 _loc) external view returns (UserPoint memory) {
return _userPointHistory[_tokenId][_loc];
}
/// @inheritdoc IVotingEscrow
function pointHistory(uint256 _loc) external view returns (GlobalPoint memory) {
return _pointHistory[_loc];
}
/*//////////////////////////////////////////////////////////////
ESCROW LOGIC
//////////////////////////////////////////////////////////////*/
/// @notice Record global and per-user data to checkpoints. Used by VotingEscrow system.
/// @param _tokenId NFT token ID. No user checkpoint if 0
/// @param _oldLocked Pevious locked amount / end lock time for the user
/// @param _newLocked New locked amount / end lock time for the user
function _checkpoint(uint256 _tokenId, LockedBalance memory _oldLocked, LockedBalance memory _newLocked) internal {
UserPoint memory uOld;
UserPoint memory uNew;
int128 oldDslope = 0;
int128 newDslope = 0;
uint256 _epoch = epoch;
if (_tokenId != 0) {
uNew.permanent = _newLocked.isPermanent ? _newLocked.amount.toUint256() : 0;
// Calculate slopes and biases
// Kept at zero when they have to
if (_oldLocked.end > block.timestamp && _oldLocked.amount > 0) {
uOld.slope = _oldLocked.amount / iMAXTIME;
uOld.bias = uOld.slope * (_oldLocked.end - block.timestamp).toInt128();
}
if (_newLocked.end > block.timestamp && _newLocked.amount > 0) {
uNew.slope = _newLocked.amount / iMAXTIME;
uNew.bias = uNew.slope * (_newLocked.end - block.timestamp).toInt128();
}
// Read values of scheduled changes in the slope
// _oldLocked.end can be in the past and in the future
// _newLocked.end can ONLY by in the FUTURE unless everything expired: than zeros
oldDslope = slopeChanges[_oldLocked.end];
if (_newLocked.end != 0) {
if (_newLocked.end == _oldLocked.end) {
newDslope = oldDslope;
} else {
newDslope = slopeChanges[_newLocked.end];
}
}
}
GlobalPoint memory lastPoint = GlobalPoint({
bias: 0,
slope: 0,
ts: block.timestamp,
blk: block.number,
permanentLockBalance: 0
});
if (_epoch > 0) {
lastPoint = _pointHistory[_epoch];
}
uint256 lastCheckpoint = lastPoint.ts;
// initialLastPoint is used for extrapolation to calculate block number
// (approximately, for *At methods) and save them
// as we cannot figure that out exactly from inside the contract
GlobalPoint memory initialLastPoint = GlobalPoint({
bias: lastPoint.bias,
slope: lastPoint.slope,
ts: lastPoint.ts,
blk: lastPoint.blk,
permanentLockBalance: lastPoint.permanentLockBalance
});
uint256 blockSlope = 0; // dblock/dt
if (block.timestamp > lastPoint.ts) {
blockSlope = (MULTIPLIER * (block.number - lastPoint.blk)) / (block.timestamp - lastPoint.ts);
}
// If last point is already recorded in this block, slope=0
// But that's ok b/c we know the block in such case
// Go over weeks to fill history and calculate what the current point is
{
uint256 t_i = (lastCheckpoint / WEEK) * WEEK;
for (uint256 i = 0; i < 255; ++i) {
// Hopefully it won't happen that this won't get used in 5 years!
// If it does, users will be able to withdraw but vote weight will be broken
t_i += WEEK; // Initial value of t_i is always larger than the ts of the last point
int128 d_slope = 0;
if (t_i > block.timestamp) {
t_i = block.timestamp;
} else {
d_slope = slopeChanges[t_i];
}
lastPoint.bias -= lastPoint.slope * (t_i - lastCheckpoint).toInt128();
lastPoint.slope += d_slope;
if (lastPoint.bias < 0) {
// This can happen
lastPoint.bias = 0;
}
if (lastPoint.slope < 0) {
// This cannot happen - just in case
lastPoint.slope = 0;
}
lastCheckpoint = t_i;
lastPoint.ts = t_i;
lastPoint.blk = initialLastPoint.blk + (blockSlope * (t_i - initialLastPoint.ts)) / MULTIPLIER;
_epoch += 1;
if (t_i == block.timestamp) {
lastPoint.blk = block.number;
break;
} else {
_pointHistory[_epoch] = lastPoint;
}
}
}
if (_tokenId != 0) {
// If last point was in this block, the slope change has been applied already
// But in such case we have 0 slope(s)
lastPoint.slope += (uNew.slope - uOld.slope);
lastPoint.bias += (uNew.bias - uOld.bias);
if (lastPoint.slope < 0) {
lastPoint.slope = 0;
}
if (lastPoint.bias < 0) {
lastPoint.bias = 0;
}
lastPoint.permanentLockBalance = permanentLockBalance;
}
// If timestamp of last global point is the same, overwrite the last global point
// Else record the new global point into history
// Exclude epoch 0 (note: _epoch is always >= 1, see above)
// Two possible outcomes:
// Missing global checkpoints in prior weeks. In this case, _epoch = epoch + x, where x > 1
// No missing global checkpoints, but timestamp != block.timestamp. Create new checkpoint.
// No missing global checkpoints, but timestamp == block.timestamp. Overwrite last checkpoint.
if (_epoch != 1 && _pointHistory[_epoch - 1].ts == block.timestamp) {
// _epoch = epoch + 1, so we do not increment epoch
_pointHistory[_epoch - 1] = lastPoint;
} else {
// more than one global point may have been written, so we update epoch
epoch = _epoch;
_pointHistory[_epoch] = lastPoint;
}
if (_tokenId != 0) {
// Schedule the slope changes (slope is going down)
// We subtract new_user_slope from [_newLocked.end]
// and add old_user_slope to [_oldLocked.end]
if (_oldLocked.end > block.timestamp) {
// oldDslope was <something> - uOld.slope, so we cancel that
oldDslope += uOld.slope;
if (_newLocked.end == _oldLocked.end) {
oldDslope -= uNew.slope; // It was a new deposit, not extension
}
slopeChanges[_oldLocked.end] = oldDslope;
}
if (_newLocked.end > block.timestamp) {
// update slope if new lock is greater than old lock and is not permanent or if old lock is permanent
if ((_newLocked.end > _oldLocked.end)) {
newDslope -= uNew.slope; // old slope disappeared at this point
slopeChanges[_newLocked.end] = newDslope;
}
// else: we recorded it already in oldDslope
}
// If timestamp of last user point is the same, overwrite the last user point
// Else record the new user point into history
// Exclude epoch 0
uNew.ts = block.timestamp;
uNew.blk = block.number;
uint256 userEpoch = userPointEpoch[_tokenId];
if (userEpoch != 0 && _userPointHistory[_tokenId][userEpoch].ts == block.timestamp) {
_userPointHistory[_tokenId][userEpoch] = uNew;
} else {
userPointEpoch[_tokenId] = ++userEpoch;
_userPointHistory[_tokenId][userEpoch] = uNew;
}
}
}
/// @notice Deposit and lock tokens for a user
/// @param _tokenId NFT that holds lock
/// @param _value Amount to deposit
/// @param _unlockTime New time when to unlock the tokens, or 0 if unchanged
/// @param _oldLocked Previous locked amount / timestamp
/// @param _depositType The type of deposit
function _depositFor(
uint256 _tokenId,
uint256 _value,
uint256 _unlockTime,
LockedBalance memory _oldLocked,
DepositType _depositType
) internal {
uint256 supplyBefore = supply;
supply = supplyBefore + _value;
// Set newLocked to _oldLocked without mangling memory
LockedBalance memory newLocked;
(newLocked.amount, newLocked.end, newLocked.isPermanent) = (
_oldLocked.amount,
_oldLocked.end,
_oldLocked.isPermanent
);
// Adding to existing lock, or if a lock is expired - creating a new one
newLocked.amount += _value.toInt128();
if (_unlockTime != 0) {
newLocked.end = _unlockTime;
}
_locked[_tokenId] = newLocked;
// Possibilities:
// Both _oldLocked.end could be current or expired (>/< block.timestamp)
// or if the lock is a permanent lock, then _oldLocked.end == 0
// value == 0 (extend lock) or value > 0 (add to lock or extend lock)
// newLocked.end > block.timestamp (always)
_checkpoint(_tokenId, _oldLocked, newLocked);
address from = _msgSender();
if (_value != 0) {
IERC20(token).safeTransferFrom(from, address(this), _value);
}
emit Deposit(from, _tokenId, _depositType, _value, newLocked.end, block.timestamp);
emit Supply(supplyBefore, supplyBefore + _value);
}
/// @inheritdoc IVotingEscrow
function checkpoint() external nonReentrant {
_checkpoint(0, LockedBalance(0, 0, false), LockedBalance(0, 0, false));
}
/// @inheritdoc IVotingEscrow
function depositFor(uint256 _tokenId, uint256 _value) external nonReentrant {
if (escrowType[_tokenId] == EscrowType.MANAGED && _msgSender() != distributor) revert NotDistributor();
_increaseAmountFor(_tokenId, _value, DepositType.DEPOSIT_FOR_TYPE);
}
/// @dev Deposit `_value` tokens for `_to` and lock for `_lockDuration`
/// @param _value Amount to deposit
/// @param _lockDuration Number of seconds to lock tokens for (rounded down to nearest week)
/// @param _to Address to deposit
function _createLock(uint256 _value, uint256 _lockDuration, address _to) internal returns (uint256) {
uint256 unlockTime = ((block.timestamp + _lockDuration) / WEEK) * WEEK; // Locktime is rounded down to weeks
if (_value == 0) revert ZeroAmount();
if (unlockTime <= block.timestamp) revert LockDurationNotInFuture();
if (unlockTime > block.timestamp + MAXTIME) revert LockDurationTooLong();
uint256 _tokenId = ++tokenId;
_mint(_to, _tokenId);
_depositFor(_tokenId, _value, unlockTime, _locked[_tokenId], DepositType.CREATE_LOCK_TYPE);
return _tokenId;
}
/// @inheritdoc IVotingEscrow
function createLock(uint256 _value, uint256 _lockDuration) external nonReentrant returns (uint256) {
return _createLock(_value, _lockDuration, _msgSender());
}
/// @inheritdoc IVotingEscrow
function createLockFor(uint256 _value, uint256 _lockDuration, address _to) external nonReentrant returns (uint256) {
return _createLock(_value, _lockDuration, _to);
}
function _increaseAmountFor(uint256 _tokenId, uint256 _value, DepositType _depositType) internal {
EscrowType _escrowType = escrowType[_tokenId];
if (_escrowType == EscrowType.LOCKED) revert NotManagedOrNormalNFT();
LockedBalance memory oldLocked = _locked[_tokenId];
if (_value == 0) revert ZeroAmount();
if (oldLocked.amount <= 0) revert NoLockFound();
if (oldLocked.end <= block.timestamp && !oldLocked.isPermanent) revert LockExpired();
if (oldLocked.isPermanent) permanentLockBalance += _value;
_checkpointDelegatee(_delegates[_tokenId], _value, true);
_depositFor(_tokenId, _value, 0, oldLocked, _depositType);
if (_escrowType == EscrowType.MANAGED) {
// increaseAmount called on managed tokens are treated as locked rewards
address _lockedManagedReward = managedToLocked[_tokenId];
address _token = token;
IERC20(_token).safeApprove(_lockedManagedReward, _value);
IReward(_lockedManagedReward).notifyRewardAmount(_token, _value);
IERC20(_token).safeApprove(_lockedManagedReward, 0);
}
emit MetadataUpdate(_tokenId);
}
/// @inheritdoc IVotingEscrow
function increaseAmount(uint256 _tokenId, uint256 _value) external nonReentrant {
if (!_isApprovedOrOwner(_msgSender(), _tokenId)) revert NotApprovedOrOwner();
_increaseAmountFor(_tokenId, _value, DepositType.INCREASE_LOCK_AMOUNT);
}
/// @inheritdoc IVotingEscrow
function increaseUnlockTime(uint256 _tokenId, uint256 _lockDuration) external nonReentrant {
if (!_isApprovedOrOwner(_msgSender(), _tokenId)) revert NotApprovedOrOwner();
if (escrowType[_tokenId] != EscrowType.NORMAL) revert NotNormalNFT();
LockedBalance memory oldLocked = _locked[_tokenId];
if (oldLocked.isPermanent) revert PermanentLock();
uint256 unlockTime = ((block.timestamp + _lockDuration) / WEEK) * WEEK; // Locktime is rounded down to weeks
if (oldLocked.end <= block.timestamp) revert LockExpired();
if (oldLocked.amount <= 0) revert NoLockFound();
if (unlockTime <= oldLocked.end) revert LockDurationNotInFuture();
if (unlockTime > block.timestamp + MAXTIME) revert LockDurationTooLong();
_depositFor(_tokenId, 0, unlockTime, oldLocked, DepositType.INCREASE_UNLOCK_TIME);
emit MetadataUpdate(_tokenId);
}
/// @inheritdoc IVotingEscrow
function withdraw(uint256 _tokenId) external nonReentrant {
address sender = _msgSender();
if (!_isApprovedOrOwner(sender, _tokenId)) revert NotApprovedOrOwner();
if (voted[_tokenId]) revert AlreadyVoted();
if (escrowType[_tokenId] != EscrowType.NORMAL) revert NotNormalNFT();
LockedBalance memory oldLocked = _locked[_tokenId];
if (oldLocked.isPermanent) revert PermanentLock();
if (block.timestamp < oldLocked.end) revert LockNotExpired();
uint256 value = oldLocked.amount.toUint256();
// Burn the NFT
_burn(_tokenId);
_locked[_tokenId] = LockedBalance(0, 0, false);
uint256 supplyBefore = supply;
supply = supplyBefore - value;
// oldLocked can have either expired <= timestamp or zero end
// oldLocked has only 0 end
// Both can have >= 0 amount
_checkpoint(_tokenId, oldLocked, LockedBalance(0, 0, false));
IERC20(token).safeTransfer(sender, value);
emit Withdraw(sender, _tokenId, value, block.timestamp);
emit Supply(supplyBefore, supplyBefore - value);
}
/// @inheritdoc IVotingEscrow
function merge(uint256 _from, uint256 _to) external nonReentrant {
address sender = _msgSender();
if (voted[_from]) revert AlreadyVoted();
if (escrowType[_from] != EscrowType.NORMAL) revert NotNormalNFT();
if (escrowType[_to] != EscrowType.NORMAL) revert NotNormalNFT();
if (_from == _to) revert SameNFT();
if (!_isApprovedOrOwner(sender, _from)) revert NotApprovedOrOwner();
if (!_isApprovedOrOwner(sender, _to)) revert NotApprovedOrOwner();
LockedBalance memory oldLockedTo = _locked[_to];
if (oldLockedTo.end <= block.timestamp && !oldLockedTo.isPermanent) revert LockExpired();
LockedBalance memory oldLockedFrom = _locked[_from];
if (oldLockedFrom.isPermanent) revert PermanentLock();
uint256 end = oldLockedFrom.end >= oldLockedTo.end ? oldLockedFrom.end : oldLockedTo.end;
_burn(_from);
_locked[_from] = LockedBalance(0, 0, false);
_checkpoint(_from, oldLockedFrom, LockedBalance(0, 0, false));
LockedBalance memory newLockedTo;
newLockedTo.amount = oldLockedTo.amount + oldLockedFrom.amount;
newLockedTo.isPermanent = oldLockedTo.isPermanent;
if (newLockedTo.isPermanent) {
permanentLockBalance += oldLockedFrom.amount.toUint256();
} else {
newLockedTo.end = end;
}
_checkpointDelegatee(_delegates[_to], oldLockedFrom.amount.toUint256(), true);
_checkpoint(_to, oldLockedTo, newLockedTo);
_locked[_to] = newLockedTo;
emit Merge(
sender,
_from,
_to,
oldLockedFrom.amount.toUint256(),
oldLockedTo.amount.toUint256(),
newLockedTo.amount.toUint256(),
newLockedTo.end,
block.timestamp
);
emit MetadataUpdate(_to);
}
/// @inheritdoc IVotingEscrow
function split(
uint256 _from,
uint256 _amount
) external nonReentrant returns (uint256 _tokenId1, uint256 _tokenId2) {
address sender = _msgSender();
address owner = _ownerOf(_from);
if (owner == address(0)) revert SplitNoOwner();
if (!canSplit[owner] && !canSplit[address(0)]) revert SplitNotAllowed();
if (escrowType[_from] != EscrowType.NORMAL) revert NotNormalNFT();
if (voted[_from]) revert AlreadyVoted();
if (!_isApprovedOrOwner(sender, _from)) revert NotApprovedOrOwner();
LockedBalance memory newLocked = _locked[_from];
if (newLocked.end <= block.timestamp && !newLocked.isPermanent) revert LockExpired();
int128 _splitAmount = _amount.toInt128();
if (_splitAmount == 0) revert ZeroAmount();
if (newLocked.amount <= _splitAmount) revert AmountTooBig();
// Zero out and burn old veNFT
_burn(_from);
_locked[_from] = LockedBalance(0, 0, false);
_checkpoint(_from, newLocked, LockedBalance(0, 0, false));
// Create new veNFT using old balance - amount
newLocked.amount -= _splitAmount;
_tokenId1 = _createSplitNFT(owner, newLocked);
// Create new veNFT using amount
newLocked.amount = _splitAmount;
_tokenId2 = _createSplitNFT(owner, newLocked);
emit Split(
_from,
_tokenId1,
_tokenId2,
sender,
_locked[_tokenId1].amount.toUint256(),
_splitAmount.toUint256(),
newLocked.end,
block.timestamp
);
}
function _createSplitNFT(address _to, LockedBalance memory _newLocked) private returns (uint256 _tokenId) {
_tokenId = ++tokenId;
_locked[_tokenId] = _newLocked;
_checkpoint(_tokenId, LockedBalance(0, 0, false), _newLocked);
_mint(_to, _tokenId);
}
/// @inheritdoc IVotingEscrow
function toggleSplit(address _account, bool _bool) external {
if (_msgSender() != team) revert NotTeam();
canSplit[_account] = _bool;
}
/// @inheritdoc IVotingEscrow
function lockPermanent(uint256 _tokenId) external {
address sender = _msgSender();
if (!_isApprovedOrOwner(sender, _tokenId)) revert NotApprovedOrOwner();
if (escrowType[_tokenId] != EscrowType.NORMAL) revert NotNormalNFT();
LockedBalance memory _newLocked = _locked[_tokenId];
if (_newLocked.isPermanent) revert PermanentLock();
if (_newLocked.end <= block.timestamp) revert LockExpired();
if (_newLocked.amount <= 0) revert NoLockFound();
uint256 _amount = _newLocked.amount.toUint256();
permanentLockBalance += _amount;
_newLocked.end = 0;
_newLocked.isPermanent = true;
_checkpoint(_tokenId, _locked[_tokenId], _newLocked);
_locked[_tokenId] = _newLocked;
emit LockPermanent(sender, _tokenId, _amount, block.timestamp);
emit MetadataUpdate(_tokenId);
}
/// @inheritdoc IVotingEscrow
function unlockPermanent(uint256 _tokenId) external {
address sender = _msgSender();
if (!_isApprovedOrOwner(sender, _tokenId)) revert NotApprovedOrOwner();
if (escrowType[_tokenId] != EscrowType.NORMAL) revert NotNormalNFT();
if (voted[_tokenId]) revert AlreadyVoted();
LockedBalance memory _newLocked = _locked[_tokenId];
if (!_newLocked.isPermanent) revert NotPermanentLock();
uint256 _amount = _newLocked.amount.toUint256();
permanentLockBalance -= _amount;
_newLocked.end = ((block.timestamp + MAXTIME) / WEEK) * WEEK;
_newLocked.isPermanent = false;
_delegate(_tokenId, 0);
_checkpoint(_tokenId, _locked[_tokenId], _newLocked);
_locked[_tokenId] = _newLocked;
emit UnlockPermanent(sender, _tokenId, _amount, block.timestamp);
emit MetadataUpdate(_tokenId);
}
/*///////////////////////////////////////////////////////////////
GAUGE VOTING STORAGE
//////////////////////////////////////////////////////////////*/
function _balanceOfNFTAt(uint256 _tokenId, uint256 _t) internal view returns (uint256) {
return BalanceLogicLibrary.balanceOfNFTAt(userPointEpoch, _userPointHistory, _tokenId, _t);
}
function _supplyAt(uint256 _timestamp) internal view returns (uint256) {
return BalanceLogicLibrary.supplyAt(slopeChanges, _pointHistory, epoch, _timestamp);
}
/// @inheritdoc IVotingEscrow
function balanceOfNFT(uint256 _tokenId) public view returns (uint256) {
if (ownershipChange[_tokenId] == block.number) return 0;
return _balanceOfNFTAt(_tokenId, block.timestamp);
}
/// @inheritdoc IVotingEscrow
function balanceOfNFTAt(uint256 _tokenId, uint256 _t) external view returns (uint256) {
return _balanceOfNFTAt(_tokenId, _t);
}
/// @inheritdoc IVotingEscrow
function totalSupply() external view returns (uint256) {
return _supplyAt(block.timestamp);
}
/// @inheritdoc IVotingEscrow
function totalSupplyAt(uint256 _timestamp) external view returns (uint256) {
return _supplyAt(_timestamp);
}
/*///////////////////////////////////////////////////////////////
GAUGE VOTING LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotingEscrow
mapping(uint256 => bool) public voted;
/// @inheritdoc IVotingEscrow
function setVoterAndDistributor(address _voter, address _distributor) external {
if (_msgSender() != voter) revert NotVoter();
voter = _voter;
distributor = _distributor;
}
/// @inheritdoc IVotingEscrow
function voting(uint256 _tokenId, bool _voted) external {
if (_msgSender() != voter) revert NotVoter();
voted[_tokenId] = _voted;
}
/*///////////////////////////////////////////////////////////////
DAO VOTING STORAGE
//////////////////////////////////////////////////////////////*/
/// @notice The EIP-712 typehash for the contract's domain
bytes32 public constant DOMAIN_TYPEHASH =
keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
/// @notice The EIP-712 typehash for the delegation struct used by the contract
bytes32 public constant DELEGATION_TYPEHASH =
keccak256("Delegation(uint256 delegator,uint256 delegatee,uint256 nonce,uint256 expiry)");
/// @notice A record of each accounts delegate
mapping(uint256 => uint256) private _delegates;
/// @notice A record of delegated token checkpoints for each tokenId, by index
mapping(uint256 => mapping(uint48 => Checkpoint)) private _checkpoints;
/// @inheritdoc IVotingEscrow
mapping(uint256 => uint48) public numCheckpoints;
/// @inheritdoc IVotingEscrow
mapping(address => uint256) public nonces;
/// @inheritdoc IVotingEscrow
function delegates(uint256 delegator) external view returns (uint256) {
return _delegates[delegator];
}
/// @inheritdoc IVotingEscrow
function checkpoints(uint256 _tokenId, uint48 _index) external view returns (Checkpoint memory) {
return _checkpoints[_tokenId][_index];
}
/// @inheritdoc IVotingEscrow
function getPastVotes(address _account, uint256 _tokenId, uint256 _timestamp) external view returns (uint256) {
return DelegationLogicLibrary.getPastVotes(numCheckpoints, _checkpoints, _account, _tokenId, _timestamp);
}
/// @inheritdoc IVotingEscrow
function getPastTotalSupply(uint256 _timestamp) external view returns (uint256) {
return _supplyAt(_timestamp);
}
/*///////////////////////////////////////////////////////////////
DAO VOTING LOGIC
//////////////////////////////////////////////////////////////*/
function _checkpointDelegator(uint256 _delegator, uint256 _delegatee, address _owner) internal {
DelegationLogicLibrary.checkpointDelegator(
_locked,
numCheckpoints,
_checkpoints,
_delegates,
_delegator,
_delegatee,
_owner
);
}
function _checkpointDelegatee(uint256 _delegatee, uint256 balance_, bool _increase) internal {
DelegationLogicLibrary.checkpointDelegatee(numCheckpoints, _checkpoints, _delegatee, balance_, _increase);
}
/// @notice Record user delegation checkpoints. Used by voting system.
/// @dev Skips delegation if already delegated to `delegatee`.
function _delegate(uint256 _delegator, uint256 _delegatee) internal {
LockedBalance memory delegateLocked = _locked[_delegator];
if (!delegateLocked.isPermanent) revert NotPermanentLock();
if (_delegatee != 0 && _ownerOf(_delegatee) == address(0)) revert NonExistentToken();
if (ownershipChange[_delegator] == block.number) revert OwnershipChange();
if (_delegatee == _delegator) _delegatee = 0;
uint256 currentDelegate = _delegates[_delegator];
if (currentDelegate == _delegatee) return;
uint256 delegatedBalance = delegateLocked.amount.toUint256();
_checkpointDelegator(_delegator, _delegatee, _ownerOf(_delegator));
_checkpointDelegatee(_delegatee, delegatedBalance, true);
emit DelegateChanged(_msgSender(), currentDelegate, _delegatee);
}
/// @inheritdoc IVotingEscrow
function delegate(uint256 delegator, uint256 delegatee) external {
if (!_isApprovedOrOwner(_msgSender(), delegator)) revert NotApprovedOrOwner();
return _delegate(delegator, delegatee);
}
/// @inheritdoc IVotingEscrow
function delegateBySig(
uint256 delegator,
uint256 delegatee,
uint256 nonce,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s
) external {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) revert InvalidSignatureS();
bytes32 domainSeparator = keccak256(
abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(version)), block.chainid, address(this))
);
bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegator, delegatee, nonce, expiry));
bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
address signatory = ecrecover(digest, v, r, s);
if (!_isApprovedOrOwner(signatory, delegator)) revert NotApprovedOrOwner();
if (signatory == address(0)) revert InvalidSignature();
if (nonce != nonces[signatory]++) revert InvalidNonce();
if (block.timestamp > expiry) revert SignatureExpired();
return _delegate(delegator, delegatee);
}
/*//////////////////////////////////////////////////////////////
ERC6372 LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotingEscrow
function clock() external view returns (uint48) {
return uint48(block.timestamp);
}
/// @inheritdoc IVotingEscrow
function CLOCK_MODE() external pure returns (string memory) {
return "mode=timestamp";
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IERC165, IERC721, IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import {IERC6372} from "@openzeppelin/contracts/interfaces/IERC6372.sol";
import {IERC4906} from "@openzeppelin/contracts/interfaces/IERC4906.sol";
import {IVotes} from "../governance/IVotes.sol";
interface IVotingEscrow is IVotes, IERC4906, IERC6372, IERC721Metadata {
struct LockedBalance {
int128 amount;
uint256 end;
bool isPermanent;
}
struct UserPoint {
int128 bias;
int128 slope; // # -dweight / dt
uint256 ts;
uint256 blk; // block
uint256 permanent;
}
struct GlobalPoint {
int128 bias;
int128 slope; // # -dweight / dt
uint256 ts;
uint256 blk; // block
uint256 permanentLockBalance;
}
/// @notice A checkpoint for recorded delegated voting weights at a certain timestamp
struct Checkpoint {
uint256 fromTimestamp;
address owner;
uint256 delegatedBalance;
uint256 delegatee;
}
enum DepositType {
DEPOSIT_FOR_TYPE,
CREATE_LOCK_TYPE,
INCREASE_LOCK_AMOUNT,
INCREASE_UNLOCK_TIME
}
/// @dev Different types of veNFTs:
/// NORMAL - typical veNFT
/// LOCKED - veNFT which is locked into a MANAGED veNFT
/// MANAGED - veNFT which can accept the deposit of NORMAL veNFTs
enum EscrowType {
NORMAL,
LOCKED,
MANAGED
}
error AlreadyVoted();
error AmountTooBig();
error ERC721ReceiverRejectedTokens();
error ERC721TransferToNonERC721ReceiverImplementer();
error InvalidNonce();
error InvalidSignature();
error InvalidSignatureS();
error InvalidManagedNFTId();
error LockDurationNotInFuture();
error LockDurationTooLong();
error LockExpired();
error LockNotExpired();
error NoLockFound();
error NonExistentToken();
error NotApprovedOrOwner();
error NotDistributor();
error NotEmergencyCouncilOrGovernor();
error NotGovernor();
error NotGovernorOrManager();
error NotManagedNFT();
error NotManagedOrNormalNFT();
error NotLockedNFT();
error NotNormalNFT();
error NotPermanentLock();
error NotOwner();
error NotTeam();
error NotVoter();
error OwnershipChange();
error PermanentLock();
error SameAddress();
error SameNFT();
error SameState();
error SplitNoOwner();
error SplitNotAllowed();
error SignatureExpired();
error TooManyTokenIDs();
error ZeroAddress();
error ZeroAmount();
error ZeroBalance();
event Deposit(
address indexed provider,
uint256 indexed tokenId,
DepositType indexed depositType,
uint256 value,
uint256 locktime,
uint256 ts
);
event Withdraw(address indexed provider, uint256 indexed tokenId, uint256 value, uint256 ts);
event LockPermanent(address indexed _owner, uint256 indexed _tokenId, uint256 amount, uint256 _ts);
event UnlockPermanent(address indexed _owner, uint256 indexed _tokenId, uint256 amount, uint256 _ts);
event Supply(uint256 prevSupply, uint256 supply);
event Merge(
address indexed _sender,
uint256 indexed _from,
uint256 indexed _to,
uint256 _amountFrom,
uint256 _amountTo,
uint256 _amountFinal,
uint256 _locktime,
uint256 _ts
);
event Split(
uint256 indexed _from,
uint256 indexed _tokenId1,
uint256 indexed _tokenId2,
address _sender,
uint256 _splitAmount1,
uint256 _splitAmount2,
uint256 _locktime,
uint256 _ts
);
event CreateManaged(
address indexed _to,
uint256 indexed _mTokenId,
address indexed _from,
address _lockedManagedReward,
address _freeManagedReward
);
event DepositManaged(
address indexed _owner,
uint256 indexed _tokenId,
uint256 indexed _mTokenId,
uint256 _weight,
uint256 _ts
);
event WithdrawManaged(
address indexed _owner,
uint256 indexed _tokenId,
uint256 indexed _mTokenId,
uint256 _weight,
uint256 _ts
);
event SetAllowedManager(address indexed _allowedManager);
// State variables
/// @notice Address of Meta-tx Forwarder
function forwarder() external view returns (address);
/// @notice Address of FactoryRegistry.sol
function factoryRegistry() external view returns (address);
/// @notice Address of token (ABX) used to create a veNFT
function token() external view returns (address);
/// @notice Address of RewardsDistributor.sol
function distributor() external view returns (address);
/// @notice Address of Voter.sol
function voter() external view returns (address);
/// @notice Address of Protocol Team multisig
function team() external view returns (address);
/// @notice Address of art proxy used for on-chain art generation
function artProxy() external view returns (address);
/// @dev address which can create managed NFTs
function allowedManager() external view returns (address);
/// @dev Current count of token
function tokenId() external view returns (uint256);
/*///////////////////////////////////////////////////////////////
MANAGED NFT STORAGE
//////////////////////////////////////////////////////////////*/
/// @dev Mapping of token id to escrow type
/// Takes advantage of the fact default value is EscrowType.NORMAL
function escrowType(uint256 tokenId) external view returns (EscrowType);
/// @dev Mapping of token id to managed id
function idToManaged(uint256 tokenId) external view returns (uint256 managedTokenId);
/// @dev Mapping of user token id to managed token id to weight of token id
function weights(uint256 tokenId, uint256 managedTokenId) external view returns (uint256 weight);
/// @dev Mapping of managed id to deactivated state
function deactivated(uint256 tokenId) external view returns (bool inactive);
/// @dev Mapping from managed nft id to locked managed rewards
/// `token` denominated rewards (rebases/rewards) stored in locked managed rewards contract
/// to prevent co-mingling of assets
function managedToLocked(uint256 tokenId) external view returns (address);
/// @dev Mapping from managed nft id to free managed rewards contract
/// these rewards can be freely withdrawn by users
function managedToFree(uint256 tokenId) external view returns (address);
/*///////////////////////////////////////////////////////////////
MANAGED NFT LOGIC
//////////////////////////////////////////////////////////////*/
/// @notice Create managed NFT (a permanent lock) for use within ecosystem.
/// @dev Throws if address already owns a managed NFT.
/// @return _mTokenId managed token id.
function createManagedLockFor(address _to) external returns (uint256 _mTokenId);
/// @notice Delegates balance to managed nft
/// Note that NFTs deposited into a managed NFT will be re-locked
/// to the maximum lock time on withdrawal.
/// Permanent locks that are deposited will automatically unlock.
/// @dev Managed nft will remain max-locked as long as there is at least one
/// deposit or withdrawal per week.
/// Throws if deposit nft is managed.
/// Throws if recipient nft is not managed.
/// Throws if deposit nft is already locked.
/// Throws if not called by voter.
/// @param _tokenId tokenId of NFT being deposited
/// @param _mTokenId tokenId of managed NFT that will receive the deposit
function depositManaged(uint256 _tokenId, uint256 _mTokenId) external;
/// @notice Retrieves locked rewards and withdraws balance from managed nft.
/// Note that the NFT withdrawn is re-locked to the maximum lock time.
/// @dev Throws if NFT not locked.
/// Throws if not called by voter.
/// @param _tokenId tokenId of NFT being deposited.
function withdrawManaged(uint256 _tokenId) external;
/// @notice Permit one address to call createManagedLockFor() that is not Voter.governor()
function setAllowedManager(address _allowedManager) external;
/// @notice Set Managed NFT state. Inactive NFTs cannot be deposited into.
/// @param _mTokenId managed nft state to set
/// @param _state true => inactive, false => active
function setManagedState(uint256 _mTokenId, bool _state) external;
/*///////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function version() external view returns (string memory);
function decimals() external view returns (uint8);
function setTeam(address _team) external;
function setArtProxy(address _proxy) external;
/// @inheritdoc IERC721Metadata
function tokenURI(uint256 tokenId) external view returns (string memory);
/*//////////////////////////////////////////////////////////////
ERC721 BALANCE/OWNER STORAGE
//////////////////////////////////////////////////////////////*/
/// @dev Mapping from owner address to mapping of index to tokenId
function ownerToNFTokenIdList(address _owner, uint256 _index) external view returns (uint256 _tokenId);
/// @inheritdoc IERC721
function ownerOf(uint256 tokenId) external view returns (address owner);
/// @inheritdoc IERC721
function balanceOf(address owner) external view returns (uint256 balance);
/*//////////////////////////////////////////////////////////////
ERC721 APPROVAL STORAGE
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IERC721
function getApproved(uint256 _tokenId) external view returns (address operator);
/// @inheritdoc IERC721
function isApprovedForAll(address owner, address operator) external view returns (bool);
/// @notice Check whether spender is owner or an approved user for a given veNFT
/// @param _spender .
/// @param _tokenId .
function isApprovedOrOwner(address _spender, uint256 _tokenId) external returns (bool);
/*//////////////////////////////////////////////////////////////
ERC721 LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IERC721
function approve(address to, uint256 tokenId) external;
/// @inheritdoc IERC721
function setApprovalForAll(address operator, bool approved) external;
/// @inheritdoc IERC721
function transferFrom(address from, address to, uint256 tokenId) external;
/// @inheritdoc IERC721
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/// @inheritdoc IERC721
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/*//////////////////////////////////////////////////////////////
ERC165 LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IERC165
function supportsInterface(bytes4 _interfaceID) external view returns (bool);
/*//////////////////////////////////////////////////////////////
ESCROW STORAGE
//////////////////////////////////////////////////////////////*/
/// @notice Total count of epochs witnessed since contract creation
function epoch() external view returns (uint256);
/// @notice Total amount of token() deposited
function supply() external view returns (uint256);
/// @notice Aggregate permanent locked balances
function permanentLockBalance() external view returns (uint256);
function userPointEpoch(uint256 _tokenId) external view returns (uint256 _epoch);
/// @notice time -> signed slope change
function slopeChanges(uint256 _timestamp) external view returns (int128);
/// @notice account -> can split
function canSplit(address _account) external view returns (bool);
/// @notice Global point history at a given index
function pointHistory(uint256 _loc) external view returns (GlobalPoint memory);
/// @notice Get the LockedBalance (amount, end) of a _tokenId
/// @param _tokenId .
/// @return LockedBalance of _tokenId
function locked(uint256 _tokenId) external view returns (LockedBalance memory);
/// @notice User -> UserPoint[userEpoch]
function userPointHistory(uint256 _tokenId, uint256 _loc) external view returns (UserPoint memory);
/*//////////////////////////////////////////////////////////////
ESCROW LOGIC
//////////////////////////////////////////////////////////////*/
/// @notice Record global data to checkpoint
function checkpoint() external;
/// @notice Deposit `_value` tokens for `_tokenId` and add to the lock
/// @dev Anyone (even a smart contract) can deposit for someone else, but
/// cannot extend their locktime and deposit for a brand new user
/// @param _tokenId lock NFT
/// @param _value Amount to add to user's lock
function depositFor(uint256 _tokenId, uint256 _value) external;
/// @notice Deposit `_value` tokens for `msg.sender` and lock for `_lockDuration`
/// @param _value Amount to deposit
/// @param _lockDuration Number of seconds to lock tokens for (rounded down to nearest week)
/// @return TokenId of created veNFT
function createLock(uint256 _value, uint256 _lockDuration) external returns (uint256);
/// @notice Deposit `_value` tokens for `_to` and lock for `_lockDuration`
/// @param _value Amount to deposit
/// @param _lockDuration Number of seconds to lock tokens for (rounded down to nearest week)
/// @param _to Address to deposit
/// @return TokenId of created veNFT
function createLockFor(uint256 _value, uint256 _lockDuration, address _to) external returns (uint256);
/// @notice Deposit `_value` additional tokens for `_tokenId` without modifying the unlock time
/// @param _value Amount of tokens to deposit and add to the lock
function increaseAmount(uint256 _tokenId, uint256 _value) external;
/// @notice Extend the unlock time for `_tokenId`
/// Cannot extend lock time of permanent locks
/// @param _lockDuration New number of seconds until tokens unlock
function increaseUnlockTime(uint256 _tokenId, uint256 _lockDuration) external;
/// @notice Withdraw all tokens for `_tokenId`
/// @dev Only possible if the lock is both expired and not permanent
/// This will burn the veNFT. Any rebases or rewards that are unclaimed
/// will no longer be claimable. Claim all rebases and rewards prior to calling this.
function withdraw(uint256 _tokenId) external;
/// @notice Merges `_from` into `_to`.
/// @dev Cannot merge `_from` locks that are permanent or have already voted this epoch.
/// Cannot merge `_to` locks that have already expired.
/// This will burn the veNFT. Any rebases or rewards that are unclaimed
/// will no longer be claimable. Claim all rebases and rewards prior to calling this.
/// @param _from VeNFT to merge from.
/// @param _to VeNFT to merge into.
function merge(uint256 _from, uint256 _to) external;
/// @notice Splits veNFT into two new veNFTS - one with oldLocked.amount - `_amount`, and the second with `_amount`
/// @dev This burns the tokenId of the target veNFT
/// Callable by approved or owner
/// If this is called by approved, approved will not have permissions to manipulate the newly created veNFTs
/// Returns the two new split veNFTs to owner
/// If `from` is permanent, will automatically dedelegate.
/// This will burn the veNFT. Any rebases or rewards that are unclaimed
/// will no longer be claimable. Claim all rebases and rewards prior to calling this.
/// @param _from VeNFT to split.
/// @param _amount Amount to split from veNFT.
/// @return _tokenId1 Return tokenId of veNFT with oldLocked.amount - `_amount`.
/// @return _tokenId2 Return tokenId of veNFT with `_amount`.
function split(uint256 _from, uint256 _amount) external returns (uint256 _tokenId1, uint256 _tokenId2);
/// @notice Toggle split for a specific address.
/// @dev Toggle split for address(0) to enable or disable for all.
/// @param _account Address to toggle split permissions
/// @param _bool True to allow, false to disallow
function toggleSplit(address _account, bool _bool) external;
/// @notice Permanently lock a veNFT. Voting power will be equal to
/// `LockedBalance.amount` with no decay. Required to delegate.
/// @dev Only callable by unlocked normal veNFTs.
/// @param _tokenId tokenId to lock.
function lockPermanent(uint256 _tokenId) external;
/// @notice Unlock a permanently locked veNFT. Voting power will decay.
/// Will automatically dedelegate if delegated.
/// @dev Only callable by permanently locked veNFTs.
/// Cannot unlock if already voted this epoch.
/// @param _tokenId tokenId to unlock.
function unlockPermanent(uint256 _tokenId) external;
/*///////////////////////////////////////////////////////////////
GAUGE VOTING STORAGE
//////////////////////////////////////////////////////////////*/
/// @notice Get the voting power for _tokenId at the current timestamp
/// @dev Returns 0 if called in the same block as a transfer.
/// @param _tokenId .
/// @return Voting power
function balanceOfNFT(uint256 _tokenId) external view returns (uint256);
/// @notice Get the voting power for _tokenId at a given timestamp
/// @param _tokenId .
/// @param _t Timestamp to query voting power
/// @return Voting power
function balanceOfNFTAt(uint256 _tokenId, uint256 _t) external view returns (uint256);
/// @notice Calculate total voting power at current timestamp
/// @return Total voting power at current timestamp
function totalSupply() external view returns (uint256);
/// @notice Calculate total voting power at a given timestamp
/// @param _t Timestamp to query total voting power
/// @return Total voting power at given timestamp
function totalSupplyAt(uint256 _t) external view returns (uint256);
/*///////////////////////////////////////////////////////////////
GAUGE VOTING LOGIC
//////////////////////////////////////////////////////////////*/
/// @notice See if a queried _tokenId has actively voted
/// @param _tokenId .
/// @return True if voted, else false
function voted(uint256 _tokenId) external view returns (bool);
/// @notice Set the global state voter and distributor
/// @dev This is only called once, at setup
function setVoterAndDistributor(address _voter, address _distributor) external;
/// @notice Set `voted` for _tokenId to true or false
/// @dev Only callable by voter
/// @param _tokenId .
/// @param _voted .
function voting(uint256 _tokenId, bool _voted) external;
/*///////////////////////////////////////////////////////////////
DAO VOTING STORAGE
//////////////////////////////////////////////////////////////*/
/// @notice The number of checkpoints for each tokenId
function numCheckpoints(uint256 tokenId) external view returns (uint48);
/// @notice A record of states for signing / validating signatures
function nonces(address account) external view returns (uint256);
/// @inheritdoc IVotes
function delegates(uint256 delegator) external view returns (uint256);
/// @notice A record of delegated token checkpoints for each account, by index
/// @param tokenId .
/// @param index .
/// @return Checkpoint
function checkpoints(uint256 tokenId, uint48 index) external view returns (Checkpoint memory);
/// @inheritdoc IVotes
function getPastVotes(address account, uint256 tokenId, uint256 timestamp) external view returns (uint256);
/// @inheritdoc IVotes
function getPastTotalSupply(uint256 timestamp) external view returns (uint256);
/*///////////////////////////////////////////////////////////////
DAO VOTING LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IVotes
function delegate(uint256 delegator, uint256 delegatee) external;
/// @inheritdoc IVotes
function delegateBySig(
uint256 delegator,
uint256 delegatee,
uint256 nonce,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s
) external;
/*//////////////////////////////////////////////////////////////
ERC6372 LOGIC
//////////////////////////////////////////////////////////////*/
/// @inheritdoc IERC6372
function clock() external view returns (uint48);
/// @inheritdoc IERC6372
function CLOCK_MODE() external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IVoter {
error AlreadyVotedOrDeposited();
error DistributeWindow();
error FactoryPathNotApproved();
error GaugeAlreadyKilled();
error GaugeAlreadyRevived();
error GaugeExists();
error GaugeDoesNotExist(address _pool);
error GaugeNotAlive(address _gauge);
error InactiveManagedNFT();
error MaximumVotingNumberTooLow();
error NonZeroVotes();
error NotAPool();
error NotApprovedOrOwner();
error NotGovernor();
error NotEmergencyCouncil();
error NotMinter();
error NotWhitelistedNFT();
error NotWhitelistedToken();
error SameValue();
error SpecialVotingWindow();
error TooManyPools();
error UnequalLengths();
error ZeroBalance();
error ZeroAddress();
event GaugeCreated(
address indexed poolFactory,
address indexed votingRewardsFactory,
address indexed gaugeFactory,
address pool,
address bribeVotingReward,
address feeVotingReward,
address gauge,
address creator
);
event GaugeKilled(address indexed gauge);
event GaugeRevived(address indexed gauge);
event Voted(
address indexed voter,
address indexed pool,
uint256 indexed tokenId,
uint256 weight,
uint256 totalWeight,
uint256 timestamp
);
event Abstained(
address indexed voter,
address indexed pool,
uint256 indexed tokenId,
uint256 weight,
uint256 totalWeight,
uint256 timestamp
);
event NotifyReward(address indexed sender, address indexed reward, uint256 amount);
event DistributeReward(address indexed sender, address indexed gauge, uint256 amount);
event WhitelistToken(address indexed whitelister, address indexed token, bool indexed _bool);
event WhitelistNFT(address indexed whitelister, uint256 indexed tokenId, bool indexed _bool);
/// @notice Store trusted forwarder address to pass into factories
function forwarder() external view returns (address);
/// @notice The ve token that governs these contracts
function ve() external view returns (address);
/// @notice Factory registry for valid pool / gauge / rewards factories
function factoryRegistry() external view returns (address);
/// @notice Address of Minter.sol
function minter() external view returns (address);
/// @notice Standard OZ IGovernor using ve for vote weights.
function governor() external view returns (address);
/// @notice Custom Epoch Governor using ve for vote weights.
function epochGovernor() external view returns (address);
/// @notice credibly neutral party similar to Curve's Emergency DAO
function emergencyCouncil() external view returns (address);
/// @dev Total Voting Weights
function totalWeight() external view returns (uint256);
/// @dev Most number of pools one voter can vote for at once
function maxVotingNum() external view returns (uint256);
// mappings
/// @dev Pool => Gauge
function gauges(address pool) external view returns (address);
/// @dev Gauge => Pool
function poolForGauge(address gauge) external view returns (address);
/// @dev Gauge => Fees Voting Reward
function gaugeToFees(address gauge) external view returns (address);
/// @dev Gauge => Bribes Voting Reward
function gaugeToBribe(address gauge) external view returns (address);
/// @dev Pool => Weights
function weights(address pool) external view returns (uint256);
/// @dev NFT => Pool => Votes
function votes(uint256 tokenId, address pool) external view returns (uint256);
/// @dev NFT => Total voting weight of NFT
function usedWeights(uint256 tokenId) external view returns (uint256);
/// @dev Nft => Timestamp of last vote (ensures single vote per epoch)
function lastVoted(uint256 tokenId) external view returns (uint256);
/// @dev Address => Gauge
function isGauge(address) external view returns (bool);
/// @dev Token => Whitelisted status
function isWhitelistedToken(address token) external view returns (bool);
/// @dev TokenId => Whitelisted status
function isWhitelistedNFT(uint256 tokenId) external view returns (bool);
/// @dev Gauge => Liveness status
function isAlive(address gauge) external view returns (bool);
/// @dev Gauge => Amount claimable
function claimable(address gauge) external view returns (uint256);
/// @notice Number of pools with a Gauge
function length() external view returns (uint256);
/// @notice Called by Minter to distribute weekly emissions rewards for disbursement amongst gauges.
/// @dev Assumes totalWeight != 0 (Will never be zero as long as users are voting).
/// Throws if not called by minter.
/// @param _amount Amount of rewards to distribute.
function notifyRewardAmount(uint256 _amount) external;
/// @dev Utility to distribute to gauges of pools in range _start to _finish.
/// @param _start Starting index of gauges to distribute to.
/// @param _finish Ending index of gauges to distribute to.
function distribute(uint256 _start, uint256 _finish) external;
/// @dev Utility to distribute to gauges of pools in array.
/// @param _gauges Array of gauges to distribute to.
function distribute(address[] memory _gauges) external;
/// @notice Called by users to update voting balances in voting rewards contracts.
/// @param _tokenId Id of veNFT whose balance you wish to update.
function poke(uint256 _tokenId) external;
/// @notice Called by users to vote for pools. Votes distributed proportionally based on weights.
/// Can only vote or deposit into a managed NFT once per epoch.
/// Can only vote for gauges that have not been killed.
/// @dev Weights are distributed proportional to the sum of the weights in the array.
/// Throws if length of _poolVote and _weights do not match.
/// @param _tokenId Id of veNFT you are voting with.
/// @param _poolVote Array of pools you are voting for.
/// @param _weights Weights of pools.
function vote(uint256 _tokenId, address[] calldata _poolVote, uint256[] calldata _weights) external;
/// @notice Called by users to reset voting state. Required if you wish to make changes to
/// veNFT state (e.g. merge, split, deposit into managed etc).
/// Cannot reset in the same epoch that you voted in.
/// Can vote or deposit into a managed NFT again after reset.
/// @param _tokenId Id of veNFT you are reseting.
function reset(uint256 _tokenId) external;
/// @notice Called by users to deposit into a managed NFT.
/// Can only vote or deposit into a managed NFT once per epoch.
/// Note that NFTs deposited into a managed NFT will be re-locked
/// to the maximum lock time on withdrawal.
/// @dev Throws if not approved or owner.
/// Throws if managed NFT is inactive.
/// Throws if depositing within privileged window (one hour prior to epoch flip).
function depositManaged(uint256 _tokenId, uint256 _mTokenId) external;
/// @notice Called by users to withdraw from a managed NFT.
/// Cannot do it in the same epoch that you deposited into a managed NFT.
/// Can vote or deposit into a managed NFT again after withdrawing.
/// Note that the NFT withdrawn is re-locked to the maximum lock time.
function withdrawManaged(uint256 _tokenId) external;
/// @notice Claim emissions from gauges.
/// @param _gauges Array of gauges to collect emissions from.
function claimRewards(address[] memory _gauges) external;
/// @notice Claim bribes for a given NFT.
/// @dev Utility to help batch bribe claims.
/// @param _bribes Array of BribeVotingReward contracts to collect from.
/// @param _tokens Array of tokens that are used as bribes.
/// @param _tokenId Id of veNFT that you wish to claim bribes for.
function claimBribes(address[] memory _bribes, address[][] memory _tokens, uint256 _tokenId) external;
/// @notice Claim fees for a given NFT.
/// @dev Utility to help batch fee claims.
/// @param _fees Array of FeesVotingReward contracts to collect from.
/// @param _tokens Array of tokens that are used as fees.
/// @param _tokenId Id of veNFT that you wish to claim fees for.
function claimFees(address[] memory _fees, address[][] memory _tokens, uint256 _tokenId) external;
/// @notice Set new governor.
/// @dev Throws if not called by governor.
/// @param _governor .
function setGovernor(address _governor) external;
/// @notice Set new epoch based governor.
/// @dev Throws if not called by governor.
/// @param _epochGovernor .
function setEpochGovernor(address _epochGovernor) external;
/// @notice Set new emergency council.
/// @dev Throws if not called by emergency council.
/// @param _emergencyCouncil .
function setEmergencyCouncil(address _emergencyCouncil) external;
/// @notice Set maximum number of gauges that can be voted for.
/// @dev Throws if not called by governor.
/// Throws if _maxVotingNum is too low.
/// Throws if the values are the same.
/// @param _maxVotingNum .
function setMaxVotingNum(uint256 _maxVotingNum) external;
/// @notice Whitelist (or unwhitelist) token for use in bribes.
/// @dev Throws if not called by governor.
/// @param _token .
/// @param _bool .
function whitelistToken(address _token, bool _bool) external;
/// @notice Whitelist (or unwhitelist) token id for voting in last hour prior to epoch flip.
/// @dev Throws if not called by governor.
/// Throws if already whitelisted.
/// @param _tokenId .
/// @param _bool .
function whitelistNFT(uint256 _tokenId, bool _bool) external;
/// @notice Create a new gauge (unpermissioned).
/// @dev Governor can create a new gauge for a pool with any address.
/// @param _poolFactory .
/// @param _pool .
function createGauge(address _poolFactory, address _pool) external returns (address);
/// @notice Kills a gauge. The gauge will not receive any new emissions and cannot be deposited into.
/// Can still withdraw from gauge.
/// @dev Throws if not called by emergency council.
/// Throws if gauge already killed.
/// @param _gauge .
function killGauge(address _gauge) external;
/// @notice Revives a killed gauge. Gauge will can receive emissions and deposits again.
/// @dev Throws if not called by emergency council.
/// Throws if gauge is not killed.
/// @param _gauge .
function reviveGauge(address _gauge) external;
/// @dev Update claims to emissions for an array of gauges.
/// @param _gauges Array of gauges to update emissions for.
function updateFor(address[] memory _gauges) external;
/// @dev Update claims to emissions for gauges based on their pool id as stored in Voter.
/// @param _start Starting index of pools.
/// @param _end Ending index of pools.
function updateFor(uint256 _start, uint256 _end) external;
/// @dev Update claims to emissions for single gauge
/// @param _gauge .
function updateFor(address _gauge) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
interface IVeArtProxy {
/// @dev Art configuration
struct Config {
// NFT metadata variables
int256 _tokenId;
int256 _balanceOf;
int256 _lockedEnd;
int256 _lockedAmount;
// Line art variables
int256 shape;
uint256 palette;
int256 maxLines;
int256 dash;
// Randomness variables
int256 seed1;
int256 seed2;
int256 seed3;
}
/// @dev Individual line art path variables.
struct lineConfig {
string color;
uint256 stroke;
uint256 offset;
uint256 offsetHalf;
uint256 offsetDashSum;
uint256 pathLength;
}
/// @dev Represents an (x,y) coordinate in a line.
struct Point {
int256 x;
int256 y;
}
/// @notice Generate a SVG based on veNFT metadata
/// @param _tokenId Unique veNFT identifier
/// @return output SVG metadata as HTML tag
function tokenURI(uint256 _tokenId) external view returns (string memory output);
/// @notice Generate only the foreground <path> elements of the line art for an NFT (excluding SVG header), for flexibility purposes.
/// @param _tokenId Unique veNFT identifier
/// @return output Encoded output of generateShape()
function lineArtPathsOnly(uint256 _tokenId) external view returns (bytes memory output);
/// @notice Generate the master art config metadata for a veNFT
/// @param _tokenId Unique veNFT identifier
/// @return cfg Config struct
function generateConfig(uint256 _tokenId) external view returns (Config memory cfg);
/// @notice Generate the points for two stripe lines based on the config generated for a veNFT
/// @param cfg Master art config metadata of a veNFT
/// @param l Number of line drawn
/// @return Line (x, y) coordinates of the drawn stripes
function twoStripes(Config memory cfg, int256 l) external pure returns (Point[100] memory Line);
/// @notice Generate the points for circles based on the config generated for a veNFT
/// @param cfg Master art config metadata of a veNFT
/// @param l Number of circles drawn
/// @return Line (x, y) coordinates of the drawn circles
function circles(Config memory cfg, int256 l) external pure returns (Point[100] memory Line);
/// @notice Generate the points for interlocking circles based on the config generated for a veNFT
/// @param cfg Master art config metadata of a veNFT
/// @param l Number of interlocking circles drawn
/// @return Line (x, y) coordinates of the drawn interlocking circles
function interlockingCircles(Config memory cfg, int256 l) external pure returns (Point[100] memory Line);
/// @notice Generate the points for corners based on the config generated for a veNFT
/// @param cfg Master art config metadata of a veNFT
/// @param l Number of corners drawn
/// @return Line (x, y) coordinates of the drawn corners
function corners(Config memory cfg, int256 l) external pure returns (Point[100] memory Line);
/// @notice Generate the points for a curve based on the config generated for a veNFT
/// @param cfg Master art config metadata of a veNFT
/// @param l Number of curve drawn
/// @return Line (x, y) coordinates of the drawn curve
function curves(Config memory cfg, int256 l) external pure returns (Point[100] memory Line);
/// @notice Generate the points for a spiral based on the config generated for a veNFT
/// @param cfg Master art config metadata of a veNFT
/// @param l Number of spiral drawn
/// @return Line (x, y) coordinates of the drawn spiral
function spiral(Config memory cfg, int256 l) external pure returns (Point[100] memory Line);
/// @notice Generate the points for an explosion based on the config generated for a veNFT
/// @param cfg Master art config metadata of a veNFT
/// @param l Number of explosion drawn
/// @return Line (x, y) coordinates of the drawn explosion
function explosion(Config memory cfg, int256 l) external pure returns (Point[100] memory Line);
/// @notice Generate the points for a wormhole based on the config generated for a veNFT
/// @param cfg Master art config metadata of a veNFT
/// @param l Number of wormhole drawn
/// @return Line (x, y) coordinates of the drawn wormhole
function wormhole(Config memory cfg, int256 l) external pure returns (Point[100] memory Line);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IReward {
error InvalidReward();
error NotAuthorized();
error NotGauge();
error NotEscrowToken();
error NotSingleToken();
error NotVotingEscrow();
error NotWhitelisted();
error ZeroAmount();
event Deposit(address indexed from, uint256 indexed tokenId, uint256 amount);
event Withdraw(address indexed from, uint256 indexed tokenId, uint256 amount);
event NotifyReward(address indexed from, address indexed reward, uint256 indexed epoch, uint256 amount);
event ClaimRewards(address indexed from, address indexed reward, uint256 amount);
/// @notice A checkpoint for marking balance
struct Checkpoint {
uint256 timestamp;
uint256 balanceOf;
}
/// @notice A checkpoint for marking supply
struct SupplyCheckpoint {
uint256 timestamp;
uint256 supply;
}
/// @notice Epoch duration constant (7 days)
function DURATION() external view returns (uint256);
/// @notice Address of Voter.sol
function voter() external view returns (address);
/// @notice Address of VotingEscrow.sol
function ve() external view returns (address);
/// @dev Address which has permission to externally call _deposit() & _withdraw()
function authorized() external view returns (address);
/// @notice Total amount currently deposited via _deposit()
function totalSupply() external view returns (uint256);
/// @notice Current amount deposited by tokenId
function balanceOf(uint256 tokenId) external view returns (uint256);
/// @notice Amount of tokens to reward depositors for a given epoch
/// @param token Address of token to reward
/// @param epochStart Startime of rewards epoch
/// @return Amount of token
function tokenRewardsPerEpoch(address token, uint256 epochStart) external view returns (uint256);
/// @notice Most recent timestamp a veNFT has claimed their rewards
/// @param token Address of token rewarded
/// @param tokenId veNFT unique identifier
/// @return Timestamp
function lastEarn(address token, uint256 tokenId) external view returns (uint256);
/// @notice True if a token is or has been an active reward token, else false
function isReward(address token) external view returns (bool);
/// @notice The number of checkpoints for each tokenId deposited
function numCheckpoints(uint256 tokenId) external view returns (uint256);
/// @notice The total number of checkpoints
function supplyNumCheckpoints() external view returns (uint256);
/// @notice Deposit an amount into the rewards contract to earn future rewards associated to a veNFT
/// @dev Internal notation used as only callable internally by `authorized`.
/// @param amount Amount deposited for the veNFT
/// @param tokenId Unique identifier of the veNFT
function _deposit(uint256 amount, uint256 tokenId) external;
/// @notice Withdraw an amount from the rewards contract associated to a veNFT
/// @dev Internal notation used as only callable internally by `authorized`.
/// @param amount Amount deposited for the veNFT
/// @param tokenId Unique identifier of the veNFT
function _withdraw(uint256 amount, uint256 tokenId) external;
/// @notice Claim the rewards earned by a veNFT staker
/// @param tokenId Unique identifier of the veNFT
/// @param tokens Array of tokens to claim rewards of
function getReward(uint256 tokenId, address[] memory tokens) external;
/// @notice Add rewards for stakers to earn
/// @param token Address of token to reward
/// @param amount Amount of token to transfer to rewards
function notifyRewardAmount(address token, uint256 amount) external;
/// @notice Determine the prior balance for an account as of a block number
/// @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
/// @param tokenId The token of the NFT to check
/// @param timestamp The timestamp to get the balance at
/// @return The balance the account had as of the given block
function getPriorBalanceIndex(uint256 tokenId, uint256 timestamp) external view returns (uint256);
/// @notice Determine the prior index of supply staked by of a timestamp
/// @dev Timestamp must be <= current timestamp
/// @param timestamp The timestamp to get the index at
/// @return Index of supply checkpoint
function getPriorSupplyIndex(uint256 timestamp) external view returns (uint256);
/// @notice Get number of rewards tokens
function rewardsListLength() external view returns (uint256);
/// @notice Calculate how much in rewards are earned for a specific token and veNFT
/// @param token Address of token to fetch rewards of
/// @param tokenId Unique identifier of the veNFT
/// @return Amount of token earned in rewards
function earned(address token, uint256 tokenId) external view returns (uint256);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {IVotingEscrow} from "../interfaces/IVotingEscrow.sol";
import {SafeCastLibrary} from "./SafeCastLibrary.sol";
library DelegationLogicLibrary {
using SafeCastLibrary for int128;
/// @notice Used by `_mint`, `_transferFrom`, `_burn` and `delegate`
/// to update delegator voting checkpoints.
/// Automatically dedelegates, then updates checkpoint.
/// @dev This function depends on `_locked` and must be called prior to token state changes.
/// If you wish to dedelegate only, use `_delegate(tokenId, 0)` instead.
/// @param _locked State of all locked balances
/// @param _numCheckpoints State of all user checkpoint counts
/// @param _checkpoints State of all user checkpoints
/// @param _delegates State of all user delegatees
/// @param _delegator The delegator to update checkpoints for
/// @param _delegatee The new delegatee for the delegator. Cannot be equal to `_delegator` (use 0 instead).
/// @param _owner The new (or current) owner for the delegator
function checkpointDelegator(
mapping(uint256 => IVotingEscrow.LockedBalance) storage _locked,
mapping(uint256 => uint48) storage _numCheckpoints,
mapping(uint256 => mapping(uint48 => IVotingEscrow.Checkpoint)) storage _checkpoints,
mapping(uint256 => uint256) storage _delegates,
uint256 _delegator,
uint256 _delegatee,
address _owner
) external {
uint256 delegatedBalance = _locked[_delegator].amount.toUint256();
uint48 numCheckpoint = _numCheckpoints[_delegator];
IVotingEscrow.Checkpoint storage cpOld = numCheckpoint > 0
? _checkpoints[_delegator][numCheckpoint - 1]
: _checkpoints[_delegator][0];
// Dedelegate from delegatee if delegated
checkpointDelegatee(_numCheckpoints, _checkpoints, cpOld.delegatee, delegatedBalance, false);
IVotingEscrow.Checkpoint storage cp = _checkpoints[_delegator][numCheckpoint];
cp.fromTimestamp = block.timestamp;
cp.delegatedBalance = cpOld.delegatedBalance;
cp.delegatee = _delegatee;
cp.owner = _owner;
if (_isCheckpointInNewBlock(_numCheckpoints, _checkpoints, _delegator)) {
_numCheckpoints[_delegator]++;
} else {
_checkpoints[_delegator][numCheckpoint - 1] = cp;
delete _checkpoints[_delegator][numCheckpoint];
}
_delegates[_delegator] = _delegatee;
}
/// @notice Update delegatee's `delegatedBalance` by `balance`.
/// Only updates if delegating to a new delegatee.
/// @dev If used with `balance` == `_locked[_tokenId].amount`, then this is the same as
/// delegating or dedelegating from `_tokenId`
/// If used with `balance` < `_locked[_tokenId].amount`, then this is used to adjust
/// `delegatedBalance` when a user's balance is modified (e.g. `increaseAmount`, `merge` etc).
/// If `delegatee` is 0 (i.e. user is not delegating), then do nothing.
/// @param _numCheckpoints State of all user checkpoint counts
/// @param _checkpoints State of all user checkpoints
/// @param _delegatee The delegatee's tokenId
/// @param balance_ The delta in balance change
/// @param _increase True if balance is increasing, false if decreasing
function checkpointDelegatee(
mapping(uint256 => uint48) storage _numCheckpoints,
mapping(uint256 => mapping(uint48 => IVotingEscrow.Checkpoint)) storage _checkpoints,
uint256 _delegatee,
uint256 balance_,
bool _increase
) public {
if (_delegatee == 0) return;
uint48 numCheckpoint = _numCheckpoints[_delegatee];
IVotingEscrow.Checkpoint storage cpOld = numCheckpoint > 0
? _checkpoints[_delegatee][numCheckpoint - 1]
: _checkpoints[_delegatee][0];
IVotingEscrow.Checkpoint storage cp = _checkpoints[_delegatee][numCheckpoint];
cp.fromTimestamp = block.timestamp;
cp.owner = cpOld.owner;
// do not expect balance_ > cpOld.delegatedBalance when decrementing but just in case
cp.delegatedBalance = _increase
? cpOld.delegatedBalance + balance_
: (balance_ < cpOld.delegatedBalance ? cpOld.delegatedBalance - balance_ : 0);
cp.delegatee = cpOld.delegatee;
if (_isCheckpointInNewBlock(_numCheckpoints, _checkpoints, _delegatee)) {
_numCheckpoints[_delegatee]++;
} else {
_checkpoints[_delegatee][numCheckpoint - 1] = cp;
delete _checkpoints[_delegatee][numCheckpoint];
}
}
function _isCheckpointInNewBlock(
mapping(uint256 => uint48) storage _numCheckpoints,
mapping(uint256 => mapping(uint48 => IVotingEscrow.Checkpoint)) storage _checkpoints,
uint256 _tokenId
) internal view returns (bool) {
uint48 _nCheckPoints = _numCheckpoints[_tokenId];
if (_nCheckPoints > 0 && _checkpoints[_tokenId][_nCheckPoints - 1].fromTimestamp == block.timestamp) {
return false;
} else {
return true;
}
}
/// @notice Binary search to get the voting checkpoint for a token id at or prior to a given timestamp.
/// @dev If a checkpoint does not exist prior to the timestamp, this will return 0.
/// @param _numCheckpoints State of all user checkpoint counts
/// @param _checkpoints State of all user checkpoints
/// @param _tokenId .
/// @param _timestamp .
/// @return The index of the checkpoint.
function getPastVotesIndex(
mapping(uint256 => uint48) storage _numCheckpoints,
mapping(uint256 => mapping(uint48 => IVotingEscrow.Checkpoint)) storage _checkpoints,
uint256 _tokenId,
uint256 _timestamp
) internal view returns (uint48) {
uint48 nCheckpoints = _numCheckpoints[_tokenId];
if (nCheckpoints == 0) return 0;
// First check most recent balance
if (_checkpoints[_tokenId][nCheckpoints - 1].fromTimestamp <= _timestamp) return (nCheckpoints - 1);
// Next check implicit zero balance
if (_checkpoints[_tokenId][0].fromTimestamp > _timestamp) return 0;
uint48 lower = 0;
uint48 upper = nCheckpoints - 1;
while (upper > lower) {
uint48 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
IVotingEscrow.Checkpoint storage cp = _checkpoints[_tokenId][center];
if (cp.fromTimestamp == _timestamp) {
return center;
} else if (cp.fromTimestamp < _timestamp) {
lower = center;
} else {
upper = center - 1;
}
}
return lower;
}
/// @notice Retrieves historical voting balance for a token id at a given timestamp.
/// @dev If a checkpoint does not exist prior to the timestamp, this will return 0.
/// The user must also own the token at the time in order to receive a voting balance.
/// @param _numCheckpoints State of all user checkpoint counts
/// @param _checkpoints State of all user checkpoints
/// @param _account .
/// @param _tokenId .
/// @param _timestamp .
/// @return Total voting balance including delegations at a given timestamp.
function getPastVotes(
mapping(uint256 => uint48) storage _numCheckpoints,
mapping(uint256 => mapping(uint48 => IVotingEscrow.Checkpoint)) storage _checkpoints,
address _account,
uint256 _tokenId,
uint256 _timestamp
) external view returns (uint256) {
uint48 _checkIndex = getPastVotesIndex(_numCheckpoints, _checkpoints, _tokenId, _timestamp);
IVotingEscrow.Checkpoint memory lastCheckpoint = _checkpoints[_tokenId][_checkIndex];
// If no point exists prior to the given timestamp, return 0
if (lastCheckpoint.fromTimestamp > _timestamp) return 0;
// Check ownership
if (_account != lastCheckpoint.owner) return 0;
uint256 votes = lastCheckpoint.delegatedBalance;
return
lastCheckpoint.delegatee == 0
? votes + IVotingEscrow(address(this)).balanceOfNFTAt(_tokenId, _timestamp)
: votes;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
/// @title SafeCast Library
/// @author velodrome.finance
/// @notice Safely convert unsigned and signed integers without overflow / underflow
library SafeCastLibrary {
error SafeCastOverflow();
error SafeCastUnderflow();
/// @dev Safely convert uint256 to int128
function toInt128(uint256 value) internal pure returns (int128) {
if (value > uint128(type(int128).max)) revert SafeCastOverflow();
return int128(uint128(value));
}
/// @dev Safely convert int128 to uint256
function toUint256(int128 value) internal pure returns (uint256) {
if (value < 0) revert SafeCastUnderflow();
return uint256(int256(value));
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;
import {IVotingEscrow} from "../interfaces/IVotingEscrow.sol";
import {SafeCastLibrary} from "./SafeCastLibrary.sol";
library BalanceLogicLibrary {
using SafeCastLibrary for uint256;
using SafeCastLibrary for int128;
uint256 internal constant WEEK = 1 weeks;
/// @notice Binary search to get the user point index for a token id at or prior to a given timestamp
/// @dev If a user point does not exist prior to the timestamp, this will return 0.
/// @param _userPointEpoch State of all user point epochs
/// @param _userPointHistory State of all user point history
/// @param _tokenId .
/// @param _timestamp .
/// @return User point index
function getPastUserPointIndex(
mapping(uint256 => uint256) storage _userPointEpoch,
mapping(uint256 => IVotingEscrow.UserPoint[1000000000]) storage _userPointHistory,
uint256 _tokenId,
uint256 _timestamp
) internal view returns (uint256) {
uint256 _userEpoch = _userPointEpoch[_tokenId];
if (_userEpoch == 0) return 0;
// First check most recent balance
if (_userPointHistory[_tokenId][_userEpoch].ts <= _timestamp) return (_userEpoch);
// Next check implicit zero balance
if (_userPointHistory[_tokenId][1].ts > _timestamp) return 0;
uint256 lower = 0;
uint256 upper = _userEpoch;
while (upper > lower) {
uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
IVotingEscrow.UserPoint storage userPoint = _userPointHistory[_tokenId][center];
if (userPoint.ts == _timestamp) {
return center;
} else if (userPoint.ts < _timestamp) {
lower = center;
} else {
upper = center - 1;
}
}
return lower;
}
/// @notice Binary search to get the global point index at or prior to a given timestamp
/// @dev If a checkpoint does not exist prior to the timestamp, this will return 0.
/// @param _epoch Current global point epoch
/// @param _pointHistory State of all global point history
/// @param _timestamp .
/// @return Global point index
function getPastGlobalPointIndex(
uint256 _epoch,
mapping(uint256 => IVotingEscrow.GlobalPoint) storage _pointHistory,
uint256 _timestamp
) internal view returns (uint256) {
if (_epoch == 0) return 0;
// First check most recent balance
if (_pointHistory[_epoch].ts <= _timestamp) return (_epoch);
// Next check implicit zero balance
if (_pointHistory[1].ts > _timestamp) return 0;
uint256 lower = 0;
uint256 upper = _epoch;
while (upper > lower) {
uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
IVotingEscrow.GlobalPoint storage globalPoint = _pointHistory[center];
if (globalPoint.ts == _timestamp) {
return center;
} else if (globalPoint.ts < _timestamp) {
lower = center;
} else {
upper = center - 1;
}
}
return lower;
}
/// @notice Get the current voting power for `_tokenId`
/// @dev Adheres to the ERC20 `balanceOf` interface for Aragon compatibility
/// Fetches last user point prior to a certain timestamp, then walks forward to timestamp.
/// @param _userPointEpoch State of all user point epochs
/// @param _userPointHistory State of all user point history
/// @param _tokenId NFT for lock
/// @param _t Epoch time to return voting power at
/// @return User voting power
function balanceOfNFTAt(
mapping(uint256 => uint256) storage _userPointEpoch,
mapping(uint256 => IVotingEscrow.UserPoint[1000000000]) storage _userPointHistory,
uint256 _tokenId,
uint256 _t
) external view returns (uint256) {
uint256 _epoch = getPastUserPointIndex(_userPointEpoch, _userPointHistory, _tokenId, _t);
// epoch 0 is an empty point
if (_epoch == 0) return 0;
IVotingEscrow.UserPoint memory lastPoint = _userPointHistory[_tokenId][_epoch];
if (lastPoint.permanent != 0) {
return lastPoint.permanent;
} else {
lastPoint.bias -= lastPoint.slope * (_t - lastPoint.ts).toInt128();
if (lastPoint.bias < 0) {
lastPoint.bias = 0;
}
return lastPoint.bias.toUint256();
}
}
/// @notice Calculate total voting power at some point in the past
/// @param _slopeChanges State of all slopeChanges
/// @param _pointHistory State of all global point history
/// @param _epoch The epoch to start search from
/// @param _t Time to calculate the total voting power at
/// @return Total voting power at that time
function supplyAt(
mapping(uint256 => int128) storage _slopeChanges,
mapping(uint256 => IVotingEscrow.GlobalPoint) storage _pointHistory,
uint256 _epoch,
uint256 _t
) external view returns (uint256) {
uint256 epoch_ = getPastGlobalPointIndex(_epoch, _pointHistory, _t);
// epoch 0 is an empty point
if (epoch_ == 0) return 0;
IVotingEscrow.GlobalPoint memory _point = _pointHistory[epoch_];
int128 bias = _point.bias;
int128 slope = _point.slope;
uint256 ts = _point.ts;
uint256 t_i = (ts / WEEK) * WEEK;
for (uint256 i = 0; i < 255; ++i) {
t_i += WEEK;
int128 dSlope = 0;
if (t_i > _t) {
t_i = _t;
} else {
dSlope = _slopeChanges[t_i];
}
bias -= slope * (t_i - ts).toInt128();
if (t_i == _t) {
break;
}
slope += dSlope;
ts = t_i;
}
if (bias < 0) {
bias = 0;
}
return bias.toUint256() + _point.permanentLockBalance;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IManagedRewardsFactory {
event ManagedRewardCreated(
address indexed voter,
address indexed lockedManagedReward,
address indexed freeManagedReward
);
/// @notice creates a LockedManagedReward and a FreeManagedReward contract for a managed veNFT
/// @param _forwarder Address of trusted forwarder
/// @param _voter Address of Voter.sol
/// @return lockedManagedReward Address of LockedManagedReward contract created
/// @return freeManagedReward Address of FreeManagedReward contract created
function createRewards(
address _forwarder,
address _voter
) external returns (address lockedManagedReward, address freeManagedReward);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IFactoryRegistry {
error FallbackFactory();
error InvalidFactoriesToPoolFactory();
error PathAlreadyApproved();
error PathNotApproved();
error SameAddress();
error ZeroAddress();
event Approve(address indexed poolFactory, address indexed votingRewardsFactory, address indexed gaugeFactory);
event Unapprove(address indexed poolFactory, address indexed votingRewardsFactory, address indexed gaugeFactory);
event SetManagedRewardsFactory(address indexed _newRewardsFactory);
/// @notice Approve a set of factories used in the Protocol.
/// Router.sol is able to swap any poolFactories currently approved.
/// Cannot approve address(0) factories.
/// Cannot aprove path that is already approved.
/// Each poolFactory has one unique set and maintains state. In the case a poolFactory is unapproved
/// and then re-approved, the same set of factories must be used. In other words, you cannot overwrite
/// the factories tied to a poolFactory address.
/// VotingRewardsFactories and GaugeFactories may use the same address across multiple poolFactories.
/// @dev Callable by onlyOwner
/// @param poolFactory .
/// @param votingRewardsFactory .
/// @param gaugeFactory .
function approve(address poolFactory, address votingRewardsFactory, address gaugeFactory) external;
/// @notice Unapprove a set of factories used in the Protocol.
/// While a poolFactory is unapproved, Router.sol cannot swap with pools made from the corresponding factory
/// Can only unapprove an approved path.
/// Cannot unapprove the fallback path (core v2 factories).
/// @dev Callable by onlyOwner
/// @param poolFactory .
function unapprove(address poolFactory) external;
/// @notice Factory to create free and locked rewards for a managed veNFT
function managedRewardsFactory() external view returns (address);
/// @notice Set the rewards factory address
/// @dev Callable by onlyOwner
/// @param _newManagedRewardsFactory address of new managedRewardsFactory
function setManagedRewardsFactory(address _newManagedRewardsFactory) external;
/// @notice Get the factories correlated to a poolFactory.
/// Once set, this can never be modified.
/// Returns the correlated factories even after an approved poolFactory is unapproved.
function factoriesToPoolFactory(
address poolFactory
) external view returns (address votingRewardsFactory, address gaugeFactory);
/// @notice Get all PoolFactories approved by the registry
/// @dev The same PoolFactory address cannot be used twice
/// @return Array of PoolFactory addresses
function poolFactories() external view returns (address[] memory);
/// @notice Check if a PoolFactory is approved within the factory registry. Router uses this method to
/// ensure a pool swapped from is approved.
/// @param poolFactory .
/// @return True if PoolFactory is approved, else false
function isPoolFactoryApproved(address poolFactory) external view returns (bool);
/// @notice Get the length of the poolFactories array
function poolFactoriesLength() external view returns (uint256);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
/// Modified IVotes interface for tokenId based voting
interface IVotes {
/**
* @dev Emitted when an account changes their delegate.
*/
event DelegateChanged(address indexed delegator, uint256 indexed fromDelegate, uint256 indexed toDelegate);
/**
* @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.
*/
event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);
/**
* @dev Returns the amount of votes that `tokenId` had at a specific moment in the past.
* If the account passed in is not the owner, returns 0.
*/
function getPastVotes(address account, uint256 tokenId, uint256 timepoint) external view returns (uint256);
/**
* @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is
* configured to use block numbers, this will return the value the end of the corresponding block.
*
* NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.
* Votes that have not been delegated are still part of total supply, even though they would not participate in a
* vote.
*/
function getPastTotalSupply(uint256 timepoint) external view returns (uint256);
/**
* @dev Returns the delegate that `tokenId` has chosen. Can never be equal to the delegator's `tokenId`.
* Returns 0 if not delegated.
*/
function delegates(uint256 tokenId) external view returns (uint256);
/**
* @dev Delegates votes from the sender to `delegatee`.
*/
function delegate(uint256 delegator, uint256 delegatee) external;
/**
* @dev Delegates votes from `delegator` to `delegatee`. Signer must own `delegator`.
*/
function delegateBySig(
uint256 delegator,
uint256 delegatee,
uint256 nonce,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)
pragma solidity ^0.8.0;
interface IERC6372 {
/**
* @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).
*/
function clock() external view returns (uint48);
/**
* @dev Description of the clock
*/
// solhint-disable-next-line func-name-mixedcase
function CLOCK_MODE() external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (metatx/ERC2771Context.sol)
pragma solidity ^0.8.9;
import "../utils/Context.sol";
/**
* @dev Context variant with ERC2771 support.
*
* WARNING: The usage of `delegatecall` in this contract is dangerous and may result in context corruption.
* Any forwarded request to this contract triggering a `delegatecall` to itself will result in an invalid {_msgSender}
* recovery.
*/
abstract contract ERC2771Context is Context {
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
address private immutable _trustedForwarder;
/// @custom:oz-upgrades-unsafe-allow constructor
constructor(address trustedForwarder) {
_trustedForwarder = trustedForwarder;
}
function isTrustedForwarder(address forwarder) public view virtual returns (bool) {
return forwarder == _trustedForwarder;
}
function _msgSender() internal view virtual override returns (address) {
uint256 calldataLength = msg.data.length;
uint256 contextSuffixLength = _contextSuffixLength();
if (isTrustedForwarder(msg.sender) && calldataLength >= contextSuffixLength) {
return address(bytes20(msg.data[calldataLength - contextSuffixLength:]));
} else {
return super._msgSender();
}
}
function _msgData() internal view virtual override returns (bytes calldata) {
uint256 calldataLength = msg.data.length;
uint256 contextSuffixLength = _contextSuffixLength();
if (isTrustedForwarder(msg.sender) && calldataLength >= contextSuffixLength) {
return msg.data[:calldataLength - contextSuffixLength];
} else {
return super._msgData();
}
}
/**
* @dev ERC-2771 specifies the context as being a single address (20 bytes).
*/
function _contextSuffixLength() internal view virtual override returns (uint256) {
return 20;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC4906.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
import "./IERC721.sol";
/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC165, IERC721 {
/// @dev This event emits when the metadata of a token is changed.
/// So that the third-party platforms such as NFT market could
/// timely update the images and related attributes of the NFT.
event MetadataUpdate(uint256 _tokenId);
/// @dev This event emits when the metadata of a range of tokens is changed.
/// So that the third-party platforms such as NFT market could
/// timely update the images and related attributes of the NFTs.
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"mode": "3",
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
},
"detectMissingLibraries": false,
"forceEVMLA": false,
"enableEraVMExtensions": false,
"codegen": "yul",
"libraries": {
"contracts/art/PerlinNoise.sol": {
"PerlinNoise": "0x25B11E6e5b2d1A7309A98274b459d4d0081c85Ef"
},
"contracts/art/Trig.sol": {
"Trig": "0x00b2Ed8c1c84B02614B3579fF830b9aDbd52f273"
},
"contracts/libraries/BalanceLogicLibrary.sol": {
"BalanceLogicLibrary": "0x58025B26C518ac345bA1476B050BAb9f4A20B35d"
},
"contracts/libraries/DelegationLogicLibrary.sol": {
"DelegationLogicLibrary": "0x2A7Db0012bfE811a79b6888800D6E1aDc0d8c10C"
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_factoryRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyVoted","type":"error"},{"inputs":[],"name":"AmountTooBig","type":"error"},{"inputs":[],"name":"ERC721ReceiverRejectedTokens","type":"error"},{"inputs":[],"name":"ERC721TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"InvalidManagedNFTId","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidSignatureS","type":"error"},{"inputs":[],"name":"LockDurationNotInFuture","type":"error"},{"inputs":[],"name":"LockDurationTooLong","type":"error"},{"inputs":[],"name":"LockExpired","type":"error"},{"inputs":[],"name":"LockNotExpired","type":"error"},{"inputs":[],"name":"NoLockFound","type":"error"},{"inputs":[],"name":"NonExistentToken","type":"error"},{"inputs":[],"name":"NotApprovedOrOwner","type":"error"},{"inputs":[],"name":"NotDistributor","type":"error"},{"inputs":[],"name":"NotEmergencyCouncilOrGovernor","type":"error"},{"inputs":[],"name":"NotGovernor","type":"error"},{"inputs":[],"name":"NotGovernorOrManager","type":"error"},{"inputs":[],"name":"NotLockedNFT","type":"error"},{"inputs":[],"name":"NotManagedNFT","type":"error"},{"inputs":[],"name":"NotManagedOrNormalNFT","type":"error"},{"inputs":[],"name":"NotNormalNFT","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotPermanentLock","type":"error"},{"inputs":[],"name":"NotTeam","type":"error"},{"inputs":[],"name":"NotVoter","type":"error"},{"inputs":[],"name":"OwnershipChange","type":"error"},{"inputs":[],"name":"PermanentLock","type":"error"},{"inputs":[],"name":"SafeCastOverflow","type":"error"},{"inputs":[],"name":"SafeCastUnderflow","type":"error"},{"inputs":[],"name":"SameAddress","type":"error"},{"inputs":[],"name":"SameNFT","type":"error"},{"inputs":[],"name":"SameState","type":"error"},{"inputs":[],"name":"SignatureExpired","type":"error"},{"inputs":[],"name":"SplitNoOwner","type":"error"},{"inputs":[],"name":"SplitNotAllowed","type":"error"},{"inputs":[],"name":"TooManyTokenIDs","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[],"name":"ZeroBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_mTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_lockedManagedReward","type":"address"},{"indexed":false,"internalType":"address","name":"_freeManagedReward","type":"address"}],"name":"CreateManaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"uint256","name":"fromDelegate","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toDelegate","type":"uint256"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"enum IVotingEscrow.DepositType","name":"depositType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"locktime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_mTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_weight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ts","type":"uint256"}],"name":"DepositManaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ts","type":"uint256"}],"name":"LockPermanent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"_from","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_to","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountFrom","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountTo","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountFinal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_locktime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ts","type":"uint256"}],"name":"Merge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_allowedManager","type":"address"}],"name":"SetAllowedManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_from","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId1","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId2","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_splitAmount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_splitAmount2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_locktime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ts","type":"uint256"}],"name":"Split","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"Supply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ts","type":"uint256"}],"name":"UnlockPermanent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_mTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_weight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ts","type":"uint256"}],"name":"WithdrawManaged","type":"event"},{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"balanceOfNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_t","type":"uint256"}],"name":"balanceOfNFTAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canSplit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint256","name":"fromTimestamp","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"delegatedBalance","type":"uint256"},{"internalType":"uint256","name":"delegatee","type":"uint256"}],"internalType":"struct IVotingEscrow.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_lockDuration","type":"uint256"}],"name":"createLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_lockDuration","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"createLockFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"createManagedLockFor","outputs":[{"internalType":"uint256","name":"_mTokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deactivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"delegator","type":"uint256"},{"internalType":"uint256","name":"delegatee","type":"uint256"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"delegator","type":"uint256"},{"internalType":"uint256","name":"delegatee","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"delegator","type":"uint256"}],"name":"delegates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_mTokenId","type":"uint256"}],"name":"depositManaged","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"escrowType","outputs":[{"internalType":"enum IVotingEscrow.EscrowType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToManaged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_lockDuration","type":"uint256"}],"name":"increaseUnlockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"lockPermanent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"locked","outputs":[{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bool","name":"isPermanent","type":"bool"}],"internalType":"struct IVotingEscrow.LockedBalance","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"managedToFree","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"managedToLocked","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numCheckpoints","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerToNFTokenIdList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permanentLockBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_loc","type":"uint256"}],"name":"pointHistory","outputs":[{"components":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"},{"internalType":"uint256","name":"permanentLockBalance","type":"uint256"}],"internalType":"struct IVotingEscrow.GlobalPoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_allowedManager","type":"address"}],"name":"setAllowedManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxy","type":"address"}],"name":"setArtProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mTokenId","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setManagedState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_team","type":"address"}],"name":"setTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"},{"internalType":"address","name":"_distributor","type":"address"}],"name":"setVoterAndDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"slopeChanges","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"split","outputs":[{"internalType":"uint256","name":"_tokenId1","type":"uint256"},{"internalType":"uint256","name":"_tokenId2","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_bool","type":"bool"}],"name":"toggleSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unlockPermanent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userPointEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_loc","type":"uint256"}],"name":"userPointHistory","outputs":[{"components":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"},{"internalType":"uint256","name":"permanent","type":"uint256"}],"internalType":"struct IVotingEscrow.UserPoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_voted","type":"bool"}],"name":"voting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"weights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawManaged","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000fef548c9be8565a69ed109c8b738e091497a5e6d4f00fc536157ff9f9ba000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003f91b806f1968fca85c08a7ee9a7262d7207a9c10000000000000000000000004c68e4102c0f120cce9f08625bd12079806b7c4d0000000000000000000000005927e0c4b307af16260327de3276ce17d8a4ab49
Deployed Bytecode
0x00020000000000020016000000000002000000000801034f0001000000010355000000600110027000000ed00010019d00000ed00110019700000001002001900000004f0000c13d0000008002000039000000400020043f000000040010008c000020020000413d000000000208043b000000e00220027000000ee10020009c0000013a0000213d00000f190020009c0000014d0000213d00000f350020009c000002920000213d00000f430020009c000003960000213d00000f4a0020009c000004fc0000a13d00000f4b0020009c000005ee0000613d00000f4c0020009c000007530000613d00000f4d0020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b0000000d04000029000000430000c13d000000140220008c000000430000413d0000000101200367000000000101043b00000060011002700000000302000039000000000302041a000000000113013f00000ed30010019800000c710000c13d000000000004004b000009f40000613d00000ed401300197000000000141019f000000000012041b000000000100001900003b350001042e0000000002000416000000000002004b000020020000c13d0000001f0210003900000ed1022001970000010002200039000000400020043f0000001f0310018f00000ed2041001980000010002400039000000600000613d0000010005000039000000000608034f000000006706043c0000000005750436000000000025004b0000005c0000c13d000000000003004b0000006d0000613d000000000448034f0000000303300210000000000502043300000000053501cf000000000535022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000353019f0000000000320435000000600010008c000020020000413d000001000100043d00000ed30010009c000020020000213d000001200200043d00000ed30020009c000020020000213d000001400300043d00000ed30030009c000020020000213d000000800010043f0000000104000039000000000040041b000000a00010043f000000e00020043f000000c00030043f000000000100041100000ed3011001970000000302000039000000000302041a00000ed403300197000000000313019f000000000032041b0000000202000039000000000302041a00000ed403300197000000000113019f000000000012041b000000000000043f0000000601000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000d00000001001d00000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000d020000290000000202200039000000000012041b00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000d020000290000000102200039000000000012041b00000ed901000041000000000010043f0000000701000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd0220019700000001022001bf000000000021041b00000eda01000041000000000010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd0220019700000001022001bf000000000021041b00000edb01000041000000000010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd0220019700000001022001bf000000000021041b00000edc01000041000000000010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd0220019700000001022001bf000000000021041b00000edd01000041000000000010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd0220019700000001022001bf000000000021041b0000000801000039000000000701041a000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d020000390000000403000039000000000600041000000edf040000410000000005000019000d00000007001d3b343b250000040f0000000100200190000020020000613d000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d02000039000000040300003900000edf04000041000000000500041000000000060000190000000d070000293b343b250000040f0000000100200190000020020000613d000000800100043d00000140000004430000016000100443000000a00100043d00000020020000390000018000200443000001a000100443000000c00100043d0000004003000039000001c000300443000001e0001004430000006001000039000000e00300043d0000020000100443000002200030044300000100002004430000000401000039000001200010044300000ee00100004100003b350001042e00000ee20020009c000001650000213d00000efe0020009c000002c40000213d00000f0c0020009c000003a80000213d00000f130020009c000005050000a13d00000f140020009c00000b0d0000613d00000f150020009c0000075d0000613d00000f160020009c000020020000c13d0000000001000416000000000001004b000020020000c13d000000030100003900000b8d0000013d00000f1a0020009c000003650000213d00000f280020009c000003b50000213d00000f2f0020009c000005220000a13d00000f300020009c00000b200000613d00000f310020009c0000077b0000613d00000f320020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b00000ed30010009c000020020000213d000000000010043f0000001c0100003900000c350000013d00000ee30020009c000003790000213d00000ef10020009c000003e50000213d00000ef80020009c000005c30000a13d00000ef90020009c00000b370000613d00000efa0020009c000007860000613d00000efb0020009c000020020000c13d0000000001000416000000000001004b000020020000c13d000000000100041a000000020010008c00000b2d0000613d0000000201000039000000000010041b000000800000043f000000a00000043f000000c00000043f000000e00000043f000001000000043f000001200000043f000001400000043f000001600000043f000001800000043f000001a00000043f000001c00000043f000001e00000043f000002000000043f000002200000043f000002400000043f000002600000043f0000001601000039000000000101041a000b00000001001d0000032001000039000000400010043f000002800000043f000002a00000043f00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000700000001001d000002c00010043f00000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000501043b000002e00050043f000003000000043f0000000b01000029000000000001004b000600000005001d00000fc80000c13d000d02800000003d000303000000003d000802e00000003d000c02a00000003d000902c00000003d000002a00200043d000002800100043d000002c00300043d000a00000003001d00000000040000190000000003050019000000400500043d00000f760050009c000015280000213d000000a006500039000000400060043f0000008006500039000000000046043500000f520420019700000f530020019800000f54020000410000000002006019000000000242019f0000002004500039000000000024043500000f520210019700000f530010019800000f54010000410000000001006019000000000121019f0000006002500039000100000002001d000000000032043500000000001504350000004001500039000200000001001d0000000a02000029000000000021043500000009010000290000000001010433000000070110006b000400000000001d000001e40000a13d00000008020000290000000002020433000000060320006b00000e070000413d00000f77023000d100000f770420012a000000000034004b00000e070000c13d00040000001200e10000000a0200002900000f781020012a0000000002120049000600000000001d0007000b0000002d000b0f7a002000a400000e070000813d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000801043b0000000b03000029000000000083004b000000000100001900000000020000190000000007080019000002130000213d000500000008001d000000000030043f0000001b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000f520120019700000f530020019800000f54020000410000000002006019000000000212019f0000000b0700002900000005080000290000000a0470006c00000e070000413d00000f520040009c000015e80000213d0000000c03000029000000000303043300000f520530019700000f530030019800000f54030000410000000003006019000000000353019f00000000044300a900000f530040019800000f5405000041000000000500601900000f5206400197000000000565019f000000000045004b00000e070000c13d0000000d05000029000000000505043300000f520650019700000f530050019800000f54050000410000000005006019000000000565019f000000000445004900000f530540009a00000f600050009c00000e070000413d00000f520540019700000f530440019800000f54060000410000000006006019000000000556019f0000000d06000029000000000056043500000f530020019800000f54020000410000000002006019000000000112019f000000000113001900000f530210009a00000f600020009c00000e070000413d00000f520210019700000f530110019800000f54030000410000000003006019000000000223019f0000000c030000290000000000230435000000000004004b0000024b0000613d0000000d020000290000000000020435000000000001004b0000024f0000613d0000000c0100002900000000000104350000000901000029000000000071043500000002010000290000000001010433000000000217004b00000e070000413d0000000101000029000000000101043300000004032000b9000000040000006b0000025d0000613d00000004043000fa000000000024004b00000e070000c13d00000f770230012a000000000012001a00000e070000413d0000000001120019000000080200002900000000001204350000000701000029000000010110003a00000e070000613d000500000007001d000000000087004b000b00000001001d000016ca0000613d000000000010043f0000000601000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000d02000029000000000202043300000f5f022001970000000c0300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b000000090200002900000000020204330000000103100039000000000023041b000000080200002900000000020204330000000203100039000000000023041b000000030110003900000003020000290000000002020433000000000021041b0000000601000029000000fe0010008c000600010010003d0000000502000029000a00000002001d000001e80000413d000016d80000013d00000f360020009c000004190000213d00000f3d0020009c000005d70000a13d00000f3e0020009c00000b800000613d00000f3f0020009c0000078b0000613d00000f400020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000201043b000000000100041a000000020010008c00000b2d0000613d000d00000002001d0000000201000039000000000010041b00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000010070000c13d000000140320008c0000000d02000029000010080000413d0000000101300367000000000101043b0000006001100270000010080000013d00000eff0020009c000004440000213d00000f060020009c000005ea0000a13d00000f070020009c0000074a0000613d00000f080020009c000007bf0000613d00000f090020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000201043b000000000100041a000000020010008c00000b2d0000613d000d00000002001d0000000201000039000000000010041b00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b0000000001030019000002f60000c13d000000140220008c0000000001030019000002f60000413d0000000101200367000000000101043b0000006001100270000c00000003001d0000000d020000293b34249a0000040f000000000001004b0000100c0000613d0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000000000001004b000015ee0000c13d0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000b00000002001d00000f5d0020009c000015280000213d000000000101043b0000000b040000290000006002400039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f00000000032404360000000102100039000000000202041a000a00000003001d000000000023043500000040024000390000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000900000002001d000000000012043500000fa20000c13d00000024010000390000000101100367000000000101043b000800000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000201043b0000000801200029000000000021004b00000e070000413d0000000a030000290000000003030433000000000023004b000019c80000a13d0000000b04000029000000000404043300000f520540019700000f530040019800000f54040000410000000004006019000000000454019f00000f5e0040009c000017420000213d000000000004004b000017420000613d00000f784010012a0000000001410049000000000031004b00001bfb0000a13d00000f840220009c00000e070000813d000000000021004b00001f4f0000a13d000000400100043d00000f8502000041000015f00000013d00000f1b0020009c000004d70000213d00000f220020009c000005f30000a13d00000f230020009c00000b920000613d00000f240020009c0000082f0000613d00000f250020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b000000000010043f0000000b01000039000006930000013d00000ee40020009c000004e90000213d00000eeb0020009c000005fc0000a13d00000eec0020009c00000bd80000613d00000eed0020009c0000083e0000613d00000eee0020009c000020020000c13d0000000002000416000000000002004b000020020000c13d3b3423fe0000040f000d00000002001d00000ed301100197000000000010043f0000001201000039000000200010043f000000400200003900000000010000193b343af20000040f0000000d020000293b34240e0000040f000000000101041a000000ff001001900000000001000039000000010100c03900000b060000013d00000f440020009c000006230000a13d00000f450020009c00000bdf0000613d00000f460020009c0000086b0000613d00000f470020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000000a0100003900000b180000013d00000f0d0020009c000006840000a13d00000f0e0020009c0000074a0000613d00000f0f0020009c000008770000613d00000f100020009c000020020000c13d0000000001000416000000000001004b000020020000c13d000000160100003900000b1c0000013d00000f290020009c000006a00000a13d00000f2a0020009c00000be40000613d00000f2b0020009c000008810000613d00000f2c0020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000201043b000000000100041a000000020010008c00000b2d0000613d000d00000002001d0000000201000039000000000010041b00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b0000106e0000c13d000000140120008c0000000d020000290000106f0000413d0000000101100367000000000101043b00000060031002700000106f0000013d00000ef20020009c000006b40000a13d00000ef30020009c00000c020000613d00000ef40020009c000008860000613d00000ef50020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000002401800370000000000301043b0000000401800370000000000201043b000000000100041a000000020010008c00000b2d0000613d000d00000003001d000c00000002001d0000000201000039000000000010041b00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000010830000c13d000000140220008c0000000d030000290000000204000039000010850000413d0000000101200367000000000101043b0000006001100270000010850000013d00000f370020009c000006e30000a13d00000f380020009c00000c250000613d00000f390020009c000008910000613d00000f3a0020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b00000e7a0000c13d000000140320008c0000000d0200002900000e7b0000413d0000000101300367000000000101043b000000600110027000000e7b0000013d00000f000020009c000006ec0000a13d00000f010020009c00000c2c0000613d00000f020020009c000008c90000613d00000f030020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000002401800370000000000301043b0000000401800370000000000201043b000000000100041a000000020010008c00000b2d0000613d000c00000003001d000d00000002001d0000000201000039000000000010041b00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b0000000001030019000004770000c13d000000140220008c0000000001030019000004770000413d0000000101200367000000000101043b0000006001100270000b00000003001d0000000d020000293b34249a0000040f000000000001004b0000100c0000613d0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000a00000001001d000000010010008c000006810000613d0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000900000002001d00000f5d0020009c000015280000213d000000000301043b00000009050000290000006001500039000000400010043f000000000203041a00000f520120019700000f530020019800000f54020000410000000002006019000000000412019f0000000006450436000000400550003900000002043000390000000103300039000000000303041a000600000006001d000700000003001d0000000000360435000000000304041a000000ff003001900000000003000039000000010300c039000800000005001d00000000003504350000000c0000006b000016ae0000613d00000f530020019800000f54020000410000000002006019000000000112019f00000f5e0010009c000017420000213d000000000001004b000017420000613d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d00000008020000290000000002020433000000000101043b000000070010006b000018430000a13d000000000002004b000018450000c13d0000184b0000013d00000f1c0020009c000006fa0000a13d00000f1d0020009c00000c400000613d00000f1e0020009c000008d30000613d00000f1f0020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000000f0100003900000b890000013d00000ee50020009c000007030000a13d00000ee60020009c00000c5b0000613d00000ee70020009c0000090b0000613d00000ee80020009c000020020000c13d0000000001000416000000000001004b000020020000c13d0000000001000412000f00000001001d000e00600000003d0000800501000039000000440300003900000000040004150000000f0440008a000009150000013d00000f4e0020009c000009190000613d00000f4f0020009c000020020000c13d0000000001000416000000000001004b000020020000c13d000000170100003900000b1c0000013d00000f170020009c000009250000613d00000f180020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c00000b060000a13d0000150b0000013d00000f330020009c000009310000613d00000f340020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b000d00000001001d0000002401800370000000000101043b000c00000001001d000000010010008c000020020000213d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b00000000040300190000054e0000c13d000000140120008c00000000040300190000054e0000413d0000000101100367000000000101043b0000006004100270000a00000004001d000800000003001d0000000201000039000000000201041a000000400300043d000b00000003001d00000fa901000041000000000013043500000ed00030009c00000ed00100004100000000010340190000004001100210000000000300041400000ed00030009c00000ed003008041000000c003300210000000000113019f00000f6c011001c700000ed302200197000900000002001d3b343b2a0000040f0000000b0b000029000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000005730000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000056f0000c13d000000000006004b000005800000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000f530000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000015280000213d0000000100200190000015280000c13d000000400010043f000000200030008c000020020000413d00000000010b043300000ed30010009c000020020000213d0000000a0200002900000ed302200197000000000012004b0000152e0000c13d0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000015110000c13d0000000d01000029000000000010043f0000000c01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000c0000006b00000000020000390000000102006039000000000101043b000000000101041a000000ff001001900000000001000039000000010100c039000000000012004b000018400000613d000000400100043d00000fac02000041000015f00000013d00000efc0020009c000009680000613d00000efd0020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d3b3424650000040f3b34244a0000040f00000001030003670000002402300370000000000202043b0000000403300370000000000303043b00000000040100190000000001030019000000000304001900000b030000013d00000f410020009c0000098e0000613d00000f420020009c000020020000c13d0000000002000416000000000002004b000020020000c13d3b3423ec0000040f000d00000001001d000c00000002001d000b00000003001d3b34244a0000040f00000000040100190000000d010000290000000c020000290000000b030000293b3424e80000040f000000000100001900003b350001042e00000f0a0020009c000009950000613d00000f0b0020009c000020020000c13d0000000001000416000000000001004b000020020000c13d3b3423a40000040f00000ae30000013d00000f260020009c000009a30000613d00000f270020009c000020020000c13d0000000001000416000000000001004b000020020000c13d0000001d0100003900000b1c0000013d00000eef0020009c000009b20000613d00000ef00020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b00000f5f0000c13d000000140320008c0000000d0200002900000f600000413d0000000101300367000000000101043b000000600110027000000f600000013d00000f480020009c000009bc0000613d00000f490020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000201043b000000000100041a000000020010008c00000b2d0000613d0000000201000039000000000010041b000d00000002001d000000000020043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000030010008c0000150b0000813d000000020010008c000006650000c13d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000006600000c13d000000140220008c000006600000413d0000000101200367000000000101043b00000060011002700000000102000039000000000202041a000000000112013f00000ed300100198000015140000c13d00000024010000390000000101100367000000000101043b000c00000001001d0000000001000415000b00000001001d0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000a00000001001d000000020010008c0000150b0000213d0000000a01000029000000010010008c000015170000c13d000000400100043d00000fc502000041000015f00000013d00000f110020009c000009f70000613d00000f120020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b00000ed30010009c000020020000213d000000000010043f0000001401000039000000200010043f00000040020000390000000001000019000d0000000803533b343af20000040f0000000d0200035f0000002402200370000000000202043b000000000020043f000000200010043f0000000001000019000000400200003900000b1b0000013d00000f2d0020009c00000a070000613d00000f2e0020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b00000ed30010009c000020020000213d0000002402800370000000000202043b3b34249a0000040f000000000001004b0000000001000039000000010100c03900000b060000013d00000ef60020009c00000a1d0000613d00000ef70020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000002401800370000000000201043b0000000401800370000000000301043b000000000100041a000000020010008c00000b2d0000613d000d00000003001d000c00000002001d0000000201000039000000000010041b00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b000011070000c13d000000140120008c0000000d02000029000011080000413d0000000101100367000000000101043b0000006003100270000011080000013d00000f3b0020009c00000a3d0000613d00000f3c0020009c000020020000c13d0000000001000416000000000001004b000020020000c13d000000050100003900000b8d0000013d00000f040020009c00000a800000613d00000f050020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000000d0100003900000b890000013d00000f200020009c00000adf0000613d00000f210020009c000020020000c13d0000000001000416000000000001004b000020020000c13d000000040100003900000b8d0000013d00000ee90020009c00000af20000613d00000eea0020009c000020020000c13d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000002401800370000000000101043b000d00000001001d00000f550010009c000020020000213d00000080010000393b34238e0000040f000000800000043f000000a00000043f000000c00000043f000000e00000043f00000004010000390000000101100367000000000101043b000000000010043f0000002001000039000000200010043f000000400200003900000000010000193b343af20000040f0000000d02000029000000000020043f000000200010043f000000000100001900000040020000393b343af20000040f000d00000001001d000000400100043d000c00000001001d3b34238e0000040f0000000d05000029000000000105041a0000000c0600002900000000021604360000000103500039000000000303041a00000ed30330019700000000003204350000000203500039000000000303041a0000004004600039000000000034043500000060036000390000000305500039000000000505041a0000000000530435000000400500043d0000000001150436000000000202043300000ed302200197000000000021043500000000010404330000004002500039000000000012043500000000010304330000006002500039000000000012043500000ed00050009c00000ed005008041000000400150021000000f56011001c700003b350001042e0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b3b3437c90000040f00000b060000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f000000110100003900000b890000013d0000000002000416000000000002004b000020020000c13d000000e40010008c000020020000413d0000006401800370000000000101043b000b00000001001d0000004401800370000000000101043b000c00000001001d0000002401800370000000000101043b000a00000001001d0000000401800370000000000101043b000d00000001001d0000008401800370000000000101043b000900000001001d000000ff0010008c000020020000213d000000c401800370000000000101043b00000f8c0010009c00000c740000413d00000f9a01000041000000800010043f00000f9b0100004100003b36000104300000000001000416000000000001004b000020020000c13d0000000001000412001500000001001d001400400000003d000080050100003900000044030000390000000004000415000000150440008a000009150000013d0000000001000416000000000001004b000020020000c13d000000010100003900000b8d0000013d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d0000002401800370000000000101043b000c00000001001d00000ed30010009c000020020000213d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000007b30000c13d000000140220008c000007b30000413d0000000101200367000000000101043b00000060011002700000000202000039000000000302041a000000000113013f00000ed3001001980000136f0000c13d00000ed4013001970000000d011001af000000000012041b0000000101000039000000000201041a00000ed402200197000008c70000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b000007e20000c13d000000140120008c000007e20000413d0000000101100367000000000101043b0000006003100270000b00000003001d0000000201000039000000000201041a000000400300043d000c00000003001d00000f8601000041000000000013043500000ed00030009c00000ed00100004100000000010340190000004001100210000000000300041400000ed00030009c00000ed003008041000000c003300210000000000113019f00000f6c011001c700000ed3022001973b343b2a0000040f0000000c0b000029000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000008050000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000008010000c13d000000000006004b000008120000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000e190000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000015280000213d0000000100200190000015280000c13d000000400010043f000000200030008c000020020000413d00000000020b043300000ed30020009c000020020000213d0000000b0300002900000ed303300197000000000023004b0000158c0000c13d0000000502000039000000000302041a00000ed3043001970000000d0040006b000015f60000c13d00000f8a02000041000015f00000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000002101000039000000200010043f000000400200003900000000010000193b343af20000040f000000000101041a0000099f0000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d000000000010043f0000001301000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000c00000001001d00000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000c0010006b00000e250000c13d000000400100043d0000000002000019000000000021043500000ed00010009c00000ed001008041000000400110021000000f57011001c700003b350001042e0000000001000416000000000001004b000020020000c13d0000800b0100003900000004030000390000000004000415000000160440008a000000050440021000000ed8020000413b343b070000040f3b3437c90000040f00000b060000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000001e0100003900000c350000013d0000000001000416000000000001004b000020020000c13d000000020100003900000b8d0000013d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b0000002402800370000000000202043b3b34375a0000040f00000b060000013d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d0000002401800370000000000101043b000c00000001001d000000010010008c000020020000213d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000008b90000c13d000000140220008c000008b90000413d0000000101200367000000000101043b00000060011002700000000302000039000000000202041a000000000112013f00000ed30010019800000c710000c13d0000000d01000029000000000010043f0000001c01000039000000200010043f000000400200003900000000010000193b343af20000040f000000000201041a00000fcd022001970000000c03000029000009070000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000001f0100003900000b180000013d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000002401800370000000000101043b000d00000001001d000000010010008c000020020000213d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000008f60000c13d000000140220008c000008f60000413d0000000101200367000000000101043b00000060011002700000000202000039000000000202041a000000000112013f00000ed3001001980000136f0000c13d00000004010000390000000101100367000000000101043b000000000010043f0000001e01000039000000200010043f000000400200003900000000010000193b343af20000040f000000000301041a00000fcd023001970000000d03000029000000000232019f000000000021041b000000000100001900003b350001042e0000000001000416000000000001004b000020020000c13d0000000001000412001100000001001d001000200000003d000080050100003900000044030000390000000004000415000000110440008a000000050440021000000f50020000413b343b070000040f00000b8e0000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b00000fcc00100198000020020000c13d000000000010043f000000070100003900000c350000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b00000ed30010009c000020020000213d000000000010043f000000100100003900000b180000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000201043b000000000100041a000000020010008c00000b2d0000613d0000000201000039000000000010041b000d00000002001d000000000020043f0000000a01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000c00000001001d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000013650000c13d000000140220008c0000000203000039000013660000413d0000000101200367000000000101043b0000006001100270000013660000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d3b3429520000040f00000004010000390000000101100367000000000101043b000000000010043f0000001801000039000000200010043f000000400200003900000000010000193b343af20000040f3b34247c0000040f000000003201043400000f520420019700000f530020019800000f54020000410000000002006019000000000242019f000000400400043d00000000022404360000000003030433000000000032043500000040011000390000000001010433000000000001004b0000000001000039000000010100c0390000004002400039000000000012043500000ed00040009c00000ed004008041000000400140021000000f7c011001c700003b350001042e0000000001000416000000000001004b000020020000c13d00000f9301000041000000800010043f00000f510100004100003b350001042e0000000001000416000000000001004b000020020000c13d0000800b0100003900000004030000390000000004000415000000160440008a000000050440021000000ed8020000413b343b070000040f00000f5501100197000000800010043f00000f510100004100003b350001042e0000000001000416000000000001004b000020020000c13d00000080010000393b3423990000040f0000000e01000039000000800010043f00000f9e01000041000000a00010043f0000002001000039000000400200043d000d00000002001d0000000002120436000000800100003900000ae70000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000001a0100003900000b180000013d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d0000002401800370000000000101043b000c00000001001d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b000009e20000c13d000000140120008c000009e20000413d0000000101100367000000000101043b0000006003100270000b00000003001d0000000c01000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a00000ed302100198000011470000c13d000000400100043d00000f8902000041000015f00000013d0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d3b3429630000040f00000004010000390000000101100367000000000101043b000000000010043f0000000601000039000000200010043f000000400200003900000000010000193b343af20000040f00000bf80000013d0000000002000416000000000002004b000020020000c13d000000640010008c000020020000413d0000000401800370000000000101043b00000ed30010009c000020020000213d0000002402800370000000000202043b00000ed30020009c000020020000213d0000004403800370000000000303043b000000a004000039000000400040043f000000800000043f00000080040000393b34277b0000040f000000000100001900003b350001042e0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400400043d000000000101043b000000000101041a00000ed30010019800000d640000c13d00000f7501000041000000000014043500000ed00040009c00000ed004008041000000400140021000000f6c011001c700003b36000104300000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b00000a600000c13d000000140220008c00000a600000413d0000000101200367000000000101043b00000060011002700000000302000039000000000202041a000000000112013f00000ed30010019800000c710000c13d0000000401000039000000000201041a00000ed4022001970000000d022001af000000000021041b000000400100043d0000002002100039000000010300008a0000000000320435000000000001043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000010300003900000fb6040000413b343b250000040f0000000100200190000020020000613d000000000100001900003b350001042e0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d0000002401800370000000000101043b000c00000001001d000000010010008c000020020000213d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b00000aa80000c13d000000140220008c00000aa80000413d0000000101200367000000000101043b000000600110027000000ed3021001970000000d0020006b0000114a0000613d000b00000002001d000000000020043f0000001201000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b0000000d02000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd022001970000000c03000029000000000232019f000000000021041b000000400100043d000000000031043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f62011001c70000800d02000039000000030300003900000f81040000410000000b050000290000000d060000293b343b250000040f0000000100200190000020020000613d00000a7e0000013d0000000001000416000000000001004b000020020000c13d3b3424390000040f0000002002000039000000400300043d000d00000003001d00000000022304363b3423b50000040f0000000d02000029000000000121004900000ed00010009c00000ed001008041000000600110021000000ed00020009c00000ed0020080410000004002200210000000000121019f00003b350001042e0000000002000416000000000002004b000020020000c13d000000640010008c000020020000413d0000004401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d3b3424650000040f00000001020003670000000401200370000000000101043b0000002402200370000000000202043b0000000d030000293b342f4e0000040f0000000102000039000000000020041b000000400200043d000000000012043500000ed00020009c00000ed002008041000000400120021000000f57011001c700003b350001042e0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b00000ed30010009c000020020000213d000000000010043f0000002201000039000000200010043f000000400200003900000000010000193b343af20000040f000000000101041a000000800010043f00000f510100004100003b350001042e0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d000000000100041a000000020010008c00000ddf0000c13d00000fc601000041000000800010043f0000002001000039000000840010043f0000001f01000039000000a40010043f00000fc701000041000000c40010043f00000fc80100004100003b36000104300000000002000416000000000002004b000020020000c13d000000840010008c000020020000413d0000000402800370000000000502043b00000ed30050009c000020020000213d0000002402800370000000000202043b00000ed30020009c000020020000213d0000006403800370000000000403043b00000f5a0040009c000020020000213d0000002303400039000000000013004b000020020000813d0000000406400039000000000368034f000000000303043b00000f5a0030009c000015280000213d0000001f0730003900000f730770019700000f7b0070009c000015280000213d0000003f0770003900000f73077001970000008007700039000000400070043f000000800030043f00000000043400190000002404400039000000000014004b000020020000213d000000000b08034f0000002001600039000000000418034f00000fce063001980000001f0730018f000000a00160003900000b6a0000613d000000a008000039000000000904034f000000009a09043c0000000008a80436000000000018004b00000b660000c13d000000000007004b00000b770000613d000000000464034f0000000306700210000000000701043300000000076701cf000000000767022f000000000404043b0000010006600089000000000464022f00000000046401cf000000000474019f0000000000410435000000a00130003900000000000104350000004401b00370000000000301043b000000800400003900000000010500193b34277b0000040f000000000100001900003b350001042e0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000000e01000039000000200010043f000000400200003900000000010000193b343af20000040f000000000101041a00000ed301100197000000800010043f00000f510100004100003b350001042e0000000002000416000000000002004b000020020000c13d000000640010008c000020020000413d0000000401800370000000000101043b00000ed30010009c000020020000213d00000f9c02000041000000800020043f0000002102000039000000840020043f0000002002000039000000a40020043f000000c40010043f0000002401800370000000000101043b000000e40010043f0000004401800370000000000101043b000001040010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000f9d011001c700000ece020000413b343b2f0000040f000000800a000039000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf00000bbe0000613d000000000801034f000000008908043c000000000a9a043600000000005a004b00000bba0000c13d000000000006004b00000bcb0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000e0d0000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200030008c000020020000413d000000800200043d0000000000210435000000400110021000000f57011001c700003b350001042e0000000001000416000000000001004b000020020000c13d00000f5b01000041000000800010043f00000f510100004100003b350001042e0000000001000416000000000001004b000020020000c13d000000080100003900000b1c0000013d0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d3b3429630000040f00000001010003670000000402100370000000000202043b000000000020043f0000001902000039000000200020043f0000002401100370000000000101043b000d00000001001d000000400200003900000000010000193b343af20000040f0000000d020000293b3429780000040f3b3429830000040f000000400200043d000d00000002001d3b34241e0000040f0000000d0100002900000ed00010009c00000ed001008041000000400110021000000f8b011001c700003b350001042e0000000002000416000000000002004b000020020000c13d000000440010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b00000fa50000c13d000000140320008c0000000d0200002900000fa60000413d0000000101300367000000000101043b000000600110027000000fa60000013d0000000001000416000000000001004b000020020000c13d0000001201000039000000800010043f00000f510100004100003b350001042e0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000000c01000039000000200010043f000000400200003900000000010000193b343af20000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f00000f510100004100003b350001042e0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000d00000001001d00000ed30010009c000020020000213d0000000001000412001300000001001d001200000000003d000080050100003900000044030000390000000004000415000000130440008a000000050440021000000f50020000413b343b070000040f00000ed3011001970000000d0010006b00000000010000390000000101006039000000800010043f00000f510100004100003b350001042e0000000002000416000000000002004b000020020000c13d000000240010008c000020020000413d0000000401800370000000000101043b000000000010043f0000001b01000039000000200010043f000000400200003900000000010000193b343af20000040f000000000101041a00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f000000800010043f00000f510100004100003b350001042e000000400100043d00000fcb02000041000015f00000013d000800000001001d000000c001000039000000400010043f0000000501000039000000800010043f00000f8d01000041000000a00010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000f8e011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000700000001001d000000400100043d00000f8f0010009c000015280000213d0000004002100039000000400020043f0000000502000039000000000121043600000f9002000041000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000f91011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000500000001001d000000400100043d000600000001001d00000f92010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d00000006050000290000002002500039000000000101043b00000f93030000410000000000320435000000000300041000000ed303300197000000a004500039000000000034043500000080035000390000000000130435000000600150003900000005030000290000000000310435000000400150003900000007030000290000000000310435000000a001000039000000000015043500000f940050009c000015280000213d0000000603000029000000c001300039000000400010043f00000ed00020009c00000ed0020080410000004001200210000000000203043300000ed00020009c00000ed0020080410000006002200210000000000121019f000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ede011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000700000001001d000000400100043d000000a0021000390000000b03000029000000000032043500000080021000390000000c03000029000000000032043500000060021000390000000a03000029000000000032043500000040021000390000000d030000290000000000320435000000200210003900000f5b030000410000000000320435000000a003000039000000000031043500000f940010009c000015280000213d000000c003100039000000400030043f00000ed00020009c00000ed0020080410000004002200210000000000101043300000ed00010009c00000ed0010080410000006001100210000000000112019f000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ede011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000201043b000000400100043d00000042031000390000000000230435000000200210003900000f950300004100000000003204350000002203100039000000070400002900000000004304350000004203000039000000000031043500000f960010009c000015280000213d0000008003100039000000400030043f00000ed00020009c00000ed0020080410000004002200210000000000101043300000ed00010009c00000ed0010080410000006001100210000000000112019f000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ede011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000a4020000390000000102200367000000000202043b000000400300043d000000600430003900000008050000290000000000540435000000400430003900000000002404350000002002300039000000090400002900000000004204350000000000130435000000000000043f00000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000f56011001c700000001020000393b343b2a0000040f000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000d490000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000d450000c13d000000000005004b00000d560000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000000010020019000001b550000613d000000000100043d000900000001001d0000000d020000293b34249a0000040f000000000001004b0000100c0000613d000000090100002900000ed30110019800001e6d0000c13d000000400100043d00000f9902000041000015f00000013d0000000401000039000000000201041a00000f7001000041000000000014043500000004014000390000000d03000029000000000031043500000ed00040009c00000ed00100004100000000010440190000004001100210000000000300041400000ed00030009c00000ed003008041000000c003300210000000000113019f00000f71011001c700000ed302200197000d00000004001d3b343b2a0000040f00000060031002700000001f0430018f00000ed20530019700000ed003300197000000010020019000000fb00000613d0000000d090000290000000002590019000000000005004b00000d880000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000027004b00000d840000c13d000000000004004b00000d950000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f0130003900000ed1021001970000000001920019000000000021004b0000000002000039000000010200403900000f5a0010009c000015280000213d0000000100200190000015280000c13d000000400010043f0000000001000415000000200030008c000020020000413d0000000004090019000000000209043300000f5a0020009c000020020000213d000000000534001900000000024200190000001f03200039000000000053004b000000000400001900000f720400804100000f720330019700000f7206500197000000000763013f000000000063004b000000000300001900000f720300404100000f720070009c000000000304c019000000000003004b000020020000c13d000000004302043400000f5a0030009c000015280000213d0000001f0230003900000f73022001970000003f0220003900000f7406200197000000400200043d0000000006620019000000000026004b0000000007000039000000010700403900000f5a0060009c000015280000213d0000000100700190000015280000c13d000000400060043f00000000063204360000000007340019000000000057004b000020020000213d000000000003004b00000dd60000613d000000000500001900000000076500190000000008540019000000000808043300000000008704350000002005500039000000000035004b00000dcf0000413d00000000033600190000000000030435000000000300041500000000013100490000000001000002000000400100043d000d00000001001d3b3423c70000040f00000ae80000013d0000000201000039000000000010041b00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b000000000103001900000dfc0000c13d000000140220008c000000000103001900000dfc0000413d0000000101200367000000000101043b0000006001100270000b00000003001d000c0ed30010019b0000000501000039000000000101041a00000ed3011001970000000c0010006b0000114d0000c13d0000000801000039000000000201041a000000010220003a000011ad0000c13d00000fc201000041000000000010043f0000001101000039000000040010043f00000f710100004100003b36000104300000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e140000c13d000013d10000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e200000c13d000013d10000013d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000400300043d000c00000003001d0000006402300039000000000012043500000044013000390000000d02000029000000000021043500000024013000390000001902000039000000000021043500000f5801000041000000000013043500000004013000390000001a02000039000000000021043500000ed00030009c00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f59011001c700000ecf020000413b343b2f0000040f000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c0b0000290000000c0570002900000e5c0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00000e580000c13d000000000006004b00000e690000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000013590000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000015280000213d0000000100200190000015280000c13d000000400010043f000000200030008c000020020000413d00000000020b0433000008650000013d0000000d02000029000c00000001001d3b34249a0000040f000000000001004b0000100c0000613d0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000000000001004b000015ee0000c13d0000000d01000029000000000010043f0000001e01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff00100190000015eb0000c13d0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000b00000002001d00000f5d0020009c000015280000213d000000000201043b0000000b040000290000006001400039000000400010043f000000000102041a000a0f520010019b00000f530010019800000f540100004100000000010060190000000a031001af00000000053404360000000103200039000000000303041a000800000005001d000000000035043500000040034000390000000202200039000000000202041a000000ff002001900000000002000039000000010200c039000900000003001d0000000000230435000017450000613d00000f5300100198000023160000c13d0000001d01000039000000000201041a0000000a0220006c00000e070000413d000000000021041b00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000700000001001d00000f840110009c00000e070000813d00000f782010012a000000000121004900000008020000290000000000120435000000090100002900000000000104350000000d010000293b34383a0000040f0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d00000f5d0020009c000015280000213d000000000101043b0000006003200039000000400030043f000000000301041a00000f520430019700000f530030019800000f54030000410000000003006019000000000343019f00000000033204360000000104100039000000000404041a00000000004304350000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000400320003900000000001304350000000d010000290000000b030000293b3429b30000040f0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000b02000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000080200002900000000020204330000000103100039000000000023041b0000000201100039000000000301041a00000fcd0230019700000009030000290000000003030433000000000003004b000000010220c1bf000000000021041b000000400100043d0000002002100039000000070300002900000000003204350000000a02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f0000000c0200002900000ed30520019700000ed5011001c70000800d02000039000000030300003900000fb5040000410000000d060000293b343b250000040f0000000100200190000020020000613d000000400100043d0000000d02000029000000000021043500000ed00010009c00000ed00100804100000040011002100000000002000414000016880000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000f5a0000c13d000013d10000013d0000000d02000029000c00000001001d3b34249a0000040f000000000001004b0000100c0000613d0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000000000001004b000015ee0000c13d0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000b00000002001d00000f5d0020009c000015280000213d000000000101043b0000000b040000290000006002400039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f0000000005240436000000400340003900000002021000390000000101100039000000000101041a000800000005001d000a00000001001d0000000000150435000000000102041a000000ff001001900000000001000039000000010100c039000900000003001d0000000000130435000015fa0000613d000000400100043d00000fbd02000041000015f00000013d0000000d020000293b34249a0000040f000000000001004b0000100c0000613d00000024010000390000000101100367000000000201043b0000000d010000293b34398a0000040f000000000100001900003b350001042e000000400200043d0000000006520019000000000005004b00000fba0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b00000fb60000c13d000000000004004b000013de0000613d000000000151034f0000000304400210000000000506043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000160435000013de0000013d000000000010043f0000000601000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000d00000002001d00000f760020009c000015280000213d000000000301043b0000000d06000029000000a001600039000000400010043f000000000103041a00000f7202100197000000010400008a00000f720020009c000000000400c01900000080024002100000008004100270000000000224019f000000800000008b000000000201601900000f520410019700000f530010019800000f54010000410000000001006019000000000141019f00000f520420019700000f530020019800000f54020000410000000002006019000000000242019f0000000009160436000000030430003900000002053000390000000103300039000000800760003900000060086000390000004006600039000c00000009001d0000000000290435000000000303041a000900000006001d000a00000003001d0000000000360435000000000305041a000800000008001d0000000000380435000000000404041a000300000007001d0000000000470435000000400500043d00000f760050009c000001be0000a13d000015280000013d0000000d02000029000c00000001001d3b34249a0000040f000000000001004b0000100f0000c13d000000400100043d00000fca02000041000015f00000013d0000000d01000029000000000010043f0000001e01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff00100190000015eb0000c13d0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000000000001004b000015ee0000c13d0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000b00000002001d00000f5d0020009c000015280000213d000000000101043b0000000b040000290000006002400039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f00000000022404360000000103100039000000000303041a000a00000003001d000000000032043500000040024000390000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000000012043500000fa20000c13d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000900000001001d0000000a0010006c00001b610000813d000000400100043d00000fbc02000041000015f00000013d0000000d02000029000c00000003001d000000000020043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a00000ed301100198000011920000c13d000000400100043d00000fa402000041000015f00000013d0000000d030000290000000204000039000000000204041a000000000112013f00000ed3001001980000136f0000c13d000000000030043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000015110000c13d0000000c01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000000000001004b000015ee0000c13d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000400300043d000b00000003001d0000006402300039000000000012043500000044013000390000000c02000029000000000021043500000024013000390000001902000039000000000021043500000f5801000041000000000013043500000004013000390000001a02000039000000000021043500000ed00030009c00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f59011001c700000ecf020000413b343b2f0000040f000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b0b0000290000000b05700029000010e60000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000010e20000c13d000000000006004b000010f30000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000017480000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000015280000213d0000000100200190000015280000c13d000000400010043f000000200030008c000020020000413d00000000020b0433000000000002004b00001bfe0000c13d00000f6b02000041000015f00000013d0000000d02000029000b00000003001d000000000020043f0000001e01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff00100190000015eb0000c13d0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000000000001004b000015ee0000c13d0000000c01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000000000001004b000015ee0000c13d0000000d020000290000000c0020006c000017540000c13d000000400100043d00000f6f02000041000015f00000013d000a00000002001d0000000d0020006c000013720000c13d000000400100043d00000f8a02000041000015f00000013d0000000201000039000000000201041a000000400300043d000a00000003001d00000f8601000041000000000013043500000ed00030009c00000ed00100004100000000010340190000004001100210000000000300041400000ed00030009c00000ed003008041000000c003300210000000000113019f00000f6c011001c700000ed3022001973b343b2a0000040f000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a0b0000290000000a057000290000116f0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000116b0000c13d000000000006004b0000117c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000013c60000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000015280000213d0000000100200190000015280000c13d000000400010043f000000200030008c000020020000413d00000000020b043300000ed30020009c000020020000213d0000000c0020006b00000e030000613d00000fa502000041000015f00000013d000b00000001001d000000000010043f0000001c01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff00100190000014f90000c13d000000000000043f0000001c01000039000000200010043f00000f9f01000041000000000101041a000000ff00100190000014f90000c13d000000400100043d00000fa302000041000015f00000013d000000000021041b0000000d01000029000900000002001d3b3428610000040f000000400100043d000a00000001001d00000f5d0010009c000015280000213d0000000a030000290000006001300039000000400010043f00000040013000390000000102000039000000000021043500000000020304360000000000020435000000400300043d000800000003001d00000f5d0030009c000015280000213d0000001703000039000000000303041a000500000003001d00000008060000290000006003600039000000400030043f000000400760003900000000000704350000002005600039000000000005043500000000000604350000000a03000029000000000303043300000f520430019700000f530030019800000f54030000410000000003006019000000000343019f000000000101043300000000020204330000000000360435000700000005001d0000000000250435000000000001004b0000000001000039000000010100c039000600000007001d00000000001704350000000901000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000803000029000000000203043300000f5f02200197000000000101043b000000000401041a00000f6004400197000000000224019f000000000021041b000000070200002900000000020204330000000104100039000000000024041b0000000201100039000000000201041a00000fcd0220019700000006040000290000000004040433000000000004004b000000010220c1bf000000000021041b00000009010000290000000a020000293b3429b30000040f00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b0000121a0000c13d000000140120008c0000121a0000413d0000000101100367000000000101043b000b00600010027800000007010000290000000001010433000800000001001d000000400100043d000a00000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000a0300002900000040023000390000000000120435000000200130003900000008020000290000000000210435000000000003043500000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f7d011001c70000000b0200002900000ed3052001970000800d020000390000000403000039000000010700003900000f7e0400004100000009060000293b343b250000040f0000000100200190000020020000613d000000400100043d000000200210003900000005030000290000000000320435000000000031043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000010300003900000f7f040000413b343b250000040f0000000100200190000020020000613d0000000901000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd0220019700000002022001bf000000000021041b00000fa601000041000000400200043d000b00000002001d000000000012043500000f500100004100000000001004430000000001000412000000040010044300000040010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d000000000201043b0000000b0100002900000ed00010009c00000ed0010080410000004001100210000000000300041400000ed00030009c00000ed003008041000000c003300210000000000113019f00000f6c011001c700000ed3022001973b343b2a0000040f000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b057000290000129a0000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000012960000c13d000000000006004b000012a70000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000001e610000613d0000001f01400039000000600110018f0000000b02100029000000000012004b00000000010000390000000101004039000a00000002001d00000f5a0020009c000015280000213d0000000100100190000015280000c13d0000000a01000029000000400010043f000000200030008c000020020000413d0000000b010000290000000001010433000b00000001001d00000ed30010009c000020020000213d0000000201000039000000000101041a000800000001001d00000fa7010000410000000a020000290000000001120436000700000001001d00000f500100004100000000001004430000000001000412000000040010044300000020010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000080200002900000ed3022001970000000a040000290000002403400039000000000023043500000ed3011001970000000402400039000000000012043500000ed00040009c00000ed00100004100000000010440190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f69011001c70000000b020000293b343b250000040f000000600310027000000ed003300197000000400030008c000000400400003900000000040340190000001f0640018f00000060074001900000000a05700029000012f70000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b000012f30000c13d000000000006004b000013040000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000020260000613d0000001f01400039000000e00110018f0000000a0110002900000f5a0010009c000015280000213d000000400010043f000000400030008c000020020000413d0000000a010000290000000001010433000b00000001001d00000ed30010009c000020020000213d00000007010000290000000001010433000a00000001001d00000ed30010009c000020020000213d0000000901000029000000000010043f0000000d01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000ed4022001970000000b022001af000000000021041b0000000901000029000000000010043f0000000e01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000ed4022001970000000a03000029000000000232019f000000000021041b000000400100043d000000200210003900000000003204350000000b02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000040300003900000fa8040000410000000d0500002900000009060000290000000c070000293b343b250000040f0000000100200190000020020000613d0000000101000039000000000010041b000000400100043d0000000902000029000008650000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013600000c13d000013d10000013d0000000203000039000000000203041a000000000112013f00000ed3001001980000136f0000c13d0000000c0000006b000013e40000c13d000000400100043d00000fb302000041000015f00000013d000000400100043d00000fbe02000041000015f00000013d0000000c01000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000900000001001d0000000a01000029000000000010043f0000001201000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b0000000b0200002900000ed302200197000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d00000009030000290000000b0230014f000000000101043b00000ed300200198000013a50000613d000000000101041a000000ff001001900000100c0000613d0000000c01000029000000000010043f0000001101000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000ed4022001970000000d06000029000000000262019f000000000021041b000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d02000039000000040300003900000fc9040000410000000a050000290000000c070000293b343b250000040f0000000100200190000020020000613d00000a7e0000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000013cd0000c13d000000000005004b000013de0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000600130021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b36000104300000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000150b0000213d000000010010008c000016910000c13d0000000c01000029000000000010043f0000000d01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000b00000001001d0000000c01000029000000000010043f0000000e01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000a00000001001d0000000d01000029000000000010043f0000000b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b0000000c02000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000900000001001d00000f500100004100000000001004430000000001000412000000040010044300000060010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000b0200002900000ed302200197000000000101043b000000400500043d000b00000005001d00000024045000390000000d03000029000000000034043500000fae03000041000000000035043500000ed3031001970000000401500039000700000003001d000000000031043500000ed00050009c00000ed00100004100000000010540190000004001100210000000000300041400000ed00030009c00000ed003008041000000c003300210000000000113019f00000f69011001c7000800000002001d3b343b2a0000040f000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b0b0000290000000b057000290000146e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000146a0000c13d000000000006004b0000147b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000001e550000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000015280000213d0000000100200190000015280000c13d000000400010043f000000200030008c000020020000413d00000000020b0433000b00000002001d000000090020002a00000e070000413d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b00060f84001000a400000e070000813d000000400100043d000500000001001d00000f8f0010009c000015280000213d00000005030000290000004001300039000000400010043f0000002001300039000000070200002900000000002104350000000101000039000000000013043500000f6401000041000000000010044300000008010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000060100002900000f781010012a000300000001001d000000400300043d00000024013000390000004002000039000000000021043500000faf010000410000000001130436000400000001001d00000004013000390000000d0200002900000000002104350000000501000029000000000201043300000044013000390000000000210435000700000003001d0000006401300039000000000002004b000014d60000613d000000000300001900000005050000290000002005500039000000000405043300000ed30440019700000000014104360000000103300039000000000023004b000014cf0000413d0000000703000029000000000131004900000ed00010009c00000ed0010080410000006001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000ed00030009c00000ed0020000410000000002034019000500400020021800000005011001af00000008020000293b343b250000040f0000000100200190000020370000613d000000070100002900000f5a0010009c000015280000213d0000000b0200002900000009012000290000000702000029000000400020043f000b00000001001d00000f530010009c000020440000413d00000fb20100004100000007020000290000000000120435000000050100002900000f6c011001c700003b36000104300000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff0110018f000000020010008c0000158e0000a13d00000fc201000041000000000010043f0000002101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fab02000041000015f00000013d000000400100043d00000fbf02000041000015f00000013d0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000900000002001d00000fc00020009c000016940000413d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b360001043000000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b000015470000c13d000000140120008c000015470000413d0000000101100367000000000101043b0008006000100278000000400200043d000b00000002001d00000f8601000041000000000012043500000ed00020009c00000ed00100004100000000010240190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f6c011001c700000009020000293b343b2a0000040f000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b0b0000290000000b05700029000015670000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000015630000c13d000000000006004b000015740000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000016b10000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000015280000213d0000000100200190000015280000c13d000000400010043f000000200030008c000020020000413d00000000020b043300000ed30020009c000020020000213d000000080300002900000ed303300197000000000023004b000005960000613d00000faa02000041000015f00000013d00000f8702000041000015f00000013d000000000001004b000015ee0000c13d0000000d01000029000000000010043f0000001e01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000000ff00100190000015eb0000c13d0000000c010000290000000d020000293b34249a0000040f000000000001004b0000100c0000613d0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000a00000002001d00000f5d0020009c000015280000213d000000000101043b0000000a040000290000006002400039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f0000000003240436000000400440003900000002021000390000000101100039000000000101041a000700000003001d000900000001001d0000000000130435000000000102041a000000ff001001900000000001000039000000010100c039000800000004001d000000000014043500000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000600000001001d000000090010006b000015e20000213d00000008010000290000000001010433000000000001004b000019c80000613d00000024010000390000000101100367000000000101043b000900000001001d00000f520010009c00001e9e0000a13d000000400100043d00000fb202000041000015f00000013d000000400100043d00000fb702000041000015f00000013d000000400100043d00000fb802000041000000000021043500000ed00010009c00000ed001008041000000400110021000000f6c011001c700003b36000104300000000d0000006b000016bd0000c13d00000f8902000041000015f00000013d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000700000001001d0000000a0010006b000019c80000a13d0000000b010000290000000001010433000a0f520010019b00000f530110019800000f540200004100000000020060190000000a022001af00000f5e0020009c000017420000213d000000000002004b000017420000613d000000000001004b000023160000c13d0000001d01000039000000000201041a0000000a0020002a00000e070000413d0000000a02200029000000000021041b000000080100002900000000000104350000000101000039000000090200002900000000001204350000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d00000f5d0020009c000015280000213d000000000101043b0000006003200039000000400030043f000000000301041a00000f520430019700000f530030019800000f54030000410000000003006019000000000343019f00000000033204360000000104100039000000000404041a00000000004304350000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000400320003900000000001304350000000d010000290000000b030000293b3429b30000040f0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000b02000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000080200002900000000020204330000000103100039000000000023041b0000000201100039000000000301041a00000fcd0230019700000009030000290000000003030433000000000003004b000000010220c1bf000000000021041b000000400100043d0000002002100039000000070300002900000000003204350000000a02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f0000000c0200002900000ed30520019700000ed5011001c70000800d02000039000000030300003900000f61040000410000000d060000293b343b250000040f0000000100200190000020020000613d000000400100043d0000000d02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f62011001c70000800d02000039000000010300003900000f630400004100000a7b0000013d000000400100043d00000fad02000041000015f00000013d000000000301043b00000009050000290000006001500039000000400010043f000000000203041a00000f520120019700000f530020019800000f54020000410000000002006019000000000412019f0000000006450436000000400550003900000002043000390000000103300039000000000303041a000600000006001d000700000003001d0000000000360435000000000304041a000000ff003001900000000003000039000000010300c039000800000005001d00000000003504350000000c0000006b000017270000c13d000000400100043d00000fc402000041000015f00000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000016b80000c13d000013d10000013d00000ed4013001970000000d05000029000000000151019f000000000012041b000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d02000039000000020300003900000f880400004100000a7b0000013d00000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b00000008020000290000000000120435000000070000006b000017020000c13d00000016010000390000000b02000029000000000021041b000000000020043f0000000601000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000d02000029000000000202043300000f5f022001970000000c0300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b000000090200002900000000020204330000000103100039000000000023041b000000080200002900000000020204330000000203100039000000000023041b000000030110003900000003020000290000000002020433000000000021041b0000000101000039000000000010041b000000000100001900003b350001042e00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000a00000001001d0000000701000029000000000010043f0000000601000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b0000000101100039000000000101041a0000000a0010006c000016da0000c13d0000000701000029000000000010043f0000000601000039000000200010043f0000000001000414000016e10000013d00000f530020019800000f54020000410000000002006019000000000112019f00000f5e0010009c000017420000213d000000000001004b000017420000613d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d00000008020000290000000002020433000000000101043b000000070010006b000019c60000a13d000000000002004b000019d10000613d000019cb0000013d000000400100043d00000fc302000041000015f00000013d000000400100043d00000fb402000041000015f00000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000174f0000c13d000013d10000013d0000000b010000290000000d020000293b34249a0000040f000000000001004b0000100c0000613d0000000b010000290000000c020000293b34249a0000040f000000000001004b0000100c0000613d0000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000a00000002001d00000f5d0020009c000015280000213d000000000101043b0000000a040000290000006002400039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f0000000005240436000000400340003900000002021000390000000101100039000000000101041a000700000005001d000900000001001d0000000000150435000000000102041a000000ff001001900000000001000039000000010100c039000800000003001d000000000013043500000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000090010006b000017990000213d00000008010000290000000001010433000000000001004b000019c80000613d0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000900000002001d00000f5d0020009c000015280000213d000000000101043b00000009040000290000006002400039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f00000000022404360000000103100039000000000303041a000600000003001d000000000032043500000040024000390000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000000012043500000fa20000c13d00000007010000290000000001010433000700000001001d0000000d010000293b34343c0000040f0000000702000029000000060020006b00000000010200190000000601002029000600000001001d000000400100043d000700000001001d00000f5d0010009c000015280000213d00000007020000290000006001200039000000400010043f0000004001200039000500000001001d00000000000104350000000001020436000400000001001d00000000000104350000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000702000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000040200002900000000020204330000000103100039000000000023041b0000000201100039000000000201041a00000fcd0220019700000005030000290000000003030433000000000003004b000000010220c1bf000000000021041b000000400300043d00000f5d0030009c000015280000213d0000006001300039000000400010043f000000400130003900000000000104350000002001300039000000000001043500000000000304350000000d0100002900000009020000293b3429b30000040f000000400100043d000700000001001d00000f5d0010009c000015280000213d00000007020000290000006001200039000000400010043f0000004001200039000500000001001d00000000000104350000000001020436000400000001001d00000000000104350000000a01000029000000000101043300000f520210019700000f530010019800000f54010000410000000001006019000000000121019f0000000902000029000000000202043300000f520320019700000f530020019800000f54020000410000000002006019000000000232019f000000000112001900000f530210009a00000f600020009c00000e070000413d00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f0000000702000029000000000012043500000008010000290000000001010433000000000001004b0000000001000039000000010100c03900000005020000290000000000120435000022570000613d0000000901000029000000000101043300000f5300100198000023160000c13d00000f52011001970000001d02000039000000000302041a000000000013001a00000e070000413d0000000001130019000000000012041b0000225a0000013d0000000d010000293b3423dc0000040f000008c50000013d000000000002004b000019c80000613d0000001d01000039000000000201041a0000000c0020002a00000e070000413d0000000c02200029000000000021041b0000000d01000029000000000010043f0000001f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000500000001001d00000f6401000041000000000010044300000ece01000041000700000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000084013000390000000102000039000000000021043500000064013000390000000c02000029000000000021043500000044013000390000000502000029000000000021043500000024013000390000002002000039000000000021043500000f6601000041000000000013043500000004013000390000002102000039000000000021043500000ed00030009c000500000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f67011001c700000007020000293b343b2f0000040f000000010020019000001e910000613d000000050100002900000f5a0010009c000015280000213d0000000501000029000000400010043f0000000001000415000300000001001d0000001701000039000000000301041a000700000003001d0000000c0030002a00000e070000413d00000007030000290000000c02300029000400000002001d000000000021041b000000400100043d000500000001001d00000f5d0010009c000015280000213d00000005070000290000006001700039000000400010043f0000004008700039000000000008043500000020067000390000000000060435000000000007043500000008010000290000000003010433000000060100002900000000040104330000000901000029000000000201043300000f520120019700000f530020019800000f54020000410000000002006019000000000512019f0000000000570435000800000006001d0000000000460435000000000003004b0000000003000039000000010300c039000600000008001d00000000003804350000000c0300002900000f520030009c000015e80000213d00000f530020019800000f54020000410000000002006019000000000112019f0000000c0110002900000f530210009a00000f600020009c00000e070000413d00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f000000050200002900000000001204350000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000503000029000000000203043300000f5f02200197000000000101043b000000000401041a00000f6004400197000000000224019f000000000021041b000000080200002900000000020204330000000104100039000000000024041b0000000201100039000000000401041a00000fcd0240019700000006040000290000000004040433000000000004004b000000010220c1bf000000000021041b0000000d0100002900000009020000293b3429b30000040f00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b0000190b0000c13d000000140120008c0000190b0000413d0000000101100367000000000101043b000b00600010027800000f500100004100000000001004430000000001000412000000040010044300000060010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b00000ed30110019700000000030004100000000b020000290000000c040000293b342dc10000040f00000008010000290000000001010433000800000001001d000000400100043d000900000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000903000029000000400230003900000000001204350000002001300039000000080200002900000000002104350000000c01000029000000000013043500000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f7d011001c70000000b0200002900000ed3052001970000800d020000390000000403000039000000020700003900000f7e040000410000000d060000293b343b250000040f0000000100200190000020020000613d000000400100043d0000002002100039000000040300002900000000003204350000000702000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000010300003900000f7f040000413b343b250000040f0000000100200190000020020000613d0000000001000415000000030110006900000000010000020000000a01000029000000020010008c000019be0000c13d0000000d01000029000000000010043f0000000d01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000b00000001001d00000f500100004100000000001004430000000001000412000000040010044300000060010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000b0200002900000ed302200197000b00000002001d000000000101043b00000ed301100197000a00000001001d0000000c030000293b3432f50000040f00000f640100004100000000001004430000000b010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000024013000390000000c02000029000000000021043500000f8001000041000000000013043500000004013000390000000a02000029000000000021043500000ed00030009c000c00000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000f69011001c70000000b020000293b343b250000040f0000000100200190000023190000613d0000000c0100002900000f5a0010009c000015280000213d0000000c01000029000000400010043f0000000a010000290000000b020000293b34322a0000040f000000400100043d0000000d02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400001ff70000013d000000000002004b000019cb0000c13d000000400100043d00000fc102000041000015f00000013d0000001d01000039000000000201041a0000000c0020002a00000e070000413d0000000c02200029000000000021041b0000000d01000029000000000010043f0000001f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000500000001001d00000f6401000041000000000010044300000ece01000041000700000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000084013000390000000102000039000000000021043500000064013000390000000c02000029000000000021043500000044013000390000000502000029000000000021043500000024013000390000002002000039000000000021043500000f66010000410000000001130436000400000001001d00000004013000390000002102000039000000000021043500000ed00030009c000500000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f67011001c700000007020000293b343b2f0000040f0000000100200190000020040000613d000000050100002900000f5a0010009c000015280000213d0000000501000029000000400010043f0000001701000039000000000301041a000700000003001d0000000c0030002a00000e070000413d00000007030000290000000c02300029000300000002001d000000000021041b000000050100002900000f5d0010009c000015280000213d00000005070000290000006001700039000000400010043f0000004008700039000000000008043500000004060000290000000000060435000000000007043500000008010000290000000003010433000000060100002900000000040104330000000901000029000000000201043300000f520120019700000f530020019800000f54020000410000000002006019000000000512019f00000000005704350000000000460435000000000003004b0000000003000039000000010300c039000800000008001d00000000003804350000000c0300002900000f530030009c000015e80000813d00000f530020019800000f54020000410000000002006019000000000112019f0000000c0110002900000f530210009a00000f600020009c00000e070000413d00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f000000050200002900000000001204350000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000503000029000000000203043300000f5f02200197000000000101043b000000000401041a00000f6004400197000000000224019f000000000021041b000000040200002900000000020204330000000104100039000000000024041b0000000201100039000000000401041a00000fcd0240019700000008040000290000000004040433000000000004004b000000010220c1bf000000000021041b0000000d0100002900000009020000293b3429b30000040f00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000900000003001d000000000013004b00001a8f0000c13d000000140120008c00001a8f0000413d0000000101100367000000000101043b000900600010027800000f500100004100000000001004430000000001000412000000040010044300000060010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b00000ed301100197000000000300041000000009020000290000000c040000293b342dc10000040f00000004010000290000000001010433000600000001001d000000400100043d000800000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000803000029000000400230003900000000001204350000002001300039000000060200002900000000002104350000000c01000029000000000013043500000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f7d011001c7000000090200002900000ed3052001970000800d02000039000000040300003900000f7e040000410000000d0600002900000000070000193b343b250000040f0000000100200190000020020000613d000000400100043d0000002002100039000000030300002900000000003204350000000702000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000010300003900000f7f040000413b343b250000040f0000000100200190000020020000613d0000000a01000029000000020010008c00001b3f0000c13d0000000d01000029000000000010043f0000000d01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000a00000001001d00000f500100004100000000001004430000000001000412000000040010044300000060010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000a0200002900000ed302200197000a00000002001d000000000101043b00000ed301100197000900000001001d0000000c030000293b3432f50000040f00000f640100004100000000001004430000000a010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000024013000390000000c02000029000000000021043500000f8001000041000000000013043500000004013000390000000902000029000000000021043500000ed00030009c000c00000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f69011001c70000000a020000293b343b250000040f0000000100200190000023260000613d0000000c0100002900000f5a0010009c000015280000213d0000000c01000029000000400010043f00000009010000290000000a020000293b34322a0000040f000000400100043d0000000d02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f62011001c70000800d02000039000000010300003900000f63040000413b343b250000040f0000000100200190000020020000613d00000000010004150000000b011000690000000001000002000016fe0000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001b5c0000c13d000013d10000013d0000000b010000290000000001010433000a00000001001d00000f5300100198000023160000c13d0000000d010000293b34343c0000040f000000400100043d000800000001001d00000f5d0010009c000015280000213d00000008020000290000006001200039000000400010043f0000004001200039000700000001001d00000000000104350000000001020436000600000001001d00000000000104350000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000a0200002900000f52042001970000000802000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000060200002900000000020204330000000103100039000000000023041b0000000201100039000000000301041a00000fcd0230019700000007030000290000000003030433000000000003004b000000010220c1bf000000000021041b0000001701000039000000000201041a000700000002001d000800000004001d000a00000042005300000e070000413d0000000a02000029000000000021041b000000400300043d00000f5d0030009c000015280000213d0000006001300039000000400010043f000000400130003900000000000104350000002001300039000000000001043500000000000304350000000d010000290000000b020000293b3429b30000040f00000f500100004100000000001004430000000001000412000000040010044300000060010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000400200043d000000200320003900000fba040000410000000000430435000000440320003900000008040000290000000000430435000000440300003900000000003204350000000c0300002900000ed3043001970000002403200039000c00000004001d000000000043043500000f960020009c000015280000213d0000008003200039000000400030043f00000ed3011001973b342e8f0000040f000000400100043d0000002002100039000000090300002900000000003204350000000802000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000030300003900000fbb040000410000000c050000290000000d060000293b343b250000040f0000000100200190000020020000613d000000400100043d00000020021000390000000a0300002900000000003204350000000702000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000010300003900000f7f0400004100001fff0000013d000000400100043d00000f8202000041000015f00000013d0000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000b00000001001d0000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000b03000029000000000403001900000f530030019800000f54030000410000000003006019000a00000003001d0000000100200190000020020000613d000b0f520040019b000000000101043b0000000201100039000000000101041a000000ff0010019000001c310000613d0000000a0100002900000f5300100198000023160000c13d0000001d01000039000000000201041a0000000b0220006c00000e070000413d000000000021041b0000000c010000293b34383a0000040f0000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000400300043d00000f5d0030009c000015280000213d0000006002300039000000400020043f00000040023000390000000000020435000000200230003900000000000204350000000000030435000000400200043d00000f5d0020009c000015280000213d0000006004200039000000400040043f000000000401041a00000f520540019700000f530040019800000f54040000410000000004006019000000000454019f00000000044204360000000105100039000000000505041a00000000005404350000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000400420003900000000001404350000000c010000293b3429b30000040f000000400100043d000900000001001d00000f5d0010009c000015280000213d00000009020000290000006001200039000000400010043f0000004001200039000800000001001d00000000000104350000000001020436000700000001001d00000000000104350000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000902000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000070200002900000000020204330000000103100039000000000023041b0000000201100039000000000201041a00000fcd0220019700000008030000290000000003030433000000000003004b000000010220c1bf000000000021041b0000000a0100002900000f5300100198000023160000c13d0000001d01000039000000000201041a0000000b0020002a00000e070000413d0000000b02200029000000000021041b0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000a00000002001d00000f5d0020009c000015280000213d000000000101043b0000000a050000290000006002500039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000432019f00000000064504360000000104100039000000000404041a000800000006001d000000000046043500000040045000390000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000900000004001d000000000014043500000f530020019800000f54010000410000000001006019000000000131019f0000000b0110002900000f530210009a00000f600020009c00000e070000413d00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f0000000a0200002900000000001204350000000d01000029000000000010043f0000001f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000700000001001d00000f6401000041000000000010044300000ece01000041000600000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000084013000390000000102000039000000000021043500000064013000390000000b02000029000000000021043500000044013000390000000702000029000000000021043500000024013000390000002002000039000000000021043500000f6601000041000000000013043500000004013000390000002102000039000000000021043500000ed00030009c000700000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f67011001c700000006020000293b343b2f0000040f0000000100200190000023330000613d000000070100002900000f5a0010009c000015280000213d0000000701000029000000400010043f0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d00000f5d0020009c000015280000213d000000000101043b0000006003200039000000400030043f000000000301041a00000f520430019700000f530030019800000f54030000410000000003006019000000000343019f00000000033204360000000104100039000000000404041a00000000004304350000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000400320003900000000001304350000000d010000290000000a030000293b3429b30000040f0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000a02000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000080200002900000000020204330000000103100039000000000023041b0000000201100039000000000201041a00000fcd0220019700000009030000290000000003030433000000000003004b000000010220c1bf000000000021041b0000000c01000029000000000010043f0000000b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b0000000d02000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b0000000b02000029000000000021041b0000000c01000029000000000010043f0000000a01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b0000000d02000029000000000021041b0000000c01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd0220019700000001022001bf000000000021041b0000000d01000029000000000010043f0000000d01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a00000f6402000041000000000020044300000ed301100197000900000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000024013000390000000c02000029000000000021043500000f6801000041000000000013043500000004013000390000000b02000029000000000021043500000ed00030009c000a00000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000f69011001c700000009020000293b343b250000040f0000000100200190000023400000613d0000000a0100002900000f5a0010009c000015280000213d0000000a01000029000000400010043f0000000d01000029000000000010043f0000000e01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a00000f6402000041000000000020044300000ed301100197000900000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000024013000390000000c02000029000000000021043500000f6801000041000000000013043500000004013000390000000b02000029000000000021043500000ed00030009c000a00000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000f69011001c700000009020000293b343b250000040f00000001002001900000234d0000613d0000000a0100002900000f5a0010009c000015280000213d0000000a01000029000000400010043f0000000c01000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000a00000001001d000000400100043d000900000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000903000029000000200230003900000000001204350000000b01000029000000000013043500000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000000a0200002900000ed3052001970000800d02000039000000040300003900000f6a040000410000000c060000290000000d070000293b343b250000040f0000000100200190000020020000613d000000400100043d0000000c02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400001ff70000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e5c0000c13d000013d10000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00001e680000c13d000013d10000013d000000000010043f0000002201000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a000000010320003a00000e070000613d000000000031041b0000000c0020006b000020230000c13d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000b0010006c000020320000a13d000000400100043d00000f9802000041000015f00000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00001e990000c13d000020100000013d000000090000006b000016ae0000613d0000000a01000029000000000101043300000f520210019700000f530010019800000f54010000410000000001006019000000000121019f0000000903000029000000000031004b000000000200001900000f720200204100000f720110019700000f7203300197000000000431013f000000000031004b000000000100001900000f720100404100000f720040009c000000000102c019000000000001004b000020200000613d0000000d010000293b34343c0000040f000000400100043d000800000001001d00000f5d0010009c000015280000213d00000008020000290000006001200039000000400010043f0000004001200039000500000001001d00000000000104350000000001020436000400000001001d00000000000104350000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000802000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000040200002900000000020204330000000103100039000000000023041b0000000201100039000000000301041a00000fcd0230019700000005030000290000000003030433000000000003004b000000010220c1bf000000000021041b000000400300043d00000f5d0030009c000015280000213d0000006001300039000000400010043f000000400130003900000000000104350000002001300039000000000001043500000000000304350000000d010000290000000a020000293b3429b30000040f0000000a01000029000000000101043300000f520210019700000f530010019800000f54010000410000000001006019000000000121019f000000090110006a00000f530210009a00000f600020009c00000e070000413d00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f0000000a0200002900000000001204350000000b010000293b3436340000040f00000009020000290000000a030000290000000000230435000800000001001d0000000b0100002900000000020300193b3436340000040f0000000802000029000000000020043f0000001802000039000000200020043f000b00000001001d000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a00000f5300100198000023160000c13d00000007020000290000000002020433000000400300043d0000008004300039000000060500002900000000005404350000006004300039000000000024043500000040023000390000000904000029000000000042043500000f5201100197000000200230003900000000001204350000000c0100002900000ed301100197000000000013043500000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f6d011001c70000800d02000039000000040300003900000fa1040000410000000d0500002900000008060000290000000b070000293b343b250000040f0000000100200190000020020000613d0000000101000039000000000010041b000000400100043d00000020021000390000000b0300002900000000003204350000000802000029000000000021043500000ed00010009c00000ed001008041000000400110021000000fa2011001c700003b350001042e0000000002000415000800000002001d000000400200043d000a00000002001d00000f5d0020009c000015280000213d0000001702000039000000000202041a000600000002001d0000000a050000290000006002500039000000400020043f000000400650003900000000000604350000002004500039000000000004043500000000000504350000000b02000029000000000202043300000f520320019700000f530020019800000f54020000410000000002006019000000000232019f000000090300002900000000030304330000000000250435000900000004001d0000000000140435000000000003004b0000000001000039000000010100c039000700000006001d00000000001604350000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000a03000029000000000203043300000f5f02200197000000000101043b000000000401041a00000f6004400197000000000224019f000000000021041b000000090200002900000000020204330000000104100039000000000024041b0000000201100039000000000401041a00000fcd0240019700000007040000290000000004040433000000000004004b000000010220c1bf000000000021041b0000000d010000290000000b020000293b3429b30000040f00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000023150000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b00001fae0000c13d000000140120008c00001fae0000413d0000000101100367000000000101043b000c00600010027800000009010000290000000001010433000a00000001001d000000400100043d000b00000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000b030000290000004002300039000000000012043500000020013000390000000a020000290000000000210435000000000003043500000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f7d011001c70000000c0200002900000ed3052001970000800d020000390000000403000039000000030700003900000f7e040000410000000d060000293b343b250000040f0000000100200190000020020000613d000000400100043d000000200210003900000006030000290000000000320435000000000031043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000010300003900000f7f040000413b343b250000040f0000000100200190000020020000613d000000000100041500000008011000690000000001000002000000400100043d0000000d02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f62011001c70000800d02000039000000010300003900000f63040000413b343b250000040f0000000100200190000016fe0000c13d000000000100001900003b360001043000000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000200c0000c13d00000ed006600197000000000004004b0000201e0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000013df0000013d000000400100043d00000fa002000041000015f00000013d000000400100043d00000f9702000041000015f00000013d0000001f0530018f00000ed206300198000000400200043d0000000004620019000013d10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000202d0000c13d000013d10000013d0000000d010000290000000a020000293b34398a0000040f000000000100001900003b350001042e00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000203f0000c13d000020100000013d000000070100002900000f5d0010009c000015280000213d0000000302000029000000060120006900000007030000290000006002300039000000400020043f000000040200002900000000001204350000000b0100002900000000001304350000004001300039000600000001001d00000000000104350000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d00000f5d0020009c000015280000213d000000000101043b0000006003200039000000400030043f000000000301041a00000f520430019700000f530030019800000f54030000410000000003006019000000000343019f00000000033204360000000104100039000000000404041a00000000004304350000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000400320003900000000001304350000000d0100002900000007030000293b3429b30000040f0000000d01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000702000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000040200002900000000020204330000000103100039000000000023041b0000000201100039000000000201041a00000fcd0220019700000006030000290000000003030433000000000003004b000000010220c1bf000000000021041b0000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d000700000002001d00000f5d0020009c000015280000213d000000000101043b000000070a0000290000006002a00039000000400020043f000000000201041a00000f520320019700000f530020019800000f5402000041000000000200601900000f530020019800000f5404000041000000000400601900000f530040019800000f54050000410000000005006019000000000535019f0000000b0900002900000f720690019700000f7207500197000000000876013f000000000076004b000000000600001900000f7206002041000000000059004b000000000700001900000f720700404100000f720080009c000000000607c019000000000434019f000000000006004b000000000409c019000000000232019f00000000032a04360000000102100039000000000202041a000400000003001d00000000002304350000004002a000390000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000500000002001d000000000012043500000f520140019700000f530040019800000f54020000410000000002006019000000000112019f000000000115004900000f530210009a00000f600020009c00000e070000413d00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f000000070200002900000000001204350000001d01000039000000000201041a0000000b0220006c0000000002004019000000000021041b0000000c01000029000000000010043f0000001f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000600000001001d0000000001000415000300000001001d00000f6401000041000000000010044300000ece01000041000200000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000064013000390000000b02000029000000000021043500000044013000390000000602000029000000000021043500000024013000390000002002000039000000000021043500000f660100004100000000001304350000000401300039000000210200003900000000002104350000008401300039000000000001043500000ed00030009c000600000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f67011001c700000002020000293b343b2f0000040f00000001002001900000235a0000613d000000060100002900000f5a0010009c000015280000213d0000000601000029000000400010043f0000000001000415000000030110006900000000010000020000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000400200043d00000f5d0020009c000015280000213d000000000101043b0000006003200039000000400030043f000000000301041a00000f520430019700000f530030019800000f54030000410000000003006019000000000343019f00000000033204360000000104100039000000000404041a00000000004304350000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000400320003900000000001304350000000c0100002900000007030000293b3429b30000040f0000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d0000000702000029000000000202043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000040200002900000000020204330000000103100039000000000023041b0000000201100039000000000201041a00000fcd0220019700000005030000290000000003030433000000000003004b000000010220c1bf000000000021041b00000f6401000041000000000010044300000008010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000024013000390000000d02000029000000000021043500000fb001000041000000000013043500000004013000390000000902000029000000000021043500000ed00030009c000700000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000f69011001c700000008020000293b343b250000040f0000000100200190000023670000613d000000070100002900000f5a0010009c000015280000213d0000000a0100002900000ed3021001970000000701000029000000400010043f00000f64010000410000000000100443000800000002001d0000000400200443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000400300043d00000024013000390000000d02000029000000000021043500000fb001000041000000000013043500000004013000390000000902000029000000000021043500000ed00030009c000a00000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000f69011001c700000008020000293b343b250000040f0000000100200190000023740000613d0000000a0100002900000f5a0010009c000015280000213d0000000a01000029000000400010043f0000000d01000029000000000010043f0000000a01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000001041b0000000d01000029000000000010043f0000000b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b0000000c02000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000001041b0000000d01000029000000000010043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000fcd02200197000000000021041b0000000d01000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000101041a000a00000001001d000000400100043d000900000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b0000000903000029000000200230003900000000001204350000000b01000029000000000013043500000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000000a0200002900000ed3052001970000800d02000039000000040300003900000fb1040000410000000d060000290000000c070000293b343b250000040f0000000100200190000020020000613d000000400100043d0000000d02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400001ff70000013d0000000401000029000000060200002900000000002104350000000c01000029000000000010043f0000001f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d00000009020000290000000002020433000000000101043b000800000002001d00000f5300200198000023160000c13d000000000101041a000300000001001d00000f6401000041000000000010044300000ece01000041000600000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000023150000613d000000000101043b000000000001004b000020020000613d000000080100002900000f5201100197000000400400043d0000008402400039000000010300003900000000003204350000006402400039000000000012043500000044014000390000000302000029000000000021043500000024014000390000002002000039000000000021043500000f6601000041000000000014043500000004014000390000002102000039000000000021043500000ed00040009c000800000004001d00000ed00100004100000000010440190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f67011001c700000006020000293b343b2f0000040f0000000100200190000023810000613d000000080100002900000f5a0010009c000015280000213d0000000801000029000000400010043f0000000c010000290000000a0200002900000007030000293b3429b30000040f0000000c01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000020020000613d000000000101043b000000000201041a00000f600220019700000007030000290000000003030433000800000003001d00000f5f03300197000000000232019f000000000021041b000000040200002900000000030204330000000102100039000700000003001d000000000032041b0000000201100039000000000201041a00000fcd0220019700000005030000290000000003030433000000000003004b000000010220c1bf000000000021041b00000009010000290000000001010433000900000001001d00000f5300100198000023160000c13d0000000a010000290000000001010433000600000001001d00000f5300100198000023160000c13d000000080100002900000f5300100198000023160000c13d000000400100043d000a00000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000023150000613d000000090200002900000f5202200197000000060300002900000f5203300197000000000101043b0000000a0500002900000080045000390000000000140435000000600150003900000007040000290000000000410435000000080100002900000f52011001970000004004500039000000000014043500000020015000390000000000310435000000000025043500000ed00050009c00000ed0050080410000004001500210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f00000f6d011001c70000000b0200002900000ed3052001970000800d02000039000000040300003900000f6e040000410000000d060000290000000c070000293b343b250000040f0000000100200190000020020000613d000000400100043d0000000c02000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400001ff70000013d000000000001042f000000400100043d00000fb902000041000015f00000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000023210000c13d000020100000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000232e0000c13d000020100000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000233b0000c13d000020100000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000023480000c13d000020100000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000023550000c13d000020100000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000023620000c13d000020100000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000236f0000c13d000020100000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000237c0000c13d000020100000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000020100000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000023890000c13d000020100000013d00000fcf0010009c000023930000813d0000008001100039000000400010043f000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b360001043000000fd00010009c0000239e0000813d0000004001100039000000400010043f000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fd00010009c000023af0000813d0000004002100039000000400020043f000000200210003900000f8d03000041000000000032043500000005020000390000000000210435000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b360001043000000000430104340000000001320436000000000003004b000023c10000613d000000000200001900000000051200190000000006240019000000000606043300000000006504350000002002200039000000000032004b000023ba0000413d000000000213001900000000000204350000001f0230003900000fce022001970000000001210019000000000001042d00000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b000023d60000613d000000000400001900000000051400190000000006430019000000000606043300000000006504350000002004400039000000000024004b000023cf0000413d000000000312001900000000000304350000001f0220003900000fce022001970000000001120019000000000001042d000000000010043f0000000c01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000023ea0000613d000000000101043b000000000001042d000000000100001900003b360001043000000f5e0010009c000023fc0000213d000000630010008c000023fc0000a13d00000001030003670000000401300370000000000101043b00000ed30010009c000023fc0000213d0000002402300370000000000202043b00000ed30020009c000023fc0000213d0000004403300370000000000303043b000000000001042d000000000100001900003b360001043000000f5e0010009c0000240c0000213d000000430010008c0000240c0000a13d00000001020003670000000401200370000000000101043b00000ed30010009c0000240c0000213d0000002402200370000000000202043b00000ed30020009c0000240c0000213d000000000001042d000000000100001900003b360001043000000ed302200197000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f00000001002001900000241c0000613d000000000101043b000000000001042d000000000100001900003b3600010430000000004301043400000f520530019700000f530030019800000f54030000410000000003006019000000000353019f0000000003320436000000000404043300000f520540019700000f530040019800000f54040000410000000004006019000000000454019f0000000000430435000000400310003900000000030304330000004004200039000000000034043500000060031000390000000003030433000000600420003900000000003404350000008002200039000000800110003900000000010104330000000000120435000000000001042d000000400100043d00000fd00010009c000024440000813d0000004002100039000000400020043f000000200210003900000f9003000041000000000032043500000005020000390000000000210435000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b360001043000000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000024640000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000024630000c13d000000140220008c000024630000413d0000000101200367000000000101043b0000006001100270000000000001042d000000000001042f000000000100041a000000020010008c0000246b0000613d0000000201000039000000000010041b000000000001042d000000400100043d000000440210003900000fc703000041000000000032043500000024021000390000001f03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000fd1011001c700003b36000104300000000002010019000000400100043d00000fc00010009c000024940000813d0000006003100039000000400030043f000000000302041a00000f520430019700000f530030019800000f54030000410000000003006019000000000343019f00000000033104360000000104200039000000000404041a00000000004304350000000202200039000000000202041a000000ff002001900000000002000039000000010200c03900000040031000390000000000230435000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b36000104300003000000000002000300000001001d000000000020043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000024e60000613d000000000101043b000000000101041a000200000001001d0000001101000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000024e60000613d000000020200002900000ed302200197000000000101043b000000000101041a000100000001001d000200000002001d000000000020043f0000001201000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000024e60000613d000000030200002900000ed302200197000000000101043b000300000002001d000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000024e60000613d000000010200002900000ed302200197000000030020006b000000000200003900000001020060390000000203000029000000030030006c0000000003000039000000010300603900000000002301a0000000000101043b000000000101041a000000ff0110018f000000010100c039000000000001042d000000000100001900003b36000104300006000000000002000500000004001d000200000002001d000400000001001d000600000003001d000000000030043f0000000901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000101041a000000ff0110018f000000030010008c000027410000813d000000010010008c000027470000613d0000000601000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000101041a000300000001001d0000001101000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000030200002900000ed302200197000000000101043b000000000101041a000100000001001d000300000002001d000000000020043f0000001201000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000050200002900000ed302200197000000000101043b000500000002001d000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000503000029000000030030006b000025470000613d000000010200002900000ed302200197000000000023004b000025470000613d000000000101041a000000ff001001900000274a0000613d0000000601000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000101041a00050ed30010019b000000040100002900000ed301100197000000050010006b0000274d0000c13d0000000601000029000000000010043f0000001101000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000201041a00000ed402200197000000000021041b0000000601000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000101041a00000ed301100197000000050010006c0000273a0000c13d0000000601000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000201041a00000ed402200197000000000021041b0000000501000029000000000010043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000101041a000400000001001d000000000001004b000027340000613d0000000601000029000000000010043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d00000004020000290004000100200092000000000101043b000000000301041a0000000501000029000000000010043f0000001401000039000000200010043f000000040030006b000025d60000c13d000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000402000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000001041b0000000601000029000000000010043f0000001501000039000000200010043f00000000010004140000263d0000013d000300000003001d000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000402000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000101041a000100000001001d0000000501000029000000000010043f0000001401000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000302000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000102000029000000000021041b000000000020043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000302000029000000000021041b0000000501000029000000000010043f0000001401000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000402000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000001041b0000000601000029000000000010043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000001041b0000000501000029000000000010043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000201041a000000000002004b000027340000613d000000010220008a000000000021041b00000f6401000041000000000010044300000ece01000041000300000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000027400000613d000000000101043b000000000001004b000027320000613d000000400300043d00000084013000390000000602000029000000000021043500000064013000390000001f02000039000000000021043500000044013000390000002002000039000000000021043500000024013000390000002102000039000000000021043500000fd3010000410000000000130435000000040130003900000018020000390000000000210435000000020100002900000ed302100197000000c401300039000400000002001d0000000000210435000000a401300039000000000001043500000ed00030009c000200000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000fd4011001c700000003020000293b343b2f0000040f0000000100200190000027550000613d000000020100002900000fd50010009c000027750000813d000000400010043f0000000601000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000101041a00000ed3001001980000273a0000c13d0000000601000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000201041a00000ed4022001970000000403000029000000000232019f000000000021041b000000000030043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000101041a000300000001001d0000001401000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000302000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000602000029000000000021041b000000000020043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000302000029000000000021041b0000000401000029000000000010043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b000000000201041a000000010220003a000027340000613d000000000021041b00000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000027400000613d000000000101043b000300000001001d0000000601000029000000000010043f0000001301000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000027320000613d000000000101043b0000000302000029000000000021041b000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d02000039000000040300003900000edf040000410000000505000029000000040600002900000006070000293b343b250000040f0000000100200190000027320000613d000000000001042d000000000100001900003b360001043000000fc201000041000000000010043f0000001101000039000000040010043f00000f710100004100003b360001043000000fc201000041000000000010043f0000000101000039000000040010043f00000f710100004100003b3600010430000000000001042f00000fc201000041000000000010043f0000002101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fc5020000410000274f0000013d000000400100043d00000fca020000410000274f0000013d000000400100043d00000fd202000041000000000021043500000ed00010009c00000ed001008041000000400110021000000f6c011001c700003b360001043000000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000027610000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000275d0000c13d00000ed006600197000000000004004b0000276f0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600160021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b360001043000000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b36000104300006000000000002000300000004001d000500000003001d000600000002001d000400000001001d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000028170000613d0000000002000031000000000101043b00000ed3011001970000000004000411000000000014004b000027990000c13d000000140120008c000027990000413d0000000101100367000000000101043b0000006004100270000000040100002900000006020000290000000503000029000200000004001d3b3424e80000040f00000f6401000041000000000010044300000006010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000028170000613d000000000101043b000000000001004b000028160000613d000000400700043d00000064017000390000008002000039000100000002001d0000000000210435000000440170003900000005020000290000000000210435000000040100002900000ed3011001970000002402700039000000000012043500000fd6010000410000000000170435000000020100002900000ed301100197000000040270003900000000001204350000008402700039000000030100002900000000310104340000000000120435000000a402700039000000000001004b000027cf0000613d000000000400001900000000052400190000000006430019000000000606043300000000006504350000002004400039000000000014004b000027c80000413d0000001f0310003900000fce0330019700000000012100190000000000010435000000a40130003900000ed00010009c00000ed001008041000000600110021000000ed00070009c00000ed00200004100000000020740190000004002200210000000000121019f000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f000000060200002900000ed302200197000600000007001d3b343b250000040f000000060b000029000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027f50000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027f10000c13d000000000006004b000028020000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000281a0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000028520000213d0000000100200190000028520000c13d000000400010043f0000001f0030008c000028180000a13d00000000020b043300000fcc00200198000028180000c13d00000fd60020009c0000281e0000c13d000000000001042d000000000001042f000000000100001900003b3600010430000000000003004b000028200000c13d0000006002000039000028470000013d00000fd9020000410000284c0000013d0000001f0230003900000ed1022001970000003f0220003900000fd704200197000000400200043d0000000004420019000000000024004b0000000005000039000000010500403900000f5a0040009c000028520000213d0000000100500190000028520000c13d000000400040043f0000001f0430018f000000000632043600000ed205300198000100000006001d00000000035600190000283a0000613d000000000601034f0000000107000029000000006806043c0000000007870436000000000037004b000028360000c13d000000000004004b000028470000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000001020433000000000001004b000028580000c13d000000400100043d00000fd802000041000000000021043500000ed00010009c00000ed001008041000000400110021000000f6c011001c700003b360001043000000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000010200002900000ed00020009c00000ed002008041000000400220021000000ed00010009c00000ed0010080410000006001100210000000000121019f00003b3600010430000400000000000200030ed30010019c0000291f0000613d000400000002001d000000000020043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f00000001002001900000291d0000613d000000000101043b000000000101041a00000ed30010019800000004010000290000291f0000c13d000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f00000001002001900000291d0000613d000000000101043b000000000201041a00000ed4022001970000000303000029000000000232019f000000000021041b000000000030043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f00000001002001900000291d0000613d000000000101043b000000000101041a000200000001001d0000001401000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f00000001002001900000291d0000613d000000000101043b0000000202000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f00000001002001900000291d0000613d000000000101043b0000000402000029000000000021041b000000000020043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f00000001002001900000291d0000613d000000000101043b0000000202000029000000000021041b0000000301000029000000000010043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f00000001002001900000291d0000613d000000000101043b000000000201041a000000010220003a000029250000613d000000000021041b00000f6401000041000000000010044300000ece01000041000200000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f00000001002001900000292b0000613d000000000101043b000000000001004b0000291d0000613d000000400300043d000000c4013000390000000302000029000000000021043500000084013000390000000402000029000000000021043500000064013000390000001f02000039000000000021043500000044013000390000002002000039000000000021043500000024013000390000002102000039000000000021043500000fd3010000410000000000130435000000040130003900000018020000390000000000210435000000a401300039000000000001043500000ed00030009c000100000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000fd4011001c700000002020000293b343b2f0000040f00000001002001900000292c0000613d000000010100002900000fd50010009c0000294c0000813d000000400010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d02000039000000040300003900000edf040000410000000005000019000000030600002900000004070000293b343b250000040f00000001002001900000291d0000613d000000000001042d000000000100001900003b360001043000000fc201000041000000000010043f0000000101000039000000040010043f00000f710100004100003b360001043000000fc201000041000000000010043f0000001101000039000000040010043f00000f710100004100003b3600010430000000000001042f00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000029380000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000029340000c13d00000ed006600197000000000004004b000029460000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600160021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b360001043000000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fc00010009c0000295d0000813d0000006002100039000000400020043f00000040021000390000000000020435000000200210003900000000000204350000000000010435000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fda0010009c000029720000813d000000a002100039000000400020043f000000800210003900000000000204350000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b360001043000000fdb0020009c0000297d0000813d00000002022002100000000001120019000000000001042d00000fc201000041000000000010043f0000003201000039000000040010043f00000f710100004100003b36000104300000000002010019000000400100043d00000fda0010009c000029ad0000813d000000a003100039000000400030043f000000000302041a00000f7204300197000000010500008a00000f720040009c000000000500c01900000080045002100000008005300270000000000445019f000000800000008b000000000403601900000f520540019700000f530040019800000f54040000410000000004006019000000000454019f0000002005100039000000000045043500000f520430019700000f530030019800000f54030000410000000003006019000000000343019f00000000003104350000000103200039000000000303041a000000400410003900000000003404350000000203200039000000000303041a000000600410003900000000003404350000000302200039000000000202041a00000080031000390000000000230435000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430001b000000000002000b00000003001d000e00000001001d000000400100043d000a00000001001d00000fda0010009c00002cee0000813d0000000a03000029000000a001300039000000400010043f0000008001300039000000000001043500000060013000390000000000010435000000400130003900000000000104350000000001030436000600000001001d0000000000010435000000400100043d000c00000001001d00000f760010009c00002cee0000213d0000000c03000029000000a001300039000000400010043f000000800430003900000000000404350000006001300039000700000001001d00000000000104350000004001300039000800000001001d00000000000104350000000001030436000900000001001d00000000000104350000001601000039000000000101041a001a00000001001d0000000e0000006b000d00200020003d000500000004001d000029ea0000613d0000000b0300002900000040013000390000000001010433000000000001004b001b00000002001d000029ee0000613d000000000103043300000f530010019800002dbe0000c13d00000f5201100197000029ef0000013d000400000000001d000200000000001d000300000000001d00002a790000013d000000000100001900000000001404350000000d010000290000000001010433001900000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000002daf0000613d000000000101043b000000190010006b0000001b0200002900002a280000a13d000000000202043300000f520320019700000f530020019800000f54020000410000000002006019000000000232019f00000f5e0020009c00002a280000213d000000000002004b00002a280000613d00000fdc0320012a00000f520230019700000f530030019800000f54030000410000000003006019000000000423019f000000060500002900000000004504350000000d040000290000000004040433000000000414004b00002da70000413d00000f530040009c00002db00000813d00000f530030019800000f54030000410000000003006019000000000223019f00000000024200a900000f530020019800000f5403000041000000000300601900000f5204200197000000000343019f000000000023004b00002da70000c13d0000000a0300002900000000002304350000000b0300002900000020063000390000000002060433000000000012004b00002a520000a13d000000000203043300000f520320019700000f530020019800000f54020000410000000002006019000000000232019f00000f5e0020009c00002a520000213d000000000002004b00002a520000613d00000fdc0320012a00000f520230019700000f530030019800000f54030000410000000003006019000000000423019f000000090500002900000000004504350000000004060433000000000114004b00002da70000413d00000f520010009c00002db00000213d00000f530030019800000f54030000410000000003006019000000000223019f00000000011200a900000f530010019800000f5402000041000000000200601900000f5203100197000000000232019f000000000012004b00002da70000c13d0000000c020000290000000000120435001b00000006001d0000000d010000290000000001010433000000000010043f0000001b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d000000000101043b000000000101041a00000f520310019700000f530010019800000f54010000410000000001006019000000000431019f0000001b010000290000000001010433000000000001004b000400000003001d000300000004001d00002a780000613d0000000d020000290000000002020433000000000021004b00002a7e0000c13d000200000003001d000100000004001d000000400200043d00000f760020009c00002a950000a13d00002cee0000013d000200000000001d000100000000001d000000400200043d00000f760020009c00002a950000a13d00002cee0000013d000000000010043f0000001b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d000000000101043b000000000101041a00020f520010019b00000f530010019800000f5401000041000000000100601900000002011001af000100000001001d000000400200043d00000f760020009c00002cee0000213d000000a001200039000000400010043f001900000002001d0000000001020436001b00000001001d000000000001043500000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000002daf0000613d000000000201043b00000019010000290000004001100039001800000001001d001500000002001d000000000021043500000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000002daf0000613d000000000901043b000000190700002900000080027000390000000000020435000000600870003900000000009804350000001a01000029000000000001004b000000060300003900002ce50000613d001900000009001d000000000010043f000000200030043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d000000400700043d00000f760070009c000000190900002900002cee0000213d000000000101043b000000a002700039000000400020043f000000000201041a00000f7203200197000000010400008a00000f720030009c000000000400c01900000080034002100000008004200270000000000334019f000000800000008b000000000302601900000f520430019700000f530030019800000f54030000410000000003006019000000000343019f00000f520420019700000f530020019800000f54020000410000000002006019000000000242019f0000000002270436001b00000002001d0000000000320435000000800570003900000060087000390000004004700039000000030210003900000002031000390000000101100039000000000101041a001800000004001d001700000001001d0000000000140435000000000103041a0000000000180435000000000202041a001100000005001d0000000000250435000000400300043d00000f760030009c00002cee0000213d00000000040704330000001b050000290000000005050433000000a006300039000000400060043f0000008006300039000000000026043500000f520250019700000f530050019800000f54050000410000000005006019000000000225019f0000002005300039000000000025043500000f520240019700000f530040019800000f54040000410000000004006019000000000224019f0000006004300039000f00000004001d000000000014043500000000002304350000004001300039001000000001001d0000001702000029000000000021043500000018010000290000000001010433000000150110006b001200000000001d0000001a0500002900002b260000a13d0000000002080433000000000329004b00002da70000413d00000f77023000d100000f770420012a000000000034004b00002da70000c13d00120000001200e1000000170200002900000f781020012a00000000021200490000000001000019001900000007001d001600000008001d001400000001001d001500000005001d001a0f7a002000a400002da70000813d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000002daf0000613d000000000a01043b0000001a030000290000000000a3004b0000000001000019000000000200001900000000090a001900002b580000213d00130000000a001d000000000030043f0000001b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d000000000101043b000000000201041a00000f520120019700000f530020019800000f54020000410000000002006019000000000212019f0000001a09000029000000130a000029000000170490006c0000001907000029000000160800002900002da70000413d00000f520040009c00002db00000213d0000001b03000029000000000303043300000f520530019700000f530030019800000f54030000410000000003006019000000000353019f00000000044300a900000f530040019800000f5405000041000000000500601900000f5206400197000000000565019f000000000045004b00002da70000c13d000000000507043300000f520650019700000f530050019800000f54050000410000000005006019000000000565019f000000000445004900000f530540009a00000f600050009c00002da70000413d00000f520540019700000f530440019800000f54060000410000000006006019000000000556019f000000000057043500000f530020019800000f54020000410000000002006019000000000112019f000000000131001900000f530210009a00000f600020009c00002da70000413d00000f520210019700000f530010019800000f54010000410000000001006019000000000221019f0000001b030000290000000000230435000000000004004b00002b8f0000613d000000000007043500000f530010019800002b930000613d0000001b0100002900000000000104350000001801000029000000000091043500000010010000290000000001010433000000000219004b00002da70000413d0000000f01000029000000000101043300000012032000b9000000120000006b00002ba10000613d00000012043000fa000000000024004b00002da70000c13d00000f770230012a000000000012001a00002da70000413d000000000112001900000000001804350000001501000029000000010110003a00002da70000613d0000000000a9004b001a00000001001d00002c350000613d001300000009001d000000000010043f0000000601000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d0000001907000029000000000207043300000f5f022001970000001b0300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b000000180200002900000000020204330000000103100039000000000023041b000000160800002900000000020804330000000203100039000000000023041b000000030110003900000011020000290000000002020433000000000021041b0000001401000029000000fe0010008c00000001011000390000001302000029001700000002001d0000001a0500002900002b2c0000413d0000000e0000006b00002c470000613d0000000601000029000000000101043300000f520210019700000f530010019800000f54010000410000000001006019000000000121019f0000000902000029000000000202043300000f520320019700000f530020019800000f54020000410000000002006019000000000232019f000000000112004900000f530210009a00000f600020009c00002da70000413d00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f0000001b02000029000000000202043300000f520320019700000f530020019800000f54020000410000000002006019000000000232019f000000000112001900000f530210009a00000f600020009c00002da70000413d00000f520210019700000f530110019800000f54030000410000000003006019000000000223019f0000001b0300002900000000002304350000000a02000029000000000202043300000f520320019700000f530020019800000f54020000410000000002006019000000000232019f0000000c03000029000000000303043300000f520430019700000f530030019800000f54030000410000000003006019000000000343019f000000000223004900000f530320009a00000f600030009c00002da70000413d00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f000000000307043300000f520430019700000f530030019800000f54030000410000000003006019000000000343019f000000000223001900000f530320009a00000f600030009c00002da70000413d00000f520320019700000f530020019800000f54020000410000000002006019000000000332019f0000000000370435000000000001004b00002c2b0000613d0000001b01000029000000000001043500000f530020019800002c2e0000613d00000000000704350000001d01000039000000000101041a00000011020000290000000000120435000000150000006b00002c490000c13d00002c6f0000013d00000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000002daf0000613d000000000101043b000000160200002900000000001204350000001a0500002900000019070000290000000e0000006b00002bd70000c13d000000150000006b00002c6f0000613d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000002daf0000613d000000000101043b001700000001001d0000001501000029000000000010043f0000000601000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d000000000101043b0000000101100039000000000101041a000000170010006c0000001a0500002900002c6f0000c13d0000001501000029000000000010043f0000000601000039000000200010043f000000000100041400002c750000013d0000001601000039000000000051041b000000000050043f0000000601000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d0000001902000029000000000202043300000f5f022001970000001b0300002900000000030304330000008003300210000000000223019f000000000101043b000000000021041b000000180200002900000000020204330000000103100039000000000023041b000000160200002900000000020204330000000203100039000000000023041b000000030110003900000011020000290000000002020433000000000021041b0000000e0000006b00002da60000613d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000002daf0000613d000000000501043b0000000d010000290000000001010433000000000051004b001a00000005001d00002cf40000a13d000000030200002900000f530020019800000f5402000041000000000200601900000004022001af0000000603000029000000000303043300000f520430019700000f530030019800000f54030000410000000003006019000000000343019f000000000423001900000f530240009a00000f600020009c00002da70000413d0000000b0200002900000020032000390000000002030433000000000012004b001b00000003001d00002ccb0000c13d00000f520240019700000f530040019800000f54030000410000000003006019000000000223019f0000000903000029000000000303043300000f520430019700000f530030019800000f54030000410000000003006019000000000343019f000000000432004900000f530240009a00000f600020009c00002da70000413d001900000004001d000000000010043f0000001b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d000000190200002900000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b0000001a050000290000001b010000290000000001010433000000000051004b00002cf90000213d00002d220000013d001100000002001d00000018010000290000000001010433001700000001001d00000000020000190000000001090019000000400300043d00000f760030009c00002afd0000a13d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b36000104300000000b0100002900000020011000390000000001010433000000000051004b00002d220000a13d0000000d020000290000000002020433000000000021004b00002d220000a13d000000010200002900000f530020019800000f5402000041000000000200601900000002022001af0000000903000029000000000303043300000f520430019700000f530030019800000f54030000410000000003006019000000000343019f0000000002320049001b00000002001d00000f530220009a00000f600020009c00002da70000413d000000000010043f0000001b01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d0000001b0200002900000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b0000001a050000290000000801000029000000000051043500000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000002daf0000613d000000000101043b000000070200002900000000001204350000000e01000029000000000010043f0000001a01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d000000000101043b000000000301041a000000000003004b0000001902000039001b00000003001d00002d6c0000613d0000000e01000029000000000010043f000000200020043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d0000001b0300002900000fdb0030009c00002db80000813d0000000204300210000000000101043b00000000014100190000000101100039000000000101041a0000001a0010006c000000190200003900002d6c0000c13d001b00000004001d0000000e01000029000000000010043f000000200020043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d000000000101043b0000001b0200002900002d910000013d0000000e01000029000000000010043f0000001a01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d0000001b020000290000000102200039000000000101043b001a00000002001d000000000021041b0000000e01000029000000000010043f0000001901000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000002dad0000613d0000001b0200002900000fdd0020009c00002db80000213d0000001a020000290000000202200210000000000101043b00000000012100190000000c02000029000000000202043300000f5f02200197000000090300002900000000030304330000008003300210000000000223019f000000000021041b000000080200002900000000020204330000000103100039000000000023041b000000070200002900000000020204330000000203100039000000000023041b000000030110003900000005020000290000000002020433000000000021041b000000000001042d00000fc201000041000000000010043f0000001101000039000000040010043f00000f710100004100003b3600010430000000000100001900003b3600010430000000000001042f000000400100043d00000fb202000041000000000021043500000ed00010009c00000ed001008041000000400110021000000f6c011001c700003b360001043000000fc201000041000000000010043f0000003201000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fb90200004100002db20000013d0004000000000002000000400500043d0000006406500039000000000046043500000ed30330019700000044045000390000000000340435000000200350003900000fde04000041000000000043043500000ed302200197000000240450003900000000002404350000006402000039000000000025043500000fda0050009c00002e460000813d000000a004500039000000400040043f00000fdf0050009c00002e460000213d00000ed302100197000000e001500039000000400010043f0000002001000039000300000004001d0000000000140435000000c00150003900000fe004000041000000000041043500000ed00030009c00000ed0030080410000004001300210000000000305043300000ed00030009c00000ed0030080410000006003300210000000000113019f000000000300041400000ed00030009c00000ed003008041000000c003300210000000000131019f000400000002001d3b343b250000040f000000600310027000000ed00330019800002e180000613d0000001f0430003900000ed1044001970000003f0440003900000fd704400197000000400a00043d00000000044a00190000000000a4004b0000000005000039000000010500403900000f5a0040009c00002e460000213d000000010050019000002e460000c13d000000400040043f0000001f0430018f00000000093a043600000ed205300198000000000359001900002e0a0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b00002e060000c13d000000000004004b00002e1a0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500002e1a0000013d000000600a0000390000008009000039000000000300041500000000010a0433000000010020019000002e4e0000613d000000000001004b00002e360000c13d000100000003001d00020000000a001d000300000009001d00000f6401000041000000000010044300000004010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f000000010020019000002e7d0000613d000000000101043b000000000001004b0000000309000029000000020a000029000000010300002900002e7e0000613d00000000010004150000000001130049000000000100000200000000010a0433000000000001004b00002e450000613d00000f5e0010009c00002e4c0000213d000000200010008c00002e4c0000413d0000000001090433000000010010008c00002e4c0000213d000000000001004b00002e610000613d000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000000100001900003b3600010430000000000001004b00002e750000c13d000000400200043d000400000002001d00000fc6010000410000000000120435000000040120003900000003020000293b3423c70000040f0000000402000029000000000121004900000ed00010009c00000ed001008041000000600110021000000ed00020009c00000ed0020080410000004002200210000000000121019f00003b3600010430000000400100043d000000640210003900000fe1030000410000000000320435000000440210003900000fe203000041000000000032043500000024021000390000002a03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000f59011001c700003b360001043000000ed00090009c00000ed009008041000000400290021000000ed00010009c00000ed0010080410000006001100210000000000121019f00003b3600010430000000000001042f000000400100043d000000440210003900000fe303000041000000000032043500000024021000390000001d03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000fd1011001c700003b36000104300004000000000002000000400400043d00000fd00040009c00002f050000813d00000ed3051001970000004001400039000000400010043f000000200140003900000fe00300004100000000003104350000002001000039000300000004001d0000000000140435000000200120003900000ed00010009c00000ed0010080410000004001100210000000000202043300000ed00020009c00000ed0020080410000006002200210000000000112019f000000000200041400000ed00020009c00000ed002008041000000c002200210000000000121019f000400000005001d00000000020500193b343b250000040f000000600310027000000ed00330019800002ed70000613d0000001f0430003900000ed1044001970000003f0440003900000fd704400197000000400a00043d00000000044a00190000000000a4004b0000000005000039000000010500403900000f5a0040009c00002f050000213d000000010050019000002f050000c13d000000400040043f0000001f0430018f00000000093a043600000ed205300198000000000359001900002ec90000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b00002ec50000c13d000000000004004b00002ed90000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500002ed90000013d000000600a0000390000008009000039000000000300041500000000010a0433000000010020019000002f0d0000613d000000000001004b00002ef50000c13d000100000003001d00020000000a001d000300000009001d00000f6401000041000000000010044300000004010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f000000010020019000002f3c0000613d000000000101043b000000000001004b0000000309000029000000020a000029000000010300002900002f3d0000613d00000000010004150000000001130049000000000100000200000000010a0433000000000001004b00002f040000613d00000f5e0010009c00002f0b0000213d000000200010008c00002f0b0000413d0000000001090433000000010010008c00002f0b0000213d000000000001004b00002f200000613d000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000000100001900003b3600010430000000000001004b00002f340000c13d000000400200043d000400000002001d00000fc6010000410000000000120435000000040120003900000003020000293b3423c70000040f0000000402000029000000000121004900000ed00010009c00000ed001008041000000600110021000000ed00020009c00000ed0020080410000004002200210000000000121019f00003b3600010430000000400100043d000000640210003900000fe1030000410000000000320435000000440210003900000fe203000041000000000032043500000024021000390000002a03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000f59011001c700003b360001043000000ed00090009c00000ed009008041000000400290021000000ed00010009c00000ed0010080410000006001100210000000000121019f00003b3600010430000000000001042f000000400100043d000000440210003900000fe303000041000000000032043500000024021000390000001d03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000fd1011001c700003b3600010430000a000000000002000800000003001d000a00000002001d000900000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000031ac0000613d000000000101043b0000000a02100029000000000021004b000031ad0000213d00000f783020012a000000090000006b000031b90000613d0007000000320051000000070010006b000031bc0000a13d00000f840110009c000031ad0000813d000000070010006b000031bf0000213d0000000801000039000000000201041a000a00010020003e000031ad0000613d0000000a02000029000000000021041b0000000001020019000000080200002900080ed30020019c000031b30000613d000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000031a40000613d000000000101043b000000000101041a00000ed3001001980000000a01000029000031b30000c13d000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000031a40000613d000000000101043b000000000201041a00000ed4022001970000000803000029000000000232019f000000000021041b000000000030043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000031a40000613d000000000101043b000000000101041a000600000001001d0000001401000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000031a40000613d000000000101043b0000000602000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000031a40000613d000000000101043b0000000a02000029000000000021041b000000000020043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000031a40000613d000000000101043b0000000602000029000000000021041b0000000801000029000000000010043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000031a40000613d000000000101043b000000000201041a000000010220003a000031ad0000613d000000000021041b00000f6401000041000000000010044300000ece01000041000600000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000031ac0000613d000000000101043b000000000001004b000031a40000613d000000400300043d000000c4013000390000000802000029000000000021043500000084013000390000000a02000029000000000021043500000064013000390000001f02000039000000000021043500000044013000390000002002000039000000000021043500000024013000390000002102000039000000000021043500000fd3010000410000000000130435000000040130003900000018020000390000000000210435000000a401300039000000000001043500000ed00030009c000500000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000fd4011001c700000006020000293b343b2f0000040f0000000100200190000031c20000613d000000050100002900000fd50010009c000031a60000813d000000400010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d02000039000000040300003900000edf04000041000000000500001900000008060000290000000a070000293b343b250000040f0000000100200190000031a40000613d0000000a01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000031a40000613d000000400700043d00000f5d0070009c000031a60000213d000000000301043b0000006001700039000000400010043f000000000103041a00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f00000000011704360000000102300039000000000202041a000000000021043500000040027000390000000203300039000000000303041a000000ff003001900000000003000039000000010300c03900000000003204350000001703000039000000000503041a000600000005001d000000090050002a000031ad0000413d00000006050000290000000904500029000300000004001d000000000043041b000000400800043d00000f5d0080009c000031a60000213d0000006003800039000000400030043f0000004009800039000000000009043500000020068000390000000000060435000000000008043500000000030204330000000004010433000000000207043300000f520120019700000f530020019800000f54020000410000000002006019000000000512019f0000000000580435000800000006001d0000000000460435000000000003004b0000000003000039000000010300c0390000000000390435000000090300002900000f530030009c000031e20000813d000500000009001d00000f530020019800000f54020000410000000002006019000000000112019f000000000131001900000f530210009a00000f600020009c000031ad0000413d000400000007001d00000f520210019700000f530010019800000f54010000410000000001006019000000000121019f00000000001804350000000701000029000000080200002900000000001204350000000a01000029000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c70000801002000039000700000008001d3b343b2a0000040f0000000100200190000031a40000613d0000000704000029000000000204043300000f5f02200197000000000101043b000000000301041a00000f6003300197000000000223019f000000000021041b000000080200002900000000020204330000000103100039000000000023041b0000000201100039000000000301041a00000fcd0230019700000005030000290000000003030433000000000003004b000000010220c1bf000000000021041b0000000a01000029000000040200002900000000030400193b3429b30000040f00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000031ac0000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b000030c90000c13d000000140120008c0000000002000412000030ca0000413d0000000101100367000000000101043b0000006003100270000030ca0000013d0000000002000412000700000003001d00000f50010000410000000000100443000000040020044300000060010000390000002400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000031ac0000613d000000000301043b000000400100043d000000640210003900000009040000290000000000420435000000000200041000000ed30220019700000044041000390000000000240435000000200610003900000fde04000041000000000046043500000064040000390000000000410435000000070200002900000ed3052001970000002404100039000700000005001d000000000054043500000f760010009c000031a60000213d000000a004100039000000400040043f00000fdf0010009c000031a60000213d00000ed302300197000000e003100039000000400030043f0000002003000039000400000004001d0000000000340435000000c00310003900000fe004000041000000000043043500000ed00060009c00000ed0060080410000004003600210000000000101043300000ed00010009c00000ed0010080410000006001100210000000000131019f000000000300041400000ed00030009c00000ed003008041000000c003300210000000000131019f000500000002001d3b343b250000040f000000600310027000000ed003300198000031350000613d0000001f0430003900000ed1044001970000003f0440003900000fd704400197000000400500043d00000000044500190000000009050019000000000054004b0000000005000039000000010500403900000f5a0040009c000031a60000213d0000000100500190000031a60000c13d000000400040043f0000001f0430018f000000000a39043600000ed20530019800000000035a0019000031270000613d000000000601034f00000000070a0019000000006806043c0000000007870436000000000037004b000031230000c13d000000000004004b000031370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000031370000013d000000800a0000390000006009000039000000000300041500000000010904330000000100200190000031ea0000613d000000000001004b000031530000c13d000100000003001d00020000000a001d000400000009001d00000f6401000041000000000010044300000005010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000031ac0000613d000000000101043b000000000001004b0000000409000029000000020a0000290000000103000029000032190000613d0000000001000415000000000113004900000000010000020000000001090433000000000001004b000031620000613d00000f5e0010009c000031a40000213d000000200010008c000031a40000413d00000000010a0433000000010010008c000031a40000213d000000000001004b000031fd0000613d00000008010000290000000001010433000500000001001d000000400100043d000800000001001d00000ed8010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000031ac0000613d000000000101043b0000000803000029000000400230003900000000001204350000002001300039000000050200002900000000002104350000000901000029000000000013043500000ed00030009c00000ed0030080410000004001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f7d011001c70000800d020000390000000403000039000000010700003900000f7e0400004100000007050000290000000a060000293b343b250000040f0000000100200190000031a40000613d000000400100043d0000002002100039000000030300002900000000003204350000000602000029000000000021043500000ed00010009c00000ed0010080410000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ed5011001c70000800d02000039000000010300003900000f7f040000413b343b250000040f0000000100200190000031a40000613d0000000a01000029000000000001042d000000000100001900003b360001043000000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000000001042f00000fc201000041000000000010043f0000001101000039000000040010043f00000f710100004100003b360001043000000fc201000041000000000010043f0000000101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fc402000041000031e40000013d000000400100043d00000f8202000041000031e40000013d000000400100043d00000f8502000041000031e40000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000031ce0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000031ca0000c13d00000ed006600197000000000004004b000031dc0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600160021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b3600010430000000400100043d00000fb202000041000000000021043500000ed00010009c00000ed001008041000000400110021000000f6c011001c700003b3600010430000000000001004b000032110000c13d000000400200043d000a00000002001d00000fc6010000410000000000120435000000040120003900000004020000293b3423c70000040f0000000a02000029000000000121004900000ed00010009c00000ed001008041000000600110021000000ed00020009c00000ed0020080410000004002200210000000000121019f00003b3600010430000000400100043d000000640210003900000fe1030000410000000000320435000000440210003900000fe203000041000000000032043500000024021000390000002a03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000f59011001c700003b360001043000000ed000a0009c00000ed00a0080410000004002a0021000000ed00010009c00000ed0010080410000006001100210000000000121019f00003b3600010430000000400100043d000000440210003900000fe303000041000000000032043500000024021000390000001d03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000fd1011001c700003b36000104300004000000000002000000400300043d000000200430003900000fe405000041000000000054043500000ed30220019700000024053000390000000000250435000000440200003900000000002304350000004402300039000000000002043500000fcf0030009c000032ac0000813d0000008005300039000000400050043f00000f940030009c000032ac0000213d00000ed302100197000000c001300039000000400010043f0000002001000039000300000005001d0000000000150435000000a00130003900000fe005000041000000000051043500000ed00040009c00000ed0040080410000004001400210000000000303043300000ed00030009c00000ed0030080410000006003300210000000000113019f000000000300041400000ed00030009c00000ed003008041000000c003300210000000000131019f000400000002001d3b343b250000040f000000600310027000000ed0033001980000327e0000613d0000001f0430003900000ed1044001970000003f0440003900000fd704400197000000400a00043d00000000044a00190000000000a4004b0000000005000039000000010500403900000f5a0040009c000032ac0000213d0000000100500190000032ac0000c13d000000400040043f0000001f0430018f00000000093a043600000ed2053001980000000003590019000032700000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000326c0000c13d000000000004004b000032800000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000032800000013d000000600a0000390000008009000039000000000300041500000000010a04330000000100200190000032b40000613d000000000001004b0000329c0000c13d000100000003001d00020000000a001d000300000009001d00000f6401000041000000000010044300000004010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000032e30000613d000000000101043b000000000001004b0000000309000029000000020a0000290000000103000029000032e40000613d00000000010004150000000001130049000000000100000200000000010a0433000000000001004b000032ab0000613d00000f5e0010009c000032b20000213d000000200010008c000032b20000413d0000000001090433000000010010008c000032b20000213d000000000001004b000032c70000613d000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000000100001900003b3600010430000000000001004b000032db0000c13d000000400200043d000400000002001d00000fc6010000410000000000120435000000040120003900000003020000293b3423c70000040f0000000402000029000000000121004900000ed00010009c00000ed001008041000000600110021000000ed00020009c00000ed0020080410000004002200210000000000121019f00003b3600010430000000400100043d000000640210003900000fe1030000410000000000320435000000440210003900000fe203000041000000000032043500000024021000390000002a03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000f59011001c700003b360001043000000ed00090009c00000ed009008041000000400290021000000ed00010009c00000ed0010080410000006001100210000000000121019f00003b3600010430000000000001042f000000400100043d000000440210003900000fe303000041000000000032043500000024021000390000001d03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000fd1011001c700003b360001043000040000000000020000000004010019000000000003004b000033500000613d000100000003001d000000400500043d000400000005001d00000fe5010000410000000000150435000000000100041000000ed3011001970000000403500039000000000013043500000ed3022001970000002401500039000200000002001d000000000021043500000ed00050009c00000ed00100004100000000010540190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f69011001c7000300000004001d00000ed3024001973b343b2a0000040f000000040b000029000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000033230000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000331f0000c13d000000000006004b000033300000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000033f00000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c00000003040000290000000205000029000033d50000213d0000000100200190000033d50000c13d000000400010043f000000200030008c000033db0000413d00000000020b04330000000001000415000000000002004b0000000103000029000033520000613d000000400100043d000000640210003900000fe6030000410000000000320435000000440210003900000fe703000041000000000032043500000024021000390000003603000039000034170000013d000000000100041500000ed305200197000000000200041500000000012100490000000001000002000000400100043d00000044021000390000000000320435000000200610003900000fe4030000410000000000360435000000240310003900000000005304350000004403000039000000000031043500000fcf0010009c000033d50000813d0000008005100039000000400050043f00000f8f0050009c000033d50000213d00000ed302400197000000c003100039000000400030043f0000002003000039000300000005001d0000000000350435000000a00310003900000fe004000041000000000043043500000ed00060009c00000ed0060080410000004003600210000000000101043300000ed00010009c00000ed0010080410000006001100210000000000131019f000000000300041400000ed00030009c00000ed003008041000000c003300210000000000131019f000400000002001d3b343b250000040f000000600310027000000ed003300198000033a70000613d0000001f0430003900000ed1044001970000003f0440003900000fd704400197000000400a00043d00000000044a00190000000000a4004b0000000005000039000000010500403900000f5a0040009c000033d50000213d0000000100500190000033d50000c13d000000400040043f0000001f0430018f00000000093a043600000ed2053001980000000003590019000033990000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000033950000c13d000000000004004b000033a90000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000033a90000013d000000600a0000390000008009000039000000000300041500000000010a04330000000100200190000033dd0000613d000000000001004b000033c50000c13d000100000003001d00020000000a001d000300000009001d00000f6401000041000000000010044300000004010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f00000001002001900000342a0000613d000000000101043b000000000001004b0000000309000029000000020a00002900000001030000290000342b0000613d00000000010004150000000001130049000000000100000200000000010a0433000000000001004b000033d40000613d00000f5e0010009c000033db0000213d000000200010008c000033db0000413d0000000001090433000000010010008c000033db0000213d000000000001004b0000340e0000613d000000000001042d00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000000100001900003b3600010430000000000001004b000034220000c13d000000400200043d000400000002001d00000fc6010000410000000000120435000000040120003900000003020000293b3423c70000040f0000000402000029000000000121004900000ed00010009c00000ed001008041000000600110021000000ed00020009c00000ed0020080410000004002200210000000000121019f00003b36000104300000001f0530018f00000ed206300198000000400200043d0000000004620019000033fb0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000033f70000c13d000000000005004b000034080000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000600130021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b3600010430000000400100043d000000640210003900000fe1030000410000000000320435000000440210003900000fe203000041000000000032043500000024021000390000002a03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000f59011001c700003b360001043000000ed00090009c00000ed009008041000000400290021000000ed00010009c00000ed0010080410000006001100210000000000121019f00003b3600010430000000000001042f000000400100043d000000440210003900000fe303000041000000000032043500000024021000390000001d03000039000000000032043500000fc602000041000000000021043500000004021000390000002003000039000000000032043500000ed00010009c00000ed001008041000000400110021000000fd1011001c700003b36000104300005000000000002000500000001001d00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000035f90000613d0000000002000031000000000101043b00000ed3011001970000000003000411000000000013004b000034570000c13d000000140120008c000034570000413d0000000101100367000000000101043b0000006003100270000400000003001d0000000501000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000101041a000300000001001d0000001101000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000030200002900000ed302200197000000000101043b000000000101041a000200000001001d000300000002001d000000000020043f0000001201000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000040200002900000ed302200197000000000101043b000400000002001d000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b0000000403000029000000030030006b0000349f0000613d000000020200002900000ed302200197000000000023004b0000349f0000613d000000000101041a000000ff00100190000036000000613d0000000501000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000101041a000300000001001d0000001101000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000201041a00000ed402200197000000000021041b00000f6401000041000000000010044300000ece01000041000400000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000035f90000613d000000000101043b000000000001004b000035f70000613d000000400300043d00000084013000390000000502000029000000000021043500000064013000390000001f02000039000000000021043500000044013000390000002002000039000000000021043500000024013000390000002102000039000000000021043500000fd3010000410000000000130435000000040130003900000018020000390000000000210435000000c4013000390000000000010435000000a401300039000000000001043500000ed00030009c000200000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000fd4011001c700000004020000293b343b2f0000040f0000000100200190000036080000613d000000020100002900000fd50010009c000036280000813d000000400010043f0000000501000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000030200002900040ed30020019b000000000101043b000000000101041a00000ed301100197000000040010006c0000362e0000c13d0000000501000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000201041a00000ed402200197000000000021041b0000000401000029000000000010043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000101041a000300000001001d000000000001004b000035fa0000613d0000000501000029000000000010043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d00000003020000290003000100200092000000000101043b000000000301041a0000000401000029000000000010043f0000001401000039000000200010043f000000030030006b000035640000c13d000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b0000000302000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000001041b0000000501000029000000000010043f0000001501000039000000200010043f0000000001000414000035cb0000013d000200000003001d000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b0000000302000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000101041a000100000001001d0000000401000029000000000010043f0000001401000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b0000000202000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b0000000102000029000000000021041b000000000020043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b0000000202000029000000000021041b0000000401000029000000000010043f0000001401000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b0000000302000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000001041b0000000501000029000000000010043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000001041b0000000401000029000000000010043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000035f70000613d000000000101043b000000000201041a000000000002004b000035fa0000613d000000010220008a000000000021041b000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d02000039000000040300003900000edf040000410000000405000029000000000600001900000005070000293b343b250000040f0000000100200190000035f70000613d000000000001042d000000000100001900003b3600010430000000000001042f00000fc201000041000000000010043f0000001101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fca02000041000000000021043500000ed00010009c00000ed001008041000000400110021000000f6c011001c700003b360001043000000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000036140000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000036100000c13d00000ed006600197000000000004004b000036220000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600160021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b360001043000000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b360001043000000fc201000041000000000010043f0000000101000039000000040010043f00000f710100004100003b36000104300004000000000002000300000002001d000200000001001d0000000801000039000000000201041a000000010220003a0000372d0000613d000000000021041b000400000002001d000000000020043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000037250000613d0000000303000029000000005203043400000f5f02200197000000000101043b000000000401041a00000f6004400197000000000224019f000000000021041b00000000020504330000000104100039000000000024041b0000000201100039000000000401041a00000fcd0240019700000040043000390000000004040433000000000004004b000000010220c1bf000000000021041b000000400200043d00000fc00020009c0000000401000029000037330000813d0000006004200039000000400040043f000000400420003900000000000404350000002004200039000000000004043500000000000204353b3429b30000040f000000020100002900030ed30010019c000037270000613d0000000401000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000037250000613d000000000101043b000000000101041a00000ed3001001980000000401000029000037270000c13d000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000037250000613d000000000101043b000000000201041a00000ed4022001970000000303000029000000000232019f000000000021041b000000000030043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000037250000613d000000000101043b000000000101041a000200000001001d0000001401000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000037250000613d000000000101043b0000000202000029000000000020043f000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000037250000613d000000000101043b0000000402000029000000000021041b000000000020043f0000001501000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000037250000613d000000000101043b0000000202000029000000000021041b0000000301000029000000000010043f0000001001000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000037250000613d000000000101043b000000000201041a000000010220003a0000372d0000613d000000000021041b00000f6401000041000000000010044300000ece01000041000200000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000037390000613d000000000101043b000000000001004b000037250000613d000000400300043d000000c4013000390000000302000029000000000021043500000084013000390000000402000029000000000021043500000064013000390000001f02000039000000000021043500000044013000390000002002000039000000000021043500000024013000390000002102000039000000000021043500000fd3010000410000000000130435000000040130003900000018020000390000000000210435000000a401300039000000000001043500000ed00030009c000100000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000fd4011001c700000002020000293b343b2f0000040f00000001002001900000373a0000613d000000010100002900000f5a0010009c0000000407000029000037330000213d000000400010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ede011001c70000800d02000039000000040300003900000edf04000041000000000500001900000003060000293b343b250000040f0000000100200190000037250000613d0000000401000029000000000001042d000000000100001900003b360001043000000fc201000041000000000010043f0000000101000039000000040010043f00000f710100004100003b360001043000000fc201000041000000000010043f0000001101000039000000040010043f00000f710100004100003b360001043000000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000000001042f00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000037460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000037420000c13d00000ed006600197000000000004004b000037540000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600160021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b36000104300001000000000002000000400400043d000100000004001d000000640340003900000000002304350000004402400039000000000012043500000024014000390000001902000039000000000021043500000f5801000041000000000014043500000004014000390000001a02000039000000000021043500000ed00040009c00000ed00100004100000000010440190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f59011001c700000ecf020000413b343b2f0000040f000000010b000029000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000037850000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000037810000c13d000000000006004b000037920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000037a30000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000037c10000213d0000000100200190000037c10000c13d000000400010043f0000001f0030008c000037c70000a13d00000000010b0433000000000001042d0000001f0530018f00000ed206300198000000400200043d0000000004620019000037ae0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000037aa0000c13d000000000005004b000037bb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000600130021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b360001043000000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000000100001900003b360001043000010000000000020000001602000039000000000202041a000000400400043d000100000004001d000000640340003900000000001304350000004401400039000000000021043500000024014000390000000602000039000000000021043500000fe801000041000000000014043500000004014000390000001b02000039000000000021043500000ed00040009c00000ed00100004100000000010440190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f59011001c700000ecf020000413b343b2f0000040f000000010b000029000000600310027000000ed003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000037f60000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000037f20000c13d000000000006004b000038030000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000038140000613d0000001f01400039000000600210018f0000000001b20019000000000021004b0000000002000039000000010200403900000f5a0010009c000038320000213d0000000100200190000038320000c13d000000400010043f0000001f0030008c000038380000a13d00000000010b0433000000000001042d0000001f0530018f00000ed206300198000000400200043d00000000046200190000381f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000381b0000c13d000000000005004b0000382c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000600130021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b360001043000000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000000100001900003b36000104300006000000000002000500000001001d000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000039460000613d000000400400043d00000fc00040009c000039490000813d000000000101043b0000006002400039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f00000000022404360000000103100039000000000303041a0000000000320435000300000004001d00000040024000390000000201100039000000000101041a000000ff001001900000000001000039000000010100c03900000000001204350000394f0000613d0000000501000029000000000010043f0000001301000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000039460000613d000000000101043b000000000101041a000400000001001d00000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f0000000100200190000039480000613d000000000101043b000000040010006b000039520000613d0000000501000029000000000001004b0000001f02000039000038870000613d000000000010043f000000200020043f00000000010004140000388a0000013d000000000000043f000000200020043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000039460000613d000000000101043b000000000101041a000600000001001d000200000001001d000000000001004b000039450000613d00000003010000290000000001010433000100000001001d00000f5300100198000039550000c13d0000000501000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000100200190000039460000613d000000000101043b000000000101041a000300000001001d00000f6401000041000000000010044300000ece01000041000400000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000039480000613d000000000101043b000000000001004b000039460000613d000000030100002900000ed301100197000000400300043d000000c402300039000000000012043500000084013000390000000502000029000000000021043500000064013000390000001f02000039000000000021043500000044013000390000002002000039000000000021043500000024013000390000002102000039000000000021043500000fd3010000410000000000130435000000040130003900000018020000390000000000210435000000a401300039000000000001043500000ed00030009c000500000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000fd4011001c700000004020000293b343b2f0000040f00000001002001900000395d0000613d000000050100002900000f5a0010009c000039490000213d000000400010043f00000f6401000041000000000010044300000004010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f0000000100200190000039480000613d000000000101043b000000000001004b000039460000613d000000010100002900000f5201100197000000400400043d0000008402400039000000010300003900000000003204350000006402400039000000000012043500000024014000390000002002000039000000000021043500000f660100004100000000001404350000000401400039000000210200003900000000002104350000004401400039000000000001043500000ed00040009c000500000004001d00000ed00100004100000000010440190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f67011001c700000004020000293b343b2f0000040f00000001002001900000396a0000613d000000050100002900000f5a0010009c000039490000213d000000400010043f00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f0000000100200190000039480000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b000039370000c13d000000140220008c000039370000413d0000000101200367000000000101043b0000006001100270000000000200041400000ed00020009c00000ed00200804100000ed305100197000000c00120021000000ede011001c70000800d02000039000000040300003900000fe904000041000000020600002900000000070000193b343b250000040f0000000100200190000039460000613d000000000001042d000000000100001900003b3600010430000000000001042f00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fb402000041000039570000013d000000400100043d00000fea02000041000039570000013d000000400100043d00000fb902000041000000000021043500000ed00010009c00000ed001008041000000400110021000000f6c011001c700003b360001043000000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000039760000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000039650000c13d000039760000013d00000060061002700000001f0460018f00000ed205600198000000400200043d0000000003520019000039760000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000039720000c13d00000ed006600197000000000004004b000039840000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600160021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b36000104300006000000000002000600000002001d000500000001001d000000000010043f0000001801000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000003aaa0000613d000000400400043d00000fc00040009c00003aad0000813d000000000101043b0000006002400039000000400020043f000000000201041a00000f520320019700000f530020019800000f54020000410000000002006019000000000232019f00000000022404360000000103100039000000000303041a0000000000320435000300000004001d00000040024000390000000201100039000000000101041a000000ff001001900000000001000039000000010100c039000000000012043500003ab30000613d000000060000006b000039c50000613d0000000601000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000003aaa0000613d000000000101043b000000000101041a00000ed30010019800003ab90000613d0000000501000029000000000010043f0000001301000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000003aaa0000613d000000000101043b000000000101041a000400000001001d00000ed6010000410000000000100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed7011001c70000800b020000393b343b2a0000040f000000010020019000003aac0000613d000000000101043b000000040010006b00003ab60000613d0000000501000029000000000010043f0000001f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f0000000504000029000000060040006b00000006030000290000000003006019000600000003001d000000010020019000003aaa0000613d000000000101043b000000000201041a000200000002001d000000060020006c00003aa90000613d00000003010000290000000001010433000100000001001d00000f530010019800003abc0000c13d0000000501000029000000000010043f0000000f01000039000000200010043f000000000100041400000ed00010009c00000ed001008041000000c00110021000000ed5011001c700008010020000393b343b2a0000040f000000010020019000003aaa0000613d000000000101043b000000000101041a000300000001001d00000f6401000041000000000010044300000ece01000041000400000001001d0000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f000000010020019000003aac0000613d000000000101043b000000000001004b00003aaa0000613d000000030100002900000ed301100197000000400300043d000000c4023000390000000000120435000000a4013000390000000602000029000000000021043500000084013000390000000502000029000000000021043500000064013000390000001f02000039000000000021043500000044013000390000002002000039000000000021043500000024013000390000002102000039000000000021043500000fd301000041000000000013043500000004013000390000001802000039000000000021043500000ed00030009c000500000003001d00000ed00100004100000000010340190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000fd4011001c700000004020000293b343b2f0000040f000000010020019000003ac40000613d000000050100002900000f5a0010009c00003aad0000213d000000400010043f00000f6401000041000000000010044300000004010000290000000400100443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f65011001c700008002020000393b343b2a0000040f000000010020019000003aac0000613d000000000101043b000000000001004b00003aaa0000613d000000010100002900000f5201100197000000400400043d0000008402400039000000010300003900000000003204350000006402400039000000000012043500000044014000390000000602000029000000000021043500000024014000390000002002000039000000000021043500000f6601000041000000000014043500000004014000390000002102000039000000000021043500000ed00040009c000500000004001d00000ed00100004100000000010440190000004001100210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000f67011001c700000004020000293b343b2f0000040f000000010020019000003ad10000613d000000050100002900000f5a0010009c00003aad0000213d000000400010043f00000f50010000410000000000100443000000000100041200000004001004430000002400000443000000000100041400000ed00010009c00000ed001008041000000c00110021000000f5c011001c700008005020000393b343b2a0000040f000000010020019000003aac0000613d0000000002000031000000000101043b00000ed3031001970000000001000411000000000031004b00003a9b0000c13d000000140220008c00003a9b0000413d0000000101200367000000000101043b0000006001100270000000000200041400000ed00020009c00000ed002008041000000c00220021000000ed30510019700000ede012001c70000800d02000039000000040300003900000fe904000041000000020600002900000006070000293b343b250000040f000000010020019000003aaa0000613d000000000001042d000000000100001900003b3600010430000000000001042f00000fc201000041000000000010043f0000004101000039000000040010043f00000f710100004100003b3600010430000000400100043d00000fb40200004100003abe0000013d000000400100043d00000fea0200004100003abe0000013d000000400100043d00000f750200004100003abe0000013d000000400100043d00000fb902000041000000000021043500000ed00010009c00000ed001008041000000400110021000000f6c011001c700003b360001043000000060061002700000001f0460018f00000ed205600198000000400200043d000000000352001900003add0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00003acc0000c13d00003add0000013d00000060061002700000001f0460018f00000ed205600198000000400200043d000000000352001900003add0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00003ad90000c13d00000ed006600197000000000004004b00003aeb0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600160021000000ed00020009c00000ed0020080410000004002200210000000000112019f00003b3600010430000000000001042f00000ed00010009c00000ed001008041000000400110021000000ed00020009c00000ed0020080410000006002200210000000000112019f000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000ede011001c700008010020000393b343b2a0000040f000000010020019000003b050000613d000000000101043b000000000001042d000000000100001900003b360001043000000000050100190000000000200443000000050030008c00003b150000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b00003b0d0000413d00000ed00030009c00000ed0030080410000006001300210000000000200041400000ed00020009c00000ed002008041000000c002200210000000000112019f00000feb011001c700000000020500193b343b2a0000040f000000010020019000003b240000613d000000000101043b000000000001042d000000000001042f00003b28002104210000000102000039000000000001042d0000000002000019000000000001042d00003b2d002104230000000102000039000000000001042d0000000002000019000000000001042d00003b32002104250000000102000039000000000001042d0000000002000019000000000001042d00003b340000043200003b350001042e00003b360001043000000000000000000000000000000000000000002a7db0012bfe811a79b6888800d6e1adc0d8c10c00000000000000000000000058025b26c518ac345ba1476b050bab9f4a20b35d00000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000020000000000000000000000000000000000004000000000000000000000000042cbb15ccdc3cad6266b0e7a08c0454b23bf29dc2df74b6f3c209e9336465bd10200000200000000000000000000000000000004000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913201ffc9a70000000000000000000000000000000000000000000000000000000080ac58cd000000000000000000000000000000000000000000000000000000005b5e139f000000000000000000000000000000000000000000000000000000004906490600000000000000000000000000000000000000000000000000000000da287a1d000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000002000000000000000000000000000001400000010000000000000000000000000000000000000000000000000000000000000000000000000070a0823000000000000000000000000000000000000000000000000000000000b45a3c0d00000000000000000000000000000000000000000000000000000000e58f594600000000000000000000000000000000000000000000000000000000ec32e6de00000000000000000000000000000000000000000000000000000000f52a36f600000000000000000000000000000000000000000000000000000000f52a36f700000000000000000000000000000000000000000000000000000000f645d4f900000000000000000000000000000000000000000000000000000000fc0c546a00000000000000000000000000000000000000000000000000000000ec32e6df00000000000000000000000000000000000000000000000000000000f04cb3a800000000000000000000000000000000000000000000000000000000e7a324db00000000000000000000000000000000000000000000000000000000e7a324dc00000000000000000000000000000000000000000000000000000000e7e242d400000000000000000000000000000000000000000000000000000000e985e9c500000000000000000000000000000000000000000000000000000000e58f594700000000000000000000000000000000000000000000000000000000e75b1c2e00000000000000000000000000000000000000000000000000000000c87b56dc00000000000000000000000000000000000000000000000000000000d9a3495100000000000000000000000000000000000000000000000000000000d9a3495200000000000000000000000000000000000000000000000000000000e0514aba00000000000000000000000000000000000000000000000000000000e0c11f9a00000000000000000000000000000000000000000000000000000000c87b56dd00000000000000000000000000000000000000000000000000000000d1c2babb00000000000000000000000000000000000000000000000000000000b88d4fdd00000000000000000000000000000000000000000000000000000000b88d4fde00000000000000000000000000000000000000000000000000000000bfe1092800000000000000000000000000000000000000000000000000000000c2c4c5c100000000000000000000000000000000000000000000000000000000b45a3c0e00000000000000000000000000000000000000000000000000000000b52c05fe0000000000000000000000000000000000000000000000000000000091ddadf300000000000000000000000000000000000000000000000000000000a22cb46400000000000000000000000000000000000000000000000000000000a899b36b00000000000000000000000000000000000000000000000000000000a899b36c00000000000000000000000000000000000000000000000000000000b1548afc00000000000000000000000000000000000000000000000000000000b2383e5500000000000000000000000000000000000000000000000000000000a22cb46500000000000000000000000000000000000000000000000000000000a738da8200000000000000000000000000000000000000000000000000000000981b24cf00000000000000000000000000000000000000000000000000000000981b24d0000000000000000000000000000000000000000000000000000000009954a989000000000000000000000000000000000000000000000000000000009d507b8b0000000000000000000000000000000000000000000000000000000091ddadf40000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000008ad4c446000000000000000000000000000000000000000000000000000000008e539e8b000000000000000000000000000000000000000000000000000000008e539e8c000000000000000000000000000000000000000000000000000000008fbb38ff00000000000000000000000000000000000000000000000000000000900cf0cf000000000000000000000000000000000000000000000000000000008ad4c447000000000000000000000000000000000000000000000000000000008bf9d84c000000000000000000000000000000000000000000000000000000007ecebdff000000000000000000000000000000000000000000000000000000007ecebe0000000000000000000000000000000000000000000000000000000000834b0b690000000000000000000000000000000000000000000000000000000085f2aef20000000000000000000000000000000000000000000000000000000070a08231000000000000000000000000000000000000000000000000000000007c72800000000000000000000000000000000000000000000000000000000000370fb5f9000000000000000000000000000000000000000000000000000000004bf5d7e80000000000000000000000000000000000000000000000000000000054fd4d4f00000000000000000000000000000000000000000000000000000000572b6c0400000000000000000000000000000000000000000000000000000000572b6c05000000000000000000000000000000000000000000000000000000005a4f459a000000000000000000000000000000000000000000000000000000006352211e0000000000000000000000000000000000000000000000000000000054fd4d50000000000000000000000000000000000000000000000000000000005594a045000000000000000000000000000000000000000000000000000000004d6fb774000000000000000000000000000000000000000000000000000000004d6fb775000000000000000000000000000000000000000000000000000000005058979300000000000000000000000000000000000000000000000000000000515857d4000000000000000000000000000000000000000000000000000000004bf5d7e9000000000000000000000000000000000000000000000000000000004d01cb660000000000000000000000000000000000000000000000000000000042842e0d0000000000000000000000000000000000000000000000000000000044acb4290000000000000000000000000000000000000000000000000000000044acb42a0000000000000000000000000000000000000000000000000000000046c96aac000000000000000000000000000000000000000000000000000000004b19becc0000000000000000000000000000000000000000000000000000000042842e0e00000000000000000000000000000000000000000000000000000000430c2081000000000000000000000000000000000000000000000000000000003a6396a4000000000000000000000000000000000000000000000000000000003a6396a5000000000000000000000000000000000000000000000000000000003bf0c9fb000000000000000000000000000000000000000000000000000000003d085a3700000000000000000000000000000000000000000000000000000000370fb5fa0000000000000000000000000000000000000000000000000000000037b1f5000000000000000000000000000000000000000000000000000000000020606b6f000000000000000000000000000000000000000000000000000000002e720f7c00000000000000000000000000000000000000000000000000000000313ce56600000000000000000000000000000000000000000000000000000000313ce5670000000000000000000000000000000000000000000000000000000033230dc00000000000000000000000000000000000000000000000000000000035b0f6bd000000000000000000000000000000000000000000000000000000002e720f7d000000000000000000000000000000000000000000000000000000002f7f9ba90000000000000000000000000000000000000000000000000000000027a6ee970000000000000000000000000000000000000000000000000000000027a6ee98000000000000000000000000000000000000000000000000000000002d0485ec000000000000000000000000000000000000000000000000000000002e1a7d4d0000000000000000000000000000000000000000000000000000000020606b700000000000000000000000000000000000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000095ea7b20000000000000000000000000000000000000000000000000000000017d70f7b0000000000000000000000000000000000000000000000000000000017d70f7c0000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000019a0a9d500000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000ec84dda0000000000000000000000000000000000000000000000000000000006fdde020000000000000000000000000000000000000000000000000000000006fdde0300000000000000000000000000000000000000000000000000000000081812fc00000000000000000000000000000000000000000000000000000000095cf5c60000000000000000000000000000000000000000000000000000000001ffc9a700000000000000000000000000000000000000000000000000000000047fc9aa310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffff0000000000000000000000000000000080000000000000000000000000000000ffffffffffffffffffffffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000007b29b3d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff9947d5709c1682eaa3946b2d84115c9c0d1c946b149d76e69b457458b42ea29e0200000200000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000793cb7a30a4bb8669ec607dfcbdc93f5a3e9d282f38191fddab43ccaf79efb800200000000000000000000000000000000000020000000000000000000000000f8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce71806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000ebe333720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000f3207723000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000f7757ce35992f4ee014dee2e0c97ed6245758960a6ecc9e124897a5fb7b01423669567ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000002000000000000000000000000000000000000a0000000000000000000000000986e3c958e3bdf1f58c2150357fc94624dd4e77b08f9802d8e2e885fa0d6a19893b50ef200000000000000000000000000000000000000000000000000000000c87b56dd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffe0000000000000000000000000000000000000000000000003ffffffffffffffe09430a17e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000093a80fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6c57ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6c580000000000000000000000000000000000000000000000000ffffffffffffff40000000000000000000000000000000000000006000000000000000000000000002000000000000000000000000000000000000600000000000000000000000008835c22a0c751188de86681e15904223c054bedd5c68ec8858945b78312902735e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5cb66503cf0000000000000000000000000000000000000000000000000000000017307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318e6b5b6700000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffff87b31fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87b3200f761f1cd000000000000000000000000000000000000000000000000000000000c340a2400000000000000000000000000000000000000000000000000000000ee3675d4000000000000000000000000000000000000000000000000000000001a6ce72407c68def4b7d2e724c896070d89cf2b2a2dd56b6897b5febd88420f5d92e233d00000000000000000000000000000000000000000000000000000000367558c30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000007fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a176654e46540000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000005000000a00000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf322e302e3000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000050000000000000000000000009a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866000000000000000000000000000000000000000000000000ffffffffffffff3f1901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f756688fe000000000000000000000000000000000000000000000000000000000819bdcd000000000000000000000000000000000000000000000000000000008baa579f00000000000000000000000000000000000000000000000000000000bf4bf5b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000656a7ea60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a40000008000000000000000006d6f64653d74696d657374616d70000000000000000000000000000000000000b9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f8496b2f2183000000000000000000000000000000000000000000000000000000008303de8187a6102fdc3fe20c756dddd68df0ae027b77e2391c19a855e0821f330000000000000000000000000000000000000040000000000000000000000000f7c5bf64000000000000000000000000000000000000000000000000000000005842a3de000000000000000000000000000000000000000000000000000000003bc1d15f000000000000000000000000000000000000000000000000000000000d0ae67800000000000000000000000000000000000000000000000000000000dabc8e8300000000000000000000000000000000000000000000000000000000ae65a147ec014982132ce8b32019735e3c5f41457848d2ce2e2c3e0cbc9df7bc7778960e00000000000000000000000000000000000000000000000000000000459d6a3f00000000000000000000000000000000000000000000000000000000a963c020000000000000000000000000000000000000000000000000000000001490ad11000000000000000000000000000000000000000000000000000000001fb05eee000000000000000000000000000000000000000000000000000000003e491d4700000000000000000000000000000000000000000000000000000000f5f8d365000000000000000000000000000000000000000000000000000000009e2bf22c000000000000000000000000000000000000000000000000000000005319474ec1e9d118585a40e615ea37be254007e6bb5b039756c3813c2d13548993dafdf100000000000000000000000000000000000000000000000000000000d7caa261000000000000000000000000000000000000000000000000000000002188f8ab00000000000000000000000000000000000000000000000000000000668d293c0a181c1f163fd0d3c757239a9c17bd26c5e483150e374455433b27fa6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c7c9a1cf90000000000000000000000000000000000000000000000000000000017a66f37000000000000000000000000000000000000000000000000000000000101bd7400000000000000000000000000000000000000000000000000000000a9059cbb0000000000000000000000000000000000000000000000000000000002f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca946855a8020000000000000000000000000000000000000000000000000000000069a21f2a00000000000000000000000000000000000000000000000000000000c18384c100000000000000000000000000000000000000000000000000000000385296d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0f6fafba0000000000000000000000000000000000000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000f90e998d000000000000000000000000000000000000000000000000000000001f2a200500000000000000000000000000000000000000000000000000000000bd665b620000000000000000000000000000000000000000000000000000000008c379a0000000000000000000000000000000000000000000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c0000000000000000000000000000000000000000640000008000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925e433766c00000000000000000000000000000000000000000000000000000000e9f3e9740000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff80000000000000000000000000000000000000000000000000ffffffffffffffc0000000000000000000000000000000000000006400000000000000000000000030cd747100000000000000000000000000000000000000000000000000000000690f66bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000000000000000000000000000000000000000000000000000010000000000000000150b7a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffe01ad78a40000000000000000000000000000000000000000000000000000000009e64a6c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff60000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000784ce00000000000000000000000000000000000000000000000000000000003b9ac9fe23b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff1f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000095ea7b300000000000000000000000000000000000000000000000000000000dd62ed3e0000000000000000000000000000000000000000000000000000000020746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000005361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f7259b01900000000000000000000000000000000000000000000000000000000f1aa2a9e40138176a3ee6099df056f5c175f8511a0d8b8275d94d1ea5de4677342d6fce7000000000000000000000000000000000000000000000000000000000200000200000000000000000000000000000000000000000000000000000000000000000000000000a2646970667358221220e2caf37ac853685bb8b3ff7a03630224f332afb0b1198e9d28fe853ee31c697964736f6c6378247a6b736f6c633a312e352e31353b736f6c633a302e382e31393b6c6c766d3a312e302e320055
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003f91b806f1968fca85c08a7ee9a7262d7207a9c10000000000000000000000004c68e4102c0f120cce9f08625bd12079806b7c4d0000000000000000000000005927e0c4b307af16260327de3276ce17d8a4ab49
-----Decoded View---------------
Arg [0] : _forwarder (address): 0x3f91b806F1968Fca85C08A7eE9A7262D7207A9c1
Arg [1] : _token (address): 0x4C68E4102c0F120cce9F08625bd12079806b7C4D
Arg [2] : _factoryRegistry (address): 0x5927E0C4b307Af16260327DE3276CE17d8A4aB49
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003f91b806f1968fca85c08a7ee9a7262d7207a9c1
Arg [1] : 0000000000000000000000004c68e4102c0f120cce9f08625bd12079806b7c4d
Arg [2] : 0000000000000000000000005927e0c4b307af16260327de3276ce17d8a4ab49
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$5,435,960.26
Net Worth in ETH
1,836.277186
Token Allocations
ABX
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ABSTRACT | 100.00% | $0.009919 | 548,061,079.8803 | $5,435,960.26 |
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.