ERC-20
Overview
Max Total Supply
2,000,000,000 MOGoose
Holders
64
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
MOGoose
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-12-08 */ // SPDX-License-Identifier: MIT /* $MOGoose The mongoose is back, and it’s here to mog. Web: https://mogoose.com/ X: https://x.com/MOGooseToken Telegram: https://t.me/MOGooseETH */ pragma solidity 0.8.28; // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); /** * @dev Returns the 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); } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance( address sender, uint256 balance, uint256 needed ); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance( address spender, uint256 allowance, uint256 needed ); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance( address sender, uint256 balance, uint256 needed, uint256 tokenId ); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance( address owner, address spender ) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve( address spender, uint256 value ) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom( address from, address to, uint256 value ) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve( address owner, address spender, uint256 value, bool emitEvent ) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 value ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance( spender, currentAllowance, value ); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) /** * @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); } } interface IUniswapV2Factory { function createPair( address tokenA, address tokenB ) external returns (address pair); } interface IUniswapV2Router { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } pragma solidity ^0.8.0; contract MOGoose is Ownable, ERC20 { IUniswapV2Router public immutable swapRouter; address public constant ZERO_ADDRESS = address(0); address public constant BURN_ADDRESS = address(0xdEaD); address public immutable swapPair; address public taxWallet; address public devWallet; bool public limitsEnabled; bool public cooldownEnabled; bool public feesEnabled; bool private inSwapProcess; bool public isActivated; uint256 public activationBlock; uint256 public activationTime; uint256 private lastSwapBlock; uint256 public constant MAX_TOTAL_FEE = 35; uint256 public maxBuyLimit; uint256 public maxSellLimit; uint256 public maxWalletLimit; uint256 public tokensForSwap; uint256 public buyTax; uint256 public sellTax; uint256 public transferTax; mapping(address => bool) public blacklistedBots; mapping(address => bool) public excludedFromFees; mapping(address => bool) public excludedFromLimits; mapping(address => bool) public marketPairs; mapping(address => uint256) private _lastTransferBlock; event Activation(); event taxWalletUpdated(address newWallet, address oldWallet); event DevWalletUpdated(address newWallet, address oldWallet); event LimitsStatusChanged(bool status); event CooldownStatusChanged(bool status); event FeesStatusChanged(bool status); event MaxBuyLimitUpdated(uint256 amount); event MaxSellLimitUpdated(uint256 amount); event MaxWalletLimitUpdated(uint256 amount); event TokensForSwapUpdated(uint256 newValue, uint256 oldValue); event BuyTaxUpdated(uint256 newValue, uint256 oldValue); event SellTaxUpdated(uint256 newValue, uint256 oldValue); event TransferTaxUpdated(uint256 newValue, uint256 oldValue); event ExcludedFromFees(address account, bool isExcluded); event ExcludedFromLimits(address account, bool isExcluded); event BotStatusUpdated(address account, bool isBlacklisted); event MarketPairStatusUpdated(address pair, bool value); event StuckTokensWithdrawn(address token, uint256 amount); error AlreadyActivated(); error InvalidAddress(); error AmountTooSmall(); error AmountTooLarge(); error FeeTooHigh(); error PairAlreadySet(); error NoETHToWithdraw(); error NoTokensToWithdraw(); error ETHWithdrawalFailed(); error BotActivityDetected(); error TransferCooldown(); error ExceedsMaxBuyLimit(); error ExceedsMaxSellLimit(); error ExceedsMaxWalletLimit(); error NotActivated(); modifier lockSwapProcess() { inSwapProcess = true; _; inSwapProcess = false; } constructor() Ownable(msg.sender) ERC20("MOGoose", "MOGoose") { address owner = msg.sender; _mint(owner, 2_000_000_000 ether); uint256 totalSupplyTokens = totalSupply(); taxWallet = 0xcc95A5CF21886F29104Ad943B10e437EEFD41c88; devWallet = 0x01d6A69931B5150BCC3E9153A25835B6eb80907E; maxBuyLimit = (totalSupplyTokens * 2) / 100; maxSellLimit = (totalSupplyTokens * 2) / 100; maxWalletLimit = (totalSupplyTokens * 2) / 100; tokensForSwap = (totalSupplyTokens * 5) / 10000; limitsEnabled = true; cooldownEnabled = true; feesEnabled = true; buyTax = 35; sellTax = 35; transferTax = 0; swapRouter = IUniswapV2Router( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); swapPair = IUniswapV2Factory(swapRouter.factory()).createPair( address(this), swapRouter.WETH() ); _setMarketPair(swapPair, true); _approve(address(this), address(swapRouter), type(uint256).max); _excludeFromFees(address(this), true); _excludeFromFees(BURN_ADDRESS, true); _excludeFromFees(owner, true); _excludeFromFees(taxWallet, true); _excludeFromFees(devWallet, true); _excludeFromLimits(address(this), true); _excludeFromLimits(BURN_ADDRESS, true); _excludeFromLimits(owner, true); _excludeFromLimits(taxWallet, true); _excludeFromLimits(devWallet, true); } receive() external payable {} fallback() external payable {} function _transferOwnership(address newOwner) internal override { address oldOwner = owner(); if (oldOwner != ZERO_ADDRESS) { _excludeFromFees(oldOwner, false); _excludeFromLimits(oldOwner, false); } _excludeFromFees(newOwner, true); _excludeFromLimits(newOwner, true); super._transferOwnership(newOwner); } function activate() external onlyOwner { require(!isActivated, AlreadyActivated()); isActivated = true; activationBlock = block.number; activationTime = block.timestamp; emit Activation(); } function setLimitsEnabled(bool value) external onlyOwner { limitsEnabled = value; emit LimitsStatusChanged(value); } function setCooldownEnabled(bool value) external onlyOwner { cooldownEnabled = value; emit CooldownStatusChanged(value); } function setFeesEnabled(bool value) external onlyOwner { feesEnabled = value; emit FeesStatusChanged(value); } function setMaxBuyLimit(uint256 amount) external onlyOwner { require(amount >= ((totalSupply() * 2) / 1000), AmountTooSmall()); maxBuyLimit = amount; emit MaxBuyLimitUpdated(maxBuyLimit); } function setMaxSellLimit(uint256 amount) external onlyOwner { require(amount >= ((totalSupply() * 2) / 1000), AmountTooSmall()); maxSellLimit = amount; emit MaxSellLimitUpdated(maxSellLimit); } function setMaxWalletLimit(uint256 amount) external onlyOwner { require(amount >= ((totalSupply() * 3) / 1000), AmountTooSmall()); maxWalletLimit = amount; emit MaxWalletLimitUpdated(maxWalletLimit); } function setTokensForSwap(uint256 amount) external onlyOwner { uint256 totalSupplyTokens = totalSupply(); require(amount >= (totalSupplyTokens * 1) / 1000000, AmountTooSmall()); require(amount <= (totalSupplyTokens * 5) / 1000, AmountTooLarge()); uint256 oldValue = tokensForSwap; tokensForSwap = amount; emit TokensForSwapUpdated(amount, oldValue); } function setTax(uint256 _buyTax, uint256 _sellTax) external onlyOwner { require(_buyTax <= MAX_TOTAL_FEE, FeeTooHigh()); require(_sellTax <= MAX_TOTAL_FEE, FeeTooHigh()); buyTax = _buyTax; sellTax = _sellTax; } function setTransferTax(uint256 _transferTax) external onlyOwner { require(_transferTax <= MAX_TOTAL_FEE, FeeTooHigh()); uint256 oldValue = transferTax; transferTax = _transferTax; emit TransferTaxUpdated(_transferTax, oldValue); } function excludeFromFees( address[] calldata accounts, bool value ) external onlyOwner { for (uint256 i = 0; i < accounts.length; i++) { _excludeFromFees(accounts[i], value); } } function excludeFromLimits( address[] calldata accounts, bool value ) external onlyOwner { for (uint256 i = 0; i < accounts.length; i++) { _excludeFromLimits(accounts[i], value); } } function setMarketPair(address pair, bool value) external onlyOwner { require(!marketPairs[pair], PairAlreadySet()); _setMarketPair(pair, value); } function withdrawStuckTokens(address _token) external onlyOwner { address owner = msg.sender; uint256 amount; if (_token == ZERO_ADDRESS) { bool success; amount = address(this).balance; require(amount > 0, NoETHToWithdraw()); (success, ) = address(owner).call{value: amount}(""); require(success, ETHWithdrawalFailed()); } else { amount = IERC20(_token).balanceOf(address(this)); require(amount > 0, NoTokensToWithdraw()); IERC20(_token).transfer(msg.sender, amount); } emit StuckTokensWithdrawn(_token, amount); } function _update( address from, address to, uint256 amount ) internal virtual override { address sender = msg.sender; address origin = tx.origin; require(!blacklistedBots[from], BotActivityDetected()); require( sender == from || !blacklistedBots[sender], BotActivityDetected() ); require( origin == from || origin == sender || !blacklistedBots[origin], BotActivityDetected() ); require( isActivated || excludedFromLimits[from] || excludedFromLimits[to], NotActivated() ); bool applyLimits = limitsEnabled && !inSwapProcess && !(excludedFromLimits[from] || excludedFromLimits[to]); if (applyLimits) { if ( from != owner() && to != owner() && to != ZERO_ADDRESS && to != BURN_ADDRESS ) { if (cooldownEnabled) { if (to != address(swapRouter) && to != swapPair) { require( _lastTransferBlock[origin] < block.number - 3 && _lastTransferBlock[to] < block.number - 3, TransferCooldown() ); _lastTransferBlock[origin] = block.number; _lastTransferBlock[to] = block.number; } } if (marketPairs[from] && !excludedFromLimits[to]) { require(amount <= maxBuyLimit, ExceedsMaxBuyLimit()); require( amount + balanceOf(to) <= maxWalletLimit, ExceedsMaxWalletLimit() ); } else if (marketPairs[to] && !excludedFromLimits[from]) { require(amount <= maxSellLimit, ExceedsMaxSellLimit()); } else if (!excludedFromLimits[to]) { require( amount + balanceOf(to) <= maxWalletLimit, ExceedsMaxWalletLimit() ); } } } bool applyFee = feesEnabled && !inSwapProcess && !(excludedFromFees[from] || excludedFromFees[to]); if (applyFee) { uint256 feeAmount = 0; if (marketPairs[to] && sellTax > 0) { feeAmount = (amount * sellTax) / 100; } else if (marketPairs[from] && buyTax > 0) { feeAmount = (amount * buyTax) / 100; } else if ( !marketPairs[to] && !marketPairs[from] && transferTax > 0 ) { feeAmount = (amount * transferTax) / 100; } if (feeAmount > 0) { amount -= feeAmount; super._update(from, address(this), feeAmount); } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= tokensForSwap; if (applyFee && !marketPairs[from] && canSwap) { if (block.number > lastSwapBlock) { _swapTokens(contractTokenBalance); lastSwapBlock = block.number; } } super._update(from, to, amount); } function _swapTokens(uint256 tokenAmount) internal virtual lockSwapProcess { bool success; address[] memory path = new address[](2); path[0] = address(this); path[1] = swapRouter.WETH(); uint256 maxSwapAmount = tokensForSwap * 20; if (tokenAmount > maxSwapAmount) { tokenAmount = maxSwapAmount; } swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); uint256 ethBalance = address(this).balance; uint256 ethForRevenue = ethBalance / 2; uint256 ethForDevelopment = ethBalance - ethForRevenue; (success, ) = address(taxWallet).call{value: ethForRevenue}(""); (success, ) = address(devWallet).call{value: ethForDevelopment}(""); } function _excludeFromFees(address account, bool value) internal virtual { excludedFromFees[account] = value; emit ExcludedFromFees(account, value); } function _excludeFromLimits(address account, bool value) internal virtual { excludedFromLimits[account] = value; emit ExcludedFromLimits(account, value); } function _setMarketPair(address pair, bool value) internal virtual { marketPairs[pair] = value; emit MarketPairStatusUpdated(pair, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyActivated","type":"error"},{"inputs":[],"name":"AmountTooLarge","type":"error"},{"inputs":[],"name":"AmountTooSmall","type":"error"},{"inputs":[],"name":"BotActivityDetected","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"ETHWithdrawalFailed","type":"error"},{"inputs":[],"name":"ExceedsMaxBuyLimit","type":"error"},{"inputs":[],"name":"ExceedsMaxSellLimit","type":"error"},{"inputs":[],"name":"ExceedsMaxWalletLimit","type":"error"},{"inputs":[],"name":"FeeTooHigh","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NoETHToWithdraw","type":"error"},{"inputs":[],"name":"NoTokensToWithdraw","type":"error"},{"inputs":[],"name":"NotActivated","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":"PairAlreadySet","type":"error"},{"inputs":[],"name":"TransferCooldown","type":"error"},{"anonymous":false,"inputs":[],"name":"Activation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"BotStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"BuyTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"CooldownStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"DevWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"FeesStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"LimitsStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"MarketPairStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxBuyLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxSellLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxWalletLimitUpdated","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":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SellTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StuckTokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"TokensForSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"TransferTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"taxWalletUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activationBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklistedBots","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMarketPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxSellLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"setTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTokensForSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferTax","type":"uint256"}],"name":"setTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561000f575f5ffd5b506040518060400160405280600781526020017f4d4f476f6f7365000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4d4f476f6f736500000000000000000000000000000000000000000000000000815250335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100ed575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100e49190611ee6565b60405180910390fd5b6100fc8161062e60201b60201c565b50816004908161010c919061213c565b50806005908161011c919061213c565b5050505f33905061013f816b06765c793fa10079d00000006106c860201b60201c565b5f61014e61074d60201b60201c565b905073cc95a5cf21886f29104ad943b10e437eefd41c8860065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507301d6a69931b5150bcc3e9153a25835b6eb80907e60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060646002826102079190612238565b61021191906122a6565b600b8190555060646002826102269190612238565b61023091906122a6565b600c8190555060646002826102459190612238565b61024f91906122a6565b600d819055506127106005826102659190612238565b61026f91906122a6565b600e819055506001600760146101000a81548160ff0219169083151502179055506001600760156101000a81548160ff0219169083151502179055506001600760166101000a81548160ff0219169083151502179055506023600f8190555060236010819055505f601181905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610370573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103949190612304565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041f9190612304565b6040518363ffffffff1660e01b815260040161043c92919061232f565b6020604051808303815f875af1158015610458573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061047c9190612304565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506104c260a051600161075660201b60201c565b6104f5306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107e760201b60201c565b6105063060016107ff60201b60201c565b61051961dead60016107ff60201b60201c565b61052a8260016107ff60201b60201c565b61055c60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016107ff60201b60201c565b61058e60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016107ff60201b60201c565b61059f30600161089060201b60201c565b6105b261dead600161089060201b60201c565b6105c382600161089060201b60201c565b6105f560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161089060201b60201c565b61062760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161089060201b60201c565b5050612610565b5f61063d61092160201b60201c565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069357610682815f6107ff60201b60201c565b610692815f61089060201b60201c565b5b6106a48260016107ff60201b60201c565b6106b582600161089060201b60201c565b6106c48261094860201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610738575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161072f9190611ee6565b60405180910390fd5b6107495f8383610a0960201b60201c565b5050565b5f600354905090565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f024f6c8d60a57c94822c46d989fd6935057590269281b07fe8327d7e9bc4242182826040516107db929190612370565b60405180910390a15050565b6107fa838383600161171a60201b60201c565b505050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb8282604051610884929190612370565b60405180910390a15050565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f74392251b09500cc108c71712e5e7e0392be9075a74a24f1494551cfa8e068708282604051610915929190612370565b60405180910390a15050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f3390505f32905060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610a92576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480610b13575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b610b49576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610bae57508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b80610c00575060125f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b610c36576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760189054906101000a900460ff1680610c97575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80610ce8575060145f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610d1e576040517f037c597f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600760149054906101000a900460ff168015610d485750600760179054906101000a900460ff16155b8015610dec575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610dea575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b9050801561139257610e0261092160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610e765750610e4661092160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015610eae57505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015610ee8575061dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561139157600760159054906101000a900460ff16156110cf5760805173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610f6e575060a05173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b156110ce57600343610f809190612397565b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541080156110135750600343610fd39190612397565b60165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b611049576040517f53444d9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4360165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055504360165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561116c575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561120757600b548411156111ad576040517f89be121e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d546111bf866118e960201b60201c565b856111ca91906123ca565b1115611202576040517f76c7c05200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611390565b60155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156112a4575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156112ea57600c548411156112e5576040517fa8e28e1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138f565b60145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661138e57600d5461134a866118e960201b60201c565b8561135591906123ca565b111561138d576040517f76c7c05200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156113bc5750600760179054906101000a900460ff16155b8015611460575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061145e575060135f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b9050801561165f575f5f905060155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156114c357505f601054115b156114e9576064601054876114d89190612238565b6114e291906122a6565b9050611635565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561154057505f600f54115b15611566576064600f54876115559190612238565b61155f91906122a6565b9050611634565b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611604575060155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561161157505f601154115b15611633576064601154876116269190612238565b61163091906122a6565b90505b5b5b5f81111561165d5780866116499190612397565b955061165c88308361192f60201b60201c565b5b505b5f61166f306118e960201b60201c565b90505f600e5482101590508280156116ce575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156116d75750805b156116fe57600a544311156116fd576116f582611b4b60201b60201c565b43600a819055505b5b61170f89898961192f60201b60201c565b505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361178a575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016117819190611ee6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117fa575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016117f19190611ee6565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156118e3578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516118da919061240c565b60405180910390a35b50505050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361197f578060035f82825461197391906123ca565b92505081905550611a4f565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611a09578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611a0093929190612425565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a96578060035f8282540392505081905550611ae1565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b3e919061240c565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f5f600267ffffffffffffffff811115611b8357611b82611f09565b5b604051908082528060200260200182016040528015611bb15781602001602082028036833780820191505090505b50905030815f81518110611bc857611bc761245a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c719190612304565b81600181518110611c8557611c8461245a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e54611ccf9190612238565b905080841115611cdd578093505b60805173ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b8152600401611d20959493929190612577565b5f604051808303815f87803b158015611d37575f5ffd5b505af1158015611d49573d5f5f3e3d5ffd5b505050505f4790505f600282611d5f91906122a6565b90505f8183611d6e9190612397565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611db5906125fc565b5f6040518083038185875af1925050503d805f8114611def576040519150601f19603f3d011682016040523d82523d5f602084013e611df4565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051611e3f906125fc565b5f6040518083038185875af1925050503d805f8114611e79576040519150601f19603f3d011682016040523d82523d5f602084013e611e7e565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ed082611ea7565b9050919050565b611ee081611ec6565b82525050565b5f602082019050611ef95f830184611ed7565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611f7a57607f821691505b602082108103611f8d57611f8c611f36565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611fef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611fb4565b611ff98683611fb4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61203d61203861203384612011565b61201a565b612011565b9050919050565b5f819050919050565b61205683612023565b61206a61206282612044565b848454611fc0565b825550505050565b5f5f905090565b612081612072565b61208c81848461204d565b505050565b5b818110156120af576120a45f82612079565b600181019050612092565b5050565b601f8211156120f4576120c581611f93565b6120ce84611fa5565b810160208510156120dd578190505b6120f16120e985611fa5565b830182612091565b50505b505050565b5f82821c905092915050565b5f6121145f19846008026120f9565b1980831691505092915050565b5f61212c8383612105565b9150826002028217905092915050565b61214582611eff565b67ffffffffffffffff81111561215e5761215d611f09565b5b6121688254611f63565b6121738282856120b3565b5f60209050601f8311600181146121a4575f8415612192578287015190505b61219c8582612121565b865550612203565b601f1984166121b286611f93565b5f5b828110156121d9578489015182556001820191506020850194506020810190506121b4565b868310156121f657848901516121f2601f891682612105565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61224282612011565b915061224d83612011565b925082820261225b81612011565b915082820484148315176122725761227161220b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6122b082612011565b91506122bb83612011565b9250826122cb576122ca612279565b5b828204905092915050565b5f5ffd5b6122e381611ec6565b81146122ed575f5ffd5b50565b5f815190506122fe816122da565b92915050565b5f60208284031215612319576123186122d6565b5b5f612326848285016122f0565b91505092915050565b5f6040820190506123425f830185611ed7565b61234f6020830184611ed7565b9392505050565b5f8115159050919050565b61236a81612356565b82525050565b5f6040820190506123835f830185611ed7565b6123906020830184612361565b9392505050565b5f6123a182612011565b91506123ac83612011565b92508282039050818111156123c4576123c361220b565b5b92915050565b5f6123d482612011565b91506123df83612011565b92508282019050808211156123f7576123f661220b565b5b92915050565b61240681612011565b82525050565b5f60208201905061241f5f8301846123fd565b92915050565b5f6060820190506124385f830186611ed7565b61244560208301856123fd565b61245260408301846123fd565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f6124aa6124a56124a084612487565b61201a565b612011565b9050919050565b6124ba81612490565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6124f281611ec6565b82525050565b5f61250383836124e9565b60208301905092915050565b5f602082019050919050565b5f612525826124c0565b61252f81856124ca565b935061253a836124da565b805f5b8381101561256a57815161255188826124f8565b975061255c8361250f565b92505060018101905061253d565b5085935050505092915050565b5f60a08201905061258a5f8301886123fd565b61259760208301876124b1565b81810360408301526125a9818661251b565b90506125b86060830185611ed7565b6125c560808301846123fd565b9695505050505050565b5f81905092915050565b50565b5f6125e75f836125cf565b91506125f2826125d9565b5f82019050919050565b5f612606826125dc565b9150819050919050565b60805160a051613d8761264d5f395f8181610d71015261252c01525f81816115e4015281816124d50152818161309901526131920152613d875ff3fe6080604052600436106102cc575f3560e01c8063757765f811610174578063a9059cbb116100db578063cb96372811610094578063dbe66ca01161006e578063dbe66ca014610a97578063dd62ed3e14610ad3578063f2fde38b14610b0f578063fccc281314610b37576102cd565b8063cb96372814610a1b578063cc1776d314610a43578063da4493f614610a6d576102cd565b8063a9059cbb146108ff578063a985ceef1461093b578063ad29ffde14610965578063b4b11b951461098d578063c16dd4a4146109c9578063c31c9c07146109f1576102cd565b80638da5cb5b1161012d5780638da5cb5b146108075780638ea5220f1461083157806395d89b411461085b578063a49a910f14610885578063a64e4f8a146108ad578063a901dd92146108d7576102cd565b8063757765f8146106fd5780637b812b41146107255780637f635cc01461076157806380faa3d21461078b5780638124f7ac146107b55780638b525903146107df576102cd565b806336884b6e11610233578063652e2f04116101ec5780636aa5b37f116101c65780636aa5b37f1461065957806370a0823114610683578063715018a6146106bf578063728d41c9146106d5576102cd565b8063652e2f04146105dd578063667f65261461060757806366a88d961461062f576102cd565b806336884b6e146104e757806341aea9de1461050f5780634a8c1fb4146105375780634f7041a514610561578063538ba4f91461058b5780635932ead1146105b5576102cd565b806323b872dd1161028557806323b872dd146103c7578063259827e31461040357806326991cc81461043f5780632dc0562d14610469578063313ce567146104935780633582ad23146104bd576102cd565b806306fdde03146102cf578063095ea7b3146102f95780630f15f4c014610335578063106a5a8f1461034b57806318160ddd146103735780631ecd7d6e1461039d576102cd565b5b005b3480156102da575f5ffd5b506102e3610b61565b6040516102f091906133e8565b60405180910390f35b348015610304575f5ffd5b5061031f600480360381019061031a919061349d565b610bf1565b60405161032c91906134f5565b60405180910390f35b348015610340575f5ffd5b50610349610c13565b005b348015610356575f5ffd5b50610371600480360381019061036c9190613599565b610cb9565b005b34801561037e575f5ffd5b50610387610d15565b6040516103949190613605565b60405180910390f35b3480156103a8575f5ffd5b506103b1610d1e565b6040516103be9190613605565b60405180910390f35b3480156103d2575f5ffd5b506103ed60048036038101906103e8919061361e565b610d24565b6040516103fa91906134f5565b60405180910390f35b34801561040e575f5ffd5b506104296004803603810190610424919061366e565b610d52565b60405161043691906134f5565b60405180910390f35b34801561044a575f5ffd5b50610453610d6f565b60405161046091906136a8565b60405180910390f35b348015610474575f5ffd5b5061047d610d93565b60405161048a91906136a8565b60405180910390f35b34801561049e575f5ffd5b506104a7610db8565b6040516104b491906136dc565b60405180910390f35b3480156104c8575f5ffd5b506104d1610dc0565b6040516104de91906134f5565b60405180910390f35b3480156104f2575f5ffd5b5061050d600480360381019061050891906136f5565b610dd3565b005b34801561051a575f5ffd5b5061053560048036038101906105309190613720565b610e78565b005b348015610542575f5ffd5b5061054b610ed4565b60405161055891906134f5565b60405180910390f35b34801561056c575f5ffd5b50610575610ee7565b6040516105829190613605565b60405180910390f35b348015610596575f5ffd5b5061059f610eed565b6040516105ac91906136a8565b60405180910390f35b3480156105c0575f5ffd5b506105db60048036038101906105d69190613720565b610ef1565b005b3480156105e8575f5ffd5b506105f1610f4d565b6040516105fe9190613605565b60405180910390f35b348015610612575f5ffd5b5061062d6004803603810190610628919061374b565b610f53565b005b34801561063a575f5ffd5b50610643610fe3565b6040516106509190613605565b60405180910390f35b348015610664575f5ffd5b5061066d610fe9565b60405161067a9190613605565b60405180910390f35b34801561068e575f5ffd5b506106a960048036038101906106a4919061366e565b610fef565b6040516106b69190613605565b60405180910390f35b3480156106ca575f5ffd5b506106d3611035565b005b3480156106e0575f5ffd5b506106fb60048036038101906106f691906136f5565b611048565b005b348015610708575f5ffd5b50610723600480360381019061071e91906136f5565b6110ed565b005b348015610730575f5ffd5b5061074b6004803603810190610746919061366e565b611192565b60405161075891906134f5565b60405180910390f35b34801561076c575f5ffd5b506107756111af565b6040516107829190613605565b60405180910390f35b348015610796575f5ffd5b5061079f6111b4565b6040516107ac9190613605565b60405180910390f35b3480156107c0575f5ffd5b506107c96111ba565b6040516107d69190613605565b60405180910390f35b3480156107ea575f5ffd5b50610805600480360381019061080091906136f5565b6111c0565b005b348015610812575f5ffd5b5061081b61124d565b60405161082891906136a8565b60405180910390f35b34801561083c575f5ffd5b50610845611274565b60405161085291906136a8565b60405180910390f35b348015610866575f5ffd5b5061086f611299565b60405161087c91906133e8565b60405180910390f35b348015610890575f5ffd5b506108ab60048036038101906108a691906136f5565b611329565b005b3480156108b8575f5ffd5b506108c161142e565b6040516108ce91906134f5565b60405180910390f35b3480156108e2575f5ffd5b506108fd60048036038101906108f89190613720565b611441565b005b34801561090a575f5ffd5b506109256004803603810190610920919061349d565b61149d565b60405161093291906134f5565b60405180910390f35b348015610946575f5ffd5b5061094f6114bf565b60405161095c91906134f5565b60405180910390f35b348015610970575f5ffd5b5061098b60048036038101906109869190613599565b6114d2565b005b348015610998575f5ffd5b506109b360048036038101906109ae919061366e565b61152e565b6040516109c091906134f5565b60405180910390f35b3480156109d4575f5ffd5b506109ef60048036038101906109ea9190613789565b61154b565b005b3480156109fc575f5ffd5b50610a056115e2565b604051610a129190613822565b60405180910390f35b348015610a26575f5ffd5b50610a416004803603810190610a3c919061366e565b611606565b005b348015610a4e575f5ffd5b50610a57611897565b604051610a649190613605565b60405180910390f35b348015610a78575f5ffd5b50610a8161189d565b604051610a8e9190613605565b60405180910390f35b348015610aa2575f5ffd5b50610abd6004803603810190610ab8919061366e565b6118a3565b604051610aca91906134f5565b60405180910390f35b348015610ade575f5ffd5b50610af96004803603810190610af4919061383b565b6118c0565b604051610b069190613605565b60405180910390f35b348015610b1a575f5ffd5b50610b356004803603810190610b30919061366e565b611942565b005b348015610b42575f5ffd5b50610b4b6119c6565b604051610b5891906136a8565b60405180910390f35b606060048054610b70906138a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9c906138a6565b8015610be75780601f10610bbe57610100808354040283529160200191610be7565b820191905f5260205f20905b815481529060010190602001808311610bca57829003601f168201915b5050505050905090565b5f5f610bfb6119cc565b9050610c088185856119d3565b600191505092915050565b610c1b6119e5565b600760189054906101000a900460ff1615610c62576040517fef65161f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600760186101000a81548160ff02191690831515021790555043600881905550426009819055507f6603428d483ce13b6662b7a6848d769996e12e801bed4b0f1b9e8d10f64d38ba60405160405180910390a1565b610cc16119e5565b5f5f90505b83839050811015610d0f57610d02848483818110610ce757610ce66138d6565b5b9050602002016020810190610cfc919061366e565b83611a6c565b8080600101915050610cc6565b50505050565b5f600354905090565b600e5481565b5f5f610d2e6119cc565b9050610d3b858285611afd565b610d46858585611b8f565b60019150509392505050565b6012602052805f5260405f205f915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b600760149054906101000a900460ff1681565b610ddb6119e5565b6103e86002610de8610d15565b610df29190613930565b610dfc919061399e565b811015610e35576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c819055507f1f41d239159181ddefb13e99853e0e4998e0556aa1f2281281c783e309281062600c54604051610e6d9190613605565b60405180910390a150565b610e806119e5565b80600760146101000a81548160ff0219169083151502179055507f1da197dc3cab4eceaefd5d0c34df2ed3a08f20a207fb1910c0eceb361e2c965c81604051610ec991906134f5565b60405180910390a150565b600760189054906101000a900460ff1681565b600f5481565b5f81565b610ef96119e5565b80600760156101000a81548160ff0219169083151502179055507f6a53d6c83a7a55d7a07bd490493fceb559161cce588908714e497e54044777d981604051610f4291906134f5565b60405180910390a150565b600c5481565b610f5b6119e5565b6023821115610f96576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6023811115610fd1576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600f81905550806010819055505050565b600d5481565b600b5481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61103d6119e5565b6110465f611c7f565b565b6110506119e5565b6103e8600361105d610d15565b6110679190613930565b611071919061399e565b8110156110aa576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d819055507fe2e6151ed0b472c61401059745339ca42474813911b22d24023385def6377e1c600d546040516110e29190613605565b60405180910390a150565b6110f56119e5565b6103e86002611102610d15565b61110c9190613930565b611116919061399e565b81101561114f576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b819055507f85668e92bc538f5c140067d68e3375c65b9e4545d2822ec8d807c6782f747d62600b546040516111879190613605565b60405180910390a150565b6014602052805f5260405f205f915054906101000a900460ff1681565b602381565b60085481565b60115481565b6111c86119e5565b6023811115611203576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6011549050816011819055507f6a7b998a4adc393cb692c67fcd563e7971e2ea6f3fe7c9b8fb6dd53cf5b627d082826040516112419291906139ce565b60405180910390a15050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600580546112a8906138a6565b80601f01602080910402602001604051908101604052809291908181526020018280546112d4906138a6565b801561131f5780601f106112f65761010080835404028352916020019161131f565b820191905f5260205f20905b81548152906001019060200180831161130257829003601f168201915b5050505050905090565b6113316119e5565b5f61133a610d15565b9050620f424060018261134d9190613930565b611357919061399e565b821015611390576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e86005826113a09190613930565b6113aa919061399e565b8211156113e3576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600e54905082600e819055507f65a8c7442ea496b0a28890f1ef48a9819d1f5d747e9a8df155fe862dfd493c9583826040516114219291906139ce565b60405180910390a1505050565b600760169054906101000a900460ff1681565b6114496119e5565b80600760166101000a81548160ff0219169083151502179055507fa6a3dda702515d3130fef8b72d8e25f9aebd0d02e89d10d63c0c31d80b52f4a08160405161149291906134f5565b60405180910390a150565b5f5f6114a76119cc565b90506114b4818585611b8f565b600191505092915050565b600760159054906101000a900460ff1681565b6114da6119e5565b5f5f90505b838390508110156115285761151b848483818110611500576114ff6138d6565b5b9050602002016020810190611515919061366e565b83611cf5565b80806001019150506114df565b50505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b6115536119e5565b60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156115d4576040517f027106be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115de8282611d86565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61160e6119e5565b5f3390505f5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611729575f4791505f8211611683576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16826040516116a790613a22565b5f6040518083038185875af1925050503d805f81146116e1576040519150601f19603f3d011682016040523d82523d5f602084013e6116e6565b606091505b50508091505080611723576040517f81102ece00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611859565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161176291906136a8565b602060405180830381865afa15801561177d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a19190613a4a565b90505f81116117dc576040517ffba5154e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611817929190613a75565b6020604051808303815f875af1158015611833573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118579190613ab0565b505b7f7aba7eca7d870d5f2f93298379a43957082ef15cdcf64db1f7c731c6b3a2fa49838260405161188a929190613a75565b60405180910390a1505050565b60105481565b60095481565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61194a6119e5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119ba575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016119b191906136a8565b60405180910390fd5b6119c381611c7f565b50565b61dead81565b5f33905090565b6119e08383836001611e17565b505050565b6119ed6119cc565b73ffffffffffffffffffffffffffffffffffffffff16611a0b61124d565b73ffffffffffffffffffffffffffffffffffffffff1614611a6a57611a2e6119cc565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611a6191906136a8565b60405180910390fd5b565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f74392251b09500cc108c71712e5e7e0392be9075a74a24f1494551cfa8e068708282604051611af1929190613adb565b60405180910390a15050565b5f611b0884846118c0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b895781811015611b7a578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611b7193929190613b02565b60405180910390fd5b611b8884848484035f611e17565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bff575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611bf691906136a8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c6f575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611c6691906136a8565b60405180910390fd5b611c7a838383611fe6565b505050565b5f611c8861124d565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cd257611cc7815f611cf5565b611cd1815f611a6c565b5b611cdd826001611cf5565b611ce8826001611a6c565b611cf182612d03565b5050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb8282604051611d7a929190613adb565b60405180910390a15050565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f024f6c8d60a57c94822c46d989fd6935057590269281b07fe8327d7e9bc424218282604051611e0b929190613adb565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e87575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611e7e91906136a8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ef7575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611eee91906136a8565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611fe0578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611fd79190613605565b60405180910390a35b50505050565b5f3390505f32905060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561206f576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806120f0575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612126576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061218b57508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b806121dd575060125f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612213576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760189054906101000a900460ff1680612274575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b806122c5575060145f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b6122fb576040517f037c597f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600760149054906101000a900460ff1680156123255750600760179054906101000a900460ff16155b80156123c9575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806123c7575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b90508015612993576123d961124d565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612447575061241761124d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561247f57505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156124b9575061dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561299257600760159054906101000a900460ff16156126dc577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561257b57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b156126db5760034361258d9190613b37565b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410801561262057506003436125e09190613b37565b60165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b612656576040517f53444d9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4360165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055504360165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612779575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561280e57600b548411156127ba576040517f89be121e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d546127c686610fef565b856127d19190613b6a565b1115612809576040517f76c7c05200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612991565b60155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156128ab575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156128f157600c548411156128ec576040517fa8e28e1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612990565b60145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661298f57600d5461294b86610fef565b856129569190613b6a565b111561298e576040517f76c7c05200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156129bd5750600760179054906101000a900460ff16155b8015612a61575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612a5f575060135f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b90508015612c5a575f5f905060155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612ac457505f601054115b15612aea57606460105487612ad99190613930565b612ae3919061399e565b9050612c36565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612b4157505f600f54115b15612b67576064600f5487612b569190613930565b612b60919061399e565b9050612c35565b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612c05575060155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612c1257505f601154115b15612c3457606460115487612c279190613930565b612c31919061399e565b90505b5b5b5f811115612c58578086612c4a9190613b37565b9550612c57883083612dc4565b5b505b5f612c6430610fef565b90505f600e548210159050828015612cc3575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612ccc5750805b15612ced57600a54431115612cec57612ce482612fe0565b43600a819055505b5b612cf8898989612dc4565b505050505050505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e14578060035f828254612e089190613b6a565b92505081905550612ee4565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612e9e578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e9593929190613b02565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f2b578060035f8282540392505081905550612f76565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612fd39190613605565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f5f600267ffffffffffffffff81111561301857613017613b9d565b5b6040519080825280602002602001820160405280156130465781602001602082028036833780820191505090505b50905030815f8151811061305d5761305c6138d6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613100573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131249190613bde565b81600181518110613138576131376138d6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e546131829190613930565b905080841115613190578093505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b81526004016131f1959493929190613cf9565b5f604051808303815f87803b158015613208575f5ffd5b505af115801561321a573d5f5f3e3d5ffd5b505050505f4790505f600282613230919061399e565b90505f818361323f9190613b37565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161328690613a22565b5f6040518083038185875af1925050503d805f81146132c0576040519150601f19603f3d011682016040523d82523d5f602084013e6132c5565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161331090613a22565b5f6040518083038185875af1925050503d805f811461334a576040519150601f19603f3d011682016040523d82523d5f602084013e61334f565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6133ba82613378565b6133c48185613382565b93506133d4818560208601613392565b6133dd816133a0565b840191505092915050565b5f6020820190508181035f83015261340081846133b0565b905092915050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61343982613410565b9050919050565b6134498161342f565b8114613453575f5ffd5b50565b5f8135905061346481613440565b92915050565b5f819050919050565b61347c8161346a565b8114613486575f5ffd5b50565b5f8135905061349781613473565b92915050565b5f5f604083850312156134b3576134b2613408565b5b5f6134c085828601613456565b92505060206134d185828601613489565b9150509250929050565b5f8115159050919050565b6134ef816134db565b82525050565b5f6020820190506135085f8301846134e6565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261352f5761352e61350e565b5b8235905067ffffffffffffffff81111561354c5761354b613512565b5b60208301915083602082028301111561356857613567613516565b5b9250929050565b613578816134db565b8114613582575f5ffd5b50565b5f813590506135938161356f565b92915050565b5f5f5f604084860312156135b0576135af613408565b5b5f84013567ffffffffffffffff8111156135cd576135cc61340c565b5b6135d98682870161351a565b935093505060206135ec86828701613585565b9150509250925092565b6135ff8161346a565b82525050565b5f6020820190506136185f8301846135f6565b92915050565b5f5f5f6060848603121561363557613634613408565b5b5f61364286828701613456565b935050602061365386828701613456565b925050604061366486828701613489565b9150509250925092565b5f6020828403121561368357613682613408565b5b5f61369084828501613456565b91505092915050565b6136a28161342f565b82525050565b5f6020820190506136bb5f830184613699565b92915050565b5f60ff82169050919050565b6136d6816136c1565b82525050565b5f6020820190506136ef5f8301846136cd565b92915050565b5f6020828403121561370a57613709613408565b5b5f61371784828501613489565b91505092915050565b5f6020828403121561373557613734613408565b5b5f61374284828501613585565b91505092915050565b5f5f6040838503121561376157613760613408565b5b5f61376e85828601613489565b925050602061377f85828601613489565b9150509250929050565b5f5f6040838503121561379f5761379e613408565b5b5f6137ac85828601613456565b92505060206137bd85828601613585565b9150509250929050565b5f819050919050565b5f6137ea6137e56137e084613410565b6137c7565b613410565b9050919050565b5f6137fb826137d0565b9050919050565b5f61380c826137f1565b9050919050565b61381c81613802565b82525050565b5f6020820190506138355f830184613813565b92915050565b5f5f6040838503121561385157613850613408565b5b5f61385e85828601613456565b925050602061386f85828601613456565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806138bd57607f821691505b6020821081036138d0576138cf613879565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61393a8261346a565b91506139458361346a565b92508282026139538161346a565b9150828204841483151761396a57613969613903565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6139a88261346a565b91506139b38361346a565b9250826139c3576139c2613971565b5b828204905092915050565b5f6040820190506139e15f8301856135f6565b6139ee60208301846135f6565b9392505050565b5f81905092915050565b50565b5f613a0d5f836139f5565b9150613a18826139ff565b5f82019050919050565b5f613a2c82613a02565b9150819050919050565b5f81519050613a4481613473565b92915050565b5f60208284031215613a5f57613a5e613408565b5b5f613a6c84828501613a36565b91505092915050565b5f604082019050613a885f830185613699565b613a9560208301846135f6565b9392505050565b5f81519050613aaa8161356f565b92915050565b5f60208284031215613ac557613ac4613408565b5b5f613ad284828501613a9c565b91505092915050565b5f604082019050613aee5f830185613699565b613afb60208301846134e6565b9392505050565b5f606082019050613b155f830186613699565b613b2260208301856135f6565b613b2f60408301846135f6565b949350505050565b5f613b418261346a565b9150613b4c8361346a565b9250828203905081811115613b6457613b63613903565b5b92915050565b5f613b748261346a565b9150613b7f8361346a565b9250828201905080821115613b9757613b96613903565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050613bd881613440565b92915050565b5f60208284031215613bf357613bf2613408565b5b5f613c0084828501613bca565b91505092915050565b5f819050919050565b5f613c2c613c27613c2284613c09565b6137c7565b61346a565b9050919050565b613c3c81613c12565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613c748161342f565b82525050565b5f613c858383613c6b565b60208301905092915050565b5f602082019050919050565b5f613ca782613c42565b613cb18185613c4c565b9350613cbc83613c5c565b805f5b83811015613cec578151613cd38882613c7a565b9750613cde83613c91565b925050600181019050613cbf565b5085935050505092915050565b5f60a082019050613d0c5f8301886135f6565b613d196020830187613c33565b8181036040830152613d2b8186613c9d565b9050613d3a6060830185613699565b613d4760808301846135f6565b969550505050505056fea2646970667358221220775e7148817c86ebd09d34d38adc3d294247274a68c51dcf8d92e083f8e1a9b164736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106102cc575f3560e01c8063757765f811610174578063a9059cbb116100db578063cb96372811610094578063dbe66ca01161006e578063dbe66ca014610a97578063dd62ed3e14610ad3578063f2fde38b14610b0f578063fccc281314610b37576102cd565b8063cb96372814610a1b578063cc1776d314610a43578063da4493f614610a6d576102cd565b8063a9059cbb146108ff578063a985ceef1461093b578063ad29ffde14610965578063b4b11b951461098d578063c16dd4a4146109c9578063c31c9c07146109f1576102cd565b80638da5cb5b1161012d5780638da5cb5b146108075780638ea5220f1461083157806395d89b411461085b578063a49a910f14610885578063a64e4f8a146108ad578063a901dd92146108d7576102cd565b8063757765f8146106fd5780637b812b41146107255780637f635cc01461076157806380faa3d21461078b5780638124f7ac146107b55780638b525903146107df576102cd565b806336884b6e11610233578063652e2f04116101ec5780636aa5b37f116101c65780636aa5b37f1461065957806370a0823114610683578063715018a6146106bf578063728d41c9146106d5576102cd565b8063652e2f04146105dd578063667f65261461060757806366a88d961461062f576102cd565b806336884b6e146104e757806341aea9de1461050f5780634a8c1fb4146105375780634f7041a514610561578063538ba4f91461058b5780635932ead1146105b5576102cd565b806323b872dd1161028557806323b872dd146103c7578063259827e31461040357806326991cc81461043f5780632dc0562d14610469578063313ce567146104935780633582ad23146104bd576102cd565b806306fdde03146102cf578063095ea7b3146102f95780630f15f4c014610335578063106a5a8f1461034b57806318160ddd146103735780631ecd7d6e1461039d576102cd565b5b005b3480156102da575f5ffd5b506102e3610b61565b6040516102f091906133e8565b60405180910390f35b348015610304575f5ffd5b5061031f600480360381019061031a919061349d565b610bf1565b60405161032c91906134f5565b60405180910390f35b348015610340575f5ffd5b50610349610c13565b005b348015610356575f5ffd5b50610371600480360381019061036c9190613599565b610cb9565b005b34801561037e575f5ffd5b50610387610d15565b6040516103949190613605565b60405180910390f35b3480156103a8575f5ffd5b506103b1610d1e565b6040516103be9190613605565b60405180910390f35b3480156103d2575f5ffd5b506103ed60048036038101906103e8919061361e565b610d24565b6040516103fa91906134f5565b60405180910390f35b34801561040e575f5ffd5b506104296004803603810190610424919061366e565b610d52565b60405161043691906134f5565b60405180910390f35b34801561044a575f5ffd5b50610453610d6f565b60405161046091906136a8565b60405180910390f35b348015610474575f5ffd5b5061047d610d93565b60405161048a91906136a8565b60405180910390f35b34801561049e575f5ffd5b506104a7610db8565b6040516104b491906136dc565b60405180910390f35b3480156104c8575f5ffd5b506104d1610dc0565b6040516104de91906134f5565b60405180910390f35b3480156104f2575f5ffd5b5061050d600480360381019061050891906136f5565b610dd3565b005b34801561051a575f5ffd5b5061053560048036038101906105309190613720565b610e78565b005b348015610542575f5ffd5b5061054b610ed4565b60405161055891906134f5565b60405180910390f35b34801561056c575f5ffd5b50610575610ee7565b6040516105829190613605565b60405180910390f35b348015610596575f5ffd5b5061059f610eed565b6040516105ac91906136a8565b60405180910390f35b3480156105c0575f5ffd5b506105db60048036038101906105d69190613720565b610ef1565b005b3480156105e8575f5ffd5b506105f1610f4d565b6040516105fe9190613605565b60405180910390f35b348015610612575f5ffd5b5061062d6004803603810190610628919061374b565b610f53565b005b34801561063a575f5ffd5b50610643610fe3565b6040516106509190613605565b60405180910390f35b348015610664575f5ffd5b5061066d610fe9565b60405161067a9190613605565b60405180910390f35b34801561068e575f5ffd5b506106a960048036038101906106a4919061366e565b610fef565b6040516106b69190613605565b60405180910390f35b3480156106ca575f5ffd5b506106d3611035565b005b3480156106e0575f5ffd5b506106fb60048036038101906106f691906136f5565b611048565b005b348015610708575f5ffd5b50610723600480360381019061071e91906136f5565b6110ed565b005b348015610730575f5ffd5b5061074b6004803603810190610746919061366e565b611192565b60405161075891906134f5565b60405180910390f35b34801561076c575f5ffd5b506107756111af565b6040516107829190613605565b60405180910390f35b348015610796575f5ffd5b5061079f6111b4565b6040516107ac9190613605565b60405180910390f35b3480156107c0575f5ffd5b506107c96111ba565b6040516107d69190613605565b60405180910390f35b3480156107ea575f5ffd5b50610805600480360381019061080091906136f5565b6111c0565b005b348015610812575f5ffd5b5061081b61124d565b60405161082891906136a8565b60405180910390f35b34801561083c575f5ffd5b50610845611274565b60405161085291906136a8565b60405180910390f35b348015610866575f5ffd5b5061086f611299565b60405161087c91906133e8565b60405180910390f35b348015610890575f5ffd5b506108ab60048036038101906108a691906136f5565b611329565b005b3480156108b8575f5ffd5b506108c161142e565b6040516108ce91906134f5565b60405180910390f35b3480156108e2575f5ffd5b506108fd60048036038101906108f89190613720565b611441565b005b34801561090a575f5ffd5b506109256004803603810190610920919061349d565b61149d565b60405161093291906134f5565b60405180910390f35b348015610946575f5ffd5b5061094f6114bf565b60405161095c91906134f5565b60405180910390f35b348015610970575f5ffd5b5061098b60048036038101906109869190613599565b6114d2565b005b348015610998575f5ffd5b506109b360048036038101906109ae919061366e565b61152e565b6040516109c091906134f5565b60405180910390f35b3480156109d4575f5ffd5b506109ef60048036038101906109ea9190613789565b61154b565b005b3480156109fc575f5ffd5b50610a056115e2565b604051610a129190613822565b60405180910390f35b348015610a26575f5ffd5b50610a416004803603810190610a3c919061366e565b611606565b005b348015610a4e575f5ffd5b50610a57611897565b604051610a649190613605565b60405180910390f35b348015610a78575f5ffd5b50610a8161189d565b604051610a8e9190613605565b60405180910390f35b348015610aa2575f5ffd5b50610abd6004803603810190610ab8919061366e565b6118a3565b604051610aca91906134f5565b60405180910390f35b348015610ade575f5ffd5b50610af96004803603810190610af4919061383b565b6118c0565b604051610b069190613605565b60405180910390f35b348015610b1a575f5ffd5b50610b356004803603810190610b30919061366e565b611942565b005b348015610b42575f5ffd5b50610b4b6119c6565b604051610b5891906136a8565b60405180910390f35b606060048054610b70906138a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9c906138a6565b8015610be75780601f10610bbe57610100808354040283529160200191610be7565b820191905f5260205f20905b815481529060010190602001808311610bca57829003601f168201915b5050505050905090565b5f5f610bfb6119cc565b9050610c088185856119d3565b600191505092915050565b610c1b6119e5565b600760189054906101000a900460ff1615610c62576040517fef65161f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600760186101000a81548160ff02191690831515021790555043600881905550426009819055507f6603428d483ce13b6662b7a6848d769996e12e801bed4b0f1b9e8d10f64d38ba60405160405180910390a1565b610cc16119e5565b5f5f90505b83839050811015610d0f57610d02848483818110610ce757610ce66138d6565b5b9050602002016020810190610cfc919061366e565b83611a6c565b8080600101915050610cc6565b50505050565b5f600354905090565b600e5481565b5f5f610d2e6119cc565b9050610d3b858285611afd565b610d46858585611b8f565b60019150509392505050565b6012602052805f5260405f205f915054906101000a900460ff1681565b7f0000000000000000000000003ec0799420ae06c105364b01da8f329830ffa49481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b600760149054906101000a900460ff1681565b610ddb6119e5565b6103e86002610de8610d15565b610df29190613930565b610dfc919061399e565b811015610e35576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c819055507f1f41d239159181ddefb13e99853e0e4998e0556aa1f2281281c783e309281062600c54604051610e6d9190613605565b60405180910390a150565b610e806119e5565b80600760146101000a81548160ff0219169083151502179055507f1da197dc3cab4eceaefd5d0c34df2ed3a08f20a207fb1910c0eceb361e2c965c81604051610ec991906134f5565b60405180910390a150565b600760189054906101000a900460ff1681565b600f5481565b5f81565b610ef96119e5565b80600760156101000a81548160ff0219169083151502179055507f6a53d6c83a7a55d7a07bd490493fceb559161cce588908714e497e54044777d981604051610f4291906134f5565b60405180910390a150565b600c5481565b610f5b6119e5565b6023821115610f96576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6023811115610fd1576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600f81905550806010819055505050565b600d5481565b600b5481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61103d6119e5565b6110465f611c7f565b565b6110506119e5565b6103e8600361105d610d15565b6110679190613930565b611071919061399e565b8110156110aa576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d819055507fe2e6151ed0b472c61401059745339ca42474813911b22d24023385def6377e1c600d546040516110e29190613605565b60405180910390a150565b6110f56119e5565b6103e86002611102610d15565b61110c9190613930565b611116919061399e565b81101561114f576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b819055507f85668e92bc538f5c140067d68e3375c65b9e4545d2822ec8d807c6782f747d62600b546040516111879190613605565b60405180910390a150565b6014602052805f5260405f205f915054906101000a900460ff1681565b602381565b60085481565b60115481565b6111c86119e5565b6023811115611203576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6011549050816011819055507f6a7b998a4adc393cb692c67fcd563e7971e2ea6f3fe7c9b8fb6dd53cf5b627d082826040516112419291906139ce565b60405180910390a15050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600580546112a8906138a6565b80601f01602080910402602001604051908101604052809291908181526020018280546112d4906138a6565b801561131f5780601f106112f65761010080835404028352916020019161131f565b820191905f5260205f20905b81548152906001019060200180831161130257829003601f168201915b5050505050905090565b6113316119e5565b5f61133a610d15565b9050620f424060018261134d9190613930565b611357919061399e565b821015611390576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e86005826113a09190613930565b6113aa919061399e565b8211156113e3576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600e54905082600e819055507f65a8c7442ea496b0a28890f1ef48a9819d1f5d747e9a8df155fe862dfd493c9583826040516114219291906139ce565b60405180910390a1505050565b600760169054906101000a900460ff1681565b6114496119e5565b80600760166101000a81548160ff0219169083151502179055507fa6a3dda702515d3130fef8b72d8e25f9aebd0d02e89d10d63c0c31d80b52f4a08160405161149291906134f5565b60405180910390a150565b5f5f6114a76119cc565b90506114b4818585611b8f565b600191505092915050565b600760159054906101000a900460ff1681565b6114da6119e5565b5f5f90505b838390508110156115285761151b848483818110611500576114ff6138d6565b5b9050602002016020810190611515919061366e565b83611cf5565b80806001019150506114df565b50505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b6115536119e5565b60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156115d4576040517f027106be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115de8282611d86565b5050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b61160e6119e5565b5f3390505f5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611729575f4791505f8211611683576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16826040516116a790613a22565b5f6040518083038185875af1925050503d805f81146116e1576040519150601f19603f3d011682016040523d82523d5f602084013e6116e6565b606091505b50508091505080611723576040517f81102ece00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611859565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161176291906136a8565b602060405180830381865afa15801561177d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a19190613a4a565b90505f81116117dc576040517ffba5154e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611817929190613a75565b6020604051808303815f875af1158015611833573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118579190613ab0565b505b7f7aba7eca7d870d5f2f93298379a43957082ef15cdcf64db1f7c731c6b3a2fa49838260405161188a929190613a75565b60405180910390a1505050565b60105481565b60095481565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61194a6119e5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119ba575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016119b191906136a8565b60405180910390fd5b6119c381611c7f565b50565b61dead81565b5f33905090565b6119e08383836001611e17565b505050565b6119ed6119cc565b73ffffffffffffffffffffffffffffffffffffffff16611a0b61124d565b73ffffffffffffffffffffffffffffffffffffffff1614611a6a57611a2e6119cc565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611a6191906136a8565b60405180910390fd5b565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f74392251b09500cc108c71712e5e7e0392be9075a74a24f1494551cfa8e068708282604051611af1929190613adb565b60405180910390a15050565b5f611b0884846118c0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b895781811015611b7a578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611b7193929190613b02565b60405180910390fd5b611b8884848484035f611e17565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bff575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611bf691906136a8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c6f575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611c6691906136a8565b60405180910390fd5b611c7a838383611fe6565b505050565b5f611c8861124d565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cd257611cc7815f611cf5565b611cd1815f611a6c565b5b611cdd826001611cf5565b611ce8826001611a6c565b611cf182612d03565b5050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb8282604051611d7a929190613adb565b60405180910390a15050565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f024f6c8d60a57c94822c46d989fd6935057590269281b07fe8327d7e9bc424218282604051611e0b929190613adb565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e87575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611e7e91906136a8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ef7575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611eee91906136a8565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611fe0578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611fd79190613605565b60405180910390a35b50505050565b5f3390505f32905060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561206f576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806120f0575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612126576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061218b57508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b806121dd575060125f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612213576040517fd18781b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760189054906101000a900460ff1680612274575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b806122c5575060145f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b6122fb576040517f037c597f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600760149054906101000a900460ff1680156123255750600760179054906101000a900460ff16155b80156123c9575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806123c7575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b90508015612993576123d961124d565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612447575061241761124d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561247f57505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156124b9575061dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561299257600760159054906101000a900460ff16156126dc577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561257b57507f0000000000000000000000003ec0799420ae06c105364b01da8f329830ffa49473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b156126db5760034361258d9190613b37565b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410801561262057506003436125e09190613b37565b60165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b612656576040517f53444d9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4360165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055504360165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612779575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561280e57600b548411156127ba576040517f89be121e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d546127c686610fef565b856127d19190613b6a565b1115612809576040517f76c7c05200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612991565b60155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156128ab575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156128f157600c548411156128ec576040517fa8e28e1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612990565b60145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661298f57600d5461294b86610fef565b856129569190613b6a565b111561298e576040517f76c7c05200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156129bd5750600760179054906101000a900460ff16155b8015612a61575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612a5f575060135f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b90508015612c5a575f5f905060155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612ac457505f601054115b15612aea57606460105487612ad99190613930565b612ae3919061399e565b9050612c36565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612b4157505f600f54115b15612b67576064600f5487612b569190613930565b612b60919061399e565b9050612c35565b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612c05575060155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612c1257505f601154115b15612c3457606460115487612c279190613930565b612c31919061399e565b90505b5b5b5f811115612c58578086612c4a9190613b37565b9550612c57883083612dc4565b5b505b5f612c6430610fef565b90505f600e548210159050828015612cc3575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612ccc5750805b15612ced57600a54431115612cec57612ce482612fe0565b43600a819055505b5b612cf8898989612dc4565b505050505050505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e14578060035f828254612e089190613b6a565b92505081905550612ee4565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612e9e578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e9593929190613b02565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f2b578060035f8282540392505081905550612f76565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612fd39190613605565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f5f600267ffffffffffffffff81111561301857613017613b9d565b5b6040519080825280602002602001820160405280156130465781602001602082028036833780820191505090505b50905030815f8151811061305d5761305c6138d6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613100573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131249190613bde565b81600181518110613138576131376138d6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e546131829190613930565b905080841115613190578093505b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b81526004016131f1959493929190613cf9565b5f604051808303815f87803b158015613208575f5ffd5b505af115801561321a573d5f5f3e3d5ffd5b505050505f4790505f600282613230919061399e565b90505f818361323f9190613b37565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161328690613a22565b5f6040518083038185875af1925050503d805f81146132c0576040519150601f19603f3d011682016040523d82523d5f602084013e6132c5565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161331090613a22565b5f6040518083038185875af1925050503d805f811461334a576040519150601f19603f3d011682016040523d82523d5f602084013e61334f565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6133ba82613378565b6133c48185613382565b93506133d4818560208601613392565b6133dd816133a0565b840191505092915050565b5f6020820190508181035f83015261340081846133b0565b905092915050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61343982613410565b9050919050565b6134498161342f565b8114613453575f5ffd5b50565b5f8135905061346481613440565b92915050565b5f819050919050565b61347c8161346a565b8114613486575f5ffd5b50565b5f8135905061349781613473565b92915050565b5f5f604083850312156134b3576134b2613408565b5b5f6134c085828601613456565b92505060206134d185828601613489565b9150509250929050565b5f8115159050919050565b6134ef816134db565b82525050565b5f6020820190506135085f8301846134e6565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261352f5761352e61350e565b5b8235905067ffffffffffffffff81111561354c5761354b613512565b5b60208301915083602082028301111561356857613567613516565b5b9250929050565b613578816134db565b8114613582575f5ffd5b50565b5f813590506135938161356f565b92915050565b5f5f5f604084860312156135b0576135af613408565b5b5f84013567ffffffffffffffff8111156135cd576135cc61340c565b5b6135d98682870161351a565b935093505060206135ec86828701613585565b9150509250925092565b6135ff8161346a565b82525050565b5f6020820190506136185f8301846135f6565b92915050565b5f5f5f6060848603121561363557613634613408565b5b5f61364286828701613456565b935050602061365386828701613456565b925050604061366486828701613489565b9150509250925092565b5f6020828403121561368357613682613408565b5b5f61369084828501613456565b91505092915050565b6136a28161342f565b82525050565b5f6020820190506136bb5f830184613699565b92915050565b5f60ff82169050919050565b6136d6816136c1565b82525050565b5f6020820190506136ef5f8301846136cd565b92915050565b5f6020828403121561370a57613709613408565b5b5f61371784828501613489565b91505092915050565b5f6020828403121561373557613734613408565b5b5f61374284828501613585565b91505092915050565b5f5f6040838503121561376157613760613408565b5b5f61376e85828601613489565b925050602061377f85828601613489565b9150509250929050565b5f5f6040838503121561379f5761379e613408565b5b5f6137ac85828601613456565b92505060206137bd85828601613585565b9150509250929050565b5f819050919050565b5f6137ea6137e56137e084613410565b6137c7565b613410565b9050919050565b5f6137fb826137d0565b9050919050565b5f61380c826137f1565b9050919050565b61381c81613802565b82525050565b5f6020820190506138355f830184613813565b92915050565b5f5f6040838503121561385157613850613408565b5b5f61385e85828601613456565b925050602061386f85828601613456565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806138bd57607f821691505b6020821081036138d0576138cf613879565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61393a8261346a565b91506139458361346a565b92508282026139538161346a565b9150828204841483151761396a57613969613903565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6139a88261346a565b91506139b38361346a565b9250826139c3576139c2613971565b5b828204905092915050565b5f6040820190506139e15f8301856135f6565b6139ee60208301846135f6565b9392505050565b5f81905092915050565b50565b5f613a0d5f836139f5565b9150613a18826139ff565b5f82019050919050565b5f613a2c82613a02565b9150819050919050565b5f81519050613a4481613473565b92915050565b5f60208284031215613a5f57613a5e613408565b5b5f613a6c84828501613a36565b91505092915050565b5f604082019050613a885f830185613699565b613a9560208301846135f6565b9392505050565b5f81519050613aaa8161356f565b92915050565b5f60208284031215613ac557613ac4613408565b5b5f613ad284828501613a9c565b91505092915050565b5f604082019050613aee5f830185613699565b613afb60208301846134e6565b9392505050565b5f606082019050613b155f830186613699565b613b2260208301856135f6565b613b2f60408301846135f6565b949350505050565b5f613b418261346a565b9150613b4c8361346a565b9250828203905081811115613b6457613b63613903565b5b92915050565b5f613b748261346a565b9150613b7f8361346a565b9250828201905080821115613b9757613b96613903565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050613bd881613440565b92915050565b5f60208284031215613bf357613bf2613408565b5b5f613c0084828501613bca565b91505092915050565b5f819050919050565b5f613c2c613c27613c2284613c09565b6137c7565b61346a565b9050919050565b613c3c81613c12565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613c748161342f565b82525050565b5f613c858383613c6b565b60208301905092915050565b5f602082019050919050565b5f613ca782613c42565b613cb18185613c4c565b9350613cbc83613c5c565b805f5b83811015613cec578151613cd38882613c7a565b9750613cde83613c91565b925050600181019050613cbf565b5085935050505092915050565b5f60a082019050613d0c5f8301886135f6565b613d196020830187613c33565b8181036040830152613d2b8186613c9d565b9050613d3a6060830185613699565b613d4760808301846135f6565b969550505050505056fea2646970667358221220775e7148817c86ebd09d34d38adc3d294247274a68c51dcf8d92e083f8e1a9b164736f6c634300081c0033
Deployed Bytecode Sourcemap
26369:13465:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13127:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15445:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31169:240;;;;;;;;;;;;;:::i;:::-;;33765:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14229:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27117:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16238:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27244:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26583:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26623:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14080:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26687:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32087:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31417:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26816:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27152:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26464:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31564:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27045:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32979:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27079:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27012:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14391:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24983:103;;;;;;;;;;;;;:::i;:::-;;32320:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31858:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27353:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26961:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26848:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27209:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33240:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24308:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26654:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13337:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32561:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26753:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31717:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14714:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26719:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33520:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27410:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34014:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26411:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34192:677;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27180:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26885:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27298:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14959:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25241:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26520:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13127:91;13172:13;13205:5;13198:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13127:91;:::o;15445:215::-;15543:4;15560:13;15576:12;:10;:12::i;:::-;15560:28;;15599:31;15608:5;15615:7;15624:5;15599:8;:31::i;:::-;15648:4;15641:11;;;15445:215;;;;:::o;31169:240::-;24194:13;:11;:13::i;:::-;31228:11:::1;;;;;;;;;;;31227:12;31219:41;;;;;;;;;;;;;;;;;31285:4;31271:11;;:18;;;;;;;;;;;;;;;;;;31318:12;31300:15;:30;;;;31358:15;31341:14;:32;;;;31389:12;;;;;;;;;;31169:240::o:0;33765:241::-;24194:13;:11;:13::i;:::-;33893:9:::1;33905:1;33893:13;;33888:111;33912:8;;:15;;33908:1;:19;33888:111;;;33949:38;33968:8;;33977:1;33968:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;33981:5;33949:18;:38::i;:::-;33929:3;;;;;;;33888:111;;;;33765:241:::0;;;:::o;14229:99::-;14281:7;14308:12;;14301:19;;14229:99;:::o;27117:28::-;;;;:::o;16238:283::-;16359:4;16376:15;16394:12;:10;:12::i;:::-;16376:30;;16417:37;16433:4;16439:7;16448:5;16417:15;:37::i;:::-;16465:26;16475:4;16481:2;16485:5;16465:9;:26::i;:::-;16509:4;16502:11;;;16238:283;;;;;:::o;27244:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;26583:33::-;;;:::o;26623:24::-;;;;;;;;;;;;;:::o;14080:84::-;14129:5;14154:2;14147:9;;14080:84;:::o;26687:25::-;;;;;;;;;;;;;:::o;32087:225::-;24194:13;:11;:13::i;:::-;32199:4:::1;32194:1;32178:13;:11;:13::i;:::-;:17;;;;:::i;:::-;32177:26;;;;:::i;:::-;32166:6;:38;;32158:65;;;;;;;;;;;;;;;;;32249:6;32234:12;:21;;;;32271:33;32291:12;;32271:33;;;;;;:::i;:::-;;;;;;;;32087:225:::0;:::o;31417:139::-;24194:13;:11;:13::i;:::-;31501:5:::1;31485:13;;:21;;;;;;;;;;;;;;;;;;31522:26;31542:5;31522:26;;;;;;:::i;:::-;;;;;;;;31417:139:::0;:::o;26816:23::-;;;;;;;;;;;;;:::o;27152:21::-;;;;:::o;26464:49::-;26511:1;26464:49;:::o;31564:145::-;24194:13;:11;:13::i;:::-;31652:5:::1;31634:15;;:23;;;;;;;;;;;;;;;;;;31673:28;31695:5;31673:28;;;;;;:::i;:::-;;;;;;;;31564:145:::0;:::o;27045:27::-;;;;:::o;32979:253::-;24194:13;:11;:13::i;:::-;27001:2:::1;33068:7;:24;;33060:47;;;;;;;;;;;;;;;;;27001:2;33126:8;:25;;33118:48;;;;;;;;;;;;;;;;;33188:7;33179:6;:16;;;;33216:8;33206:7;:18;;;;32979:253:::0;;:::o;27079:29::-;;;;:::o;27012:26::-;;;;:::o;14391:118::-;14456:7;14483:9;:18;14493:7;14483:18;;;;;;;;;;;;;;;;14476:25;;14391:118;;;:::o;24983:103::-;24194:13;:11;:13::i;:::-;25048:30:::1;25075:1;25048:18;:30::i;:::-;24983:103::o:0;32320:233::-;24194:13;:11;:13::i;:::-;32434:4:::1;32429:1;32413:13;:11;:13::i;:::-;:17;;;;:::i;:::-;32412:26;;;;:::i;:::-;32401:6;:38;;32393:65;;;;;;;;;;;;;;;;;32486:6;32469:14;:23;;;;32508:37;32530:14;;32508:37;;;;;;:::i;:::-;;;;;;;;32320:233:::0;:::o;31858:221::-;24194:13;:11;:13::i;:::-;31969:4:::1;31964:1;31948:13;:11;:13::i;:::-;:17;;;;:::i;:::-;31947:26;;;;:::i;:::-;31936:6;:38;;31928:65;;;;;;;;;;;;;;;;;32018:6;32004:11;:20;;;;32040:31;32059:11;;32040:31;;;;;;:::i;:::-;;;;;;;;31858:221:::0;:::o;27353:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;26961:42::-;27001:2;26961:42;:::o;26848:30::-;;;;:::o;27209:26::-;;;;:::o;33240:272::-;24194:13;:11;:13::i;:::-;27001:2:::1;33324:12;:29;;33316:52;;;;;;;;;;;;;;;;;33379:16;33398:11;;33379:30;;33434:12;33420:11;:26;;;;33462:42;33481:12;33495:8;33462:42;;;;;;;:::i;:::-;;;;;;;;33305:207;33240:272:::0;:::o;24308:87::-;24354:7;24381:6;;;;;;;;;;;24374:13;;24308:87;:::o;26654:24::-;;;;;;;;;;;;;:::o;13337:95::-;13384:13;13417:7;13410:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13337:95;:::o;32561:410::-;24194:13;:11;:13::i;:::-;32633:25:::1;32661:13;:11;:13::i;:::-;32633:41;;32729:7;32724:1;32704:17;:21;;;;:::i;:::-;32703:33;;;;:::i;:::-;32693:6;:43;;32685:70;;;;;;;;;;;;;;;;;32810:4;32805:1;32785:17;:21;;;;:::i;:::-;32784:30;;;;:::i;:::-;32774:6;:40;;32766:67;;;;;;;;;;;;;;;;;32844:16;32863:13;;32844:32;;32903:6;32887:13;:22;;;;32925:38;32946:6;32954:8;32925:38;;;;;;;:::i;:::-;;;;;;;;32622:349;;32561:410:::0;:::o;26753:23::-;;;;;;;;;;;;;:::o;31717:133::-;24194:13;:11;:13::i;:::-;31797:5:::1;31783:11;;:19;;;;;;;;;;;;;;;;;;31818:24;31836:5;31818:24;;;;;;:::i;:::-;;;;;;;;31717:133:::0;:::o;14714:182::-;14783:4;14800:13;14816:12;:10;:12::i;:::-;14800:28;;14839:27;14849:5;14856:2;14860:5;14839:9;:27::i;:::-;14884:4;14877:11;;;14714:182;;;;:::o;26719:27::-;;;;;;;;;;;;;:::o;33520:237::-;24194:13;:11;:13::i;:::-;33646:9:::1;33658:1;33646:13;;33641:109;33665:8;;:15;;33661:1;:19;33641:109;;;33702:36;33719:8;;33728:1;33719:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;33732:5;33702:16;:36::i;:::-;33682:3;;;;;;;33641:109;;;;33520:237:::0;;;:::o;27410:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;34014:170::-;24194:13;:11;:13::i;:::-;34102:11:::1;:17;34114:4;34102:17;;;;;;;;;;;;;;;;;;;;;;;;;34101:18;34093:45;;;;;;;;;;;;;;;;;34149:27;34164:4;34170:5;34149:14;:27::i;:::-;34014:170:::0;;:::o;26411:44::-;;;:::o;34192:677::-;24194:13;:11;:13::i;:::-;34267::::1;34283:10;34267:26;;34304:14;26511:1;34333:22;;:6;:22;;::::0;34329:481:::1;;34372:12;34408:21;34399:30;;34461:1;34452:6;:10;34444:38;;;;;;;;;;;;;;;;;34519:5;34511:19;;34538:6;34511:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34497:52;;;;;34572:7;34564:39;;;;;;;;;;;;;;;;;34357:258;34329:481;;;34652:6;34645:24;;;34678:4;34645:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34636:48;;34716:1;34707:6;:10;34699:41;;;;;;;;;;;;;;;;;34762:6;34755:23;;;34779:10;34791:6;34755:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34329:481;34825:36;34846:6;34854;34825:36;;;;;;;:::i;:::-;;;;;;;;34256:613;;34192:677:::0;:::o;27180:22::-;;;;:::o;26885:29::-;;;;:::o;27298:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;14959:167::-;15064:7;15091:11;:18;15103:5;15091:18;;;;;;;;;;;;;;;:27;15110:7;15091:27;;;;;;;;;;;;;;;;15084:34;;14959:167;;;;:::o;25241:220::-;24194:13;:11;:13::i;:::-;25346:1:::1;25326:22;;:8;:22;;::::0;25322:93:::1;;25400:1;25372:31;;;;;;;;;;;:::i;:::-;;;;;;;;25322:93;25425:28;25444:8;25425:18;:28::i;:::-;25241:220:::0;:::o;26520:54::-;26567:6;26520:54;:::o;4342:98::-;4395:7;4422:10;4415:17;;4342:98;:::o;20331:130::-;20416:37;20425:5;20432:7;20441:5;20448:4;20416:8;:37::i;:::-;20331:130;;;:::o;24473:166::-;24544:12;:10;:12::i;:::-;24533:23;;:7;:5;:7::i;:::-;:23;;;24529:103;;24607:12;:10;:12::i;:::-;24580:40;;;;;;;;;;;:::i;:::-;;;;;;;;24529:103;24473:166::o;39482:178::-;39597:5;39567:18;:27;39586:7;39567:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;39618:34;39637:7;39646:5;39618:34;;;;;;;:::i;:::-;;;;;;;;39482:178;;:::o;22090:603::-;22224:24;22251:25;22261:5;22268:7;22251:9;:25::i;:::-;22224:52;;22311:17;22291:16;:37;22287:399;;22368:5;22349:16;:24;22345:214;;;22450:7;22480:16;22519:5;22401:142;;;;;;;;;;;;;:::i;:::-;;;;;;;;22345:214;22602:57;22611:5;22618:7;22646:5;22627:16;:24;22653:5;22602:8;:57::i;:::-;22287:399;22213:480;22090:603;;;:::o;16906:308::-;17006:1;16990:18;;:4;:18;;;16986:88;;17059:1;17032:30;;;;;;;;;;;:::i;:::-;;;;;;;;16986:88;17102:1;17088:16;;:2;:16;;;17084:88;;17157:1;17128:32;;;;;;;;;;;:::i;:::-;;;;;;;;17084:88;17182:24;17190:4;17196:2;17200:5;17182:7;:24::i;:::-;16906:308;;;:::o;30769:392::-;30844:16;30863:7;:5;:7::i;:::-;30844:26;;26511:1;30885:24;;:8;:24;;;30881:140;;30926:33;30943:8;30953:5;30926:16;:33::i;:::-;30974:35;30993:8;31003:5;30974:18;:35::i;:::-;30881:140;31031:32;31048:8;31058:4;31031:16;:32::i;:::-;31074:34;31093:8;31103:4;31074:18;:34::i;:::-;31119;31144:8;31119:24;:34::i;:::-;30833:328;30769:392;:::o;39302:172::-;39413:5;39385:16;:25;39402:7;39385:25;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;39434:32;39451:7;39460:5;39434:32;;;;;;;:::i;:::-;;;;;;;;39302:172;;:::o;39668:163::-;39766:5;39746:11;:17;39758:4;39746:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;39787:36;39811:4;39817:5;39787:36;;;;;;;:::i;:::-;;;;;;;;39668:163;;:::o;21312:486::-;21485:1;21468:19;;:5;:19;;;21464:91;;21540:1;21511:32;;;;;;;;;;;:::i;:::-;;;;;;;;21464:91;21588:1;21569:21;;:7;:21;;;21565:92;;21642:1;21614:31;;;;;;;;;;;:::i;:::-;;;;;;;;21565:92;21697:5;21667:11;:18;21679:5;21667:18;;;;;;;;;;;;;;;:27;21686:7;21667:27;;;;;;;;;;;;;;;:35;;;;21717:9;21713:78;;;21764:7;21748:31;;21757:5;21748:31;;;21773:5;21748:31;;;;;;:::i;:::-;;;;;;;;21713:78;21312:486;;;;:::o;34877:3497::-;35007:14;35024:10;35007:27;;35045:14;35062:9;35045:26;;35093:15;:21;35109:4;35093:21;;;;;;;;;;;;;;;;;;;;;;;;;35092:22;35084:54;;;;;;;;;;;;;;;;;35181:4;35171:14;;:6;:14;;;:42;;;;35190:15;:23;35206:6;35190:23;;;;;;;;;;;;;;;;;;;;;;;;;35189:24;35171:42;35149:111;;;;;;;;;;;;;;;;;35303:4;35293:14;;:6;:14;;;:34;;;;35321:6;35311:16;;:6;:16;;;35293:34;:62;;;;35332:15;:23;35348:6;35332:23;;;;;;;;;;;;;;;;;;;;;;;;;35331:24;35293:62;35271:131;;;;;;;;;;;;;;;;;35437:11;;;;;;;;;;;:39;;;;35452:18;:24;35471:4;35452:24;;;;;;;;;;;;;;;;;;;;;;;;;35437:39;:65;;;;35480:18;:22;35499:2;35480:22;;;;;;;;;;;;;;;;;;;;;;;;;35437:65;35415:127;;;;;;;;;;;;;;;;;35555:16;35574:13;;;;;;;;;;;:44;;;;;35605:13;;;;;;;;;;;35604:14;35574:44;:114;;;;;35637:18;:24;35656:4;35637:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;35665:18;:22;35684:2;35665:22;;;;;;;;;;;;;;;;;;;;;;;;;35637:50;35635:53;35574:114;35555:133;;35703:11;35699:1487;;;35761:7;:5;:7::i;:::-;35753:15;;:4;:15;;;;:49;;;;;35795:7;:5;:7::i;:::-;35789:13;;:2;:13;;;;35753:49;:88;;;;;26511:1;35823:18;;:2;:18;;;;35753:88;:127;;;;;26567:6;35862:18;;:2;:18;;;;35753:127;35731:1444;;;35919:15;;;;;;;;;;;35915:532;;;35977:10;35963:25;;:2;:25;;;;:43;;;;;35998:8;35992:14;;:2;:14;;;;35963:43;35959:469;;;36117:1;36102:12;:16;;;;:::i;:::-;36073:18;:26;36092:6;36073:26;;;;;;;;;;;;;;;;:45;:123;;;;;36195:1;36180:12;:16;;;;:::i;:::-;36155:18;:22;36174:2;36155:22;;;;;;;;;;;;;;;;:41;36073:123;36035:237;;;;;;;;;;;;;;;;;36328:12;36299:18;:26;36318:6;36299:26;;;;;;;;;;;;;;;:41;;;;36392:12;36367:18;:22;36386:2;36367:22;;;;;;;;;;;;;;;:37;;;;35959:469;35915:532;36471:11;:17;36483:4;36471:17;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;;36493:18;:22;36512:2;36493:22;;;;;;;;;;;;;;;;;;;;;;;;;36492:23;36471:44;36467:693;;;36558:11;;36548:6;:21;;36540:52;;;;;;;;;;;;;;;;;36675:14;;36658:13;36668:2;36658:9;:13::i;:::-;36649:6;:22;;;;:::i;:::-;:40;;36615:147;;;;;;;;;;;;;;;;;36467:693;;;36792:11;:15;36804:2;36792:15;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;;36812:18;:24;36831:4;36812:24;;;;;;;;;;;;;;;;;;;;;;;;;36811:25;36792:44;36788:372;;;36879:12;;36869:6;:22;;36861:54;;;;;;;;;;;;;;;;;36788:372;;;36946:18;:22;36965:2;36946:22;;;;;;;;;;;;;;;;;;;;;;;;;36941:219;;37053:14;;37036:13;37046:2;37036:9;:13::i;:::-;37027:6;:22;;;;:::i;:::-;:40;;36993:147;;;;;;;;;;;;;;;;;36941:219;36788:372;36467:693;35731:1444;35699:1487;37198:13;37214:11;;;;;;;;;;;:42;;;;;37243:13;;;;;;;;;;;37242:14;37214:42;:108;;;;;37275:16;:22;37292:4;37275:22;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;37301:16;:20;37318:2;37301:20;;;;;;;;;;;;;;;;;;;;;;;;;37275:46;37273:49;37214:108;37198:124;;37339:8;37335:625;;;37364:17;37384:1;37364:21;;37404:11;:15;37416:2;37404:15;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;;37433:1;37423:7;;:11;37404:30;37400:396;;;37488:3;37477:7;;37468:6;:16;;;;:::i;:::-;37467:24;;;;:::i;:::-;37455:36;;37400:396;;;37517:11;:17;37529:4;37517:17;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;;;37547:1;37538:6;;:10;37517:31;37513:283;;;37601:3;37591:6;;37582;:15;;;;:::i;:::-;37581:23;;;;:::i;:::-;37569:35;;37513:283;;;37649:11;:15;37661:2;37649:15;;;;;;;;;;;;;;;;;;;;;;;;;37648:16;:38;;;;;37669:11;:17;37681:4;37669:17;;;;;;;;;;;;;;;;;;;;;;;;;37668:18;37648:38;:57;;;;;37704:1;37690:11;;:15;37648:57;37626:170;;;37777:3;37762:11;;37753:6;:20;;;;:::i;:::-;37752:28;;;;:::i;:::-;37740:40;;37626:170;37513:283;37400:396;37828:1;37816:9;:13;37812:137;;;37860:9;37850:19;;;;;:::i;:::-;;;37888:45;37902:4;37916;37923:9;37888:13;:45::i;:::-;37812:137;37349:611;37335:625;37972:28;38003:24;38021:4;38003:9;:24::i;:::-;37972:55;;38038:12;38077:13;;38053:20;:37;;38038:52;;38105:8;:30;;;;;38118:11;:17;38130:4;38118:17;;;;;;;;;;;;;;;;;;;;;;;;;38117:18;38105:30;:41;;;;;38139:7;38105:41;38101:222;;;38182:13;;38167:12;:28;38163:149;;;38216:33;38228:20;38216:11;:33::i;:::-;38284:12;38268:13;:28;;;;38163:149;38101:222;38335:31;38349:4;38355:2;38359:6;38335:13;:31::i;:::-;34996:3378;;;;;;34877:3497;;;:::o;25621:191::-;25695:16;25714:6;;;;;;;;;;;25695:25;;25740:8;25731:6;;:17;;;;;;;;;;;;;;;;;;25795:8;25764:40;;25785:8;25764:40;;;;;;;;;;;;25684:128;25621:191;:::o;17538:1135::-;17644:1;17628:18;;:4;:18;;;17624:552;;17782:5;17766:12;;:21;;;;;;;:::i;:::-;;;;;;;;17624:552;;;17820:19;17842:9;:15;17852:4;17842:15;;;;;;;;;;;;;;;;17820:37;;17890:5;17876:11;:19;17872:117;;;17948:4;17954:11;17967:5;17923:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;17872:117;18144:5;18130:11;:19;18112:9;:15;18122:4;18112:15;;;;;;;;;;;;;;;:37;;;;17805:371;17624:552;18206:1;18192:16;;:2;:16;;;18188:435;;18374:5;18358:12;;:21;;;;;;;;;;;18188:435;;;18591:5;18574:9;:13;18584:2;18574:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;18188:435;18655:2;18640:25;;18649:4;18640:25;;;18659:5;18640:25;;;;;;:::i;:::-;;;;;;;;17538:1135;;;:::o;38382:912::-;29065:4;29049:13;;:20;;;;;;;;;;;;;;;;;;38468:12:::1;38491:21;38529:1;38515:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38491:40;;38560:4;38542;38547:1;38542:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;38586:10;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38576:4;38581:1;38576:7;;;;;;;;:::i;:::-;;;;;;;:27;;;;;;;;;::::0;::::1;38616:21;38656:2;38640:13;;:18;;;;:::i;:::-;38616:42;;38689:13;38675:11;:27;38671:87;;;38733:13;38719:27;;38671:87;38770:10;:61;;;38846:11;38872:1;38888:4;38915;38935:15;38770:191;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38974:18;38995:21;38974:42;;39029:21;39066:1;39053:10;:14;;;;:::i;:::-;39029:38;;39078:25;39119:13;39106:10;:26;;;;:::i;:::-;39078:54;;39167:9;;;;;;;;;;;39159:23;;39190:13;39159:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39145:63;;;;;39241:9;;;;;;;;;;;39233:23;;39264:17;39233:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39219:67;;;;;38457:837;;;;;;29108:5:::0;29092:13;;:21;;;;;;;;;;;;;;;;;;38382:912;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1446:117;1555:1;1552;1545:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:117::-;3448:1;3445;3438:12;3462:117;3571:1;3568;3561:12;3585:117;3694:1;3691;3684:12;3725:568;3798:8;3808:6;3858:3;3851:4;3843:6;3839:17;3835:27;3825:122;;3866:79;;:::i;:::-;3825:122;3979:6;3966:20;3956:30;;4009:18;4001:6;3998:30;3995:117;;;4031:79;;:::i;:::-;3995:117;4145:4;4137:6;4133:17;4121:29;;4199:3;4191:4;4183:6;4179:17;4169:8;4165:32;4162:41;4159:128;;;4206:79;;:::i;:::-;4159:128;3725:568;;;;;:::o;4299:116::-;4369:21;4384:5;4369:21;:::i;:::-;4362:5;4359:32;4349:60;;4405:1;4402;4395:12;4349:60;4299:116;:::o;4421:133::-;4464:5;4502:6;4489:20;4480:29;;4518:30;4542:5;4518:30;:::i;:::-;4421:133;;;;:::o;4560:698::-;4652:6;4660;4668;4717:2;4705:9;4696:7;4692:23;4688:32;4685:119;;;4723:79;;:::i;:::-;4685:119;4871:1;4860:9;4856:17;4843:31;4901:18;4893:6;4890:30;4887:117;;;4923:79;;:::i;:::-;4887:117;5036:80;5108:7;5099:6;5088:9;5084:22;5036:80;:::i;:::-;5018:98;;;;4814:312;5165:2;5191:50;5233:7;5224:6;5213:9;5209:22;5191:50;:::i;:::-;5181:60;;5136:115;4560:698;;;;;:::o;5264:118::-;5351:24;5369:5;5351:24;:::i;:::-;5346:3;5339:37;5264:118;;:::o;5388:222::-;5481:4;5519:2;5508:9;5504:18;5496:26;;5532:71;5600:1;5589:9;5585:17;5576:6;5532:71;:::i;:::-;5388:222;;;;:::o;5616:619::-;5693:6;5701;5709;5758:2;5746:9;5737:7;5733:23;5729:32;5726:119;;;5764:79;;:::i;:::-;5726:119;5884:1;5909:53;5954:7;5945:6;5934:9;5930:22;5909:53;:::i;:::-;5899:63;;5855:117;6011:2;6037:53;6082:7;6073:6;6062:9;6058:22;6037:53;:::i;:::-;6027:63;;5982:118;6139:2;6165:53;6210:7;6201:6;6190:9;6186:22;6165:53;:::i;:::-;6155:63;;6110:118;5616:619;;;;;:::o;6241:329::-;6300:6;6349:2;6337:9;6328:7;6324:23;6320:32;6317:119;;;6355:79;;:::i;:::-;6317:119;6475:1;6500:53;6545:7;6536:6;6525:9;6521:22;6500:53;:::i;:::-;6490:63;;6446:117;6241:329;;;;:::o;6576:118::-;6663:24;6681:5;6663:24;:::i;:::-;6658:3;6651:37;6576:118;;:::o;6700:222::-;6793:4;6831:2;6820:9;6816:18;6808:26;;6844:71;6912:1;6901:9;6897:17;6888:6;6844:71;:::i;:::-;6700:222;;;;:::o;6928:86::-;6963:7;7003:4;6996:5;6992:16;6981:27;;6928:86;;;:::o;7020:112::-;7103:22;7119:5;7103:22;:::i;:::-;7098:3;7091:35;7020:112;;:::o;7138:214::-;7227:4;7265:2;7254:9;7250:18;7242:26;;7278:67;7342:1;7331:9;7327:17;7318:6;7278:67;:::i;:::-;7138:214;;;;:::o;7358:329::-;7417:6;7466:2;7454:9;7445:7;7441:23;7437:32;7434:119;;;7472:79;;:::i;:::-;7434:119;7592:1;7617:53;7662:7;7653:6;7642:9;7638:22;7617:53;:::i;:::-;7607:63;;7563:117;7358:329;;;;:::o;7693:323::-;7749:6;7798:2;7786:9;7777:7;7773:23;7769:32;7766:119;;;7804:79;;:::i;:::-;7766:119;7924:1;7949:50;7991:7;7982:6;7971:9;7967:22;7949:50;:::i;:::-;7939:60;;7895:114;7693:323;;;;:::o;8022:474::-;8090:6;8098;8147:2;8135:9;8126:7;8122:23;8118:32;8115:119;;;8153:79;;:::i;:::-;8115:119;8273:1;8298:53;8343:7;8334:6;8323:9;8319:22;8298:53;:::i;:::-;8288:63;;8244:117;8400:2;8426:53;8471:7;8462:6;8451:9;8447:22;8426:53;:::i;:::-;8416:63;;8371:118;8022:474;;;;;:::o;8502:468::-;8567:6;8575;8624:2;8612:9;8603:7;8599:23;8595:32;8592:119;;;8630:79;;:::i;:::-;8592:119;8750:1;8775:53;8820:7;8811:6;8800:9;8796:22;8775:53;:::i;:::-;8765:63;;8721:117;8877:2;8903:50;8945:7;8936:6;8925:9;8921:22;8903:50;:::i;:::-;8893:60;;8848:115;8502:468;;;;;:::o;8976:60::-;9004:3;9025:5;9018:12;;8976:60;;;:::o;9042:142::-;9092:9;9125:53;9143:34;9152:24;9170:5;9152:24;:::i;:::-;9143:34;:::i;:::-;9125:53;:::i;:::-;9112:66;;9042:142;;;:::o;9190:126::-;9240:9;9273:37;9304:5;9273:37;:::i;:::-;9260:50;;9190:126;;;:::o;9322:150::-;9396:9;9429:37;9460:5;9429:37;:::i;:::-;9416:50;;9322:150;;;:::o;9478:179::-;9589:61;9644:5;9589:61;:::i;:::-;9584:3;9577:74;9478:179;;:::o;9663:270::-;9780:4;9818:2;9807:9;9803:18;9795:26;;9831:95;9923:1;9912:9;9908:17;9899:6;9831:95;:::i;:::-;9663:270;;;;:::o;9939:474::-;10007:6;10015;10064:2;10052:9;10043:7;10039:23;10035:32;10032:119;;;10070:79;;:::i;:::-;10032:119;10190:1;10215:53;10260:7;10251:6;10240:9;10236:22;10215:53;:::i;:::-;10205:63;;10161:117;10317:2;10343:53;10388:7;10379:6;10368:9;10364:22;10343:53;:::i;:::-;10333:63;;10288:118;9939:474;;;;;:::o;10419:180::-;10467:77;10464:1;10457:88;10564:4;10561:1;10554:15;10588:4;10585:1;10578:15;10605:320;10649:6;10686:1;10680:4;10676:12;10666:22;;10733:1;10727:4;10723:12;10754:18;10744:81;;10810:4;10802:6;10798:17;10788:27;;10744:81;10872:2;10864:6;10861:14;10841:18;10838:38;10835:84;;10891:18;;:::i;:::-;10835:84;10656:269;10605:320;;;:::o;10931:180::-;10979:77;10976:1;10969:88;11076:4;11073:1;11066:15;11100:4;11097:1;11090:15;11117:180;11165:77;11162:1;11155:88;11262:4;11259:1;11252:15;11286:4;11283:1;11276:15;11303:410;11343:7;11366:20;11384:1;11366:20;:::i;:::-;11361:25;;11400:20;11418:1;11400:20;:::i;:::-;11395:25;;11455:1;11452;11448:9;11477:30;11495:11;11477:30;:::i;:::-;11466:41;;11656:1;11647:7;11643:15;11640:1;11637:22;11617:1;11610:9;11590:83;11567:139;;11686:18;;:::i;:::-;11567:139;11351:362;11303:410;;;;:::o;11719:180::-;11767:77;11764:1;11757:88;11864:4;11861:1;11854:15;11888:4;11885:1;11878:15;11905:185;11945:1;11962:20;11980:1;11962:20;:::i;:::-;11957:25;;11996:20;12014:1;11996:20;:::i;:::-;11991:25;;12035:1;12025:35;;12040:18;;:::i;:::-;12025:35;12082:1;12079;12075:9;12070:14;;11905:185;;;;:::o;12096:332::-;12217:4;12255:2;12244:9;12240:18;12232:26;;12268:71;12336:1;12325:9;12321:17;12312:6;12268:71;:::i;:::-;12349:72;12417:2;12406:9;12402:18;12393:6;12349:72;:::i;:::-;12096:332;;;;;:::o;12434:147::-;12535:11;12572:3;12557:18;;12434:147;;;;:::o;12587:114::-;;:::o;12707:398::-;12866:3;12887:83;12968:1;12963:3;12887:83;:::i;:::-;12880:90;;12979:93;13068:3;12979:93;:::i;:::-;13097:1;13092:3;13088:11;13081:18;;12707:398;;;:::o;13111:379::-;13295:3;13317:147;13460:3;13317:147;:::i;:::-;13310:154;;13481:3;13474:10;;13111:379;;;:::o;13496:143::-;13553:5;13584:6;13578:13;13569:22;;13600:33;13627:5;13600:33;:::i;:::-;13496:143;;;;:::o;13645:351::-;13715:6;13764:2;13752:9;13743:7;13739:23;13735:32;13732:119;;;13770:79;;:::i;:::-;13732:119;13890:1;13915:64;13971:7;13962:6;13951:9;13947:22;13915:64;:::i;:::-;13905:74;;13861:128;13645:351;;;;:::o;14002:332::-;14123:4;14161:2;14150:9;14146:18;14138:26;;14174:71;14242:1;14231:9;14227:17;14218:6;14174:71;:::i;:::-;14255:72;14323:2;14312:9;14308:18;14299:6;14255:72;:::i;:::-;14002:332;;;;;:::o;14340:137::-;14394:5;14425:6;14419:13;14410:22;;14441:30;14465:5;14441:30;:::i;:::-;14340:137;;;;:::o;14483:345::-;14550:6;14599:2;14587:9;14578:7;14574:23;14570:32;14567:119;;;14605:79;;:::i;:::-;14567:119;14725:1;14750:61;14803:7;14794:6;14783:9;14779:22;14750:61;:::i;:::-;14740:71;;14696:125;14483:345;;;;:::o;14834:320::-;14949:4;14987:2;14976:9;14972:18;14964:26;;15000:71;15068:1;15057:9;15053:17;15044:6;15000:71;:::i;:::-;15081:66;15143:2;15132:9;15128:18;15119:6;15081:66;:::i;:::-;14834:320;;;;;:::o;15160:442::-;15309:4;15347:2;15336:9;15332:18;15324:26;;15360:71;15428:1;15417:9;15413:17;15404:6;15360:71;:::i;:::-;15441:72;15509:2;15498:9;15494:18;15485:6;15441:72;:::i;:::-;15523;15591:2;15580:9;15576:18;15567:6;15523:72;:::i;:::-;15160:442;;;;;;:::o;15608:194::-;15648:4;15668:20;15686:1;15668:20;:::i;:::-;15663:25;;15702:20;15720:1;15702:20;:::i;:::-;15697:25;;15746:1;15743;15739:9;15731:17;;15770:1;15764:4;15761:11;15758:37;;;15775:18;;:::i;:::-;15758:37;15608:194;;;;:::o;15808:191::-;15848:3;15867:20;15885:1;15867:20;:::i;:::-;15862:25;;15901:20;15919:1;15901:20;:::i;:::-;15896:25;;15944:1;15941;15937:9;15930:16;;15965:3;15962:1;15959:10;15956:36;;;15972:18;;:::i;:::-;15956:36;15808:191;;;;:::o;16005:180::-;16053:77;16050:1;16043:88;16150:4;16147:1;16140:15;16174:4;16171:1;16164:15;16191:143;16248:5;16279:6;16273:13;16264:22;;16295:33;16322:5;16295:33;:::i;:::-;16191:143;;;;:::o;16340:351::-;16410:6;16459:2;16447:9;16438:7;16434:23;16430:32;16427:119;;;16465:79;;:::i;:::-;16427:119;16585:1;16610:64;16666:7;16657:6;16646:9;16642:22;16610:64;:::i;:::-;16600:74;;16556:128;16340:351;;;;:::o;16697:85::-;16742:7;16771:5;16760:16;;16697:85;;;:::o;16788:158::-;16846:9;16879:61;16897:42;16906:32;16932:5;16906:32;:::i;:::-;16897:42;:::i;:::-;16879:61;:::i;:::-;16866:74;;16788:158;;;:::o;16952:147::-;17047:45;17086:5;17047:45;:::i;:::-;17042:3;17035:58;16952:147;;:::o;17105:114::-;17172:6;17206:5;17200:12;17190:22;;17105:114;;;:::o;17225:184::-;17324:11;17358:6;17353:3;17346:19;17398:4;17393:3;17389:14;17374:29;;17225:184;;;;:::o;17415:132::-;17482:4;17505:3;17497:11;;17535:4;17530:3;17526:14;17518:22;;17415:132;;;:::o;17553:108::-;17630:24;17648:5;17630:24;:::i;:::-;17625:3;17618:37;17553:108;;:::o;17667:179::-;17736:10;17757:46;17799:3;17791:6;17757:46;:::i;:::-;17835:4;17830:3;17826:14;17812:28;;17667:179;;;;:::o;17852:113::-;17922:4;17954;17949:3;17945:14;17937:22;;17852:113;;;:::o;18001:732::-;18120:3;18149:54;18197:5;18149:54;:::i;:::-;18219:86;18298:6;18293:3;18219:86;:::i;:::-;18212:93;;18329:56;18379:5;18329:56;:::i;:::-;18408:7;18439:1;18424:284;18449:6;18446:1;18443:13;18424:284;;;18525:6;18519:13;18552:63;18611:3;18596:13;18552:63;:::i;:::-;18545:70;;18638:60;18691:6;18638:60;:::i;:::-;18628:70;;18484:224;18471:1;18468;18464:9;18459:14;;18424:284;;;18428:14;18724:3;18717:10;;18125:608;;;18001:732;;;;:::o;18739:831::-;19002:4;19040:3;19029:9;19025:19;19017:27;;19054:71;19122:1;19111:9;19107:17;19098:6;19054:71;:::i;:::-;19135:80;19211:2;19200:9;19196:18;19187:6;19135:80;:::i;:::-;19262:9;19256:4;19252:20;19247:2;19236:9;19232:18;19225:48;19290:108;19393:4;19384:6;19290:108;:::i;:::-;19282:116;;19408:72;19476:2;19465:9;19461:18;19452:6;19408:72;:::i;:::-;19490:73;19558:3;19547:9;19543:19;19534:6;19490:73;:::i;:::-;18739:831;;;;;;;;:::o
Swarm Source
ipfs://775e7148817c86ebd09d34d38adc3d294247274a68c51dcf8d92e083f8e1a9b1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.