Overview
CELO Balance
CELO Value
$0.00Multichain Info
Latest 22 from a total of 22 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Up Campaign | 43916892 | 155 days ago | IN | 1 CELO | 0.00217587 | ||||
| Set Up Campaign | 43916885 | 155 days ago | IN | 1 CELO | 0.00239302 | ||||
| Set Up Campaign | 43916877 | 155 days ago | IN | 1 CELO | 0.00239335 | ||||
| Set Up Campaign | 43916870 | 155 days ago | IN | 1 CELO | 0.00217586 | ||||
| Set Up Campaign | 43916863 | 155 days ago | IN | 1 CELO | 0.00260308 | ||||
| Set Up Campaign | 43916856 | 155 days ago | IN | 1 CELO | 0.00217676 | ||||
| Set Up Campaign | 43916849 | 155 days ago | IN | 1 CELO | 0.00217586 | ||||
| Set Up Campaign | 43916842 | 155 days ago | IN | 1 CELO | 0.00260397 | ||||
| Set Up Campaign | 43916835 | 155 days ago | IN | 1 CELO | 0.00239434 | ||||
| Set Up Campaign | 43916828 | 155 days ago | IN | 1 CELO | 0.00260338 | ||||
| Set Up Campaign | 43916582 | 155 days ago | IN | 1 CELO | 0.00217587 | ||||
| Set Up Campaign | 43916575 | 155 days ago | IN | 1 CELO | 0.00239731 | ||||
| Set Up Campaign | 43916568 | 155 days ago | IN | 1 CELO | 0.00275371 | ||||
| Set Up Campaign | 43916561 | 155 days ago | IN | 1 CELO | 0.00239434 | ||||
| Set Up Campaign | 43916554 | 155 days ago | IN | 1 CELO | 0.00217947 | ||||
| Set Up Campaign | 43916547 | 155 days ago | IN | 1 CELO | 0.00239335 | ||||
| Set Up Campaign | 43916540 | 155 days ago | IN | 1 CELO | 0.00230727 | ||||
| Set Up Campaign | 43916533 | 155 days ago | IN | 1 CELO | 0.00260698 | ||||
| Set Up Campaign | 43916526 | 155 days ago | IN | 1 CELO | 0.00260428 | ||||
| Set Up Campaign | 43916519 | 155 days ago | IN | 1 CELO | 0.00239335 | ||||
| Set Up Campaign | 43916300 | 155 days ago | IN | 1 CELO | 0.00736766 | ||||
| Set Minimum Toke... | 43916259 | 155 days ago | IN | 0 CELO | 0.00071897 |
Latest 21 internal transactions
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 43916892 | 155 days ago | 1 CELO | ||||
| 43916885 | 155 days ago | 1 CELO | ||||
| 43916877 | 155 days ago | 1 CELO | ||||
| 43916870 | 155 days ago | 1 CELO | ||||
| 43916863 | 155 days ago | 1 CELO | ||||
| 43916856 | 155 days ago | 1 CELO | ||||
| 43916849 | 155 days ago | 1 CELO | ||||
| 43916842 | 155 days ago | 1 CELO | ||||
| 43916835 | 155 days ago | 1 CELO | ||||
| 43916828 | 155 days ago | 1 CELO | ||||
| 43916582 | 155 days ago | 1 CELO | ||||
| 43916575 | 155 days ago | 1 CELO | ||||
| 43916568 | 155 days ago | 1 CELO | ||||
| 43916561 | 155 days ago | 1 CELO | ||||
| 43916554 | 155 days ago | 1 CELO | ||||
| 43916547 | 155 days ago | 1 CELO | ||||
| 43916540 | 155 days ago | 1 CELO | ||||
| 43916533 | 155 days ago | 1 CELO | ||||
| 43916526 | 155 days ago | 1 CELO | ||||
| 43916519 | 155 days ago | 1 CELO | ||||
| 43916300 | 155 days ago | 1 CELO |
Cross-Chain Transactions
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x42B55484...C91325636 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Source Code (Solidity)
/** *Submitted for verification at celoscan.io on 2025-08-19 */ // Sources flattened with hardhat v2.26.1 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol) pragma solidity >=0.8.4; /** * @dev Standard ERC-20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC-721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC-1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol) pragma solidity >=0.4.16; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity >=0.6.2; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC-20 * applications. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * Both values are immutable: they can only be set once during construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /// @inheritdoc IERC20 function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /// @inheritdoc IERC20 function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /// @inheritdoc IERC20 function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Skips emitting an {Approval} event indicating an allowance update. This is not * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * * ```solidity * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner`'s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance < type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol) pragma solidity ^0.8.20; /** * @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 { bool private _paused; /** * @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); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @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()); } } // File contracts/Approved.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.28; abstract contract Approved is Ownable, Pausable { error AddressIsZero(); event Approval(address indexed); event UnApproval(address indexed); // Mapping of account to approvals mapping (address => bool) private approval; // Only approved account is allowed modifier onlyApproved { require(_isApproved(_msgSender()), "Not approved account"); _; } constructor() Ownable(_msgSender()) { _setPermission(_msgSender(), true); } // _approve(toApprove, true); /** * @dev Set approval for * @param target : Account to set approval for * @param value : Approval state - true or false */ function _setPermission(address target, bool value) internal { if(target == address(0)) revert AddressIsZero(); approval[target] = value; } /** * @dev Set approval for target * @param target : Account to set approval for */ function setPermission(address target) public onlyOwner { _setPermission(target, true); emit Approval(target); } /** * @dev Set approval for target * @param target : Account to set approval for */ function _isApproved(address target) internal view returns(bool result) { result = approval[target]; } /** * @dev Set approval for target * @param target : Account to set approval for */ function isPermitted(address target) public view returns(bool) { return _isApproved(target); } /** * @dev Set approval for target * @param target : Account to set approval for */ function unApprove(address target) public onlyOwner { _setPermission(target, false); emit UnApproval(target); } } // File contracts/Admins.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.28; abstract contract Admins is Approved { struct Admin { address id; bool active; } /// @dev Total number of admins uint private adminCount; /// Admins slots mapping(uint8 => address) private slots; /// @dev Mapping of slots to admin data mapping(address => bool) private isAdmin; /** * @dev Only admin * @notice Even if no admin is added, we will always byepass the out-of-bound error since * we already added at least one content to the admins array in the constructor, it wil always fetch zero slot. */ modifier onlyAdmin() { require(_isAdmin(_msgSender()), 'Only admin'); _; } function _isAdmin(address target) internal view returns(bool result) { result = isAdmin[target]; } /** * @dev Add admin and activate them * @param target : Account to add */ function _addAdmin(address target) internal { require(!isAdmin[target], 'Admin already added'); isAdmin[target] = true; uint8 slot = uint8(adminCount); adminCount = slot + 1; slots[slot] = target; } /** * @dev Toggle admin status either activate or deactivate them by toggling back and forth. * @param target : Target account */ function toggleAdminStatus(address target) public onlyOwner { bool status = isAdmin[target]; isAdmin[target] = !status; } /// Initialize an empty slot in the admins array function setAdmin(address target) public onlyOwner { _addAdmin(target); } /// Return all admins function getAdmins() public view returns(Admin[] memory _admins) { uint8 _adminCount = uint8(adminCount); if(_adminCount == 0) return _admins; _admins = new Admin[](_adminCount); for(uint8 i = 0; i < _adminCount; i++) { address target = slots[i]; _admins[i] = Admin(target, isAdmin[target]); } return _admins; } } // File contracts/interfaces/IKnowToken.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.28; interface IKnowToken { function allocate(uint amount, address to) external returns(bool); function burn(address holder, uint amount) external returns(bool); } // File contracts/interfaces/ILearna.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.28; interface ILearna { enum Mode { LOCAL, LIVE } error UserBlacklisted(); error NotEligible(); error ClaimEnded(uint64); error InvalidAddress(address); error CampaignClaimNotActivated(); error InsufficientAllowance(uint256); error ClaimAddressNotSet(); error NotInitialized(); event NewCampaign(Campaign campaign); event CampaignUpdated(Campaign campaign); event PointRecorded(address indexed user, uint weekId, bytes32 campainHash, QuizResultInput quizResult); event Sorted(uint _weekId, uint newWeekId, CampaignData[] campaigns); event CampaignCreated(uint weekId, address indexed tipper, Campaign data, bytes32[] campainHashes); event UserStatusChanged(address[] users, bool[] newStatus); struct CData { uint platformToken; uint256 fundsNative; uint256 fundsERC20; uint96 totalPoints; uint64 lastUpdated; uint activeLearners; address operator; address token; CampaignData data; } struct Campaign { CData data; address[] users; } struct GetCampaign { Campaign cp; uint32 slot; } struct CampaignData { bytes32 hash_; bytes encoded; } struct WeekInitializer { bool hasSlot; uint32 slot; } struct WeekProfileData { uint weekId; ReadProfile[] campaigns; } struct ReadProfile { Eligibility eligibility; Profile profile; bool isClaimed; bytes32 hash_; } struct Answer { bytes questionHash; uint64 selected; bool isUserSelected; } struct AnswerInput { string questionHash; uint64 selected; bool isUserSelected; } struct QuizResultOther { bytes id; bytes quizId; uint32 score; bytes title; uint64 totalPoints; uint16 percentage; uint64 timeSpent; bytes completedAt; } struct QuizResultOtherInput { string id; string quizId; uint32 score; string title; uint64 totalPoints; uint16 percentage; uint64 timeSpent; string completedAt; } struct QuizResultInput { AnswerInput[] answers; QuizResultOtherInput other; } struct QuizResult { Answer[] answers; QuizResultOther other; } struct ProfileOther { uint amountMinted; uint8 totalQuizPerWeek; bytes32 passkey; bool haskey; } struct Profile { QuizResult[] quizResults; ProfileOther other; } struct WeekData { uint weekId; Campaign[] campaigns; uint96 claimDeadline; } // Readonly data struct ReadData { State state; WeekData[] wd; CampaignData[] approved; WeekProfileData[] profileData; } struct State { uint minimumToken; uint64 transitionInterval; uint64 transitionDate; uint weekId; } struct Eligibility { bool isEligible; uint erc20Amount; uint nativeAmount; uint platform; address token; bytes32 hash_; uint weekId; } // Eligibilities for the previous 3 weeks at most struct Eligibilities { Eligibility[] elgs; uint weekId; } struct UserCampaigns { uint weekId; bytes32[] campaigns; } function checkEligibility(address user) external view returns (Eligibilities memory); // function setIsClaimed(address user, uint weekId, bytes32 hash_) external; function hasClaimed(address user, uint weekId, bytes32 hash_) external view returns(bool); function getPlatformToken() external view returns(address); function onCampaignValueChanged( uint weekId, bytes32 hash_, uint256 fundsNative, uint256 fundsERC20, uint256 platformToken, address user ) external; } // File contracts/Week.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.28; abstract contract Week is ILearna, Admins { /// @dev Other state variables State private state; ///@notice Platform token IKnowToken internal token; ///@notice Claim address address public claim; /// @dev Claim deadlines mapping(uint => uint96) private claimDeadlines; ///@dev Mapping that shows whether user has claimed reward for a specific week or not mapping(address user => mapping(uint week => mapping(bytes32 => bool))) internal isClaimed; /**@dev Set claimed status for a user * @param user : User address * @param weekId : Week Id * @param hash_ : Hash of the claim */ // function _setIsClaimed(address user, uint weekId, bytes32 hash_) internal whenNotPaused onlyApproved() { function _setIsClaimed(address user, uint weekId, bytes32 hash_) internal { if(!isClaimed[user][weekId][hash_]) isClaimed[user][weekId][hash_] = true; } /** * @notice This function checks if a user has claimed their reward for a specific week. * @dev It returns true if the user has claimed the reward, false otherwise. * @param user : User address * @param weekId : Week Id * @return bool : True if user has claimed reward for the week, false otherwise */ function hasClaimed(address user, uint weekId, bytes32 hash_) external view returns(bool) { return isClaimed[user][weekId][hash_]; } function _getDeadline(uint weekId) internal view returns(uint96 deadline) { deadline = claimDeadlines[weekId]; } /** * @dev Set claim deadline * @param weekId : Week Id * @param deadline : New deadline */ function _setClaimDeadline(uint weekId, uint96 deadline) internal { claimDeadlines[weekId] = deadline; } /** * @dev Update minimum token * @param minToken : New minimum payable token */ function _setMinimumToken(uint minToken) internal { state.minimumToken = minToken; } /** * @dev Set approval for target * @param newClaim : Account to set approval for */ function setClaimAddress(address newClaim) public onlyOwner returns(bool) { claim = newClaim; return true; } /** * @dev Update minimum token - onlyOwner * @param minToken : New minimum payable token */ function setMinimumToken(uint minToken) public onlyOwner { _setMinimumToken(minToken); } /** * @dev Update transition interval * @param intervalInMin : New interval * @param pastWeek : Week Id */ function _setTransitionInterval(uint32 intervalInMin, uint pastWeek) internal { if(intervalInMin > 0) { unchecked { uint64 newInterval = intervalInMin * 1 minutes; uint64 transitionDate = _now() + newInterval; state.transitionInterval = newInterval; state.transitionDate = transitionDate; _setClaimDeadline(pastWeek, transitionDate); } } } /** * @dev Update transition interval * @param interval : New interval * @notice Transition interval will always reset the transition date */ function setTransitionInterval(uint32 interval) public onlyOwner { if(interval > 0) state.transitionInterval = interval * 1 minutes; } /** * @dev Transition to a new week and return the new week Id */ function _transitionToNewWeek() internal returns(uint newWeekId) { state.weekId ++; newWeekId = state.weekId; } /// @dev Return the state variable object function _getState() internal view returns(State memory st) { st = state; } /// @dev Update the token variable. Only-owner function function setToken(address _token) public onlyOwner returns(bool) { require(_token != address(0), "Token is zero"); token = IKnowToken(_token); return true; } /// @dev Get platform token function getPlatformToken() external view returns(address) { return address(token); } // Return the current unix time stamp on the network function _now() internal view returns(uint64 time) { time = uint64(block.timestamp); } } // File contracts/Campaigns.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.28; /** * @title Campaigns. * @author : Bobeu - https://github.com/bobeu * @notice Non-deployable parent contract that perform CRUD operation on campaigns */ abstract contract Campaigns is Week { ///@dev CampaignData[] private campaignList; ///@dev All registered campaign mapping(bytes32 => bool) private isRegistered; // Campaigns // mapping(bytes32 campaignHash => Initializer) private initializer; ///@dev Week inititializer mapping(uint weekId => mapping(bytes32 => WeekInitializer)) private wInit; //week data for all campaigns mapping(uint weekId => Campaign[]) private campaigns; // Total campaigns uint private allCampaigns; // Mapping of campaigns to identifiers mapping(uint campaignIndex => bytes32 campaingHashValue) private indexer; ///@dev Registers a new campaign function _checkAndInitializeCampaign(CampaignData memory data) internal { if(!isRegistered[data.hash_]){ isRegistered[data.hash_] = true; campaignList.push(data); } } /** * @dev Adds a campaign to a new week * @param data : Campaign data struct * @param weekId : Week Id * @param operator : Campaign operator or owner * @param fundsNative : Amount to fund in native asset * @param fundsERC20 : Amount to fund in erc20 asset * @param platformToken : Amount to fund in platform asset * @param token : ERC20 token address */ function _addCampaignToNewWeek( CampaignData memory data, uint weekId, address operator, uint256 fundsNative, uint256 fundsERC20, uint256 platformToken, address token ) internal returns(Campaign memory cmp) { WeekInitializer memory wi = wInit[weekId][data.hash_]; if(!wi.hasSlot){ wi.hasSlot = true; wi.slot = uint32(campaigns[weekId].length); campaigns[weekId].push(); campaigns[weekId][wi.slot].data = CData(platformToken, fundsNative, fundsERC20, 0, _now(), 0, operator, token, data); wInit[weekId][data.hash_] = wi; cmp = _getCampaign(weekId, data.hash_).cp; emit NewCampaign(cmp); } else { cmp = _getCampaign(weekId, data.hash_).cp; unchecked { cmp.data.fundsNative += fundsNative; cmp.data.platformToken += platformToken; } if(operator != cmp.data.operator) cmp.data.operator = operator; // If token is not zero address, then update the fundsERC20 // If token is zero address, then fundsERC20 will not be updated // If token is same as existing token, then update the fundsERC20 // If token is different, then update the token address and fundsERC20 if(fundsERC20 > 0 && token != address(0)) { bool execute = false; if(token == cmp.data.token){ execute = true; } else { if(cmp.data.fundsERC20 == 0) { cmp.data.token = token; execute = true; } } if(execute) { if(IERC20(token).allowance(_msgSender(), address(this)) >= fundsERC20) { if(IERC20(token).transferFrom(_msgSender(), claim, fundsERC20)){ unchecked { cmp.data.fundsERC20 += fundsERC20; } } } } } cmp.data.lastUpdated = _now(); _setCampaign(wi.slot, weekId, cmp.data); emit CampaignUpdated(cmp); } } /** * @dev Only approved campaign can pass * @param hash_ : Campaign Hash : Hash of the campaign string e.g keccack256("Solidity") * @param weekId : week id */ function _validateCampaign(bytes32 hash_, uint weekId) internal view { require(isRegistered[hash_], "Campaign not registered"); require(wInit[weekId][hash_].hasSlot, "Campaign not in current week"); } /** * @dev Return the hashed result of a campaign string * @param campaign : Campaign string */ function _getHash(string memory campaign) internal pure returns(CampaignData memory data) { data.encoded = bytes(campaign); data.hash_ = keccak256(data.encoded); } /** * @dev Initializeds a new campaign and create an index for it if not exist, Then initialize the campaign for the * parsed weekId. If already iniitialized, update the existing campaign in storage. * @param data : Campaign data struct * @param weekId : Week Id * @param operator : Campaign operator or owner * @param fundsNative : Amount to fund in native asset * @param fundsERC20 : Amount to fund in erc20 asset * @param platformToken : Amount to fund in platform asset * @param token : ERC20 token address */ function _tryInitializeCampaign( uint weekId, CampaignData memory data, address operator, uint256 fundsNative, uint256 fundsERC20, uint256 platformToken, address token ) internal returns(Campaign memory cmp) { _checkAndInitializeCampaign(data); cmp = _addCampaignToNewWeek( data, weekId, operator, fundsNative, fundsERC20, platformToken, token ); _validateCampaign(data.hash_, weekId); } ///@dev Activates or deactivates campaigns function toggleCampaignStatus(string[] memory _campaigns) public returns(bool) { for(uint i = 0; i < _campaigns.length; i++) { bytes32 hash_ = _getHash(_campaigns[i]).hash_; bool status = isRegistered[hash_]; isRegistered[hash_] = !status; } return true; } /** * Fetches the campaign for the particular week * @param weekId : Week id * @return data : Campaigns */ function _getCampaings(uint weekId) internal view returns(Campaign[] memory data) { data = campaigns[weekId]; } /** * Update campaign data in storage * @param weekId : Week id * @param _campaign : Other data * @param slot : Campaign Id */ function _setCampaign( uint32 slot, uint weekId, CData memory _campaign ) internal { campaigns[weekId][slot].data = _campaign; } /** * Update campaign data in storage * @param weekId : Week id * @param slot : Campaign Id * @param user : Target user */ function _updateCampaignUsersList( uint32 slot, uint weekId, address user ) internal { campaigns[weekId][slot].users.push(user); } /** * Update other campaign data * @param weekId : Week id * @param hash_ : Campaign Id * @notice Fetch a campaign only if there is a slot for such campaign for the requested week */ function _getCampaign(uint weekId, bytes32 hash_) internal view returns(GetCampaign memory res) { WeekInitializer memory wi = wInit[weekId][hash_]; res.slot = wi.slot; if(wi.hasSlot) { res.cp = campaigns[weekId][wi.slot]; } } ///@dev Return approved campaigns function _getApprovedCampaigns() internal view returns(CampaignData[] memory result) { result = campaignList; } ///@dev Return campaigns for the previous week. This will be used to determine the amount claimables by learners function getCampaignsForThePastWeek() external view returns(Campaign[] memory result) { uint pastWeek = _getState().weekId; if(pastWeek == 0) return result; return _getCampaings(pastWeek - 1); } /** * @dev Set up all campaigns for the new week. * @notice it transition into a new week bringing forward the funds from the previous week to the new week. * @param newIntervalInMin : New interval to update * @param callback : Callback function to run for each campaign */ function _initializeAllCampaigns(uint32 newIntervalInMin, uint _platformToken, function(CData memory, uint) internal returns(CData memory) callback) internal returns(uint pastWeek, uint newWeek, CampaignData[] memory cData) { State memory st = _getState(); require(st.transitionDate < _now(), "Transition is in future"); pastWeek = st.weekId; cData = _getApprovedCampaigns(); newWeek = _transitionToNewWeek(); _setTransitionInterval(newIntervalInMin, pastWeek); for(uint i = 0; i < cData.length; i++) { bytes32 hash_ = cData[i].hash_; GetCampaign memory cmp = _getCampaign(pastWeek, hash_); _bringForward(pastWeek, newWeek, hash_); _setCampaign(cmp.slot, pastWeek, callback(cmp.cp.data, _platformToken)); } } /** * @dev Bring forward the campaign balances from the previous week to a new week * @param weekEnded : Current week * @param newWeek : New week * @param hash_ : Campaign hash */ function _bringForward(uint weekEnded, uint newWeek, bytes32 hash_) internal { GetCampaign memory prevWk; if(weekEnded > 0){ uint prevWkId = weekEnded - 1; // If the week ended is greater than 0, then we can bring forward the funds prevWk = _getCampaign(prevWkId, hash_); _tryInitializeCampaign( newWeek, prevWk.cp.data.data, prevWk.cp.data.operator, prevWk.cp.data.fundsNative, prevWk.cp.data.fundsERC20, prevWk.cp.data.platformToken, prevWk.cp.data.token ); // Reset the funds for the previous week prevWk.cp.data.fundsERC20 = 0; prevWk.cp.data.fundsNative = 0; prevWk.cp.data.platformToken = 0; prevWk.cp.data.lastUpdated = _now(); _setCampaign(prevWk.slot, prevWkId, prevWk.cp.data); } else { prevWk = _getCampaign(weekEnded, hash_); _tryInitializeCampaign( newWeek, prevWk.cp.data.data, prevWk.cp.data.operator, 0, 0, 0, prevWk.cp.data.token ); } } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, * consider using {ReentrancyGuardTransient} instead. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File contracts/libraries/Utils.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.28; library Utils { /**@dev Calculate the rate * @param fullPoints : Full or aggregate share/points * @param unitPoint : Point her user * @param principal : Principal amount * @param decimals : Number of leading zeros on which the principal is based ex. Celo is based in 18 zeros * @notice Rate is returned in %, and we use 1 ether i.e 1e18 as the full percentage i.e 100% */ function calculateShare( uint96 fullPoints, uint64 unitPoint, uint principal, uint8 decimals ) internal pure returns (uint share) { if(fullPoints == 0 || unitPoint == 0 || principal == 0) return 0; require(fullPoints >= unitPoint, 'Invalid principal'); unchecked { uint base = 10 ** decimals; share = (((unitPoint * base) / fullPoints) * principal) /base; } } } // File contracts/Learna.sol // Original license: SPDX_License_Identifier: MIT pragma solidity 0.8.28; contract Learna is Campaigns, ReentrancyGuard { using Utils for uint96; Mode private mode; ///@notice Flag that controls whether to use key mechanism for learners or not bool public useKey; // Dev Address address private dev; // Campaign fee receiver address private immutable feeTo; // Profiles for each campaign in week id mapping(uint weekId => mapping(bytes32 hash_ => mapping(address => Profile))) private learners; /// @dev All campaigns user subscribed to for all the weeks. mapping(uint => mapping(address => bytes32[])) private userCampaigns; /// @dev Mapping showing whether users have registred for a campaign for given week or not mapping(address => mapping(bytes32 => mapping(uint => bool))) registered; modifier validateAddress(address target) { require(target != address(0), "Token is zero"); _; } /** * @dev Constructor * @param _admins : Addresses to be added as admin * @param transitionInterval : Interval in time with which a week can be sorted. Ex. If its 7 days, this mean an admin * cannot perform the sort function until its 7 days from the last sorted time. * @param _mode : Deployment mode - LOCAL or LIVE * @notice We instanitate the admins array with an empty content. This is to ensure that anyone with slot 0 will always be * false otherwise anyone with 0 slot will automatically inherits the attributes of an admin in slot 0. If such as admin is active, * anyone could perform an admin role. */ constructor( address[] memory _admins, uint32 transitionInterval, Mode _mode, address _feeTo, string[] memory _campaigns ) { _setMinimumToken(1e16); mode = _mode; dev = _msgSender(); require(_feeTo != address(0), "Fee manager is zero"); feeTo = _feeTo; if(mode == Mode.LIVE){ _setTransitionInterval(transitionInterval, _getState().weekId); useKey = false; } else { useKey = true; } for(uint i = 0; i < _admins.length; i++) { if(_admins[i] != address(0)) _addAdmin(_admins[i]); } for(uint i = 0; i < _campaigns.length; i++) { _tryInitializeCampaign(_getState().weekId, _getHash(_campaigns[i]), _msgSender(), 0, 0, 0, address(0)); } } receive() external payable {} /** * Fetch profile * @param weekId : Week id * @param hash_ : Campaign hash * @param user : Target user * @return profile : Profile data */ function _getProfile(uint weekId, bytes32 hash_, address user) internal view returns(Profile memory profile) { profile = learners[weekId][hash_][user]; } /** * Toggle useKey status. @notice Toggling the function will continously alter the state of the useKey variable by negating the current status */ function toggleUseKey() public onlyOwner returns(bool) { bool status = useKey; useKey = !status; return true; } /** * Update profile * @param weekId : Week id * @param hash_ : Campaign hash * @param user : Target user * @param profile : Profile data */ function _setProfile(uint weekId, bytes32 hash_, address user, ProfileOther memory profile) internal { learners[weekId][hash_][user].other = profile; } /** * Forward value to a specific address * @param amount : Amount to forward * @param to : Address to forward the fee to */ function _sendValue(uint amount, address to) internal { if(amount > 0) { require(address(this).balance >= amount, "Insufficient bal"); (bool s,) = to.call{value: amount}(''); require(s, "Failed"); } } /////////////////////////////////////////////////////////// // PUBLIC FUNCTION : SET UP A CAMPAIGN // /////////////////////////////////////////////////////////// /** * @dev Add new campaign to the current week and fund it. Also, can be used to increase the funds in existing campaign for the week. * @param _campaign : Campaign string * @param token : ERC20 contract address if fundsErc20 is greater than 0 * @param fundsErc20 : Amount to fund the campaign in ERC20 currency e.g $GROW, $G. etc * @notice Anyone can setUp or add campaign provided they have enough to fund it. Campaign can be funded in two ways: * - ERC20. If the amount in fundsErc20 is greater than 0, it is suppose that the sender intends to also fund the campaign * in ERC20-based asset hence the 'token' parameter must not be zero. * - Native such as CELO. */ function setUpCampaign( string memory _campaign, uint256 fundsErc20, address token ) public payable returns(bool) { _sendValue(msg.value, claim); _tryInitializeCampaign( _getState().weekId, _getHash(_campaign), _msgSender(), msg.value, fundsErc20, 0, token ); return true; } ///////////////////////////////////////////////////////////////////////// // PUBLIC FUNCTION : ADJUST THE FUNDS IN A CAMPAING // //////////////////////////////////////////////////////////////////////// /** * @dev Adjust funds in campaigns. Only admin function * @param hash_ : Campaign hashes * @param erc20Value : ERC20 values. * @param nativeValue : Values in native coin e.g CELO * @notice The function can increase or decrease the values in a campaign. Just parse desired values. * - Value cannot be adjusted beyond the balances in this contract. */ function adjustCampaignValues( bytes32 hash_, uint erc20Value, uint nativeValue ) public onlyAdmin returns(bool) { uint weekId = _getState().weekId; _validateCampaign(hash_, weekId); GetCampaign memory res = _getCampaign(weekId, hash_); require(res.cp.data.token != address(0), "Token is zero"); require(IERC20(res.cp.data.token).balanceOf(claim) >= erc20Value, "ERC20Bal inconsistent"); require(claim.balance >= nativeValue, "New value exceeds balance"); res.cp.data.fundsERC20 = erc20Value; res.cp.data.fundsNative = nativeValue; res.cp.data.lastUpdated = _now(); _setCampaign(res.slot, weekId, res.cp.data); return true; } //////////////////////////////////////////////////////////////////////////////////////// // PUBLIC FUNCTION : KEEP TRACK OF POINTS EARNED FROM PARTICIPATING IN QUIZZES // //////////////////////////////////////////////////////////////////////////////////////// /** * @dev Delegate transaction to the Admin account also generate user key for all the campaigns. */ function delegateTransaction() external payable returns(bool) { return _generateKey(msg.value); } /** * @dev Register users for weekly reward * @param user : User * @param hash_ : Campaign hash * @param quizResult : Array of quiz result for a campaign * @notice Only owner function */ function recordPoints(address user, QuizResultInput memory quizResult, bytes32 hash_) public payable onlyAdmin whenNotPaused returns(bool) { uint weekId = _getState().weekId; _sendValue(msg.value, feeTo); require(user != address(0), "Invalid user"); _validateCampaign(hash_, weekId); GetCampaign memory res = _getCampaign(weekId, hash_); Profile memory pf = _getProfile(weekId, hash_, user); if(!_checkRegistration(weekId, hash_, user)) { _updateCampaignUsersList(res.slot, weekId, user); unchecked { res.cp.data.activeLearners += 1; } } require(pf.other.totalQuizPerWeek <= 120, 'Storage limit exceeded'); unchecked { pf.other.totalQuizPerWeek += 1; res.cp.data.totalPoints += quizResult.other.score; } _setProfile(weekId, hash_, user, pf.other); uint index = learners[weekId][hash_][user].quizResults.length; learners[weekId][hash_][user].quizResults.push(); learners[weekId][hash_][user].quizResults[index].other.id = bytes(quizResult.other.id); learners[weekId][hash_][user].quizResults[index].other.quizId = bytes(quizResult.other.quizId); learners[weekId][hash_][user].quizResults[index].other.completedAt = bytes(quizResult.other.completedAt); learners[weekId][hash_][user].quizResults[index].other.title = bytes(quizResult.other.title); learners[weekId][hash_][user].quizResults[index].other.score = quizResult.other.score; learners[weekId][hash_][user].quizResults[index].other.totalPoints = quizResult.other.totalPoints; learners[weekId][hash_][user].quizResults[index].other.percentage = quizResult.other.percentage; learners[weekId][hash_][user].quizResults[index].other.timeSpent = quizResult.other.timeSpent; for(uint i = 0; i < quizResult.answers.length; i++){ AnswerInput memory answer = quizResult.answers[i]; learners[weekId][hash_][user].quizResults[index].answers.push(); learners[weekId][hash_][user].quizResults[index].answers[i] = Answer(bytes(answer.questionHash), answer.selected, answer.isUserSelected); } _setCampaign(res.slot, weekId, res.cp.data); emit PointRecorded(user, weekId, hash_, quizResult); return true; } /////////////////////////////////////////////////////////////////////////////////////////////// // PUBLIC FUNCTIONS // /////////////////////////////////////////////////////////////////////////////////////////////// /** * @dev Allocate weekly earnings * @param newIntervalInMin : New transition interval for the new week. The interval is used to determined the claim deadline. * @param amountInKnowToken : Amount to allocate in GROW token * @notice We first for allowance of owner to this contract. If allowance is zero, we assume allocation should come from * the GROW Token. Also, previous week payout will be closed. Learners must withdraw from past week before the current week ends */ function sortWeeklyReward(uint amountInKnowToken, uint32 newIntervalInMin) public whenNotPaused onlyAdmin returns(bool) { (uint currentWk, uint newWk, CampaignData[] memory cData) = _initializeAllCampaigns(newIntervalInMin, amountInKnowToken, _callback); if(amountInKnowToken > 0) { require(address(token) != address(0), "Tk empty"); require(token.allocate(amountInKnowToken, claim), 'Allocation failed'); } emit Sorted(currentWk, newWk, cData); return true; } /** * @dev Triggers stopped state. */ function pause() public onlyOwner { _pause(); } /** * @dev Returns to normal state. */ function unpause() public onlyOwner { _unpause(); } /////////////////////////////////// // INTERNAL FUNCTIONS // /////////////////////////////////// /**@dev If activated, generate new key for the user, and allocate some amount of GROW token to them based on the amount of value they have sent along with the call. */ function _createKey(address user, uint value, uint weekId, bytes32 hash_) internal returns(Profile memory pf) { pf = _getProfile(weekId, hash_, user); if(value > 0) { token.allocate(value, user); } if(!pf.other.haskey) { pf.other.haskey = true; pf.other.passkey = keccak256(abi.encodePacked(user, weekId, value)); } } /** * @dev Generate user key for all campaigns in the current week. * @param value : Amount sent as minimum token */ function _generateKey(uint256 value) internal returns(bool) { uint weekId = _getState().weekId; uint minimumToken = _getState().minimumToken; Campaign[] memory cps = _getCampaings(weekId); if(minimumToken > 0) { require(value >= minimumToken, "Insufficient token"); } _sendValue(value, feeTo); uint valuePerCampaign; if(value > 0 && value >= cps.length) { unchecked { valuePerCampaign = value / cps.length; } } address user = _msgSender(); for(uint i = 0; i < cps.length; i++) { bytes32 hash_ = cps[i].data.data.hash_; Profile memory pf = _createKey(user, valuePerCampaign, weekId, hash_); _setProfile(weekId, hash_, user, pf.other); } return true; } function _checkRegistration(uint weekId, bytes32 hash_, address user) internal returns(bool isReg) { if(!registered[user][hash_][weekId]){ registered[user][hash_][weekId] = true; userCampaigns[weekId][user].push(hash_); } else { isReg = true; } } /** * @dev Callback function to update campaign values * @param weekId : Week Id * @param hash_ : Campaign hash * @param fundsNative : Amount in native currency e.g CELO * @param fundsERC20 : Amount in ERC20 currency e.g $GROW, $G. etc * @param platformToken : Amount in platform token e.g GROW token */ function onCampaignValueChanged( uint weekId, bytes32 hash_, uint256 fundsNative, uint256 fundsERC20, uint256 platformToken, address user ) external onlyApproved { // _validateCampaign(hash_, weekId); _setIsClaimed(user, weekId, hash_); GetCampaign memory res = _getCampaign(weekId, hash_); if(res.cp.data.fundsERC20 >= fundsERC20){ res.cp.data.fundsERC20 -= fundsERC20; } if(res.cp.data.fundsNative >= fundsNative){ res.cp.data.fundsNative -= fundsNative; } if(res.cp.data.platformToken >= platformToken){ res.cp.data.platformToken -= platformToken; } res.cp.data.lastUpdated = _now(); _setCampaign(res.slot, weekId, res.cp.data); } function _callback(CData memory _cp, uint platformToken) internal returns(CData memory cp) { cp = _cp; (uint native, uint256 erc20) = _rebalance(cp.token, cp.fundsNative, cp.fundsERC20); cp.fundsNative = native; cp.fundsERC20 = erc20; unchecked { cp.platformToken += platformToken; } cp.lastUpdated = _now(); } /** * @dev Calculates user's share of the weekly payout * @param userPoints : Total points accumulated by the user * @param cp : Campaign */ function _calculateShare( uint64 userPoints, CData memory cp ) internal view returns(uint erc20Amount, uint nativeClaim, uint platform) { uint8 erc20Decimals; assert(cp.totalPoints >= userPoints); if(cp.totalPoints > 0 && cp.token != address(0)) { erc20Decimals = IERC20Metadata(cp.token).decimals(); unchecked { if(cp.fundsERC20 > 0) erc20Amount = cp.totalPoints.calculateShare(userPoints, cp.fundsERC20, erc20Decimals); if(cp.fundsNative > 0) nativeClaim = cp.totalPoints.calculateShare(userPoints, cp.fundsNative, 18); if(cp.platformToken > 0) { erc20Decimals = IERC20Metadata(address(token)).decimals(); platform = cp.totalPoints.calculateShare(userPoints, cp.platformToken, erc20Decimals); } } } } /** * Check reward eligibility for the requested week * @param user : Target user * @param weekId : Requested week Id * @param hash_ : Hash of the campaign name */ function _getEligibility(address user, bytes32 hash_, uint weekId, bool nullifier, bool validate) internal view returns(Eligibility memory elg) { if(validate) _validateCampaign(hash_, weekId); if(!isClaimed[user][weekId][hash_]) { CData memory cp = _getCampaign(weekId, hash_).cp.data; Profile memory pf = _getProfile(weekId, hash_, user); uint64 totalScore; for(uint i = 0; i < pf.quizResults.length; i++) { unchecked { totalScore += pf.quizResults[i].other.score; } } (uint erc20, uint native, uint platform) = _calculateShare(nullifier? 0 : totalScore, cp); bool protocolVerified = mode == Mode.LIVE? _now() <= _getDeadline(weekId) && (cp.fundsNative > 0 || cp.fundsERC20 > 0) : true; bool isEligible = protocolVerified && (native > 0 || erc20 > 0 || platform > 0); elg = Eligibility( isEligible, erc20, native, platform, cp.token, hash_, weekId ); } } /** * @dev Assign 2% of payouts to the dev * @param token : ERC20 token to be used for payout * @return nativeBalance : Celo balance of this contract after dev share * @return erc20Balance : ERC20 balance of this contract after dev share */ function _rebalance(address token, uint256 native, uint256 erc20) internal returns(uint256 nativeBalance, uint256 erc20Balance) { uint8 devRate = 2; nativeBalance = native; erc20Balance = erc20; uint devShare; unchecked { if(nativeBalance > 0 && (address(this).balance >= nativeBalance)) { devShare = (nativeBalance * devRate) / 100; (bool done,) = dev.call{value: devShare}(''); require(done, 'T.Failed'); nativeBalance -= devShare; } if(erc20Balance > 0 && (IERC20(token).balanceOf(address(this)) >= erc20Balance)) { devShare = (erc20Balance * devRate) / 100; if(token != address(0)){ require(IERC20(token).transfer(dev, devShare), 'ERC20 TFailed'); } erc20Balance -= devShare; } } } ///////////////////////////////////////////////////////////////////////////////// // READ-ONLY FUNCTIONS // ///////////////////////////////////////////////////////////////////////////////// /** * Get users eligibility for all the campaigns for the previous weeks ended * @param user : User * @notice Claim will always be for the concluded 3 weeks back. The position must match and can be extracted directly from * the frontend when reading the user's campaigns. Learner can only claim from the past three weeks campaign pool; */ function checkEligibility(address user) external view returns(Eligibilities memory result) { uint weekId = _getState().weekId; if(weekId > 0) weekId -= 1; Campaign[] memory cps = _getCampaings(weekId); uint cSize = cps.length; result.elgs = new Eligibility[](cSize); result.weekId = weekId; for(uint j = 0; j < cSize; j++){ bool nullifier = false; // If useKey is enabled, learners must have created a key for all the campaigns they subscribed to if(useKey){ if(!_getProfile(weekId, cps[j].data.data.hash_, user).other.haskey) nullifier = true; } result.elgs[j] = _getEligibility(user, cps[j].data.data.hash_, weekId, nullifier, false); } return result; } // Fetch past claims function getData(address user) public view returns(ReadData memory data) { data.state = _getState(); data.approved = _getApprovedCampaigns(); uint weekIds = data.state.weekId; weekIds ++; data.wd = new WeekData[](weekIds); data.profileData = new WeekProfileData[](weekIds); uint hashSize = data.approved.length; for(uint i = 0; i < weekIds; i++) { data.wd[i].campaigns = _getCampaings(i); data.wd[i].claimDeadline = _getDeadline(i); ReadProfile[] memory _userCampaigns = new ReadProfile[](hashSize); if(user != address(0)) { data.profileData[i].weekId = i; for(uint hashId = 0; hashId < hashSize; hashId++) { bytes32 hash_ = data.approved[hashId].hash_; bool nullifier = false; // If useKey is enabled, learners must have created a key for all the first campaign they joined if(useKey){ if(!_getProfile(i, hash_, user).other.haskey) nullifier = true; } _userCampaigns[hashId] = ReadProfile( _getEligibility(user, hash_, i, nullifier, false), _getProfile(i, hash_, user), isClaimed[user][i][hash_], hash_ ); } data.profileData[i].campaigns = _userCampaigns; } } return data; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address[]","name":"_admins","type":"address[]"},{"internalType":"uint32","name":"transitionInterval","type":"uint32"},{"internalType":"enum ILearna.Mode","name":"_mode","type":"uint8"},{"internalType":"address","name":"_feeTo","type":"address"},{"internalType":"string[]","name":"_campaigns","type":"string[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressIsZero","type":"error"},{"inputs":[],"name":"CampaignClaimNotActivated","type":"error"},{"inputs":[],"name":"ClaimAddressNotSet","type":"error"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"ClaimEnded","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NotEligible","type":"error"},{"inputs":[],"name":"NotInitialized","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"UserBlacklisted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"weekId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tipper","type":"address"},{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"indexed":false,"internalType":"struct ILearna.Campaign","name":"data","type":"tuple"},{"indexed":false,"internalType":"bytes32[]","name":"campainHashes","type":"bytes32[]"}],"name":"CampaignCreated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"indexed":false,"internalType":"struct ILearna.Campaign","name":"campaign","type":"tuple"}],"name":"CampaignUpdated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"indexed":false,"internalType":"struct ILearna.Campaign","name":"campaign","type":"tuple"}],"name":"NewCampaign","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"weekId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"campainHash","type":"bytes32"},{"components":[{"components":[{"internalType":"string","name":"questionHash","type":"string"},{"internalType":"uint64","name":"selected","type":"uint64"},{"internalType":"bool","name":"isUserSelected","type":"bool"}],"internalType":"struct ILearna.AnswerInput[]","name":"answers","type":"tuple[]"},{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"string","name":"quizId","type":"string"},{"internalType":"uint32","name":"score","type":"uint32"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint64","name":"totalPoints","type":"uint64"},{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint64","name":"timeSpent","type":"uint64"},{"internalType":"string","name":"completedAt","type":"string"}],"internalType":"struct ILearna.QuizResultOtherInput","name":"other","type":"tuple"}],"indexed":false,"internalType":"struct ILearna.QuizResultInput","name":"quizResult","type":"tuple"}],"name":"PointRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_weekId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWeekId","type":"uint256"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"indexed":false,"internalType":"struct ILearna.CampaignData[]","name":"campaigns","type":"tuple[]"}],"name":"Sorted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"}],"name":"UnApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"users","type":"address[]"},{"indexed":false,"internalType":"bool[]","name":"newStatus","type":"bool[]"}],"name":"UserStatusChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"uint256","name":"erc20Value","type":"uint256"},{"internalType":"uint256","name":"nativeValue","type":"uint256"}],"name":"adjustCampaignValues","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkEligibility","outputs":[{"components":[{"components":[{"internalType":"bool","name":"isEligible","type":"bool"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"nativeAmount","type":"uint256"},{"internalType":"uint256","name":"platform","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"uint256","name":"weekId","type":"uint256"}],"internalType":"struct ILearna.Eligibility[]","name":"elgs","type":"tuple[]"},{"internalType":"uint256","name":"weekId","type":"uint256"}],"internalType":"struct ILearna.Eligibilities","name":"result","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegateTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"components":[{"internalType":"address","name":"id","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct Admins.Admin[]","name":"_admins","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCampaignsForThePastWeek","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"internalType":"struct ILearna.Campaign[]","name":"result","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getData","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"minimumToken","type":"uint256"},{"internalType":"uint64","name":"transitionInterval","type":"uint64"},{"internalType":"uint64","name":"transitionDate","type":"uint64"},{"internalType":"uint256","name":"weekId","type":"uint256"}],"internalType":"struct ILearna.State","name":"state","type":"tuple"},{"components":[{"internalType":"uint256","name":"weekId","type":"uint256"},{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"internalType":"struct ILearna.Campaign[]","name":"campaigns","type":"tuple[]"},{"internalType":"uint96","name":"claimDeadline","type":"uint96"}],"internalType":"struct ILearna.WeekData[]","name":"wd","type":"tuple[]"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData[]","name":"approved","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"weekId","type":"uint256"},{"components":[{"components":[{"internalType":"bool","name":"isEligible","type":"bool"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"nativeAmount","type":"uint256"},{"internalType":"uint256","name":"platform","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"uint256","name":"weekId","type":"uint256"}],"internalType":"struct ILearna.Eligibility","name":"eligibility","type":"tuple"},{"components":[{"components":[{"components":[{"internalType":"bytes","name":"questionHash","type":"bytes"},{"internalType":"uint64","name":"selected","type":"uint64"},{"internalType":"bool","name":"isUserSelected","type":"bool"}],"internalType":"struct ILearna.Answer[]","name":"answers","type":"tuple[]"},{"components":[{"internalType":"bytes","name":"id","type":"bytes"},{"internalType":"bytes","name":"quizId","type":"bytes"},{"internalType":"uint32","name":"score","type":"uint32"},{"internalType":"bytes","name":"title","type":"bytes"},{"internalType":"uint64","name":"totalPoints","type":"uint64"},{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint64","name":"timeSpent","type":"uint64"},{"internalType":"bytes","name":"completedAt","type":"bytes"}],"internalType":"struct ILearna.QuizResultOther","name":"other","type":"tuple"}],"internalType":"struct ILearna.QuizResult[]","name":"quizResults","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amountMinted","type":"uint256"},{"internalType":"uint8","name":"totalQuizPerWeek","type":"uint8"},{"internalType":"bytes32","name":"passkey","type":"bytes32"},{"internalType":"bool","name":"haskey","type":"bool"}],"internalType":"struct ILearna.ProfileOther","name":"other","type":"tuple"}],"internalType":"struct ILearna.Profile","name":"profile","type":"tuple"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"bytes32","name":"hash_","type":"bytes32"}],"internalType":"struct ILearna.ReadProfile[]","name":"campaigns","type":"tuple[]"}],"internalType":"struct ILearna.WeekProfileData[]","name":"profileData","type":"tuple[]"}],"internalType":"struct ILearna.ReadData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlatformToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"weekId","type":"uint256"},{"internalType":"bytes32","name":"hash_","type":"bytes32"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"isPermitted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"weekId","type":"uint256"},{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"onCampaignValueChanged","outputs":[],"stateMutability":"nonpayable","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":"user","type":"address"},{"components":[{"components":[{"internalType":"string","name":"questionHash","type":"string"},{"internalType":"uint64","name":"selected","type":"uint64"},{"internalType":"bool","name":"isUserSelected","type":"bool"}],"internalType":"struct ILearna.AnswerInput[]","name":"answers","type":"tuple[]"},{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"string","name":"quizId","type":"string"},{"internalType":"uint32","name":"score","type":"uint32"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint64","name":"totalPoints","type":"uint64"},{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint64","name":"timeSpent","type":"uint64"},{"internalType":"string","name":"completedAt","type":"string"}],"internalType":"struct ILearna.QuizResultOtherInput","name":"other","type":"tuple"}],"internalType":"struct ILearna.QuizResultInput","name":"quizResult","type":"tuple"},{"internalType":"bytes32","name":"hash_","type":"bytes32"}],"name":"recordPoints","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newClaim","type":"address"}],"name":"setClaimAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minToken","type":"uint256"}],"name":"setMinimumToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"interval","type":"uint32"}],"name":"setTransitionInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_campaign","type":"string"},{"internalType":"uint256","name":"fundsErc20","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"setUpCampaign","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInKnowToken","type":"uint256"},{"internalType":"uint32","name":"newIntervalInMin","type":"uint32"}],"name":"sortWeeklyReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"toggleAdminStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_campaigns","type":"string[]"}],"name":"toggleCampaignStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleUseKey","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":[{"internalType":"address","name":"target","type":"address"}],"name":"unApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useKey","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x60a060405234801561001057600080fd5b5060405161671738038061671783398101604081905261002f916111f5565b338061006f576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b6100788161033b565b5061008433600161038b565b6001601255610099662386f26fc10000600555565b6013805484919060ff1916600183818111156100b7576100b76112f0565b02179055506013805462010000600160b01b0319163362010000021790556001600160a01b038216610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f466565206d616e61676572206973207a65726f000000000000000000000000006044820152606401610066565b6001600160a01b038216608052600160135460ff16600181111561016b5761016b6112f0565b036101f7576101e7846101de604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260055481526006546001600160401b038082166020840152680100000000000000009091041691810191909152600754606082015290565b606001516103f6565b6013805461ff0019169055610207565b6013805461ff0019166101001790555b60005b85518110156102765760006001600160a01b03168682815181106102305761023061131f565b60200260200101516001600160a01b03161461026e5761026e86828151811061025b5761025b61131f565b602002602001015161046860201b60201c565b60010161020a565b5060005b8151811015610330576103276102f0604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260055481526006546001600160401b038082166020840152680100000000000000009091041691810191909152600754606082015290565b6060015161031c8484815181106103095761030961131f565b602002602001015161055760201b60201c565b33600080808061057a565b5060010161027a565b50505050505061168e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166103cb576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b63ffffffff82161561046457600680544263ffffffff603c8602169081016001600160401b0381166801000000000000000081026001600160801b03199094168317939093179093556000848152600a6020526040902080546001600160601b031916909217909155905b50505b5050565b6001600160a01b03811660009081526004602052604090205460ff16156104eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f41646d696e20616c7265616479206164646564000000000000000000000000006044820152606401610066565b6001600160a01b0381166000908152600460205260409020805460ff191660019081179091556002549061052090829061134e565b60ff90811660025516600090815260036020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082019091526000815260208082018390528251920191909120815290565b610582610f92565b61058b876105b4565b61059a8789888888888861065c565b87519091506105a99089610b4d565b979650505050505050565b80516000908152600d602052604090205460ff166106595780516000908152600d602090815260408220805460ff19166001908117909155600c80549182018155909252825160029092027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c78101928355908301518392917fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c801906104619082611436565b50565b610664610f92565b6000878152600e602090815260408083208b51845282529182902082518084019093525460ff8116151580845261010090910463ffffffff16918301919091526108d25760018082526000898152600f60208181526040808420805463ffffffff811684890152938352929094018255908252825161012081018452878152908101899052918201879052606082015260808101426001600160401b0316815260200160008152602001886001600160a01b03168152602001846001600160a01b031681526020018a815250600f60008a8152602001908152602001600020826020015163ffffffff168154811061075e5761075e61131f565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b0319918216176c010000000000000000000000006001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e08501516006840180549093169116179055610100830151805160078301908155928101519192909160088401906108319082611436565b50505060008a8152600e602090815260408083208e5184528252909120845181549286015164ffffffffff1990931690151564ffffffff0019161761010063ffffffff9093169290920291909117905550508851610890908990610c48565b6000015191507f7e5566222c32876a37c4f46a32c3530645f8a210462fc0afd712d176268d8ea2826040516108c59190611579565b60405180910390a1610b41565b88516108df908990610c48565b5180516020018051880190528051805186019052805160c001519092506001600160a01b038881169116146109215781516001600160a01b03881660c0909101525b60008511801561093957506001600160a01b03831615155b15610ae4576000826000015160e001516001600160a01b0316846001600160a01b0316036109695750600161098c565b82516040015160000361098c575081516001600160a01b03841660e09091015260015b8015610ae257856001600160a01b03851663dd62ed3e336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa158015610a05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a29919061164c565b10610ae2576001600160a01b0384166323b872dd3360095460405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03928316600482015291166024820152604481018990526064016020604051808303816000875af1158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad19190611665565b15610ae25782516040018051870190525b505b81516001600160401b03421660809091015260208101518251610b0991908a90610e8c565b7f73ed9dac93997d0aad8785921b99a78c26845d99ba132a409c657482323a550b82604051610b389190611579565b60405180910390a15b50979650505050505050565b6000828152600d602052604090205460ff16610bc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616d706169676e206e6f7420726567697374657265640000000000000000006044820152606401610066565b6000818152600e6020908152604080832085845290915290205460ff16610464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43616d706169676e206e6f7420696e2063757272656e74207765656b000000006044820152606401610066565b610c50611007565b6000838152600e6020908152604080832085845282529182902082518084019093525460ff811615158352610100900463ffffffff1682820181905290830152805115610e8557600f6000858152602001908152602001600020816020015163ffffffff1681548110610cc557610cc561131f565b60009182526020918290206040805161016081018252600a9093029091018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a08601526001600160401b036c010000000000000000000000009091041660c0850152600482015460e085015260058201546001600160a01b0390811661010086015260068301541661012085015282518084019093526007820180548452600883018054959693958795939487946101408801949093909291840191610d9590611394565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc190611394565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b50505050508152505081525050815260200160098201805480602002602001604051908101604052809291908181526020018280548015610e7857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e5a575b5050509190925250505082525b5092915050565b6000828152600f60205260409020805482919063ffffffff8616908110610eb557610eb561131f565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b0319918216176c010000000000000000000000006001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e0850151600684018054909316911617905561010083015180516007830190815592810151919290916008840190610f889082611436565b5050505050505050565b6040518060400160405280610ffa60408051610120810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905260e0840183905284518086019095529184528301529061010082015290565b8152602001606081525090565b604051806040016040528061101a610f92565b8152600060209091015290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561107e5761107e611027565b604052919050565b60006001600160401b0382111561109f5761109f611027565b5060051b60200190565b80516001600160a01b03811681146110c057600080fd5b919050565b805163ffffffff811681146110c057600080fd5b8051600281106110c057600080fd5b60005b838110156111035781810151838201526020016110eb565b50506000910152565b600082601f83011261111d57600080fd5b815161113061112b82611086565b611056565b8082825260208201915060208360051b86010192508583111561115257600080fd5b602085015b838110156111eb5780516001600160401b0381111561117557600080fd5b8601603f8101881361118657600080fd5b60208101516001600160401b038111156111a2576111a2611027565b6111b5601f8201601f1916602001611056565b8181526040838301018a10156111ca57600080fd5b6111db8260208301604086016110e8565b8552505060209283019201611157565b5095945050505050565b600080600080600060a0868803121561120d57600080fd5b85516001600160401b0381111561122357600080fd5b8601601f8101881361123457600080fd5b805161124261112b82611086565b8082825260208201915060208360051b85010192508a83111561126457600080fd5b6020840193505b8284101561128d5761127c846110a9565b82526020938401939091019061126b565b975061129f92505050602087016110c5565b93506112ad604087016110d9565b92506112bb606087016110a9565b60808701519092506001600160401b038111156112d757600080fd5b6112e38882890161110c565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60ff818116838216019081111561138e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b600181811c908216806113a857607f821691505b6020821081036113e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561143157806000526020600020601f840160051c8101602085101561140e5750805b601f840160051c820191505b8181101561142e576000815560010161141a565b50505b505050565b81516001600160401b0381111561144f5761144f611027565b6114638161145d8454611394565b846113e7565b6020601f821160018114611497576000831561147f5750848201515b600019600385901b1c1916600184901b17845561142e565b600084815260208120601f198516915b828110156114c757878501518255602094850194600190920191016114a7565b50848210156114e55786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b805182526000602082015160406020850152805180604086015261151f8160608701602085016110e8565b601f01601f1916939093016060019392505050565b600081518084526020840193506020830160005b8281101561156f5781516001600160a01b0316865260209586019590910190600101611548565b5093949350505050565b6020815260008251604060208401528051606084015260208101516080840152604081015160a084015260608101516115bd60c08501826001600160601b03169052565b5060808101516001600160401b03811660e08501525060a081015161010084015260c08101516001600160a01b0381166101208501525060e08101516001600160a01b0381166101408501525061010001516101206101608401526116266101808401826114f4565b90506020840151601f198483030160408501526116438282611534565b95945050505050565b60006020828403121561165e57600080fd5b5051919050565b60006020828403121561167757600080fd5b8151801515811461168757600080fd5b9392505050565b6080516150676116b060003960008181610ddf0152612e0d01526150676000f3fe6080604052600436106101dc5760003560e01c80638456cb5911610102578063b029d68e11610095578063c8559a9e11610064578063c8559a9e14610563578063e4f6da1b14610583578063f2fde38b146105a2578063fe1db20b146105c257600080fd5b8063b029d68e146104ee578063b5252f9b14610503578063b85a35d214610523578063bb3790871461054357600080fd5b80639db412d0116100d15780639db412d0146104705780639ed374f7146104905780639f2032e4146104ae578063a75ec94e146104ce57600080fd5b80638456cb59146104135780638da5cb5b146104285780638fa4fdfd14610446578063958420271461044e57600080fd5b80634b6b0a611161017a5780635c975abb116101495780635c975abb14610392578063704b6c02146103b1578063715018a6146103d15780637723bafb146103e657600080fd5b80634b6b0a61146103075780634b7739c9146103275780634e71d92d1461033a5780635895668c1461037257600080fd5b8063373a5d79116101b6578063373a5d791461025257806338266b22146102a35780633f4ba83a146102d05780633fd8cc4e146102e757600080fd5b806308ddc0ae146101e8578063144fa6d71461021057806331ae450b1461023057600080fd5b366101e357005b600080fd5b6101fb6101f636600461405f565b6105e2565b60405190151581526020015b60405180910390f35b34801561021c57600080fd5b506101fb61022b3660046140b5565b610641565b34801561023c57600080fd5b506102456106ba565b60405161020791906140d0565b34801561025e57600080fd5b506101fb61026d36600461412a565b6001600160a01b0383166000908152600b60209081526040808320858452825280832084845290915290205460ff169392505050565b3480156102af57600080fd5b506102c36102be3660046140b5565b6107b1565b6040516102079190614706565b3480156102dc57600080fd5b506102e5610b50565b005b3480156102f357600080fd5b506101fb6103023660046140b5565b610b62565b34801561031357600080fd5b506101fb61032236600461479b565b610b85565b6101fb610335366004614942565b610d9a565b34801561034657600080fd5b5060095461035a906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b34801561037e57600080fd5b506101fb61038d366004614ad7565b611496565b34801561039e57600080fd5b50600054600160a01b900460ff166101fb565b3480156103bd57600080fd5b506102e56103cc3660046140b5565b611516565b3480156103dd57600080fd5b506102e561152a565b3480156103f257600080fd5b506104066104013660046140b5565b61153c565b6040516102079190614b8c565b34801561041f57600080fd5b506102e56116a4565b34801561043457600080fd5b506000546001600160a01b031661035a565b6101fb6116b4565b34801561045a57600080fd5b506104636116c4565b6040516102079190614bf3565b34801561047c57600080fd5b506102e561048b366004614c06565b6116fb565b34801561049c57600080fd5b506008546001600160a01b031661035a565b3480156104ba57600080fd5b506102e56104c9366004614c57565b61180a565b3480156104da57600080fd5b506102e56104e9366004614c70565b61181b565b3480156104fa57600080fd5b506101fb61185b565b34801561050f57600080fd5b506102e561051e3660046140b5565b611886565b34801561052f57600080fd5b506102e561053e3660046140b5565b6118d0565b34801561054f57600080fd5b506101fb61055e3660046140b5565b61191a565b34801561056f57600080fd5b506102e561057e3660046140b5565b611949565b34801561058f57600080fd5b506013546101fb90610100900460ff1681565b3480156105ae57600080fd5b506102e56105bd3660046140b5565b61197a565b3480156105ce57600080fd5b506101fb6105dd366004614c8b565b6119b5565b6009546000906105fc9034906001600160a01b0316611b46565b610634610607611c22565b60600151604080518082019091526000815260208082018890528751908801208152333487600088611c84565b50600190505b9392505050565b600061064b611cbf565b6001600160a01b0382166106965760405162461bcd60e51b815260206004820152600d60248201526c546f6b656e206973207a65726f60981b60448201526064015b60405180910390fd5b50600880546001600160a01b0319166001600160a01b03831617905560015b919050565b60025460609060ff81166000036106cf575090565b8060ff166001600160401b038111156106ea576106ea613f26565b60405190808252806020026020018201604052801561072f57816020015b60408051808201909152600080825260208201528152602001906001900390816107085790505b50915060005b8160ff168160ff1610156107ac5760ff808216600081815260036020908152604080832054815180830183526001600160a01b03909116808252808552600484529190932054909416151590820152855190918691811061079857610798614cb7565b602090810291909101015250600101610735565b505090565b6107fc60408051610100810190915260006080820181815260a0830182905260c0830182905260e0830191909152819081526020016060815260200160608152602001606081525090565b610804611c22565b815261080e611cec565b60408201528051606001518061082381614ce3565b915050806001600160401b0381111561083e5761083e613f26565b60405190808252806020026020018201604052801561089c57816020015b6108896040518060600160405280600081526020016060815260200160006001600160601b031681525090565b81526020019060019003908161085c5790505b506020830152806001600160401b038111156108ba576108ba613f26565b60405190808252806020026020018201604052801561090057816020015b6040805180820190915260008152606060208201528152602001906001900390816108d85790505b50606083015260408201515160005b82811015610b485761092081611de7565b8460200151828151811061093657610936614cb7565b602002602001015160200181905250610964816000908152600a60205260409020546001600160601b031690565b8460200151828151811061097a5761097a614cb7565b6020026020010151604001906001600160601b031690816001600160601b0316815250506000826001600160401b038111156109b8576109b8613f26565b6040519080825280602002602001820160405280156109f157816020015b6109de613dc3565b8152602001906001900390816109d65790505b5090506001600160a01b03861615610b3f578185606001518381518110610a1a57610a1a614cb7565b60209081029190910101515260005b83811015610b1757600086604001518281518110610a4957610a49614cb7565b60200260200101516000015190506000601360019054906101000a900460ff1615610a8957610a7985838b611fef565b6020015160600151610a89575060015b6040518060800160405280610aa28b8589866000612483565b8152602001610ab287858d611fef565b81526001600160a01b038b166000908152600b602090815260408083208a845282528083208784528252918290205460ff16151590830152018390528451859085908110610b0257610b02614cb7565b60209081029190910101525050600101610a29565b508085606001518381518110610b2f57610b2f614cb7565b6020026020010151602001819052505b5060010161090f565b505050919050565b610b58611cbf565b610b6061263d565b565b6001600160a01b03811660009081526001602052604081205460ff165b92915050565b6000610baa335b6001600160a01b031660009081526004602052604090205460ff1690565b610bc65760405162461bcd60e51b815260040161068d90614cfc565b6000610bd0611c22565b606001519050610be08582612692565b6000610bec8287612759565b80515160e001519091506001600160a01b0316610c3b5760405162461bcd60e51b815260206004820152600d60248201526c546f6b656e206973207a65726f60981b604482015260640161068d565b80515160e001516009546040516370a0823160e01b81526001600160a01b039182166004820152879291909116906370a0823190602401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190614d20565b1015610cf95760405162461bcd60e51b8152602060048201526015602482015274115490cc8c10985b081a5b98dbdb9cda5cdd195b9d605a1b604482015260640161068d565b6009546001600160a01b031631841115610d555760405162461bcd60e51b815260206004820152601960248201527f4e65772076616c756520657863656564732062616c616e636500000000000000604482015260640161068d565b80515160400185905280515160209081018590528151516001600160401b034216608090910152810151815151610d8e91908490612994565b50600195945050505050565b6000610da533610b8c565b610dc15760405162461bcd60e51b815260040161068d90614cfc565b610dc9612a91565b6000610dd3611c22565b606001519050610e03347f0000000000000000000000000000000000000000000000000000000000000000611b46565b6001600160a01b038516610e485760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b604482015260640161068d565b610e528382612692565b6000610e5e8285612759565b90506000610e6d838689611fef565b9050610e7a838689612abc565b610e9b57610e8d82602001518489612b55565b81515160a001805160010190525b607881602001516020015160ff161115610ef05760405162461bcd60e51b815260206004820152601660248201527514dd1bdc9859d9481b1a5b5a5d08195e18d95959195960521b604482015260640161068d565b602081810180518201805160010160ff1690529087015160400151835151606001805163ffffffff9092169091016001600160601b0316905251610f3990849087908a90612bc1565b600083815260146020908152604080832088845282528083206001600160a01b038b16808552908352908320805460018101808355828652938b01515192909452909183908110610f8c57610f8c614cb7565b90600052602060002090600702016001016000019081610fac9190614dba565b5060208088015181015160008681526014835260408082208a835284528082206001600160a01b038d16835290935291909120805483908110610ff157610ff1614cb7565b906000526020600020906007020160010160010190816110119190614dba565b5060208088015160e0015160008681526014835260408082208a835284528082206001600160a01b038d1683529093529190912080548390811061105757611057614cb7565b906000526020600020906007020160010160050190816110779190614dba565b506020808801516060015160008681526014835260408082208a835284528082206001600160a01b038d168352909352919091208054839081106110bd576110bd614cb7565b906000526020600020906007020160010160030190816110dd9190614dba565b506020808801516040908101516000878152601484528281208a825284528281206001600160a01b038d168252909352912080548390811061112157611121614cb7565b60009182526020808320600792909202909101600301805463ffffffff191663ffffffff949094169390931790925588820151608001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061119057611190614cb7565b60009182526020808320600792909202909101600501805467ffffffffffffffff19166001600160401b0394909416939093179092558882015160a001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061120657611206614cb7565b60009182526020808320600560079093020191909101805461ffff94909416600160401b0269ffff000000000000000019909416939093179092558882015160c001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061128157611281614cb7565b9060005260206000209060070201600101600401600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060005b87515181101561142e576000886000015182815181106112de576112de614cb7565b60209081029190910181015160008881526014835260408082208c835284528082206001600160a01b038f168352909352919091208054919250908490811061132957611329614cb7565b6000918252602080832060079092029091018054600101815582526040805160608101825284518152848301516001600160401b03168184015284820151151581830152898452601483528184208c855283528184206001600160a01b038f1685529092529091208054859081106113a3576113a3614cb7565b906000526020600020906007020160000183815481106113c5576113c5614cb7565b6000918252602090912082516002909202019081906113e49082614dba565b506020820151600191820180546040909401511515600160401b0268ffffffffffffffffff199094166001600160401b0390921691909117929092179091559190910190506112bc565b50602083015183515161144391908690612994565b876001600160a01b03167fe0df5b06e1ab66524ad8b49d46638d970e291a5048eaad107252e763984c3e6985888a60405161148093929190614e78565b60405180910390a2506001979650505050505050565b6000805b825181101561150d5760006114e58483815181106114ba576114ba614cb7565b6020026020010151604080518082019091526000815260208082018390528251920191909120815290565b516000908152600d60205260409020805460ff19811660ff909116151790555060010161149a565b50600192915050565b61151e611cbf565b61152781612c33565b50565b611532611cbf565b610b606000612cfe565b604080518082019091526060815260006020820152600061155b611c22565b606001519050801561157557611572600182614f32565b90505b600061158082611de7565b8051909150806001600160401b0381111561159d5761159d613f26565b6040519080825280602002602001820160405280156115d657816020015b6115c3613df7565b8152602001906001900390816115bb5790505b5084526020840183905260005b8181101561169b57601354600090610100900460ff161561163f5761162f8585848151811061161457611614614cb7565b60200260200101516000015161010001516000015189611fef565b602001516060015161163f575060015b6116738785848151811061165557611655614cb7565b60200260200101516000015161010001516000015187846000612483565b865180518490811061168757611687614cb7565b6020908102919091010152506001016115e3565b50505050919050565b6116ac611cbf565b610b60612d4e565b60006116bf34612d91565b905090565b606060006116d0611c22565b606001519050806000036116e2575090565b6116f56116f0600183614f32565b611de7565b91505090565b3360009081526001602052604090205460ff166117515760405162461bcd60e51b8152602060048201526014602482015273139bdd08185c1c1c9bdd9959081858d8dbdd5b9d60621b604482015260640161068d565b61175c818787612ecc565b60006117688787612759565b80515160400151909150841161179257805151604001805185919061178e908390614f32565b9052505b8051516020015185116117b95780515160200180518691906117b5908390614f32565b9052505b8051515183116117da5780515180518491906117d6908390614f32565b9052505b8051516001600160401b034216608090910152602081015181515161180191908990612994565b50505050505050565b611812611cbf565b61152781600555565b611823611cbf565b63ffffffff8116156115275761183a81603c614f45565b6006805467ffffffffffffffff191663ffffffff9290921691909117905550565b6000611865611cbf565b506013805461ff001981166101009182900460ff1615909102179055600190565b61188e611cbf565b611899816000612f3a565b6040516001600160a01b038216907fdf982251973669f107e8764c0488f080ceca6d72192314e1f94e347378ce4a0190600090a250565b6118d8611cbf565b6118e3816001612f3a565b6040516001600160a01b038216907f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce790600090a250565b6000611924611cbf565b50600980546001600160a01b0383166001600160a01b03199091161790556001919050565b611951611cbf565b6001600160a01b03166000908152600460205260409020805460ff19811660ff90911615179055565b611982611cbf565b6001600160a01b0381166119ac57604051631e4fbdf760e01b81526000600482015260240161068d565b61152781612cfe565b60006119bf612a91565b6119c833610b8c565b6119e45760405162461bcd60e51b815260040161068d90614cfc565b60008060006119f68587612f8c612fdc565b919450925090508515611aff576008546001600160a01b0316611a465760405162461bcd60e51b8152602060048201526008602482015267546b20656d70747960c01b604482015260640161068d565b600854600954604051630faa7cc560e21b8152600481018990526001600160a01b039182166024820152911690633ea9f314906044016020604051808303816000875af1158015611a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abf9190614f64565b611aff5760405162461bcd60e51b8152602060048201526011602482015270105b1b1bd8d85d1a5bdb8819985a5b1959607a1b604482015260640161068d565b7f7384e755c7195e3b4189c9d1fe1777168cc7a79d47c98e4172c731cd5d248866838383604051611b3293929190614f81565b60405180910390a150600195945050505050565b8115611c1e573031821115611b905760405162461bcd60e51b815260206004820152601060248201526f125b9cdd59999a58da595b9d0818985b60821b604482015260640161068d565b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114611bdd576040519150601f19603f3d011682016040523d82523d6000602084013e611be2565b606091505b5050905080611c1c5760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b604482015260640161068d565b505b5050565b604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260055481526006546001600160401b038082166020840152600160401b9091041691810191909152600754606082015290565b611c8c613e42565b611c95876130f7565b611ca4878988888888886131a2565b9050611cb4876000015189612692565b979650505050505050565b6000546001600160a01b03163314610b605760405163118cdaa760e01b815233600482015260240161068d565b6060600c805480602002602001604051908101604052809291908181526020016000905b82821015611dde578382906000526020600020906002020160405180604001604052908160008201548152602001600182018054611d4d90614d39565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7990614d39565b8015611dc65780601f10611d9b57610100808354040283529160200191611dc6565b820191906000526020600020905b815481529060010190602001808311611da957829003601f168201915b50505050508152505081526020019060010190611d10565b50505050905090565b6060600f6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611fe45760008481526020908190206040805161016081018252600a86029092018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a0860152600160601b90046001600160401b031660c0850152600482015460e085015260058201546001600160a01b0390811661010086015260068301541661012085015282518084019093526007820180548452600883018054959693958795939487946101408801949093909291840191611ee990614d39565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1590614d39565b8015611f625780601f10611f3757610100808354040283529160200191611f62565b820191906000526020600020905b815481529060010190602001808311611f4557829003601f168201915b50505050508152505081525050815260200160098201805480602002602001604051908101604052809291908181526020018280548015611fcc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fae575b50505050508152505081526020019060010190611e1c565b505050509050919050565b611ff7613e62565b600084815260146020908152604080832086845282528083206001600160a01b03861684528252808320815181546060948102820185018452928101838152909491938593919285929185015b828210156124325760008481526020808220604080516007870290920180546060948102840185018352918301828152929490938593928592909185015b8282101561217357838290600052602060002090600202016040518060600160405290816000820180546120b590614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546120e190614d39565b801561212e5780601f106121035761010080835404028352916020019161212e565b820191906000526020600020905b81548152906001019060200180831161211157829003601f168201915b50505091835250506001918201546001600160401b038116602080840191909152600160401b90910460ff161515604090920191909152918352929092019101612082565b505050508152602001600182016040518061010001604052908160008201805461219c90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546121c890614d39565b80156122155780601f106121ea57610100808354040283529160200191612215565b820191906000526020600020905b8154815290600101906020018083116121f857829003601f168201915b5050505050815260200160018201805461222e90614d39565b80601f016020809104026020016040519081016040528092919081815260200182805461225a90614d39565b80156122a75780601f1061227c576101008083540402835291602001916122a7565b820191906000526020600020905b81548152906001019060200180831161228a57829003601f168201915b5050509183525050600282015463ffffffff1660208201526003820180546040909201916122d490614d39565b80601f016020809104026020016040519081016040528092919081815260200182805461230090614d39565b801561234d5780601f106123225761010080835404028352916020019161234d565b820191906000526020600020905b81548152906001019060200180831161233057829003601f168201915b505050918352505060048201546001600160401b03808216602084015261ffff600160401b8304166040840152600160501b90910416606082015260058201805460809092019161239d90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546123c990614d39565b80156124165780601f106123eb57610100808354040283529160200191612416565b820191906000526020600020905b8154815290600101906020018083116123f957829003601f168201915b5050505050815250508152505081526020019060010190612044565b505050908252506040805160808101825260018401548152600284015460ff908116602083810191909152600386015493830193909352600490940154909316151560608401520152949350505050565b61248b613df7565b811561249b5761249b8585612692565b6001600160a01b0386166000908152600b60209081526040808320878452825280832088845290915290205460ff166126345760006124da8587612759565b5151905060006124eb86888a611fef565b90506000805b82515181101561253657825180518290811061250f5761250f614cb7565b6020026020010151602001516040015163ffffffff168201915080806001019150506124f1565b5060008060006125538961254a578461254d565b60005b8761365b565b919450925090506000600160135460ff16600181111561257557612575614fa0565b146125815760016125c3565b60008b8152600a60205260409020546001600160601b03166001600160401b034216118015906125c357506000876020015111806125c3575060008760400151115b905060008180156125e9575060008411806125de5750600085115b806125e95750600083115b6040805160e08082018352921515815260208101979097528601949094525050606083015293909301516001600160a01b03166080840152505060a0810186905260c0810185905290505b95945050505050565b612645613832565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000828152600d602052604090205460ff166126f05760405162461bcd60e51b815260206004820152601760248201527f43616d706169676e206e6f742072656769737465726564000000000000000000604482015260640161068d565b6000818152600e6020908152604080832085845290915290205460ff16611c1e5760405162461bcd60e51b815260206004820152601c60248201527f43616d706169676e206e6f7420696e2063757272656e74207765656b00000000604482015260640161068d565b612761613eac565b6000838152600e6020908152604080832085845282529182902082518084019093525460ff811615158352610100900463ffffffff168282018190529083015280511561298d57600f6000858152602001908152602001600020816020015163ffffffff16815481106127d6576127d6614cb7565b60009182526020918290206040805161016081018252600a9093029091018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a08601526001600160401b03600160601b9091041660c0850152600482015460e085015260058201546001600160a01b039081166101008601526006830154166101208501528251808401909352600782018054845260088301805495969395879593948794610140880194909390929184019161289d90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546128c990614d39565b80156129165780601f106128eb57610100808354040283529160200191612916565b820191906000526020600020905b8154815290600101906020018083116128f957829003601f168201915b5050505050815250508152505081526020016009820180548060200260200160405190810160405280929190818152602001828054801561298057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612962575b5050509190925250505082525b5092915050565b6000828152600f60205260409020805482919063ffffffff86169081106129bd576129bd614cb7565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b031991821617600160601b6001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e0850151600684018054909316911617905561010083015180516007830190815592810151919290916008840190612a879082614dba565b5050505050505050565b600054600160a01b900460ff1615610b605760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0381166000908152601660209081526040808320858452825280832086845290915281205460ff16612b4b576001600160a01b038216600081815260166020908152604080832087845282528083208884528252808320805460ff1916600190811790915560158352818420948452938252822080549384018155825290200183905561063a565b5060019392505050565b6000828152600f60205260409020805463ffffffff8516908110612b7b57612b7b614cb7565b60009182526020808320600a92909202909101600901805460018101825590835291200180546001600160a01b0319166001600160a01b03929092169190911790555050565b60009384526014602090815260408086209486529381528385206001600160a01b03909316855291825292829020835160018201559083015160028201805460ff90921660ff199283161790559183015160038201556060909201516004909201805492151592909116919091179055565b6001600160a01b03811660009081526004602052604090205460ff1615612c925760405162461bcd60e51b815260206004820152601360248201527210591b5a5b88185b1c9958591e481859191959606a1b604482015260640161068d565b6001600160a01b0381166000908152600460205260409020805460ff1916600190811790915560025490612cc7908290614fb6565b60ff90811660025516600090815260036020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d56612a91565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126753390565b600080612d9c611c22565b6060015190506000612dac611c22565b5190506000612dba83611de7565b90508115612e075781851015612e075760405162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015260640161068d565b612e31857f0000000000000000000000000000000000000000000000000000000000000000611b46565b60008086118015612e43575081518610155b15612e5c5781518681612e5857612e58614fcf565b0490505b3360005b8351811015612ebe576000848281518110612e7d57612e7d614cb7565b60200260200101516000015161010001516000015190506000612ea284868a8561385c565b9050612eb48883868460200151612bc1565b5050600101612e60565b506001979650505050505050565b6001600160a01b0383166000908152600b60209081526040808320858452825280832084845290915290205460ff16611c1c576001600160a01b0383166000908152600b6020908152604080832085845282528083208484529091529020805460ff19166001179055505050565b6001600160a01b038216612f615760405163867915ab60e01b815260040160405180910390fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b612f94613ecc565b829050600080612fb18360e0015184602001518560400151613960565b60208501919091526040840152505080519190910181526001600160401b0342166080820152919050565b60008060606000612feb611c22565b9050426001600160401b031681604001516001600160401b0316106130525760405162461bcd60e51b815260206004820152601760248201527f5472616e736974696f6e20697320696e20667574757265000000000000000000604482015260640161068d565b80606001519350613061611cec565b915061306b613b81565b92506130778785613b9f565b60005b82518110156130ec57600083828151811061309757613097614cb7565b602002602001015160000151905060006130b18783612759565b90506130be878784613c17565b6130e28160200151886130dd8460000151600001518d8d63ffffffff16565b612994565b505060010161307a565b505093509350939050565b80516000908152600d602052604090205460ff166115275780516000908152600d602090815260408220805460ff19166001908117909155600c80549182018155909252825160029092027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c78101928355908301518392917fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c8019061319c9082614dba565b50505050565b6131aa613e42565b6000878152600e602090815260408083208b51845282529182902082518084019093525460ff8116151580845261010090910463ffffffff169183019190915261340f5760018082526000898152600f60208181526040808420805463ffffffff811684890152938352929094018255908252825161012081018452878152908101899052918201879052606082015260808101426001600160401b0316815260200160008152602001886001600160a01b03168152602001846001600160a01b031681526020018a815250600f60008a8152602001908152602001600020826020015163ffffffff16815481106132a4576132a4614cb7565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b031991821617600160601b6001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e085015160068401805490931691161790556101008301518051600783019081559281015191929091600884019061336e9082614dba565b50505060008a8152600e602090815260408083208e5184528252909120845181549286015164ffffffffff1990931690151564ffffffff0019161761010063ffffffff90931692909202919091179055505088516133cd908990612759565b6000015191507f7e5566222c32876a37c4f46a32c3530645f8a210462fc0afd712d176268d8ea2826040516134029190614fe5565b60405180910390a161364f565b61341d888a60000151612759565b5180516020018051880190528051805186019052805160c001519092506001600160a01b0388811691161461345f5781516001600160a01b03881660c0909101525b60008511801561347757506001600160a01b03831615155b156135f2576000826000015160e001516001600160a01b0316846001600160a01b0316036134a7575060016134ca565b8251604001516000036134ca575081516001600160a01b03841660e09091015260015b80156135f057856001600160a01b03851663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190614d20565b106135f0576001600160a01b0384166323b872dd3360095460405160e084901b6001600160e01b03191681526001600160a01b03928316600482015291166024820152604481018990526064016020604051808303816000875af11580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df9190614f64565b156135f05782516040018051870190525b505b81516001600160401b0342166080909101526020810151825161361791908a90612994565b7f73ed9dac93997d0aad8785921b99a78c26845d99ba132a409c657482323a550b826040516136469190614fe5565b60405180910390a15b50979650505050505050565b600080600080856001600160401b031685606001516001600160601b0316101561368757613687614ff8565b600085606001516001600160601b03161180156136b0575060e08501516001600160a01b031615155b1561382a578460e001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371b919061500e565b604086015190915015613753576137508686604001518388606001516001600160601b0316613cf2909392919063ffffffff16565b93505b60208501511561378957613786868660200151601288606001516001600160601b0316613cf2909392919063ffffffff16565b92505b84511561382a57600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613807919061500e565b85516060870151919250613827916001600160601b031690889084613cf2565b91505b509250925092565b600054600160a01b900460ff16610b6057604051638dfc202b60e01b815260040160405180910390fd5b613864613e62565b61386f838387611fef565b905083156138f057600854604051630faa7cc560e21b8152600481018690526001600160a01b03878116602483015290911690633ea9f314906044016020604051808303816000875af11580156138ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ee9190614f64565b505b8060200151606001516139585760208181015160016060918201526040519087901b6bffffffffffffffffffffffff191691810191909152603481018490526054810185905260740160408051601f1981840301815291815281516020928301209183015101525b949350505050565b8181600260008315801590613976575030318411155b15613a225750601354604051606460ff841686020491600091620100009091046001600160a01b03169083908381818185875af1925050503d80600081146139da576040519150601f19603f3d011682016040523d82523d6000602084013e6139df565b606091505b5050905080613a1b5760405162461bcd60e51b8152602060048201526008602482015267150b91985a5b195960c21b604482015260640161068d565b8185039450505b600083118015613a9a57506040516370a0823160e01b815230600482015283906001600160a01b038916906370a0823190602401602060405180830381865afa158015613a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a979190614d20565b10155b15613b775750606460ff82168302046001600160a01b03871615613b715760135460405163a9059cbb60e01b8152620100009091046001600160a01b0390811660048301526024820183905288169063a9059cbb906044016020604051808303816000875af1158015613b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b359190614f64565b613b715760405162461bcd60e51b815260206004820152600d60248201526c115490cc8c081511985a5b1959609a1b604482015260640161068d565b80830392505b5050935093915050565b6007805460009182613b9283614ce3565b9091555050600754919050565b63ffffffff821615611c1e57600680544263ffffffff603c8602169081016001600160401b038116600160401b81026fffffffffffffffffffffffffffffffff199094168317939093179093556000848152600a6020526040902080546bffffffffffffffffffffffff19169092179091559061319c565b613c1f613eac565b8315613cb7576000613c32600186614f32565b9050613c3e8184612759565b80515161010081015160c082015160208301516040840151845160e090950151959750613c6d958a9590611c84565b508151516000604090910181905282515160200181905282515152428251516001600160401b039091166080909101526020820151825151613cb191908390612994565b5061319c565b613cc18483612759565b80515161010081015160c082015160e090920151929350613ceb9286929060009081908190611c84565b5050505050565b60006001600160601b0385161580613d1157506001600160401b038416155b80613d1a575082155b15613d2757506000613958565b836001600160401b0316856001600160601b03161015613d7d5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c1c9a5b98da5c185b607a1b604482015260640161068d565b60ff8216600a0a80846001600160601b0388166001600160401b038816830281613da957613da9614fcf565b040281613db857613db8614fcf565b049695505050505050565b6040518060800160405280613dd6613df7565b8152602001613de3613e62565b815260006020820181905260409091015290565b6040518060e0016040528060001515815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008019168152602001600081525090565b6040518060400160405280613e55613ecc565b8152602001606081525090565b604051806040016040528060608152602001613ea7604051806080016040528060008152602001600060ff168152602001600080191681526020016000151581525090565b905290565b6040518060400160405280613ebf613e42565b8152600060209091015290565b60408051610120810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905260e0840183905284518086019095529184528301529061010082015290565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715613f5f57613f5f613f26565b60405290565b604080519081016001600160401b0381118282101715613f5f57613f5f613f26565b604051606081016001600160401b0381118282101715613f5f57613f5f613f26565b604051601f8201601f191681016001600160401b0381118282101715613fd157613fd1613f26565b604052919050565b600082601f830112613fea57600080fd5b81356001600160401b0381111561400357614003613f26565b614016601f8201601f1916602001613fa9565b81815284602083860101111561402b57600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b03811681146106b557600080fd5b60008060006060848603121561407457600080fd5b83356001600160401b0381111561408a57600080fd5b61409686828701613fd9565b935050602084013591506140ac60408501614048565b90509250925092565b6000602082840312156140c757600080fd5b61063a82614048565b602080825282518282018190526000918401906040840190835b8181101561411f57835180516001600160a01b03168452602090810151151581850152909301926040909201916001016140ea565b509095945050505050565b60008060006060848603121561413f57600080fd5b61414884614048565b95602085013595506040909401359392505050565b6000815180845260005b8181101561418357602081850181015186830182015201614167565b506000602082860101526020601f19601f83011685010191505092915050565b805182526000602082015160406020850152613958604085018261415d565b600081518084526020840193506020830160005b828110156141fd5781516001600160a01b03168652602095860195909101906001016141d6565b5093949350505050565b6000815160408452805160408501526020810151606085015260408101516080850152606081015161424460a08601826001600160601b03169052565b5060808101516001600160401b03811660c08601525060a081015160e085015260c08101516001600160a01b0381166101008601525060e08101516001600160a01b0381166101208601525061010001516101206101408501526142ac6101608501826141a3565b90506020830151848203602086015261263482826141c2565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f198584030188526142ff838351614207565b60209889019890935091909101906001016142e3565b50909695505050505050565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f1985840301885281518051845260208101516060602086015261436f60608601826142c5565b6040928301516001600160601b03169590920194909452602098890198909350919091019060010161433f565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f198584030188526143d68383516141a3565b60209889019890935091909101906001016143ba565b8051151582526020808201519083015260408082015190830152606080820151908301526080808201516001600160a01b03169083015260a0808201519083015260c090810151910152565b60008151610100845261444f61010085018261415d565b905060208301518482036020860152614468828261415d565b9150506040830151614482604086018263ffffffff169052565b506060830151848203606086015261449a828261415d565b91505060808301516144b760808601826001600160401b03169052565b5060a08301516144cd60a086018261ffff169052565b5060c08301516144e860c08601826001600160401b03169052565b5060e083015184820360e0860152612634828261415d565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f19858403018852815180518452602090810151604082860181905281519086018190529101906060600582901b86018101919086019060005b818110156146ec57605f19888503018352845161457f8582516143ec565b602081015161014060e08701526101e08601815160a06101408901528181518084526102008a0191506102008160051b8b0101935060208301925060005b81811015614687576101ff198b860301835283518051604080885281519088018190526060600582901b8901810192602001919089019060005b8181101561465357605f198b8603018352835180516060875261461d606088018261415d565b6020838101516001600160401b0316898201526040938401511515939098019290925250949384019392909201916001016145f7565b505050506020820151915086810360208801526146708183614438565b9650505060209384019392909201916001016145bd565b5050505060209182015180516101608901528083015160ff166101808901526040808201516101a08a015260609182015115156101c08a0152840151151561010089015292909201516101209096019590955294840194939290920191600101614561565b5050506020998a019990945092909201915060010161451e565b6020815260008251805160208401526001600160401b0360208201511660408401526001600160401b0360408201511660608401526060810151608084015250602083015160e060a0840152614760610100840182614321565b90506040840151601f198483030160c085015261477d828261439c565b9150506060840151601f198483030160e08501526126348282614500565b6000806000606084860312156147b057600080fd5b505081359360208301359350604090920135919050565b60006001600160401b038211156147e0576147e0613f26565b5060051b60200190565b80356001600160401b03811681146106b557600080fd5b801515811461152757600080fd5b803563ffffffff811681146106b557600080fd5b803561ffff811681146106b557600080fd5b6000610100828403121561484857600080fd5b614850613f3c565b905081356001600160401b0381111561486857600080fd5b61487484828501613fd9565b82525060208201356001600160401b0381111561489057600080fd5b61489c84828501613fd9565b6020830152506148ae6040830161480f565b604082015260608201356001600160401b038111156148cc57600080fd5b6148d884828501613fd9565b6060830152506148ea608083016147ea565b60808201526148fb60a08301614823565b60a082015261490c60c083016147ea565b60c082015260e08201356001600160401b0381111561492a57600080fd5b61493684828501613fd9565b60e08301525092915050565b60008060006060848603121561495757600080fd5b61496084614048565b925060208401356001600160401b0381111561497b57600080fd5b84016040818703121561498d57600080fd5b614995613f65565b81356001600160401b038111156149ab57600080fd5b8201601f810188136149bc57600080fd5b80356149cf6149ca826147c7565b613fa9565b8082825260208201915060208360051b85010192508a8311156149f157600080fd5b602084015b83811015614a945780356001600160401b03811115614a1457600080fd5b85016060818e03601f19011215614a2a57600080fd5b614a32613f87565b60208201356001600160401b03811115614a4b57600080fd5b614a5a8f602083860101613fd9565b825250614a69604083016147ea565b602082015260608201359150614a7e82614801565b60408101919091528352602092830192016149f6565b50845250505060208201356001600160401b03811115614ab357600080fd5b614abf88828501614835565b60208301525093969395505050506040919091013590565b600060208284031215614ae957600080fd5b81356001600160401b03811115614aff57600080fd5b8201601f81018413614b1057600080fd5b8035614b1e6149ca826147c7565b8082825260208201915060208360051b850101925086831115614b4057600080fd5b602084015b83811015614b815780356001600160401b03811115614b6357600080fd5b614b7289602083890101613fd9565b84525060209283019201614b45565b509695505050505050565b602080825282516040838301528051606084018190526000929190910190829060808501905b80831015614bdc57614bc58285516143ec565b60e082019150602084019350600183019250614bb2565b506020860151604086015280935050505092915050565b60208152600061063a60208301846142c5565b60008060008060008060c08789031215614c1f57600080fd5b8635955060208701359450604087013593506060870135925060808701359150614c4b60a08801614048565b90509295509295509295565b600060208284031215614c6957600080fd5b5035919050565b600060208284031215614c8257600080fd5b61063a8261480f565b60008060408385031215614c9e57600080fd5b82359150614cae6020840161480f565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614cf557614cf5614ccd565b5060010190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b600060208284031215614d3257600080fd5b5051919050565b600181811c90821680614d4d57607f821691505b602082108103614d6d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611c1c57806000526020600020601f840160051c81016020851015614d9a5750805b601f840160051c820191505b81811015613ceb5760008155600101614da6565b81516001600160401b03811115614dd357614dd3613f26565b614de781614de18454614d39565b84614d73565b6020601f821160018114614e1b5760008315614e035750848201515b600019600385901b1c1916600184901b178455613ceb565b600084815260208120601f198516915b82811015614e4b5787850151825560209485019460019092019101614e2b565b5084821015614e695786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b83815282602082015260606040820152600060a0820183516040606085015281815180845260c08601915060c08160051b870101935060208301925060005b81811015614f135760bf198786030183528351805160608752614edd606088018261415d565b6020838101516001600160401b031689820152604093840151151593909801929092525094938401939290920191600101614eb7565b505050506020840151838203605f19016080850152611cb48282614438565b81810381811115610b7f57610b7f614ccd565b63ffffffff818116838216029081169081811461298d5761298d614ccd565b600060208284031215614f7657600080fd5b815161063a81614801565b838152826020820152606060408201526000612634606083018461439c565b634e487b7160e01b600052602160045260246000fd5b60ff8181168382160190811115610b7f57610b7f614ccd565b634e487b7160e01b600052601260045260246000fd5b60208152600061063a6020830184614207565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561502057600080fd5b815160ff8116811461063a57600080fdfea2646970667358221220cd2551b841c7ab2ee101bcd93b958a38c0e1e9919a092d487496632d04dbc0da64736f6c634300081c003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000378bc6636445edf805cc7730cd7b8953037e3f8100000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c0f6ef6c8a58fb431015d4d2d7e0925718eac010000000000000000000000000d7c271d20c9e323336bfc843aeb8dec23b346352000000000000000000000000b2adb77a837d19c3ada396db74483b05d49ad6b7000000000000000000000000a1f70ffa4322e3609dd905b41f17bf3913366bc1000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000008736f6c696469747900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000772656163746a730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086574686572736a73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6a61766173637269707400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a74797065736372697074000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007686172646861740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096661726361737465720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000373646b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046465666900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000463656c6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001173656c662d70726f746f636f6c2d73646b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e63727970746f63757272656e6379000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c80638456cb5911610102578063b029d68e11610095578063c8559a9e11610064578063c8559a9e14610563578063e4f6da1b14610583578063f2fde38b146105a2578063fe1db20b146105c257600080fd5b8063b029d68e146104ee578063b5252f9b14610503578063b85a35d214610523578063bb3790871461054357600080fd5b80639db412d0116100d15780639db412d0146104705780639ed374f7146104905780639f2032e4146104ae578063a75ec94e146104ce57600080fd5b80638456cb59146104135780638da5cb5b146104285780638fa4fdfd14610446578063958420271461044e57600080fd5b80634b6b0a611161017a5780635c975abb116101495780635c975abb14610392578063704b6c02146103b1578063715018a6146103d15780637723bafb146103e657600080fd5b80634b6b0a61146103075780634b7739c9146103275780634e71d92d1461033a5780635895668c1461037257600080fd5b8063373a5d79116101b6578063373a5d791461025257806338266b22146102a35780633f4ba83a146102d05780633fd8cc4e146102e757600080fd5b806308ddc0ae146101e8578063144fa6d71461021057806331ae450b1461023057600080fd5b366101e357005b600080fd5b6101fb6101f636600461405f565b6105e2565b60405190151581526020015b60405180910390f35b34801561021c57600080fd5b506101fb61022b3660046140b5565b610641565b34801561023c57600080fd5b506102456106ba565b60405161020791906140d0565b34801561025e57600080fd5b506101fb61026d36600461412a565b6001600160a01b0383166000908152600b60209081526040808320858452825280832084845290915290205460ff169392505050565b3480156102af57600080fd5b506102c36102be3660046140b5565b6107b1565b6040516102079190614706565b3480156102dc57600080fd5b506102e5610b50565b005b3480156102f357600080fd5b506101fb6103023660046140b5565b610b62565b34801561031357600080fd5b506101fb61032236600461479b565b610b85565b6101fb610335366004614942565b610d9a565b34801561034657600080fd5b5060095461035a906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b34801561037e57600080fd5b506101fb61038d366004614ad7565b611496565b34801561039e57600080fd5b50600054600160a01b900460ff166101fb565b3480156103bd57600080fd5b506102e56103cc3660046140b5565b611516565b3480156103dd57600080fd5b506102e561152a565b3480156103f257600080fd5b506104066104013660046140b5565b61153c565b6040516102079190614b8c565b34801561041f57600080fd5b506102e56116a4565b34801561043457600080fd5b506000546001600160a01b031661035a565b6101fb6116b4565b34801561045a57600080fd5b506104636116c4565b6040516102079190614bf3565b34801561047c57600080fd5b506102e561048b366004614c06565b6116fb565b34801561049c57600080fd5b506008546001600160a01b031661035a565b3480156104ba57600080fd5b506102e56104c9366004614c57565b61180a565b3480156104da57600080fd5b506102e56104e9366004614c70565b61181b565b3480156104fa57600080fd5b506101fb61185b565b34801561050f57600080fd5b506102e561051e3660046140b5565b611886565b34801561052f57600080fd5b506102e561053e3660046140b5565b6118d0565b34801561054f57600080fd5b506101fb61055e3660046140b5565b61191a565b34801561056f57600080fd5b506102e561057e3660046140b5565b611949565b34801561058f57600080fd5b506013546101fb90610100900460ff1681565b3480156105ae57600080fd5b506102e56105bd3660046140b5565b61197a565b3480156105ce57600080fd5b506101fb6105dd366004614c8b565b6119b5565b6009546000906105fc9034906001600160a01b0316611b46565b610634610607611c22565b60600151604080518082019091526000815260208082018890528751908801208152333487600088611c84565b50600190505b9392505050565b600061064b611cbf565b6001600160a01b0382166106965760405162461bcd60e51b815260206004820152600d60248201526c546f6b656e206973207a65726f60981b60448201526064015b60405180910390fd5b50600880546001600160a01b0319166001600160a01b03831617905560015b919050565b60025460609060ff81166000036106cf575090565b8060ff166001600160401b038111156106ea576106ea613f26565b60405190808252806020026020018201604052801561072f57816020015b60408051808201909152600080825260208201528152602001906001900390816107085790505b50915060005b8160ff168160ff1610156107ac5760ff808216600081815260036020908152604080832054815180830183526001600160a01b03909116808252808552600484529190932054909416151590820152855190918691811061079857610798614cb7565b602090810291909101015250600101610735565b505090565b6107fc60408051610100810190915260006080820181815260a0830182905260c0830182905260e0830191909152819081526020016060815260200160608152602001606081525090565b610804611c22565b815261080e611cec565b60408201528051606001518061082381614ce3565b915050806001600160401b0381111561083e5761083e613f26565b60405190808252806020026020018201604052801561089c57816020015b6108896040518060600160405280600081526020016060815260200160006001600160601b031681525090565b81526020019060019003908161085c5790505b506020830152806001600160401b038111156108ba576108ba613f26565b60405190808252806020026020018201604052801561090057816020015b6040805180820190915260008152606060208201528152602001906001900390816108d85790505b50606083015260408201515160005b82811015610b485761092081611de7565b8460200151828151811061093657610936614cb7565b602002602001015160200181905250610964816000908152600a60205260409020546001600160601b031690565b8460200151828151811061097a5761097a614cb7565b6020026020010151604001906001600160601b031690816001600160601b0316815250506000826001600160401b038111156109b8576109b8613f26565b6040519080825280602002602001820160405280156109f157816020015b6109de613dc3565b8152602001906001900390816109d65790505b5090506001600160a01b03861615610b3f578185606001518381518110610a1a57610a1a614cb7565b60209081029190910101515260005b83811015610b1757600086604001518281518110610a4957610a49614cb7565b60200260200101516000015190506000601360019054906101000a900460ff1615610a8957610a7985838b611fef565b6020015160600151610a89575060015b6040518060800160405280610aa28b8589866000612483565b8152602001610ab287858d611fef565b81526001600160a01b038b166000908152600b602090815260408083208a845282528083208784528252918290205460ff16151590830152018390528451859085908110610b0257610b02614cb7565b60209081029190910101525050600101610a29565b508085606001518381518110610b2f57610b2f614cb7565b6020026020010151602001819052505b5060010161090f565b505050919050565b610b58611cbf565b610b6061263d565b565b6001600160a01b03811660009081526001602052604081205460ff165b92915050565b6000610baa335b6001600160a01b031660009081526004602052604090205460ff1690565b610bc65760405162461bcd60e51b815260040161068d90614cfc565b6000610bd0611c22565b606001519050610be08582612692565b6000610bec8287612759565b80515160e001519091506001600160a01b0316610c3b5760405162461bcd60e51b815260206004820152600d60248201526c546f6b656e206973207a65726f60981b604482015260640161068d565b80515160e001516009546040516370a0823160e01b81526001600160a01b039182166004820152879291909116906370a0823190602401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190614d20565b1015610cf95760405162461bcd60e51b8152602060048201526015602482015274115490cc8c10985b081a5b98dbdb9cda5cdd195b9d605a1b604482015260640161068d565b6009546001600160a01b031631841115610d555760405162461bcd60e51b815260206004820152601960248201527f4e65772076616c756520657863656564732062616c616e636500000000000000604482015260640161068d565b80515160400185905280515160209081018590528151516001600160401b034216608090910152810151815151610d8e91908490612994565b50600195945050505050565b6000610da533610b8c565b610dc15760405162461bcd60e51b815260040161068d90614cfc565b610dc9612a91565b6000610dd3611c22565b606001519050610e03347f000000000000000000000000378bc6636445edf805cc7730cd7b8953037e3f81611b46565b6001600160a01b038516610e485760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b604482015260640161068d565b610e528382612692565b6000610e5e8285612759565b90506000610e6d838689611fef565b9050610e7a838689612abc565b610e9b57610e8d82602001518489612b55565b81515160a001805160010190525b607881602001516020015160ff161115610ef05760405162461bcd60e51b815260206004820152601660248201527514dd1bdc9859d9481b1a5b5a5d08195e18d95959195960521b604482015260640161068d565b602081810180518201805160010160ff1690529087015160400151835151606001805163ffffffff9092169091016001600160601b0316905251610f3990849087908a90612bc1565b600083815260146020908152604080832088845282528083206001600160a01b038b16808552908352908320805460018101808355828652938b01515192909452909183908110610f8c57610f8c614cb7565b90600052602060002090600702016001016000019081610fac9190614dba565b5060208088015181015160008681526014835260408082208a835284528082206001600160a01b038d16835290935291909120805483908110610ff157610ff1614cb7565b906000526020600020906007020160010160010190816110119190614dba565b5060208088015160e0015160008681526014835260408082208a835284528082206001600160a01b038d1683529093529190912080548390811061105757611057614cb7565b906000526020600020906007020160010160050190816110779190614dba565b506020808801516060015160008681526014835260408082208a835284528082206001600160a01b038d168352909352919091208054839081106110bd576110bd614cb7565b906000526020600020906007020160010160030190816110dd9190614dba565b506020808801516040908101516000878152601484528281208a825284528281206001600160a01b038d168252909352912080548390811061112157611121614cb7565b60009182526020808320600792909202909101600301805463ffffffff191663ffffffff949094169390931790925588820151608001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061119057611190614cb7565b60009182526020808320600792909202909101600501805467ffffffffffffffff19166001600160401b0394909416939093179092558882015160a001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061120657611206614cb7565b60009182526020808320600560079093020191909101805461ffff94909416600160401b0269ffff000000000000000019909416939093179092558882015160c001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061128157611281614cb7565b9060005260206000209060070201600101600401600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060005b87515181101561142e576000886000015182815181106112de576112de614cb7565b60209081029190910181015160008881526014835260408082208c835284528082206001600160a01b038f168352909352919091208054919250908490811061132957611329614cb7565b6000918252602080832060079092029091018054600101815582526040805160608101825284518152848301516001600160401b03168184015284820151151581830152898452601483528184208c855283528184206001600160a01b038f1685529092529091208054859081106113a3576113a3614cb7565b906000526020600020906007020160000183815481106113c5576113c5614cb7565b6000918252602090912082516002909202019081906113e49082614dba565b506020820151600191820180546040909401511515600160401b0268ffffffffffffffffff199094166001600160401b0390921691909117929092179091559190910190506112bc565b50602083015183515161144391908690612994565b876001600160a01b03167fe0df5b06e1ab66524ad8b49d46638d970e291a5048eaad107252e763984c3e6985888a60405161148093929190614e78565b60405180910390a2506001979650505050505050565b6000805b825181101561150d5760006114e58483815181106114ba576114ba614cb7565b6020026020010151604080518082019091526000815260208082018390528251920191909120815290565b516000908152600d60205260409020805460ff19811660ff909116151790555060010161149a565b50600192915050565b61151e611cbf565b61152781612c33565b50565b611532611cbf565b610b606000612cfe565b604080518082019091526060815260006020820152600061155b611c22565b606001519050801561157557611572600182614f32565b90505b600061158082611de7565b8051909150806001600160401b0381111561159d5761159d613f26565b6040519080825280602002602001820160405280156115d657816020015b6115c3613df7565b8152602001906001900390816115bb5790505b5084526020840183905260005b8181101561169b57601354600090610100900460ff161561163f5761162f8585848151811061161457611614614cb7565b60200260200101516000015161010001516000015189611fef565b602001516060015161163f575060015b6116738785848151811061165557611655614cb7565b60200260200101516000015161010001516000015187846000612483565b865180518490811061168757611687614cb7565b6020908102919091010152506001016115e3565b50505050919050565b6116ac611cbf565b610b60612d4e565b60006116bf34612d91565b905090565b606060006116d0611c22565b606001519050806000036116e2575090565b6116f56116f0600183614f32565b611de7565b91505090565b3360009081526001602052604090205460ff166117515760405162461bcd60e51b8152602060048201526014602482015273139bdd08185c1c1c9bdd9959081858d8dbdd5b9d60621b604482015260640161068d565b61175c818787612ecc565b60006117688787612759565b80515160400151909150841161179257805151604001805185919061178e908390614f32565b9052505b8051516020015185116117b95780515160200180518691906117b5908390614f32565b9052505b8051515183116117da5780515180518491906117d6908390614f32565b9052505b8051516001600160401b034216608090910152602081015181515161180191908990612994565b50505050505050565b611812611cbf565b61152781600555565b611823611cbf565b63ffffffff8116156115275761183a81603c614f45565b6006805467ffffffffffffffff191663ffffffff9290921691909117905550565b6000611865611cbf565b506013805461ff001981166101009182900460ff1615909102179055600190565b61188e611cbf565b611899816000612f3a565b6040516001600160a01b038216907fdf982251973669f107e8764c0488f080ceca6d72192314e1f94e347378ce4a0190600090a250565b6118d8611cbf565b6118e3816001612f3a565b6040516001600160a01b038216907f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce790600090a250565b6000611924611cbf565b50600980546001600160a01b0383166001600160a01b03199091161790556001919050565b611951611cbf565b6001600160a01b03166000908152600460205260409020805460ff19811660ff90911615179055565b611982611cbf565b6001600160a01b0381166119ac57604051631e4fbdf760e01b81526000600482015260240161068d565b61152781612cfe565b60006119bf612a91565b6119c833610b8c565b6119e45760405162461bcd60e51b815260040161068d90614cfc565b60008060006119f68587612f8c612fdc565b919450925090508515611aff576008546001600160a01b0316611a465760405162461bcd60e51b8152602060048201526008602482015267546b20656d70747960c01b604482015260640161068d565b600854600954604051630faa7cc560e21b8152600481018990526001600160a01b039182166024820152911690633ea9f314906044016020604051808303816000875af1158015611a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abf9190614f64565b611aff5760405162461bcd60e51b8152602060048201526011602482015270105b1b1bd8d85d1a5bdb8819985a5b1959607a1b604482015260640161068d565b7f7384e755c7195e3b4189c9d1fe1777168cc7a79d47c98e4172c731cd5d248866838383604051611b3293929190614f81565b60405180910390a150600195945050505050565b8115611c1e573031821115611b905760405162461bcd60e51b815260206004820152601060248201526f125b9cdd59999a58da595b9d0818985b60821b604482015260640161068d565b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114611bdd576040519150601f19603f3d011682016040523d82523d6000602084013e611be2565b606091505b5050905080611c1c5760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b604482015260640161068d565b505b5050565b604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260055481526006546001600160401b038082166020840152600160401b9091041691810191909152600754606082015290565b611c8c613e42565b611c95876130f7565b611ca4878988888888886131a2565b9050611cb4876000015189612692565b979650505050505050565b6000546001600160a01b03163314610b605760405163118cdaa760e01b815233600482015260240161068d565b6060600c805480602002602001604051908101604052809291908181526020016000905b82821015611dde578382906000526020600020906002020160405180604001604052908160008201548152602001600182018054611d4d90614d39565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7990614d39565b8015611dc65780601f10611d9b57610100808354040283529160200191611dc6565b820191906000526020600020905b815481529060010190602001808311611da957829003601f168201915b50505050508152505081526020019060010190611d10565b50505050905090565b6060600f6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611fe45760008481526020908190206040805161016081018252600a86029092018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a0860152600160601b90046001600160401b031660c0850152600482015460e085015260058201546001600160a01b0390811661010086015260068301541661012085015282518084019093526007820180548452600883018054959693958795939487946101408801949093909291840191611ee990614d39565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1590614d39565b8015611f625780601f10611f3757610100808354040283529160200191611f62565b820191906000526020600020905b815481529060010190602001808311611f4557829003601f168201915b50505050508152505081525050815260200160098201805480602002602001604051908101604052809291908181526020018280548015611fcc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fae575b50505050508152505081526020019060010190611e1c565b505050509050919050565b611ff7613e62565b600084815260146020908152604080832086845282528083206001600160a01b03861684528252808320815181546060948102820185018452928101838152909491938593919285929185015b828210156124325760008481526020808220604080516007870290920180546060948102840185018352918301828152929490938593928592909185015b8282101561217357838290600052602060002090600202016040518060600160405290816000820180546120b590614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546120e190614d39565b801561212e5780601f106121035761010080835404028352916020019161212e565b820191906000526020600020905b81548152906001019060200180831161211157829003601f168201915b50505091835250506001918201546001600160401b038116602080840191909152600160401b90910460ff161515604090920191909152918352929092019101612082565b505050508152602001600182016040518061010001604052908160008201805461219c90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546121c890614d39565b80156122155780601f106121ea57610100808354040283529160200191612215565b820191906000526020600020905b8154815290600101906020018083116121f857829003601f168201915b5050505050815260200160018201805461222e90614d39565b80601f016020809104026020016040519081016040528092919081815260200182805461225a90614d39565b80156122a75780601f1061227c576101008083540402835291602001916122a7565b820191906000526020600020905b81548152906001019060200180831161228a57829003601f168201915b5050509183525050600282015463ffffffff1660208201526003820180546040909201916122d490614d39565b80601f016020809104026020016040519081016040528092919081815260200182805461230090614d39565b801561234d5780601f106123225761010080835404028352916020019161234d565b820191906000526020600020905b81548152906001019060200180831161233057829003601f168201915b505050918352505060048201546001600160401b03808216602084015261ffff600160401b8304166040840152600160501b90910416606082015260058201805460809092019161239d90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546123c990614d39565b80156124165780601f106123eb57610100808354040283529160200191612416565b820191906000526020600020905b8154815290600101906020018083116123f957829003601f168201915b5050505050815250508152505081526020019060010190612044565b505050908252506040805160808101825260018401548152600284015460ff908116602083810191909152600386015493830193909352600490940154909316151560608401520152949350505050565b61248b613df7565b811561249b5761249b8585612692565b6001600160a01b0386166000908152600b60209081526040808320878452825280832088845290915290205460ff166126345760006124da8587612759565b5151905060006124eb86888a611fef565b90506000805b82515181101561253657825180518290811061250f5761250f614cb7565b6020026020010151602001516040015163ffffffff168201915080806001019150506124f1565b5060008060006125538961254a578461254d565b60005b8761365b565b919450925090506000600160135460ff16600181111561257557612575614fa0565b146125815760016125c3565b60008b8152600a60205260409020546001600160601b03166001600160401b034216118015906125c357506000876020015111806125c3575060008760400151115b905060008180156125e9575060008411806125de5750600085115b806125e95750600083115b6040805160e08082018352921515815260208101979097528601949094525050606083015293909301516001600160a01b03166080840152505060a0810186905260c0810185905290505b95945050505050565b612645613832565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000828152600d602052604090205460ff166126f05760405162461bcd60e51b815260206004820152601760248201527f43616d706169676e206e6f742072656769737465726564000000000000000000604482015260640161068d565b6000818152600e6020908152604080832085845290915290205460ff16611c1e5760405162461bcd60e51b815260206004820152601c60248201527f43616d706169676e206e6f7420696e2063757272656e74207765656b00000000604482015260640161068d565b612761613eac565b6000838152600e6020908152604080832085845282529182902082518084019093525460ff811615158352610100900463ffffffff168282018190529083015280511561298d57600f6000858152602001908152602001600020816020015163ffffffff16815481106127d6576127d6614cb7565b60009182526020918290206040805161016081018252600a9093029091018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a08601526001600160401b03600160601b9091041660c0850152600482015460e085015260058201546001600160a01b039081166101008601526006830154166101208501528251808401909352600782018054845260088301805495969395879593948794610140880194909390929184019161289d90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546128c990614d39565b80156129165780601f106128eb57610100808354040283529160200191612916565b820191906000526020600020905b8154815290600101906020018083116128f957829003601f168201915b5050505050815250508152505081526020016009820180548060200260200160405190810160405280929190818152602001828054801561298057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612962575b5050509190925250505082525b5092915050565b6000828152600f60205260409020805482919063ffffffff86169081106129bd576129bd614cb7565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b031991821617600160601b6001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e0850151600684018054909316911617905561010083015180516007830190815592810151919290916008840190612a879082614dba565b5050505050505050565b600054600160a01b900460ff1615610b605760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0381166000908152601660209081526040808320858452825280832086845290915281205460ff16612b4b576001600160a01b038216600081815260166020908152604080832087845282528083208884528252808320805460ff1916600190811790915560158352818420948452938252822080549384018155825290200183905561063a565b5060019392505050565b6000828152600f60205260409020805463ffffffff8516908110612b7b57612b7b614cb7565b60009182526020808320600a92909202909101600901805460018101825590835291200180546001600160a01b0319166001600160a01b03929092169190911790555050565b60009384526014602090815260408086209486529381528385206001600160a01b03909316855291825292829020835160018201559083015160028201805460ff90921660ff199283161790559183015160038201556060909201516004909201805492151592909116919091179055565b6001600160a01b03811660009081526004602052604090205460ff1615612c925760405162461bcd60e51b815260206004820152601360248201527210591b5a5b88185b1c9958591e481859191959606a1b604482015260640161068d565b6001600160a01b0381166000908152600460205260409020805460ff1916600190811790915560025490612cc7908290614fb6565b60ff90811660025516600090815260036020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d56612a91565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126753390565b600080612d9c611c22565b6060015190506000612dac611c22565b5190506000612dba83611de7565b90508115612e075781851015612e075760405162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015260640161068d565b612e31857f000000000000000000000000378bc6636445edf805cc7730cd7b8953037e3f81611b46565b60008086118015612e43575081518610155b15612e5c5781518681612e5857612e58614fcf565b0490505b3360005b8351811015612ebe576000848281518110612e7d57612e7d614cb7565b60200260200101516000015161010001516000015190506000612ea284868a8561385c565b9050612eb48883868460200151612bc1565b5050600101612e60565b506001979650505050505050565b6001600160a01b0383166000908152600b60209081526040808320858452825280832084845290915290205460ff16611c1c576001600160a01b0383166000908152600b6020908152604080832085845282528083208484529091529020805460ff19166001179055505050565b6001600160a01b038216612f615760405163867915ab60e01b815260040160405180910390fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b612f94613ecc565b829050600080612fb18360e0015184602001518560400151613960565b60208501919091526040840152505080519190910181526001600160401b0342166080820152919050565b60008060606000612feb611c22565b9050426001600160401b031681604001516001600160401b0316106130525760405162461bcd60e51b815260206004820152601760248201527f5472616e736974696f6e20697320696e20667574757265000000000000000000604482015260640161068d565b80606001519350613061611cec565b915061306b613b81565b92506130778785613b9f565b60005b82518110156130ec57600083828151811061309757613097614cb7565b602002602001015160000151905060006130b18783612759565b90506130be878784613c17565b6130e28160200151886130dd8460000151600001518d8d63ffffffff16565b612994565b505060010161307a565b505093509350939050565b80516000908152600d602052604090205460ff166115275780516000908152600d602090815260408220805460ff19166001908117909155600c80549182018155909252825160029092027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c78101928355908301518392917fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c8019061319c9082614dba565b50505050565b6131aa613e42565b6000878152600e602090815260408083208b51845282529182902082518084019093525460ff8116151580845261010090910463ffffffff169183019190915261340f5760018082526000898152600f60208181526040808420805463ffffffff811684890152938352929094018255908252825161012081018452878152908101899052918201879052606082015260808101426001600160401b0316815260200160008152602001886001600160a01b03168152602001846001600160a01b031681526020018a815250600f60008a8152602001908152602001600020826020015163ffffffff16815481106132a4576132a4614cb7565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b031991821617600160601b6001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e085015160068401805490931691161790556101008301518051600783019081559281015191929091600884019061336e9082614dba565b50505060008a8152600e602090815260408083208e5184528252909120845181549286015164ffffffffff1990931690151564ffffffff0019161761010063ffffffff90931692909202919091179055505088516133cd908990612759565b6000015191507f7e5566222c32876a37c4f46a32c3530645f8a210462fc0afd712d176268d8ea2826040516134029190614fe5565b60405180910390a161364f565b61341d888a60000151612759565b5180516020018051880190528051805186019052805160c001519092506001600160a01b0388811691161461345f5781516001600160a01b03881660c0909101525b60008511801561347757506001600160a01b03831615155b156135f2576000826000015160e001516001600160a01b0316846001600160a01b0316036134a7575060016134ca565b8251604001516000036134ca575081516001600160a01b03841660e09091015260015b80156135f057856001600160a01b03851663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190614d20565b106135f0576001600160a01b0384166323b872dd3360095460405160e084901b6001600160e01b03191681526001600160a01b03928316600482015291166024820152604481018990526064016020604051808303816000875af11580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df9190614f64565b156135f05782516040018051870190525b505b81516001600160401b0342166080909101526020810151825161361791908a90612994565b7f73ed9dac93997d0aad8785921b99a78c26845d99ba132a409c657482323a550b826040516136469190614fe5565b60405180910390a15b50979650505050505050565b600080600080856001600160401b031685606001516001600160601b0316101561368757613687614ff8565b600085606001516001600160601b03161180156136b0575060e08501516001600160a01b031615155b1561382a578460e001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371b919061500e565b604086015190915015613753576137508686604001518388606001516001600160601b0316613cf2909392919063ffffffff16565b93505b60208501511561378957613786868660200151601288606001516001600160601b0316613cf2909392919063ffffffff16565b92505b84511561382a57600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613807919061500e565b85516060870151919250613827916001600160601b031690889084613cf2565b91505b509250925092565b600054600160a01b900460ff16610b6057604051638dfc202b60e01b815260040160405180910390fd5b613864613e62565b61386f838387611fef565b905083156138f057600854604051630faa7cc560e21b8152600481018690526001600160a01b03878116602483015290911690633ea9f314906044016020604051808303816000875af11580156138ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ee9190614f64565b505b8060200151606001516139585760208181015160016060918201526040519087901b6bffffffffffffffffffffffff191691810191909152603481018490526054810185905260740160408051601f1981840301815291815281516020928301209183015101525b949350505050565b8181600260008315801590613976575030318411155b15613a225750601354604051606460ff841686020491600091620100009091046001600160a01b03169083908381818185875af1925050503d80600081146139da576040519150601f19603f3d011682016040523d82523d6000602084013e6139df565b606091505b5050905080613a1b5760405162461bcd60e51b8152602060048201526008602482015267150b91985a5b195960c21b604482015260640161068d565b8185039450505b600083118015613a9a57506040516370a0823160e01b815230600482015283906001600160a01b038916906370a0823190602401602060405180830381865afa158015613a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a979190614d20565b10155b15613b775750606460ff82168302046001600160a01b03871615613b715760135460405163a9059cbb60e01b8152620100009091046001600160a01b0390811660048301526024820183905288169063a9059cbb906044016020604051808303816000875af1158015613b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b359190614f64565b613b715760405162461bcd60e51b815260206004820152600d60248201526c115490cc8c081511985a5b1959609a1b604482015260640161068d565b80830392505b5050935093915050565b6007805460009182613b9283614ce3565b9091555050600754919050565b63ffffffff821615611c1e57600680544263ffffffff603c8602169081016001600160401b038116600160401b81026fffffffffffffffffffffffffffffffff199094168317939093179093556000848152600a6020526040902080546bffffffffffffffffffffffff19169092179091559061319c565b613c1f613eac565b8315613cb7576000613c32600186614f32565b9050613c3e8184612759565b80515161010081015160c082015160208301516040840151845160e090950151959750613c6d958a9590611c84565b508151516000604090910181905282515160200181905282515152428251516001600160401b039091166080909101526020820151825151613cb191908390612994565b5061319c565b613cc18483612759565b80515161010081015160c082015160e090920151929350613ceb9286929060009081908190611c84565b5050505050565b60006001600160601b0385161580613d1157506001600160401b038416155b80613d1a575082155b15613d2757506000613958565b836001600160401b0316856001600160601b03161015613d7d5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c1c9a5b98da5c185b607a1b604482015260640161068d565b60ff8216600a0a80846001600160601b0388166001600160401b038816830281613da957613da9614fcf565b040281613db857613db8614fcf565b049695505050505050565b6040518060800160405280613dd6613df7565b8152602001613de3613e62565b815260006020820181905260409091015290565b6040518060e0016040528060001515815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008019168152602001600081525090565b6040518060400160405280613e55613ecc565b8152602001606081525090565b604051806040016040528060608152602001613ea7604051806080016040528060008152602001600060ff168152602001600080191681526020016000151581525090565b905290565b6040518060400160405280613ebf613e42565b8152600060209091015290565b60408051610120810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905260e0840183905284518086019095529184528301529061010082015290565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715613f5f57613f5f613f26565b60405290565b604080519081016001600160401b0381118282101715613f5f57613f5f613f26565b604051606081016001600160401b0381118282101715613f5f57613f5f613f26565b604051601f8201601f191681016001600160401b0381118282101715613fd157613fd1613f26565b604052919050565b600082601f830112613fea57600080fd5b81356001600160401b0381111561400357614003613f26565b614016601f8201601f1916602001613fa9565b81815284602083860101111561402b57600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b03811681146106b557600080fd5b60008060006060848603121561407457600080fd5b83356001600160401b0381111561408a57600080fd5b61409686828701613fd9565b935050602084013591506140ac60408501614048565b90509250925092565b6000602082840312156140c757600080fd5b61063a82614048565b602080825282518282018190526000918401906040840190835b8181101561411f57835180516001600160a01b03168452602090810151151581850152909301926040909201916001016140ea565b509095945050505050565b60008060006060848603121561413f57600080fd5b61414884614048565b95602085013595506040909401359392505050565b6000815180845260005b8181101561418357602081850181015186830182015201614167565b506000602082860101526020601f19601f83011685010191505092915050565b805182526000602082015160406020850152613958604085018261415d565b600081518084526020840193506020830160005b828110156141fd5781516001600160a01b03168652602095860195909101906001016141d6565b5093949350505050565b6000815160408452805160408501526020810151606085015260408101516080850152606081015161424460a08601826001600160601b03169052565b5060808101516001600160401b03811660c08601525060a081015160e085015260c08101516001600160a01b0381166101008601525060e08101516001600160a01b0381166101208601525061010001516101206101408501526142ac6101608501826141a3565b90506020830151848203602086015261263482826141c2565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f198584030188526142ff838351614207565b60209889019890935091909101906001016142e3565b50909695505050505050565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f1985840301885281518051845260208101516060602086015261436f60608601826142c5565b6040928301516001600160601b03169590920194909452602098890198909350919091019060010161433f565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f198584030188526143d68383516141a3565b60209889019890935091909101906001016143ba565b8051151582526020808201519083015260408082015190830152606080820151908301526080808201516001600160a01b03169083015260a0808201519083015260c090810151910152565b60008151610100845261444f61010085018261415d565b905060208301518482036020860152614468828261415d565b9150506040830151614482604086018263ffffffff169052565b506060830151848203606086015261449a828261415d565b91505060808301516144b760808601826001600160401b03169052565b5060a08301516144cd60a086018261ffff169052565b5060c08301516144e860c08601826001600160401b03169052565b5060e083015184820360e0860152612634828261415d565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f19858403018852815180518452602090810151604082860181905281519086018190529101906060600582901b86018101919086019060005b818110156146ec57605f19888503018352845161457f8582516143ec565b602081015161014060e08701526101e08601815160a06101408901528181518084526102008a0191506102008160051b8b0101935060208301925060005b81811015614687576101ff198b860301835283518051604080885281519088018190526060600582901b8901810192602001919089019060005b8181101561465357605f198b8603018352835180516060875261461d606088018261415d565b6020838101516001600160401b0316898201526040938401511515939098019290925250949384019392909201916001016145f7565b505050506020820151915086810360208801526146708183614438565b9650505060209384019392909201916001016145bd565b5050505060209182015180516101608901528083015160ff166101808901526040808201516101a08a015260609182015115156101c08a0152840151151561010089015292909201516101209096019590955294840194939290920191600101614561565b5050506020998a019990945092909201915060010161451e565b6020815260008251805160208401526001600160401b0360208201511660408401526001600160401b0360408201511660608401526060810151608084015250602083015160e060a0840152614760610100840182614321565b90506040840151601f198483030160c085015261477d828261439c565b9150506060840151601f198483030160e08501526126348282614500565b6000806000606084860312156147b057600080fd5b505081359360208301359350604090920135919050565b60006001600160401b038211156147e0576147e0613f26565b5060051b60200190565b80356001600160401b03811681146106b557600080fd5b801515811461152757600080fd5b803563ffffffff811681146106b557600080fd5b803561ffff811681146106b557600080fd5b6000610100828403121561484857600080fd5b614850613f3c565b905081356001600160401b0381111561486857600080fd5b61487484828501613fd9565b82525060208201356001600160401b0381111561489057600080fd5b61489c84828501613fd9565b6020830152506148ae6040830161480f565b604082015260608201356001600160401b038111156148cc57600080fd5b6148d884828501613fd9565b6060830152506148ea608083016147ea565b60808201526148fb60a08301614823565b60a082015261490c60c083016147ea565b60c082015260e08201356001600160401b0381111561492a57600080fd5b61493684828501613fd9565b60e08301525092915050565b60008060006060848603121561495757600080fd5b61496084614048565b925060208401356001600160401b0381111561497b57600080fd5b84016040818703121561498d57600080fd5b614995613f65565b81356001600160401b038111156149ab57600080fd5b8201601f810188136149bc57600080fd5b80356149cf6149ca826147c7565b613fa9565b8082825260208201915060208360051b85010192508a8311156149f157600080fd5b602084015b83811015614a945780356001600160401b03811115614a1457600080fd5b85016060818e03601f19011215614a2a57600080fd5b614a32613f87565b60208201356001600160401b03811115614a4b57600080fd5b614a5a8f602083860101613fd9565b825250614a69604083016147ea565b602082015260608201359150614a7e82614801565b60408101919091528352602092830192016149f6565b50845250505060208201356001600160401b03811115614ab357600080fd5b614abf88828501614835565b60208301525093969395505050506040919091013590565b600060208284031215614ae957600080fd5b81356001600160401b03811115614aff57600080fd5b8201601f81018413614b1057600080fd5b8035614b1e6149ca826147c7565b8082825260208201915060208360051b850101925086831115614b4057600080fd5b602084015b83811015614b815780356001600160401b03811115614b6357600080fd5b614b7289602083890101613fd9565b84525060209283019201614b45565b509695505050505050565b602080825282516040838301528051606084018190526000929190910190829060808501905b80831015614bdc57614bc58285516143ec565b60e082019150602084019350600183019250614bb2565b506020860151604086015280935050505092915050565b60208152600061063a60208301846142c5565b60008060008060008060c08789031215614c1f57600080fd5b8635955060208701359450604087013593506060870135925060808701359150614c4b60a08801614048565b90509295509295509295565b600060208284031215614c6957600080fd5b5035919050565b600060208284031215614c8257600080fd5b61063a8261480f565b60008060408385031215614c9e57600080fd5b82359150614cae6020840161480f565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614cf557614cf5614ccd565b5060010190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b600060208284031215614d3257600080fd5b5051919050565b600181811c90821680614d4d57607f821691505b602082108103614d6d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611c1c57806000526020600020601f840160051c81016020851015614d9a5750805b601f840160051c820191505b81811015613ceb5760008155600101614da6565b81516001600160401b03811115614dd357614dd3613f26565b614de781614de18454614d39565b84614d73565b6020601f821160018114614e1b5760008315614e035750848201515b600019600385901b1c1916600184901b178455613ceb565b600084815260208120601f198516915b82811015614e4b5787850151825560209485019460019092019101614e2b565b5084821015614e695786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b83815282602082015260606040820152600060a0820183516040606085015281815180845260c08601915060c08160051b870101935060208301925060005b81811015614f135760bf198786030183528351805160608752614edd606088018261415d565b6020838101516001600160401b031689820152604093840151151593909801929092525094938401939290920191600101614eb7565b505050506020840151838203605f19016080850152611cb48282614438565b81810381811115610b7f57610b7f614ccd565b63ffffffff818116838216029081169081811461298d5761298d614ccd565b600060208284031215614f7657600080fd5b815161063a81614801565b838152826020820152606060408201526000612634606083018461439c565b634e487b7160e01b600052602160045260246000fd5b60ff8181168382160190811115610b7f57610b7f614ccd565b634e487b7160e01b600052601260045260246000fd5b60208152600061063a6020830184614207565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561502057600080fd5b815160ff8116811461063a57600080fdfea2646970667358221220cd2551b841c7ab2ee101bcd93b958a38c0e1e9919a092d487496632d04dbc0da64736f6c634300081c0033
Deployed Bytecode Sourcemap
57777:22273:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62707:441;;;;;;:::i;:::-;;:::i;:::-;;;2722:14:1;;2715:22;2697:41;;2685:2;2670:18;62707:441:0;;;;;;;;41563:189;;;;;;;;;;-1:-1:-1;41563:189:0;;;;;:::i;:::-;;:::i;32483:396::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38964:146::-;;;;;;;;;;-1:-1:-1;38964:146:0;;;;;:::i;:::-;-1:-1:-1;;;;;39072:15:0;;39048:4;39072:15;;;:9;:15;;;;;;;;:23;;;;;;;;:30;;;;;;;;;;;38964:146;;;;;;78467:1579;;;;;;;;;;-1:-1:-1;78467:1579:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69415:65::-;;;;;;;;;;;;;:::i;:::-;;30336:108;;;;;;;;;;-1:-1:-1;30336:108:0;;;;;:::i;:::-;;:::i;63806:764::-;;;;;;;;;;-1:-1:-1;63806:764:0;;;;;:::i;:::-;;:::i;65328:2484::-;;;;;;:::i;:::-;;:::i;37853:20::-;;;;;;;;;;-1:-1:-1;37853:20:0;;;;-1:-1:-1;;;;;37853:20:0;;;;;;-1:-1:-1;;;;;21326:32:1;;;21308:51;;21296:2;21281:18;37853:20:0;21162:203:1;48034:327:0;;;;;;;;;;-1:-1:-1;48034:327:0;;;;;:::i;:::-;;:::i;27719:86::-;;;;;;;;;;-1:-1:-1;27766:4:0;27790:7;-1:-1:-1;;;27790:7:0;;;;27719:86;;32361:87;;;;;;;;;;-1:-1:-1;32361:87:0;;;;;:::i;:::-;;:::i;3571:103::-;;;;;;;;;;;;;:::i;77572:860::-;;;;;;;;;;-1:-1:-1;77572:860:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69290:61::-;;;;;;;;;;;;;:::i;2896:87::-;;;;;;;;;;-1:-1:-1;2942:7:0;2969:6;-1:-1:-1;;;;;2969:6:0;2896:87;;64981:110;;;:::i;50123:226::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;71907:838::-;;;;;;;;;;-1:-1:-1;71907:838:0;;;;;:::i;:::-;;:::i;41793:99::-;;;;;;;;;;-1:-1:-1;41878:5:0;;-1:-1:-1;;;;;41878:5:0;41793:99;;40078:102;;;;;;;;;;-1:-1:-1;40078:102:0;;;;;:::i;:::-;;:::i;40977:148::-;;;;;;;;;;-1:-1:-1;40977:148:0;;;;;:::i;:::-;;:::i;60853:143::-;;;;;;;;;;;;;:::i;30559:134::-;;;;;;;;;;-1:-1:-1;30559:134:0;;;;;:::i;:::-;;:::i;29855:135::-;;;;;;;;;;-1:-1:-1;29855:135:0;;;;;:::i;:::-;;:::i;39823:131::-;;;;;;;;;;-1:-1:-1;39823:131:0;;;;;:::i;:::-;;:::i;32155:144::-;;;;;;;;;;-1:-1:-1;32155:144:0;;;;;:::i;:::-;;:::i;57971:18::-;;;;;;;;;;-1:-1:-1;57971:18:0;;;;;;;;;;;3829:220;;;;;;;;;;-1:-1:-1;3829:220:0;;;;;:::i;:::-;;:::i;68640:588::-;;;;;;;;;;-1:-1:-1;68640:588:0;;;;;:::i;:::-;;:::i;62707:441::-;62887:5;;62848:4;;62865:28;;62876:9;;-1:-1:-1;;;;;62887:5:0;62865:10;:28::i;:::-;62904:212;62941:11;:9;:11::i;:::-;:18;;;-1:-1:-1;;;;;;;;;;;;;;;;46715:30:0;;;46769:23;;;;;;46756:36;;930:10;63035:9;63059:10;63084:1;63100:5;62904:22;:212::i;:::-;;63136:4;63129:11;;62707:441;;;;;;:::o;41563:189::-;41622:4;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;41647:20:0;::::1;41639:46;;;::::0;-1:-1:-1;;;41639:46:0;;25288:2:1;41639:46:0::1;::::0;::::1;25270:21:1::0;25327:2;25307:18;;;25300:30;-1:-1:-1;;;25346:18:1;;;25339:43;25399:18;;41639:46:0::1;;;;;;;;;-1:-1:-1::0;41696:5:0::1;:26:::0;;-1:-1:-1;;;;;;41696:26:0::1;-1:-1:-1::0;;;;;41696:26:0;::::1;;::::0;;-1:-1:-1;2806:1:0::1;41563:189:::0;;;:::o;32483:396::-;32585:10;;32524:22;;32610:16;;;32559:17;32610:16;32607:35;;32628:14;32483:396;:::o;32607:35::-;32675:11;32663:24;;-1:-1:-1;;;;;32663:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;32663:24:0;;;;;;;;;;;;;;;;32653:34;;32702:7;32698:149;32719:11;32715:15;;:1;:15;;;32698:149;;;32769:8;;;;32752:14;32769:8;;;:5;:8;;;;;;;;;32805:30;;;;;;;-1:-1:-1;;;;;32769:8:0;;;32805:30;;;32819:15;;;:7;:15;;;;;;;;;;32805:30;;;;;;32792:10;;32805:30;;32792:7;;:10;;;;;;:::i;:::-;;;;;;;;;;:43;-1:-1:-1;32732:3:0;;32698:149;;;;32857:14;32483:396;:::o;78467:1579::-;78518:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78518:20:0;78564:11;:9;:11::i;:::-;78551:24;;78602:23;:21;:23::i;:::-;78586:13;;;:39;78651:10;;:17;;;;78679:10;78651:17;78679:10;:::i;:::-;;;;78725:7;-1:-1:-1;;;;;78710:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78710:23:0;;;;;;;;;;;;;;;;-1:-1:-1;78700:7:0;;;:33;78785:7;-1:-1:-1;;;;;78763:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;78763:30:0;;;;;;;;;;;;;;;-1:-1:-1;78744:16:0;;;:49;78820:13;;;;:20;78804:13;78852:1165;78872:7;78868:1;:11;78852:1165;;;78924:16;78938:1;78924:13;:16::i;:::-;78901:4;:7;;;78909:1;78901:10;;;;;;;;:::i;:::-;;;;;;;:20;;:39;;;;78982:15;78995:1;39175:15;39214:22;;;:14;:22;;;;;;-1:-1:-1;;;;;39214:22:0;;39118:126;78982:15;78955:4;:7;;;78963:1;78955:10;;;;;;;;:::i;:::-;;;;;;;:24;;:42;-1:-1:-1;;;;;78955:42:0;;;-1:-1:-1;;;;;78955:42:0;;;;;79012:35;79068:8;-1:-1:-1;;;;;79050:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;79012:65:0;-1:-1:-1;;;;;;79095:18:0;;;79092:914;;79163:1;79134:4;:16;;;79151:1;79134:19;;;;;;;;:::i;:::-;;;;;;;;;;;:30;:26;79183:743;79213:8;79204:6;:17;79183:743;;;79257:13;79273:4;:13;;;79287:6;79273:21;;;;;;;;:::i;:::-;;;;;;;:27;;;79257:43;;79323:14;79489:6;;;;;;;;;;;79486:123;;;79527:27;79539:1;79542:5;79549:4;79527:11;:27::i;:::-;:33;;;:40;;;79523:62;;-1:-1:-1;79581:4:0;79523:62;79656:250;;;;;;;;79695:49;79711:4;79717:5;79724:1;79727:9;79738:5;79695:15;:49::i;:::-;79656:250;;;;79771:27;79783:1;79786:5;79793:4;79771:11;:27::i;:::-;79656:250;;-1:-1:-1;;;;;79826:15:0;;;;;;:9;79656:250;79826:15;;;;;;;:18;;;;;;;;:25;;;;;;;;;;;;79656:250;;;;;;;;;;79631:22;;:14;;79646:6;;79631:22;;;;;;:::i;:::-;;;;;;;;;;:275;-1:-1:-1;;79223:8:0;;79183:743;;;;79976:14;79944:4;:16;;;79961:1;79944:19;;;;;;;;:::i;:::-;;;;;;;:29;;:46;;;;79092:914;-1:-1:-1;78881:3:0;;78852:1165;;;;80027:11;;78467:1579;;;:::o;69415:65::-;2782:13;:11;:13::i;:::-;69462:10:::1;:8;:10::i;:::-;69415:65::o:0;30336:108::-;-1:-1:-1;;;;;30197:16:0;;30393:4;30197:16;;;:8;:16;;;;;;;;30417:19;30410:26;30336:108;-1:-1:-1;;30336:108:0:o;63806:764::-;63946:4;31457:22;930:10;31466:12;-1:-1:-1;;;;;31612:15:0;31579:11;31612:15;;;:7;:15;;;;;;;;;31523:112;31457:22;31449:45;;;;-1:-1:-1;;;31449:45:0;;;;;;;:::i;:::-;63963:11:::1;63977;:9;:11::i;:::-;:18;;;63963:32;;64006;64024:5;64031:6;64006:17;:32::i;:::-;64049:22;64074:27;64087:6;64095:5;64074:12;:27::i;:::-;64120:6:::0;;:11;:17:::1;;::::0;64049:52;;-1:-1:-1;;;;;;64120:31:0::1;64112:57;;;::::0;-1:-1:-1;;;64112:57:0;;25288:2:1;64112:57:0::1;::::0;::::1;25270:21:1::0;25327:2;25307:18;;;25300:30;-1:-1:-1;;;25346:18:1;;;25339:43;25399:18;;64112:57:0::1;25086:337:1::0;64112:57:0::1;64195:6:::0;;:11;:17:::1;;::::0;64224:5:::1;::::0;64188:42:::1;::::0;-1:-1:-1;;;64188:42:0;;-1:-1:-1;;;;;64224:5:0;;::::1;64188:42;::::0;::::1;21308:51:1::0;64234:10:0;;64188:35;;;::::1;::::0;::::1;::::0;21281:18:1;;64188:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;64180:90;;;::::0;-1:-1:-1;;;64180:90:0;;26562:2:1;64180:90:0::1;::::0;::::1;26544:21:1::0;26601:2;26581:18;;;26574:30;-1:-1:-1;;;26620:18:1;;;26613:51;26681:18;;64180:90:0::1;26360:345:1::0;64180:90:0::1;64289:5;::::0;-1:-1:-1;;;;;64289:5:0::1;:13;:28:::0;-1:-1:-1;64289:28:0::1;64281:66;;;::::0;-1:-1:-1;;;64281:66:0;;26912:2:1;64281:66:0::1;::::0;::::1;26894:21:1::0;26951:2;26931:18;;;26924:30;26990:27;26970:18;;;26963:55;27035:18;;64281:66:0::1;26710:349:1::0;64281:66:0::1;64358:6:::0;;:11;:22:::1;;:35:::0;;;64404:6;;:11;:23:::1;::::0;;::::1;:37:::0;;;64452:6;;:11;-1:-1:-1;;;;;42034:15:0;64452:32:::1;:23;::::0;;::::1;:32:::0;64508:8;::::1;::::0;64526:6;;:11;64495:43:::1;::::0;64508:8;64518:6;;64495:12:::1;:43::i;:::-;-1:-1:-1::0;64558:4:0::1;::::0;63806:764;-1:-1:-1;;;;;63806:764:0:o;65328:2484::-;65509:4;31457:22;930:10;31466:12;850:98;31457:22;31449:45;;;;-1:-1:-1;;;31449:45:0;;;;;;;:::i;:::-;27324:19:::1;:17;:19::i;:::-;65533:11:::2;65547;:9;:11::i;:::-;:18;;;65533:32;;65576:28;65587:9;65598:5;65576:10;:28::i;:::-;-1:-1:-1::0;;;;;65623:18:0;::::2;65615:43;;;::::0;-1:-1:-1;;;65615:43:0;;27266:2:1;65615:43:0::2;::::0;::::2;27248:21:1::0;27305:2;27285:18;;;27278:30;-1:-1:-1;;;27324:18:1;;;27317:42;27376:18;;65615:43:0::2;27064:336:1::0;65615:43:0::2;65670:32;65688:5;65695:6;65670:17;:32::i;:::-;65713:22;65738:27;65751:6;65759:5;65738:12;:27::i;:::-;65713:52;;65776:17;65796:32;65808:6;65816:5;65823:4;65796:11;:32::i;:::-;65776:52;;65843:39;65862:6;65870:5;65877:4;65843:18;:39::i;:::-;65839:210;;65899:48;65924:3;:8;;;65934:6;65942:4;65899:24;:48::i;:::-;65991:6:::0;;:11;:26:::2;;:31:::0;;66021:1:::2;65991:31;::::0;;65839:210:::2;66096:3;66067:2;:8;;;:25;;;:32;;;;66059:67;;;::::0;-1:-1:-1;;;66059:67:0;;27607:2:1;66059:67:0::2;::::0;::::2;27589:21:1::0;27646:2;27626:18;;;27619:30;-1:-1:-1;;;27665:18:1;;;27658:52;27727:18;;66059:67:0::2;27405:346:1::0;66059:67:0::2;66168:8;::::0;;::::2;::::0;;:25;::::2;:30:::0;;66197:1:::2;66168:30;;;::::0;;66240:16;;::::2;::::0;:22:::2;;::::0;66213:6;;:11;:23:::2;;:49:::0;;::::2;::::0;;::::2;::::0;;::::2;-1:-1:-1::0;;;;;66213:49:0::2;::::0;;66319:8;66285:43:::2;::::0;66297:6;;66306:5;;66313:4;;66285:11:::2;:43::i;:::-;66339:10;66352:16:::0;;;:8:::2;:16;::::0;;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66352:29:0;::::2;::::0;;;;;;;;;:48;;66411::::2;::::0;::::2;::::0;;;;;;66536:16;;::::2;::::0;:19;66470:29;;;;66536:19;;66352:48;;66470;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:57;;:86;;;;;;:::i;:::-;-1:-1:-1::0;66637:16:0::2;::::0;;::::2;::::0;:23;::::2;::::0;66567:16:::2;::::0;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66567:29:0;::::2;::::0;;;;;;;;;:48;;66609:5;;66567:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:61;;:94;;;;;;:::i;:::-;-1:-1:-1::0;66747:16:0::2;::::0;;::::2;::::0;:28:::2;;::::0;66672:16:::2;::::0;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66672:29:0;::::2;::::0;;;;;;;;;:48;;66714:5;;66672:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:66;;:104;;;;;;:::i;:::-;-1:-1:-1::0;66856:16:0::2;::::0;;::::2;::::0;:22:::2;;::::0;66787:16:::2;::::0;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66787:29:0;::::2;::::0;;;;;;;;;:48;;66829:5;;66787:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:60;;:92;;;;;;:::i;:::-;-1:-1:-1::0;66953:16:0::2;::::0;;::::2;::::0;:22:::2;::::0;;::::2;::::0;66890:16:::2;::::0;;;:8:::2;:16:::0;;;;;:23;;;;;;;;-1:-1:-1;;;;;66890:29:0;::::2;::::0;;;;;;;:48;;66932:5;;66890:48;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;:60:::0;;:85;;-1:-1:-1;;66890:85:0::2;;::::0;;;::::2;::::0;;;::::2;::::0;;;67055:16;;::::2;::::0;:28:::2;;::::0;66986:16;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66986:29:0;::::2;::::0;;;;;;;;:48;;67028:5;;66986:48;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;:66:::0;;:97;;-1:-1:-1;;66986:97:0::2;-1:-1:-1::0;;;;;66986:97:0;;;::::2;::::0;;;::::2;::::0;;;67162:16;;::::2;::::0;:27:::2;;::::0;67094:16;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;67094:29:0;::::2;::::0;;;;;;;;:48;;67136:5;;67094:48;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:65;:48:::2;::::0;;::::2;;:65:::0;;;;:95;;::::2;::::0;;;::::2;-1:-1:-1::0;;;67094:95:0::2;-1:-1:-1::0;;67094:95:0;;::::2;::::0;;;::::2;::::0;;;67267:16;;::::2;::::0;:26:::2;;::::0;67200:16;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;67200:29:0;::::2;::::0;;;;;;;;:48;;67242:5;;67200:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:64;;;:93;;;;;-1:-1:-1::0;;;;;67200:93:0::2;;;;;-1:-1:-1::0;;;;;67200:93:0::2;;;;;;67310:6;67306:358;67326:18:::0;;:25;67322:29;::::2;67306:358;;;67372:25;67400:10;:18;;;67419:1;67400:21;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;67437:16:::2;::::0;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;67437:29:0;::::2;::::0;;;;;;;;;:48;;67400:21;;-1:-1:-1;67437:29:0;67479:5;;67437:48;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;::::0;;::::2;:63:::0;;::::2;;::::0;;;;67577:74:::2;::::0;;::::2;::::0;::::2;::::0;;67590:19;;67577:74;;67612:15;;::::2;::::0;-1:-1:-1;;;;;67577:74:0::2;::::0;;::::2;::::0;67629:21;;::::2;::::0;67577:74:::2;;::::0;;;;67515:16;;;:8:::2;:16:::0;;;;;:23;;;;;;;;-1:-1:-1;;;;;67515:29:0;::::2;::::0;;;;;;;;:48;;67557:5;;67515:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:56;;67572:1;67515:59;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:136;;:59:::2;::::0;;::::2;;::::0;;;:136:::2;::::0;:59;:136:::2;:::i;:::-;-1:-1:-1::0;67515:136:0::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;;-1:-1:-1::0;;;67515:136:0::2;-1:-1:-1::0;;67515:136:0;;;-1:-1:-1;;;;;67515:136:0;;::::2;::::0;;;;;;;::::2;::::0;;;67353:3;;;::::2;::::0;-1:-1:-1;67306:358:0::2;;;-1:-1:-1::0;67687:8:0::2;::::0;::::2;::::0;67705:6;;:11;67674:43:::2;::::0;67687:8;67697:6;;67674:12:::2;:43::i;:::-;67750:4;-1:-1:-1::0;;;;;67736:46:0::2;;67756:6;67764:5;67771:10;67736:46;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;67800:4:0::2;::::0;65328:2484;-1:-1:-1;;;;;;;65328:2484:0:o;48034:327::-;48107:4;;48124:208;48144:10;:17;48140:1;:21;48124:208;;;48183:13;48199:23;48208:10;48219:1;48208:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;46715:30:0;;;46769:23;;;;;;;;46756:36;;-1:-1:-1;46614:186:0;48199:23;:29;;48257:19;;;:12;:19;;;;;;;-1:-1:-1;;48291:29:0;;48257:19;;;;48313:7;48291:29;;;-1:-1:-1;48257:19:0;48163:3;48124:208;;;-1:-1:-1;48349:4:0;;48034:327;-1:-1:-1;;48034:327:0:o;32361:87::-;2782:13;:11;:13::i;:::-;32423:17:::1;32433:6;32423:9;:17::i;:::-;32361:87:::0;:::o;3571:103::-;2782:13;:11;:13::i;:::-;3636:30:::1;3663:1;3636:18;:30::i;77572:860::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;77709:11:0;77723;:9;:11::i;:::-;:18;;;;-1:-1:-1;77755:10:0;;77752:26;;77767:11;77777:1;77767:11;;:::i;:::-;;;77752:26;77789:21;77813;77827:6;77813:13;:21::i;:::-;77858:10;;77789:45;;-1:-1:-1;77858:10:0;-1:-1:-1;;;;;77893:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;77879:38:0;;77928:13;;;:22;;;77879:11;77961:438;77981:5;77977:1;:9;77961:438;;;78159:6;;78007:14;;78159:6;;;;;78156:129;;;78189:49;78201:6;78209:3;78213:1;78209:6;;;;;;;;:::i;:::-;;;;;;;:11;;;:16;;;:22;;;78233:4;78189:11;:49::i;:::-;:55;;;:62;;;78185:84;;-1:-1:-1;78265:4:0;78185:84;78316:71;78332:4;78338:3;78342:1;78338:6;;;;;;;;:::i;:::-;;;;;;;:11;;;:16;;;:22;;;78362:6;78370:9;78381:5;78316:15;:71::i;:::-;78299:11;;:14;;78311:1;;78299:14;;;;;;:::i;:::-;;;;;;;;;;:88;-1:-1:-1;77988:3:0;;77961:438;;;;78411:13;;;77572:860;;;:::o;69290:61::-;2782:13;:11;:13::i;:::-;69335:8:::1;:6;:8::i;64981:110::-:0;65037:4;65060:23;65073:9;65060:12;:23::i;:::-;65053:30;;64981:110;:::o;50123:226::-;50183:24;50220:13;50236:11;:9;:11::i;:::-;:18;;;50220:34;;50268:8;50280:1;50268:13;50265:31;;50283:13;50123:226;:::o;50265:31::-;50314:27;50328:12;50339:1;50328:8;:12;:::i;:::-;50314:13;:27::i;:::-;50307:34;;;50123:226;:::o;71907:838::-;930:10;30164:11;30197:16;;;:8;:16;;;;;;;;29193:58;;;;-1:-1:-1;;;29193:58:0;;32100:2:1;29193:58:0;;;32082:21:1;32139:2;32119:18;;;32112:30;-1:-1:-1;;;32158:18:1;;;32151:50;32218:18;;29193:58:0;31898:344:1;29193:58:0;72188:34:::1;72202:4;72208:6;72216:5;72188:13;:34::i;:::-;72233:22;72258:27;72271:6;72279:5;72258:12;:27::i;:::-;72299:6:::0;;:11;:22:::1;;::::0;72233:52;;-1:-1:-1;72299:36:0;-1:-1:-1;72296:103:0::1;;72351:6:::0;;:11;:22:::1;;:36:::0;;72377:10;;72351:22;:36:::1;::::0;72377:10;;72351:36:::1;:::i;:::-;::::0;;-1:-1:-1;72296:103:0::1;72412:6:::0;;:11;:23:::1;;::::0;:38;-1:-1:-1;72409:107:0::1;;72466:6:::0;;:11;:23:::1;;:38:::0;;72493:11;;72466:23;:38:::1;::::0;72493:11;;72466:38:::1;:::i;:::-;::::0;;-1:-1:-1;72409:107:0::1;72529:6:::0;;:11;:25;:42;-1:-1:-1;72526:115:0::1;;72587:6:::0;;:11;:42;;72616:13;;72587:11;:42:::1;::::0;72616:13;;72587:42:::1;:::i;:::-;::::0;;-1:-1:-1;72526:115:0::1;72651:6:::0;;:11;-1:-1:-1;;;;;42034:15:0;72651:32:::1;:23;::::0;;::::1;:32:::0;72707:8:::1;::::0;::::1;::::0;72725:6;;:11;72694:43:::1;::::0;72707:8;72717:6;;72694:12:::1;:43::i;:::-;72131:614;71907:838:::0;;;;;;:::o;40078:102::-;2782:13;:11;:13::i;:::-;40146:26:::1;40163:8;39669:5:::0;:29;39608:98;40977:148;2782:13;:11;:13::i;:::-;41056:12:::1;::::0;::::1;::::0;41053:64:::1;;41097:20;:8:::0;41108:9:::1;41097:20;:::i;:::-;41070:24:::0;:47;;-1:-1:-1;;41070:47:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;40977:148;:::o;60853:143::-;60902:4;2782:13;:11;:13::i;:::-;-1:-1:-1;60933:6:0::1;::::0;;-1:-1:-1;;60950:16:0;::::1;60933:6;::::0;;;::::1;;;60959:7;60950:16:::0;;::::1;;::::0;;-1:-1:-1;;60853:143:0:o;30559:134::-;2782:13;:11;:13::i;:::-;30622:29:::1;30637:6;30645:5;30622:14;:29::i;:::-;30667:18;::::0;-1:-1:-1;;;;;30667:18:0;::::1;::::0;::::1;::::0;;;::::1;30559:134:::0;:::o;29855:135::-;2782:13;:11;:13::i;:::-;29922:28:::1;29937:6;29945:4;29922:14;:28::i;:::-;29966:16;::::0;-1:-1:-1;;;;;29966:16:0;::::1;::::0;::::1;::::0;;;::::1;29855:135:::0;:::o;39823:131::-;39891:4;2782:13;:11;:13::i;:::-;-1:-1:-1;39908:5:0::1;:16:::0;;-1:-1:-1;;;;;39908:16:0;::::1;-1:-1:-1::0;;;;;;39908:16:0;;::::1;;::::0;;;39823:131;;;:::o;32155:144::-;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;32240:15:0::1;32226:11;32240:15:::0;;;:7:::1;:15;::::0;;;;;;-1:-1:-1;;32266:25:0;::::1;32240:15;::::0;;::::1;32284:7;32266:25;::::0;;32155:144::o;3829:220::-;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;3914:22:0;::::1;3910:93;;3960:31;::::0;-1:-1:-1;;;3960:31:0;;3988:1:::1;3960:31;::::0;::::1;21308:51:1::0;21281:18;;3960:31:0::1;21162:203:1::0;3910:93:0::1;4013:28;4032:8;4013:18;:28::i;68640:588::-:0;68793:4;27324:19;:17;:19::i;:::-;31457:22:::1;930:10:::0;31466:12:::1;850:98:::0;31457:22:::1;31449:45;;;;-1:-1:-1::0;;;31449:45:0::1;;;;;;;:::i;:::-;68817:14:::2;68833:10:::0;68845:27:::2;68876:71;68900:16;68918:17;68937:9;68876:23;:71::i;:::-;68816:131:::0;;-1:-1:-1;68816:131:0;-1:-1:-1;68816:131:0;-1:-1:-1;68961:21:0;;68958:187:::2;;69015:5;::::0;-1:-1:-1;;;;;69015:5:0::2;68999:49;;;::::0;-1:-1:-1;;;68999:49:0;;32698:2:1;68999:49:0::2;::::0;::::2;32680:21:1::0;32737:1;32717:18;;;32710:29;-1:-1:-1;;;32755:18:1;;;32748:38;32803:18;;68999:49:0::2;32496:331:1::0;68999:49:0::2;69071:5;::::0;69105::::2;::::0;69071:40:::2;::::0;-1:-1:-1;;;69071:40:0;;::::2;::::0;::::2;33006:25:1::0;;;-1:-1:-1;;;;;69105:5:0;;::::2;33047:18:1::0;;;33040:60;69071:5:0;::::2;::::0;:14:::2;::::0;32979:18:1;;69071:40:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69063:70;;;::::0;-1:-1:-1;;;69063:70:0;;33563:2:1;69063:70:0::2;::::0;::::2;33545:21:1::0;33602:2;33582:18;;;33575:30;-1:-1:-1;;;33621:18:1;;;33614:47;33678:18;;69063:70:0::2;33361:341:1::0;69063:70:0::2;69162:31;69169:9;69180:5;69187;69162:31;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;69216:4:0::2;::::0;68640:588;-1:-1:-1;;;;;68640:588:0:o;61512:262::-;61580:10;;61577:190;;61623:4;61615:21;:31;-1:-1:-1;61615:31:0;61607:60;;;;-1:-1:-1;;;61607:60:0;;34389:2:1;61607:60:0;;;34371:21:1;34428:2;34408:18;;;34401:30;-1:-1:-1;;;34447:18:1;;;34440:46;34503:18;;61607:60:0;34187:340:1;61607:60:0;61683:6;61694:2;-1:-1:-1;;;;;61694:7:0;61709:6;61694:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61682:38;;;61743:1;61735:20;;;;-1:-1:-1;;;61735:20:0;;34944:2:1;61735:20:0;;;34926:21:1;34983:1;34963:18;;;34956:29;-1:-1:-1;;;35001:18:1;;;34994:36;35047:18;;61735:20:0;34742:329:1;61735:20:0;61592:175;61577:190;61512:262;;:::o;41405:89::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41476:10:0;;;;;;;;41481:5;41476:10;;;;;-1:-1:-1;;;;;41476:10:0;;;;;;;-1:-1:-1;;;41476:10:0;;;;;;;;;;;;;;;;;;41405:89::o;47386:592::-;47641:19;;:::i;:::-;47673:33;47701:4;47673:27;:33::i;:::-;47723:199;47759:4;47779:6;47801:8;47825:11;47852:10;47878:13;47906:5;47723:21;:199::i;:::-;47717:205;;47933:37;47951:4;:10;;;47963:6;47933:17;:37::i;:::-;47386:592;;;;;;;;;:::o;3061:166::-;2942:7;2969:6;-1:-1:-1;;;;;2969:6:0;930:10;3121:23;3117:103;;3168:40;;-1:-1:-1;;;3168:40:0;;930:10;3168:40;;;21308:51:1;21281:18;;3168:40:0;21162:203:1;49872:125:0;49927:28;49977:12;49968:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49872:125;:::o;48505:::-;48563:22;48605:9;:17;48615:6;48605:17;;;;;;;;;;;48598:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48598:24:0;;;;;;-1:-1:-1;;;48598:24:0;;-1:-1:-1;;;;;48598:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48598:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48598:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48505:125;;;:::o;60506:167::-;60591:22;;:::i;:::-;60636:16;;;;:8;:16;;;;;;;;:23;;;;;;;;-1:-1:-1;;;;;60636:29:0;;;;;;;;;60626:39;;;;;;;;;;;;;;;;;;;;;;60636:29;;60626:39;;;;60636:29;;60626:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;-1:-1:-1;;60626:39:0;;;;;-1:-1:-1;;;;;60626:39:0;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;-1:-1:-1;;60626:39:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;-1:-1:-1;;60626:39:0;;;;-1:-1:-1;;;;;60626:39:0;;;;;;;;-1:-1:-1;;;60626:39:0;;;;;;;-1:-1:-1;;;60626:39:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;-1:-1:-1;60626:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60506:167;-1:-1:-1;;;;60506:167:0:o;74454:1232::-;74604:22;;:::i;:::-;74648:8;74645:45;;;74658:32;74676:5;74683:6;74658:17;:32::i;:::-;-1:-1:-1;;;;;74705:15:0;;;;;;:9;:15;;;;;;;;:23;;;;;;;;:30;;;;;;;;;;;74701:978;;74752:15;74770:27;74783:6;74791:5;74770:12;:27::i;:::-;:30;:35;;-1:-1:-1;74770:30:0;74840:32;74852:6;74860:5;74867:4;74840:11;:32::i;:::-;74820:52;-1:-1:-1;74887:17:0;;74919:179;74939:14;;:21;74935:25;;74919:179;;;75034:14;;:17;;75049:1;;75034:17;;;;;;:::i;:::-;;;;;;;:23;;;:29;;;75020:43;;;;;;74962:3;;;;;;;74919:179;;;;75113:10;75125:11;75138:13;75155:46;75171:9;:25;;75186:10;75171:25;;;75182:1;75171:25;75198:2;75155:15;:46::i;:::-;75112:89;;-1:-1:-1;75112:89:0;-1:-1:-1;75112:89:0;-1:-1:-1;75216:21:0;75248:9;75240:4;;;;;:17;;;;;;;:::i;:::-;;:101;;75337:4;75240:101;;;39175:15;39214:22;;;:14;:22;;;;;;-1:-1:-1;;;;;39214:22:0;-1:-1:-1;;;;;42034:15:0;75259:30;;;;;:75;;;75311:1;75294:2;:14;;;:18;:39;;;;75332:1;75316:2;:13;;;:17;75294:39;75216:125;;75356:15;75374:16;:61;;;;;75404:1;75395:6;:10;:23;;;;75417:1;75409:5;:9;75395:23;:39;;;;75433:1;75422:8;:12;75395:39;75456:211;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75456:211:0;;;;75594:8;;;;;-1:-1:-1;;;;;75456:211:0;;;;;-1:-1:-1;;75456:211:0;;;;;;;;;;;;;-1:-1:-1;74701:978:0;74454:1232;;;;;;;:::o;28620:120::-;27583:16;:14;:16::i;:::-;28689:5:::1;28679:15:::0;;-1:-1:-1;;;;28679:15:0::1;::::0;;28710:22:::1;930:10:::0;28719:12:::1;28710:22;::::0;-1:-1:-1;;;;;21326:32:1;;;21308:51;;21296:2;21281:18;28710:22:0::1;;;;;;;28620:120::o:0;46264:223::-;46352:19;;;;:12;:19;;;;;;;;46344:55;;;;-1:-1:-1;;;46344:55:0;;35410:2:1;46344:55:0;;;35392:21:1;35449:2;35429:18;;;35422:30;35488:25;35468:18;;;35461:53;35531:18;;46344:55:0;35208:347:1;46344:55:0;46418:13;;;;:5;:13;;;;;;;;:20;;;;;;;;:28;;;46410:69;;;;-1:-1:-1;;;46410:69:0;;35762:2:1;46410:69:0;;;35744:21:1;35801:2;35781:18;;;35774:30;35840;35820:18;;;35813:58;35888:18;;46410:69:0;35560:352:1;49546:279:0;49618:22;;:::i;:::-;49653:25;49681:13;;;:5;:13;;;;;;;;:20;;;;;;;;;49653:48;;;;;;;;;;;;;;;;;;;;;;;;;;;49712:8;;;:18;49744:10;;49741:77;;;49780:9;:17;49790:6;49780:17;;;;;;;;;;;49798:2;:7;;;49780:26;;;;;;;;;;:::i;:::-;;;;;;;;;;49771:35;;;;;;;;49780:26;;;;;;;49771:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49771:35:0;;;;;;-1:-1:-1;;;;;;;;49771:35:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49771:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49780:26;;49771:35;;;;49780:26;;49771:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49771:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;;49771:35:0;;;;-1:-1:-1;;;49771:35:0;;49741:77;49642:183;49546:279;;;;:::o;48800:176::-;48928:17;;;;:9;:17;;;;;:23;;48959:9;;48928:17;:23;;;;;;;;;;:::i;:::-;;;;;;;;;;:40;;:23;;;;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48928:40:0;;;-1:-1:-1;;;;;;48928:40:0;;;;-1:-1:-1;;;;;;;;48928:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48928:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:40;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;48800:176:0:o;27878:132::-;27766:4;27790:7;-1:-1:-1;;;27790:7:0;;;;27940:63;;;27976:15;;-1:-1:-1;;;27976:15:0;;;;;;;;;;;71232:317;-1:-1:-1;;;;;71346:16:0;;71319:10;71346:16;;;:10;:16;;;;;;;;:23;;;;;;;;:31;;;;;;;;;;;71342:200;;-1:-1:-1;;;;;71393:16:0;;;;;;:10;:16;;;;;;;;:23;;;;;;;;:31;;;;;;;;:38;;-1:-1:-1;;71393:38:0;71427:4;71393:38;;;;;;71446:13;:21;;;;;:27;;;;;;;;:39;;;;;;;;;;;;;;;71342:200;;;-1:-1:-1;71526:4:0;71232:317;;;;;:::o;49142:178::-;49272:17;;;;:9;:17;;;;;:23;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:29;;:40;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49272:40:0;-1:-1:-1;;;;;49272:40:0;;;;;;;;;;-1:-1:-1;;49142:178:0:o;61185:165::-;61297:16;;;;:8;:16;;;;;;;;:23;;;;;;;;;-1:-1:-1;;;;;61297:29:0;;;;;;;;;;;;:45;;:35;;;:45;;;;;;;;;;;;;;-1:-1:-1;;61297:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61185:165::o;31745:248::-;-1:-1:-1;;;;;31809:15:0;;;;;;:7;:15;;;;;;;;31808:16;31800:48;;;;-1:-1:-1;;;31800:48:0;;36119:2:1;31800:48:0;;;36101:21:1;36158:2;36138:18;;;36131:30;-1:-1:-1;;;36177:18:1;;;36170:49;36236:18;;31800:48:0;35917:343:1;31800:48:0;-1:-1:-1;;;;;31859:15:0;;;;;;:7;:15;;;;;:22;;-1:-1:-1;;31859:22:0;31877:4;31859:22;;;;;;31911:10;;;31946:8;;31911:10;;31946:8;:::i;:::-;31933:21;;;;:10;:21;31965:11;;;;;:5;:11;;;;;:20;;-1:-1:-1;;;;;;31965:20:0;-1:-1:-1;;;;;31965:20:0;;;;;;;;;;31745:248::o;4209:191::-;4283:16;4302:6;;-1:-1:-1;;;;;4319:17:0;;;-1:-1:-1;;;;;;4319:17:0;;;;;;4352:40;;4302:6;;;;;;;4352:40;;4283:16;4352:40;4272:128;4209:191;:::o;28361:118::-;27324:19;:17;:19::i;:::-;28421:7:::1;:14:::0;;-1:-1:-1;;;;28421:14:0::1;-1:-1:-1::0;;;28421:14:0::1;::::0;;28451:20:::1;28458:12;930:10:::0;;850:98;70356:868;70410:4;70427:11;70441;:9;:11::i;:::-;:18;;;70427:32;;70470:17;70490:11;:9;:11::i;:::-;:24;;-1:-1:-1;70490:24:0;70549:21;70563:6;70549:13;:21::i;:::-;70525:45;-1:-1:-1;70584:16:0;;70581:100;;70634:12;70625:5;:21;;70617:52;;;;-1:-1:-1;;;70617:52:0;;36620:2:1;70617:52:0;;;36602:21:1;36659:2;36639:18;;;36632:30;-1:-1:-1;;;36678:18:1;;;36671:48;36736:18;;70617:52:0;36418:342:1;70617:52:0;70691:24;70702:5;70709;70691:10;:24::i;:::-;70726:21;70769:1;70761:5;:9;:32;;;;;70783:3;:10;70774:5;:19;;70761:32;70758:145;;;70866:3;:10;70858:5;:18;;;;;:::i;:::-;;70839:37;;70758:145;930:10;70913:12;70951:244;70971:3;:10;70967:1;:14;70951:244;;;71003:13;71019:3;71023:1;71019:6;;;;;;;;:::i;:::-;;;;;;;:11;;;:16;;;:22;;;71003:38;;71056:17;71076:49;71087:4;71093:16;71111:6;71119:5;71076:10;:49::i;:::-;71056:69;;71140:43;71152:6;71161:5;71168:4;71174:2;:8;;;71140:11;:43::i;:::-;-1:-1:-1;;70983:3:0;;70951:244;;;-1:-1:-1;71212:4:0;;70356:868;-1:-1:-1;;;;;;;70356:868:0:o;38430:166::-;-1:-1:-1;;;;;38519:15:0;;;;;;:9;:15;;;;;;;;:23;;;;;;;;:30;;;;;;;;;;;38515:73;;-1:-1:-1;;;;;38551:15:0;;;;;;:9;:15;;;;;;;;:23;;;;;;;;:30;;;;;;;;:37;;-1:-1:-1;;38551:37:0;38584:4;38551:37;;;38430:166;;;:::o;29578:162::-;-1:-1:-1;;;;;29653:20:0;;29650:47;;29682:15;;-1:-1:-1;;;29682:15:0;;;;;;;;;;;29650:47;-1:-1:-1;;;;;29708:16:0;;;;;;;;:8;:16;;;;;:24;;-1:-1:-1;;29708:24:0;;;;;;;;;;29578:162::o;72753:391::-;72827:15;;:::i;:::-;72860:3;72855:8;;72875:11;72888:13;72905:51;72916:2;:8;;;72926:2;:14;;;72942:2;:13;;;72905:10;:51::i;:::-;72967:14;;;:23;;;;73001:13;;;:21;-1:-1:-1;;73058:33:0;;;;;;;;-1:-1:-1;;;;;42034:15:0;73113:23;:14;;;:23;72967:14;73113:2;-1:-1:-1;72753:391:0:o;50666:838::-;50832:13;50847:12;50861:27;50901:15;50919:11;:9;:11::i;:::-;50901:29;-1:-1:-1;42034:15:0;-1:-1:-1;;;;;50949:26:0;:2;:17;;;-1:-1:-1;;;;;50949:26:0;;50941:62;;;;-1:-1:-1;;;50941:62:0;;37099:2:1;50941:62:0;;;37081:21:1;37138:2;37118:18;;;37111:30;37177:25;37157:18;;;37150:53;37220:18;;50941:62:0;36897:347:1;50941:62:0;51025:2;:9;;;51014:20;;51053:23;:21;:23::i;:::-;51045:31;;51097:22;:20;:22::i;:::-;51087:32;;51130:50;51153:16;51171:8;51130:22;:50::i;:::-;51195:6;51191:306;51211:5;:12;51207:1;:16;51191:306;;;51245:13;51261:5;51267:1;51261:8;;;;;;;;:::i;:::-;;;;;;;:14;;;51245:30;;51290:22;51315:29;51328:8;51338:5;51315:12;:29::i;:::-;51290:54;;51359:39;51373:8;51383:7;51392:5;51359:13;:39::i;:::-;51413:71;51426:3;:8;;;51436;51446:37;51455:3;:6;;;:11;;;51468:14;51446:8;:37;;:::i;:::-;51413:12;:71::i;:::-;-1:-1:-1;;51225:3:0;;51191:306;;;;50890:614;50666:838;;;;;;;:::o;43067:215::-;43167:10;;43154:24;;;;:12;:24;;;;;;;;43150:125;;43207:10;;43194:24;;;;:12;:24;;;;;;;:31;;-1:-1:-1;;43194:31:0;43221:4;43194:31;;;;;;43240:12;:23;;;;;;;;;;;;;;;;;;;;;;;;;;43207:4;;43240:23;;;;;;;;:::i;:::-;;;;43067:215;:::o;43703:2365::-;43957:19;;:::i;:::-;43989:25;44017:13;;;:5;:13;;;;;;;;44031:10;;44017:25;;;;;;;;43989:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44053:2008;;44096:4;44083:17;;;:10;44132:17;;;:9;:17;;;;;;;;:24;;44115:42;;;:7;;;:42;44172:17;;;:24;;;;;;;;;44245:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42034:15;-1:-1:-1;;;;;44245:82:0;;;;;44302:1;44245:82;;;;44305:8;-1:-1:-1;;;;;44245:82:0;;;;;44315:5;-1:-1:-1;;;;;44245:82:0;;;;;44322:4;44245:82;;;44211:9;:17;44221:6;44211:17;;;;;;;;;;;44229:2;:7;;;44211:26;;;;;;;;;;:::i;:::-;;;;;;;;;;:116;;:26;;;;;;:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44211:116:0;;;-1:-1:-1;;;;;;44211:116:0;;;;-1:-1:-1;;;;;;;;44211:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44211:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;:116;;;;;;;;;;:::i;:::-;-1:-1:-1;;;44342:13:0;;;;:5;:13;;;;;;;;44356:10;;44342:25;;;;;;;:30;;;;;;;;-1:-1:-1;;44342:30:0;;;;;;-1:-1:-1;;44342:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;44414:10:0;;44393:32;;44342:13;;44393:12;:32::i;:::-;:35;;;44387:41;;44448:16;44460:3;44448:16;;;;;;:::i;:::-;;;;;;;;44053:2008;;;44503:32;44516:6;44524:4;:10;;;44503:12;:32::i;:::-;:35;44582:8;;:20;;:35;;;;;;44636:8;;:39;;;;;;44720:8;;:17;;;44503:35;;-1:-1:-1;;;;;;44708:29:0;;;;;;44705:62;;44739:8;;-1:-1:-1;;;;;44739:28:0;;:17;;;;:28;44705:62;45114:1;45101:10;:14;:37;;;;-1:-1:-1;;;;;;45119:19:0;;;;45101:37;45098:814;;;45159:12;45210:3;:8;;;:14;;;-1:-1:-1;;;;;45201:23:0;:5;-1:-1:-1;;;;;45201:23:0;;45198:275;;-1:-1:-1;45258:4:0;45198:275;;;45314:8;;:19;;;:8;:24;45311:143;;-1:-1:-1;45367:8:0;;-1:-1:-1;;;;;45367:22:0;;:14;;;;:22;45426:4;45311:143;45494:7;45491:406;;;45585:10;-1:-1:-1;;;;;45529:23:0;;;930:10;45529:52;;-1:-1:-1;;;;;;45529:52:0;;;;;;;-1:-1:-1;;;;;37707:32:1;;;45529:52:0;;;37689:51:1;45575:4:0;37756:18:1;;;37749:60;37662:18;;45529:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;45526:352;;-1:-1:-1;;;;;45627:26:0;;;930:10;45668:5;;45627:59;;;;;;-1:-1:-1;;;;;;45627:59:0;;;-1:-1:-1;;;;;38040:32:1;;;45627:59:0;;;38022:51:1;45668:5:0;;38089:18:1;;;38082:60;38158:18;;;38151:34;;;37995:18;;45627:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45624:231;;;45763:8;;:19;;:33;;;;;;45624:231;45140:772;45098:814;45926:8;;-1:-1:-1;;;;;42034:15:0;45926:29;:20;;;;:29;45983:7;;;;46000:8;;45970:39;;45983:7;45992:6;;45970:12;:39::i;:::-;46029:20;46045:3;46029:20;;;;;;:::i;:::-;;;;;;;;44053:2008;43978:2090;43703:2365;;;;;;;;;:::o;73327:920::-;73437:16;73455;73473:13;73499:19;73554:10;-1:-1:-1;;;;;73536:28:0;:2;:14;;;-1:-1:-1;;;;;73536:28:0;;;73529:36;;;;:::i;:::-;73596:1;73579:2;:14;;;-1:-1:-1;;;;;73579:18:0;;:44;;;;-1:-1:-1;73601:8:0;;;;-1:-1:-1;;;;;73601:22:0;;;73579:44;73576:664;;;73672:2;:8;;;-1:-1:-1;;;;;73657:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73740:13;;;;73641:51;;-1:-1:-1;73740:17:0;73737:107;;73773:71;73803:10;73815:2;:13;;;73830;73773:2;:14;;;-1:-1:-1;;;;;73773:29:0;;;:71;;;;;;:::i;:::-;73759:85;;73737:107;73866:14;;;;:18;73863:98;;73900:61;73930:10;73942:2;:14;;;73958:2;73900;:14;;;-1:-1:-1;;;;;73900:29:0;;;:61;;;;;;:::i;:::-;73886:75;;73863:98;73983:16;;:20;73980:234;;74067:5;;;;;;;;;-1:-1:-1;;;;;74067:5:0;-1:-1:-1;;;;;74044:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74162:16;;74120:14;;;;74028:57;;-1:-1:-1;74120:74:0;;-1:-1:-1;;;;;74120:29:0;;74150:10;;74028:57;74120:29;:74::i;:::-;74108:86;;73980:234;73488:759;73327:920;;;;;:::o;28087:130::-;27766:4;27790:7;-1:-1:-1;;;27790:7:0;;;;28146:64;;28183:15;;-1:-1:-1;;;28183:15:0;;;;;;;;;;;69802:406;69893:17;;:::i;:::-;69928:32;69940:6;69948:5;69955:4;69928:11;:32::i;:::-;69923:37;-1:-1:-1;69974:9:0;;69971:68;;70000:5;;:27;;-1:-1:-1;;;70000:27:0;;;;;33006:25:1;;;-1:-1:-1;;;;;33067:32:1;;;33047:18;;;33040:60;70000:5:0;;;;:14;;32979:18:1;;70000:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69971:68;70053:2;:8;;;:15;;;70049:152;;70085:8;;;;;70103:4;70085:15;;;;:22;70151:37;;38807:15:1;;;;-1:-1:-1;;38803:53:1;70151:37:0;;;38791:66:1;;;;38873:12;;;38866:28;;;38910:12;;;38903:28;;;38947:12;;70151:37:0;;;-1:-1:-1;;70151:37:0;;;;;;;;;70141:48;;70151:37;70141:48;;;;70122:8;;;;:16;:67;70049:152;69802:406;;;;;;:::o;75971:954::-;76154:6;76186:5;76126:1;76054:21;76254:17;;;;;:61;;-1:-1:-1;76284:4:0;76276:21;:38;-1:-1:-1;76276:38:0;76254:61;76251:294;;;-1:-1:-1;76412:3:0;;:29;;76375:3;76348:23;;;;;76347:31;;76398:9;;76412:3;;;;-1:-1:-1;;;;;76412:3:0;;76347:31;;76398:9;76412:29;76398:9;76412:29;76347:31;76412:3;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76397:44;;;76468:4;76460:25;;;;-1:-1:-1;;;76460:25:0;;39172:2:1;76460:25:0;;;39154:21:1;39211:1;39191:18;;;39184:29;-1:-1:-1;;;39229:18:1;;;39222:38;39277:18;;76460:25:0;38970:331:1;76460:25:0;76521:8;76504:25;;;;76317:228;76251:294;76577:1;76562:12;:16;:76;;;;-1:-1:-1;76583:38:0;;-1:-1:-1;;;76583:38:0;;76615:4;76583:38;;;21308:51:1;76625:12:0;;-1:-1:-1;;;;;76583:23:0;;;;;21281:18:1;;76583:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;76562:76;76559:348;;;-1:-1:-1;76697:3:0;76671:22;;;;;76670:30;-1:-1:-1;;;;;76722:19:0;;;76719:129;;76796:3;;76773:37;;-1:-1:-1;;;76773:37:0;;76796:3;;;;-1:-1:-1;;;;;76796:3:0;;;76773:37;;;39480:51:1;39547:18;;;39540:34;;;76773:22:0;;;;;39453:18:1;;76773:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76765:63;;;;-1:-1:-1;;;76765:63:0;;39787:2:1;76765:63:0;;;39769:21:1;39826:2;39806:18;;;39799:30;-1:-1:-1;;;39845:18:1;;;39838:43;39898:18;;76765:63:0;39585:337:1;76765:63:0;76882:8;76866:24;;;;76559:348;76099:826;;75971:954;;;;;;:::o;41216:134::-;41292:12;:15;;41265:14;;;41292:15;;;:::i;:::-;;;;-1:-1:-1;;41330:12:0;;;41216:134;-1:-1:-1;41216:134:0:o;40324:474::-;40416:17;;;;40413:377;;40607:24;:38;;42034:15;40479:46;40516:9;40500:25;;40479:46;40568:20;;;-1:-1:-1;;;;;40664:37:0;;-1:-1:-1;;;40664:37:0;;-1:-1:-1;;40664:37:0;;;;;;;;;;;;40479:18;39454:22;;;:14;:22;;;;;:33;;-1:-1:-1;;39454:33:0;;;;;;;40479:46;40720:43;39377:118;51727:1314;51815:25;;:::i;:::-;51854:13;;51851:1183;;51883:13;51899;51911:1;51899:9;:13;:::i;:::-;51883:29;;52025;52038:8;52048:5;52025:12;:29::i;:::-;52136:9;;:14;:19;;;;52174:23;;;;52216:26;;;;52261:25;;;;52305:28;;52352:20;;;;;52016:38;;-1:-1:-1;52069:318:0;;52110:7;;52305:28;52069:22;:318::i;:::-;-1:-1:-1;52456:9:0;;:14;52484:1;52456:25;;;;:29;;;52500:9;;:14;:26;;:30;;;52545:9;;:14;:32;42034:15;52592:9;;:14;-1:-1:-1;;;;;52592:35:0;;;:26;;;;:35;52655:11;;;;52678:9;;:14;52642:51;;52655:11;52668:8;;52642:12;:51::i;:::-;51868:837;51851:1183;;;52735:30;52748:9;52759:5;52735:12;:30::i;:::-;52847:9;;:14;:19;;;;52885:23;;;;52987:20;;;;;52726:39;;-1:-1:-1;52780:242:0;;52821:7;;52885:23;52847:9;;;;;;52780:22;:242::i;:::-;;51804:1237;51727:1314;;;:::o;57149:503::-;57337:10;-1:-1:-1;;;;;57369:15:0;;;;:33;;-1:-1:-1;;;;;;57388:14:0;;;57369:33;:51;;;-1:-1:-1;57406:14:0;;57369:51;57366:64;;;-1:-1:-1;57429:1:0;57422:8;;57366:64;57463:9;-1:-1:-1;;;;;57449:23:0;:10;-1:-1:-1;;;;;57449:23:0;;;57441:53;;;;-1:-1:-1;;;57441:53:0;;40129:2:1;57441:53:0;;;40111:21:1;40168:2;40148:18;;;40141:30;-1:-1:-1;;;40187:18:1;;;40180:47;40244:18;;57441:53:0;39927:341:1;57441:53:0;57542:14;;;:2;:14;;57616:9;-1:-1:-1;;;;;57581:31:0;;-1:-1:-1;;;;;57582:16:0;;;;57581:31;;;;;:::i;:::-;;57580:45;57579:53;;;;;:::i;:::-;;;57149:503;-1:-1:-1;;;;;;57149:503:0:o;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:255;218:2;212:9;260:6;248:19;;-1:-1:-1;;;;;282:34:1;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:2;373:22;146:255;:::o;406:257::-;478:4;472:11;;;510:17;;-1:-1:-1;;;;;542:34:1;;578:22;;;539:62;536:88;;;604:18;;:::i;668:251::-;740:2;734:9;782:2;770:15;;-1:-1:-1;;;;;800:34:1;;836:22;;;797:62;794:88;;;862:18;;:::i;924:275::-;995:2;989:9;1060:2;1041:13;;-1:-1:-1;;1037:27:1;1025:40;;-1:-1:-1;;;;;1080:34:1;;1116:22;;;1077:62;1074:88;;;1142:18;;:::i;:::-;1178:2;1171:22;924:275;;-1:-1:-1;924:275:1:o;1204:559::-;1247:5;1300:3;1293:4;1285:6;1281:17;1277:27;1267:55;;1318:1;1315;1308:12;1267:55;1358:6;1345:20;-1:-1:-1;;;;;1380:6:1;1377:30;1374:56;;;1410:18;;:::i;:::-;1454:59;1501:2;1478:17;;-1:-1:-1;;1474:31:1;1507:4;1470:42;1454:59;:::i;:::-;1538:6;1529:7;1522:23;1592:3;1585:4;1576:6;1568;1564:19;1560:30;1557:39;1554:59;;;1609:1;1606;1599:12;1554:59;1674:6;1667:4;1659:6;1655:17;1648:4;1639:7;1635:18;1622:59;1730:1;1701:20;;;1723:4;1697:31;1690:42;;;;1705:7;1204:559;-1:-1:-1;;;1204:559:1:o;1768:173::-;1836:20;;-1:-1:-1;;;;;1885:31:1;;1875:42;;1865:70;;1931:1;1928;1921:12;1946:510;2033:6;2041;2049;2102:2;2090:9;2081:7;2077:23;2073:32;2070:52;;;2118:1;2115;2108:12;2070:52;2158:9;2145:23;-1:-1:-1;;;;;2183:6:1;2180:30;2177:50;;;2223:1;2220;2213:12;2177:50;2246;2288:7;2279:6;2268:9;2264:22;2246:50;:::i;:::-;2236:60;-1:-1:-1;;2365:2:1;2350:18;;2337:32;;-1:-1:-1;2412:38:1;2446:2;2431:18;;2412:38;:::i;:::-;2402:48;;1946:510;;;;;:::o;2749:186::-;2808:6;2861:2;2849:9;2840:7;2836:23;2832:32;2829:52;;;2877:1;2874;2867:12;2829:52;2900:29;2919:9;2900:29;:::i;3049:784::-;3285:2;3297:21;;;3367:13;;3270:18;;;3389:22;;;3237:4;;3468:15;;;3442:2;3427:18;;;3237:4;3511:296;3525:6;3522:1;3519:13;3511:296;;;3584:13;;3626:9;;-1:-1:-1;;;;;3622:35:1;3610:48;;3720:2;3712:11;;;3706:18;3699:26;3692:34;3678:12;;;3671:56;3782:15;;;;3756:2;3747:12;;;;3654:1;3540:9;3511:296;;;-1:-1:-1;3824:3:1;;3049:784;-1:-1:-1;;;;;3049:784:1:o;3838:420::-;3915:6;3923;3931;3984:2;3972:9;3963:7;3959:23;3955:32;3952:52;;;4000:1;3997;3990:12;3952:52;4023:29;4042:9;4023:29;:::i;:::-;4013:39;4121:2;4106:18;;4093:32;;-1:-1:-1;4222:2:1;4207:18;;;4194:32;;3838:420;-1:-1:-1;;;3838:420:1:o;4485:399::-;4526:3;4564:5;4558:12;4591:6;4586:3;4579:19;4616:1;4626:139;4640:6;4637:1;4634:13;4626:139;;;4748:4;4733:13;;;4729:24;;4723:31;4703:11;;;4699:22;;4692:63;4655:12;4626:139;;;4630:3;4810:1;4803:4;4794:6;4789:3;4785:16;4781:27;4774:38;4873:4;4866:2;4862:7;4857:2;4849:6;4845:15;4841:29;4836:3;4832:39;4828:50;4821:57;;;4485:399;;;;:::o;4889:255::-;4980:5;4974:12;4969:3;4962:25;4944:3;5033:4;5026:5;5022:16;5016:23;5071:4;5064;5059:3;5055:14;5048:28;5092:46;5132:4;5127:3;5123:14;5109:12;5092:46;:::i;5149:446::-;5202:3;5240:5;5234:12;5267:6;5262:3;5255:19;5299:4;5294:3;5290:14;5283:21;;5338:4;5331:5;5327:16;5361:1;5371:199;5385:6;5382:1;5379:13;5371:199;;;5450:13;;-1:-1:-1;;;;;5446:39:1;5434:52;;5515:4;5506:14;;;;5543:17;;;;5482:1;5400:9;5371:199;;;-1:-1:-1;5586:3:1;;5149:446;-1:-1:-1;;;;5149:446:1:o;5600:1191::-;5651:3;5695:5;5689:12;5722:4;5717:3;5710:17;5765:12;5759:19;5752:4;5747:3;5743:14;5736:43;5833:4;5819:12;5815:23;5809:30;5804:2;5799:3;5795:12;5788:52;5895:4;5881:12;5877:23;5871:30;5865:3;5860;5856:13;5849:53;5957:2;5943:12;5939:21;5933:28;5970:48;6013:3;6008;6004:13;5988:14;-1:-1:-1;;;;;4435:38:1;4423:51;;4370:110;5970:48;-1:-1:-1;6073:3:1;6055:22;;6049:29;-1:-1:-1;;;;;4328:30:1;;6130:3;6121:13;;4316:43;-1:-1:-1;6190:3:1;6172:22;;6166:29;6160:3;6151:13;;6144:52;6251:3;6233:22;;6227:29;-1:-1:-1;;;;;3006:31:1;;6309:3;6300:13;;2994:44;-1:-1:-1;6369:3:1;6351:22;;6345:29;-1:-1:-1;;;;;3006:31:1;;6427:6;6418:16;;2994:44;-1:-1:-1;6490:3:1;6472:22;6466:29;6526:6;6520:3;6511:13;;6504:29;6555:61;6611:3;6602:13;;6466:29;6555:61;:::i;:::-;6542:74;;6664:4;6657:5;6653:16;6647:23;6713:3;6706:5;6702:15;6695:4;6690:3;6686:14;6679:39;6734:51;6779:5;6763:14;6734:51;:::i;6796:597::-;6857:3;6888;6920:5;6914:12;6947:6;6942:3;6935:19;6979:4;6974:3;6970:14;6963:21;;7037:4;7027:6;7024:1;7020:14;7013:5;7009:26;7005:37;7076:4;7069:5;7065:16;7099:1;7109:258;7123:6;7120:1;7117:13;7109:258;;;7210:2;7206:7;7198:5;7192:4;7188:16;7184:30;7179:3;7172:43;7236:47;7278:4;7269:6;7263:13;7236:47;:::i;:::-;7318:4;7343:14;;;;7228:55;;-1:-1:-1;7306:17:1;;;;;7145:1;7138:9;7109:258;;;-1:-1:-1;7383:4:1;;6796:597;-1:-1:-1;;;;;;6796:597:1:o;7398:908::-;7459:3;7490;7522:5;7516:12;7549:6;7544:3;7537:19;7581:4;7576:3;7572:14;7565:21;;7639:4;7629:6;7626:1;7622:14;7615:5;7611:26;7607:37;7678:4;7671:5;7667:16;7701:1;7711:569;7725:6;7722:1;7719:13;7711:569;;;7812:2;7808:7;7800:5;7794:4;7790:16;7786:30;7781:3;7774:43;7846:6;7840:13;7885:2;7879:9;7873:4;7866:23;7936:4;7932:2;7928:13;7922:20;7979:4;7972;7966;7962:15;7955:29;8011:67;8072:4;8066;8062:15;8048:12;8011:67;:::i;:::-;8133:4;8125:13;;;8119:20;-1:-1:-1;;;;;8115:53:1;8098:15;;;;8091:78;;;;8231:4;8256:14;;;;7997:81;;-1:-1:-1;8219:17:1;;;;;7747:1;7740:9;7711:569;;8311:605;8376:3;8407;8439:5;8433:12;8466:6;8461:3;8454:19;8498:4;8493:3;8489:14;8482:21;;8556:4;8546:6;8543:1;8539:14;8532:5;8528:26;8524:37;8595:4;8588:5;8584:16;8618:1;8628:262;8642:6;8639:1;8636:13;8628:262;;;8729:2;8725:7;8717:5;8711:4;8707:16;8703:30;8698:3;8691:43;8755:51;8801:4;8792:6;8786:13;8755:51;:::i;:::-;8841:4;8866:14;;;;8747:59;;-1:-1:-1;8829:17:1;;;;;8664:1;8657:9;8628:262;;8921:474;9012:12;;9005:20;8998:28;8986:41;;9076:4;9065:16;;;9059:23;9043:14;;;9036:47;9132:4;9121:16;;;9115:23;9099:14;;;9092:47;9188:4;9177:16;;;9171:23;9155:14;;;9148:47;9248:4;9237:16;;;9231:23;-1:-1:-1;;;;;9227:49:1;9211:14;;;9204:73;9264:3;9315:16;;;9309:23;9293:14;;;9286:47;9382:4;9371:16;;;9365:23;9349:14;;9342:47;8921:474::o;9594:1146::-;9652:3;9696:5;9690:12;9723:6;9718:3;9711:19;9751:48;9791:6;9786:3;9782:16;9768:12;9751:48;:::i;:::-;9739:60;;9847:4;9840:5;9836:16;9830:23;9895:3;9889:4;9885:14;9878:4;9873:3;9869:14;9862:38;9923;9956:4;9940:14;9923:38;:::i;:::-;9909:52;;;10009:4;10002:5;9998:16;9992:23;10024:49;10067:4;10062:3;10058:14;10042;9476:10;9465:22;9453:35;;9400:94;10024:49;;10121:4;10114:5;10110:16;10104:23;10171:3;10163:6;10159:16;10152:4;10147:3;10143:14;10136:40;10199;10232:6;10216:14;10199:40;:::i;:::-;10185:54;;;10287:4;10280:5;10276:16;10270:23;10302:49;10345:4;10340:3;10336:14;10320;-1:-1:-1;;;;;4328:30:1;4316:43;;4263:102;10302:49;;10399:4;10392:5;10388:16;10382:23;10414:49;10457:4;10452:3;10448:14;10432;9575:6;9564:18;9552:31;;9499:90;10414:49;;10511:4;10504:5;10500:16;10494:23;10526:49;10569:4;10564:3;10560:14;10544;-1:-1:-1;;;;;4328:30:1;4316:43;;4263:102;10526:49;;10623:4;10616:5;10612:16;10606:23;10673:3;10665:6;10661:16;10654:4;10649:3;10645:14;10638:40;10694;10727:6;10711:14;10694:40;:::i;11042:4189::-;11110:3;11141;11173:5;11167:12;11200:6;11195:3;11188:19;11232:4;11227:3;11223:14;11216:21;;11290:4;11280:6;11277:1;11273:14;11266:5;11262:26;11258:37;11329:4;11322:5;11318:16;11352:1;11362:3843;11376:6;11373:1;11370:13;11362:3843;;;-1:-1:-1;;11441:16:1;;;11437:30;11425:43;;11491:13;;11572:9;;11559:23;;11629:4;11621:13;;;11615:20;11541:4;11655:15;;;11648:29;;;11738:19;;11531:15;;;11770:24;;;11925:23;;;11826:4;11876:1;11872:16;;;11862:27;;11858:38;;;11816:15;;;;-1:-1:-1;11986:3108:1;12002:8;11997:3;11994:17;11986:3108;;;12106:2;12102:7;12095:4;12087:6;12083:17;12079:31;12072:5;12065:46;12144:8;12138:15;12170:48;12211:6;12206:2;12200:9;12170:48;:::i;:::-;12271:4;12267:2;12263:13;12257:20;12320:6;12313:4;12305:6;12301:17;12294:33;12370:3;12362:6;12358:16;12419:14;12413:21;12479:4;12470:6;12462;12458:19;12451:33;12514:6;12559:14;12553:21;12606:8;12598:6;12591:24;12653:3;12645:6;12641:16;12632:25;;12723:3;12711:8;12708:1;12704:16;12696:6;12692:29;12688:39;12674:53;;12780:4;12764:14;12760:25;12744:41;;12813:1;12831:1780;12847:8;12842:3;12839:17;12831:1780;;;-1:-1:-1;;12936:19:1;;;12932:34;12918:49;;12998:15;;13108:9;;13060:4;13138:20;;;13235:21;;13048:17;;;13277:24;;;13343:4;13403:1;13399:16;;;13387:29;;13383:40;;;13480:4;13460:25;;13331:17;;;;-1:-1:-1;13539:738:1;13555:8;13550:3;13547:17;13539:738;;;13677:2;13673:7;13664:6;13656;13652:19;13648:33;13641:5;13634:48;13723:8;13717:15;13785:2;13779:9;13828:4;13820:6;13813:20;13872:51;13917:4;13909:6;13905:17;13889:14;13872:51;:::i;:::-;13992:4;13984:13;;;13978:20;-1:-1:-1;;;;;13974:45:1;13955:17;;;13948:72;14099:4;14091:13;;;14085:20;14078:28;14071:36;14052:17;;;;14045:63;;;;-1:-1:-1;13858:65:1;14186:19;;;;14239:16;;;;;13583:1;13574:11;13539:738;;;13543:3;;;;14334:4;14330:2;14326:13;14320:20;14298:42;;14399:6;14391;14387:19;14380:4;14372:6;14368:17;14361:46;14438:57;14488:6;14472:14;14438:57;:::i;:::-;14428:67;-1:-1:-1;;;14542:4:1;14528:19;;;;14577:16;;;;;12875:1;12866:11;12831:1780;;;-1:-1:-1;;;;14676:4:1;14656:25;;;14650:32;10823:12;;14758:3;14746:16;;10811:25;10878:16;;;10872:23;10897:4;10868:34;10852:14;;;10845:58;10952:4;10941:16;;;10935:23;10919:14;;;10912:47;11022:4;11011:16;;;11005:23;10998:31;10991:39;10975:14;;;10968:63;14808:13;;14802:20;2531:13;2524:21;14883:6;14871:19;;2512:34;14942:13;;;;14936:20;14927:6;14915:19;;;14908:49;;;;15019:19;;;;14984:6;15064:16;;;;;12030:1;12021:11;11986:3108;;;-1:-1:-1;;;15156:4:1;15181:14;;;;15115:6;;-1:-1:-1;15144:17:1;;;;;-1:-1:-1;11398:1:1;11391:9;11362:3843;;15236:1097;15417:2;15406:9;15399:21;15380:4;15445:6;15439:13;15494:2;15488:9;15483:2;15472:9;15468:18;15461:37;-1:-1:-1;;;;;15552:2:1;15548;15544:11;15538:18;15534:43;15529:2;15518:9;15514:18;15507:71;-1:-1:-1;;;;;15632:2:1;15628;15624:11;15618:18;15614:43;15609:2;15598:9;15594:18;15587:71;15709:2;15705;15701:11;15695:18;15689:3;15678:9;15674:19;15667:47;;15761:2;15753:6;15749:15;15743:22;15802:4;15796:3;15785:9;15781:19;15774:33;15830:71;15896:3;15885:9;15881:19;15867:12;15830:71;:::i;:::-;15816:85;;15950:2;15942:6;15938:15;15932:22;16023:2;16019:7;16007:9;15999:6;15995:22;15991:36;15985:3;15974:9;15970:19;15963:65;16051:64;16108:6;16092:14;16051:64;:::i;:::-;16037:78;;;16164:2;16156:6;16152:15;16146:22;16238:2;16234:7;16222:9;16214:6;16210:22;16206:36;16199:4;16188:9;16184:20;16177:66;16260:67;16320:6;16304:14;16260:67;:::i;16338:466::-;16415:6;16423;16431;16484:2;16472:9;16463:7;16459:23;16455:32;16452:52;;;16500:1;16497;16490:12;16452:52;-1:-1:-1;;16545:23:1;;;16665:2;16650:18;;16637:32;;-1:-1:-1;16768:2:1;16753:18;;;16740:32;;16338:466;-1:-1:-1;16338:466:1:o;16809:194::-;16880:4;-1:-1:-1;;;;;16905:6:1;16902:30;16899:56;;;16935:18;;:::i;:::-;-1:-1:-1;16980:1:1;16976:14;16992:4;16972:25;;16809:194::o;17008:171::-;17075:20;;-1:-1:-1;;;;;17124:30:1;;17114:41;;17104:69;;17169:1;17166;17159:12;17184:118;17270:5;17263:13;17256:21;17249:5;17246:32;17236:60;;17292:1;17289;17282:12;17307:163;17374:20;;17434:10;17423:22;;17413:33;;17403:61;;17460:1;17457;17450:12;17475:159;17542:20;;17602:6;17591:18;;17581:29;;17571:57;;17624:1;17621;17614:12;17639:1245;17706:5;17754:6;17742:9;17737:3;17733:19;17729:32;17726:52;;;17774:1;17771;17764:12;17726:52;17796:22;;:::i;:::-;17787:31;;17854:9;17841:23;-1:-1:-1;;;;;17879:6:1;17876:30;17873:50;;;17919:1;17916;17909:12;17873:50;17946:46;17988:3;17979:6;17968:9;17964:22;17946:46;:::i;:::-;17939:5;17932:61;;18046:2;18035:9;18031:18;18018:32;-1:-1:-1;;;;;18065:8:1;18062:32;18059:52;;;18107:1;18104;18097:12;18059:52;18143:48;18187:3;18176:8;18165:9;18161:24;18143:48;:::i;:::-;18138:2;18131:5;18127:14;18120:72;;18224:37;18257:2;18246:9;18242:18;18224:37;:::i;:::-;18219:2;18212:5;18208:14;18201:61;18315:2;18304:9;18300:18;18287:32;-1:-1:-1;;;;;18334:8:1;18331:32;18328:52;;;18376:1;18373;18366:12;18328:52;18412:48;18456:3;18445:8;18434:9;18430:24;18412:48;:::i;:::-;18407:2;18400:5;18396:14;18389:72;;18494:38;18527:3;18516:9;18512:19;18494:38;:::i;:::-;18488:3;18481:5;18477:15;18470:63;18566:38;18599:3;18588:9;18584:19;18566:38;:::i;:::-;18560:3;18553:5;18549:15;18542:63;18638:38;18671:3;18660:9;18656:19;18638:38;:::i;:::-;18632:3;18625:5;18621:15;18614:63;18730:3;18719:9;18715:19;18702:33;-1:-1:-1;;;;;18750:8:1;18747:32;18744:52;;;18792:1;18789;18782:12;18744:52;18829:48;18873:3;18862:8;18851:9;18847:24;18829:48;:::i;:::-;18823:3;18816:5;18812:15;18805:73;;17639:1245;;;;:::o;18889:2268::-;18999:6;19007;19015;19068:2;19056:9;19047:7;19043:23;19039:32;19036:52;;;19084:1;19081;19074:12;19036:52;19107:29;19126:9;19107:29;:::i;:::-;19097:39;;19187:2;19176:9;19172:18;19159:32;-1:-1:-1;;;;;19206:6:1;19203:30;19200:50;;;19246:1;19243;19236:12;19200:50;19269:22;;19325:4;19307:16;;;19303:27;19300:47;;;19343:1;19340;19333:12;19300:47;19369:22;;:::i;:::-;19429:2;19416:16;-1:-1:-1;;;;;19447:8:1;19444:32;19441:52;;;19489:1;19486;19479:12;19441:52;19512:17;;19560:4;19552:13;;19548:27;-1:-1:-1;19538:55:1;;19589:1;19586;19579:12;19538:55;19629:2;19616:16;19652:75;19668:58;19719:6;19668:58;:::i;:::-;19652:75;:::i;:::-;19749:3;19773:6;19768:3;19761:19;19805:2;19800:3;19796:12;19789:19;;19860:2;19850:6;19847:1;19843:14;19839:2;19835:23;19831:32;19817:46;;19886:7;19878:6;19875:19;19872:39;;;19907:1;19904;19897:12;19872:39;19939:2;19935;19931:11;19951:832;19967:6;19962:3;19959:15;19951:832;;;20053:3;20040:17;-1:-1:-1;;;;;20076:11:1;20073:35;20070:55;;;20121:1;20118;20111:12;20070:55;20148:20;;20220:2;20192:16;;;-1:-1:-1;;20188:30:1;20184:39;20181:59;;;20236:1;20233;20226:12;20181:59;20268:22;;:::i;:::-;20340:2;20336;20332:11;20319:25;-1:-1:-1;;;;;20363:8:1;20360:32;20357:52;;;20405:1;20402;20395:12;20357:52;20438:54;20484:7;20479:2;20468:8;20464:2;20460:17;20456:26;20438:54;:::i;:::-;20429:7;20422:71;;20531:32;20557:4;20553:2;20549:13;20531:32;:::i;:::-;20526:2;20517:7;20513:16;20506:58;20613:2;20609;20605:11;20592:25;20577:40;;20630:30;20652:7;20630:30;:::i;:::-;20693:4;20680:18;;20673:35;;;;20721:20;;20770:2;20761:12;;;;19984;19951:832;;;-1:-1:-1;20792:20:1;;-1:-1:-1;;;20858:2:1;20850:11;;20837:25;-1:-1:-1;;;;;20874:32:1;;20871:52;;;20919:1;20916;20909:12;20871:52;20955:66;21013:7;21002:8;20998:2;20994:17;20955:66;:::i;:::-;20950:2;20939:14;;20932:90;-1:-1:-1;18889:2268:1;;20943:5;;-1:-1:-1;;;;21119:4:1;21104:20;;;;21091:34;;18889:2268::o;21370:1064::-;21464:6;21517:2;21505:9;21496:7;21492:23;21488:32;21485:52;;;21533:1;21530;21523:12;21485:52;21573:9;21560:23;-1:-1:-1;;;;;21598:6:1;21595:30;21592:50;;;21638:1;21635;21628:12;21592:50;21661:22;;21714:4;21706:13;;21702:27;-1:-1:-1;21692:55:1;;21743:1;21740;21733:12;21692:55;21783:2;21770:16;21806:75;21822:58;21873:6;21822:58;:::i;21806:75::-;21903:3;21927:6;21922:3;21915:19;21959:2;21954:3;21950:12;21943:19;;22014:2;22004:6;22001:1;21997:14;21993:2;21989:23;21985:32;21971:46;;22040:7;22032:6;22029:19;22026:39;;;22061:1;22058;22051:12;22026:39;22093:2;22089;22085:11;22105:299;22121:6;22116:3;22113:15;22105:299;;;22207:3;22194:17;-1:-1:-1;;;;;22230:11:1;22227:35;22224:55;;;22275:1;22272;22265:12;22224:55;22304:57;22353:7;22348:2;22334:11;22330:2;22326:20;22322:29;22304:57;:::i;:::-;22292:70;;-1:-1:-1;22391:2:1;22382:12;;;;22138;22105:299;;;-1:-1:-1;22423:5:1;21370:1064;-1:-1:-1;;;;;;21370:1064:1:o;22439:805::-;22630:2;22612:21;;;22703:13;;22752:4;22732:18;;;22725:32;22806:19;;22671:2;22656:18;;22834:22;;;22593:4;;22914:21;;;;;22593:4;;22887:3;22872:19;;;22963:194;22977:6;22974:1;22971:13;22963:194;;;23026:49;23071:3;23062:6;23056:13;23026:49;:::i;:::-;23104:4;23099:3;23095:14;23088:21;;23144:2;23136:6;23132:15;23122:25;;22999:1;22996;22992:9;22987:14;;22963:194;;;22967:3;23213:2;23205:6;23201:15;23195:22;23188:4;23177:9;23173:20;23166:52;23235:3;23227:11;;;;;22439:805;;;;:::o;23249:321::-;23480:2;23469:9;23462:21;23443:4;23500:64;23560:2;23549:9;23545:18;23537:6;23500:64;:::i;23575:783::-;23679:6;23687;23695;23703;23711;23719;23772:3;23760:9;23751:7;23747:23;23743:33;23740:53;;;23789:1;23786;23779:12;23740:53;23834:23;;;-1:-1:-1;23954:2:1;23939:18;;23926:32;;-1:-1:-1;24057:2:1;24042:18;;24029:32;;-1:-1:-1;24160:2:1;24145:18;;24132:32;;-1:-1:-1;24263:3:1;24248:19;;24235:33;;-1:-1:-1;24313:39:1;24347:3;24332:19;;24313:39;:::i;:::-;24303:49;;23575:783;;;;;;;;:::o;24363:226::-;24422:6;24475:2;24463:9;24454:7;24450:23;24446:32;24443:52;;;24491:1;24488;24481:12;24443:52;-1:-1:-1;24536:23:1;;24363:226;-1:-1:-1;24363:226:1:o;24594:184::-;24652:6;24705:2;24693:9;24684:7;24680:23;24676:32;24673:52;;;24721:1;24718;24711:12;24673:52;24744:28;24762:9;24744:28;:::i;24783:298::-;24850:6;24858;24911:2;24899:9;24890:7;24886:23;24882:32;24879:52;;;24927:1;24924;24917:12;24879:52;24972:23;;;-1:-1:-1;25038:37:1;25071:2;25056:18;;25038:37;:::i;:::-;25028:47;;24783:298;;;;;:::o;25428:127::-;25489:10;25484:3;25480:20;25477:1;25470:31;25520:4;25517:1;25510:15;25544:4;25541:1;25534:15;25560:127;25621:10;25616:3;25612:20;25609:1;25602:31;25652:4;25649:1;25642:15;25676:4;25673:1;25666:15;25692:135;25731:3;25752:17;;;25749:43;;25772:18;;:::i;:::-;-1:-1:-1;25819:1:1;25808:13;;25692:135::o;25832:334::-;26034:2;26016:21;;;26073:2;26053:18;;;26046:30;-1:-1:-1;;;26107:2:1;26092:18;;26085:40;26157:2;26142:18;;25832:334::o;26171:184::-;26241:6;26294:2;26282:9;26273:7;26269:23;26265:32;26262:52;;;26310:1;26307;26300:12;26262:52;-1:-1:-1;26333:16:1;;26171:184;-1:-1:-1;26171:184:1:o;27756:380::-;27835:1;27831:12;;;;27878;;;27899:61;;27953:4;27945:6;27941:17;27931:27;;27899:61;28006:2;27998:6;27995:14;27975:18;27972:38;27969:161;;28052:10;28047:3;28043:20;28040:1;28033:31;28087:4;28084:1;28077:15;28115:4;28112:1;28105:15;27969:161;;27756:380;;;:::o;28266:517::-;28367:2;28362:3;28359:11;28356:421;;;28403:5;28400:1;28393:16;28447:4;28444:1;28434:18;28517:2;28505:10;28501:19;28498:1;28494:27;28488:4;28484:38;28553:4;28541:10;28538:20;28535:47;;;-1:-1:-1;28576:4:1;28535:47;28631:2;28626:3;28622:12;28619:1;28615:20;28609:4;28605:31;28595:41;;28686:81;28704:2;28697:5;28694:13;28686:81;;;28763:1;28749:16;;28730:1;28719:13;28686:81;;28959:1295;29083:3;29077:10;-1:-1:-1;;;;;29102:6:1;29099:30;29096:56;;;29132:18;;:::i;:::-;29161:96;29250:6;29210:38;29242:4;29236:11;29210:38;:::i;:::-;29204:4;29161:96;:::i;:::-;29306:4;29337:2;29326:14;;29354:1;29349:648;;;;30041:1;30058:6;30055:89;;;-1:-1:-1;30110:19:1;;;30104:26;30055:89;-1:-1:-1;;28916:1:1;28912:11;;;28908:24;28904:29;28894:40;28940:1;28936:11;;;28891:57;30157:81;;29319:929;;29349:648;28213:1;28206:14;;;28250:4;28237:18;;-1:-1:-1;;29385:20:1;;;29502:222;29516:7;29513:1;29510:14;29502:222;;;29598:19;;;29592:26;29577:42;;29705:4;29690:20;;;;29658:1;29646:14;;;;29532:12;29502:222;;;29506:3;29752:6;29743:7;29740:19;29737:201;;;29813:19;;;29807:26;-1:-1:-1;;29896:1:1;29892:14;;;29908:3;29888:24;29884:37;29880:42;29865:58;29850:74;;29737:201;-1:-1:-1;;;;29984:1:1;29968:14;;;29964:22;29951:36;;-1:-1:-1;28959:1295:1:o;30259:1501::-;30510:6;30499:9;30492:25;30553:6;30548:2;30537:9;30533:18;30526:34;30596:2;30591;30580:9;30576:18;30569:30;30473:4;30637:3;30626:9;30622:19;30676:6;30670:13;30719:2;30714;30703:9;30699:18;30692:30;30742:6;30777:12;30771:19;30814:6;30806;30799:22;30852:3;30841:9;30837:19;30830:26;;30915:3;30905:6;30902:1;30898:14;30887:9;30883:30;30879:40;30865:54;;30960:2;30946:12;30942:21;30928:35;;30981:1;30991:562;31005:6;31002:1;30999:13;30991:562;;;31098:3;31094:8;31082:9;31074:6;31070:22;31066:37;31061:3;31054:50;31133:6;31127:13;31181:2;31175:9;31212:2;31204:6;31197:18;31242:49;31287:2;31279:6;31275:15;31259:14;31242:49;:::i;:::-;31346:2;31338:11;;;31332:18;-1:-1:-1;;;;;31328:43:1;31311:15;;;31304:68;31437:2;31429:11;;;31423:18;31416:26;31409:34;31392:15;;;;31385:59;;;;-1:-1:-1;31228:63:1;31496:15;;;;31531:12;;;;;31027:1;31020:9;30991:562;;;-1:-1:-1;;;;31602:2:1;31590:15;;31584:22;31647;;;-1:-1:-1;;31643:36:1;31637:3;31622:19;;31615:65;31697:57;31651:6;31584:22;31697:57;:::i;31765:128::-;31832:9;;;31853:11;;;31850:37;;;31867:18;;:::i;32247:244::-;32358:10;32331:18;;;32351;;;32327:43;32390:28;;;;32437:24;;;32427:58;;32465:18;;:::i;33111:245::-;33178:6;33231:2;33219:9;33210:7;33206:23;33202:32;33199:52;;;33247:1;33244;33237:12;33199:52;33279:9;33273:16;33298:28;33320:5;33298:28;:::i;33707:475::-;34002:6;33991:9;33984:25;34045:6;34040:2;34029:9;34025:18;34018:34;34088:2;34083;34072:9;34068:18;34061:30;33965:4;34108:68;34172:2;34161:9;34157:18;34149:6;34108:68;:::i;35076:127::-;35137:10;35132:3;35128:20;35125:1;35118:31;35168:4;35165:1;35158:15;35192:4;35189:1;35182:15;36265:148;36353:4;36332:12;;;36346;;;36328:31;;36371:13;;36368:39;;;36387:18;;:::i;36765:127::-;36826:10;36821:3;36817:20;36814:1;36807:31;36857:4;36854:1;36847:15;36881:4;36878:1;36871:15;37249:261;37430:2;37419:9;37412:21;37393:4;37450:54;37500:2;37489:9;37485:18;37477:6;37450:54;:::i;38196:127::-;38257:10;38252:3;38248:20;38245:1;38238:31;38288:4;38285:1;38278:15;38312:4;38309:1;38302:15;38328:273;38396:6;38449:2;38437:9;38428:7;38424:23;38420:32;38417:52;;;38465:1;38462;38455:12;38417:52;38497:9;38491:16;38547:4;38540:5;38536:16;38529:5;38526:27;38516:55;;38567:1;38564;38557:12
Swarm Source
ipfs://cd2551b841c7ab2ee101bcd93b958a38c0e1e9919a092d487496632d04dbc0da
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.