ERC-20
Overview
Max Total Supply
10,000,000 ADAO
Holders
63
Market
Price
$0.00 @ 0.000000 MATIC
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
AntidoteDAO
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-02-18 */ /** *Submitted for verification at polygonscan.com on 2022-02-18 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /* * @dev Standard math utilities missing in the Solidity language. */ library Math { function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a / b; return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return b == 0 ? ~uint104(0) : a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } /** * @dev Collection of functions related to array types. */ library Arrays { /** * @dev Searches a sorted `array` and returns the first index that contains * a value greater or equal to `element`. If no such index exists (i.e. all * values in the array are strictly less than `element`), the array length is * returned. Time complexity O(log n). * * `array` is expected to be sorted in ascending order, and to contain no * repeated elements. */ function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { if (array.length == 0) { return 0; } uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); // Note that mid will always be strictly less than high (i.e. it will be a valid array index) // because Math.average rounds down (it does integer division with truncation). if (array[mid] > element) { high = mid; } else { low = mid + 1; } } // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. if (low > 0 && array[low - 1] == element) { return low - 1; } else { return low; } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @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 Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); } /* * @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; } } /** * @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}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of 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. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { using Math for uint256; 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}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * 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 override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 value {ERC20} uses, unless this function is * 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 override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); 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}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * 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. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance.sub(amount); } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` 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. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } /** * @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. * * By default, the owner account will be the one that deploys the contract. 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; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) internal { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } abstract contract ERC20Snapshot is ERC20 { // Inspired by Jordi Baylina's MiniMeToken to record historical balances: // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol using Arrays for uint256[]; using Counters for Counters.Counter; // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a // Snapshot struct, but that would impede usage of functions that work on an array. struct Snapshots { uint256[] ids; uint256[] values; } mapping(address => Snapshots) private _accountBalanceSnapshots; Snapshots private _totalSupplySnapshots; // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid. Counters.Counter private _currentSnapshotId; /** * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created. */ event Snapshot(uint256 id); /** * @dev Creates a new snapshot and returns its snapshot id. * * Emits a {Snapshot} event that contains the same id. * * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a * set of accounts, for example using {AccessControl}, or it may be open to the public. * * [WARNING] * ==== * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking, * you must consider that it can potentially be used by attackers in two ways. * * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs * section above. * * We haven't measured the actual numbers; if this is something you're interested in please reach out to us. * ==== */ function _snapshot() internal virtual returns (uint256) { _currentSnapshotId.increment(); uint256 currentId = _getCurrentSnapshotId(); emit Snapshot(currentId); return currentId; } /** * @dev Get the current snapshotId */ function _getCurrentSnapshotId() internal view virtual returns (uint256) { return _currentSnapshotId.current(); } /** * @dev Retrieves the balance of `account` at the time `snapshotId` was created. */ function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); return snapshotted ? value : balanceOf(account); } /** * @dev Retrieves the total supply at the time `snapshotId` was created. */ function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); return snapshotted ? value : totalSupply(); } // Update balance and/or total supply snapshots before the values are modified. This is implemented // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations. function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // mint _updateAccountSnapshot(to); _updateTotalSupplySnapshot(); } else if (to == address(0)) { // burn _updateAccountSnapshot(from); _updateTotalSupplySnapshot(); } else { // transfer _updateAccountSnapshot(from); _updateAccountSnapshot(to); } } function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { require(snapshotId > 0, "ERC20Snapshot: id is 0"); require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id"); // When a valid snapshot is queried, there are three possibilities: // a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never // created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds // to this id is the current one. // b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the // requested id, and its value is the one to return. // c) More snapshots were created after the requested one, and the queried value was later modified. There will be // no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is // larger than the requested one. // // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does // exactly this. uint256 index = snapshots.ids.findUpperBound(snapshotId); if (index == snapshots.ids.length) { return (false, 0); } else { return (true, snapshots.values[index]); } } function _updateAccountSnapshot(address account) private { _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account)); } function _updateTotalSupplySnapshot() private { _updateSnapshot(_totalSupplySnapshots, totalSupply()); } function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private { uint256 currentId = _getCurrentSnapshotId(); if (_lastSnapshotId(snapshots.ids) < currentId) { snapshots.ids.push(currentId); snapshots.values.push(currentValue); } } function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) { if (ids.length == 0) { return 0; } else { return ids[ids.length - 1]; } } } contract AntidoteDAO is ERC20, ERC20Snapshot, Ownable, Pausable { using Math for uint256; uint256 private initialSupply; uint256 private denominator = 100; uint256 private swapThreshold = 0.0000005 ether; // The contract will only swap to ETH, once the fee tokens reach the specified threshold uint256 private devTaxBuy; uint256 private marketingTaxBuy; uint256 private liquidityTaxBuy; uint256 private charityTaxBuy; uint256 private devTaxSell; uint256 private marketingTaxSell; uint256 private liquidityTaxSell; uint256 private charityTaxSell; address private devTaxWallet; address private marketingTaxWallet; address private liquidityTaxWallet; address private charityTaxWallet; address[] internal stakeholders; address private QUICKSWAP_ROUTER = address(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff); mapping (address => bool) private blacklist; mapping (address => bool) private excludeList; mapping (string => uint256) private buyTaxes; mapping (string => uint256) private sellTaxes; mapping (string => address) private taxWallets; // Tax disabled on deploy bool public taxStatus = false; IUniswapV2Router02 private uniswapV2Router02; IUniswapV2Factory private uniswapV2Factory; IUniswapV2Pair private uniswapV2Pair; constructor() ERC20("AntidoteDAO","ADAO") { initialSupply = 10000000 * (10**18); _setOwner(_msgSender()); uniswapV2Router02 = IUniswapV2Router02(QUICKSWAP_ROUTER); uniswapV2Factory = IUniswapV2Factory(uniswapV2Router02.factory()); uniswapV2Pair = IUniswapV2Pair(uniswapV2Factory.createPair(address(this), uniswapV2Router02.WETH())); setBuyTax(0,0,0,0); setSellTax(0,0,0,0); setTaxWallets( _msgSender(), _msgSender(), _msgSender(), _msgSender()); exclude(_msgSender()); exclude(address(this)); _mint(_msgSender(), initialSupply); } uint256 private marketingTokens; uint256 private devTokens; uint256 private liquidityTokens; uint256 private charityTokens; /** * @dev Calculates the tax, transfer it to the contract. If the user is selling, and the swap threshold is met, it executes the tax. */ function handleTax(address from, address to, uint256 amount) private returns (uint256) { address[] memory sellPath = new address[](2); sellPath[0] = address(this); sellPath[1] = uniswapV2Router02.WETH(); if(!isExcluded(from) && !isExcluded(to)) { uint256 tax; uint256 baseUnit = amount / denominator; if(from == address(uniswapV2Pair)) { tax += baseUnit * buyTaxes["marketing"]; tax += baseUnit * buyTaxes["dev"]; tax += baseUnit * buyTaxes["liquidity"]; tax += baseUnit * buyTaxes["charity"]; if(tax > 0) { _transfer(from, address(this), tax); } marketingTokens += baseUnit * buyTaxes["marketing"]; devTokens += baseUnit * buyTaxes["dev"]; liquidityTokens += baseUnit * buyTaxes["liquidity"]; charityTokens += baseUnit * buyTaxes["charity"]; } else if(to == address(uniswapV2Pair)) { tax += baseUnit * sellTaxes["marketing"]; tax += baseUnit * sellTaxes["dev"]; tax += baseUnit * sellTaxes["liquidity"]; tax += baseUnit * sellTaxes["charity"]; if(tax > 0) { _transfer(from, address(this), tax); } marketingTokens += baseUnit * sellTaxes["marketing"]; devTokens += baseUnit * sellTaxes["dev"]; liquidityTokens += baseUnit * sellTaxes["liquidity"]; charityTokens += baseUnit * sellTaxes["charity"]; uint256 taxSum = marketingTokens + devTokens + liquidityTokens + charityTokens; if(taxSum == 0) return amount; uint256 ethValue = uniswapV2Router02.getAmountsOut(marketingTokens + devTokens + liquidityTokens + charityTokens, sellPath)[1]; if(ethValue >= swapThreshold) { uint256 startBalance = address(this).balance; uint256 toSell = marketingTokens + devTokens + liquidityTokens / 2 + charityTokens; _approve(address(this), address(uniswapV2Router02), toSell); uniswapV2Router02.swapExactTokensForETH( toSell, 0, sellPath, address(this), block.timestamp ); uint256 ethGained = address(this).balance - startBalance; uint256 liquidityToken = liquidityTokens / 2; uint256 liquidityETH = (ethGained * ((liquidityTokens / 2 * 10**18) / taxSum)) / 10**18; uint256 marketingETH = (ethGained * ((marketingTokens * 10**18) / taxSum)) / 10**18; uint256 devETH = (ethGained * ((devTokens * 10**18) / taxSum)) / 10**18; uint256 charityETH = (ethGained * ((charityTokens * 10**18) / taxSum)) / 10**18; _approve(address(this), address(uniswapV2Router02), liquidityToken); (uint amountToken,,) = uniswapV2Router02.addLiquidityETH{value: liquidityETH}( address(this), liquidityToken, 0, 0, taxWallets["liquidity"], block.timestamp ); uint256 remainingTokens = (marketingTokens + devTokens + liquidityTokens + charityTokens) - (toSell + amountToken); if(remainingTokens > 0) { _transfer(address(this), taxWallets["dev"], remainingTokens); } bool _ok; (_ok,) = taxWallets["marketing"].call{value: marketingETH}(""); (_ok,) = taxWallets["dev"].call{value: devETH}(""); (_ok,) = taxWallets["charity"].call{value: charityETH}(""); if(ethGained - (marketingETH + devETH + liquidityETH + charityETH) > 0) { (_ok,) = taxWallets["marketing"].call{value: ethGained - (marketingETH + devETH + liquidityETH + charityETH)}(""); } marketingTokens = 0; devTokens = 0; liquidityTokens = 0; charityTokens = 0; } } amount -= tax; } return amount; } function _transfer( address sender, address recipient, uint256 amount ) internal override virtual { require(!paused(), "AntidoteDAO: token transfer while paused"); require(!isBlacklisted(msg.sender), "AntidoteDAO: sender blacklisted"); require(!isBlacklisted(recipient), "AntidoteDAO: recipient blacklisted"); require(!isBlacklisted(tx.origin), "AntidoteDAO: sender blacklisted"); if(taxStatus) { amount = handleTax(sender, recipient, amount); } super._transfer(sender, recipient, amount); } /** * @dev Triggers the tax handling functionality */ function triggerTax() public onlyOwner { handleTax(address(0), address(uniswapV2Pair), 0); } /** * @dev Pauses transfers on the token. */ function pause() public onlyOwner { require(!paused(), "AntidoteDAO: Contract is already paused"); _pause(); } /** * @dev Unpauses transfers on the token. */ function unpause() public onlyOwner { require(paused(), "AntidoteDAO: Contract is not paused"); _unpause(); } /** * @dev Burns tokens from caller address. */ function burn(uint256 amount) public { _burn(_msgSender(), amount); } /** * @dev Blacklists the specified account (Disables transfers to and from the account). */ function enableBlacklist(address account) public onlyOwner { require(!blacklist[account], "AntidoteDAO: Account is already blacklisted"); blacklist[account] = true; } /** * @dev Remove the specified account from the blacklist. */ function disableBlacklist(address account) public onlyOwner { require(blacklist[account], "AntidoteDAO: Account is not blacklisted"); blacklist[account] = false; } /** * @dev Excludes the specified account from tax. */ function exclude(address account) public onlyOwner { require(!isExcluded(account), "AntidoteDAO: Account is already excluded"); excludeList[account] = true; } /** * @dev Re-enables tax on the specified account. */ function removeExclude(address account) public onlyOwner { require(isExcluded(account), "AntidoteDAO: Account is not excluded"); excludeList[account] = false; } /** * @dev Sets tax for buys. */ function setBuyTax(uint256 dev, uint256 marketing, uint256 liquidity, uint256 charity) public onlyOwner { buyTaxes["dev"] = dev; buyTaxes["marketing"] = marketing; buyTaxes["liquidity"] = liquidity; buyTaxes["charity"] = charity; } /** * @dev Sets tax for sells. */ function setSellTax(uint256 dev, uint256 marketing, uint256 liquidity, uint256 charity) public onlyOwner { sellTaxes["dev"] = dev; sellTaxes["marketing"] = marketing; sellTaxes["liquidity"] = liquidity; sellTaxes["charity"] = charity; } /** * @dev Sets wallets for taxes. */ function setTaxWallets(address liq, address dev, address marketing, address charity) public onlyOwner { taxWallets["liquidity"] = liq; taxWallets["dev"] = dev; taxWallets["marketing"] = marketing; taxWallets["charity"] = charity; } /** * @dev Enables tax globally. */ function enableTax() public onlyOwner { require(!taxStatus, "AntidoteDAO: Tax is already enabled"); taxStatus = true; } /** * @dev Disables tax globally. */ function disableTax() public onlyOwner { require(taxStatus, "AntidoteDAO: Tax is already disabled"); taxStatus = false; } /** * @dev Returns true if the account is blacklisted, and false otherwise. */ function isBlacklisted(address account) public view returns (bool) { return blacklist[account]; } /** * @dev Returns true if the account is excluded, and false otherwise. */ function isExcluded(address account) public view returns (bool) { return excludeList[account]; } function snapshot() public onlyOwner { _snapshot(); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Snapshot) { super._beforeTokenTransfer(from, to, amount); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":"amount","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":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"disableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"exclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeExclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dev","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"charity","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dev","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"charity","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liq","type":"address"},{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"charity","type":"address"}],"name":"setTaxWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","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":"triggerTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526064600b5564746a528800600c5573a5e0829caced8ffdd4de3c43696c57f7d7a678ff601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000602060006101000a81548160ff0219169083151502179055503480156200008f57600080fd5b506040518060400160405280600b81526020017f416e7469646f746544414f0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4144414f00000000000000000000000000000000000000000000000000000000815250816003908051906020019062000114929190620010ad565b5080600490805190602001906200012d929190620010ad565b5050506000600960146101000a81548160ff0219169083151502179055506a084595161401484a000000600a819055506200017d620001716200053260201b60201c565b6200053a60201b60201c565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200024957600080fd5b505afa1580156200025e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000284919062001174565b602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9c6539630602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036c57600080fd5b505afa15801562000381573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a7919062001174565b6040518363ffffffff1660e01b8152600401620003c692919062001412565b602060405180830381600087803b158015620003e157600080fd5b505af1158015620003f6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041c919062001174565b602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004726000806000806200060060201b60201c565b620004886000806000806200072160201b60201c565b620004d86200049c6200053260201b60201c565b620004ac6200053260201b60201c565b620004bc6200053260201b60201c565b620004cc6200053260201b60201c565b6200084260201b60201c565b620004f8620004ec6200053260201b60201c565b62000a4b60201b60201c565b620005093062000a4b60201b60201c565b6200052c6200051d6200053260201b60201c565b600a5462000b8960201b60201c565b62001662565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620006106200053260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200063662000d0260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200068f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006869062001461565b60405180910390fd5b83601d604051620006a090620013cd565b90815260200160405180910390208190555082601d604051620006c390620013e4565b90815260200160405180910390208190555081601d604051620006e690620013fb565b90815260200160405180910390208190555080601d6040516200070990620013b6565b90815260200160405180910390208190555050505050565b620007316200053260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200075762000d0260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620007b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a79062001461565b60405180910390fd5b83601e604051620007c190620013cd565b90815260200160405180910390208190555082601e604051620007e490620013e4565b90815260200160405180910390208190555081601e6040516200080790620013fb565b90815260200160405180910390208190555080601e6040516200082a90620013b6565b90815260200160405180910390208190555050505050565b620008526200053260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200087862000d0260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620008d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008c89062001461565b60405180910390fd5b83601f604051620008e290620013fb565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f6040516200093f90620013cd565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601f6040516200099c90620013e4565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601f604051620009f990620013b6565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b62000a5b6200053260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000a8162000d0260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ad19062001461565b60405180910390fd5b62000aeb8162000d2c60201b60201c565b1562000b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b25906200143f565b60405180910390fd5b6001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000bf39062001483565b60405180910390fd5b62000c106000838362000d8260201b60201c565b806002600082825462000c249190620014de565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000c7b9190620014de565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000ce29190620014a5565b60405180910390a362000cfe6000838362000d9f60201b60201c565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b62000d9a83838362000da460201b62001d8e1760201c565b505050565b505050565b62000dbc83838362000e9f60201b62001e481760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000e195762000e038262000ea460201b60201c565b62000e1362000f0760201b60201c565b62000e9a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000e765762000e608362000ea460201b60201c565b62000e7062000f0760201b60201c565b62000e99565b62000e878362000ea460201b60201c565b62000e988262000ea460201b60201c565b5b5b505050565b505050565b62000f04600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000ef88362000f2b60201b60201c565b62000f7360201b60201c565b50565b62000f29600662000f1d62000fff60201b60201c565b62000f7360201b60201c565b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600062000f856200100960201b60201c565b90508062000f9c846000016200102760201b60201c565b101562000ffa5782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b6000600254905090565b60006200102260086200109f60201b62001e4d1760201c565b905090565b600080828054905014156200104057600090506200109a565b81600183805490506200105491906200153b565b815481106200108c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490505b919050565b600081600001549050919050565b828054620010bb90620015b4565b90600052602060002090601f016020900481019282620010df57600085556200112b565b82601f10620010fa57805160ff19168380011785556200112b565b828001600101855582156200112b579182015b828111156200112a5782518255916020019190600101906200110d565b5b5090506200113a91906200113e565b5090565b5b80821115620011595760008160009055506001016200113f565b5090565b6000815190506200116e8162001648565b92915050565b6000602082840312156200118757600080fd5b600062001197848285016200115d565b91505092915050565b620011ab8162001576565b82525050565b6000620011c0602883620014c2565b91507f416e7469646f746544414f3a204163636f756e7420697320616c72656164792060008301527f6578636c756465640000000000000000000000000000000000000000000000006020830152604082019050919050565b600062001228600783620014d3565b91507f63686172697479000000000000000000000000000000000000000000000000006000830152600782019050919050565b60006200126a600383620014d3565b91507f64657600000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b6000620012ac600983620014d3565b91507f6d61726b6574696e6700000000000000000000000000000000000000000000006000830152600982019050919050565b6000620012ee602083620014c2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600062001330600983620014d3565b91507f6c697175696469747900000000000000000000000000000000000000000000006000830152600982019050919050565b600062001372601f83620014c2565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b620013b081620015aa565b82525050565b6000620013c38262001219565b9150819050919050565b6000620013da826200125b565b9150819050919050565b6000620013f1826200129d565b9150819050919050565b6000620014088262001321565b9150819050919050565b6000604082019050620014296000830185620011a0565b620014386020830184620011a0565b9392505050565b600060208201905081810360008301526200145a81620011b1565b9050919050565b600060208201905081810360008301526200147c81620012df565b9050919050565b600060208201905081810360008301526200149e8162001363565b9050919050565b6000602082019050620014bc6000830184620013a5565b92915050565b600082825260208201905092915050565b600081905092915050565b6000620014eb82620015aa565b9150620014f883620015aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001530576200152f620015ea565b5b828201905092915050565b60006200154882620015aa565b91506200155583620015aa565b9250828210156200156b576200156a620015ea565b5b828203905092915050565b600062001583826200158a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620015cd57607f821691505b60208210811415620015e457620015e362001619565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620016538162001576565b81146200165f57600080fd5b50565b61542680620016726000396000f3fe6080604052600436106101fd5760003560e01c8063717a86511161010d578063a82cfe8b116100a0578063ced695a41161006f578063ced695a414610704578063cfefd79e1461071b578063dd62ed3e14610744578063f2fde38b14610781578063fe575a87146107aa57610204565b8063a82cfe8b14610638578063a9059cbb14610661578063abe4f11d1461069e578063cba0e996146106c757610204565b806395d89b41116100dc57806395d89b411461057c5780639711715a146105a7578063981b24d0146105be578063a457c2d7146105fb57610204565b8063717a8651146104e85780638456cb591461051157806384666b08146105285780638da5cb5b1461055157610204565b80633f4ba83a1161019057806353eb3bcf1161015f57806353eb3bcf146104295780635c975abb14610440578063677ef8461461046b57806370a0823114610494578063715018a6146104d157610204565b80633f4ba83a1461038357806342966c681461039a5780634ee2cd7e146103c35780634febf53d1461040057610204565b806323b872dd116101cc57806323b872dd146102c75780632c32abc214610304578063313ce5671461031b578063395093511461034657610204565b806306fdde0314610209578063095ea7b31461023457806318160ddd1461027157806323a38a381461029c57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e6107e7565b60405161022b9190614c2a565b60405180910390f35b34801561024057600080fd5b5061025b60048036038101906102569190613e37565b610879565b6040516102689190614c0f565b60405180910390f35b34801561027d57600080fd5b50610286610897565b6040516102939190614f8c565b60405180910390f35b3480156102a857600080fd5b506102b16108a1565b6040516102be9190614c0f565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e99190613de8565b6108b4565b6040516102fb9190614c0f565b60405180910390f35b34801561031057600080fd5b506103196109ac565b005b34801561032757600080fd5b50610330610a5a565b60405161033d9190615031565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190613e37565b610a63565b60405161037a9190614c0f565b60405180910390f35b34801561038f57600080fd5b50610398610b0f565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190613eb4565b610bdc565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613e37565b610bf0565b6040516103f79190614f8c565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190613cf7565b610c60565b005b34801561043557600080fd5b5061043e610d80565b005b34801561044c57600080fd5b50610455610e69565b6040516104629190614c0f565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190613d85565b610e80565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613cf7565b61106e565b6040516104c89190614f8c565b60405180910390f35b3480156104dd57600080fd5b506104e66110b6565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190613cf7565b61113e565b005b34801561051d57600080fd5b506105266112a2565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613f2c565b611370565b005b34801561055d57600080fd5b50610566611476565b6040516105739190614b93565b60405180910390f35b34801561058857600080fd5b506105916114a0565b60405161059e9190614c2a565b60405180910390f35b3480156105b357600080fd5b506105bc611532565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190613eb4565b6115b9565b6040516105f29190614f8c565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613e37565b6115ea565b60405161062f9190614c0f565b60405180910390f35b34801561064457600080fd5b5061065f600480360381019061065a9190613f2c565b6116d5565b005b34801561066d57600080fd5b5061068860048036038101906106839190613e37565b6117db565b6040516106959190614c0f565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613cf7565b6117f9565b005b3480156106d357600080fd5b506106ee60048036038101906106e99190613cf7565b611918565b6040516106fb9190614c0f565b60405180910390f35b34801561071057600080fd5b5061071961196e565b005b34801561072757600080fd5b50610742600480360381019061073d9190613cf7565b611a56565b005b34801561075057600080fd5b5061076b60048036038101906107669190613d49565b611bb9565b6040516107789190614f8c565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190613cf7565b611c40565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613cf7565b611d38565b6040516107de9190614c0f565b60405180910390f35b6060600380546107f6906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610822906152c3565b801561086f5780601f106108445761010080835404028352916020019161086f565b820191906000526020600020905b81548152906001019060200180831161085257829003601f168201915b5050505050905090565b600061088d610886611e5b565b8484611e63565b6001905092915050565b6000600254905090565b602060009054906101000a900460ff1681565b60006108c184848461202e565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061090c611e5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390614e8c565b60405180910390fd5b6109a085610998611e5b565b858403611e63565b60019150509392505050565b6109b4611e5b565b73ffffffffffffffffffffffffffffffffffffffff166109d2611476565b73ffffffffffffffffffffffffffffffffffffffff1614610a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1f90614eac565b60405180910390fd5b610a576000602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612184565b50565b60006012905090565b6000610b05610a70611e5b565b848460016000610a7e611e5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b009190615114565b611e63565b6001905092915050565b610b17611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610b35611476565b73ffffffffffffffffffffffffffffffffffffffff1614610b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8290614eac565b60405180910390fd5b610b93610e69565b610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990614dec565b60405180910390fd5b610bda613116565b565b610bed610be7611e5b565b826131b8565b50565b6000806000610c3d84600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061339f565b9150915081610c5457610c4f8561106e565b610c56565b805b9250505092915050565b610c68611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610c86611476565b73ffffffffffffffffffffffffffffffffffffffff1614610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390614eac565b60405180910390fd5b610ce581611918565b15610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90614cac565b60405180910390fd5b6001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d88611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610da6611476565b73ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390614eac565b60405180910390fd5b602060009054906101000a900460ff1615610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390614d0c565b60405180910390fd5b6001602060006101000a81548160ff021916908315150217905550565b6000600960149054906101000a900460ff16905090565b610e88611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610ea6611476565b73ffffffffffffffffffffffffffffffffffffffff1614610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390614eac565b60405180910390fd5b83601f604051610f0b90614b69565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f604051610f6690614b3f565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601f604051610fc190614b54565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601f60405161101c90614b2a565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110be611e5b565b73ffffffffffffffffffffffffffffffffffffffff166110dc611476565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614eac565b60405180910390fd5b61113c60006134bb565b565b611146611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611164611476565b73ffffffffffffffffffffffffffffffffffffffff16146111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b190614eac565b60405180910390fd5b601b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90614ccc565b60405180910390fd5b6001601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6112aa611e5b565b73ffffffffffffffffffffffffffffffffffffffff166112c8611476565b73ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590614eac565b60405180910390fd5b611326610e69565b15611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d90614dac565b60405180910390fd5b61136e613581565b565b611378611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611396611476565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390614eac565b60405180910390fd5b83601e6040516113fb90614b3f565b90815260200160405180910390208190555082601e60405161141c90614b54565b90815260200160405180910390208190555081601e60405161143d90614b69565b90815260200160405180910390208190555080601e60405161145e90614b2a565b90815260200160405180910390208190555050505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546114af906152c3565b80601f01602080910402602001604051908101604052809291908181526020018280546114db906152c3565b80156115285780601f106114fd57610100808354040283529160200191611528565b820191906000526020600020905b81548152906001019060200180831161150b57829003601f168201915b5050505050905090565b61153a611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611558611476565b73ffffffffffffffffffffffffffffffffffffffff16146115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590614eac565b60405180910390fd5b6115b6613624565b50565b60008060006115c984600661339f565b91509150816115df576115da610897565b6115e1565b805b92505050919050565b600080600160006115f9611e5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90614f6c565b60405180910390fd5b6116ca6116c1611e5b565b85858403611e63565b600191505092915050565b6116dd611e5b565b73ffffffffffffffffffffffffffffffffffffffff166116fb611476565b73ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890614eac565b60405180910390fd5b83601d60405161176090614b3f565b90815260200160405180910390208190555082601d60405161178190614b54565b90815260200160405180910390208190555081601d6040516117a290614b69565b90815260200160405180910390208190555080601d6040516117c390614b2a565b90815260200160405180910390208190555050505050565b60006117ef6117e8611e5b565b848461202e565b6001905092915050565b611801611e5b565b73ffffffffffffffffffffffffffffffffffffffff1661181f611476565b73ffffffffffffffffffffffffffffffffffffffff1614611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c90614eac565b60405180910390fd5b61187e81611918565b6118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b490614e4c565b60405180910390fd5b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611976611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611994611476565b73ffffffffffffffffffffffffffffffffffffffff16146119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e190614eac565b60405180910390fd5b602060009054906101000a900460ff16611a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3090614d4c565b60405180910390fd5b6000602060006101000a81548160ff021916908315150217905550565b611a5e611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611a7c611476565b73ffffffffffffffffffffffffffffffffffffffff1614611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac990614eac565b60405180910390fd5b601b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5590614e2c565b60405180910390fd5b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611c48611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611c66611476565b73ffffffffffffffffffffffffffffffffffffffff1614611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614eac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614d6c565b60405180910390fd5b611d35816134bb565b50565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611d99838383611e48565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611de457611dd78261367a565b611ddf6136cd565b611e43565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e2f57611e228361367a565b611e2a6136cd565b611e42565b611e388361367a565b611e418261367a565b5b5b505050565b505050565b600081600001549050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eca90614f0c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614d8c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120219190614f8c565b60405180910390a3505050565b612036610e69565b15612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90614d2c565b60405180910390fd5b61207f33611d38565b156120bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b690614f2c565b60405180910390fd5b6120c882611d38565b15612108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ff90614e6c565b60405180910390fd5b61211132611d38565b15612151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214890614f2c565b60405180910390fd5b602060009054906101000a900460ff161561217457612171838383612184565b90505b61217f8383836136e1565b505050565b600080600267ffffffffffffffff8111156121c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156121f65781602001602082028036833780820191505090505b5090503081600081518110612234577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156122d657600080fd5b505afa1580156122ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230e9190613d20565b81600181518110612348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061238b85611918565b15801561239e575061239c84611918565b155b1561310a57600080600b54856123b4919061516a565b9050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156125fa57601d60405161241a90614b54565b90815260200160405180910390205481612434919061519b565b8261243f9190615114565b9150601d60405161244f90614b3f565b90815260200160405180910390205481612469919061519b565b826124749190615114565b9150601d60405161248490614b69565b9081526020016040518091039020548161249e919061519b565b826124a99190615114565b9150601d6040516124b990614b2a565b908152602001604051809103902054816124d3919061519b565b826124de9190615114565b915060008211156124f5576124f487308461202e565b5b601d60405161250390614b54565b9081526020016040518091039020548161251d919061519b565b6023600082825461252e9190615114565b92505081905550601d60405161254390614b3f565b9081526020016040518091039020548161255d919061519b565b6024600082825461256e9190615114565b92505081905550601d60405161258390614b69565b9081526020016040518091039020548161259d919061519b565b602560008282546125ae9190615114565b92505081905550601d6040516125c390614b2a565b908152602001604051809103902054816125dd919061519b565b602660008282546125ee9190615114565b925050819055506130f9565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156130f857601e60405161265e90614b54565b90815260200160405180910390205481612678919061519b565b826126839190615114565b9150601e60405161269390614b3f565b908152602001604051809103902054816126ad919061519b565b826126b89190615114565b9150601e6040516126c890614b69565b908152602001604051809103902054816126e2919061519b565b826126ed9190615114565b9150601e6040516126fd90614b2a565b90815260200160405180910390205481612717919061519b565b826127229190615114565b915060008211156127395761273887308461202e565b5b601e60405161274790614b54565b90815260200160405180910390205481612761919061519b565b602360008282546127729190615114565b92505081905550601e60405161278790614b3f565b908152602001604051809103902054816127a1919061519b565b602460008282546127b29190615114565b92505081905550601e6040516127c790614b69565b908152602001604051809103902054816127e1919061519b565b602560008282546127f29190615114565b92505081905550601e60405161280790614b2a565b90815260200160405180910390205481612821919061519b565b602660008282546128329190615114565b9250508190555060006026546025546024546023546128519190615114565b61285b9190615114565b6128659190615114565b9050600081141561287c578594505050505061310f565b6000602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f6026546025546024546023546128d29190615114565b6128dc9190615114565b6128e69190615114565b876040518363ffffffff1660e01b8152600401612904929190614fa7565b60006040518083038186803b15801561291c57600080fd5b505afa158015612930573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906129599190613e73565b600181518110612992577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600c5481106130f5576000479050600060265460026025546129be919061516a565b6024546023546129ce9190615114565b6129d89190615114565b6129e29190615114565b9050612a1130602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e63565b602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe58260008a30426040518663ffffffff1660e01b8152600401612a75959493929190614fd7565b600060405180830381600087803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612acc9190613e73565b5060008247612adb91906151f5565b905060006002602554612aee919061516a565b90506000670de0b6b3a764000087670de0b6b3a76400006002602554612b14919061516a565b612b1e919061519b565b612b28919061516a565b84612b33919061519b565b612b3d919061516a565b90506000670de0b6b3a764000088670de0b6b3a7640000602354612b61919061519b565b612b6b919061516a565b85612b76919061519b565b612b80919061516a565b90506000670de0b6b3a764000089670de0b6b3a7640000602454612ba4919061519b565b612bae919061516a565b86612bb9919061519b565b612bc3919061516a565b90506000670de0b6b3a76400008a670de0b6b3a7640000602654612be7919061519b565b612bf1919061516a565b87612bfc919061519b565b612c06919061516a565b9050612c3530602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687611e63565b6000602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719863089600080601f604051612c8990614b69565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612cda96959493929190614bae565b6060604051808303818588803b158015612cf357600080fd5b505af1158015612d07573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d2c9190613edd565b5050905060008189612d3e9190615114565b602654602554602454602354612d549190615114565b612d5e9190615114565b612d689190615114565b612d7291906151f5565b90506000811115612dc557612dc430601f604051612d8f90614b3f565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361202e565b5b6000601f604051612dd590614b54565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686604051612e2790614b7e565b60006040518083038185875af1925050503d8060008114612e64576040519150601f19603f3d011682016040523d82523d6000602084013e612e69565b606091505b505080915050601f604051612e7d90614b3f565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685604051612ecf90614b7e565b60006040518083038185875af1925050503d8060008114612f0c576040519150601f19603f3d011682016040523d82523d6000602084013e612f11565b606091505b505080915050601f604051612f2590614b2a565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684604051612f7790614b7e565b60006040518083038185875af1925050503d8060008114612fb4576040519150601f19603f3d011682016040523d82523d6000602084013e612fb9565b606091505b505080915050600084888789612fcf9190615114565b612fd99190615114565b612fe39190615114565b8a612fee91906151f5565b11156130c957601f60405161300290614b54565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16848887896130559190615114565b61305f9190615114565b6130699190615114565b8a61307491906151f5565b60405161308090614b7e565b60006040518083038185875af1925050503d80600081146130bd576040519150601f19603f3d011682016040523d82523d6000602084013e6130c2565b606091505b5050809150505b600060238190555060006024819055506000602581905550600060268190555050505050505050505050505b50505b5b818561310591906151f5565b945050505b829150505b9392505050565b61311e610e69565b61315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315490614c8c565b60405180910390fd5b6000600960146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6131a1611e5b565b6040516131ae9190614b93565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321f90614ecc565b60405180910390fd5b61323482600083613962565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156132ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b190614cec565b60405180910390fd5b6132cd828261397290919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461332191906151f5565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516133869190614f8c565b60405180910390a361339a836000846139a7565b505050565b600080600084116133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc90614f4c565b60405180910390fd5b6133ed6139ac565b84111561342f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342690614c4c565b60405180910390fd5b600061344785856000016139bd90919063ffffffff16565b905083600001805490508114156134655760008092509250506134b4565b60018460010182815481106134a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613589610e69565b156135c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c090614e0c565b60405180910390fd5b6001600960146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861360d611e5b565b60405161361a9190614b93565b60405180910390a1565b60006136306008613ae3565b600061363a6139ac565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb678160405161366b9190614f8c565b60405180910390a18091505090565b6136ca600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206136c58361106e565b613af9565b50565b6136df60066136da610897565b613af9565b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374890614eec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b890614c6c565b60405180910390fd5b6137cc838383613962565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384990614dcc565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138e59190615114565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139499190614f8c565b60405180910390a361395c8484846139a7565b50505050565b61396d838383611d8e565b505050565b600080821461398c57818361398791906151f5565b61399f565b6000196cffffffffffffffffffffffffff165b905092915050565b505050565b60006139b86008611e4d565b905090565b600080838054905014156139d45760009050613add565b600080848054905090505b80821015613a5e5760006139f38383613b74565b905084868281548110613a2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001541115613a4857809150613a58565b600181613a559190615114565b92505b506139df565b600082118015613abc57508385600184613a7891906151f5565b81548110613aaf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154145b15613ad757600182613ace91906151f5565b92505050613add565b81925050505b92915050565b6001816000016000828254019250508190555050565b6000613b036139ac565b905080613b1284600001613b9a565b1015613b6f5782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b60006002828418613b85919061516a565b828416613b929190615114565b905092915050565b60008082805490501415613bb15760009050613c08565b8160018380549050613bc391906151f5565b81548110613bfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490505b919050565b6000613c20613c1b8461507d565b61504c565b90508083825260208201905082856020860282011115613c3f57600080fd5b60005b85811015613c6f5781613c558882613ce2565b845260208401935060208301925050600181019050613c42565b5050509392505050565b600081359050613c88816153c2565b92915050565b600081519050613c9d816153c2565b92915050565b600082601f830112613cb457600080fd5b8151613cc4848260208601613c0d565b91505092915050565b600081359050613cdc816153d9565b92915050565b600081519050613cf1816153d9565b92915050565b600060208284031215613d0957600080fd5b6000613d1784828501613c79565b91505092915050565b600060208284031215613d3257600080fd5b6000613d4084828501613c8e565b91505092915050565b60008060408385031215613d5c57600080fd5b6000613d6a85828601613c79565b9250506020613d7b85828601613c79565b9150509250929050565b60008060008060808587031215613d9b57600080fd5b6000613da987828801613c79565b9450506020613dba87828801613c79565b9350506040613dcb87828801613c79565b9250506060613ddc87828801613c79565b91505092959194509250565b600080600060608486031215613dfd57600080fd5b6000613e0b86828701613c79565b9350506020613e1c86828701613c79565b9250506040613e2d86828701613ccd565b9150509250925092565b60008060408385031215613e4a57600080fd5b6000613e5885828601613c79565b9250506020613e6985828601613ccd565b9150509250929050565b600060208284031215613e8557600080fd5b600082015167ffffffffffffffff811115613e9f57600080fd5b613eab84828501613ca3565b91505092915050565b600060208284031215613ec657600080fd5b6000613ed484828501613ccd565b91505092915050565b600080600060608486031215613ef257600080fd5b6000613f0086828701613ce2565b9350506020613f1186828701613ce2565b9250506040613f2286828701613ce2565b9150509250925092565b60008060008060808587031215613f4257600080fd5b6000613f5087828801613ccd565b9450506020613f6187828801613ccd565b9350506040613f7287828801613ccd565b9250506060613f8387828801613ccd565b91505092959194509250565b6000613f9b8383613fa7565b60208301905092915050565b613fb081615229565b82525050565b613fbf81615229565b82525050565b6000613fd0826150b9565b613fda81856150dc565b9350613fe5836150a9565b8060005b83811015614016578151613ffd8882613f8f565b9750614008836150cf565b925050600181019050613fe9565b5085935050505092915050565b61402c8161523b565b82525050565b61403b8161527e565b82525050565b600061404c826150c4565b61405681856150f8565b9350614066818560208601615290565b61406f816153b1565b840191505092915050565b6000614087601d836150f8565b91507f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006000830152602082019050919050565b60006140c76023836150f8565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061412d6014836150f8565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b600061416d6028836150f8565b91507f416e7469646f746544414f3a204163636f756e7420697320616c72656164792060008301527f6578636c756465640000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141d3602b836150f8565b91507f416e7469646f746544414f3a204163636f756e7420697320616c72656164792060008301527f626c61636b6c69737465640000000000000000000000000000000000000000006020830152604082019050919050565b60006142396022836150f8565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061429f6023836150f8565b91507f416e7469646f746544414f3a2054617820697320616c726561647920656e616260008301527f6c656400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143056028836150f8565b91507f416e7469646f746544414f3a20746f6b656e207472616e73666572207768696c60008301527f65207061757365640000000000000000000000000000000000000000000000006020830152604082019050919050565b600061436b6024836150f8565b91507f416e7469646f746544414f3a2054617820697320616c7265616479206469736160008301527f626c6564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143d16026836150f8565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144376022836150f8565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061449d6027836150f8565b91507f416e7469646f746544414f3a20436f6e747261637420697320616c726561647960008301527f20706175736564000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614503600783615109565b91507f63686172697479000000000000000000000000000000000000000000000000006000830152600782019050919050565b60006145436026836150f8565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145a9600383615109565b91507f64657600000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b60006145e9600983615109565b91507f6d61726b6574696e6700000000000000000000000000000000000000000000006000830152600982019050919050565b60006146296023836150f8565b91507f416e7469646f746544414f3a20436f6e7472616374206973206e6f742070617560008301527f73656400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061468f6010836150f8565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006146cf6027836150f8565b91507f416e7469646f746544414f3a204163636f756e74206973206e6f7420626c616360008301527f6b6c6973746564000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147356024836150f8565b91507f416e7469646f746544414f3a204163636f756e74206973206e6f74206578636c60008301527f75646564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061479b6022836150f8565b91507f416e7469646f746544414f3a20726563697069656e7420626c61636b6c69737460008301527f65640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148016028836150f8565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148676020836150f8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006148a76021836150f8565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061490d6025836150f8565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614973600983615109565b91507f6c697175696469747900000000000000000000000000000000000000000000006000830152600982019050919050565b60006149b36000836150ed565b9150600082019050919050565b60006149cd6024836150f8565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a33601f836150f8565b91507f416e7469646f746544414f3a2073656e64657220626c61636b6c6973746564006000830152602082019050919050565b6000614a736016836150f8565b91507f4552433230536e617073686f743a2069642069732030000000000000000000006000830152602082019050919050565b6000614ab36025836150f8565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614b1581615267565b82525050565b614b2481615271565b82525050565b6000614b35826144f6565b9150819050919050565b6000614b4a8261459c565b9150819050919050565b6000614b5f826145dc565b9150819050919050565b6000614b7482614966565b9150819050919050565b6000614b89826149a6565b9150819050919050565b6000602082019050614ba86000830184613fb6565b92915050565b600060c082019050614bc36000830189613fb6565b614bd06020830188614b0c565b614bdd6040830187614032565b614bea6060830186614032565b614bf76080830185613fb6565b614c0460a0830184614b0c565b979650505050505050565b6000602082019050614c246000830184614023565b92915050565b60006020820190508181036000830152614c448184614041565b905092915050565b60006020820190508181036000830152614c658161407a565b9050919050565b60006020820190508181036000830152614c85816140ba565b9050919050565b60006020820190508181036000830152614ca581614120565b9050919050565b60006020820190508181036000830152614cc581614160565b9050919050565b60006020820190508181036000830152614ce5816141c6565b9050919050565b60006020820190508181036000830152614d058161422c565b9050919050565b60006020820190508181036000830152614d2581614292565b9050919050565b60006020820190508181036000830152614d45816142f8565b9050919050565b60006020820190508181036000830152614d658161435e565b9050919050565b60006020820190508181036000830152614d85816143c4565b9050919050565b60006020820190508181036000830152614da58161442a565b9050919050565b60006020820190508181036000830152614dc581614490565b9050919050565b60006020820190508181036000830152614de581614536565b9050919050565b60006020820190508181036000830152614e058161461c565b9050919050565b60006020820190508181036000830152614e2581614682565b9050919050565b60006020820190508181036000830152614e45816146c2565b9050919050565b60006020820190508181036000830152614e6581614728565b9050919050565b60006020820190508181036000830152614e858161478e565b9050919050565b60006020820190508181036000830152614ea5816147f4565b9050919050565b60006020820190508181036000830152614ec58161485a565b9050919050565b60006020820190508181036000830152614ee58161489a565b9050919050565b60006020820190508181036000830152614f0581614900565b9050919050565b60006020820190508181036000830152614f25816149c0565b9050919050565b60006020820190508181036000830152614f4581614a26565b9050919050565b60006020820190508181036000830152614f6581614a66565b9050919050565b60006020820190508181036000830152614f8581614aa6565b9050919050565b6000602082019050614fa16000830184614b0c565b92915050565b6000604082019050614fbc6000830185614b0c565b8181036020830152614fce8184613fc5565b90509392505050565b600060a082019050614fec6000830188614b0c565b614ff96020830187614032565b818103604083015261500b8186613fc5565b905061501a6060830185613fb6565b6150276080830184614b0c565b9695505050505050565b60006020820190506150466000830184614b1b565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561507357615072615382565b5b8060405250919050565b600067ffffffffffffffff82111561509857615097615382565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061511f82615267565b915061512a83615267565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561515f5761515e6152f5565b5b828201905092915050565b600061517582615267565b915061518083615267565b9250826151905761518f615324565b5b828204905092915050565b60006151a682615267565b91506151b183615267565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151ea576151e96152f5565b5b828202905092915050565b600061520082615267565b915061520b83615267565b92508282101561521e5761521d6152f5565b5b828203905092915050565b600061523482615247565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061528982615267565b9050919050565b60005b838110156152ae578082015181840152602081019050615293565b838111156152bd576000848401525b50505050565b600060028204905060018216806152db57607f821691505b602082108114156152ef576152ee615353565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6153cb81615229565b81146153d657600080fd5b50565b6153e281615267565b81146153ed57600080fd5b5056fea26469706673582212200f6c5b943367aa960951c1470afc481c7a771be40198aa7927f6dbf9362f857c64736f6c63430008000033
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c8063717a86511161010d578063a82cfe8b116100a0578063ced695a41161006f578063ced695a414610704578063cfefd79e1461071b578063dd62ed3e14610744578063f2fde38b14610781578063fe575a87146107aa57610204565b8063a82cfe8b14610638578063a9059cbb14610661578063abe4f11d1461069e578063cba0e996146106c757610204565b806395d89b41116100dc57806395d89b411461057c5780639711715a146105a7578063981b24d0146105be578063a457c2d7146105fb57610204565b8063717a8651146104e85780638456cb591461051157806384666b08146105285780638da5cb5b1461055157610204565b80633f4ba83a1161019057806353eb3bcf1161015f57806353eb3bcf146104295780635c975abb14610440578063677ef8461461046b57806370a0823114610494578063715018a6146104d157610204565b80633f4ba83a1461038357806342966c681461039a5780634ee2cd7e146103c35780634febf53d1461040057610204565b806323b872dd116101cc57806323b872dd146102c75780632c32abc214610304578063313ce5671461031b578063395093511461034657610204565b806306fdde0314610209578063095ea7b31461023457806318160ddd1461027157806323a38a381461029c57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e6107e7565b60405161022b9190614c2a565b60405180910390f35b34801561024057600080fd5b5061025b60048036038101906102569190613e37565b610879565b6040516102689190614c0f565b60405180910390f35b34801561027d57600080fd5b50610286610897565b6040516102939190614f8c565b60405180910390f35b3480156102a857600080fd5b506102b16108a1565b6040516102be9190614c0f565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e99190613de8565b6108b4565b6040516102fb9190614c0f565b60405180910390f35b34801561031057600080fd5b506103196109ac565b005b34801561032757600080fd5b50610330610a5a565b60405161033d9190615031565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190613e37565b610a63565b60405161037a9190614c0f565b60405180910390f35b34801561038f57600080fd5b50610398610b0f565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190613eb4565b610bdc565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613e37565b610bf0565b6040516103f79190614f8c565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190613cf7565b610c60565b005b34801561043557600080fd5b5061043e610d80565b005b34801561044c57600080fd5b50610455610e69565b6040516104629190614c0f565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190613d85565b610e80565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613cf7565b61106e565b6040516104c89190614f8c565b60405180910390f35b3480156104dd57600080fd5b506104e66110b6565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190613cf7565b61113e565b005b34801561051d57600080fd5b506105266112a2565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613f2c565b611370565b005b34801561055d57600080fd5b50610566611476565b6040516105739190614b93565b60405180910390f35b34801561058857600080fd5b506105916114a0565b60405161059e9190614c2a565b60405180910390f35b3480156105b357600080fd5b506105bc611532565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190613eb4565b6115b9565b6040516105f29190614f8c565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613e37565b6115ea565b60405161062f9190614c0f565b60405180910390f35b34801561064457600080fd5b5061065f600480360381019061065a9190613f2c565b6116d5565b005b34801561066d57600080fd5b5061068860048036038101906106839190613e37565b6117db565b6040516106959190614c0f565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613cf7565b6117f9565b005b3480156106d357600080fd5b506106ee60048036038101906106e99190613cf7565b611918565b6040516106fb9190614c0f565b60405180910390f35b34801561071057600080fd5b5061071961196e565b005b34801561072757600080fd5b50610742600480360381019061073d9190613cf7565b611a56565b005b34801561075057600080fd5b5061076b60048036038101906107669190613d49565b611bb9565b6040516107789190614f8c565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190613cf7565b611c40565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613cf7565b611d38565b6040516107de9190614c0f565b60405180910390f35b6060600380546107f6906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610822906152c3565b801561086f5780601f106108445761010080835404028352916020019161086f565b820191906000526020600020905b81548152906001019060200180831161085257829003601f168201915b5050505050905090565b600061088d610886611e5b565b8484611e63565b6001905092915050565b6000600254905090565b602060009054906101000a900460ff1681565b60006108c184848461202e565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061090c611e5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390614e8c565b60405180910390fd5b6109a085610998611e5b565b858403611e63565b60019150509392505050565b6109b4611e5b565b73ffffffffffffffffffffffffffffffffffffffff166109d2611476565b73ffffffffffffffffffffffffffffffffffffffff1614610a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1f90614eac565b60405180910390fd5b610a576000602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612184565b50565b60006012905090565b6000610b05610a70611e5b565b848460016000610a7e611e5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b009190615114565b611e63565b6001905092915050565b610b17611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610b35611476565b73ffffffffffffffffffffffffffffffffffffffff1614610b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8290614eac565b60405180910390fd5b610b93610e69565b610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990614dec565b60405180910390fd5b610bda613116565b565b610bed610be7611e5b565b826131b8565b50565b6000806000610c3d84600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061339f565b9150915081610c5457610c4f8561106e565b610c56565b805b9250505092915050565b610c68611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610c86611476565b73ffffffffffffffffffffffffffffffffffffffff1614610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390614eac565b60405180910390fd5b610ce581611918565b15610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90614cac565b60405180910390fd5b6001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d88611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610da6611476565b73ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390614eac565b60405180910390fd5b602060009054906101000a900460ff1615610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390614d0c565b60405180910390fd5b6001602060006101000a81548160ff021916908315150217905550565b6000600960149054906101000a900460ff16905090565b610e88611e5b565b73ffffffffffffffffffffffffffffffffffffffff16610ea6611476565b73ffffffffffffffffffffffffffffffffffffffff1614610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390614eac565b60405180910390fd5b83601f604051610f0b90614b69565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f604051610f6690614b3f565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601f604051610fc190614b54565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601f60405161101c90614b2a565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110be611e5b565b73ffffffffffffffffffffffffffffffffffffffff166110dc611476565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614eac565b60405180910390fd5b61113c60006134bb565b565b611146611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611164611476565b73ffffffffffffffffffffffffffffffffffffffff16146111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b190614eac565b60405180910390fd5b601b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90614ccc565b60405180910390fd5b6001601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6112aa611e5b565b73ffffffffffffffffffffffffffffffffffffffff166112c8611476565b73ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590614eac565b60405180910390fd5b611326610e69565b15611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d90614dac565b60405180910390fd5b61136e613581565b565b611378611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611396611476565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390614eac565b60405180910390fd5b83601e6040516113fb90614b3f565b90815260200160405180910390208190555082601e60405161141c90614b54565b90815260200160405180910390208190555081601e60405161143d90614b69565b90815260200160405180910390208190555080601e60405161145e90614b2a565b90815260200160405180910390208190555050505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546114af906152c3565b80601f01602080910402602001604051908101604052809291908181526020018280546114db906152c3565b80156115285780601f106114fd57610100808354040283529160200191611528565b820191906000526020600020905b81548152906001019060200180831161150b57829003601f168201915b5050505050905090565b61153a611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611558611476565b73ffffffffffffffffffffffffffffffffffffffff16146115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590614eac565b60405180910390fd5b6115b6613624565b50565b60008060006115c984600661339f565b91509150816115df576115da610897565b6115e1565b805b92505050919050565b600080600160006115f9611e5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90614f6c565b60405180910390fd5b6116ca6116c1611e5b565b85858403611e63565b600191505092915050565b6116dd611e5b565b73ffffffffffffffffffffffffffffffffffffffff166116fb611476565b73ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890614eac565b60405180910390fd5b83601d60405161176090614b3f565b90815260200160405180910390208190555082601d60405161178190614b54565b90815260200160405180910390208190555081601d6040516117a290614b69565b90815260200160405180910390208190555080601d6040516117c390614b2a565b90815260200160405180910390208190555050505050565b60006117ef6117e8611e5b565b848461202e565b6001905092915050565b611801611e5b565b73ffffffffffffffffffffffffffffffffffffffff1661181f611476565b73ffffffffffffffffffffffffffffffffffffffff1614611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c90614eac565b60405180910390fd5b61187e81611918565b6118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b490614e4c565b60405180910390fd5b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611976611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611994611476565b73ffffffffffffffffffffffffffffffffffffffff16146119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e190614eac565b60405180910390fd5b602060009054906101000a900460ff16611a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3090614d4c565b60405180910390fd5b6000602060006101000a81548160ff021916908315150217905550565b611a5e611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611a7c611476565b73ffffffffffffffffffffffffffffffffffffffff1614611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac990614eac565b60405180910390fd5b601b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5590614e2c565b60405180910390fd5b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611c48611e5b565b73ffffffffffffffffffffffffffffffffffffffff16611c66611476565b73ffffffffffffffffffffffffffffffffffffffff1614611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614eac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614d6c565b60405180910390fd5b611d35816134bb565b50565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611d99838383611e48565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611de457611dd78261367a565b611ddf6136cd565b611e43565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e2f57611e228361367a565b611e2a6136cd565b611e42565b611e388361367a565b611e418261367a565b5b5b505050565b505050565b600081600001549050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eca90614f0c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614d8c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120219190614f8c565b60405180910390a3505050565b612036610e69565b15612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90614d2c565b60405180910390fd5b61207f33611d38565b156120bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b690614f2c565b60405180910390fd5b6120c882611d38565b15612108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ff90614e6c565b60405180910390fd5b61211132611d38565b15612151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214890614f2c565b60405180910390fd5b602060009054906101000a900460ff161561217457612171838383612184565b90505b61217f8383836136e1565b505050565b600080600267ffffffffffffffff8111156121c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156121f65781602001602082028036833780820191505090505b5090503081600081518110612234577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156122d657600080fd5b505afa1580156122ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230e9190613d20565b81600181518110612348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061238b85611918565b15801561239e575061239c84611918565b155b1561310a57600080600b54856123b4919061516a565b9050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156125fa57601d60405161241a90614b54565b90815260200160405180910390205481612434919061519b565b8261243f9190615114565b9150601d60405161244f90614b3f565b90815260200160405180910390205481612469919061519b565b826124749190615114565b9150601d60405161248490614b69565b9081526020016040518091039020548161249e919061519b565b826124a99190615114565b9150601d6040516124b990614b2a565b908152602001604051809103902054816124d3919061519b565b826124de9190615114565b915060008211156124f5576124f487308461202e565b5b601d60405161250390614b54565b9081526020016040518091039020548161251d919061519b565b6023600082825461252e9190615114565b92505081905550601d60405161254390614b3f565b9081526020016040518091039020548161255d919061519b565b6024600082825461256e9190615114565b92505081905550601d60405161258390614b69565b9081526020016040518091039020548161259d919061519b565b602560008282546125ae9190615114565b92505081905550601d6040516125c390614b2a565b908152602001604051809103902054816125dd919061519b565b602660008282546125ee9190615114565b925050819055506130f9565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156130f857601e60405161265e90614b54565b90815260200160405180910390205481612678919061519b565b826126839190615114565b9150601e60405161269390614b3f565b908152602001604051809103902054816126ad919061519b565b826126b89190615114565b9150601e6040516126c890614b69565b908152602001604051809103902054816126e2919061519b565b826126ed9190615114565b9150601e6040516126fd90614b2a565b90815260200160405180910390205481612717919061519b565b826127229190615114565b915060008211156127395761273887308461202e565b5b601e60405161274790614b54565b90815260200160405180910390205481612761919061519b565b602360008282546127729190615114565b92505081905550601e60405161278790614b3f565b908152602001604051809103902054816127a1919061519b565b602460008282546127b29190615114565b92505081905550601e6040516127c790614b69565b908152602001604051809103902054816127e1919061519b565b602560008282546127f29190615114565b92505081905550601e60405161280790614b2a565b90815260200160405180910390205481612821919061519b565b602660008282546128329190615114565b9250508190555060006026546025546024546023546128519190615114565b61285b9190615114565b6128659190615114565b9050600081141561287c578594505050505061310f565b6000602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f6026546025546024546023546128d29190615114565b6128dc9190615114565b6128e69190615114565b876040518363ffffffff1660e01b8152600401612904929190614fa7565b60006040518083038186803b15801561291c57600080fd5b505afa158015612930573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906129599190613e73565b600181518110612992577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600c5481106130f5576000479050600060265460026025546129be919061516a565b6024546023546129ce9190615114565b6129d89190615114565b6129e29190615114565b9050612a1130602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e63565b602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe58260008a30426040518663ffffffff1660e01b8152600401612a75959493929190614fd7565b600060405180830381600087803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612acc9190613e73565b5060008247612adb91906151f5565b905060006002602554612aee919061516a565b90506000670de0b6b3a764000087670de0b6b3a76400006002602554612b14919061516a565b612b1e919061519b565b612b28919061516a565b84612b33919061519b565b612b3d919061516a565b90506000670de0b6b3a764000088670de0b6b3a7640000602354612b61919061519b565b612b6b919061516a565b85612b76919061519b565b612b80919061516a565b90506000670de0b6b3a764000089670de0b6b3a7640000602454612ba4919061519b565b612bae919061516a565b86612bb9919061519b565b612bc3919061516a565b90506000670de0b6b3a76400008a670de0b6b3a7640000602654612be7919061519b565b612bf1919061516a565b87612bfc919061519b565b612c06919061516a565b9050612c3530602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687611e63565b6000602060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719863089600080601f604051612c8990614b69565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612cda96959493929190614bae565b6060604051808303818588803b158015612cf357600080fd5b505af1158015612d07573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d2c9190613edd565b5050905060008189612d3e9190615114565b602654602554602454602354612d549190615114565b612d5e9190615114565b612d689190615114565b612d7291906151f5565b90506000811115612dc557612dc430601f604051612d8f90614b3f565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361202e565b5b6000601f604051612dd590614b54565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686604051612e2790614b7e565b60006040518083038185875af1925050503d8060008114612e64576040519150601f19603f3d011682016040523d82523d6000602084013e612e69565b606091505b505080915050601f604051612e7d90614b3f565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685604051612ecf90614b7e565b60006040518083038185875af1925050503d8060008114612f0c576040519150601f19603f3d011682016040523d82523d6000602084013e612f11565b606091505b505080915050601f604051612f2590614b2a565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684604051612f7790614b7e565b60006040518083038185875af1925050503d8060008114612fb4576040519150601f19603f3d011682016040523d82523d6000602084013e612fb9565b606091505b505080915050600084888789612fcf9190615114565b612fd99190615114565b612fe39190615114565b8a612fee91906151f5565b11156130c957601f60405161300290614b54565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16848887896130559190615114565b61305f9190615114565b6130699190615114565b8a61307491906151f5565b60405161308090614b7e565b60006040518083038185875af1925050503d80600081146130bd576040519150601f19603f3d011682016040523d82523d6000602084013e6130c2565b606091505b5050809150505b600060238190555060006024819055506000602581905550600060268190555050505050505050505050505b50505b5b818561310591906151f5565b945050505b829150505b9392505050565b61311e610e69565b61315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315490614c8c565b60405180910390fd5b6000600960146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6131a1611e5b565b6040516131ae9190614b93565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321f90614ecc565b60405180910390fd5b61323482600083613962565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156132ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b190614cec565b60405180910390fd5b6132cd828261397290919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461332191906151f5565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516133869190614f8c565b60405180910390a361339a836000846139a7565b505050565b600080600084116133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc90614f4c565b60405180910390fd5b6133ed6139ac565b84111561342f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342690614c4c565b60405180910390fd5b600061344785856000016139bd90919063ffffffff16565b905083600001805490508114156134655760008092509250506134b4565b60018460010182815481106134a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613589610e69565b156135c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c090614e0c565b60405180910390fd5b6001600960146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861360d611e5b565b60405161361a9190614b93565b60405180910390a1565b60006136306008613ae3565b600061363a6139ac565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb678160405161366b9190614f8c565b60405180910390a18091505090565b6136ca600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206136c58361106e565b613af9565b50565b6136df60066136da610897565b613af9565b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374890614eec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b890614c6c565b60405180910390fd5b6137cc838383613962565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384990614dcc565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138e59190615114565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139499190614f8c565b60405180910390a361395c8484846139a7565b50505050565b61396d838383611d8e565b505050565b600080821461398c57818361398791906151f5565b61399f565b6000196cffffffffffffffffffffffffff165b905092915050565b505050565b60006139b86008611e4d565b905090565b600080838054905014156139d45760009050613add565b600080848054905090505b80821015613a5e5760006139f38383613b74565b905084868281548110613a2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001541115613a4857809150613a58565b600181613a559190615114565b92505b506139df565b600082118015613abc57508385600184613a7891906151f5565b81548110613aaf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154145b15613ad757600182613ace91906151f5565b92505050613add565b81925050505b92915050565b6001816000016000828254019250508190555050565b6000613b036139ac565b905080613b1284600001613b9a565b1015613b6f5782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b60006002828418613b85919061516a565b828416613b929190615114565b905092915050565b60008082805490501415613bb15760009050613c08565b8160018380549050613bc391906151f5565b81548110613bfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490505b919050565b6000613c20613c1b8461507d565b61504c565b90508083825260208201905082856020860282011115613c3f57600080fd5b60005b85811015613c6f5781613c558882613ce2565b845260208401935060208301925050600181019050613c42565b5050509392505050565b600081359050613c88816153c2565b92915050565b600081519050613c9d816153c2565b92915050565b600082601f830112613cb457600080fd5b8151613cc4848260208601613c0d565b91505092915050565b600081359050613cdc816153d9565b92915050565b600081519050613cf1816153d9565b92915050565b600060208284031215613d0957600080fd5b6000613d1784828501613c79565b91505092915050565b600060208284031215613d3257600080fd5b6000613d4084828501613c8e565b91505092915050565b60008060408385031215613d5c57600080fd5b6000613d6a85828601613c79565b9250506020613d7b85828601613c79565b9150509250929050565b60008060008060808587031215613d9b57600080fd5b6000613da987828801613c79565b9450506020613dba87828801613c79565b9350506040613dcb87828801613c79565b9250506060613ddc87828801613c79565b91505092959194509250565b600080600060608486031215613dfd57600080fd5b6000613e0b86828701613c79565b9350506020613e1c86828701613c79565b9250506040613e2d86828701613ccd565b9150509250925092565b60008060408385031215613e4a57600080fd5b6000613e5885828601613c79565b9250506020613e6985828601613ccd565b9150509250929050565b600060208284031215613e8557600080fd5b600082015167ffffffffffffffff811115613e9f57600080fd5b613eab84828501613ca3565b91505092915050565b600060208284031215613ec657600080fd5b6000613ed484828501613ccd565b91505092915050565b600080600060608486031215613ef257600080fd5b6000613f0086828701613ce2565b9350506020613f1186828701613ce2565b9250506040613f2286828701613ce2565b9150509250925092565b60008060008060808587031215613f4257600080fd5b6000613f5087828801613ccd565b9450506020613f6187828801613ccd565b9350506040613f7287828801613ccd565b9250506060613f8387828801613ccd565b91505092959194509250565b6000613f9b8383613fa7565b60208301905092915050565b613fb081615229565b82525050565b613fbf81615229565b82525050565b6000613fd0826150b9565b613fda81856150dc565b9350613fe5836150a9565b8060005b83811015614016578151613ffd8882613f8f565b9750614008836150cf565b925050600181019050613fe9565b5085935050505092915050565b61402c8161523b565b82525050565b61403b8161527e565b82525050565b600061404c826150c4565b61405681856150f8565b9350614066818560208601615290565b61406f816153b1565b840191505092915050565b6000614087601d836150f8565b91507f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006000830152602082019050919050565b60006140c76023836150f8565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061412d6014836150f8565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b600061416d6028836150f8565b91507f416e7469646f746544414f3a204163636f756e7420697320616c72656164792060008301527f6578636c756465640000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141d3602b836150f8565b91507f416e7469646f746544414f3a204163636f756e7420697320616c72656164792060008301527f626c61636b6c69737465640000000000000000000000000000000000000000006020830152604082019050919050565b60006142396022836150f8565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061429f6023836150f8565b91507f416e7469646f746544414f3a2054617820697320616c726561647920656e616260008301527f6c656400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143056028836150f8565b91507f416e7469646f746544414f3a20746f6b656e207472616e73666572207768696c60008301527f65207061757365640000000000000000000000000000000000000000000000006020830152604082019050919050565b600061436b6024836150f8565b91507f416e7469646f746544414f3a2054617820697320616c7265616479206469736160008301527f626c6564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143d16026836150f8565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144376022836150f8565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061449d6027836150f8565b91507f416e7469646f746544414f3a20436f6e747261637420697320616c726561647960008301527f20706175736564000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614503600783615109565b91507f63686172697479000000000000000000000000000000000000000000000000006000830152600782019050919050565b60006145436026836150f8565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145a9600383615109565b91507f64657600000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b60006145e9600983615109565b91507f6d61726b6574696e6700000000000000000000000000000000000000000000006000830152600982019050919050565b60006146296023836150f8565b91507f416e7469646f746544414f3a20436f6e7472616374206973206e6f742070617560008301527f73656400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061468f6010836150f8565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006146cf6027836150f8565b91507f416e7469646f746544414f3a204163636f756e74206973206e6f7420626c616360008301527f6b6c6973746564000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147356024836150f8565b91507f416e7469646f746544414f3a204163636f756e74206973206e6f74206578636c60008301527f75646564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061479b6022836150f8565b91507f416e7469646f746544414f3a20726563697069656e7420626c61636b6c69737460008301527f65640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148016028836150f8565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148676020836150f8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006148a76021836150f8565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061490d6025836150f8565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614973600983615109565b91507f6c697175696469747900000000000000000000000000000000000000000000006000830152600982019050919050565b60006149b36000836150ed565b9150600082019050919050565b60006149cd6024836150f8565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a33601f836150f8565b91507f416e7469646f746544414f3a2073656e64657220626c61636b6c6973746564006000830152602082019050919050565b6000614a736016836150f8565b91507f4552433230536e617073686f743a2069642069732030000000000000000000006000830152602082019050919050565b6000614ab36025836150f8565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614b1581615267565b82525050565b614b2481615271565b82525050565b6000614b35826144f6565b9150819050919050565b6000614b4a8261459c565b9150819050919050565b6000614b5f826145dc565b9150819050919050565b6000614b7482614966565b9150819050919050565b6000614b89826149a6565b9150819050919050565b6000602082019050614ba86000830184613fb6565b92915050565b600060c082019050614bc36000830189613fb6565b614bd06020830188614b0c565b614bdd6040830187614032565b614bea6060830186614032565b614bf76080830185613fb6565b614c0460a0830184614b0c565b979650505050505050565b6000602082019050614c246000830184614023565b92915050565b60006020820190508181036000830152614c448184614041565b905092915050565b60006020820190508181036000830152614c658161407a565b9050919050565b60006020820190508181036000830152614c85816140ba565b9050919050565b60006020820190508181036000830152614ca581614120565b9050919050565b60006020820190508181036000830152614cc581614160565b9050919050565b60006020820190508181036000830152614ce5816141c6565b9050919050565b60006020820190508181036000830152614d058161422c565b9050919050565b60006020820190508181036000830152614d2581614292565b9050919050565b60006020820190508181036000830152614d45816142f8565b9050919050565b60006020820190508181036000830152614d658161435e565b9050919050565b60006020820190508181036000830152614d85816143c4565b9050919050565b60006020820190508181036000830152614da58161442a565b9050919050565b60006020820190508181036000830152614dc581614490565b9050919050565b60006020820190508181036000830152614de581614536565b9050919050565b60006020820190508181036000830152614e058161461c565b9050919050565b60006020820190508181036000830152614e2581614682565b9050919050565b60006020820190508181036000830152614e45816146c2565b9050919050565b60006020820190508181036000830152614e6581614728565b9050919050565b60006020820190508181036000830152614e858161478e565b9050919050565b60006020820190508181036000830152614ea5816147f4565b9050919050565b60006020820190508181036000830152614ec58161485a565b9050919050565b60006020820190508181036000830152614ee58161489a565b9050919050565b60006020820190508181036000830152614f0581614900565b9050919050565b60006020820190508181036000830152614f25816149c0565b9050919050565b60006020820190508181036000830152614f4581614a26565b9050919050565b60006020820190508181036000830152614f6581614a66565b9050919050565b60006020820190508181036000830152614f8581614aa6565b9050919050565b6000602082019050614fa16000830184614b0c565b92915050565b6000604082019050614fbc6000830185614b0c565b8181036020830152614fce8184613fc5565b90509392505050565b600060a082019050614fec6000830188614b0c565b614ff96020830187614032565b818103604083015261500b8186613fc5565b905061501a6060830185613fb6565b6150276080830184614b0c565b9695505050505050565b60006020820190506150466000830184614b1b565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561507357615072615382565b5b8060405250919050565b600067ffffffffffffffff82111561509857615097615382565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061511f82615267565b915061512a83615267565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561515f5761515e6152f5565b5b828201905092915050565b600061517582615267565b915061518083615267565b9250826151905761518f615324565b5b828204905092915050565b60006151a682615267565b91506151b183615267565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151ea576151e96152f5565b5b828202905092915050565b600061520082615267565b915061520b83615267565b92508282101561521e5761521d6152f5565b5b828203905092915050565b600061523482615247565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061528982615267565b9050919050565b60005b838110156152ae578082015181840152602081019050615293565b838111156152bd576000848401525b50505050565b600060028204905060018216806152db57607f821691505b602082108114156152ef576152ee615353565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6153cb81615229565b81146153d657600080fd5b50565b6153e281615267565b81146153ed57600080fd5b5056fea26469706673582212200f6c5b943367aa960951c1470afc481c7a771be40198aa7927f6dbf9362f857c64736f6c63430008000033
Deployed Bytecode Sourcemap
39464:12226:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10656:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12823:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11776:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40710:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13474:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47629:106;;;;;;;;;;;;;:::i;:::-;;11618:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14375:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48014:132;;;;;;;;;;;;;:::i;:::-;;48223:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35569:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48979:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50507:142;;;;;;;;;;;;;:::i;:::-;;23760:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50170:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11947:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22147:94;;;;;;;;;;;;;:::i;:::-;;48428:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47809:133;;;;;;;;;;;;;:::i;:::-;;49824:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21496:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10875:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51301:67;;;;;;;;;;;;;:::i;:::-;;35939:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15093:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49489:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12287:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49244:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51183:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50715:144;;;;;;;;;;;;;:::i;:::-;;48709:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12525:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22396:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50967:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10656:100;10710:13;10743:5;10736:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10656:100;:::o;12823:169::-;12906:4;12923:39;12932:12;:10;:12::i;:::-;12946:7;12955:6;12923:8;:39::i;:::-;12980:4;12973:11;;12823:169;;;;:::o;11776:108::-;11837:7;11864:12;;11857:19;;11776:108;:::o;40710:29::-;;;;;;;;;;;;;:::o;13474:492::-;13614:4;13631:36;13641:6;13649:9;13660:6;13631:9;:36::i;:::-;13680:24;13707:11;:19;13719:6;13707:19;;;;;;;;;;;;;;;:33;13727:12;:10;:12::i;:::-;13707:33;;;;;;;;;;;;;;;;13680:60;;13779:6;13759:16;:26;;13751:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;13866:57;13875:6;13883:12;:10;:12::i;:::-;13916:6;13897:16;:25;13866:8;:57::i;:::-;13954:4;13947:11;;;13474:492;;;;;:::o;47629:106::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47679:48:::1;47697:1;47709:13;;;;;;;;;;;47725:1;47679:9;:48::i;:::-;;47629:106::o:0;11618:93::-;11676:5;11701:2;11694:9;;11618:93;:::o;14375:215::-;14463:4;14480:80;14489:12;:10;:12::i;:::-;14503:7;14549:10;14512:11;:25;14524:12;:10;:12::i;:::-;14512:25;;;;;;;;;;;;;;;:34;14538:7;14512:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;14480:8;:80::i;:::-;14578:4;14571:11;;14375:215;;;;:::o;48014:132::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48069:8:::1;:6;:8::i;:::-;48061:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48128:10;:8;:10::i;:::-;48014:132::o:0;48223:83::-;48271:27;48277:12;:10;:12::i;:::-;48291:6;48271:5;:27::i;:::-;48223:83;:::o;35569:266::-;35656:7;35677:16;35695:13;35712:55;35721:10;35733:24;:33;35758:7;35733:33;;;;;;;;;;;;;;;35712:8;:55::i;:::-;35676:91;;;;35787:11;:40;;35809:18;35819:7;35809:9;:18::i;:::-;35787:40;;;35801:5;35787:40;35780:47;;;;35569:266;;;;:::o;48979:181::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49050:19:::1;49061:7;49050:10;:19::i;:::-;49049:20;49041:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49148:4;49125:11;:20;49137:7;49125:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;48979:181:::0;:::o;50507:142::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50565:9:::1;;;;;;;;;;;50564:10;50556:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50637:4;50625:9;;:16;;;;;;;;;;;;;;;;;;50507:142::o:0;23760:86::-;23807:4;23831:7;;;;;;;;;;;23824:14;;23760:86;:::o;50170:272::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50309:3:::1;50283:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50343:3;50323:10;:17;;;;;:::i;:::-;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;50383:9;50357:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;50427:7;50403:10;:21;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;50170:272:::0;;;;:::o;11947:127::-;12021:7;12048:9;:18;12058:7;12048:18;;;;;;;;;;;;;;;;12041:25;;11947:127;;;:::o;22147:94::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22212:21:::1;22230:1;22212:9;:21::i;:::-;22147:94::o:0;48428:189::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48507:9:::1;:18;48517:7;48507:18;;;;;;;;;;;;;;;;;;;;;;;;;48506:19;48498:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;48605:4;48584:9;:18;48594:7;48584:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;48428:189:::0;:::o;47809:133::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47863:8:::1;:6;:8::i;:::-;47862:9;47854:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47926:8;:6;:8::i;:::-;47809:133::o:0;49824:279::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49961:3:::1;49942:9;:16;;;;;:::i;:::-;;;;;;;;;;;;;:22;;;;50000:9;49975;:22;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;50045:9;50020;:22;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;50088:7;50065:9;:20;;;;;:::i;:::-;;;;;;;;;;;;;:30;;;;49824:279:::0;;;;:::o;21496:87::-;21542:7;21569:6;;;;;;;;;;;21562:13;;21496:87;:::o;10875:104::-;10931:13;10964:7;10957:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10875:104;:::o;51301:67::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51349:11:::1;:9;:11::i;:::-;;51301:67::o:0;35939:234::-;36011:7;36032:16;36050:13;36067:43;36076:10;36088:21;36067:8;:43::i;:::-;36031:79;;;;36130:11;:35;;36152:13;:11;:13::i;:::-;36130:35;;;36144:5;36130:35;36123:42;;;;35939:234;;;:::o;15093:413::-;15186:4;15203:24;15230:11;:25;15242:12;:10;:12::i;:::-;15230:25;;;;;;;;;;;;;;;:34;15256:7;15230:34;;;;;;;;;;;;;;;;15203:61;;15303:15;15283:16;:35;;15275:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;15396:67;15405:12;:10;:12::i;:::-;15419:7;15447:15;15428:16;:34;15396:8;:67::i;:::-;15494:4;15487:11;;;15093:413;;;;:::o;49489:272::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49622:3:::1;49604:8;:15;;;;;:::i;:::-;;;;;;;;;;;;;:21;;;;49660:9;49636:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;:33;;;;49704:9;49680:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;:33;;;;49746:7;49724:8;:19;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;;49489:272:::0;;;;:::o;12287:175::-;12373:4;12390:42;12400:12;:10;:12::i;:::-;12414:9;12425:6;12390:9;:42::i;:::-;12450:4;12443:11;;12287:175;;;;:::o;49244:183::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49320:19:::1;49331:7;49320:10;:19::i;:::-;49312:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49414:5;49391:11;:20;49403:7;49391:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;49244:183:::0;:::o;51183:110::-;51241:4;51265:11;:20;51277:7;51265:20;;;;;;;;;;;;;;;;;;;;;;;;;51258:27;;51183:110;;;:::o;50715:144::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50773:9:::1;;;;;;;;;;;50765:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50846:5;50834:9;;:17;;;;;;;;;;;;;;;;;;50715:144::o:0;48709:186::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48788:9:::1;:18;48798:7;48788:18;;;;;;;;;;;;;;;;;;;;;;;;;48780:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48882:5;48861:9;:18;48871:7;48861:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;48709:186:::0;:::o;12525:151::-;12614:7;12641:11;:18;12653:5;12641:18;;;;;;;;;;;;;;;:27;12660:7;12641:27;;;;;;;;;;;;;;;;12634:34;;12525:151;;;;:::o;22396:192::-;21727:12;:10;:12::i;:::-;21716:23;;:7;:5;:7::i;:::-;:23;;;21708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22505:1:::1;22485:22;;:8;:22;;;;22477:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22561:19;22571:8;22561:9;:19::i;:::-;22396:192:::0;:::o;50967:111::-;51028:4;51052:9;:18;51062:7;51052:18;;;;;;;;;;;;;;;;;;;;;;;;;51045:25;;50967:111;;;:::o;36390:622::-;36533:44;36560:4;36566:2;36570:6;36533:26;:44::i;:::-;36610:1;36594:18;;:4;:18;;;36590:415;;;36650:26;36673:2;36650:22;:26::i;:::-;36691:28;:26;:28::i;:::-;36590:415;;;36755:1;36741:16;;:2;:16;;;36737:268;;;36795:28;36818:4;36795:22;:28::i;:::-;36838;:26;:28::i;:::-;36737:268;;;36924:28;36947:4;36924:22;:28::i;:::-;36967:26;36990:2;36967:22;:26::i;:::-;36737:268;36590:415;36390:622;;;:::o;19760:125::-;;;;:::o;865:114::-;930:7;957;:14;;;950:21;;865:114;;;:::o;8444:98::-;8497:7;8524:10;8517:17;;8444:98;:::o;18780:380::-;18933:1;18916:19;;:5;:19;;;;18908:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19014:1;18995:21;;:7;:21;;;;18987:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19098:6;19068:11;:18;19080:5;19068:18;;;;;;;;;;;;;;;:27;19087:7;19068:27;;;;;;;;;;;;;;;:36;;;;19136:7;19120:32;;19129:5;19120:32;;;19145:6;19120:32;;;;;;:::i;:::-;;;;;;;;18780:380;;;:::o;46919:627::-;47069:8;:6;:8::i;:::-;47068:9;47060:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47142:25;47156:10;47142:13;:25::i;:::-;47141:26;47133:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47223:24;47237:9;47223:13;:24::i;:::-;47222:25;47214:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47306:24;47320:9;47306:13;:24::i;:::-;47305:25;47297:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47390:9;;;;;;;;;;;47387:89;;;47425:36;47435:6;47443:9;47454:6;47425:9;:36::i;:::-;47416:45;;47387:89;47496:42;47512:6;47520:9;47531:6;47496:15;:42::i;:::-;46919:627;;;:::o;41860:5047::-;41938:7;41958:25;42000:1;41986:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41958:44;;42035:4;42013:8;42022:1;42013:11;;;;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;42065:17;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42051:8;42060:1;42051:11;;;;;;;;;;;;;;;;;;;;;:38;;;;;;;;;;;42114:16;42125:4;42114:10;:16::i;:::-;42113:17;:36;;;;;42135:14;42146:2;42135:10;:14::i;:::-;42134:15;42113:36;42110:4756;;;42166:11;42192:16;42220:11;;42211:6;:20;;;;:::i;:::-;42192:39;;42265:13;;;;;;;;;;;42249:30;;:4;:30;;;42246:4567;;;42318:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;;42307:8;:32;;;;:::i;:::-;42300:39;;;;;:::i;:::-;;;42376:8;:15;;;;;:::i;:::-;;;;;;;;;;;;;;42365:8;:26;;;;:::i;:::-;42358:33;;;;;:::i;:::-;;;42428:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;;42417:8;:32;;;;:::i;:::-;42410:39;;;;;:::i;:::-;;;42486:8;:19;;;;;:::i;:::-;;;;;;;;;;;;;;42475:8;:30;;;;:::i;:::-;42468:37;;;;;:::i;:::-;;;42551:1;42545:3;:7;42542:93;;;42577:35;42587:4;42601;42608:3;42577:9;:35::i;:::-;42542:93;42701:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;;42690:8;:32;;;;:::i;:::-;42671:15;;:51;;;;;;;:::i;:::-;;;;;;;;42765:8;:15;;;;;:::i;:::-;;;;;;;;;;;;;;42754:8;:26;;;;:::i;:::-;42741:9;;:39;;;;;;;:::i;:::-;;;;;;;;42829:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;;42818:8;:32;;;;:::i;:::-;42799:15;;:51;;;;;;;:::i;:::-;;;;;;;;42897:8;:19;;;;;:::i;:::-;;;;;;;;;;;;;;42886:8;:30;;;;:::i;:::-;42869:13;;:47;;;;;;;:::i;:::-;;;;;;;;42246:4567;;;42955:13;;;;;;;;;;;42941:28;;:2;:28;;;42938:3875;;;43008:9;:22;;;;;:::i;:::-;;;;;;;;;;;;;;42997:8;:33;;;;:::i;:::-;42990:40;;;;;:::i;:::-;;;43067:9;:16;;;;;:::i;:::-;;;;;;;;;;;;;;43056:8;:27;;;;:::i;:::-;43049:34;;;;;:::i;:::-;;;43120:9;:22;;;;;:::i;:::-;;;;;;;;;;;;;;43109:8;:33;;;;:::i;:::-;43102:40;;;;;:::i;:::-;;;43179:9;:20;;;;;:::i;:::-;;;;;;;;;;;;;;43168:8;:31;;;;:::i;:::-;43161:38;;;;;:::i;:::-;;;43245:1;43239:3;:7;43236:93;;;43271:35;43281:4;43295;43302:3;43271:9;:35::i;:::-;43236:93;43395:9;:22;;;;;:::i;:::-;;;;;;;;;;;;;;43384:8;:33;;;;:::i;:::-;43365:15;;:52;;;;;;;:::i;:::-;;;;;;;;43460:9;:16;;;;;:::i;:::-;;;;;;;;;;;;;;43449:8;:27;;;;:::i;:::-;43436:9;;:40;;;;;;;:::i;:::-;;;;;;;;43525:9;:22;;;;;:::i;:::-;;;;;;;;;;;;;;43514:8;:33;;;;:::i;:::-;43495:15;;:52;;;;;;;:::i;:::-;;;;;;;;43594:9;:20;;;;;:::i;:::-;;;;;;;;;;;;;;43583:8;:31;;;;:::i;:::-;43566:13;;:48;;;;;;;:::i;:::-;;;;;;;;43651:14;43716:13;;43698:15;;43686:9;;43668:15;;:27;;;;:::i;:::-;:45;;;;:::i;:::-;:61;;;;:::i;:::-;43651:78;;43779:1;43769:6;:11;43766:29;;;43789:6;43782:13;;;;;;;;43766:29;43832:16;43851:17;;;;;;;;;;;:31;;;43931:13;;43913:15;;43901:9;;43883:15;;:27;;;;:::i;:::-;:45;;;;:::i;:::-;:61;;;;:::i;:::-;43946:8;43851:104;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43956:1;43851:107;;;;;;;;;;;;;;;;;;;;;;43832:126;;44010:13;;43998:8;:25;43995:2785;;44048:20;44071:21;44048:44;;44117:14;44186:13;;44182:1;44164:15;;:19;;;;:::i;:::-;44152:9;;44134:15;;:27;;;;:::i;:::-;:49;;;;:::i;:::-;:65;;;;:::i;:::-;44117:82;;44244:59;44261:4;44276:17;;;;;;;;;;;44296:6;44244:8;:59::i;:::-;44340:17;;;;;;;;;;;:39;;;44406:6;44439:1;44467:8;44510:4;44542:15;44340:240;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44625:17;44669:12;44645:21;:36;;;;:::i;:::-;44625:56;;44726:22;44769:1;44751:15;;:19;;;;:::i;:::-;44726:44;;44793:20;44874:6;44863;44853;44849:1;44831:15;;:19;;;;:::i;:::-;:28;;;;:::i;:::-;44830:39;;;;:::i;:::-;44817:9;:53;;;;:::i;:::-;44816:64;;;;:::i;:::-;44793:87;;44925:20;45002:6;44991;44981;44963:15;;:24;;;;:::i;:::-;44962:35;;;;:::i;:::-;44949:9;:49;;;;:::i;:::-;44948:60;;;;:::i;:::-;44925:83;;45031:14;45096:6;45085;45075;45063:9;;:18;;;;:::i;:::-;45062:29;;;;:::i;:::-;45049:9;:43;;;;:::i;:::-;45048:54;;;;:::i;:::-;45031:71;;45125:18;45198:6;45187;45177;45161:13;;:22;;;;:::i;:::-;45160:33;;;;:::i;:::-;45147:9;:47;;;;:::i;:::-;45146:58;;;;:::i;:::-;45125:79;;45249:67;45266:4;45281:17;;;;;;;;;;;45301:14;45249:8;:67::i;:::-;45362:16;45384:17;;;;;;;;;;;:33;;;45425:12;45473:4;45505:14;45546:1;45574;45602:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45652:15;45384:306;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45361:329;;;;45735:23;45837:11;45828:6;:20;;;;:::i;:::-;45810:13;;45792:15;;45780:9;;45762:15;;:27;;;;:::i;:::-;:45;;;;:::i;:::-;:61;;;;:::i;:::-;45761:88;;;;:::i;:::-;45735:114;;45915:1;45897:15;:19;45894:135;;;45945:60;45963:4;45970:10;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45989:15;45945:9;:60::i;:::-;45894:135;46051:8;46091:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:28;;46127:12;46091:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46082:62;;;;;46176:10;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:22;;46206:6;46176:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46167:50;;;;;46249:10;:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:26;;46283:10;46249:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46240:58;;;;;46412:1;46398:10;46383:12;46374:6;46359:12;:21;;;;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;46346:9;:63;;;;:::i;:::-;:67;46343:236;;;46451:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:28;;46539:10;46524:12;46515:6;46500:12;:21;;;;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;46487:9;:63;;;;:::i;:::-;46451:104;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46442:113;;;;;46343:236;46641:1;46623:15;:19;;;;46677:1;46665:9;:13;;;;46719:1;46701:15;:19;;;;46759:1;46743:13;:17;;;;43995:2785;;;;;;;;;;;;42938:3875;;;42246:4567;46851:3;46841:13;;;;;:::i;:::-;;;42110:4756;;;46893:6;46886:13;;;41860:5047;;;;;;:::o;24819:120::-;24363:8;:6;:8::i;:::-;24355:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;24888:5:::1;24878:7;;:15;;;;;;;;;;;;;;;;;;24909:22;24918:12;:10;:12::i;:::-;24909:22;;;;;;:::i;:::-;;;;;;;;24819:120::o:0;17748:594::-;17851:1;17832:21;;:7;:21;;;;17824:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;17904:49;17925:7;17942:1;17946:6;17904:20;:49::i;:::-;17966:22;17991:9;:18;18001:7;17991:18;;;;;;;;;;;;;;;;17966:43;;18046:6;18028:14;:24;;18020:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;18148:26;18167:6;18148:14;:18;;:26;;;;:::i;:::-;18127:9;:18;18137:7;18127:18;;;;;;;;;;;;;;;:47;;;;18212:6;18196:12;;:22;;;;;;;:::i;:::-;;;;;;;;18262:1;18236:37;;18245:7;18236:37;;;18266:6;18236:37;;;;;;:::i;:::-;;;;;;;;18286:48;18306:7;18323:1;18327:6;18286:19;:48::i;:::-;17748:594;;;:::o;37020:1619::-;37109:4;37115:7;37156:1;37143:10;:14;37135:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;37217:23;:21;:23::i;:::-;37203:10;:37;;37195:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;38413:13;38429:40;38458:10;38429:9;:13;;:28;;:40;;;;:::i;:::-;38413:56;;38495:9;:13;;:20;;;;38486:5;:29;38482:150;;;38540:5;38547:1;38532:17;;;;;;;38482:150;38590:4;38596:9;:16;;38613:5;38596:23;;;;;;;;;;;;;;;;;;;;;;;;38582:38;;;;;37020:1619;;;;;;:::o;22596:174::-;22653:16;22672:6;;;;;;;;;;;22653:25;;22698:8;22689:6;;:17;;;;;;;;;;;;;;;;;;22753:8;22722:40;;22743:8;22722:40;;;;;;;;;;;;22596:174;;:::o;24560:118::-;24086:8;:6;:8::i;:::-;24085:9;24077:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;24630:4:::1;24620:7;;:14;;;;;;;;;;;;;;;;;;24650:20;24657:12;:10;:12::i;:::-;24650:20;;;;;;:::i;:::-;;;;;;;;24560:118::o:0;35041:223::-;35088:7;35108:30;:18;:28;:30::i;:::-;35151:17;35171:23;:21;:23::i;:::-;35151:43;;35210:19;35219:9;35210:19;;;;;;:::i;:::-;;;;;;;;35247:9;35240:16;;;35041:223;:::o;38647:146::-;38715:70;38731:24;:33;38756:7;38731:33;;;;;;;;;;;;;;;38766:18;38776:7;38766:9;:18::i;:::-;38715:15;:70::i;:::-;38647:146;:::o;38801:118::-;38858:53;38874:21;38897:13;:11;:13::i;:::-;38858:15;:53::i;:::-;38801:118::o;15996:733::-;16154:1;16136:20;;:6;:20;;;;16128:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;16238:1;16217:23;;:9;:23;;;;16209:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;16293:47;16314:6;16322:9;16333:6;16293:20;:47::i;:::-;16353:21;16377:9;:17;16387:6;16377:17;;;;;;;;;;;;;;;;16353:41;;16430:6;16413:13;:23;;16405:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;16551:6;16535:13;:22;16515:9;:17;16525:6;16515:17;;;;;;;;;;;;;;;:42;;;;16603:6;16579:9;:20;16589:9;16579:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;16644:9;16627:35;;16636:6;16627:35;;;16655:6;16627:35;;;;;;:::i;:::-;;;;;;;;16675:46;16695:6;16703:9;16714:6;16675:19;:46::i;:::-;15996:733;;;;:::o;51446:198::-;51592:44;51619:4;51625:2;51629:6;51592:26;:44::i;:::-;51446:198;;;:::o;1853:121::-;1911:7;1943:1;1938;:6;:28;;1965:1;1961;:5;;;;:::i;:::-;1938:28;;;1956:1;1947:11;1938:28;;;1931:35;;1853:121;;;;:::o;20489:124::-;;;;:::o;35330:127::-;35394:7;35421:28;:18;:26;:28::i;:::-;35414:35;;35330:127;:::o;3689:918::-;3778:7;3818:1;3802:5;:12;;;;:17;3798:58;;;3843:1;3836:8;;;;3798:58;3868:11;3894:12;3909:5;:12;;;;3894:27;;3934:424;3947:4;3941:3;:10;3934:424;;;3968:11;3982:23;3995:3;4000:4;3982:12;:23::i;:::-;3968:37;;4239:7;4226:5;4232:3;4226:10;;;;;;;;;;;;;;;;;;;;;;;;:20;4222:125;;;4274:3;4267:10;;4222:125;;;4330:1;4324:3;:7;;;;:::i;:::-;4318:13;;4222:125;3934:424;;;;4484:1;4478:3;:7;:36;;;;;4507:7;4489:5;4501:1;4495:3;:7;;;;:::i;:::-;4489:14;;;;;;;;;;;;;;;;;;;;;;;;:25;4478:36;4474:126;;;4544:1;4538:3;:7;;;;:::i;:::-;4531:14;;;;;;4474:126;4585:3;4578:10;;;;3689:918;;;;;:::o;987:127::-;1094:1;1076:7;:14;;;:19;;;;;;;;;;;987:127;:::o;38927:310::-;39022:17;39042:23;:21;:23::i;:::-;39022:43;;39113:9;39080:30;39096:9;:13;;39080:15;:30::i;:::-;:42;39076:154;;;39139:9;:13;;39158:9;39139:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39183:9;:16;;39205:12;39183:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39076:154;38927:310;;;:::o;2610:156::-;2672:7;2757:1;2752;2748;:5;2747:11;;;;:::i;:::-;2742:1;2738;:5;2737:21;;;;:::i;:::-;2730:28;;2610:156;;;;:::o;39245:212::-;39315:7;39353:1;39339:3;:10;;;;:15;39335:115;;;39378:1;39371:8;;;;39335:115;39419:3;39436:1;39423:3;:10;;;;:14;;;;:::i;:::-;39419:19;;;;;;;;;;;;;;;;;;;;;;;;39412:26;;39245:212;;;;:::o;24:644:1:-;;156:80;171:64;228:6;171:64;:::i;:::-;156:80;:::i;:::-;147:89;;256:5;284:6;277:5;270:21;310:4;303:5;299:16;292:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;402:1;399;392:12;350:2;430:1;415:247;440:6;437:1;434:13;415:247;;;507:3;535:48;579:3;567:10;535:48;:::i;:::-;530:3;523:61;613:4;608:3;604:14;597:21;;647:4;642:3;638:14;631:21;;475:187;462:1;459;455:9;450:14;;415:247;;;419:14;137:531;;;;;;;:::o;674:139::-;;758:6;745:20;736:29;;774:33;801:5;774:33;:::i;:::-;726:87;;;;:::o;819:143::-;;907:6;901:13;892:22;;923:33;950:5;923:33;:::i;:::-;882:80;;;;:::o;985:318::-;;1116:3;1109:4;1101:6;1097:17;1093:27;1083:2;;1134:1;1131;1124:12;1083:2;1167:6;1161:13;1192:105;1293:3;1285:6;1278:4;1270:6;1266:17;1192:105;:::i;:::-;1183:114;;1073:230;;;;;:::o;1309:139::-;;1393:6;1380:20;1371:29;;1409:33;1436:5;1409:33;:::i;:::-;1361:87;;;;:::o;1454:143::-;;1542:6;1536:13;1527:22;;1558:33;1585:5;1558:33;:::i;:::-;1517:80;;;;:::o;1603:262::-;;1711:2;1699:9;1690:7;1686:23;1682:32;1679:2;;;1727:1;1724;1717:12;1679:2;1770:1;1795:53;1840:7;1831:6;1820:9;1816:22;1795:53;:::i;:::-;1785:63;;1741:117;1669:196;;;;:::o;1871:284::-;;1990:2;1978:9;1969:7;1965:23;1961:32;1958:2;;;2006:1;2003;1996:12;1958:2;2049:1;2074:64;2130:7;2121:6;2110:9;2106:22;2074:64;:::i;:::-;2064:74;;2020:128;1948:207;;;;:::o;2161:407::-;;;2286:2;2274:9;2265:7;2261:23;2257:32;2254:2;;;2302:1;2299;2292:12;2254:2;2345:1;2370:53;2415:7;2406:6;2395:9;2391:22;2370:53;:::i;:::-;2360:63;;2316:117;2472:2;2498:53;2543:7;2534:6;2523:9;2519:22;2498:53;:::i;:::-;2488:63;;2443:118;2244:324;;;;;:::o;2574:698::-;;;;;2733:3;2721:9;2712:7;2708:23;2704:33;2701:2;;;2750:1;2747;2740:12;2701:2;2793:1;2818:53;2863:7;2854:6;2843:9;2839:22;2818:53;:::i;:::-;2808:63;;2764:117;2920:2;2946:53;2991:7;2982:6;2971:9;2967:22;2946:53;:::i;:::-;2936:63;;2891:118;3048:2;3074:53;3119:7;3110:6;3099:9;3095:22;3074:53;:::i;:::-;3064:63;;3019:118;3176:2;3202:53;3247:7;3238:6;3227:9;3223:22;3202:53;:::i;:::-;3192:63;;3147:118;2691:581;;;;;;;:::o;3278:552::-;;;;3420:2;3408:9;3399:7;3395:23;3391:32;3388:2;;;3436:1;3433;3426:12;3388:2;3479:1;3504:53;3549:7;3540:6;3529:9;3525:22;3504:53;:::i;:::-;3494:63;;3450:117;3606:2;3632:53;3677:7;3668:6;3657:9;3653:22;3632:53;:::i;:::-;3622:63;;3577:118;3734:2;3760:53;3805:7;3796:6;3785:9;3781:22;3760:53;:::i;:::-;3750:63;;3705:118;3378:452;;;;;:::o;3836:407::-;;;3961:2;3949:9;3940:7;3936:23;3932:32;3929:2;;;3977:1;3974;3967:12;3929:2;4020:1;4045:53;4090:7;4081:6;4070:9;4066:22;4045:53;:::i;:::-;4035:63;;3991:117;4147:2;4173:53;4218:7;4209:6;4198:9;4194:22;4173:53;:::i;:::-;4163:63;;4118:118;3919:324;;;;;:::o;4249:420::-;;4393:2;4381:9;4372:7;4368:23;4364:32;4361:2;;;4409:1;4406;4399:12;4361:2;4473:1;4462:9;4458:17;4452:24;4503:18;4495:6;4492:30;4489:2;;;4535:1;4532;4525:12;4489:2;4563:89;4644:7;4635:6;4624:9;4620:22;4563:89;:::i;:::-;4553:99;;4423:239;4351:318;;;;:::o;4675:262::-;;4783:2;4771:9;4762:7;4758:23;4754:32;4751:2;;;4799:1;4796;4789:12;4751:2;4842:1;4867:53;4912:7;4903:6;4892:9;4888:22;4867:53;:::i;:::-;4857:63;;4813:117;4741:196;;;;:::o;4943:596::-;;;;5096:2;5084:9;5075:7;5071:23;5067:32;5064:2;;;5112:1;5109;5102:12;5064:2;5155:1;5180:64;5236:7;5227:6;5216:9;5212:22;5180:64;:::i;:::-;5170:74;;5126:128;5293:2;5319:64;5375:7;5366:6;5355:9;5351:22;5319:64;:::i;:::-;5309:74;;5264:129;5432:2;5458:64;5514:7;5505:6;5494:9;5490:22;5458:64;:::i;:::-;5448:74;;5403:129;5054:485;;;;;:::o;5545:698::-;;;;;5704:3;5692:9;5683:7;5679:23;5675:33;5672:2;;;5721:1;5718;5711:12;5672:2;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;6019:2;6045:53;6090:7;6081:6;6070:9;6066:22;6045:53;:::i;:::-;6035:63;;5990:118;6147:2;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6118:118;5662:581;;;;;;;:::o;6249:179::-;;6339:46;6381:3;6373:6;6339:46;:::i;:::-;6417:4;6412:3;6408:14;6394:28;;6329:99;;;;:::o;6434:108::-;6511:24;6529:5;6511:24;:::i;:::-;6506:3;6499:37;6489:53;;:::o;6548:118::-;6635:24;6653:5;6635:24;:::i;:::-;6630:3;6623:37;6613:53;;:::o;6702:732::-;;6850:54;6898:5;6850:54;:::i;:::-;6920:86;6999:6;6994:3;6920:86;:::i;:::-;6913:93;;7030:56;7080:5;7030:56;:::i;:::-;7109:7;7140:1;7125:284;7150:6;7147:1;7144:13;7125:284;;;7226:6;7220:13;7253:63;7312:3;7297:13;7253:63;:::i;:::-;7246:70;;7339:60;7392:6;7339:60;:::i;:::-;7329:70;;7185:224;7172:1;7169;7165:9;7160:14;;7125:284;;;7129:14;7425:3;7418:10;;6826:608;;;;;;;:::o;7440:109::-;7521:21;7536:5;7521:21;:::i;:::-;7516:3;7509:34;7499:50;;:::o;7555:147::-;7650:45;7689:5;7650:45;:::i;:::-;7645:3;7638:58;7628:74;;:::o;7708:364::-;;7824:39;7857:5;7824:39;:::i;:::-;7879:71;7943:6;7938:3;7879:71;:::i;:::-;7872:78;;7959:52;8004:6;7999:3;7992:4;7985:5;7981:16;7959:52;:::i;:::-;8036:29;8058:6;8036:29;:::i;:::-;8031:3;8027:39;8020:46;;7800:272;;;;;:::o;8078:327::-;;8241:67;8305:2;8300:3;8241:67;:::i;:::-;8234:74;;8338:31;8334:1;8329:3;8325:11;8318:52;8396:2;8391:3;8387:12;8380:19;;8224:181;;;:::o;8411:367::-;;8574:67;8638:2;8633:3;8574:67;:::i;:::-;8567:74;;8671:34;8667:1;8662:3;8658:11;8651:55;8737:5;8732:2;8727:3;8723:12;8716:27;8769:2;8764:3;8760:12;8753:19;;8557:221;;;:::o;8784:318::-;;8947:67;9011:2;9006:3;8947:67;:::i;:::-;8940:74;;9044:22;9040:1;9035:3;9031:11;9024:43;9093:2;9088:3;9084:12;9077:19;;8930:172;;;:::o;9108:372::-;;9271:67;9335:2;9330:3;9271:67;:::i;:::-;9264:74;;9368:34;9364:1;9359:3;9355:11;9348:55;9434:10;9429:2;9424:3;9420:12;9413:32;9471:2;9466:3;9462:12;9455:19;;9254:226;;;:::o;9486:375::-;;9649:67;9713:2;9708:3;9649:67;:::i;:::-;9642:74;;9746:34;9742:1;9737:3;9733:11;9726:55;9812:13;9807:2;9802:3;9798:12;9791:35;9852:2;9847:3;9843:12;9836:19;;9632:229;;;:::o;9867:366::-;;10030:67;10094:2;10089:3;10030:67;:::i;:::-;10023:74;;10127:34;10123:1;10118:3;10114:11;10107:55;10193:4;10188:2;10183:3;10179:12;10172:26;10224:2;10219:3;10215:12;10208:19;;10013:220;;;:::o;10239:367::-;;10402:67;10466:2;10461:3;10402:67;:::i;:::-;10395:74;;10499:34;10495:1;10490:3;10486:11;10479:55;10565:5;10560:2;10555:3;10551:12;10544:27;10597:2;10592:3;10588:12;10581:19;;10385:221;;;:::o;10612:372::-;;10775:67;10839:2;10834:3;10775:67;:::i;:::-;10768:74;;10872:34;10868:1;10863:3;10859:11;10852:55;10938:10;10933:2;10928:3;10924:12;10917:32;10975:2;10970:3;10966:12;10959:19;;10758:226;;;:::o;10990:368::-;;11153:67;11217:2;11212:3;11153:67;:::i;:::-;11146:74;;11250:34;11246:1;11241:3;11237:11;11230:55;11316:6;11311:2;11306:3;11302:12;11295:28;11349:2;11344:3;11340:12;11333:19;;11136:222;;;:::o;11364:370::-;;11527:67;11591:2;11586:3;11527:67;:::i;:::-;11520:74;;11624:34;11620:1;11615:3;11611:11;11604:55;11690:8;11685:2;11680:3;11676:12;11669:30;11725:2;11720:3;11716:12;11709:19;;11510:224;;;:::o;11740:366::-;;11903:67;11967:2;11962:3;11903:67;:::i;:::-;11896:74;;12000:34;11996:1;11991:3;11987:11;11980:55;12066:4;12061:2;12056:3;12052:12;12045:26;12097:2;12092:3;12088:12;12081:19;;11886:220;;;:::o;12112:371::-;;12275:67;12339:2;12334:3;12275:67;:::i;:::-;12268:74;;12372:34;12368:1;12363:3;12359:11;12352:55;12438:9;12433:2;12428:3;12424:12;12417:31;12474:2;12469:3;12465:12;12458:19;;12258:225;;;:::o;12489:339::-;;12670:84;12752:1;12747:3;12670:84;:::i;:::-;12663:91;;12784:9;12780:1;12775:3;12771:11;12764:30;12820:1;12815:3;12811:11;12804:18;;12653:175;;;:::o;12834:370::-;;12997:67;13061:2;13056:3;12997:67;:::i;:::-;12990:74;;13094:34;13090:1;13085:3;13081:11;13074:55;13160:8;13155:2;13150:3;13146:12;13139:30;13195:2;13190:3;13186:12;13179:19;;12980:224;;;:::o;13210:335::-;;13391:84;13473:1;13468:3;13391:84;:::i;:::-;13384:91;;13505:5;13501:1;13496:3;13492:11;13485:26;13537:1;13532:3;13528:11;13521:18;;13374:171;;;:::o;13551:341::-;;13732:84;13814:1;13809:3;13732:84;:::i;:::-;13725:91;;13846:11;13842:1;13837:3;13833:11;13826:32;13884:1;13879:3;13875:11;13868:18;;13715:177;;;:::o;13898:367::-;;14061:67;14125:2;14120:3;14061:67;:::i;:::-;14054:74;;14158:34;14154:1;14149:3;14145:11;14138:55;14224:5;14219:2;14214:3;14210:12;14203:27;14256:2;14251:3;14247:12;14240:19;;14044:221;;;:::o;14271:314::-;;14434:67;14498:2;14493:3;14434:67;:::i;:::-;14427:74;;14531:18;14527:1;14522:3;14518:11;14511:39;14576:2;14571:3;14567:12;14560:19;;14417:168;;;:::o;14591:371::-;;14754:67;14818:2;14813:3;14754:67;:::i;:::-;14747:74;;14851:34;14847:1;14842:3;14838:11;14831:55;14917:9;14912:2;14907:3;14903:12;14896:31;14953:2;14948:3;14944:12;14937:19;;14737:225;;;:::o;14968:368::-;;15131:67;15195:2;15190:3;15131:67;:::i;:::-;15124:74;;15228:34;15224:1;15219:3;15215:11;15208:55;15294:6;15289:2;15284:3;15280:12;15273:28;15327:2;15322:3;15318:12;15311:19;;15114:222;;;:::o;15342:366::-;;15505:67;15569:2;15564:3;15505:67;:::i;:::-;15498:74;;15602:34;15598:1;15593:3;15589:11;15582:55;15668:4;15663:2;15658:3;15654:12;15647:26;15699:2;15694:3;15690:12;15683:19;;15488:220;;;:::o;15714:372::-;;15877:67;15941:2;15936:3;15877:67;:::i;:::-;15870:74;;15974:34;15970:1;15965:3;15961:11;15954:55;16040:10;16035:2;16030:3;16026:12;16019:32;16077:2;16072:3;16068:12;16061:19;;15860:226;;;:::o;16092:330::-;;16255:67;16319:2;16314:3;16255:67;:::i;:::-;16248:74;;16352:34;16348:1;16343:3;16339:11;16332:55;16413:2;16408:3;16404:12;16397:19;;16238:184;;;:::o;16428:365::-;;16591:67;16655:2;16650:3;16591:67;:::i;:::-;16584:74;;16688:34;16684:1;16679:3;16675:11;16668:55;16754:3;16749:2;16744:3;16740:12;16733:25;16784:2;16779:3;16775:12;16768:19;;16574:219;;;:::o;16799:369::-;;16962:67;17026:2;17021:3;16962:67;:::i;:::-;16955:74;;17059:34;17055:1;17050:3;17046:11;17039:55;17125:7;17120:2;17115:3;17111:12;17104:29;17159:2;17154:3;17150:12;17143:19;;16945:223;;;:::o;17174:341::-;;17355:84;17437:1;17432:3;17355:84;:::i;:::-;17348:91;;17469:11;17465:1;17460:3;17456:11;17449:32;17507:1;17502:3;17498:11;17491:18;;17338:177;;;:::o;17521:297::-;;17701:83;17782:1;17777:3;17701:83;:::i;:::-;17694:90;;17810:1;17805:3;17801:11;17794:18;;17684:134;;;:::o;17824:368::-;;17987:67;18051:2;18046:3;17987:67;:::i;:::-;17980:74;;18084:34;18080:1;18075:3;18071:11;18064:55;18150:6;18145:2;18140:3;18136:12;18129:28;18183:2;18178:3;18174:12;18167:19;;17970:222;;;:::o;18198:329::-;;18361:67;18425:2;18420:3;18361:67;:::i;:::-;18354:74;;18458:33;18454:1;18449:3;18445:11;18438:54;18518:2;18513:3;18509:12;18502:19;;18344:183;;;:::o;18533:320::-;;18696:67;18760:2;18755:3;18696:67;:::i;:::-;18689:74;;18793:24;18789:1;18784:3;18780:11;18773:45;18844:2;18839:3;18835:12;18828:19;;18679:174;;;:::o;18859:369::-;;19022:67;19086:2;19081:3;19022:67;:::i;:::-;19015:74;;19119:34;19115:1;19110:3;19106:11;19099:55;19185:7;19180:2;19175:3;19171:12;19164:29;19219:2;19214:3;19210:12;19203:19;;19005:223;;;:::o;19234:118::-;19321:24;19339:5;19321:24;:::i;:::-;19316:3;19309:37;19299:53;;:::o;19358:112::-;19441:22;19457:5;19441:22;:::i;:::-;19436:3;19429:35;19419:51;;:::o;19476:381::-;;19683:148;19827:3;19683:148;:::i;:::-;19676:155;;19848:3;19841:10;;19665:192;;;:::o;19863:381::-;;20070:148;20214:3;20070:148;:::i;:::-;20063:155;;20235:3;20228:10;;20052:192;;;:::o;20250:381::-;;20457:148;20601:3;20457:148;:::i;:::-;20450:155;;20622:3;20615:10;;20439:192;;;:::o;20637:381::-;;20844:148;20988:3;20844:148;:::i;:::-;20837:155;;21009:3;21002:10;;20826:192;;;:::o;21024:379::-;;21230:147;21373:3;21230:147;:::i;:::-;21223:154;;21394:3;21387:10;;21212:191;;;:::o;21409:222::-;;21540:2;21529:9;21525:18;21517:26;;21553:71;21621:1;21610:9;21606:17;21597:6;21553:71;:::i;:::-;21507:124;;;;:::o;21637:807::-;;21924:3;21913:9;21909:19;21901:27;;21938:71;22006:1;21995:9;21991:17;21982:6;21938:71;:::i;:::-;22019:72;22087:2;22076:9;22072:18;22063:6;22019:72;:::i;:::-;22101:80;22177:2;22166:9;22162:18;22153:6;22101:80;:::i;:::-;22191;22267:2;22256:9;22252:18;22243:6;22191:80;:::i;:::-;22281:73;22349:3;22338:9;22334:19;22325:6;22281:73;:::i;:::-;22364;22432:3;22421:9;22417:19;22408:6;22364:73;:::i;:::-;21891:553;;;;;;;;;:::o;22450:210::-;;22575:2;22564:9;22560:18;22552:26;;22588:65;22650:1;22639:9;22635:17;22626:6;22588:65;:::i;:::-;22542:118;;;;:::o;22666:313::-;;22817:2;22806:9;22802:18;22794:26;;22866:9;22860:4;22856:20;22852:1;22841:9;22837:17;22830:47;22894:78;22967:4;22958:6;22894:78;:::i;:::-;22886:86;;22784:195;;;;:::o;22985:419::-;;23189:2;23178:9;23174:18;23166:26;;23238:9;23232:4;23228:20;23224:1;23213:9;23209:17;23202:47;23266:131;23392:4;23266:131;:::i;:::-;23258:139;;23156:248;;;:::o;23410:419::-;;23614:2;23603:9;23599:18;23591:26;;23663:9;23657:4;23653:20;23649:1;23638:9;23634:17;23627:47;23691:131;23817:4;23691:131;:::i;:::-;23683:139;;23581:248;;;:::o;23835:419::-;;24039:2;24028:9;24024:18;24016:26;;24088:9;24082:4;24078:20;24074:1;24063:9;24059:17;24052:47;24116:131;24242:4;24116:131;:::i;:::-;24108:139;;24006:248;;;:::o;24260:419::-;;24464:2;24453:9;24449:18;24441:26;;24513:9;24507:4;24503:20;24499:1;24488:9;24484:17;24477:47;24541:131;24667:4;24541:131;:::i;:::-;24533:139;;24431:248;;;:::o;24685:419::-;;24889:2;24878:9;24874:18;24866:26;;24938:9;24932:4;24928:20;24924:1;24913:9;24909:17;24902:47;24966:131;25092:4;24966:131;:::i;:::-;24958:139;;24856:248;;;:::o;25110:419::-;;25314:2;25303:9;25299:18;25291:26;;25363:9;25357:4;25353:20;25349:1;25338:9;25334:17;25327:47;25391:131;25517:4;25391:131;:::i;:::-;25383:139;;25281:248;;;:::o;25535:419::-;;25739:2;25728:9;25724:18;25716:26;;25788:9;25782:4;25778:20;25774:1;25763:9;25759:17;25752:47;25816:131;25942:4;25816:131;:::i;:::-;25808:139;;25706:248;;;:::o;25960:419::-;;26164:2;26153:9;26149:18;26141:26;;26213:9;26207:4;26203:20;26199:1;26188:9;26184:17;26177:47;26241:131;26367:4;26241:131;:::i;:::-;26233:139;;26131:248;;;:::o;26385:419::-;;26589:2;26578:9;26574:18;26566:26;;26638:9;26632:4;26628:20;26624:1;26613:9;26609:17;26602:47;26666:131;26792:4;26666:131;:::i;:::-;26658:139;;26556:248;;;:::o;26810:419::-;;27014:2;27003:9;26999:18;26991:26;;27063:9;27057:4;27053:20;27049:1;27038:9;27034:17;27027:47;27091:131;27217:4;27091:131;:::i;:::-;27083:139;;26981:248;;;:::o;27235:419::-;;27439:2;27428:9;27424:18;27416:26;;27488:9;27482:4;27478:20;27474:1;27463:9;27459:17;27452:47;27516:131;27642:4;27516:131;:::i;:::-;27508:139;;27406:248;;;:::o;27660:419::-;;27864:2;27853:9;27849:18;27841:26;;27913:9;27907:4;27903:20;27899:1;27888:9;27884:17;27877:47;27941:131;28067:4;27941:131;:::i;:::-;27933:139;;27831:248;;;:::o;28085:419::-;;28289:2;28278:9;28274:18;28266:26;;28338:9;28332:4;28328:20;28324:1;28313:9;28309:17;28302:47;28366:131;28492:4;28366:131;:::i;:::-;28358:139;;28256:248;;;:::o;28510:419::-;;28714:2;28703:9;28699:18;28691:26;;28763:9;28757:4;28753:20;28749:1;28738:9;28734:17;28727:47;28791:131;28917:4;28791:131;:::i;:::-;28783:139;;28681:248;;;:::o;28935:419::-;;29139:2;29128:9;29124:18;29116:26;;29188:9;29182:4;29178:20;29174:1;29163:9;29159:17;29152:47;29216:131;29342:4;29216:131;:::i;:::-;29208:139;;29106:248;;;:::o;29360:419::-;;29564:2;29553:9;29549:18;29541:26;;29613:9;29607:4;29603:20;29599:1;29588:9;29584:17;29577:47;29641:131;29767:4;29641:131;:::i;:::-;29633:139;;29531:248;;;:::o;29785:419::-;;29989:2;29978:9;29974:18;29966:26;;30038:9;30032:4;30028:20;30024:1;30013:9;30009:17;30002:47;30066:131;30192:4;30066:131;:::i;:::-;30058:139;;29956:248;;;:::o;30210:419::-;;30414:2;30403:9;30399:18;30391:26;;30463:9;30457:4;30453:20;30449:1;30438:9;30434:17;30427:47;30491:131;30617:4;30491:131;:::i;:::-;30483:139;;30381:248;;;:::o;30635:419::-;;30839:2;30828:9;30824:18;30816:26;;30888:9;30882:4;30878:20;30874:1;30863:9;30859:17;30852:47;30916:131;31042:4;30916:131;:::i;:::-;30908:139;;30806:248;;;:::o;31060:419::-;;31264:2;31253:9;31249:18;31241:26;;31313:9;31307:4;31303:20;31299:1;31288:9;31284:17;31277:47;31341:131;31467:4;31341:131;:::i;:::-;31333:139;;31231:248;;;:::o;31485:419::-;;31689:2;31678:9;31674:18;31666:26;;31738:9;31732:4;31728:20;31724:1;31713:9;31709:17;31702:47;31766:131;31892:4;31766:131;:::i;:::-;31758:139;;31656:248;;;:::o;31910:419::-;;32114:2;32103:9;32099:18;32091:26;;32163:9;32157:4;32153:20;32149:1;32138:9;32134:17;32127:47;32191:131;32317:4;32191:131;:::i;:::-;32183:139;;32081:248;;;:::o;32335:419::-;;32539:2;32528:9;32524:18;32516:26;;32588:9;32582:4;32578:20;32574:1;32563:9;32559:17;32552:47;32616:131;32742:4;32616:131;:::i;:::-;32608:139;;32506:248;;;:::o;32760:419::-;;32964:2;32953:9;32949:18;32941:26;;33013:9;33007:4;33003:20;32999:1;32988:9;32984:17;32977:47;33041:131;33167:4;33041:131;:::i;:::-;33033:139;;32931:248;;;:::o;33185:419::-;;33389:2;33378:9;33374:18;33366:26;;33438:9;33432:4;33428:20;33424:1;33413:9;33409:17;33402:47;33466:131;33592:4;33466:131;:::i;:::-;33458:139;;33356:248;;;:::o;33610:419::-;;33814:2;33803:9;33799:18;33791:26;;33863:9;33857:4;33853:20;33849:1;33838:9;33834:17;33827:47;33891:131;34017:4;33891:131;:::i;:::-;33883:139;;33781:248;;;:::o;34035:222::-;;34166:2;34155:9;34151:18;34143:26;;34179:71;34247:1;34236:9;34232:17;34223:6;34179:71;:::i;:::-;34133:124;;;;:::o;34263:483::-;;34472:2;34461:9;34457:18;34449:26;;34485:71;34553:1;34542:9;34538:17;34529:6;34485:71;:::i;:::-;34603:9;34597:4;34593:20;34588:2;34577:9;34573:18;34566:48;34631:108;34734:4;34725:6;34631:108;:::i;:::-;34623:116;;34439:307;;;;;:::o;34752:831::-;;35053:3;35042:9;35038:19;35030:27;;35067:71;35135:1;35124:9;35120:17;35111:6;35067:71;:::i;:::-;35148:80;35224:2;35213:9;35209:18;35200:6;35148:80;:::i;:::-;35275:9;35269:4;35265:20;35260:2;35249:9;35245:18;35238:48;35303:108;35406:4;35397:6;35303:108;:::i;:::-;35295:116;;35421:72;35489:2;35478:9;35474:18;35465:6;35421:72;:::i;:::-;35503:73;35571:3;35560:9;35556:19;35547:6;35503:73;:::i;:::-;35020:563;;;;;;;;:::o;35589:214::-;;35716:2;35705:9;35701:18;35693:26;;35729:67;35793:1;35782:9;35778:17;35769:6;35729:67;:::i;:::-;35683:120;;;;:::o;35809:283::-;;35875:2;35869:9;35859:19;;35917:4;35909:6;35905:17;36024:6;36012:10;36009:22;35988:18;35976:10;35973:34;35970:62;35967:2;;;36035:18;;:::i;:::-;35967:2;36075:10;36071:2;36064:22;35849:243;;;;:::o;36098:311::-;;36265:18;36257:6;36254:30;36251:2;;;36287:18;;:::i;:::-;36251:2;36337:4;36329:6;36325:17;36317:25;;36397:4;36391;36387:15;36379:23;;36180:229;;;:::o;36415:132::-;;36505:3;36497:11;;36535:4;36530:3;36526:14;36518:22;;36487:60;;;:::o;36553:114::-;;36654:5;36648:12;36638:22;;36627:40;;;:::o;36673:99::-;;36759:5;36753:12;36743:22;;36732:40;;;:::o;36778:113::-;;36880:4;36875:3;36871:14;36863:22;;36853:38;;;:::o;36897:184::-;;37030:6;37025:3;37018:19;37070:4;37065:3;37061:14;37046:29;;37008:73;;;;:::o;37087:147::-;;37225:3;37210:18;;37200:34;;;;:::o;37240:169::-;;37358:6;37353:3;37346:19;37398:4;37393:3;37389:14;37374:29;;37336:73;;;;:::o;37415:148::-;;37554:3;37539:18;;37529:34;;;;:::o;37569:305::-;;37628:20;37646:1;37628:20;:::i;:::-;37623:25;;37662:20;37680:1;37662:20;:::i;:::-;37657:25;;37816:1;37748:66;37744:74;37741:1;37738:81;37735:2;;;37822:18;;:::i;:::-;37735:2;37866:1;37863;37859:9;37852:16;;37613:261;;;;:::o;37880:185::-;;37937:20;37955:1;37937:20;:::i;:::-;37932:25;;37971:20;37989:1;37971:20;:::i;:::-;37966:25;;38010:1;38000:2;;38015:18;;:::i;:::-;38000:2;38057:1;38054;38050:9;38045:14;;37922:143;;;;:::o;38071:348::-;;38134:20;38152:1;38134:20;:::i;:::-;38129:25;;38168:20;38186:1;38168:20;:::i;:::-;38163:25;;38356:1;38288:66;38284:74;38281:1;38278:81;38273:1;38266:9;38259:17;38255:105;38252:2;;;38363:18;;:::i;:::-;38252:2;38411:1;38408;38404:9;38393:20;;38119:300;;;;:::o;38425:191::-;;38485:20;38503:1;38485:20;:::i;:::-;38480:25;;38519:20;38537:1;38519:20;:::i;:::-;38514:25;;38558:1;38555;38552:8;38549:2;;;38563:18;;:::i;:::-;38549:2;38608:1;38605;38601:9;38593:17;;38470:146;;;;:::o;38622:96::-;;38688:24;38706:5;38688:24;:::i;:::-;38677:35;;38667:51;;;:::o;38724:90::-;;38801:5;38794:13;38787:21;38776:32;;38766:48;;;:::o;38820:126::-;;38897:42;38890:5;38886:54;38875:65;;38865:81;;;:::o;38952:77::-;;39018:5;39007:16;;38997:32;;;:::o;39035:86::-;;39110:4;39103:5;39099:16;39088:27;;39078:43;;;:::o;39127:121::-;;39218:24;39236:5;39218:24;:::i;:::-;39205:37;;39195:53;;;:::o;39254:307::-;39322:1;39332:113;39346:6;39343:1;39340:13;39332:113;;;39431:1;39426:3;39422:11;39416:18;39412:1;39407:3;39403:11;39396:39;39368:2;39365:1;39361:10;39356:15;;39332:113;;;39463:6;39460:1;39457:13;39454:2;;;39543:1;39534:6;39529:3;39525:16;39518:27;39454:2;39303:258;;;;:::o;39567:320::-;;39648:1;39642:4;39638:12;39628:22;;39695:1;39689:4;39685:12;39716:18;39706:2;;39772:4;39764:6;39760:17;39750:27;;39706:2;39834;39826:6;39823:14;39803:18;39800:38;39797:2;;;39853:18;;:::i;:::-;39797:2;39618:269;;;;:::o;39893:180::-;39941:77;39938:1;39931:88;40038:4;40035:1;40028:15;40062:4;40059:1;40052:15;40079:180;40127:77;40124:1;40117:88;40224:4;40221:1;40214:15;40248:4;40245:1;40238:15;40265:180;40313:77;40310:1;40303:88;40410:4;40407:1;40400:15;40434:4;40431:1;40424:15;40451:180;40499:77;40496:1;40489:88;40596:4;40593:1;40586:15;40620:4;40617:1;40610:15;40637:102;;40729:2;40725:7;40720:2;40713:5;40709:14;40705:28;40695:38;;40685:54;;;:::o;40745:122::-;40818:24;40836:5;40818:24;:::i;:::-;40811:5;40808:35;40798:2;;40857:1;40854;40847:12;40798:2;40788:79;:::o;40873:122::-;40946:24;40964:5;40946:24;:::i;:::-;40939:5;40936:35;40926:2;;40985:1;40982;40975:12;40926:2;40916:79;:::o
Swarm Source
ipfs://0f6c5b943367aa960951c1470afc481c7a771be40198aa7927f6dbf9362f857c
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.