Source Code
Multichain Info
Latest 20 from a total of 20 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim | 39489143 | 216 days ago | IN | 0 CELO | 0.00793334 | ||||
| Claim | 39471336 | 216 days ago | IN | 0 CELO | 0.00793334 | ||||
| Claim | 39469955 | 216 days ago | IN | 0 CELO | 0.00793334 | ||||
| Claim | 39469490 | 216 days ago | IN | 0 CELO | 0.00793334 | ||||
| Claim | 39468018 | 216 days ago | IN | 0 CELO | 0.00793334 | ||||
| Claim | 39466181 | 216 days ago | IN | 0 CELO | 0.00793334 | ||||
| Claim | 39466005 | 216 days ago | IN | 0 CELO | 0.00793334 | ||||
| Reset All Claime... | 39465856 | 216 days ago | IN | 0 CELO | 0.00539954 | ||||
| Claim | 39465474 | 216 days ago | IN | 0 CELO | 0.00793334 | ||||
| Fund | 39464410 | 216 days ago | IN | 0 CELO | 0.00568955 | ||||
| Set Claim Parame... | 39464206 | 216 days ago | IN | 0 CELO | 0.00502017 | ||||
| Claim | 38617150 | 226 days ago | IN | 0 CELO | 0.00782463 | ||||
| Claim | 38601353 | 226 days ago | IN | 0 CELO | 0.00766158 | ||||
| Claim | 38599785 | 226 days ago | IN | 0 CELO | 0.00766158 | ||||
| Claim | 38599716 | 226 days ago | IN | 0 CELO | 0.00766158 | ||||
| Claim | 38599476 | 226 days ago | IN | 0 CELO | 0.00766158 | ||||
| Claim | 38599340 | 226 days ago | IN | 0 CELO | 0.00808909 | ||||
| Set Whitelist Ba... | 38598070 | 226 days ago | IN | 0 CELO | 0.03782153 | ||||
| Set Claim Parame... | 38597999 | 226 days ago | IN | 0 CELO | 0.00560344 | ||||
| Fund | 38597910 | 226 days ago | IN | 0 CELO | 0.00541749 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 38597793 | 226 days ago | Contract Creation | 0 CELO |
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xB963d024...4f3Cb057a The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
FaucetDrops
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/**
*Submitted for verification at celoscan.io on 2025-06-23
*/
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` 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 value) external returns (bool);
}
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @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 EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* 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;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
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
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// 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;
}
}
// File: TransactionLibrary.sol
pragma solidity ^0.8.20;
library TransactionLibrary {
struct Transaction {
address faucetAddress;
string transactionType;
address initiator;
uint256 amount;
bool isEther;
uint256 timestamp;
}
function recordTransaction(
Transaction[] storage transactions,
address _faucetAddress,
string memory _transactionType,
address _initiator,
uint256 _amount,
bool _isEther
) internal {
transactions.push(Transaction({
faucetAddress: _faucetAddress,
transactionType: _transactionType,
initiator: _initiator,
amount: _amount,
isEther: _isEther,
timestamp: block.timestamp
}));
}
}
// File: IFaucetDrops.sol
pragma solidity ^0.8.20;
// File: IFaucetDrops.sol
interface IFaucetDrops {
function owner() external view returns (address);
function name() external view returns (string memory);
function claimAmount() external view returns (uint256);
function token() external view returns (address);
function startTime() external view returns (uint256);
function endTime() external view returns (uint256);
function isClaimActive() external view returns (bool);
function getFaucetBalance() external view returns (uint256 balance, bool isEther);
function deleteFaucet() external;
function resetAllClaimed() external;
function getUseBackend() external view returns (bool);
}
// File: FaucetStorage.sol
pragma solidity ^0.8.20;
contract FaucetStorage is Ownable {
using TransactionLibrary for TransactionLibrary.Transaction[];
struct FaucetDetails {
address faucetAddress;
address owner;
string name;
uint256 claimAmount;
address tokenAddress;
uint256 startTime;
uint256 endTime;
bool isClaimActive;
uint256 balance;
bool isEther;
bool useBackend;
}
address[] public faucets;
mapping(address => address[]) public userFaucets;
TransactionLibrary.Transaction[] public allTransactions;
mapping(address => bool) public deletedFaucets;
address public factoryContract;
modifier onlyFactory() {
require(msg.sender == factoryContract, "Only factory");
_;
}
constructor() Ownable(msg.sender) {}
function setFactoryContract(address _factory) external onlyOwner {
factoryContract = _factory;
}
function addFaucet(address faucetAddress, address faucetOwner) external onlyFactory {
faucets.push(faucetAddress);
userFaucets[faucetOwner].push(faucetAddress);
}
function markDeleted(address faucetAddress) external onlyFactory {
deletedFaucets[faucetAddress] = true;
_removeFaucetFromArrays(faucetAddress);
}
function recordTransaction(
address _faucetAddress,
string memory _transactionType,
address _initiator,
uint256 _amount,
bool _isEther
) external onlyFactory {
allTransactions.recordTransaction(_faucetAddress, _transactionType, _initiator, _amount, _isEther);
}
function _removeFaucetFromArrays(address _faucetAddress) internal {
// Remove from main faucets array
for (uint256 i = 0; i < faucets.length; i++) {
if (faucets[i] == _faucetAddress) {
faucets[i] = faucets[faucets.length - 1];
faucets.pop();
break;
}
}
// Remove from user faucets
address faucetOwner = IFaucetDrops(_faucetAddress).owner();
address[] storage userFaucetList = userFaucets[faucetOwner];
for (uint256 i = 0; i < userFaucetList.length; i++) {
if (userFaucetList[i] == _faucetAddress) {
userFaucetList[i] = userFaucetList[userFaucetList.length - 1];
userFaucetList.pop();
break;
}
}
}
// View functions
function getAllFaucets() external view returns (address[] memory) {
uint256 activeCount = 0;
for (uint256 i = 0; i < faucets.length; i++) {
if (!deletedFaucets[faucets[i]]) {
activeCount++;
}
}
address[] memory activeFaucets = new address[](activeCount);
uint256 index = 0;
for (uint256 i = 0; i < faucets.length; i++) {
if (!deletedFaucets[faucets[i]]) {
activeFaucets[index] = faucets[i];
index++;
}
}
return activeFaucets;
}
function getUserFaucets(address user) external view returns (address[] memory) {
address[] memory userFaucetList = userFaucets[user];
uint256 activeCount = 0;
for (uint256 i = 0; i < userFaucetList.length; i++) {
if (!deletedFaucets[userFaucetList[i]]) {
activeCount++;
}
}
address[] memory activeUserFaucets = new address[](activeCount);
uint256 index = 0;
for (uint256 i = 0; i < userFaucetList.length; i++) {
if (!deletedFaucets[userFaucetList[i]]) {
activeUserFaucets[index] = userFaucetList[i];
index++;
}
}
return activeUserFaucets;
}
function getTotalFaucets() external view returns (uint256) {
uint256 activeCount = 0;
for (uint256 i = 0; i < faucets.length; i++) {
if (!deletedFaucets[faucets[i]]) {
activeCount++;
}
}
return activeCount;
}
function getAllTransactions() external view returns (TransactionLibrary.Transaction[] memory) {
return allTransactions;
}
function getTotalTransactions() external view returns (uint256) {
return allTransactions.length;
}
}
// File: IFaucetFactory.sol
pragma solidity ^0.8.20;
// ========== STEP 2: Minimal Interfaces ==========
// File: IFaucetFactory.sol
interface IFaucetFactory {
function recordTransaction(
address _faucetAddress,
string memory _transactionType,
address _initiator,
uint256 _amount,
bool _isEther
) external;
function owner() external view returns (address);
}
// File: faucetFactory.sol
pragma solidity ^0.8.20;
// File: FaucetFactory.sol - Minimal Factory
contract FaucetFactory is Ownable, IFaucetFactory {
FaucetStorage public storageContract;
event FaucetCreated(address indexed faucet, address owner);
event FaucetDeleted(address indexed faucet);
constructor(address _storageContract) Ownable(msg.sender) {
storageContract = FaucetStorage(_storageContract);
}
function owner() public view override(Ownable, IFaucetFactory) returns (address) {
return Ownable.owner();
}
function createFaucet(
string memory _name,
address _token,
address _backend,
bool _useBackend
) external returns (address) {
FaucetDrops faucet = new FaucetDrops(_name, _token, _backend, _useBackend, msg.sender, address(this));
address faucetAddress = address(faucet);
storageContract.addFaucet(faucetAddress, msg.sender);
storageContract.recordTransaction(faucetAddress, "CreateFaucet", msg.sender, 0, false);
emit FaucetCreated(faucetAddress, msg.sender);
return faucetAddress;
}
function recordTransaction(
address _faucetAddress,
string memory _transactionType,
address _initiator,
uint256 _amount,
bool _isEther
) external override {
require(!storageContract.deletedFaucets(_faucetAddress), "Deleted");
storageContract.recordTransaction(_faucetAddress, _transactionType, _initiator, _amount, _isEther);
}
function deleteFaucet(address _faucetAddress) external onlyOwner {
require(!storageContract.deletedFaucets(_faucetAddress), "Deleted");
storageContract.markDeleted(_faucetAddress);
IFaucetDrops(_faucetAddress).deleteFaucet();
emit FaucetDeleted(_faucetAddress);
}
}
// File: faucet.sol
pragma solidity ^0.8.20;
contract FaucetDrops is Ownable, ReentrancyGuard {
string public name;
uint256 public claimAmount;
address public token;
uint256 public startTime;
uint256 public endTime;
bool public useBackend; // New flag to indicate if backend is used
mapping(address => bool) public hasClaimed;
mapping(address => bool) public isWhitelisted;
mapping(address => bool) public isAdmin;
address[] public admins; // New array to track admin addresses
mapping(address => uint256) public customClaimAmounts;
mapping(address => bool) public hasCustomAmount;
address public BACKEND;
address public factory;
uint256 public constant BACKEND_FEE_PERCENT = 5;
bool public deleted; // New flag to mark faucet as deleted
struct ClaimDetail {
address recipient;
uint256 amount;
uint256 timestamp;
}
ClaimDetail[] public claims;
event Claimed(address indexed user, uint256 amount, bool isEther);
event Funded(address indexed funder, uint256 amount, uint256 backendFee, bool isEther);
event Withdrawn(address indexed owner, uint256 amount, bool isEther);
event ClaimParametersUpdated(uint256 claimAmount, uint256 startTime, uint256 endTime);
event WhitelistUpdated(address indexed user, bool status);
event FaucetCreated(address indexed faucet, string name, address token);
event AdminAdded(address indexed admin);
event ClaimReset(address indexed user);
event BatchClaimReset(uint256 userCount);
event BackendUpdated(address indexed newBackend);
event Paused(bool paused);
event FaucetDeleted(address indexed faucet);
event NameUpdated(string newName);
event CustomClaimAmountSet(address indexed user, uint256 amount);
event CustomClaimAmountRemoved(address indexed user);
event BatchCustomClaimAmountsSet(uint256 userCount);
error InvalidAddress();
error OnlyBackend();
error OnlyAdmin();
error NoUsersProvided();
error ClaimPeriodNotStarted();
error ClaimPeriodEnded();
error ClaimAmountNotSet();
error InsufficientBalance();
error TransferFailed();
error NotWhitelisted();
error AlreadyClaimed();
error InvalidAmount();
error InvalidTime();
error ContractPaused();
error EmptyName();
error ArrayLengthMismatch();
error FaucetDeletedError(address faucet);
modifier onlyBackend() {
if (msg.sender != BACKEND) revert OnlyBackend();
_;
}
modifier onlyAdmin() {
if (!isAdmin[msg.sender] && msg.sender != BACKEND && msg.sender != owner() && msg.sender != IFaucetFactory(factory).owner())
revert OnlyAdmin();
_;
}
modifier whenNotPaused() {
if (paused) revert ContractPaused();
_;
}
modifier checkNotDeleted() {
if (deleted) revert FaucetDeletedError(address(this));
_;
}
bool public paused;
constructor(
string memory _name,
address _token,
address _backend,
bool _useBackend,
address _owner,
address _factory
) Ownable(_owner) {
name = _name;
BACKEND = _backend;
useBackend = _useBackend; // Set backend flag
token = _token;
claimAmount = _token == address(0) ? 0.01 ether : 100 * 10**18;
factory = _factory;
// Set faucet creator as admin
isAdmin[_owner] = true;
admins.push(_owner);
// Set factory owner as permanent admin
address factoryOwner = IFaucetFactory(_factory).owner();
isAdmin[factoryOwner] = true;
admins.push(factoryOwner);
emit FaucetCreated(address(this), _name, _token);
emit AdminAdded(_owner);
emit AdminAdded(factoryOwner);
}
function setCustomClaimAmount(address user, uint256 amount) external onlyAdmin whenNotPaused checkNotDeleted {
if (user == address(0)) revert InvalidAddress();
if (amount == 0) {
delete customClaimAmounts[user];
hasCustomAmount[user] = false;
IFaucetFactory(factory).recordTransaction(address(this), "RemoveCustomClaimAmount", msg.sender, 0, false);
emit CustomClaimAmountRemoved(user);
} else {
customClaimAmounts[user] = amount;
hasCustomAmount[user] = true;
IFaucetFactory(factory).recordTransaction(address(this), "SetCustomClaimAmount", msg.sender, amount, false);
emit CustomClaimAmountSet(user, amount);
}
}
function setCustomClaimAmountsBatch(address[] calldata users, uint256[] calldata amounts) external onlyAdmin whenNotPaused checkNotDeleted {
if (users.length == 0) revert NoUsersProvided();
if (users.length != amounts.length) revert ArrayLengthMismatch();
uint256 setCount = 0;
for (uint256 i = 0; i < users.length; ) {
if (users[i] == address(0)) revert InvalidAddress();
if (amounts[i] == 0) {
if (hasCustomAmount[users[i]]) {
delete customClaimAmounts[users[i]];
hasCustomAmount[users[i]] = false;
emit CustomClaimAmountRemoved(users[i]);
setCount++;
}
} else {
customClaimAmounts[users[i]] = amounts[i];
hasCustomAmount[users[i]] = true;
emit CustomClaimAmountSet(users[i], amounts[i]);
setCount++;
}
unchecked { i++; }
}
IFaucetFactory(factory).recordTransaction(address(this), "SetCustomClaimAmountsBatch", msg.sender, setCount, false);
emit BatchCustomClaimAmountsSet(setCount);
}
function getUserClaimAmount(address user) public view returns (uint256) {
if (hasCustomAmount[user]) {
return customClaimAmounts[user];
}
return claimAmount;
}
function userHasCustomAmount(address user) external view checkNotDeleted returns (bool) {
return hasCustomAmount[user];
}
function getCustomClaimAmount(address user) external view checkNotDeleted returns (uint256) {
return customClaimAmounts[user];
}
function addAdmin(address _admin) external onlyOwner checkNotDeleted {
if (_admin == address(0)) revert InvalidAddress();
if (isAdmin[_admin]) revert AlreadyClaimed(); // Reusing error for "already admin"
isAdmin[_admin] = true;
admins.push(_admin);
IFaucetFactory(factory).recordTransaction(address(this), "AddAdmin", msg.sender, 0, false);
emit AdminAdded(_admin);
}
function getAllAdmins() external view checkNotDeleted returns (address[] memory) {
return admins;
}
function getUseBackend() external view checkNotDeleted returns (bool) {
return useBackend;
}
function fund(uint256 _tokenAmount) external payable nonReentrant whenNotPaused checkNotDeleted {
uint256 backendFee = 0;
if (token == address(0)) {
if (msg.value == 0) revert InvalidAmount();
backendFee = (msg.value * BACKEND_FEE_PERCENT) / 100;
if (backendFee > 0 && BACKEND != address(0)) {
(bool sent, ) = BACKEND.call{value: backendFee}("");
if (!sent) revert TransferFailed();
}
IFaucetFactory(factory).recordTransaction(address(this), "Fund", msg.sender, msg.value, true);
emit Funded(msg.sender, msg.value, backendFee, true);
} else {
if (_tokenAmount == 0) revert InvalidAmount();
if (msg.value != 0) revert InvalidAmount();
backendFee = (_tokenAmount * BACKEND_FEE_PERCENT) / 100;
if (backendFee > 0 && BACKEND != address(0)) {
if (!IERC20(token).transferFrom(msg.sender, BACKEND, backendFee)) revert TransferFailed();
}
if (!IERC20(token).transferFrom(msg.sender, address(this), _tokenAmount - backendFee)) revert TransferFailed();
IFaucetFactory(factory).recordTransaction(address(this), "Fund", msg.sender, _tokenAmount, false);
emit Funded(msg.sender, _tokenAmount, backendFee, false);
}
}
function claim(address[] calldata users) external onlyBackend nonReentrant whenNotPaused checkNotDeleted {
if (users.length == 0) revert NoUsersProvided();
if (block.timestamp < startTime) revert ClaimPeriodNotStarted();
if (block.timestamp > endTime) revert ClaimPeriodEnded();
if (claimAmount == 0) revert ClaimAmountNotSet();
uint256 totalAmount = 0;
for (uint256 i = 0; i < users.length; ) {
totalAmount += getUserClaimAmount(users[i]);
unchecked { i++; }
}
if (token == address(0)) {
if (address(this).balance < totalAmount) revert InsufficientBalance();
} else {
if (IERC20(token).balanceOf(address(this)) < totalAmount) revert InsufficientBalance();
}
for (uint256 i = 0; i < users.length; ) {
address user = users[i];
if (user == address(0)) revert InvalidAddress();
if (!isWhitelisted[user]) revert NotWhitelisted();
if (hasClaimed[user]) revert AlreadyClaimed();
uint256 userClaimAmount = getUserClaimAmount(user);
hasClaimed[user] = true;
claims.push(ClaimDetail({
recipient: user,
amount: userClaimAmount,
timestamp: block.timestamp
}));
if (token == address(0)) {
(bool sent, ) = user.call{value: userClaimAmount}("");
if (!sent) revert TransferFailed();
IFaucetFactory(factory).recordTransaction(address(this), "Claim", user, userClaimAmount, true);
emit Claimed(user, userClaimAmount, true);
} else {
if (!IERC20(token).transfer(user, userClaimAmount)) revert TransferFailed();
IFaucetFactory(factory).recordTransaction(address(this), "Claim", user, userClaimAmount, false);
emit Claimed(user, userClaimAmount, false);
}
unchecked { i++; }
}
}
function withdraw(uint256 amount) external onlyOwner nonReentrant whenNotPaused checkNotDeleted {
if (amount == 0) revert InvalidAmount();
if (token == address(0)) {
if (address(this).balance < amount) revert InsufficientBalance();
(bool sent, ) = owner().call{value: amount}("");
if (!sent) revert TransferFailed();
IFaucetFactory(factory).recordTransaction(address(this), "Withdraw", msg.sender, amount, true);
emit Withdrawn(owner(), amount, true);
} else {
if (IERC20(token).balanceOf(address(this)) < amount) revert InsufficientBalance();
if (!IERC20(token).transfer(owner(), amount)) revert TransferFailed();
IFaucetFactory(factory).recordTransaction(address(this), "Withdraw", msg.sender, amount, false);
emit Withdrawn(owner(), amount, false);
}
}
function getAllClaims() external view checkNotDeleted returns (ClaimDetail[] memory) {
return claims;
}
function setClaimParameters(uint256 _claimAmount, uint256 _startTime, uint256 _endTime) external onlyAdmin whenNotPaused checkNotDeleted {
if (_claimAmount == 0) revert InvalidAmount();
if (_startTime < block.timestamp) revert InvalidTime();
if (_endTime <= _startTime) revert InvalidTime();
claimAmount = _claimAmount;
startTime = _startTime;
endTime = _endTime;
IFaucetFactory(factory).recordTransaction(address(this), "SetClaimParameters", msg.sender, _claimAmount, false);
emit ClaimParametersUpdated(_claimAmount, _startTime, _endTime);
}
function setWhitelist(address user, bool status) external onlyAdmin whenNotPaused checkNotDeleted {
if (user == address(0)) revert InvalidAddress();
isWhitelisted[user] = status;
IFaucetFactory(factory).recordTransaction(address(this), "SetWhitelist", msg.sender, status ? 1 : 0, false);
emit WhitelistUpdated(user, status);
}
function setWhitelistBatch(address[] calldata users, bool status) external onlyAdmin whenNotPaused checkNotDeleted {
if (users.length == 0) revert NoUsersProvided();
for (uint256 i = 0; i < users.length; ) {
if (users[i] == address(0)) revert InvalidAddress();
isWhitelisted[users[i]] = status;
IFaucetFactory(factory).recordTransaction(address(this), "SetWhitelistBatch", msg.sender, status ? 1 : 0, false);
emit WhitelistUpdated(users[i], status);
unchecked { i++; }
}
}
function resetClaimedSingle(address user) external onlyAdmin whenNotPaused checkNotDeleted {
if (user == address(0)) revert InvalidAddress();
if (!hasClaimed[user]) revert NotWhitelisted(); // Reusing error for "not claimed"
hasClaimed[user] = false;
IFaucetFactory(factory).recordTransaction(address(this), "ResetClaimedSingle", msg.sender, 0, false);
emit ClaimReset(user);
}
function resetClaimedBatch(address[] calldata users) external onlyAdmin whenNotPaused checkNotDeleted {
if (users.length == 0) revert NoUsersProvided();
uint256 resetCount = 0;
for (uint256 i = 0; i < users.length; ) {
if (users[i] != address(0) && hasClaimed[users[i]]) {
hasClaimed[users[i]] = false;
emit ClaimReset(users[i]);
resetCount++;
}
unchecked { i++; }
}
IFaucetFactory(factory).recordTransaction(address(this), "ResetClaimedBatch", msg.sender, resetCount, false);
emit BatchClaimReset(resetCount);
}
function resetAllClaimed() external onlyAdmin whenNotPaused checkNotDeleted {
uint256 resetCount = 0;
for (uint256 i = 0; i < claims.length; ) {
address user = claims[i].recipient;
if (hasClaimed[user]) {
hasClaimed[user] = false;
emit ClaimReset(user);
resetCount++;
}
unchecked { i++; }
}
IFaucetFactory(factory).recordTransaction(address(this), "ResetAllClaimed", msg.sender, resetCount, false);
emit BatchClaimReset(resetCount);
}
function deleteFaucet() external onlyAdmin checkNotDeleted {
deleted = true;
IFaucetFactory(factory).recordTransaction(address(this), "DeleteFaucet", msg.sender, 0, false);
emit FaucetDeleted(address(this));
if (token == address(0) && address(this).balance > 0) {
(bool sent, ) = payable(owner()).call{value: address(this).balance}("");
if (!sent) revert TransferFailed();
} else if (token != address(0)) {
uint256 tokenBalance = IERC20(token).balanceOf(address(this));
if (tokenBalance > 0) {
if (!IERC20(token).transfer(owner(), tokenBalance)) revert TransferFailed();
}
}
paused = true;
}
function updateName(string memory _newName) external onlyAdmin whenNotPaused checkNotDeleted {
if (bytes(_newName).length == 0) revert EmptyName();
name = _newName;
IFaucetFactory(factory).recordTransaction(address(this), "UpdateName", msg.sender, 0, false);
emit NameUpdated(_newName);
}
function getFaucetBalance() external view checkNotDeleted returns (uint256 balance, bool isEther) {
if (token == address(0)) {
return (address(this).balance, true);
} else {
return (IERC20(token).balanceOf(address(this)), false);
}
}
function isClaimActive() public view checkNotDeleted returns (bool) {
return block.timestamp >= startTime && block.timestamp <= endTime && claimAmount > 0;
}
function getAdminStatus(address _address) external view checkNotDeleted returns (bool) {
return isAdmin[_address];
}
function getClaimStatus(address user) external view checkNotDeleted returns (bool claimed, bool whitelisted, bool canClaim) {
claimed = hasClaimed[user];
whitelisted = isWhitelisted[user];
canClaim = whitelisted && !claimed && isClaimActive();
}
function getDetailedClaimStatus(address user) external view checkNotDeleted returns (
bool claimed,
bool whitelisted,
bool canClaim,
uint256 claimAmountForUser,
bool hasCustom
) {
claimed = hasClaimed[user];
whitelisted = isWhitelisted[user];
canClaim = whitelisted && !claimed && isClaimActive();
claimAmountForUser = getUserClaimAmount(user);
hasCustom = hasCustomAmount[user];
}
function setPaused(bool _paused) external onlyAdmin checkNotDeleted {
paused = _paused;
IFaucetFactory(factory).recordTransaction(address(this), "SetPaused", msg.sender, _paused ? 1 : 0, false);
emit Paused(_paused);
}
function claimWhenActive(address[] calldata users) external onlyBackend nonReentrant whenNotPaused checkNotDeleted {
this.claim(users);
}
receive() external payable whenNotPaused checkNotDeleted {
if (token != address(0)) revert InvalidAmount();
uint256 backendFee = 0;
if (BACKEND != address(0)) {
backendFee = (msg.value * BACKEND_FEE_PERCENT) / 100;
if (backendFee > 0) {
(bool sent, ) = BACKEND.call{value: backendFee}("");
if (!sent) revert TransferFailed();
}
}
IFaucetFactory(factory).recordTransaction(address(this), "Fund", msg.sender, msg.value, true);
emit Funded(msg.sender, msg.value, backendFee, true);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_backend","type":"address"},{"internalType":"bool","name":"_useBackend","type":"bool"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"ClaimAmountNotSet","type":"error"},{"inputs":[],"name":"ClaimPeriodEnded","type":"error"},{"inputs":[],"name":"ClaimPeriodNotStarted","type":"error"},{"inputs":[],"name":"ContractPaused","type":"error"},{"inputs":[],"name":"EmptyName","type":"error"},{"inputs":[{"internalType":"address","name":"faucet","type":"address"}],"name":"FaucetDeletedError","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidTime","type":"error"},{"inputs":[],"name":"NoUsersProvided","type":"error"},{"inputs":[],"name":"NotWhitelisted","type":"error"},{"inputs":[],"name":"OnlyAdmin","type":"error"},{"inputs":[],"name":"OnlyBackend","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBackend","type":"address"}],"name":"BackendUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"userCount","type":"uint256"}],"name":"BatchClaimReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"userCount","type":"uint256"}],"name":"BatchCustomClaimAmountsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"claimAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"ClaimParametersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"ClaimReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isEther","type":"bool"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"CustomClaimAmountRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CustomClaimAmountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"faucet","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"FaucetCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"faucet","type":"address"}],"name":"FaucetDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"backendFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isEther","type":"bool"}],"name":"Funded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isEther","type":"bool"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"BACKEND","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BACKEND_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"admins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"claimWhenActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claims","outputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"customClaimAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteFaucet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAdminStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllAdmins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllClaims","outputs":[{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct FaucetDrops.ClaimDetail[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getClaimStatus","outputs":[{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"bool","name":"whitelisted","type":"bool"},{"internalType":"bool","name":"canClaim","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getCustomClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getDetailedClaimStatus","outputs":[{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"bool","name":"whitelisted","type":"bool"},{"internalType":"bool","name":"canClaim","type":"bool"},{"internalType":"uint256","name":"claimAmountForUser","type":"uint256"},{"internalType":"bool","name":"hasCustom","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFaucetBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bool","name":"isEther","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUseBackend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasCustomAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetAllClaimed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"resetClaimedBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"resetClaimedSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimAmount","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setClaimParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setCustomClaimAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"setCustomClaimAmountsBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWhitelistBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"}],"name":"updateName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useBackend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userHasCustomAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x608060405234801562000010575f80fd5b506040516200525b3803806200525b833981016040819052620000339162000367565b816001600160a01b0381166200006257604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200006d81620002b4565b5060018055600262000080878262000500565b50600e80546001600160a01b038087166001600160a01b0319928316179092556007805486151560ff1990911617905560048054928816929091168217905515620000d55768056bc75e2d63100000620000de565b662386f26fc100005b6001600160481b0316600355600f80546001600160a01b038084166001600160a01b0319928316811790935584165f818152600a60209081526040808320805460ff19166001908117909155600b8054918201815584527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180549095169093179093558151638da5cb5b60e01b81529151909392638da5cb5b92600480820193918290030181865afa15801562000198573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001be9190620005cc565b6001600160a01b0381165f818152600a6020526040808220805460ff19166001908117909155600b805491820181559092527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319169092179091555190915030907f55a1750175f455bb2384a492078cbc0b3bc2c4f5802faa8028810e6798fa1bf0906200025d908a908a90620005ef565b60405180910390a26040516001600160a01b038416905f805160206200523b833981519152905f90a26040516001600160a01b038216905f805160206200523b833981519152905f90a25050505050505062000634565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200033357818101518382015260200162000319565b50505f910152565b80516001600160a01b038116811462000352575f80fd5b919050565b8051801515811462000352575f80fd5b5f805f805f8060c087890312156200037d575f80fd5b86516001600160401b038082111562000394575f80fd5b818901915089601f830112620003a8575f80fd5b815181811115620003bd57620003bd62000303565b604051601f8201601f19908116603f01168101908382118183101715620003e857620003e862000303565b816040528281528c602084870101111562000401575f80fd5b6200041483602083016020880162000317565b809a5050505050506200042a602088016200033b565b94506200043a604088016200033b565b93506200044a6060880162000357565b92506200045a608088016200033b565b91506200046a60a088016200033b565b90509295509295509295565b600181811c908216806200048b57607f821691505b602082108103620004aa57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620004fb57805f5260205f20601f840160051c81016020851015620004d75750805b601f840160051c820191505b81811015620004f8575f8155600101620004e3565b50505b505050565b81516001600160401b038111156200051c576200051c62000303565b62000534816200052d845462000476565b84620004b0565b602080601f8311600181146200056a575f8415620005525750858301515b5f19600386901b1c1916600185901b178555620005c4565b5f85815260208120601f198616915b828110156200059a5788860151825594840194600190910190840162000579565b5085821015620005b857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215620005dd575f80fd5b620005e8826200033b565b9392505050565b604081525f83518060408401526200060f81606085016020880162000317565b6001600160a01b0393909316602083015250601f91909101601f191601606001919050565b614bf980620006425f395ff3fe60806040526004361061028e575f3560e01c806373b2e80e11610155578063b333cbfe116100be578063ca1d209d11610078578063ca1d209d14610a11578063e9523c9714610a24578063f1f959a614610a45578063f2fde38b14610a6e578063f6af343114610a8d578063fc0c546a14610aac575f80fd5b8063b333cbfe14610943578063c0eaa61e14610962578063c45a015514610976578063c5efea6814610995578063c67f9d67146109b4578063c9760f71146109d3575f80fd5b806384da92a71161010f57806384da92a7146108345780638da5cb5b146108535780639c1d294e1461086f578063a58da0be146108c1578063a888c2cd146108e0578063b2fb494714610924575f80fd5b806373b2e80e1461079557806378e97925146107c35780637baafe45146107d85780637e348a03146107f75780637fc278031461080b578063830953ab1461081f575f80fd5b80633af32abf116101f75780635b23c27d116101b15780635b23c27d146106e95780635c975abb1461070a5780635f7578bf146107235780636b35f7c1146107425780637048027514610762578063715018a614610781575f80fd5b80633af32abf1461061a5780633bed6bcd14610648578063465564551461066157806352fe5a3d1461068057806353d6fd591461069f5780635b20e421146106be575f80fd5b80631be44316116102485780631be443161461056357806322d86d1e1461057757806324d7806c1461058b5780632e1a7d4d146105b9578063318d9e5d146105d85780633197cbb6146105f7575f80fd5b806306fdde031461046557806314bfd6d01461048f57806316c38b3c146104c657806316edc2d1146104e7578063179c2e621461050657806318e77b7214610525575f80fd5b366104615760115460ff16156102b75760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff16156102e957604051632fb83b9560e21b81523060048201526024015b60405180910390fd5b6004546001600160a01b0316156103135760405163162908e360e11b815260040160405180910390fd5b600e545f906001600160a01b0316156103b857606461033360053461448b565b61033d91906144a8565b905080156103b857600e546040515f916001600160a01b03169083908381818185875af1925050503d805f811461038f576040519150601f19603f3d011682016040523d82523d5f602084013e610394565b606091505b50509050806103b6576040516312171d8360e31b815260040160405180910390fd5b505b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef906103ef903090339034906001906004016144c7565b5f604051808303815f87803b158015610406575f80fd5b505af1158015610418573d5f803e3d5ffd5b5050604080513481526020810185905260018183015290513393507fd097d67b884742fd6739c2538bb1eea1008df0bf89dcb8efd874367948a7194a92509081900360600190a2005b5f80fd5b348015610470575f80fd5b50610479610acb565b604051610486919061450c565b60405180910390f35b34801561049a575f80fd5b506104ae6104a9366004614558565b610b57565b6040516001600160a01b039091168152602001610486565b3480156104d1575f80fd5b506104e56104e036600461457c565b610b7f565b005b3480156104f2575f80fd5b506104e56105013660046145e6565b610d93565b348015610511575f80fd5b506104e5610520366004614639565b61111b565b348015610530575f80fd5b5061055361053f366004614639565b600d6020525f908152604090205460ff1681565b6040519015158152602001610486565b34801561056e575f80fd5b506104e561139e565b348015610582575f80fd5b506104e561175e565b348015610596575f80fd5b506105536105a5366004614639565b600a6020525f908152604090205460ff1681565b3480156105c4575f80fd5b506104e56105d3366004614558565b611a12565b3480156105e3575f80fd5b506104e56105f23660046145e6565b611df7565b348015610602575f80fd5b5061060c60065481565b604051908152602001610486565b348015610625575f80fd5b50610553610634366004614639565b60096020525f908152604090205460ff1681565b348015610653575f80fd5b506007546105539060ff1681565b34801561066c575f80fd5b5061055361067b366004614639565b61243f565b34801561068b575f80fd5b5061060c61069a366004614639565b61248c565b3480156106aa575f80fd5b506104e56106b9366004614654565b6124d6565b3480156106c9575f80fd5b5061060c6106d8366004614639565b600c6020525f908152604090205481565b3480156106f4575f80fd5b506106fd612751565b604051610486919061468b565b348015610715575f80fd5b506011546105539060ff1681565b34801561072e575f80fd5b5061060c61073d366004614639565b6127ff565b34801561074d575f80fd5b50600f5461055390600160a01b900460ff1681565b34801561076d575f80fd5b506104e561077c366004614639565b612842565b34801561078c575f80fd5b506104e56129f5565b3480156107a0575f80fd5b506105536107af366004614639565b60086020525f908152604090205460ff1681565b3480156107ce575f80fd5b5061060c60055481565b3480156107e3575f80fd5b506104e56107f23660046145e6565b612a08565b348015610802575f80fd5b5061060c600581565b348015610816575f80fd5b50610553612ae7565b34801561082a575f80fd5b5061060c60035481565b34801561083f575f80fd5b506104e561084e366004614700565b612b3c565b34801561085e575f80fd5b505f546001600160a01b03166104ae565b34801561087a575f80fd5b5061088e610889366004614639565b612d65565b60405161048695949392919094151585529215156020850152901515604084015260608301521515608082015260a00190565b3480156108cc575f80fd5b506104e56108db3660046147ab565b612e19565b3480156108eb575f80fd5b506108ff6108fa366004614558565b61314d565b604080516001600160a01b039094168452602084019290925290820152606001610486565b34801561092f575f80fd5b506104e561093e3660046147fe565b613188565b34801561094e575f80fd5b506104e561095d366004614828565b6134ee565b34801561096d575f80fd5b50610553613771565b348015610981575f80fd5b50600f546104ae906001600160a01b031681565b3480156109a0575f80fd5b506105536109af366004614639565b6137aa565b3480156109bf575f80fd5b506104e56109ce366004614851565b6137f7565b3480156109de575f80fd5b506109f26109ed366004614639565b613d79565b6040805193151584529115156020840152151590820152606001610486565b6104e5610a1f366004614558565b613dfc565b348015610a2f575f80fd5b50610a3861424d565b60405161048691906148b8565b348015610a50575f80fd5b50610a596142db565b60408051928352901515602083015201610486565b348015610a79575f80fd5b506104e5610a88366004614639565b614398565b348015610a98575f80fd5b50600e546104ae906001600160a01b031681565b348015610ab7575f80fd5b506004546104ae906001600160a01b031681565b60028054610ad890614904565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0490614904565b8015610b4f5780601f10610b2657610100808354040283529160200191610b4f565b820191905f5260205f20905b815481529060010190602001808311610b3257829003601f168201915b505050505081565b600b8181548110610b66575f80fd5b5f918252602090912001546001600160a01b0316905081565b335f908152600a602052604090205460ff16158015610ba95750600e546001600160a01b03163314155b8015610bbf57505f546001600160a01b03163314155b8015610c505750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3a919061493c565b6001600160a01b0316336001600160a01b031614155b15610c6e57604051634755657960e01b815260040160405180910390fd5b600f54600160a01b900460ff1615610c9b57604051632fb83b9560e21b81523060048201526024016102e0565b6011805460ff1916821515179055600f546001600160a01b03166379134eef303384610cc7575f610cca565b60015b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015260a06024820152600960a48201526814d95d14185d5cd95960ba1b60c482015292909116604483015260ff1660648201525f608482015260e4015f604051808303815f87803b158015610d3f575f80fd5b505af1158015610d51573d5f803e3d5ffd5b505050507f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd281604051610d88911515815260200190565b60405180910390a150565b335f908152600a602052604090205460ff16158015610dbd5750600e546001600160a01b03163314155b8015610dd357505f546001600160a01b03163314155b8015610e645750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4e919061493c565b6001600160a01b0316336001600160a01b031614155b15610e8257604051634755657960e01b815260040160405180910390fd5b60115460ff1615610ea65760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615610ed357604051632fb83b9560e21b81523060048201526024016102e0565b5f819003610ef4576040516343bbbec560e11b815260040160405180910390fd5b5f805b82811015611049575f848483818110610f1257610f12614957565b9050602002016020810190610f279190614639565b6001600160a01b031614158015610f80575060085f858584818110610f4e57610f4e614957565b9050602002016020810190610f639190614639565b6001600160a01b0316815260208101919091526040015f205460ff165b15611041575f60085f868685818110610f9b57610f9b614957565b9050602002016020810190610fb09190614639565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055838382818110610fe957610fe9614957565b9050602002016020810190610ffe9190614639565b6001600160a01b03167f117dceff005993edaf076fbb16bea61993f3043335ca6198bf32f99add0fbdee60405160405180910390a28161103d8161496b565b9250505b600101610ef7565b50600f546040516379134eef60e01b815230600482015260a06024820152601160a4820152700a4cae6cae886d8c2d2dacac884c2e8c6d607b1b60c4820152336044820152606481018390525f60848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b1580156110c7575f80fd5b505af11580156110d9573d5f803e3d5ffd5b505050507fb49f06d8d0e4a50e3a48030714951c67869352239dc80dc21042a5f85319d2aa8160405161110e91815260200190565b60405180910390a1505050565b335f908152600a602052604090205460ff161580156111455750600e546001600160a01b03163314155b801561115b57505f546001600160a01b03163314155b80156111ec5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d6919061493c565b6001600160a01b0316336001600160a01b031614155b1561120a57604051634755657960e01b815260040160405180910390fd5b60115460ff161561122e5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561125b57604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b0381166112825760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381165f9081526008602052604090205460ff166112ba57604051630b094f2760e31b815260040160405180910390fd5b6001600160a01b038181165f90815260086020526040808220805460ff19169055600f5490516379134eef60e01b815230600482015260a06024820152601260a4820152715265736574436c61696d656453696e676c6560701b60c4820152336044820152606481018390526084810192909252909116906379134eef9060e4015f604051808303815f87803b158015611352575f80fd5b505af1158015611364573d5f803e3d5ffd5b50506040516001600160a01b03841692507f117dceff005993edaf076fbb16bea61993f3043335ca6198bf32f99add0fbdee91505f90a250565b335f908152600a602052604090205460ff161580156113c85750600e546001600160a01b03163314155b80156113de57505f546001600160a01b03163314155b801561146f5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611435573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611459919061493c565b6001600160a01b0316336001600160a01b031614155b1561148d57604051634755657960e01b815260040160405180910390fd5b600f54600160a01b900460ff16156114ba57604051632fb83b9560e21b81523060048201526024016102e0565b600f8054600160a01b60ff60a01b198216179091556040516379134eef60e01b815230600482015260a06024820152600c60a48201526b11195b195d1951985d58d95d60a21b60c48201523360448201525f6064820181905260848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b158015611544575f80fd5b505af1158015611556573d5f803e3d5ffd5b50506040513092507f3894d20e068961d25457fcd53b0f3a1f7cdca92600ff7558276bc6da9d984f8991505f90a26004546001600160a01b031615801561159c57505f47115b15611618575f80546040516001600160a01b039091169047908381818185875af1925050503d805f81146115eb576040519150601f19603f3d011682016040523d82523d5f602084013e6115f0565b606091505b5050905080611612576040516312171d8360e31b815260040160405180910390fd5b5061174f565b6004546001600160a01b03161561174f57600480546040516370a0823160e01b815230928101929092525f916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611674573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116989190614983565b9050801561174d576004546001600160a01b031663a9059cbb6116c25f546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af115801561170c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611730919061499a565b61174d576040516312171d8360e31b815260040160405180910390fd5b505b6011805460ff19166001179055565b335f908152600a602052604090205460ff161580156117885750600e546001600160a01b03163314155b801561179e57505f546001600160a01b03163314155b801561182f5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611819919061493c565b6001600160a01b0316336001600160a01b031614155b1561184d57604051634755657960e01b815260040160405180910390fd5b60115460ff16156118715760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561189e57604051632fb83b9560e21b81523060048201526024016102e0565b5f805b60105481101561194f575f601082815481106118bf576118bf614957565b5f91825260208083206003909202909101546001600160a01b0316808352600890915260409091205490915060ff1615611946576001600160a01b0381165f81815260086020526040808220805460ff19169055517f117dceff005993edaf076fbb16bea61993f3043335ca6198bf32f99add0fbdee9190a2826119428161496b565b9350505b506001016118a1565b50600f80546040516379134eef60e01b815230600482015260a0602482015260a48101929092526e14995cd95d105b1b10db185a5b5959608a1b60c4830152336044830152606482018390525f60848301526001600160a01b0316906379134eef9060e4015f604051808303815f87803b1580156119cb575f80fd5b505af11580156119dd573d5f803e3d5ffd5b505050507fb49f06d8d0e4a50e3a48030714951c67869352239dc80dc21042a5f85319d2aa81604051610d8891815260200190565b611a1a6143d2565b611a226143fe565b60115460ff1615611a465760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615611a7357604051632fb83b9560e21b81523060048201526024016102e0565b805f03611a935760405163162908e360e11b815260040160405180910390fd5b6004546001600160a01b0316611bf65780471015611ac457604051631e9acf1760e31b815260040160405180910390fd5b5f80546040516001600160a01b039091169083908381818185875af1925050503d805f8114611b0e576040519150601f19603f3d011682016040523d82523d5f602084013e611b13565b606091505b5050905080611b35576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef90611b6c903090339087906001906004016149b5565b5f604051808303815f87803b158015611b83575f80fd5b505af1158015611b95573d5f803e3d5ffd5b50505050611baa5f546001600160a01b031690565b60408051848152600160208201526001600160a01b0392909216917f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5910160405180910390a250611deb565b600480546040516370a0823160e01b8152309281019290925282916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611c41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c659190614983565b1015611c8457604051631e9acf1760e31b815260040160405180910390fd5b6004546001600160a01b031663a9059cbb611ca65f546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611cf0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d14919061499a565b611d31576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef90611d67903090339086905f906004016149b5565b5f604051808303815f87803b158015611d7e575f80fd5b505af1158015611d90573d5f803e3d5ffd5b50505050611da55f546001600160a01b031690565b604080518381525f60208201526001600160a01b0392909216917f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5910160405180910390a25b611df460018055565b50565b600e546001600160a01b03163314611e2257604051636bbaa1c160e01b815260040160405180910390fd5b611e2a6143fe565b60115460ff1615611e4e5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615611e7b57604051632fb83b9560e21b81523060048201526024016102e0565b5f819003611e9c576040516343bbbec560e11b815260040160405180910390fd5b600554421015611ebf5760405163916da0d160e01b815260040160405180910390fd5b600654421115611ee25760405163e3ea984960e01b815260040160405180910390fd5b6003545f03611f0457604051630144056360e01b815260040160405180910390fd5b5f805b82811015611f4d57611f39848483818110611f2457611f24614957565b905060200201602081019061073d9190614639565b611f4390836149fe565b9150600101611f07565b506004546001600160a01b0316611f845780471015611f7f57604051631e9acf1760e31b815260040160405180910390fd5b612012565b600480546040516370a0823160e01b8152309281019290925282916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611fcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff39190614983565b101561201257604051631e9acf1760e31b815260040160405180910390fd5b5f5b82811015612430575f84848381811061202f5761202f614957565b90506020020160208101906120449190614639565b90506001600160a01b03811661206d5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381165f9081526009602052604090205460ff166120a557604051630b094f2760e31b815260040160405180910390fd5b6001600160a01b0381165f9081526008602052604090205460ff16156120de57604051630c8d9eab60e31b815260040160405180910390fd5b5f6120e8826127ff565b6001600160a01b038381165f8181526008602090815260408083208054600160ff19909116811790915581516060810183529485529184018681524291850191825260108054938401815590935292517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672600390920291820180546001600160a01b03191691861691909117905590517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67382015590517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67490910155600454919250166122ec575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612217576040519150601f19603f3d011682016040523d82523d5f602084013e61221c565b606091505b505090508061223e576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef9061227590309087908790600190600401614a11565b5f604051808303815f87803b15801561228c575f80fd5b505af115801561229e573d5f803e3d5ffd5b505060408051858152600160208201526001600160a01b03871693507ffa8256f7c08bb01a03ea96f8b3a904a4450311c9725d1c52cdbe21ed3dc42dcc92500160405180910390a250612426565b6004805460405163a9059cbb60e01b81526001600160a01b03858116938201939093526024810184905291169063a9059cbb906044016020604051808303815f875af115801561233e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612362919061499a565b61237f576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef906123b5903090869086905f90600401614a11565b5f604051808303815f87803b1580156123cc575f80fd5b505af11580156123de573d5f803e3d5ffd5b5050604080518481525f60208201526001600160a01b03861693507ffa8256f7c08bb01a03ea96f8b3a904a4450311c9725d1c52cdbe21ed3dc42dcc92500160405180910390a25b5050600101612014565b505061243b60018055565b5050565b600f545f90600160a01b900460ff161561246e57604051632fb83b9560e21b81523060048201526024016102e0565b506001600160a01b03165f908152600d602052604090205460ff1690565b600f545f90600160a01b900460ff16156124bb57604051632fb83b9560e21b81523060048201526024016102e0565b506001600160a01b03165f908152600c602052604090205490565b335f908152600a602052604090205460ff161580156125005750600e546001600160a01b03163314155b801561251657505f546001600160a01b03163314155b80156125a75750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561256d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612591919061493c565b6001600160a01b0316336001600160a01b031614155b156125c557604051634755657960e01b815260040160405180910390fd5b60115460ff16156125e95760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561261657604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b03821661263d5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b038281165f908152600960205260409020805460ff1916831515179055600f54166379134eef303384612677575f61267a565b60015b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015260a06024820152600c60a48201526b14d95d15da1a5d195b1a5cdd60a21b60c482015292909116604483015260ff1660648201525f608482015260e4015f604051808303815f87803b1580156126f2575f80fd5b505af1158015612704573d5f803e3d5ffd5b50505050816001600160a01b03167ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d82604051612745911515815260200190565b60405180910390a25050565b600f54606090600160a01b900460ff161561278157604051632fb83b9560e21b81523060048201526024016102e0565b6010805480602002602001604051908101604052809291908181526020015f905b828210156127f6575f848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016127a2565b50505050905090565b6001600160a01b0381165f908152600d602052604081205460ff161561283a57506001600160a01b03165f908152600c602052604090205490565b505060035490565b61284a6143d2565b600f54600160a01b900460ff161561287757604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b03811661289e5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381165f908152600a602052604090205460ff16156128d757604051630c8d9eab60e31b815260040160405180910390fd5b6001600160a01b038181165f818152600a6020526040808220805460ff19166001908117909155600b8054918201815583527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916909317909255600f5491516379134eef60e01b815230600482015260a06024820152600860a48201526720b23220b236b4b760c11b60c48201523360448201526064810182905260848101919091529116906379134eef9060e4015f604051808303815f87803b1580156129a9575f80fd5b505af11580156129bb573d5f803e3d5ffd5b50506040516001600160a01b03841692507f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33991505f90a250565b6129fd6143d2565b612a065f614428565b565b600e546001600160a01b03163314612a3357604051636bbaa1c160e01b815260040160405180910390fd5b612a3b6143fe565b60115460ff1615612a5f5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615612a8c57604051632fb83b9560e21b81523060048201526024016102e0565b60405163318d9e5d60e01b8152309063318d9e5d90612ab19085908590600401614a57565b5f604051808303815f87803b158015612ac8575f80fd5b505af1158015612ada573d5f803e3d5ffd5b5050505061243b60018055565b600f545f90600160a01b900460ff1615612b1657604051632fb83b9560e21b81523060048201526024016102e0565b6005544210158015612b2a57506006544211155b8015612b3757505f600354115b905090565b335f908152600a602052604090205460ff16158015612b665750600e546001600160a01b03163314155b8015612b7c57505f546001600160a01b03163314155b8015612c0d5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bf7919061493c565b6001600160a01b0316336001600160a01b031614155b15612c2b57604051634755657960e01b815260040160405180910390fd5b60115460ff1615612c4f5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615612c7c57604051632fb83b9560e21b81523060048201526024016102e0565b80515f03612c9d57604051632ef1310560e01b815260040160405180910390fd5b6002612ca98282614af0565b50600f546040516379134eef60e01b815230600482015260a06024820152600a60a4820152695570646174654e616d6560b01b60c48201523360448201525f6064820181905260848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b158015612d20575f80fd5b505af1158015612d32573d5f803e3d5ffd5b505050507f9f7688a97f1ac51fe03bac18af18d6810f9f11f0db08c59b1938a9ac825ef74481604051610d88919061450c565b5f805f805f600f60149054906101000a900460ff1615612d9a57604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b0386165f9081526008602090815260408083205460099092529091205460ff9182169650169350838015612dd3575084155b8015612de25750612de2612ae7565b9250612ded866127ff565b6001600160a01b039096165f908152600d6020526040902054949693959294929360ff90931692915050565b335f908152600a602052604090205460ff16158015612e435750600e546001600160a01b03163314155b8015612e5957505f546001600160a01b03163314155b8015612eea5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed4919061493c565b6001600160a01b0316336001600160a01b031614155b15612f0857604051634755657960e01b815260040160405180910390fd5b60115460ff1615612f2c5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615612f5957604051632fb83b9560e21b81523060048201526024016102e0565b5f829003612f7a576040516343bbbec560e11b815260040160405180910390fd5b5f5b82811015613147575f848483818110612f9757612f97614957565b9050602002016020810190612fac9190614639565b6001600160a01b031603612fd35760405163e6c4247b60e01b815260040160405180910390fd5b8160095f868685818110612fe957612fe9614957565b9050602002016020810190612ffe9190614639565b6001600160a01b03908116825260208201929092526040015f20805460ff191692151592909217909155600f54166379134eef30338561303e575f613041565b60015b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015260a06024820152601160a4820152700a6cae8aed0d2e8cad8d2e6e884c2e8c6d607b1b60c482015292909116604483015260ff1660648201525f608482015260e4015f604051808303815f87803b1580156130be575f80fd5b505af11580156130d0573d5f803e3d5ffd5b505050508383828181106130e6576130e6614957565b90506020020160208101906130fb9190614639565b6001600160a01b03167ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d83604051613137911515815260200190565b60405180910390a2600101612f7c565b50505050565b6010818154811061315c575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b335f908152600a602052604090205460ff161580156131b25750600e546001600160a01b03163314155b80156131c857505f546001600160a01b03163314155b80156132595750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561321f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613243919061493c565b6001600160a01b0316336001600160a01b031614155b1561327757604051634755657960e01b815260040160405180910390fd5b60115460ff161561329b5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff16156132c857604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b0382166132ef5760405163e6c4247b60e01b815260040160405180910390fd5b805f036133f3576001600160a01b038281165f908152600c60209081526040808320839055600d909152808220805460ff19169055600f5490516379134eef60e01b815230600482015260a06024820152601760a48201527f52656d6f7665437573746f6d436c61696d416d6f756e7400000000000000000060c4820152336044820152606481018390526084810192909252909116906379134eef9060e4015f604051808303815f87803b1580156133a6575f80fd5b505af11580156133b8573d5f803e3d5ffd5b50506040516001600160a01b03851692507fa06e8bffbe6150eb6e69a7fbeda566019db75725ba72fb16c6c4128b29fdc0ee91505f90a25050565b6001600160a01b038281165f908152600c60209081526040808320859055600d909152808220805460ff19166001179055600f5490516379134eef60e01b815230600482015260a06024820152601460a48201527314d95d10dd5cdd1bdb50db185a5b505b5bdd5b9d60621b60c4820152336044820152606481018590526084810192909252909116906379134eef9060e4015f604051808303815f87803b15801561349d575f80fd5b505af11580156134af573d5f803e3d5ffd5b50505050816001600160a01b03167fd31d76bdfddb65a9536e3395d24754bd7a67e2abd1034f2999b3e542bf25d2528260405161274591815260200190565b335f908152600a602052604090205460ff161580156135185750600e546001600160a01b03163314155b801561352e57505f546001600160a01b03163314155b80156135bf5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613585573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135a9919061493c565b6001600160a01b0316336001600160a01b031614155b156135dd57604051634755657960e01b815260040160405180910390fd5b60115460ff16156136015760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561362e57604051632fb83b9560e21b81523060048201526024016102e0565b825f0361364e5760405163162908e360e11b815260040160405180910390fd5b4282101561366f576040516337bf561360e11b815260040160405180910390fd5b81811161368f576040516337bf561360e11b815260040160405180910390fd5b600383905560058290556006819055600f546040516379134eef60e01b815230600482015260a06024820152601260a482015271536574436c61696d506172616d657465727360701b60c4820152336044820152606481018590525f60848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b15801561371c575f80fd5b505af115801561372e573d5f803e3d5ffd5b505060408051868152602081018690529081018490527fe06e2c198ced740a0c170bf380cd00e8698435f05a76d5392ddd92e7402b936e9250606001905061110e565b600f545f90600160a01b900460ff16156137a057604051632fb83b9560e21b81523060048201526024016102e0565b5060075460ff1690565b600f545f90600160a01b900460ff16156137d957604051632fb83b9560e21b81523060048201526024016102e0565b506001600160a01b03165f908152600a602052604090205460ff1690565b335f908152600a602052604090205460ff161580156138215750600e546001600160a01b03163314155b801561383757505f546001600160a01b03163314155b80156138c85750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b2919061493c565b6001600160a01b0316336001600160a01b031614155b156138e657604051634755657960e01b815260040160405180910390fd5b60115460ff161561390a5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561393757604051632fb83b9560e21b81523060048201526024016102e0565b5f839003613958576040516343bbbec560e11b815260040160405180910390fd5b8281146139785760405163512509d360e11b815260040160405180910390fd5b5f805b84811015613c99575f86868381811061399657613996614957565b90506020020160208101906139ab9190614639565b6001600160a01b0316036139d25760405163e6c4247b60e01b815260040160405180910390fd5b8383828181106139e4576139e4614957565b905060200201355f03613b4957600d5f878784818110613a0657613a06614957565b9050602002016020810190613a1b9190614639565b6001600160a01b0316815260208101919091526040015f205460ff1615613b4457600c5f878784818110613a5157613a51614957565b9050602002016020810190613a669190614639565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f600d5f888885818110613a9e57613a9e614957565b9050602002016020810190613ab39190614639565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055858582818110613aec57613aec614957565b9050602002016020810190613b019190614639565b6001600160a01b03167fa06e8bffbe6150eb6e69a7fbeda566019db75725ba72fb16c6c4128b29fdc0ee60405160405180910390a281613b408161496b565b9250505b613c91565b838382818110613b5b57613b5b614957565b90506020020135600c5f888885818110613b7757613b77614957565b9050602002016020810190613b8c9190614639565b6001600160a01b03166001600160a01b031681526020019081526020015f20819055506001600d5f888885818110613bc657613bc6614957565b9050602002016020810190613bdb9190614639565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055858582818110613c1457613c14614957565b9050602002016020810190613c299190614639565b6001600160a01b03167fd31d76bdfddb65a9536e3395d24754bd7a67e2abd1034f2999b3e542bf25d252858584818110613c6557613c65614957565b90506020020135604051613c7b91815260200190565b60405180910390a281613c8d8161496b565b9250505b60010161397b565b50600f546040516379134eef60e01b815230600482015260a06024820152601a60a48201527f536574437573746f6d436c61696d416d6f756e7473426174636800000000000060c4820152336044820152606481018390525f60848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b158015613d23575f80fd5b505af1158015613d35573d5f803e3d5ffd5b505050507fd4621b63196edc845db0798892749cecf45d45712aa235d3aa5d2d149445b67881604051613d6a91815260200190565b60405180910390a15050505050565b5f805f600f60149054906101000a900460ff1615613dac57604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b0384165f9081526008602090815260408083205460099092529091205460ff9182169450169150818015613de5575082155b8015613df45750613df4612ae7565b929491935050565b613e046143fe565b60115460ff1615613e285760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615613e5557604051632fb83b9560e21b81523060048201526024016102e0565b6004545f906001600160a01b0316613fdd57345f03613e875760405163162908e360e11b815260040160405180910390fd5b6064613e9460053461448b565b613e9e91906144a8565b90505f81118015613eb95750600e546001600160a01b031615155b15613f3157600e546040515f916001600160a01b03169083908381818185875af1925050503d805f8114613f08576040519150601f19603f3d011682016040523d82523d5f602084013e613f0d565b606091505b5050905080613f2f576040516312171d8360e31b815260040160405180910390fd5b505b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef90613f68903090339034906001906004016144c7565b5f604051808303815f87803b158015613f7f575f80fd5b505af1158015613f91573d5f803e3d5ffd5b5050604080513481526020810185905260018183015290513393507fd097d67b884742fd6739c2538bb1eea1008df0bf89dcb8efd874367948a7194a92509081900360600190a2614243565b815f03613ffd5760405163162908e360e11b815260040160405180910390fd5b341561401c5760405163162908e360e11b815260040160405180910390fd5b606461402960058461448b565b61403391906144a8565b90505f8111801561404e5750600e546001600160a01b031615155b156140ee5760048054600e546040516323b872dd60e01b815233938101939093526001600160a01b0390811660248401526044830184905216906323b872dd906064016020604051808303815f875af11580156140ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d1919061499a565b6140ee576040516312171d8360e31b815260040160405180910390fd5b6004546001600160a01b03166323b872dd333061410b8587614bb0565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af115801561415c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614180919061499a565b61419d576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef906141d3903090339087905f906004016144c7565b5f604051808303815f87803b1580156141ea575f80fd5b505af11580156141fc573d5f803e3d5ffd5b505060408051858152602081018590525f8183015290513393507fd097d67b884742fd6739c2538bb1eea1008df0bf89dcb8efd874367948a7194a92509081900360600190a25b50611df460018055565b600f54606090600160a01b900460ff161561427d57604051632fb83b9560e21b81523060048201526024016102e0565b600b8054806020026020016040519081016040528092919081815260200182805480156142d157602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116142b3575b5050505050905090565b600f545f908190600160a01b900460ff161561430c57604051632fb83b9560e21b81523060048201526024016102e0565b6004546001600160a01b03166143255750479160019150565b600480546040516370a0823160e01b815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa15801561436c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143909190614983565b925f92509050565b6143a06143d2565b6001600160a01b0381166143c957604051631e4fbdf760e01b81525f60048201526024016102e0565b611df481614428565b5f546001600160a01b03163314612a065760405163118cdaa760e01b81523360048201526024016102e0565b60026001540361442157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176144a2576144a2614477565b92915050565b5f826144c257634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03948516815260a06020820181905260049082015263119d5b9960e21b60c08201529290931660408301526060820152901515608082015260e00190565b5f602080835283518060208501525f5b818110156145385785810183015185820160400152820161451c565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215614568575f80fd5b5035919050565b8015158114611df4575f80fd5b5f6020828403121561458c575f80fd5b81356145978161456f565b9392505050565b5f8083601f8401126145ae575f80fd5b50813567ffffffffffffffff8111156145c5575f80fd5b6020830191508360208260051b85010111156145df575f80fd5b9250929050565b5f80602083850312156145f7575f80fd5b823567ffffffffffffffff81111561460d575f80fd5b6146198582860161459e565b90969095509350505050565b6001600160a01b0381168114611df4575f80fd5b5f60208284031215614649575f80fd5b813561459781614625565b5f8060408385031215614665575f80fd5b823561467081614625565b915060208301356146808161456f565b809150509250929050565b602080825282518282018190525f919060409081850190868401855b828110156146df57815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016146a7565b5091979650505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215614710575f80fd5b813567ffffffffffffffff80821115614727575f80fd5b818401915084601f83011261473a575f80fd5b81358181111561474c5761474c6146ec565b604051601f8201601f19908116603f01168101908382118183101715614774576147746146ec565b8160405282815287602084870101111561478c575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f604084860312156147bd575f80fd5b833567ffffffffffffffff8111156147d3575f80fd5b6147df8682870161459e565b90945092505060208401356147f38161456f565b809150509250925092565b5f806040838503121561480f575f80fd5b823561481a81614625565b946020939093013593505050565b5f805f6060848603121561483a575f80fd5b505081359360208301359350604090920135919050565b5f805f8060408587031215614864575f80fd5b843567ffffffffffffffff8082111561487b575f80fd5b6148878883890161459e565b9096509450602087013591508082111561489f575f80fd5b506148ac8782880161459e565b95989497509550505050565b602080825282518282018190525f9190848201906040850190845b818110156148f85783516001600160a01b0316835292840192918401916001016148d3565b50909695505050505050565b600181811c9082168061491857607f821691505b60208210810361493657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561494c575f80fd5b815161459781614625565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161497c5761497c614477565b5060010190565b5f60208284031215614993575f80fd5b5051919050565b5f602082840312156149aa575f80fd5b81516145978161456f565b6001600160a01b03948516815260a06020820181905260089082015267576974686472617760c01b60c08201529290931660408301526060820152901515608082015260e00190565b808201808211156144a2576144a2614477565b6001600160a01b03948516815260a06020820181905260059082015264436c61696d60d81b60c08201529290931660408301526060820152901515608082015260e00190565b60208082528181018390525f908460408401835b86811015614a99578235614a7e81614625565b6001600160a01b031682529183019190830190600101614a6b565b509695505050505050565b601f821115614aeb57805f5260205f20601f840160051c81016020851015614ac95750805b601f840160051c820191505b81811015614ae8575f8155600101614ad5565b50505b505050565b815167ffffffffffffffff811115614b0a57614b0a6146ec565b614b1e81614b188454614904565b84614aa4565b602080601f831160018114614b51575f8415614b3a5750858301515b5f19600386901b1c1916600185901b178555614ba8565b5f85815260208120601f198616915b82811015614b7f57888601518255948401946001909101908401614b60565b5085821015614b9c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b818103818111156144a2576144a261447756fea26469706673582212206016afb9de36e815448ae079ee4e8fe820028ec9e3e0b760732cab1532f9542a64736f6c6343000818003344d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000471ece3750da237f93b8e339c536989b8978a4380000000000000000000000009fbc2a0de6e5c5fd96e8d11541608f5f328c07850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eaacdbf6b9fd846c7fb43a04997a704ff84c2f810000000000000000000000009d6f441b31fba22700bb3217229eb89b13fb49de00000000000000000000000000000000000000000000000000000000000000075265776172647300000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061028e575f3560e01c806373b2e80e11610155578063b333cbfe116100be578063ca1d209d11610078578063ca1d209d14610a11578063e9523c9714610a24578063f1f959a614610a45578063f2fde38b14610a6e578063f6af343114610a8d578063fc0c546a14610aac575f80fd5b8063b333cbfe14610943578063c0eaa61e14610962578063c45a015514610976578063c5efea6814610995578063c67f9d67146109b4578063c9760f71146109d3575f80fd5b806384da92a71161010f57806384da92a7146108345780638da5cb5b146108535780639c1d294e1461086f578063a58da0be146108c1578063a888c2cd146108e0578063b2fb494714610924575f80fd5b806373b2e80e1461079557806378e97925146107c35780637baafe45146107d85780637e348a03146107f75780637fc278031461080b578063830953ab1461081f575f80fd5b80633af32abf116101f75780635b23c27d116101b15780635b23c27d146106e95780635c975abb1461070a5780635f7578bf146107235780636b35f7c1146107425780637048027514610762578063715018a614610781575f80fd5b80633af32abf1461061a5780633bed6bcd14610648578063465564551461066157806352fe5a3d1461068057806353d6fd591461069f5780635b20e421146106be575f80fd5b80631be44316116102485780631be443161461056357806322d86d1e1461057757806324d7806c1461058b5780632e1a7d4d146105b9578063318d9e5d146105d85780633197cbb6146105f7575f80fd5b806306fdde031461046557806314bfd6d01461048f57806316c38b3c146104c657806316edc2d1146104e7578063179c2e621461050657806318e77b7214610525575f80fd5b366104615760115460ff16156102b75760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff16156102e957604051632fb83b9560e21b81523060048201526024015b60405180910390fd5b6004546001600160a01b0316156103135760405163162908e360e11b815260040160405180910390fd5b600e545f906001600160a01b0316156103b857606461033360053461448b565b61033d91906144a8565b905080156103b857600e546040515f916001600160a01b03169083908381818185875af1925050503d805f811461038f576040519150601f19603f3d011682016040523d82523d5f602084013e610394565b606091505b50509050806103b6576040516312171d8360e31b815260040160405180910390fd5b505b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef906103ef903090339034906001906004016144c7565b5f604051808303815f87803b158015610406575f80fd5b505af1158015610418573d5f803e3d5ffd5b5050604080513481526020810185905260018183015290513393507fd097d67b884742fd6739c2538bb1eea1008df0bf89dcb8efd874367948a7194a92509081900360600190a2005b5f80fd5b348015610470575f80fd5b50610479610acb565b604051610486919061450c565b60405180910390f35b34801561049a575f80fd5b506104ae6104a9366004614558565b610b57565b6040516001600160a01b039091168152602001610486565b3480156104d1575f80fd5b506104e56104e036600461457c565b610b7f565b005b3480156104f2575f80fd5b506104e56105013660046145e6565b610d93565b348015610511575f80fd5b506104e5610520366004614639565b61111b565b348015610530575f80fd5b5061055361053f366004614639565b600d6020525f908152604090205460ff1681565b6040519015158152602001610486565b34801561056e575f80fd5b506104e561139e565b348015610582575f80fd5b506104e561175e565b348015610596575f80fd5b506105536105a5366004614639565b600a6020525f908152604090205460ff1681565b3480156105c4575f80fd5b506104e56105d3366004614558565b611a12565b3480156105e3575f80fd5b506104e56105f23660046145e6565b611df7565b348015610602575f80fd5b5061060c60065481565b604051908152602001610486565b348015610625575f80fd5b50610553610634366004614639565b60096020525f908152604090205460ff1681565b348015610653575f80fd5b506007546105539060ff1681565b34801561066c575f80fd5b5061055361067b366004614639565b61243f565b34801561068b575f80fd5b5061060c61069a366004614639565b61248c565b3480156106aa575f80fd5b506104e56106b9366004614654565b6124d6565b3480156106c9575f80fd5b5061060c6106d8366004614639565b600c6020525f908152604090205481565b3480156106f4575f80fd5b506106fd612751565b604051610486919061468b565b348015610715575f80fd5b506011546105539060ff1681565b34801561072e575f80fd5b5061060c61073d366004614639565b6127ff565b34801561074d575f80fd5b50600f5461055390600160a01b900460ff1681565b34801561076d575f80fd5b506104e561077c366004614639565b612842565b34801561078c575f80fd5b506104e56129f5565b3480156107a0575f80fd5b506105536107af366004614639565b60086020525f908152604090205460ff1681565b3480156107ce575f80fd5b5061060c60055481565b3480156107e3575f80fd5b506104e56107f23660046145e6565b612a08565b348015610802575f80fd5b5061060c600581565b348015610816575f80fd5b50610553612ae7565b34801561082a575f80fd5b5061060c60035481565b34801561083f575f80fd5b506104e561084e366004614700565b612b3c565b34801561085e575f80fd5b505f546001600160a01b03166104ae565b34801561087a575f80fd5b5061088e610889366004614639565b612d65565b60405161048695949392919094151585529215156020850152901515604084015260608301521515608082015260a00190565b3480156108cc575f80fd5b506104e56108db3660046147ab565b612e19565b3480156108eb575f80fd5b506108ff6108fa366004614558565b61314d565b604080516001600160a01b039094168452602084019290925290820152606001610486565b34801561092f575f80fd5b506104e561093e3660046147fe565b613188565b34801561094e575f80fd5b506104e561095d366004614828565b6134ee565b34801561096d575f80fd5b50610553613771565b348015610981575f80fd5b50600f546104ae906001600160a01b031681565b3480156109a0575f80fd5b506105536109af366004614639565b6137aa565b3480156109bf575f80fd5b506104e56109ce366004614851565b6137f7565b3480156109de575f80fd5b506109f26109ed366004614639565b613d79565b6040805193151584529115156020840152151590820152606001610486565b6104e5610a1f366004614558565b613dfc565b348015610a2f575f80fd5b50610a3861424d565b60405161048691906148b8565b348015610a50575f80fd5b50610a596142db565b60408051928352901515602083015201610486565b348015610a79575f80fd5b506104e5610a88366004614639565b614398565b348015610a98575f80fd5b50600e546104ae906001600160a01b031681565b348015610ab7575f80fd5b506004546104ae906001600160a01b031681565b60028054610ad890614904565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0490614904565b8015610b4f5780601f10610b2657610100808354040283529160200191610b4f565b820191905f5260205f20905b815481529060010190602001808311610b3257829003601f168201915b505050505081565b600b8181548110610b66575f80fd5b5f918252602090912001546001600160a01b0316905081565b335f908152600a602052604090205460ff16158015610ba95750600e546001600160a01b03163314155b8015610bbf57505f546001600160a01b03163314155b8015610c505750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3a919061493c565b6001600160a01b0316336001600160a01b031614155b15610c6e57604051634755657960e01b815260040160405180910390fd5b600f54600160a01b900460ff1615610c9b57604051632fb83b9560e21b81523060048201526024016102e0565b6011805460ff1916821515179055600f546001600160a01b03166379134eef303384610cc7575f610cca565b60015b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015260a06024820152600960a48201526814d95d14185d5cd95960ba1b60c482015292909116604483015260ff1660648201525f608482015260e4015f604051808303815f87803b158015610d3f575f80fd5b505af1158015610d51573d5f803e3d5ffd5b505050507f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd281604051610d88911515815260200190565b60405180910390a150565b335f908152600a602052604090205460ff16158015610dbd5750600e546001600160a01b03163314155b8015610dd357505f546001600160a01b03163314155b8015610e645750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4e919061493c565b6001600160a01b0316336001600160a01b031614155b15610e8257604051634755657960e01b815260040160405180910390fd5b60115460ff1615610ea65760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615610ed357604051632fb83b9560e21b81523060048201526024016102e0565b5f819003610ef4576040516343bbbec560e11b815260040160405180910390fd5b5f805b82811015611049575f848483818110610f1257610f12614957565b9050602002016020810190610f279190614639565b6001600160a01b031614158015610f80575060085f858584818110610f4e57610f4e614957565b9050602002016020810190610f639190614639565b6001600160a01b0316815260208101919091526040015f205460ff165b15611041575f60085f868685818110610f9b57610f9b614957565b9050602002016020810190610fb09190614639565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055838382818110610fe957610fe9614957565b9050602002016020810190610ffe9190614639565b6001600160a01b03167f117dceff005993edaf076fbb16bea61993f3043335ca6198bf32f99add0fbdee60405160405180910390a28161103d8161496b565b9250505b600101610ef7565b50600f546040516379134eef60e01b815230600482015260a06024820152601160a4820152700a4cae6cae886d8c2d2dacac884c2e8c6d607b1b60c4820152336044820152606481018390525f60848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b1580156110c7575f80fd5b505af11580156110d9573d5f803e3d5ffd5b505050507fb49f06d8d0e4a50e3a48030714951c67869352239dc80dc21042a5f85319d2aa8160405161110e91815260200190565b60405180910390a1505050565b335f908152600a602052604090205460ff161580156111455750600e546001600160a01b03163314155b801561115b57505f546001600160a01b03163314155b80156111ec5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d6919061493c565b6001600160a01b0316336001600160a01b031614155b1561120a57604051634755657960e01b815260040160405180910390fd5b60115460ff161561122e5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561125b57604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b0381166112825760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381165f9081526008602052604090205460ff166112ba57604051630b094f2760e31b815260040160405180910390fd5b6001600160a01b038181165f90815260086020526040808220805460ff19169055600f5490516379134eef60e01b815230600482015260a06024820152601260a4820152715265736574436c61696d656453696e676c6560701b60c4820152336044820152606481018390526084810192909252909116906379134eef9060e4015f604051808303815f87803b158015611352575f80fd5b505af1158015611364573d5f803e3d5ffd5b50506040516001600160a01b03841692507f117dceff005993edaf076fbb16bea61993f3043335ca6198bf32f99add0fbdee91505f90a250565b335f908152600a602052604090205460ff161580156113c85750600e546001600160a01b03163314155b80156113de57505f546001600160a01b03163314155b801561146f5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611435573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611459919061493c565b6001600160a01b0316336001600160a01b031614155b1561148d57604051634755657960e01b815260040160405180910390fd5b600f54600160a01b900460ff16156114ba57604051632fb83b9560e21b81523060048201526024016102e0565b600f8054600160a01b60ff60a01b198216179091556040516379134eef60e01b815230600482015260a06024820152600c60a48201526b11195b195d1951985d58d95d60a21b60c48201523360448201525f6064820181905260848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b158015611544575f80fd5b505af1158015611556573d5f803e3d5ffd5b50506040513092507f3894d20e068961d25457fcd53b0f3a1f7cdca92600ff7558276bc6da9d984f8991505f90a26004546001600160a01b031615801561159c57505f47115b15611618575f80546040516001600160a01b039091169047908381818185875af1925050503d805f81146115eb576040519150601f19603f3d011682016040523d82523d5f602084013e6115f0565b606091505b5050905080611612576040516312171d8360e31b815260040160405180910390fd5b5061174f565b6004546001600160a01b03161561174f57600480546040516370a0823160e01b815230928101929092525f916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611674573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116989190614983565b9050801561174d576004546001600160a01b031663a9059cbb6116c25f546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af115801561170c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611730919061499a565b61174d576040516312171d8360e31b815260040160405180910390fd5b505b6011805460ff19166001179055565b335f908152600a602052604090205460ff161580156117885750600e546001600160a01b03163314155b801561179e57505f546001600160a01b03163314155b801561182f5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611819919061493c565b6001600160a01b0316336001600160a01b031614155b1561184d57604051634755657960e01b815260040160405180910390fd5b60115460ff16156118715760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561189e57604051632fb83b9560e21b81523060048201526024016102e0565b5f805b60105481101561194f575f601082815481106118bf576118bf614957565b5f91825260208083206003909202909101546001600160a01b0316808352600890915260409091205490915060ff1615611946576001600160a01b0381165f81815260086020526040808220805460ff19169055517f117dceff005993edaf076fbb16bea61993f3043335ca6198bf32f99add0fbdee9190a2826119428161496b565b9350505b506001016118a1565b50600f80546040516379134eef60e01b815230600482015260a0602482015260a48101929092526e14995cd95d105b1b10db185a5b5959608a1b60c4830152336044830152606482018390525f60848301526001600160a01b0316906379134eef9060e4015f604051808303815f87803b1580156119cb575f80fd5b505af11580156119dd573d5f803e3d5ffd5b505050507fb49f06d8d0e4a50e3a48030714951c67869352239dc80dc21042a5f85319d2aa81604051610d8891815260200190565b611a1a6143d2565b611a226143fe565b60115460ff1615611a465760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615611a7357604051632fb83b9560e21b81523060048201526024016102e0565b805f03611a935760405163162908e360e11b815260040160405180910390fd5b6004546001600160a01b0316611bf65780471015611ac457604051631e9acf1760e31b815260040160405180910390fd5b5f80546040516001600160a01b039091169083908381818185875af1925050503d805f8114611b0e576040519150601f19603f3d011682016040523d82523d5f602084013e611b13565b606091505b5050905080611b35576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef90611b6c903090339087906001906004016149b5565b5f604051808303815f87803b158015611b83575f80fd5b505af1158015611b95573d5f803e3d5ffd5b50505050611baa5f546001600160a01b031690565b60408051848152600160208201526001600160a01b0392909216917f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5910160405180910390a250611deb565b600480546040516370a0823160e01b8152309281019290925282916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611c41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c659190614983565b1015611c8457604051631e9acf1760e31b815260040160405180910390fd5b6004546001600160a01b031663a9059cbb611ca65f546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015611cf0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d14919061499a565b611d31576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef90611d67903090339086905f906004016149b5565b5f604051808303815f87803b158015611d7e575f80fd5b505af1158015611d90573d5f803e3d5ffd5b50505050611da55f546001600160a01b031690565b604080518381525f60208201526001600160a01b0392909216917f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5910160405180910390a25b611df460018055565b50565b600e546001600160a01b03163314611e2257604051636bbaa1c160e01b815260040160405180910390fd5b611e2a6143fe565b60115460ff1615611e4e5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615611e7b57604051632fb83b9560e21b81523060048201526024016102e0565b5f819003611e9c576040516343bbbec560e11b815260040160405180910390fd5b600554421015611ebf5760405163916da0d160e01b815260040160405180910390fd5b600654421115611ee25760405163e3ea984960e01b815260040160405180910390fd5b6003545f03611f0457604051630144056360e01b815260040160405180910390fd5b5f805b82811015611f4d57611f39848483818110611f2457611f24614957565b905060200201602081019061073d9190614639565b611f4390836149fe565b9150600101611f07565b506004546001600160a01b0316611f845780471015611f7f57604051631e9acf1760e31b815260040160405180910390fd5b612012565b600480546040516370a0823160e01b8152309281019290925282916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611fcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff39190614983565b101561201257604051631e9acf1760e31b815260040160405180910390fd5b5f5b82811015612430575f84848381811061202f5761202f614957565b90506020020160208101906120449190614639565b90506001600160a01b03811661206d5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381165f9081526009602052604090205460ff166120a557604051630b094f2760e31b815260040160405180910390fd5b6001600160a01b0381165f9081526008602052604090205460ff16156120de57604051630c8d9eab60e31b815260040160405180910390fd5b5f6120e8826127ff565b6001600160a01b038381165f8181526008602090815260408083208054600160ff19909116811790915581516060810183529485529184018681524291850191825260108054938401815590935292517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672600390920291820180546001600160a01b03191691861691909117905590517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67382015590517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67490910155600454919250166122ec575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612217576040519150601f19603f3d011682016040523d82523d5f602084013e61221c565b606091505b505090508061223e576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef9061227590309087908790600190600401614a11565b5f604051808303815f87803b15801561228c575f80fd5b505af115801561229e573d5f803e3d5ffd5b505060408051858152600160208201526001600160a01b03871693507ffa8256f7c08bb01a03ea96f8b3a904a4450311c9725d1c52cdbe21ed3dc42dcc92500160405180910390a250612426565b6004805460405163a9059cbb60e01b81526001600160a01b03858116938201939093526024810184905291169063a9059cbb906044016020604051808303815f875af115801561233e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612362919061499a565b61237f576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef906123b5903090869086905f90600401614a11565b5f604051808303815f87803b1580156123cc575f80fd5b505af11580156123de573d5f803e3d5ffd5b5050604080518481525f60208201526001600160a01b03861693507ffa8256f7c08bb01a03ea96f8b3a904a4450311c9725d1c52cdbe21ed3dc42dcc92500160405180910390a25b5050600101612014565b505061243b60018055565b5050565b600f545f90600160a01b900460ff161561246e57604051632fb83b9560e21b81523060048201526024016102e0565b506001600160a01b03165f908152600d602052604090205460ff1690565b600f545f90600160a01b900460ff16156124bb57604051632fb83b9560e21b81523060048201526024016102e0565b506001600160a01b03165f908152600c602052604090205490565b335f908152600a602052604090205460ff161580156125005750600e546001600160a01b03163314155b801561251657505f546001600160a01b03163314155b80156125a75750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561256d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612591919061493c565b6001600160a01b0316336001600160a01b031614155b156125c557604051634755657960e01b815260040160405180910390fd5b60115460ff16156125e95760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561261657604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b03821661263d5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b038281165f908152600960205260409020805460ff1916831515179055600f54166379134eef303384612677575f61267a565b60015b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015260a06024820152600c60a48201526b14d95d15da1a5d195b1a5cdd60a21b60c482015292909116604483015260ff1660648201525f608482015260e4015f604051808303815f87803b1580156126f2575f80fd5b505af1158015612704573d5f803e3d5ffd5b50505050816001600160a01b03167ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d82604051612745911515815260200190565b60405180910390a25050565b600f54606090600160a01b900460ff161561278157604051632fb83b9560e21b81523060048201526024016102e0565b6010805480602002602001604051908101604052809291908181526020015f905b828210156127f6575f848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016127a2565b50505050905090565b6001600160a01b0381165f908152600d602052604081205460ff161561283a57506001600160a01b03165f908152600c602052604090205490565b505060035490565b61284a6143d2565b600f54600160a01b900460ff161561287757604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b03811661289e5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0381165f908152600a602052604090205460ff16156128d757604051630c8d9eab60e31b815260040160405180910390fd5b6001600160a01b038181165f818152600a6020526040808220805460ff19166001908117909155600b8054918201815583527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916909317909255600f5491516379134eef60e01b815230600482015260a06024820152600860a48201526720b23220b236b4b760c11b60c48201523360448201526064810182905260848101919091529116906379134eef9060e4015f604051808303815f87803b1580156129a9575f80fd5b505af11580156129bb573d5f803e3d5ffd5b50506040516001600160a01b03841692507f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33991505f90a250565b6129fd6143d2565b612a065f614428565b565b600e546001600160a01b03163314612a3357604051636bbaa1c160e01b815260040160405180910390fd5b612a3b6143fe565b60115460ff1615612a5f5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615612a8c57604051632fb83b9560e21b81523060048201526024016102e0565b60405163318d9e5d60e01b8152309063318d9e5d90612ab19085908590600401614a57565b5f604051808303815f87803b158015612ac8575f80fd5b505af1158015612ada573d5f803e3d5ffd5b5050505061243b60018055565b600f545f90600160a01b900460ff1615612b1657604051632fb83b9560e21b81523060048201526024016102e0565b6005544210158015612b2a57506006544211155b8015612b3757505f600354115b905090565b335f908152600a602052604090205460ff16158015612b665750600e546001600160a01b03163314155b8015612b7c57505f546001600160a01b03163314155b8015612c0d5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bf7919061493c565b6001600160a01b0316336001600160a01b031614155b15612c2b57604051634755657960e01b815260040160405180910390fd5b60115460ff1615612c4f5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615612c7c57604051632fb83b9560e21b81523060048201526024016102e0565b80515f03612c9d57604051632ef1310560e01b815260040160405180910390fd5b6002612ca98282614af0565b50600f546040516379134eef60e01b815230600482015260a06024820152600a60a4820152695570646174654e616d6560b01b60c48201523360448201525f6064820181905260848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b158015612d20575f80fd5b505af1158015612d32573d5f803e3d5ffd5b505050507f9f7688a97f1ac51fe03bac18af18d6810f9f11f0db08c59b1938a9ac825ef74481604051610d88919061450c565b5f805f805f600f60149054906101000a900460ff1615612d9a57604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b0386165f9081526008602090815260408083205460099092529091205460ff9182169650169350838015612dd3575084155b8015612de25750612de2612ae7565b9250612ded866127ff565b6001600160a01b039096165f908152600d6020526040902054949693959294929360ff90931692915050565b335f908152600a602052604090205460ff16158015612e435750600e546001600160a01b03163314155b8015612e5957505f546001600160a01b03163314155b8015612eea5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed4919061493c565b6001600160a01b0316336001600160a01b031614155b15612f0857604051634755657960e01b815260040160405180910390fd5b60115460ff1615612f2c5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615612f5957604051632fb83b9560e21b81523060048201526024016102e0565b5f829003612f7a576040516343bbbec560e11b815260040160405180910390fd5b5f5b82811015613147575f848483818110612f9757612f97614957565b9050602002016020810190612fac9190614639565b6001600160a01b031603612fd35760405163e6c4247b60e01b815260040160405180910390fd5b8160095f868685818110612fe957612fe9614957565b9050602002016020810190612ffe9190614639565b6001600160a01b03908116825260208201929092526040015f20805460ff191692151592909217909155600f54166379134eef30338561303e575f613041565b60015b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015260a06024820152601160a4820152700a6cae8aed0d2e8cad8d2e6e884c2e8c6d607b1b60c482015292909116604483015260ff1660648201525f608482015260e4015f604051808303815f87803b1580156130be575f80fd5b505af11580156130d0573d5f803e3d5ffd5b505050508383828181106130e6576130e6614957565b90506020020160208101906130fb9190614639565b6001600160a01b03167ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d83604051613137911515815260200190565b60405180910390a2600101612f7c565b50505050565b6010818154811061315c575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b335f908152600a602052604090205460ff161580156131b25750600e546001600160a01b03163314155b80156131c857505f546001600160a01b03163314155b80156132595750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561321f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613243919061493c565b6001600160a01b0316336001600160a01b031614155b1561327757604051634755657960e01b815260040160405180910390fd5b60115460ff161561329b5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff16156132c857604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b0382166132ef5760405163e6c4247b60e01b815260040160405180910390fd5b805f036133f3576001600160a01b038281165f908152600c60209081526040808320839055600d909152808220805460ff19169055600f5490516379134eef60e01b815230600482015260a06024820152601760a48201527f52656d6f7665437573746f6d436c61696d416d6f756e7400000000000000000060c4820152336044820152606481018390526084810192909252909116906379134eef9060e4015f604051808303815f87803b1580156133a6575f80fd5b505af11580156133b8573d5f803e3d5ffd5b50506040516001600160a01b03851692507fa06e8bffbe6150eb6e69a7fbeda566019db75725ba72fb16c6c4128b29fdc0ee91505f90a25050565b6001600160a01b038281165f908152600c60209081526040808320859055600d909152808220805460ff19166001179055600f5490516379134eef60e01b815230600482015260a06024820152601460a48201527314d95d10dd5cdd1bdb50db185a5b505b5bdd5b9d60621b60c4820152336044820152606481018590526084810192909252909116906379134eef9060e4015f604051808303815f87803b15801561349d575f80fd5b505af11580156134af573d5f803e3d5ffd5b50505050816001600160a01b03167fd31d76bdfddb65a9536e3395d24754bd7a67e2abd1034f2999b3e542bf25d2528260405161274591815260200190565b335f908152600a602052604090205460ff161580156135185750600e546001600160a01b03163314155b801561352e57505f546001600160a01b03163314155b80156135bf5750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613585573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135a9919061493c565b6001600160a01b0316336001600160a01b031614155b156135dd57604051634755657960e01b815260040160405180910390fd5b60115460ff16156136015760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561362e57604051632fb83b9560e21b81523060048201526024016102e0565b825f0361364e5760405163162908e360e11b815260040160405180910390fd5b4282101561366f576040516337bf561360e11b815260040160405180910390fd5b81811161368f576040516337bf561360e11b815260040160405180910390fd5b600383905560058290556006819055600f546040516379134eef60e01b815230600482015260a06024820152601260a482015271536574436c61696d506172616d657465727360701b60c4820152336044820152606481018590525f60848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b15801561371c575f80fd5b505af115801561372e573d5f803e3d5ffd5b505060408051868152602081018690529081018490527fe06e2c198ced740a0c170bf380cd00e8698435f05a76d5392ddd92e7402b936e9250606001905061110e565b600f545f90600160a01b900460ff16156137a057604051632fb83b9560e21b81523060048201526024016102e0565b5060075460ff1690565b600f545f90600160a01b900460ff16156137d957604051632fb83b9560e21b81523060048201526024016102e0565b506001600160a01b03165f908152600a602052604090205460ff1690565b335f908152600a602052604090205460ff161580156138215750600e546001600160a01b03163314155b801561383757505f546001600160a01b03163314155b80156138c85750600f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b2919061493c565b6001600160a01b0316336001600160a01b031614155b156138e657604051634755657960e01b815260040160405180910390fd5b60115460ff161561390a5760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff161561393757604051632fb83b9560e21b81523060048201526024016102e0565b5f839003613958576040516343bbbec560e11b815260040160405180910390fd5b8281146139785760405163512509d360e11b815260040160405180910390fd5b5f805b84811015613c99575f86868381811061399657613996614957565b90506020020160208101906139ab9190614639565b6001600160a01b0316036139d25760405163e6c4247b60e01b815260040160405180910390fd5b8383828181106139e4576139e4614957565b905060200201355f03613b4957600d5f878784818110613a0657613a06614957565b9050602002016020810190613a1b9190614639565b6001600160a01b0316815260208101919091526040015f205460ff1615613b4457600c5f878784818110613a5157613a51614957565b9050602002016020810190613a669190614639565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f600d5f888885818110613a9e57613a9e614957565b9050602002016020810190613ab39190614639565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055858582818110613aec57613aec614957565b9050602002016020810190613b019190614639565b6001600160a01b03167fa06e8bffbe6150eb6e69a7fbeda566019db75725ba72fb16c6c4128b29fdc0ee60405160405180910390a281613b408161496b565b9250505b613c91565b838382818110613b5b57613b5b614957565b90506020020135600c5f888885818110613b7757613b77614957565b9050602002016020810190613b8c9190614639565b6001600160a01b03166001600160a01b031681526020019081526020015f20819055506001600d5f888885818110613bc657613bc6614957565b9050602002016020810190613bdb9190614639565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055858582818110613c1457613c14614957565b9050602002016020810190613c299190614639565b6001600160a01b03167fd31d76bdfddb65a9536e3395d24754bd7a67e2abd1034f2999b3e542bf25d252858584818110613c6557613c65614957565b90506020020135604051613c7b91815260200190565b60405180910390a281613c8d8161496b565b9250505b60010161397b565b50600f546040516379134eef60e01b815230600482015260a06024820152601a60a48201527f536574437573746f6d436c61696d416d6f756e7473426174636800000000000060c4820152336044820152606481018390525f60848201526001600160a01b03909116906379134eef9060e4015f604051808303815f87803b158015613d23575f80fd5b505af1158015613d35573d5f803e3d5ffd5b505050507fd4621b63196edc845db0798892749cecf45d45712aa235d3aa5d2d149445b67881604051613d6a91815260200190565b60405180910390a15050505050565b5f805f600f60149054906101000a900460ff1615613dac57604051632fb83b9560e21b81523060048201526024016102e0565b6001600160a01b0384165f9081526008602090815260408083205460099092529091205460ff9182169450169150818015613de5575082155b8015613df45750613df4612ae7565b929491935050565b613e046143fe565b60115460ff1615613e285760405163ab35696f60e01b815260040160405180910390fd5b600f54600160a01b900460ff1615613e5557604051632fb83b9560e21b81523060048201526024016102e0565b6004545f906001600160a01b0316613fdd57345f03613e875760405163162908e360e11b815260040160405180910390fd5b6064613e9460053461448b565b613e9e91906144a8565b90505f81118015613eb95750600e546001600160a01b031615155b15613f3157600e546040515f916001600160a01b03169083908381818185875af1925050503d805f8114613f08576040519150601f19603f3d011682016040523d82523d5f602084013e613f0d565b606091505b5050905080613f2f576040516312171d8360e31b815260040160405180910390fd5b505b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef90613f68903090339034906001906004016144c7565b5f604051808303815f87803b158015613f7f575f80fd5b505af1158015613f91573d5f803e3d5ffd5b5050604080513481526020810185905260018183015290513393507fd097d67b884742fd6739c2538bb1eea1008df0bf89dcb8efd874367948a7194a92509081900360600190a2614243565b815f03613ffd5760405163162908e360e11b815260040160405180910390fd5b341561401c5760405163162908e360e11b815260040160405180910390fd5b606461402960058461448b565b61403391906144a8565b90505f8111801561404e5750600e546001600160a01b031615155b156140ee5760048054600e546040516323b872dd60e01b815233938101939093526001600160a01b0390811660248401526044830184905216906323b872dd906064016020604051808303815f875af11580156140ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d1919061499a565b6140ee576040516312171d8360e31b815260040160405180910390fd5b6004546001600160a01b03166323b872dd333061410b8587614bb0565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af115801561415c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614180919061499a565b61419d576040516312171d8360e31b815260040160405180910390fd5b600f546040516379134eef60e01b81526001600160a01b03909116906379134eef906141d3903090339087905f906004016144c7565b5f604051808303815f87803b1580156141ea575f80fd5b505af11580156141fc573d5f803e3d5ffd5b505060408051858152602081018590525f8183015290513393507fd097d67b884742fd6739c2538bb1eea1008df0bf89dcb8efd874367948a7194a92509081900360600190a25b50611df460018055565b600f54606090600160a01b900460ff161561427d57604051632fb83b9560e21b81523060048201526024016102e0565b600b8054806020026020016040519081016040528092919081815260200182805480156142d157602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116142b3575b5050505050905090565b600f545f908190600160a01b900460ff161561430c57604051632fb83b9560e21b81523060048201526024016102e0565b6004546001600160a01b03166143255750479160019150565b600480546040516370a0823160e01b815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa15801561436c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143909190614983565b925f92509050565b6143a06143d2565b6001600160a01b0381166143c957604051631e4fbdf760e01b81525f60048201526024016102e0565b611df481614428565b5f546001600160a01b03163314612a065760405163118cdaa760e01b81523360048201526024016102e0565b60026001540361442157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176144a2576144a2614477565b92915050565b5f826144c257634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03948516815260a06020820181905260049082015263119d5b9960e21b60c08201529290931660408301526060820152901515608082015260e00190565b5f602080835283518060208501525f5b818110156145385785810183015185820160400152820161451c565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215614568575f80fd5b5035919050565b8015158114611df4575f80fd5b5f6020828403121561458c575f80fd5b81356145978161456f565b9392505050565b5f8083601f8401126145ae575f80fd5b50813567ffffffffffffffff8111156145c5575f80fd5b6020830191508360208260051b85010111156145df575f80fd5b9250929050565b5f80602083850312156145f7575f80fd5b823567ffffffffffffffff81111561460d575f80fd5b6146198582860161459e565b90969095509350505050565b6001600160a01b0381168114611df4575f80fd5b5f60208284031215614649575f80fd5b813561459781614625565b5f8060408385031215614665575f80fd5b823561467081614625565b915060208301356146808161456f565b809150509250929050565b602080825282518282018190525f919060409081850190868401855b828110156146df57815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016146a7565b5091979650505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215614710575f80fd5b813567ffffffffffffffff80821115614727575f80fd5b818401915084601f83011261473a575f80fd5b81358181111561474c5761474c6146ec565b604051601f8201601f19908116603f01168101908382118183101715614774576147746146ec565b8160405282815287602084870101111561478c575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f604084860312156147bd575f80fd5b833567ffffffffffffffff8111156147d3575f80fd5b6147df8682870161459e565b90945092505060208401356147f38161456f565b809150509250925092565b5f806040838503121561480f575f80fd5b823561481a81614625565b946020939093013593505050565b5f805f6060848603121561483a575f80fd5b505081359360208301359350604090920135919050565b5f805f8060408587031215614864575f80fd5b843567ffffffffffffffff8082111561487b575f80fd5b6148878883890161459e565b9096509450602087013591508082111561489f575f80fd5b506148ac8782880161459e565b95989497509550505050565b602080825282518282018190525f9190848201906040850190845b818110156148f85783516001600160a01b0316835292840192918401916001016148d3565b50909695505050505050565b600181811c9082168061491857607f821691505b60208210810361493657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561494c575f80fd5b815161459781614625565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161497c5761497c614477565b5060010190565b5f60208284031215614993575f80fd5b5051919050565b5f602082840312156149aa575f80fd5b81516145978161456f565b6001600160a01b03948516815260a06020820181905260089082015267576974686472617760c01b60c08201529290931660408301526060820152901515608082015260e00190565b808201808211156144a2576144a2614477565b6001600160a01b03948516815260a06020820181905260059082015264436c61696d60d81b60c08201529290931660408301526060820152901515608082015260e00190565b60208082528181018390525f908460408401835b86811015614a99578235614a7e81614625565b6001600160a01b031682529183019190830190600101614a6b565b509695505050505050565b601f821115614aeb57805f5260205f20601f840160051c81016020851015614ac95750805b601f840160051c820191505b81811015614ae8575f8155600101614ad5565b50505b505050565b815167ffffffffffffffff811115614b0a57614b0a6146ec565b614b1e81614b188454614904565b84614aa4565b602080601f831160018114614b51575f8415614b3a5750858301515b5f19600386901b1c1916600185901b178555614ba8565b5f85815260208120601f198616915b82811015614b7f57888601518255948401946001909101908401614b60565b5085821015614b9c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b818103818111156144a2576144a261447756fea26469706673582212206016afb9de36e815448ae079ee4e8fe820028ec9e3e0b760732cab1532f9542a64736f6c63430008180033
Deployed Bytecode Sourcemap
19117:18389:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21912:6;;;;21908:35;;;21927:16;;-1:-1:-1;;;21927:16:0;;;;;;;;;;;21908:35;22013:7:::1;::::0;-1:-1:-1;;;22013:7:0;::::1;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::1;22029:33;::::0;::::1;160:51:1::0;133:18;;22029:33:0::1;;;;;;;;22009:53;36963:5:::2;::::0;-1:-1:-1;;;;;36963:5:0::2;:19:::0;36959:47:::2;;36991:15;;-1:-1:-1::0;;;36991:15:0::2;;;;;;;;;;;36959:47;37054:7;::::0;37017:18:::2;::::0;-1:-1:-1;;;;;37054:7:0::2;:21:::0;37050:279:::2;;37141:3;37106:31;19823:1;37106:9;:31;:::i;:::-;37105:39;;;;:::i;:::-;37092:52:::0;-1:-1:-1;37163:14:0;;37159:159:::2;;37214:7;::::0;:35:::2;::::0;37199:9:::2;::::0;-1:-1:-1;;;;;37214:7:0::2;::::0;37234:10;;37199:9;37214:35;37199:9;37214:35;37234:10;37214:7;:35:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37198:51;;;37273:4;37268:34;;37286:16;;-1:-1:-1::0;;;37286:16:0::2;;;;;;;;;;;37268:34;37179:139;37159:159;37354:7;::::0;37339:93:::2;::::0;-1:-1:-1;;;37339:93:0;;-1:-1:-1;;;;;37354:7:0;;::::2;::::0;37339:41:::2;::::0;:93:::2;::::0;37389:4:::2;::::0;37404:10:::2;::::0;37416:9:::2;::::0;37354:7;;37339:93:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;37448:47:0::2;::::0;;37467:9:::2;1842:25:1::0;;1898:2;1883:18;;1876:34;;;37490:4:0::2;1926:18:1::0;;;1919:50;37448:47:0;;37455:10:::2;::::0;-1:-1:-1;37448:47:0::2;::::0;-1:-1:-1;37448:47:0;;;;1830:2:1;37448:47:0;;::::2;36948:555:::0;19117:18389;;;;19173:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19537:23;;;;;;;;;;-1:-1:-1;19537:23:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;19537:23:0;14:203:1;36474:250:0;;;;;;;;;;-1:-1:-1;36474:250:0;;;;;:::i;:::-;;:::i;:::-;;32728:665;;;;;;;;;;-1:-1:-1;32728:665:0;;;;;:::i;:::-;;:::i;32293:427::-;;;;;;;;;;-1:-1:-1;32293:427:0;;;;;:::i;:::-;;:::i;19665:47::-;;;;;;;;;;-1:-1:-1;19665:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4454:14:1;;4447:22;4429:41;;4417:2;4402:18;19665:47:0;4289:187:1;33998:741:0;;;;;;;;;;;;;:::i;33401:589::-;;;;;;;;;;;;;:::i;19491:39::-;;;;;;;;;;-1:-1:-1;19491:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29661:915;;;;;;;;;;-1:-1:-1;29661:915:0;;;;;:::i;:::-;;:::i;27580:2073::-;;;;;;;;;;-1:-1:-1;27580:2073:0;;;;;:::i;:::-;;:::i;19289:22::-;;;;;;;;;;;;;;;;;;;4627:25:1;;;4615:2;4600:18;19289:22:0;4481:177:1;19439:45:0;;;;;;;;;;-1:-1:-1;19439:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19318:22;;;;;;;;;;-1:-1:-1;19318:22:0;;;;;;;;25224:135;;;;;;;;;;-1:-1:-1;25224:135:0;;;;;:::i;:::-;;:::i;25367:142::-;;;;;;;;;;-1:-1:-1;25367:142:0;;;;;:::i;:::-;;:::i;31339:367::-;;;;;;;;;;-1:-1:-1;31339:367:0;;;;;:::i;:::-;;:::i;19605:53::-;;;;;;;;;;-1:-1:-1;19605:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;30584:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22090:18::-;;;;;;;;;;-1:-1:-1;22090:18:0;;;;;;;;25012:204;;;;;;;;;;-1:-1:-1;25012:204:0;;;;;:::i;:::-;;:::i;19831:19::-;;;;;;;;;;-1:-1:-1;19831:19:0;;;;-1:-1:-1;;;19831:19:0;;;;;;25517:427;;;;;;;;;;-1:-1:-1;25517:427:0;;;;;:::i;:::-;;:::i;3361:103::-;;;;;;;;;;;;;:::i;19390:42::-;;;;;;;;;;-1:-1:-1;19390:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19258:24;;;;;;;;;;;;;;;;36732:151;;;;;;;;;;-1:-1:-1;36732:151:0;;;;;:::i;:::-;;:::i;19777:47::-;;;;;;;;;;;;19823:1;19777:47;;35383:171;;;;;;;;;;;;;:::i;19198:26::-;;;;;;;;;;;;;;;;34747:329;;;;;;;;;;-1:-1:-1;34747:329:0;;;;;:::i;:::-;;:::i;2686:87::-;;;;;;;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;2686:87;;35985:481;;;;;;;;;;-1:-1:-1;35985:481:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;7251:14:1;;7244:22;7226:41;;7310:14;;7303:22;7298:2;7283:18;;7276:50;7369:14;;7362:22;7357:2;7342:18;;7335:50;7416:2;7401:18;;7394:34;7472:14;7465:22;7459:3;7444:19;;7437:51;7213:3;7198:19;;6991:503;31714:571:0;;;;;;;;;;-1:-1:-1;31714:571:0;;;;;:::i;:::-;;:::i;20013:27::-;;;;;;;;;;-1:-1:-1;20013:27:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8290:32:1;;;8272:51;;8354:2;8339:18;;8332:34;;;;8382:18;;;8375:34;8260:2;8245:18;20013:27:0;8070:345:1;23011:761:0;;;;;;;;;;-1:-1:-1;23011:761:0;;;;;:::i;:::-;;:::i;30709:622::-;;;;;;;;;;-1:-1:-1;30709:622:0;;;;;:::i;:::-;;:::i;26073:106::-;;;;;;;;;;;;;:::i;19748:22::-;;;;;;;;;;-1:-1:-1;19748:22:0;;;;-1:-1:-1;;;;;19748:22:0;;;35562:130;;;;;;;;;;-1:-1:-1;35562:130:0;;;;;:::i;:::-;;:::i;23780:1224::-;;;;;;;;;;-1:-1:-1;23780:1224:0;;;;;:::i;:::-;;:::i;35700:277::-;;;;;;;;;;-1:-1:-1;35700:277:0;;;;;:::i;:::-;;:::i;:::-;;;;10048:14:1;;10041:22;10023:41;;10107:14;;10100:22;10095:2;10080:18;;10073:50;10166:14;10159:22;10139:18;;;10132:50;10011:2;9996:18;35700:277:0;9839:349:1;26187:1385:0;;;;;;:::i;:::-;;:::i;25952:113::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35084:291::-;;;;;;;;;;;;;:::i;:::-;;;;11024:25:1;;;11092:14;;11085:22;11080:2;11065:18;;11058:50;10997:18;35084:291:0;10856:258:1;3619:220:0;;;;;;;;;;-1:-1:-1;3619:220:0;;;;;:::i;:::-;;:::i;19719:22::-;;;;;;;;;;-1:-1:-1;19719:22:0;;;;-1:-1:-1;;;;;19719:22:0;;;19231:20;;;;;;;;;;-1:-1:-1;19231:20:0;;;;-1:-1:-1;;;;;19231:20:0;;;19173:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19537:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19537:23:0;;-1:-1:-1;19537:23:0;:::o;36474:250::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;22013:7:::1;::::0;-1:-1:-1;;;22013:7:0;::::1;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::1;22029:33;::::0;::::1;160:51:1::0;133:18;;22029:33:0::1;14:203:1::0;22009:53:0::1;36553:6:::2;:16:::0;;-1:-1:-1;;36553:16:0::2;::::0;::::2;;;::::0;;36595:7:::2;::::0;-1:-1:-1;;;;;36595:7:0::2;36580:41;36630:4;36650:10;36553:16:::0;36662:15:::2;;36676:1;36662:15;;;36672:1;36662:15;36580:105;::::0;-1:-1:-1;;;;;;36580:105:0::2;::::0;;;;;;-1:-1:-1;;;;;12104:15:1;;;36580:105:0::2;::::0;::::2;12086:34:1::0;12066:3;12136:18;;;12129:31;12197:1;12176:19;;;12169:30;-1:-1:-1;;;12215:19:1;;;12208:40;12320:15;;;;12300:18;;;12293:43;12384:4;12372:17;12352:18;;;12345:45;36679:5:0::2;12406:19:1::0;;;12399:51;12265:19;;36580:105:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;36701:15;36708:7;36701:15;;;;4454:14:1::0;4447:22;4429:41;;4417:2;4402:18;;4289:187;36701:15:0::2;;;;;;;;36474:250:::0;:::o;32728:665::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;32861:1:::3;32845:17:::0;;;32841:47:::3;;32871:17;;-1:-1:-1::0;;;32871:17:0::3;;;;;;;;;;;32841:47;32901:18;32939:9:::0;32934:288:::3;32954:16:::0;;::::3;32934:288;;;33013:1;32993:5:::0;;32999:1;32993:8;;::::3;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32993:22:0::3;;;:46;;;;;33019:10;:20;33030:5;;33036:1;33030:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33019:20:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;33019:20:0;;::::3;;32993:46;32989:190;;;33083:5;33060:10;:20;33071:5;;33077:1;33071:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33060:20:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;33060:20:0;:28;;-1:-1:-1;;33060:28:0::3;::::0;::::3;;::::0;;;::::3;::::0;;33123:5;;33129:1;33123:8;;::::3;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33112:20:0::3;;;;;;;;;;;33151:12:::0;::::3;::::0;::::3;:::i;:::-;;;;32989:190;33205:3;;32934:288;;;-1:-1:-1::0;33249:7:0::3;::::0;33234:108:::3;::::0;-1:-1:-1;;;33234:108:0;;33284:4:::3;33234:108;::::0;::::3;13061:34:1::0;13041:3;13111:18;;;13104:31;13172:2;13151:19;;;13144:31;-1:-1:-1;;;13191:19:1;;;13184:48;33312:10:0::3;13284:18:1::0;;;13277:43;13336:18;;;13329:34;;;33249:7:0::3;13379:19:1::0;;;13372:51;-1:-1:-1;;;;;33249:7:0;;::::3;::::0;33234:41:::3;::::0;13249:19:1;;33234:108:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;33358:27;33374:10;33358:27;;;;4627:25:1::0;;4615:2;4600:18;;4481:177;33358:27:0::3;;;;;;;;32830:563;32728:665:::0;;:::o;32293:427::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;-1:-1:-1::0;;;;;32399:18:0;::::3;32395:47;;32426:16;;-1:-1:-1::0;;;32426:16:0::3;;;;;;;;;;;32395:47;-1:-1:-1::0;;;;;32458:16:0;::::3;;::::0;;;:10:::3;:16;::::0;;;;;::::3;;32453:46;;32483:16;;-1:-1:-1::0;;;32483:16:0::3;;;;;;;;;;;32453:46;-1:-1:-1::0;;;;;32545:16:0;;::::3;32564:5;32545:16:::0;;;:10:::3;:16;::::0;;;;;:24;;-1:-1:-1;;32545:24:0::3;::::0;;32595:7:::3;::::0;32580:100;;-1:-1:-1;;;32580:100:0;;32630:4:::3;32580:100;::::0;::::3;13770:34:1::0;13750:3;13820:18;;;13813:31;13881:2;13860:19;;;13853:31;-1:-1:-1;;;13900:19:1;;;13893:49;32659:10:0::3;13994:18:1::0;;;13987:43;14046:18;;;14039:34;;;14089:19;;;14082:51;;;;32595:7:0;;::::3;::::0;32580:41:::3;::::0;13959:19:1;;32580:100:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;32696:16:0::3;::::0;-1:-1:-1;;;;;32696:16:0;::::3;::::0;-1:-1:-1;32696:16:0::3;::::0;-1:-1:-1;32696:16:0;;::::3;32293:427:::0;:::o;33998:741::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;22013:7:::1;::::0;-1:-1:-1;;;22013:7:0;::::1;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::1;22029:33;::::0;::::1;160:51:1::0;133:18;;22029:33:0::1;14:203:1::0;22009:53:0::1;34068:7:::2;:14:::0;;-1:-1:-1;;;;;;;34068:14:0;::::2;;::::0;;;34093:94:::2;::::0;-1:-1:-1;;;34093:94:0;;34143:4:::2;34093:94;::::0;::::2;14480:34:1::0;14460:3;14530:18;;;14523:31;14591:2;14570:19;;;14563:31;-1:-1:-1;;;14610:19:1;;;14603:43;34166:10:0::2;14698:18:1::0;;;14691:43;-1:-1:-1;14750:18:1;;;14743:34;;;14793:19;;;14786:51;-1:-1:-1;;;;;34108:7:0;;;;34093:41:::2;::::0;14663:19:1;;34093:94:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;34203:28:0::2;::::0;34225:4:::2;::::0;-1:-1:-1;34203:28:0::2;::::0;-1:-1:-1;34203:28:0;;::::2;34246:5;::::0;-1:-1:-1;;;;;34246:5:0::2;:19:::0;:48;::::2;;;;34293:1;34269:21;:25;34246:48;34242:466;;;34312:9;2759:6:::0;;34327:55:::2;::::0;-1:-1:-1;;;;;2759:6:0;;;;34356:21:::2;::::0;34312:9;34327:55;34312:9;34327:55;34356:21;2759:6;34327:55:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34311:71;;;34402:4;34397:34;;34415:16;;-1:-1:-1::0;;;34415:16:0::2;;;;;;;;;;;34397:34;34296:147;34242:466;;;34453:5;::::0;-1:-1:-1;;;;;34453:5:0::2;:19:::0;34449:259:::2;;34519:5;::::0;;34512:38:::2;::::0;-1:-1:-1;;;34512:38:0;;34544:4:::2;34512:38:::0;;::::2;160:51:1::0;;;;34489:20:0::2;::::0;-1:-1:-1;;;;;34519:5:0;;::::2;::::0;34512:23:::2;::::0;133:18:1;;34512:38:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34489:61:::0;-1:-1:-1;34569:16:0;;34565:132:::2;;34618:5;::::0;-1:-1:-1;;;;;34618:5:0::2;34611:22;34634:7;2732::::0;2759:6;-1:-1:-1;;;;;2759:6:0;;2686:87;34634:7:::2;34611:45;::::0;-1:-1:-1;;;;;;34611:45:0::2;::::0;;;;;;-1:-1:-1;;;;;15229:32:1;;;34611:45:0::2;::::0;::::2;15211:51:1::0;15278:18;;;15271:34;;;15184:18;;34611:45:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34606:75;;34665:16;;-1:-1:-1::0;;;34665:16:0::2;;;;;;;;;;;34606:75;34474:234;34449:259;34718:6;:13:::0;;-1:-1:-1;;34718:13:0::2;34727:4;34718:13;::::0;;33998:741::o;33401:589::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;33488:18:::3;33526:9:::0;33521:300:::3;33545:6;:13:::0;33541:17;::::3;33521:300;;;33577:12;33592:6;33599:1;33592:9;;;;;;;;:::i;:::-;;::::0;;;::::3;::::0;;;::::3;::::0;;::::3;::::0;;::::3;:19:::0;-1:-1:-1;;;;;33592:19:0::3;33630:16:::0;;;:10:::3;:16:::0;;;;;;;;33592:19;;-1:-1:-1;33630:16:0::3;;33626:152;;;-1:-1:-1::0;;;;;33667:16:0;::::3;33686:5;33667:16:::0;;;:10:::3;:16;::::0;;;;;:24;;-1:-1:-1;;33667:24:0::3;::::0;;33715:16;::::3;::::0;33686:5;33715:16:::3;33750:12:::0;::::3;::::0;::::3;:::i;:::-;;;;33626:152;-1:-1:-1::0;33804:3:0::3;;33521:300;;;-1:-1:-1::0;33848:7:0::3;::::0;;33833:106:::3;::::0;-1:-1:-1;;;33833:106:0;;33883:4:::3;33833:106;::::0;::::3;15894:34:1::0;15874:3;15944:18;;;15937:31;15984:19;;;15977:31;;;;-1:-1:-1;;;16024:19:1;;;16017:46;33909:10:0::3;16115:18:1::0;;;16108:43;16167:18;;;16160:34;;;33848:7:0::3;16210:19:1::0;;;16203:51;-1:-1:-1;;;;;33848:7:0::3;::::0;33833:41:::3;::::0;16080:19:1;;33833:106:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;33955:27;33971:10;33955:27;;;;4627:25:1::0;;4615:2;4600:18;;4481:177;29661:915:0;2572:13;:11;:13::i;:::-;9675:21:::1;:19;:21::i;:::-;21912:6:::2;::::0;::::2;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::2;;;;;;;;;;;21908:35;22013:7:::3;::::0;-1:-1:-1;;;22013:7:0;::::3;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::3;22029:33;::::0;::::3;160:51:1::0;133:18;;22029:33:0::3;14:203:1::0;22009:53:0::3;29772:6:::4;29782:1;29772:11:::0;29768:39:::4;;29792:15;;-1:-1:-1::0;;;29792:15:0::4;;;;;;;;;;;29768:39;29824:5;::::0;-1:-1:-1;;;;;29824:5:0::4;29820:749;;29888:6;29864:21;:30;29860:64;;;29903:21;;-1:-1:-1::0;;;29903:21:0::4;;;;;;;;;;;29860:64;29940:9;2759:6:::0;;29955:31:::4;::::0;-1:-1:-1;;;;;2759:6:0;;;;29975;;29940:9;29955:31;29940:9;29955:31;29975:6;2759;29955:31:::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29939:47;;;30006:4;30001:34;;30019:16;;-1:-1:-1::0;;;30019:16:0::4;;;;;;;;;;;30001:34;30065:7;::::0;30050:94:::4;::::0;-1:-1:-1;;;30050:94:0;;-1:-1:-1;;;;;30065:7:0;;::::4;::::0;30050:41:::4;::::0;:94:::4;::::0;30100:4:::4;::::0;30119:10:::4;::::0;30131:6;;30065:7;;30050:94:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;30174:7;2732::::0;2759:6;-1:-1:-1;;;;;2759:6:0;;2686:87;30174:7:::4;30164:32;::::0;;11024:25:1;;;30191:4:0::4;11080:2:1::0;11065:18;;11058:50;-1:-1:-1;;;;;30164:32:0;;;::::4;::::0;::::4;::::0;10997:18:1;30164:32:0::4;;;;;;;29845:363;29820:749;;;30240:5;::::0;;30233:38:::4;::::0;-1:-1:-1;;;30233:38:0;;30265:4:::4;30233:38:::0;;::::4;160:51:1::0;;;;30274:6:0;;-1:-1:-1;;;;;30240:5:0;;::::4;::::0;30233:23:::4;::::0;133:18:1;;30233:38:0::4;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;30229:81;;;30289:21;;-1:-1:-1::0;;;30289:21:0::4;;;;;;;;;;;30229:81;30337:5;::::0;-1:-1:-1;;;;;30337:5:0::4;30330:22;30353:7;2732::::0;2759:6;-1:-1:-1;;;;;2759:6:0;;2686:87;30353:7:::4;30330:39;::::0;-1:-1:-1;;;;;;30330:39:0::4;::::0;;;;;;-1:-1:-1;;;;;15229:32:1;;;30330:39:0::4;::::0;::::4;15211:51:1::0;15278:18;;;15271:34;;;15184:18;;30330:39:0::4;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30325:69;;30378:16;;-1:-1:-1::0;;;30378:16:0::4;;;;;;;;;;;30325:69;30424:7;::::0;30409:95:::4;::::0;-1:-1:-1;;;30409:95:0;;-1:-1:-1;;;;;30424:7:0;;::::4;::::0;30409:41:::4;::::0;:95:::4;::::0;30459:4:::4;::::0;30478:10:::4;::::0;30490:6;;30424:7:::4;::::0;30409:95:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;30534:7;2732::::0;2759:6;-1:-1:-1;;;;;2759:6:0;;2686:87;30534:7:::4;30524:33;::::0;;11024:25:1;;;30551:5:0::4;11080:2:1::0;11065:18;;11058:50;-1:-1:-1;;;;;30524:33:0;;;::::4;::::0;::::4;::::0;10997:18:1;30524:33:0::4;;;;;;;29820:749;9719:20:::1;9010:1:::0;10261:21;;10078:212;9719:20:::1;29661:915:::0;:::o;27580:2073::-;21599:7;;-1:-1:-1;;;;;21599:7:0;21585:10;:21;21581:47;;21615:13;;-1:-1:-1;;;21615:13:0;;;;;;;;;;;21581:47;9675:21:::1;:19;:21::i;:::-;21912:6:::2;::::0;::::2;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::2;;;;;;;;;;;21908:35;22013:7:::3;::::0;-1:-1:-1;;;22013:7:0;::::3;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::3;22029:33;::::0;::::3;160:51:1::0;133:18;;22029:33:0::3;14:203:1::0;22009:53:0::3;27716:1:::4;27700:17:::0;;;27696:47:::4;;27726:17;;-1:-1:-1::0;;;27726:17:0::4;;;;;;;;;;;27696:47;27776:9;;27758:15;:27;27754:63;;;27794:23;;-1:-1:-1::0;;;27794:23:0::4;;;;;;;;;;;27754:63;27850:7;;27832:15;:25;27828:56;;;27866:18;;-1:-1:-1::0;;;27866:18:0::4;;;;;;;;;;;27828:56;27899:11;;27914:1;27899:16:::0;27895:48:::4;;27924:19;;-1:-1:-1::0;;;27924:19:0::4;;;;;;;;;;;27895:48;27956:19;27995:9:::0;27990:142:::4;28010:16:::0;;::::4;27990:142;;;28060:28;28079:5;;28085:1;28079:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;28060:28::-;28045:43;::::0;;::::4;:::i;:::-;::::0;-1:-1:-1;28115:3:0::4;;27990:142;;;-1:-1:-1::0;28148:5:0::4;::::0;-1:-1:-1;;;;;28148:5:0::4;28144:240;;28212:11;28188:21;:35;28184:69;;;28232:21;;-1:-1:-1::0;;;28232:21:0::4;;;;;;;;;;;28184:69;28144:240;;;28297:5;::::0;;28290:38:::4;::::0;-1:-1:-1;;;28290:38:0;;28322:4:::4;28290:38:::0;;::::4;160:51:1::0;;;;28331:11:0;;-1:-1:-1;;;;;28297:5:0;;::::4;::::0;28290:23:::4;::::0;133:18:1;;28290:38:0::4;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;28286:86;;;28351:21;;-1:-1:-1::0;;;28351:21:0::4;;;;;;;;;;;28286:86;28401:9;28396:1250;28416:16:::0;;::::4;28396:1250;;;28451:12;28466:5;;28472:1;28466:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28451:23:::0;-1:-1:-1;;;;;;28493:18:0;::::4;28489:47;;28520:16;;-1:-1:-1::0;;;28520:16:0::4;;;;;;;;;;;28489:47;-1:-1:-1::0;;;;;28556:19:0;::::4;;::::0;;;:13:::4;:19;::::0;;;;;::::4;;28551:49;;28584:16;;-1:-1:-1::0;;;28584:16:0::4;;;;;;;;;;;28551:49;-1:-1:-1::0;;;;;28619:16:0;::::4;;::::0;;;:10:::4;:16;::::0;;;;;::::4;;28615:45;;;28644:16;;-1:-1:-1::0;;;28644:16:0::4;;;;;;;;;;;28615:45;28677:23;28703:24;28722:4;28703:18;:24::i;:::-;-1:-1:-1::0;;;;;28756:16:0;;::::4;;::::0;;;:10:::4;:16;::::0;;;;;;;:23;;28775:4:::4;-1:-1:-1::0;;28756:23:0;;::::4;::::0;::::4;::::0;;;28806:149;;::::4;::::0;::::4;::::0;;;;;;;::::4;::::0;;;28924:15:::4;28806:149:::0;;;;;;28794:6:::4;:162:::0;;;;::::4;::::0;;;;;;;;::::4;::::0;;::::4;::::0;;::::4;::::0;;-1:-1:-1;;;;;;28794:162:0::4;::::0;;::::4;::::0;;;::::4;::::0;;;;;;;;;;;;;;;28977:5:::4;::::0;28806:149;;-1:-1:-1;28977:5:0::4;28973:630;;29018:9;29033:4;-1:-1:-1::0;;;;;29033:9:0::4;29050:15;29033:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29017:53;;;29094:4;29089:34;;29107:16;;-1:-1:-1::0;;;29107:16:0::4;;;;;;;;;;;29089:34;29157:7;::::0;29142:94:::4;::::0;-1:-1:-1;;;29142:94:0;;-1:-1:-1;;;;;29157:7:0;;::::4;::::0;29142:41:::4;::::0;:94:::4;::::0;29192:4:::4;::::0;29208;;29214:15;;29157:7;;29142:94:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;29260:36:0::4;::::0;;11024:25:1;;;29291:4:0::4;11080:2:1::0;11065:18;;11058:50;-1:-1:-1;;;;;29260:36:0;::::4;::::0;-1:-1:-1;29260:36:0::4;::::0;-1:-1:-1;10997:18:1;29260:36:0::4;;;;;;;28998:314;28973:630;;;29349:5;::::0;;29342:45:::4;::::0;-1:-1:-1;;;29342:45:0;;-1:-1:-1;;;;;15229:32:1;;;29342:45:0;;::::4;15211:51:1::0;;;;15278:18;;;15271:34;;;29349:5:0;::::4;::::0;29342:22:::4;::::0;15184:18:1;;29342:45:0::4;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29337:75;;29396:16;;-1:-1:-1::0;;;29396:16:0::4;;;;;;;;;;;29337:75;29446:7;::::0;29431:95:::4;::::0;-1:-1:-1;;;29431:95:0;;-1:-1:-1;;;;;29446:7:0;;::::4;::::0;29431:41:::4;::::0;:95:::4;::::0;29481:4:::4;::::0;29497;;29503:15;;29446:7:::4;::::0;29431:95:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;-1:-1:-1::0;;29550:37:0::4;::::0;;11024:25:1;;;29581:5:0::4;11080:2:1::0;11065:18;;11058:50;-1:-1:-1;;;;;29550:37:0;::::4;::::0;-1:-1:-1;29550:37:0::4;::::0;-1:-1:-1;10997:18:1;29550:37:0::4;;;;;;;28973:630;-1:-1:-1::0;;29629:3:0::4;;28396:1250;;;;27685:1968;9719:20:::1;9010:1:::0;10261:21;;10078:212;9719:20:::1;27580:2073:::0;;:::o;25224:135::-;22013:7;;25306:4;;-1:-1:-1;;;22013:7:0;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;-1:-1:-1;;;;;;25330:21:0::1;;::::0;;;:15:::1;:21;::::0;;;;;::::1;;::::0;25224:135::o;25367:142::-;22013:7;;25450;;-1:-1:-1;;;22013:7:0;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;-1:-1:-1;;;;;;25477:24:0::1;;::::0;;;:18:::1;:24;::::0;;;;;;25367:142::o;31339:367::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;-1:-1:-1::0;;;;;31452:18:0;::::3;31448:47;;31479:16;;-1:-1:-1::0;;;31479:16:0::3;;;;;;;;;;;31448:47;-1:-1:-1::0;;;;;31506:19:0;;::::3;;::::0;;;:13:::3;:19;::::0;;;;:28;;-1:-1:-1;;31506:28:0::3;::::0;::::3;;;::::0;;31560:7:::3;::::0;::::3;31545:41;31595:4;31618:10;31506:28:::0;31630:14:::3;;31643:1;31630:14;;;31639:1;31630:14;31545:107;::::0;-1:-1:-1;;;;;;31545:107:0::3;::::0;;;;;;-1:-1:-1;;;;;18118:15:1;;;31545:107:0::3;::::0;::::3;18100:34:1::0;18080:3;18150:18;;;18143:31;18211:2;18190:19;;;18183:31;-1:-1:-1;;;18230:19:1;;;18223:43;18338:15;;;;18318:18;;;18311:43;18402:4;18390:17;18370:18;;;18363:45;31646:5:0::3;18424:19:1::0;;;18417:51;18283:19;;31545:107:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;31685:4;-1:-1:-1::0;;;;;31668:30:0::3;;31691:6;31668:30;;;;4454:14:1::0;4447:22;4429:41;;4417:2;4402:18;;4289:187;31668:30:0::3;;;;;;;;31339:367:::0;;:::o;30584:117::-;22013:7;;30647:20;;-1:-1:-1;;;22013:7:0;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;30687:6:::1;30680:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;30680:13:0::1;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;::::1;;;;;;;;;;30584:117:::0;:::o;25012:204::-;-1:-1:-1;;;;;25099:21:0;;25075:7;25099:21;;;:15;:21;;;;;;;;25095:85;;;-1:-1:-1;;;;;;25144:24:0;;;;;:18;:24;;;;;;;25012:204::o;25095:85::-;-1:-1:-1;;25197:11:0;;;25012:204::o;25517:427::-;2572:13;:11;:13::i;:::-;22013:7:::1;::::0;-1:-1:-1;;;22013:7:0;::::1;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::1;22029:33;::::0;::::1;160:51:1::0;133:18;;22029:33:0::1;14:203:1::0;22009:53:0::1;-1:-1:-1::0;;;;;25601:20:0;::::2;25597:49;;25630:16;;-1:-1:-1::0;;;25630:16:0::2;;;;;;;;;;;25597:49;-1:-1:-1::0;;;;;25661:15:0;::::2;;::::0;;;:7:::2;:15;::::0;;;;;::::2;;25657:44;;;25685:16;;-1:-1:-1::0;;;25685:16:0::2;;;;;;;;;;;25657:44;-1:-1:-1::0;;;;;25749:15:0;;::::2;;::::0;;;:7:::2;:15;::::0;;;;;:22;;-1:-1:-1;;25749:22:0::2;25767:4;25749:22:::0;;::::2;::::0;;;25782:6:::2;:19:::0;;;;::::2;::::0;;;;;::::2;::::0;;-1:-1:-1;;;;;;25782:19:0::2;::::0;;::::2;::::0;;;25827:7:::2;::::0;25812:90;;-1:-1:-1;;;25812:90:0;;25862:4:::2;25812:90;::::0;::::2;18815:34:1::0;18795:3;18865:18;;;18858:31;18926:1;18905:19;;;18898:30;-1:-1:-1;;;18944:19:1;;;18937:39;25881:10:0::2;19028:18:1::0;;;19021:43;19080:18;;;19073:34;;;19123:19;;;19116:51;;;;25827:7:0;::::2;::::0;25812:41:::2;::::0;18993:19:1;;25812:90:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;25918:18:0::2;::::0;-1:-1:-1;;;;;25918:18:0;::::2;::::0;-1:-1:-1;25918:18:0::2;::::0;-1:-1:-1;25918:18:0;;::::2;25517:427:::0;:::o;3361:103::-;2572:13;:11;:13::i;:::-;3426:30:::1;3453:1;3426:18;:30::i;:::-;3361:103::o:0;36732:151::-;21599:7;;-1:-1:-1;;;;;21599:7:0;21585:10;:21;21581:47;;21615:13;;-1:-1:-1;;;21615:13:0;;;;;;;;;;;21581:47;9675:21:::1;:19;:21::i;:::-;21912:6:::2;::::0;::::2;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::2;;;;;;;;;;;21908:35;22013:7:::3;::::0;-1:-1:-1;;;22013:7:0;::::3;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::3;22029:33;::::0;::::3;160:51:1::0;133:18;;22029:33:0::3;14:203:1::0;22009:53:0::3;36858:17:::4;::::0;-1:-1:-1;;;36858:17:0;;:4:::4;::::0;:10:::4;::::0;:17:::4;::::0;36869:5;;;;36858:17:::4;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;9719:20:::1;9010:1:::0;10261:21;;10078:212;35383:171;22013:7;;35445:4;;-1:-1:-1;;;22013:7:0;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;35488:9:::1;;35469:15;:28;;:58;;;;;35520:7;;35501:15;:26;;35469:58;:77;;;;;35545:1;35531:11;;:15;35469:77;35462:84;;35383:171:::0;:::o;34747:329::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;34861:8:::3;34855:22;34881:1;34855:27:::0;34851:51:::3;;34891:11;;-1:-1:-1::0;;;34891:11:0::3;;;;;;;;;;;34851:51;34913:4;:15;34920:8:::0;34913:4;:15:::3;:::i;:::-;-1:-1:-1::0;34954:7:0::3;::::0;34939:92:::3;::::0;-1:-1:-1;;;34939:92:0;;34989:4:::3;34939:92;::::0;::::3;22394:34:1::0;22374:3;22444:18;;;22437:31;22505:2;22484:19;;;22477:31;-1:-1:-1;;;22524:19:1;;;22517:41;35010:10:0::3;22610:18:1::0;;;22603:43;34954:7:0::3;22662:18:1::0;;;22655:34;;;22705:19;;;22698:51;-1:-1:-1;;;;;34954:7:0;;::::3;::::0;34939:41:::3;::::0;22575:19:1;;34939:92:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;35047:21;35059:8;35047:21;;;;;;:::i;35985:481::-:0;36080:12;36103:16;36130:13;36154:26;36191:14;22013:7;;;;;;;;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;-1:-1:-1;;;;;36234:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;;;;36275:13:::1;:19:::0;;;;;;;36234:16:::1;::::0;;::::1;::::0;-1:-1:-1;36275:19:0::1;::::0;-1:-1:-1;36275:19:0;36316:23;::::1;;;;36332:7;36331:8;36316:23;:42;;;;;36343:15;:13;:15::i;:::-;36305:53;;36390:24;36409:4;36390:18;:24::i;:::-;-1:-1:-1::0;;;;;36437:21:0;;::::1;;::::0;;;:15:::1;:21;::::0;;;;;35985:481;;;;;;36369:45;;36437:21:::1;::::0;;::::1;::::0;35985:481;-1:-1:-1;;35985:481:0:o;31714:571::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;31860:1:::3;31844:17:::0;;;31840:47:::3;;31870:17;;-1:-1:-1::0;;;31870:17:0::3;;;;;;;;;;;31840:47;31905:9;31900:378;31920:16:::0;;::::3;31900:378;;;31979:1;31959:5:::0;;31965:1;31959:8;;::::3;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31959:22:0::3;::::0;31955:51:::3;;31990:16;;-1:-1:-1::0;;;31990:16:0::3;;;;;;;;;;;31955:51;32047:6;32021:13;:23;32035:5;;32041:1;32035:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32021:23:0;;::::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;32021:23:0;:32;;-1:-1:-1;;32021:32:0::3;::::0;::::3;;::::0;;;::::3;::::0;;;32083:7:::3;::::0;::::3;32068:41;32118:4;32146:10;32158:6:::0;:14:::3;;32171:1;32158:14;;;32167:1;32158:14;32068:112;::::0;-1:-1:-1;;;;;;32068:112:0::3;::::0;;;;;;-1:-1:-1;;;;;23104:15:1;;;32068:112:0::3;::::0;::::3;23086:34:1::0;23066:3;23136:18;;;23129:31;23197:2;23176:19;;;23169:31;-1:-1:-1;;;23216:19:1;;;23209:48;23329:15;;;;23309:18;;;23302:43;23393:4;23381:17;23361:18;;;23354:45;32174:5:0::3;23415:19:1::0;;;23408:51;23274:19;;32068:112:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;32217:5;;32223:1;32217:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32200:34:0::3;;32227:6;32200:34;;;;4454:14:1::0;4447:22;4429:41;;4417:2;4402:18;;4289:187;32200:34:0::3;;;;;;;;32261:3;;31900:378;;;;31714:571:::0;;;:::o;20013:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20013:27:0;;;;-1:-1:-1;20013:27:0;:::o;23011:761::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;-1:-1:-1::0;;;;;23135:18:0;::::3;23131:47;;23162:16;;-1:-1:-1::0;;;23162:16:0::3;;;;;;;;;;;23131:47;23195:6;23205:1;23195:11:::0;23191:574:::3;;-1:-1:-1::0;;;;;23230:24:0;;::::3;;::::0;;;:18:::3;:24;::::0;;;;;;;23223:31;;;23269:15:::3;:21:::0;;;;;;:29;;-1:-1:-1;;23269:29:0::3;::::0;;23328:7:::3;::::0;23313:105;;-1:-1:-1;;;23313:105:0;;23363:4:::3;23313:105;::::0;::::3;23806:34:1::0;23786:3;23856:18;;;23849:31;23917:2;23896:19;;;23889:31;23957:25;23936:19;;;23929:54;23397:10:0::3;24035:18:1::0;;;24028:43;24087:18;;;24080:34;;;24130:19;;;24123:51;;;;23328:7:0;;::::3;::::0;23313:41:::3;::::0;24000:19:1;;23313:105:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;23438:30:0::3;::::0;-1:-1:-1;;;;;23438:30:0;::::3;::::0;-1:-1:-1;23438:30:0::3;::::0;-1:-1:-1;23438:30:0;;::::3;27580:2073:::0;;:::o;23191:574::-:3;-1:-1:-1::0;;;;;23501:24:0;;::::3;;::::0;;;:18:::3;:24;::::0;;;;;;;:33;;;23549:15:::3;:21:::0;;;;;;:28;;-1:-1:-1;;23549:28:0::3;23573:4;23549:28;::::0;;23607:7:::3;::::0;23592:107;;-1:-1:-1;;;23592:107:0;;23642:4:::3;23592:107;::::0;::::3;24513:34:1::0;24493:3;24563:18;;;24556:31;24624:2;24603:19;;;24596:31;-1:-1:-1;;;24643:19:1;;;24636:51;23673:10:0::3;24739:18:1::0;;;24732:43;24791:18;;;24784:34;;;24834:19;;;24827:51;;;;23607:7:0;;::::3;::::0;23592:41:::3;::::0;24704:19:1;;23592:107:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;23740:4;-1:-1:-1::0;;;;;23719:34:0::3;;23746:6;23719:34;;;;4627:25:1::0;;4615:2;4600:18;;4481:177;30709:622:0;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;30861:12:::3;30877:1;30861:17:::0;30857:45:::3;;30887:15;;-1:-1:-1::0;;;30887:15:0::3;;;;;;;;;;;30857:45;30930:15;30917:10;:28;30913:54;;;30954:13;;-1:-1:-1::0;;;30954:13:0::3;;;;;;;;;;;30913:54;30994:10;30982:8;:22;30978:48;;31013:13;;-1:-1:-1::0;;;31013:13:0::3;;;;;;;;;;;30978:48;31039:11;:26:::0;;;31076:9:::3;:22:::0;;;31109:7:::3;:18:::0;;;31153:7:::3;::::0;31138:111:::3;::::0;-1:-1:-1;;;31138:111:0;;31188:4:::3;31138:111;::::0;::::3;25217:34:1::0;25197:3;25267:18;;;25260:31;25328:2;25307:19;;;25300:31;-1:-1:-1;;;25347:19:1;;;25340:49;31217:10:0::3;25441:18:1::0;;;25434:43;25493:18;;;25486:34;;;-1:-1:-1;25536:19:1;;;25529:51;-1:-1:-1;;;;;31153:7:0;;::::3;::::0;31138:41:::3;::::0;25406:19:1;;31138:111:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;31265:58:0::3;::::0;;25793:25:1;;;25849:2;25834:18;;25827:34;;;25877:18;;;25870:34;;;31265:58:0::3;::::0;-1:-1:-1;25781:2:1;25766:18;;-1:-1:-1;31265:58:0::3;25591:319:1::0;26073:106:0;22013:7;;26137:4;;-1:-1:-1;;;22013:7:0;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;-1:-1:-1;26161:10:0::1;::::0;::::1;;26073:106:::0;:::o;35562:130::-;22013:7;;35643:4;;-1:-1:-1;;;22013:7:0;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;-1:-1:-1;;;;;;35667:17:0::1;;::::0;;;:7:::1;:17;::::0;;;;;::::1;;::::0;35562:130::o;23780:1224::-;21701:10;21693:19;;;;:7;:19;;;;;;;;21692:20;:45;;;;-1:-1:-1;21730:7:0;;-1:-1:-1;;;;;21730:7:0;21716:10;:21;;21692:45;:70;;;;-1:-1:-1;2732:7:0;2759:6;-1:-1:-1;;;;;2759:6:0;21741:10;:21;;21692:70;:119;;;;;21795:7;;;;;;;;;-1:-1:-1;;;;;21795:7:0;-1:-1:-1;;;;;21780:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21766:45:0;:10;-1:-1:-1;;;;;21766:45:0;;;21692:119;21688:156;;;21833:11;;-1:-1:-1;;;21833:11:0;;;;;;;;;;;21688:156;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;23950:1:::3;23934:17:::0;;;23930:47:::3;;23960:17;;-1:-1:-1::0;;;23960:17:0::3;;;;;;;;;;;23930:47;23992:30:::0;;::::3;23988:64;;24031:21;;-1:-1:-1::0;;;24031:21:0::3;;;;;;;;;;;23988:64;24065:16;24101:9:::0;24096:721:::3;24116:16:::0;;::::3;24096:721;;;24175:1;24155:5:::0;;24161:1;24155:8;;::::3;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24155:22:0::3;::::0;24151:51:::3;;24186:16;;-1:-1:-1::0;;;24186:16:0::3;;;;;;;;;;;24151:51;24235:7;;24243:1;24235:10;;;;;;;:::i;:::-;;;;;;;24249:1;24235:15:::0;24231:543:::3;;24275:15;:25;24291:5;;24297:1;24291:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24275:25:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;24275:25:0;;::::3;;24271:260;;;24332:18;:28;24351:5;;24357:1;24351:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24332:28:0::3;-1:-1:-1::0;;;;;24332:28:0::3;;;;;;;;;;;;24325:35;;;24411:5;24383:15;:25;24399:5;;24405:1;24399:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24383:25:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;24383:25:0;:33;;-1:-1:-1;;24383:33:0::3;::::0;::::3;;::::0;;;::::3;::::0;;24469:5;;24475:1;24469:8;;::::3;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24444:34:0::3;;;;;;;;;;;24501:10:::0;::::3;::::0;::::3;:::i;:::-;;;;24271:260;24231:543;;;24602:7;;24610:1;24602:10;;;;;;;:::i;:::-;;;;;;;24571:18;:28;24590:5;;24596:1;24590:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24571:28:0::3;-1:-1:-1::0;;;;;24571:28:0::3;;;;;;;;;;;;:41;;;;24659:4;24631:15;:25;24647:5;;24653:1;24647:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24631:25:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;24631:25:0;:32;;-1:-1:-1;;24631:32:0::3;::::0;::::3;;::::0;;;::::3;::::0;;24708:5;;24714:1;24708:8;;::::3;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24687:42:0::3;;24718:7;;24726:1;24718:10;;;;;;;:::i;:::-;;;;;;;24687:42;;;;4627:25:1::0;;4615:2;4600:18;;4481:177;24687:42:0::3;;;;;;;;24748:10:::0;::::3;::::0;::::3;:::i;:::-;;;;24231:543;24800:3;;24096:721;;;-1:-1:-1::0;24844:7:0::3;::::0;24829:115:::3;::::0;-1:-1:-1;;;24829:115:0;;24879:4:::3;24829:115;::::0;::::3;26243:34:1::0;26223:3;26293:18;;;26286:31;26354:2;26333:19;;;26326:31;26394:28;26373:19;;;26366:57;24916:10:0::3;26475:18:1::0;;;26468:43;26527:18;;;26520:34;;;24844:7:0::3;26570:19:1::0;;;26563:51;-1:-1:-1;;;;;24844:7:0;;::::3;::::0;24829:41:::3;::::0;26440:19:1;;24829:115:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;24960:36;24987:8;24960:36;;;;4627:25:1::0;;4615:2;4600:18;;4481:177;24960:36:0::3;;;;;;;;23919:1085;23780:1224:::0;;;;:::o;35700:277::-;35777:12;35791:16;35809:13;22013:7;;;;;;;;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;-1:-1:-1;;;;;35845:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;;;;35886:13:::1;:19:::0;;;;;;;35845:16:::1;::::0;;::::1;::::0;-1:-1:-1;35886:19:0::1;::::0;-1:-1:-1;35886:19:0;35927:23;::::1;;;;35943:7;35942:8;35927:23;:42;;;;;35954:15;:13;:15::i;:::-;35700:277:::0;;;;-1:-1:-1;;35700:277:0:o;26187:1385::-;9675:21;:19;:21::i;:::-;21912:6:::1;::::0;::::1;;21908:35;;;21927:16;;-1:-1:-1::0;;;21927:16:0::1;;;;;;;;;;;21908:35;22013:7:::2;::::0;-1:-1:-1;;;22013:7:0;::::2;;;22009:53;;;22029:33;::::0;-1:-1:-1;;;22029:33:0;;22056:4:::2;22029:33;::::0;::::2;160:51:1::0;133:18;;22029:33:0::2;14:203:1::0;22009:53:0::2;26333:5:::3;::::0;26294:18:::3;::::0;-1:-1:-1;;;;;26333:5:0::3;26329:1236;;26373:9;26386:1;26373:14:::0;26369:42:::3;;26396:15;;-1:-1:-1::0;;;26396:15:0::3;;;;;;;;;;;26369:42;26475:3;26440:31;19823:1;26440:9;:31;:::i;:::-;26439:39;;;;:::i;:::-;26426:52;;26512:1;26499:10;:14;:39;;;;-1:-1:-1::0;26517:7:0::3;::::0;-1:-1:-1;;;;;26517:7:0::3;:21:::0;::::3;26499:39;26495:184;;;26575:7;::::0;:35:::3;::::0;26560:9:::3;::::0;-1:-1:-1;;;;;26575:7:0::3;::::0;26595:10;;26560:9;26575:35;26560:9;26575:35;26595:10;26575:7;:35:::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26559:51;;;26634:4;26629:34;;26647:16;;-1:-1:-1::0;;;26647:16:0::3;;;;;;;;;;;26629:34;26540:139;26495:184;26708:7;::::0;26693:93:::3;::::0;-1:-1:-1;;;26693:93:0;;-1:-1:-1;;;;;26708:7:0;;::::3;::::0;26693:41:::3;::::0;:93:::3;::::0;26743:4:::3;::::0;26758:10:::3;::::0;26770:9:::3;::::0;26708:7;;26693:93:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;26806:47:0::3;::::0;;26825:9:::3;1842:25:1::0;;1898:2;1883:18;;1876:34;;;26848:4:0::3;1926:18:1::0;;;1919:50;26806:47:0;;26813:10:::3;::::0;-1:-1:-1;26806:47:0::3;::::0;-1:-1:-1;26806:47:0;;;;1830:2:1;26806:47:0;;::::3;26329:1236;;;26890:12;26906:1;26890:17:::0;26886:45:::3;;26916:15;;-1:-1:-1::0;;;26916:15:0::3;;;;;;;;;;;26886:45;26950:9;:14:::0;26946:42:::3;;26973:15;;-1:-1:-1::0;;;26973:15:0::3;;;;;;;;;;;26946:42;27055:3;27017:34;19823:1;27017:12:::0;:34:::3;:::i;:::-;27016:42;;;;:::i;:::-;27003:55;;27092:1;27079:10;:14;:39;;;;-1:-1:-1::0;27097:7:0::3;::::0;-1:-1:-1;;;;;27097:7:0::3;:21:::0;::::3;27079:39;27075:169;;;27151:5;::::0;;27183:7:::3;::::0;27144:59:::3;::::0;-1:-1:-1;;;27144:59:0;;27171:10:::3;27144:59:::0;;::::3;26865:34:1::0;;;;-1:-1:-1;;;;;27183:7:0;;::::3;26915:18:1::0;;;26908:43;26967:18;;;26960:34;;;27151:5:0::3;::::0;27144:26:::3;::::0;26800:18:1;;27144:59:0::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27139:89;;27212:16;;-1:-1:-1::0;;;27212:16:0::3;;;;;;;;;;;27139:89;27272:5;::::0;-1:-1:-1;;;;;27272:5:0::3;27265:26;27292:10;27312:4;27319:25;27334:10:::0;27319:12;:25:::3;:::i;:::-;27265:80;::::0;-1:-1:-1;;;;;;27265:80:0::3;::::0;;;;;;-1:-1:-1;;;;;26883:15:1;;;27265:80:0::3;::::0;::::3;26865:34:1::0;26935:15;;;;26915:18;;;26908:43;26967:18;;;26960:34;26800:18;;27265:80:0::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27260:110;;27354:16;;-1:-1:-1::0;;;27354:16:0::3;;;;;;;;;;;27260:110;27400:7;::::0;27385:97:::3;::::0;-1:-1:-1;;;27385:97:0;;-1:-1:-1;;;;;27400:7:0;;::::3;::::0;27385:41:::3;::::0;:97:::3;::::0;27435:4:::3;::::0;27450:10:::3;::::0;27462:12;;27400:7:::3;::::0;27385:97:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;27502:51:0::3;::::0;;1842:25:1;;;1898:2;1883:18;;1876:34;;;-1:-1:-1;1926:18:1;;;1919:50;27502:51:0;;27509:10:::3;::::0;-1:-1:-1;27502:51:0::3;::::0;-1:-1:-1;27502:51:0;;;;1830:2:1;27502:51:0;;::::3;26329:1236;26283:1289;9719:20:::0;9010:1;10261:21;;10078:212;25952:113;22013:7;;26015:16;;-1:-1:-1;;;22013:7:0;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;26051:6:::1;26044:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;26044:13:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;25952:113:::0;:::o;35084:291::-;22013:7;;35151:15;;;;-1:-1:-1;;;22013:7:0;;;;22009:53;;;22029:33;;-1:-1:-1;;;22029:33:0;;22056:4;22029:33;;;160:51:1;133:18;;22029:33:0;14:203:1;22009:53:0;35197:5:::1;::::0;-1:-1:-1;;;;;35197:5:0::1;35193:175;;-1:-1:-1::0;35241:21:0::1;::::0;35264:4:::1;::::0;-1:-1:-1;35084:291:0:o;35193:175::-:1;35317:5;::::0;;35310:38:::1;::::0;-1:-1:-1;;;35310:38:0;;35342:4:::1;35310:38:::0;;::::1;160:51:1::0;;;;-1:-1:-1;;;;;35317:5:0::1;::::0;35310:23:::1;::::0;133:18:1;;35310:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35302:54:::0;35350:5:::1;::::0;-1:-1:-1;35084:291:0;-1:-1:-1;35084:291:0:o;3619:220::-;2572:13;:11;:13::i;:::-;-1:-1:-1;;;;;3704:22:0;::::1;3700:93;;3750:31;::::0;-1:-1:-1;;;3750:31:0;;3778:1:::1;3750:31;::::0;::::1;160:51:1::0;133:18;;3750:31:0::1;14:203:1::0;3700:93:0::1;3803:28;3822:8;3803:18;:28::i;2851:166::-:0;2732:7;2759:6;-1:-1:-1;;;;;2759:6:0;775:10;2911:23;2907:103;;2958:40;;-1:-1:-1;;;2958:40:0;;775:10;2958:40;;;160:51:1;133:18;;2958:40:0;14:203:1;9755:315:0;9053:1;9884:7;;:18;9880:88;;9926:30;;-1:-1:-1;;;9926:30:0;;;;;;;;;;;9880:88;9053:1;10045:7;:17;9755:315::o;3999:191::-;4073:16;4092:6;;-1:-1:-1;;;;;4109:17:0;;;-1:-1:-1;;;;;;4109:17:0;;;;;;4142:40;;4092:6;;;;;;;4142:40;;4073:16;4142:40;4062:128;3999:191;:::o;222:127:1:-;283:10;278:3;274:20;271:1;264:31;314:4;311:1;304:15;338:4;335:1;328:15;354:168;427:9;;;458;;475:15;;;469:22;;455:37;445:71;;496:18;;:::i;:::-;354:168;;;;:::o;527:217::-;567:1;593;583:132;;637:10;632:3;628:20;625:1;618:31;672:4;669:1;662:15;700:4;697:1;690:15;583:132;-1:-1:-1;729:9:1;;527:217::o;959:682::-;-1:-1:-1;;;;;1305:15:1;;;1287:34;;1267:3;1352:2;1337:18;;1330:31;;;1398:1;1377:19;;;1370:30;-1:-1:-1;;;1431:3:1;1416:19;;1409:35;1516:15;;;;1511:2;1496:18;;1489:43;-1:-1:-1;1548:18:1;;1541:34;1619:14;;1612:22;-1:-1:-1;1591:19:1;;1584:51;1476:3;1461:19;;959:682::o;1980:548::-;2092:4;2121:2;2150;2139:9;2132:21;2182:6;2176:13;2225:6;2220:2;2209:9;2205:18;2198:34;2250:1;2260:140;2274:6;2271:1;2268:13;2260:140;;;2369:14;;;2365:23;;2359:30;2335:17;;;2354:2;2331:26;2324:66;2289:10;;2260:140;;;2264:3;2449:1;2444:2;2435:6;2424:9;2420:22;2416:31;2409:42;2519:2;2512;2508:7;2503:2;2495:6;2491:15;2487:29;2476:9;2472:45;2468:54;2460:62;;;;1980:548;;;;:::o;2533:180::-;2592:6;2645:2;2633:9;2624:7;2620:23;2616:32;2613:52;;;2661:1;2658;2651:12;2613:52;-1:-1:-1;2684:23:1;;2533:180;-1:-1:-1;2533:180:1:o;2718:118::-;2804:5;2797:13;2790:21;2783:5;2780:32;2770:60;;2826:1;2823;2816:12;2841:241;2897:6;2950:2;2938:9;2929:7;2925:23;2921:32;2918:52;;;2966:1;2963;2956:12;2918:52;3005:9;2992:23;3024:28;3046:5;3024:28;:::i;:::-;3071:5;2841:241;-1:-1:-1;;;2841:241:1:o;3087:367::-;3150:8;3160:6;3214:3;3207:4;3199:6;3195:17;3191:27;3181:55;;3232:1;3229;3222:12;3181:55;-1:-1:-1;3255:20:1;;3298:18;3287:30;;3284:50;;;3330:1;3327;3320:12;3284:50;3367:4;3359:6;3355:17;3343:29;;3427:3;3420:4;3410:6;3407:1;3403:14;3395:6;3391:27;3387:38;3384:47;3381:67;;;3444:1;3441;3434:12;3381:67;3087:367;;;;;:::o;3459:437::-;3545:6;3553;3606:2;3594:9;3585:7;3581:23;3577:32;3574:52;;;3622:1;3619;3612:12;3574:52;3662:9;3649:23;3695:18;3687:6;3684:30;3681:50;;;3727:1;3724;3717:12;3681:50;3766:70;3828:7;3819:6;3808:9;3804:22;3766:70;:::i;:::-;3855:8;;3740:96;;-1:-1:-1;3459:437:1;-1:-1:-1;;;;3459:437:1:o;3901:131::-;-1:-1:-1;;;;;3976:31:1;;3966:42;;3956:70;;4022:1;4019;4012:12;4037:247;4096:6;4149:2;4137:9;4128:7;4124:23;4120:32;4117:52;;;4165:1;4162;4155:12;4117:52;4204:9;4191:23;4223:31;4248:5;4223:31;:::i;4663:382::-;4728:6;4736;4789:2;4777:9;4768:7;4764:23;4760:32;4757:52;;;4805:1;4802;4795:12;4757:52;4844:9;4831:23;4863:31;4888:5;4863:31;:::i;:::-;4913:5;-1:-1:-1;4970:2:1;4955:18;;4942:32;4983:30;4942:32;4983:30;:::i;:::-;5032:7;5022:17;;;4663:382;;;;;:::o;5050:877::-;5279:2;5331:21;;;5401:13;;5304:18;;;5423:22;;;5250:4;;5279:2;5464;;5482:18;;;;5523:15;;;5250:4;5566:335;5580:6;5577:1;5574:13;5566:335;;;5639:13;;5681:9;;-1:-1:-1;;;;;5677:35:1;5665:48;;5753:11;;;5747:18;5733:12;;;5726:40;5806:11;;5800:18;5786:12;;;5779:40;5848:4;5839:14;;;;5876:15;;;;5709:1;5595:9;5566:335;;;-1:-1:-1;5918:3:1;;5050:877;-1:-1:-1;;;;;;;5050:877:1:o;5932:127::-;5993:10;5988:3;5984:20;5981:1;5974:31;6024:4;6021:1;6014:15;6048:4;6045:1;6038:15;6064:922;6133:6;6186:2;6174:9;6165:7;6161:23;6157:32;6154:52;;;6202:1;6199;6192:12;6154:52;6242:9;6229:23;6271:18;6312:2;6304:6;6301:14;6298:34;;;6328:1;6325;6318:12;6298:34;6366:6;6355:9;6351:22;6341:32;;6411:7;6404:4;6400:2;6396:13;6392:27;6382:55;;6433:1;6430;6423:12;6382:55;6469:2;6456:16;6491:2;6487;6484:10;6481:36;;;6497:18;;:::i;:::-;6572:2;6566:9;6540:2;6626:13;;-1:-1:-1;;6622:22:1;;;6646:2;6618:31;6614:40;6602:53;;;6670:18;;;6690:22;;;6667:46;6664:72;;;6716:18;;:::i;:::-;6756:10;6752:2;6745:22;6791:2;6783:6;6776:18;6831:7;6826:2;6821;6817;6813:11;6809:20;6806:33;6803:53;;;6852:1;6849;6842:12;6803:53;6908:2;6903;6899;6895:11;6890:2;6882:6;6878:15;6865:46;6953:1;6931:15;;;6948:2;6927:24;6920:35;;;;-1:-1:-1;6935:6:1;6064:922;-1:-1:-1;;;;;6064:922:1:o;7499:566::-;7591:6;7599;7607;7660:2;7648:9;7639:7;7635:23;7631:32;7628:52;;;7676:1;7673;7666:12;7628:52;7716:9;7703:23;7749:18;7741:6;7738:30;7735:50;;;7781:1;7778;7771:12;7735:50;7820:70;7882:7;7873:6;7862:9;7858:22;7820:70;:::i;:::-;7909:8;;-1:-1:-1;7794:96:1;-1:-1:-1;;7994:2:1;7979:18;;7966:32;8007:28;7966:32;8007:28;:::i;:::-;8054:5;8044:15;;;7499:566;;;;;:::o;8420:315::-;8488:6;8496;8549:2;8537:9;8528:7;8524:23;8520:32;8517:52;;;8565:1;8562;8555:12;8517:52;8604:9;8591:23;8623:31;8648:5;8623:31;:::i;:::-;8673:5;8725:2;8710:18;;;;8697:32;;-1:-1:-1;;;8420:315:1:o;8740:316::-;8817:6;8825;8833;8886:2;8874:9;8865:7;8861:23;8857:32;8854:52;;;8902:1;8899;8892:12;8854:52;-1:-1:-1;;8925:23:1;;;8995:2;8980:18;;8967:32;;-1:-1:-1;9046:2:1;9031:18;;;9018:32;;8740:316;-1:-1:-1;8740:316:1:o;9061:773::-;9183:6;9191;9199;9207;9260:2;9248:9;9239:7;9235:23;9231:32;9228:52;;;9276:1;9273;9266:12;9228:52;9316:9;9303:23;9345:18;9386:2;9378:6;9375:14;9372:34;;;9402:1;9399;9392:12;9372:34;9441:70;9503:7;9494:6;9483:9;9479:22;9441:70;:::i;:::-;9530:8;;-1:-1:-1;9415:96:1;-1:-1:-1;9618:2:1;9603:18;;9590:32;;-1:-1:-1;9634:16:1;;;9631:36;;;9663:1;9660;9653:12;9631:36;;9702:72;9766:7;9755:8;9744:9;9740:24;9702:72;:::i;:::-;9061:773;;;;-1:-1:-1;9793:8:1;-1:-1:-1;;;;9061:773:1:o;10193:658::-;10364:2;10416:21;;;10486:13;;10389:18;;;10508:22;;;10335:4;;10364:2;10587:15;;;;10561:2;10546:18;;;10335:4;10630:195;10644:6;10641:1;10638:13;10630:195;;;10709:13;;-1:-1:-1;;;;;10705:39:1;10693:52;;10800:15;;;;10765:12;;;;10741:1;10659:9;10630:195;;;-1:-1:-1;10842:3:1;;10193:658;-1:-1:-1;;;;;;10193:658:1:o;11119:380::-;11198:1;11194:12;;;;11241;;;11262:61;;11316:4;11308:6;11304:17;11294:27;;11262:61;11369:2;11361:6;11358:14;11338:18;11335:38;11332:161;;11415:10;11410:3;11406:20;11403:1;11396:31;11450:4;11447:1;11440:15;11478:4;11475:1;11468:15;11332:161;;11119:380;;;:::o;11504:251::-;11574:6;11627:2;11615:9;11606:7;11602:23;11598:32;11595:52;;;11643:1;11640;11633:12;11595:52;11675:9;11669:16;11694:31;11719:5;11694:31;:::i;12461:127::-;12522:10;12517:3;12513:20;12510:1;12503:31;12553:4;12550:1;12543:15;12577:4;12574:1;12567:15;12593:135;12632:3;12653:17;;;12650:43;;12673:18;;:::i;:::-;-1:-1:-1;12720:1:1;12709:13;;12593:135::o;14848:184::-;14918:6;14971:2;14959:9;14950:7;14946:23;14942:32;14939:52;;;14987:1;14984;14977:12;14939:52;-1:-1:-1;15010:16:1;;14848:184;-1:-1:-1;14848:184:1:o;15316:245::-;15383:6;15436:2;15424:9;15415:7;15411:23;15407:32;15404:52;;;15452:1;15449;15442:12;15404:52;15484:9;15478:16;15503:28;15525:5;15503:28;:::i;16265:686::-;-1:-1:-1;;;;;16611:15:1;;;16593:34;;16573:3;16658:2;16643:18;;16636:31;;;16704:1;16683:19;;;16676:30;-1:-1:-1;;;16737:3:1;16722:19;;16715:39;16826:15;;;;16821:2;16806:18;;16799:43;-1:-1:-1;16858:18:1;;16851:34;16929:14;;16922:22;-1:-1:-1;16901:19:1;;16894:51;16786:3;16771:19;;16265:686::o;16956:125::-;17021:9;;;17042:10;;;17039:36;;;17055:18;;:::i;17086:683::-;-1:-1:-1;;;;;17432:15:1;;;17414:34;;17394:3;17479:2;17464:18;;17457:31;;;17525:1;17504:19;;;17497:30;-1:-1:-1;;;17558:3:1;17543:19;;17536:36;17644:15;;;;17639:2;17624:18;;17617:43;-1:-1:-1;17676:18:1;;17669:34;17747:14;;17740:22;-1:-1:-1;17719:19:1;;17712:51;17604:3;17589:19;;17086:683::o;19178:705::-;19359:2;19411:21;;;19384:18;;;19467:22;;;19330:4;;19546:6;19520:2;19505:18;;19330:4;19580:277;19594:6;19591:1;19588:13;19580:277;;;19669:6;19656:20;19689:31;19714:5;19689:31;:::i;:::-;-1:-1:-1;;;;;19745:31:1;19733:44;;19832:15;;;;19797:12;;;;19773:1;19609:9;19580:277;;;-1:-1:-1;19874:3:1;19178:705;-1:-1:-1;;;;;;19178:705:1:o;20014:518::-;20116:2;20111:3;20108:11;20105:421;;;20152:5;20149:1;20142:16;20196:4;20193:1;20183:18;20266:2;20254:10;20250:19;20247:1;20243:27;20237:4;20233:38;20302:4;20290:10;20287:20;20284:47;;;-1:-1:-1;20325:4:1;20284:47;20380:2;20375:3;20371:12;20368:1;20364:20;20358:4;20354:31;20344:41;;20435:81;20453:2;20446:5;20443:13;20435:81;;;20512:1;20498:16;;20479:1;20468:13;20435:81;;;20439:3;;20105:421;20014:518;;;:::o;20708:1345::-;20834:3;20828:10;20861:18;20853:6;20850:30;20847:56;;;20883:18;;:::i;:::-;20912:97;21002:6;20962:38;20994:4;20988:11;20962:38;:::i;:::-;20956:4;20912:97;:::i;:::-;21064:4;;21121:2;21110:14;;21138:1;21133:663;;;;21840:1;21857:6;21854:89;;;-1:-1:-1;21909:19:1;;;21903:26;21854:89;-1:-1:-1;;20665:1:1;20661:11;;;20657:24;20653:29;20643:40;20689:1;20685:11;;;20640:57;21956:81;;21103:944;;21133:663;19961:1;19954:14;;;19998:4;19985:18;;-1:-1:-1;;21169:20:1;;;21287:236;21301:7;21298:1;21295:14;21287:236;;;21390:19;;;21384:26;21369:42;;21482:27;;;;21450:1;21438:14;;;;21317:19;;21287:236;;;21291:3;21551:6;21542:7;21539:19;21536:201;;;21612:19;;;21606:26;-1:-1:-1;;21695:1:1;21691:14;;;21707:3;21687:24;21683:37;21679:42;21664:58;21649:74;;21536:201;;;21783:1;21774:6;21771:1;21767:14;21763:22;21757:4;21750:36;21103:944;;;;;20708:1345;;:::o;27005:128::-;27072:9;;;27093:11;;;27090:37;;;27107:18;;:::i
Swarm Source
ipfs://6016afb9de36e815448ae079ee4e8fe820028ec9e3e0b760732cab1532f9542a
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.