ETH Price: $3,582.44 (+16.68%)
Gas: 42 Gwei

Token

KYC (KYC)
 

Overview

Max Total Supply

42 KYC

Holders

42

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
artbricker.eth
Balance
1 KYC
0x7dcc54460d8ab80809c49bc775143a0a9a1485c3
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KYC

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: KYC.sol
// SPDX-License-Identifier: MIT

import "./Dependencies.sol";


pragma solidity ^0.8.23;

interface IETF {
  function isMarketOpen() external view returns (bool);
  function create(uint256, address) external payable;
  function redeem(uint256, address, uint256) external;
  function transferFrom(address, address, uint256) external returns (bool);
}

interface IAuthorizedParticipants {
  function safeTransferFrom(address, address, uint256) external;
}

contract KYC is ERC721, ERC721Burnable, Ownable {
  uint256 public totalSupply;

  IETF public etf;

  struct KYCInfo {
    string firstName;
    string lastName;
    address addr;
  }
  mapping(uint256 => KYCInfo) public kycInfo;
  mapping(address => uint256) public addrToTokenId;
  bool isLocked;

  constructor(address _etf) ERC721('KYC', 'KYC') {
    etf = IETF(_etf);
  }

  function exists(uint256 tokenId) external view returns (bool) {
    return _exists(tokenId);
  }

  function register(string calldata firstName, string calldata lastName) external {
    require(etf.isMarketOpen(), 'KYC mint unavailable');
    require(bytes(firstName).length != 0 && bytes(lastName).length != 0, 'Invalid KYC info');

    uint256 id = getId(firstName, lastName);

    require(
      bytes(kycInfo[id].firstName).length == 0 && addrToTokenId[msg.sender] == 0,
      'KYC already registered'
    );

    kycInfo[id].firstName = firstName;
    kycInfo[id].lastName = lastName;
    kycInfo[id].addr = msg.sender;
    addrToTokenId[msg.sender] = id;

    _safeMint(msg.sender, id);
    totalSupply++;
  }

  function getId(string calldata firstName, string calldata lastName) public pure returns (uint256) {
    return uint256(keccak256(abi.encodePacked(firstName, lastName)));
  }

  function getAddr(uint256 tokenId) external view returns (address) {
    return kycInfo[tokenId].addr;
  }

  function getAddr(string calldata firstName, string calldata lastName) external view returns (address) {
    return kycInfo[getId(firstName, lastName)].addr;
  }


  function revoke(uint256 tokenId) external onlyOwner {
    _burn(tokenId);
  }

  string public externalUrl = "https://etf.steviep.xyz";
  string public description = "Always know your customer";


  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

    bytes memory encodedSVG = abi.encodePacked(
      'data:image/svg+xml;base64,',
      Base64.encode(rawSVG(tokenId))
    );


    string memory addr = Strings.toHexString(uint256(uint160(kycInfo[tokenId].addr)), 20);

    bytes memory attrs = abi.encodePacked(
      '[',
      '{"trait_type": "First Name", "value": "', kycInfo[tokenId].firstName, '"},',
      '{"trait_type": "Last Name", "value": "', kycInfo[tokenId].lastName, '"},',
      '{"trait_type": "Address", "value": "', addr, '"}',
      ']'
    );


    bytes memory json = abi.encodePacked(
      'data:application/json;utf8,',
      '{"name": "KYC ', addr, '",',
      '"description": "', description, '",',
      '"image": "', encodedSVG, '",',
      '"attributes": ', attrs,',',
      '"external_url": "', externalUrl, '"',
      '}'
    );

    return string(json);
  }

  function rawSVG(uint256 tokenId) public view returns (bytes memory) {
    string memory addr = Strings.toHexString(uint256(uint160(kycInfo[tokenId].addr)), 20);

    return abi.encodePacked(
      '<svg viewBox="0 0 380 250" xmlns="http://www.w3.org/2000/svg">'
        '<style>.k{dominant-baseline:middle;text-anchor:middle;font-size:40px;font-family:serif}.n{fill:#e74d61;font-family:monospace;font-size:30px}.a{fill:#e74d61;font-family:monospace;font-size:11px}</style>'
        '<rect x="0" y="0" width="380" height="250" fill="#f1f1d1" stroke="#002150"></rect>'
        '<rect x="10" y="10" width="360" height="230" stroke="#002150" fill="none" rx="15"></rect>'
        '<rect x="15" y="15" width="350" height="220" stroke="#002150" fill="none" rx="15"></rect>'
        '<rect x="15" y="15" width="350" height="50" fill="#4368a2" rx="15" stroke="#002150"></rect>'
        '<rect x="15.5" y="50" width="349" height="15" fill="#4368a2" ></rect>'
        '<line x1="15" y1="65" x2="365" y2="65" stroke="#002150"></line>'
        '<text x="192" y="47" class="k" fill="#082262">KYC</text>'
        '<text x="191" y="46" class="k" fill="#082262">KYC</text>'
        '<text x="190" y="45" class="k" fill="#fbf7ed" stroke="#002150">KYC</text>'
        '<text class="n k" x="50%" y="119">', kycInfo[tokenId].firstName, '</text>'
        '<text class="n k" x="50%" y="156">', kycInfo[tokenId].lastName, '</text>'
        '<text class="a k" x="50%" y="210">', addr, '</text>'
      '</svg>'
    );
  }
}



File 1 of 2: Dependencies.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    // /**
    //  * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
    //  * `recipient`, forwarding all available gas and reverting on errors.
    //  *
    //  * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
    //  * of certain opcodes, possibly making contracts go over the 2300 gas limit
    //  * imposed by `transfer`, making them unable to receive funds via
    //  * `transfer`. {sendValue} removes this limitation.
    //  *
    //  * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
    //  *
    //  * IMPORTANT: because control is transferred to `recipient`, care must be
    //  * taken to not create reentrancy vulnerabilities. Consider using
    //  * {ReentrancyGuard} or the
    //  * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
    //  */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    // /**
    //  * @dev Performs a Solidity function call using a low level `call`. A
    //  * plain `call` is an unsafe replacement for a function call: use this
    //  * function instead.
    //  *
    //  * If `target` reverts with a revert reason, it is bubbled up by this
    //  * function (like regular Solidity function calls).
    //  *
    //  * Returns the raw returned data. To convert to the expected return value,
    //  * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
    //  *
    //  * Requirements:
    //  *
    //  * - `target` must be a contract.
    //  * - calling `target` with `data` must not revert.
    //  *
    //  * _Available since v3.1._
    //  */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    // /**
    //  * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
    //  * `errorMessage` as a fallback revert reason when `target` reverts.
    //  *
    //  * _Available since v3.1._
    //  */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    // /**
    //  * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
    //  * but also transferring `value` wei to `target`.
    //  *
    //  * Requirements:
    //  *
    //  * - the calling contract must have an ETH balance of at least `value`.
    //  * - the called Solidity function must be `payable`.
    //  *
    //  * _Available since v3.1._
    //  */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    // *
    //  * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
    //  * with `errorMessage` as a fallback revert reason when `target` reverts.
    //  *
    //  * _Available since v3.1._

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    // /**
    //  * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
    //  * but performing a static call.
    //  *
    //  * _Available since v3.3._
    //  */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    // /**
    //  * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
    //  * but performing a static call.
    //  *
    //  * _Available since v3.3._
    //  */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    // /**
    //  * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
    //  * but performing a delegate call.
    //  *
    //  * _Available since v3.4._
    //  */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    // /**
    //  * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
    //  * but performing a delegate call.
    //  *
    //  * _Available since v3.4._
    //  */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    // /**
    //  * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
    //  * revert reason using the provided one.
    //  *
    //  * _Available since v4.3._
    //  */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    // Don't need these

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}


/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}



/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}



/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


/// @title IOptimismMintableERC20
/// @notice This interface is available on the OptimismMintableERC20 contract.
///         We declare it as a separate interface so that it can be used in
///         custom implementations of OptimismMintableERC20.
interface IOptimismMintableERC20 is IERC165 {
    function remoteToken() external view returns (address);

    function bridge() external returns (address);

    function mint(address _to, uint256 _amount) external;

    function burn(address _from, uint256 _amount) external;
}

/// @custom:legacy
/// @title ILegacyMintableERC20
/// @notice This interface was available on the legacy L2StandardERC20 contract.
///         It remains available on the OptimismMintableERC20 contract for
///         backwards compatibility.
interface ILegacyMintableERC20 is IERC165 {
    function l1Token() external view returns (address);

    function mint(address _to, uint256 _amount) external;

    function burn(address _from, uint256 _amount) external;
}


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}



/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the 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 override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * 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 `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}






/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _burn(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_etf","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addrToTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"etf","outputs":[{"internalType":"contract IETF","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"externalUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"firstName","type":"string"},{"internalType":"string","name":"lastName","type":"string"}],"name":"getAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"firstName","type":"string"},{"internalType":"string","name":"lastName","type":"string"}],"name":"getId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"kycInfo","outputs":[{"internalType":"string","name":"firstName","type":"string"},{"internalType":"string","name":"lastName","type":"string"},{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawSVG","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"firstName","type":"string"},{"internalType":"string","name":"lastName","type":"string"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280601781526020017f68747470733a2f2f6574662e737465766965702e78797a000000000000000000815250600c90816200004a9190620004ea565b506040518060400160405280601981526020017f416c77617973206b6e6f7720796f757220637573746f6d657200000000000000815250600d9081620000919190620004ea565b503480156200009e575f80fd5b5060405162005459380380620054598339818101604052810190620000c4919062000633565b6040518060400160405280600381526020017f4b594300000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4b59430000000000000000000000000000000000000000000000000000000000815250815f9081620001409190620004ea565b508060019081620001529190620004ea565b5050506200017562000169620001bc60201b60201c565b620001c360201b60201c565b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000663565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200030257607f821691505b602082108103620003185762000317620002bd565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200037c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200033f565b6200038886836200033f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620003d2620003cc620003c684620003a0565b620003a9565b620003a0565b9050919050565b5f819050919050565b620003ed83620003b2565b62000405620003fc82620003d9565b8484546200034b565b825550505050565b5f90565b6200041b6200040d565b62000428818484620003e2565b505050565b5b818110156200044f57620004435f8262000411565b6001810190506200042e565b5050565b601f8211156200049e5762000468816200031e565b620004738462000330565b8101602085101562000483578190505b6200049b620004928562000330565b8301826200042d565b50505b505050565b5f82821c905092915050565b5f620004c05f1984600802620004a3565b1980831691505092915050565b5f620004da8383620004af565b9150826002028217905092915050565b620004f58262000286565b67ffffffffffffffff81111562000511576200051062000290565b5b6200051d8254620002ea565b6200052a82828562000453565b5f60209050601f83116001811462000560575f84156200054b578287015190505b620005578582620004cd565b865550620005c6565b601f19841662000570866200031e565b5f5b82811015620005995784890151825560018201915060208501945060208101905062000572565b86831015620005b95784890151620005b5601f891682620004af565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005fd82620005d2565b9050919050565b6200060f81620005f1565b81146200061a575f80fd5b50565b5f815190506200062d8162000604565b92915050565b5f602082840312156200064b576200064a620005ce565b5b5f6200065a848285016200061d565b91505092915050565b614de880620006715f395ff3fe608060405234801561000f575f80fd5b50600436106101d8575f3560e01c806368ab7ab81161010257806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd1461057a578063d81f84b7146105aa578063e985e9c5146105da578063f2fde38b1461060a576101d8565b806395d89b4114610506578063a22cb46514610524578063b88d4fde14610540578063bc7ddd951461055c576101d8565b80637284e416116100dc5780637284e4161461047c5780637e0261c81461049a5780638da5cb5b146104ca5780638fc73484146104e8576101d8565b806368ab7ab81461041057806370a0823114610442578063715018a614610472576101d8565b80633361f0711161017a57806342966c681161014957806342966c681461036457806343ddfd57146103805780634f558e79146103b05780636352211e146103e0576101d8565b80633361f071146102cc57806334fb032e146102fc5780633ffbd47f1461032c57806342842e0e14610348576101d8565b8063095ea7b3116101b6578063095ea7b31461025a57806318160ddd1461027657806320c5429b1461029457806323b872dd146102b0576101d8565b806301ffc9a7146101dc57806306fdde031461020c578063081812fc1461022a575b5f80fd5b6101f660048036038101906101f191906127c8565b610626565b604051610203919061280d565b60405180910390f35b610214610707565b60405161022191906128b0565b60405180910390f35b610244600480360381019061023f9190612903565b610796565b604051610251919061296d565b60405180910390f35b610274600480360381019061026f91906129b0565b610817565b005b61027e61092d565b60405161028b91906129fd565b60405180910390f35b6102ae60048036038101906102a99190612903565b610933565b005b6102ca60048036038101906102c59190612a16565b6109bb565b005b6102e660048036038101906102e19190612903565b610a1b565b6040516102f39190612ab8565b60405180910390f35b61031660048036038101906103119190612b39565b610ac5565b604051610323919061296d565b60405180910390f35b61034660048036038101906103419190612b39565b610b0f565b005b610362600480360381019061035d9190612a16565b610dec565b005b61037e60048036038101906103799190612903565b610e0b565b005b61039a60048036038101906103959190612bb7565b610e67565b6040516103a791906129fd565b60405180910390f35b6103ca60048036038101906103c59190612903565b610e7c565b6040516103d7919061280d565b60405180910390f35b6103fa60048036038101906103f59190612903565b610e8d565b604051610407919061296d565b60405180910390f35b61042a60048036038101906104259190612903565b610f39565b60405161043993929190612be2565b60405180910390f35b61045c60048036038101906104579190612bb7565b61108a565b60405161046991906129fd565b60405180910390f35b61047a61113e565b005b6104846111c5565b60405161049191906128b0565b60405180910390f35b6104b460048036038101906104af9190612b39565b611251565b6040516104c191906129fd565b60405180910390f35b6104d261128b565b6040516104df919061296d565b60405180910390f35b6104f06112b3565b6040516104fd91906128b0565b60405180910390f35b61050e61133f565b60405161051b91906128b0565b60405180910390f35b61053e60048036038101906105399190612c4f565b6113cf565b005b61055a60048036038101906105559190612db5565b61154a565b005b6105646115ac565b6040516105719190612e90565b60405180910390f35b610594600480360381019061058f9190612903565b6115d1565b6040516105a191906128b0565b60405180910390f35b6105c460048036038101906105bf9190612903565b61172a565b6040516105d1919061296d565b60405180910390f35b6105f460048036038101906105ef9190612ea9565b611766565b604051610601919061280d565b60405180910390f35b610624600480360381019061061f9190612bb7565b6117f4565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061070057506106ff826118ea565b5b9050919050565b60605f805461071590612f14565b80601f016020809104026020016040519081016040528092919081815260200182805461074190612f14565b801561078c5780601f106107635761010080835404028352916020019161078c565b820191905f5260205f20905b81548152906001019060200180831161076f57829003601f168201915b5050505050905090565b5f6107a082611953565b6107df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d690612fb4565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61082182610e8d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088890613042565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108b06119bb565b73ffffffffffffffffffffffffffffffffffffffff1614806108df57506108de816108d96119bb565b611766565b5b61091e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610915906130d0565b60405180910390fd5b61092883836119c2565b505050565b60075481565b61093b6119bb565b73ffffffffffffffffffffffffffffffffffffffff1661095961128b565b73ffffffffffffffffffffffffffffffffffffffff16146109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613138565b60405180910390fd5b6109b881611a78565b50565b6109cc6109c66119bb565b82611b7f565b610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a02906131c6565b60405180910390fd5b610a16838383611c5b565b505050565b60605f610a7260095f8581526020019081526020015f206002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166014611eab565b905060095f8481526020019081526020015f205f0160095f8581526020019081526020015f2060010182604051602001610aae939291906138b1565b604051602081830303815290604052915050919050565b5f60095f610ad587878787611251565b81526020019081526020015f206002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050949350505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce85f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9d9190613921565b610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd390613996565b60405180910390fd5b5f8484905014158015610bf257505f8282905014155b610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c28906139fe565b60405180910390fd5b5f610c3e85858585611251565b90505f60095f8381526020019081526020015f205f018054610c5f90612f14565b9050148015610caa57505f600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054145b610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090613a66565b60405180910390fd5b848460095f8481526020019081526020015f205f019182610d0b929190613c10565b50828260095f8481526020019081526020015f206001019182610d2f929190613c10565b503360095f8381526020019081526020015f206002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610dce33826120e0565b60075f815480929190610de090613d0a565b91905055505050505050565b610e0683838360405180602001604052805f81525061154a565b505050565b610e1c610e166119bb565b82611b7f565b610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290613dc1565b60405180910390fd5b610e6481611a78565b50565b600a602052805f5260405f205f915090505481565b5f610e8682611953565b9050919050565b5f8060025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613e4f565b60405180910390fd5b80915050919050565b6009602052805f5260405f205f91509050805f018054610f5890612f14565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8490612f14565b8015610fcf5780601f10610fa657610100808354040283529160200191610fcf565b820191905f5260205f20905b815481529060010190602001808311610fb257829003601f168201915b505050505090806001018054610fe490612f14565b80601f016020809104026020016040519081016040528092919081815260200182805461101090612f14565b801561105b5780601f106110325761010080835404028352916020019161105b565b820191905f5260205f20905b81548152906001019060200180831161103e57829003601f168201915b505050505090806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090613edd565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6111466119bb565b73ffffffffffffffffffffffffffffffffffffffff1661116461128b565b73ffffffffffffffffffffffffffffffffffffffff16146111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b190613138565b60405180910390fd5b6111c35f6120fd565b565b600d80546111d290612f14565b80601f01602080910402602001604051908101604052809291908181526020018280546111fe90612f14565b80156112495780601f1061122057610100808354040283529160200191611249565b820191905f5260205f20905b81548152906001019060200180831161122c57829003601f168201915b505050505081565b5f848484846040516020016112699493929190613f1f565b604051602081830303815290604052805190602001205f1c9050949350505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c80546112c090612f14565b80601f01602080910402602001604051908101604052809291908181526020018280546112ec90612f14565b80156113375780601f1061130e57610100808354040283529160200191611337565b820191905f5260205f20905b81548152906001019060200180831161131a57829003601f168201915b505050505081565b60606001805461134e90612f14565b80601f016020809104026020016040519081016040528092919081815260200182805461137a90612f14565b80156113c55780601f1061139c576101008083540402835291602001916113c5565b820191905f5260205f20905b8154815290600101906020018083116113a857829003601f168201915b5050505050905090565b6113d76119bb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613f90565b60405180910390fd5b8060055f6114506119bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114f96119bb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161153e919061280d565b60405180910390a35050565b61155b6115556119bb565b83611b7f565b61159a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611591906131c6565b60405180910390fd5b6115a6848484846121c0565b50505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606115dc82611953565b61161b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116129061401e565b60405180910390fd5b5f61162d61162884610a1b565b61221c565b60405160200161163d9190614086565b60405160208183030381529060405290505f6116a360095f8681526020019081526020015f206002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166014611eab565b90505f60095f8681526020019081526020015f205f0160095f8781526020019081526020015f20600101836040516020016116e09392919061431f565b60405160208183030381529060405290505f82600d8584600c60405160200161170d9594939291906146c5565b604051602081830303815290604052905080945050505050919050565b5f60095f8381526020019081526020015f206002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6117fc6119bb565b73ffffffffffffffffffffffffffffffffffffffff1661181a61128b565b73ffffffffffffffffffffffffffffffffffffffff1614611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790613138565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590614803565b60405180910390fd5b6118e7816120fd565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a3283610e8d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f611a8282610e8d565b9050611a8f815f846123ac565b611a995f836119c2565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ae69190614821565b9250508190555060025f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055815f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f611b8982611953565b611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf906148c4565b60405180910390fd5b5f611bd283610e8d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c4157508373ffffffffffffffffffffffffffffffffffffffff16611c2984610796565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c525750611c518185611766565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c7b82610e8d565b73ffffffffffffffffffffffffffffffffffffffff1614611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc890614952565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d36906149e0565b60405180910390fd5b611d4a8383836123ac565b611d545f826119c2565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611da19190614821565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611df591906149fe565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60605f6002836002611ebd9190614a31565b611ec791906149fe565b67ffffffffffffffff811115611ee057611edf612c91565b5b6040519080825280601f01601f191660200182016040528015611f125781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611f4957611f48614a72565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611fac57611fab614a72565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611fea9190614a31565b611ff491906149fe565b90505b6001811115612093577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061203657612035614a72565b5b1a60f81b82828151811061204d5761204c614a72565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c94508061208c90614a9f565b9050611ff7565b505f84146120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd90614b10565b60405180910390fd5b8091505092915050565b6120f9828260405180602001604052805f8152506123b1565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121cb848484611c5b565b6121d78484848461240b565b612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90614b9e565b60405180910390fd5b50505050565b60605f825190505f81036122415760405180602001604052805f8152509150506123a7565b5f600360028361225191906149fe565b61225b9190614be9565b60046122679190614a31565b90505f60208261227791906149fe565b67ffffffffffffffff8111156122905761228f612c91565b5b6040519080825280601f01601f1916602001820160405280156122c25781602001600182028036833780820191505090505b5090505f604051806060016040528060408152602001614d7360409139905060018101602083015f5b868110156123645760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506122eb565b50600386066001811461237e576002811461238e57612399565b613d3d60f01b6002830352612399565b603d60f81b60018303525b508484525050819450505050505b919050565b505050565b6123bb838361258d565b6123c75f84848461240b565b612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd90614b9e565b60405180910390fd5b505050565b5f61242b8473ffffffffffffffffffffffffffffffffffffffff16612751565b15612580578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124546119bb565b8786866040518563ffffffff1660e01b81526004016124769493929190614c19565b6020604051808303815f875af19250505080156124b157506040513d601f19601f820116820180604052508101906124ae9190614c77565b60015b612530573d805f81146124df576040519150601f19603f3d011682016040523d82523d5f602084013e6124e4565b606091505b505f815103612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90614b9e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612585565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f290614cec565b60405180910390fd5b61260481611953565b15612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90614d54565b60405180910390fd5b61264f5f83836123ac565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461269c91906149fe565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f80823b90505f8111915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127a781612773565b81146127b1575f80fd5b50565b5f813590506127c28161279e565b92915050565b5f602082840312156127dd576127dc61276b565b5b5f6127ea848285016127b4565b91505092915050565b5f8115159050919050565b612807816127f3565b82525050565b5f6020820190506128205f8301846127fe565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561285d578082015181840152602081019050612842565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61288282612826565b61288c8185612830565b935061289c818560208601612840565b6128a581612868565b840191505092915050565b5f6020820190508181035f8301526128c88184612878565b905092915050565b5f819050919050565b6128e2816128d0565b81146128ec575f80fd5b50565b5f813590506128fd816128d9565b92915050565b5f602082840312156129185761291761276b565b5b5f612925848285016128ef565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6129578261292e565b9050919050565b6129678161294d565b82525050565b5f6020820190506129805f83018461295e565b92915050565b61298f8161294d565b8114612999575f80fd5b50565b5f813590506129aa81612986565b92915050565b5f80604083850312156129c6576129c561276b565b5b5f6129d38582860161299c565b92505060206129e4858286016128ef565b9150509250929050565b6129f7816128d0565b82525050565b5f602082019050612a105f8301846129ee565b92915050565b5f805f60608486031215612a2d57612a2c61276b565b5b5f612a3a8682870161299c565b9350506020612a4b8682870161299c565b9250506040612a5c868287016128ef565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f612a8a82612a66565b612a948185612a70565b9350612aa4818560208601612840565b612aad81612868565b840191505092915050565b5f6020820190508181035f830152612ad08184612a80565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612af957612af8612ad8565b5b8235905067ffffffffffffffff811115612b1657612b15612adc565b5b602083019150836001820283011115612b3257612b31612ae0565b5b9250929050565b5f805f8060408587031215612b5157612b5061276b565b5b5f85013567ffffffffffffffff811115612b6e57612b6d61276f565b5b612b7a87828801612ae4565b9450945050602085013567ffffffffffffffff811115612b9d57612b9c61276f565b5b612ba987828801612ae4565b925092505092959194509250565b5f60208284031215612bcc57612bcb61276b565b5b5f612bd98482850161299c565b91505092915050565b5f6060820190508181035f830152612bfa8186612878565b90508181036020830152612c0e8185612878565b9050612c1d604083018461295e565b949350505050565b612c2e816127f3565b8114612c38575f80fd5b50565b5f81359050612c4981612c25565b92915050565b5f8060408385031215612c6557612c6461276b565b5b5f612c728582860161299c565b9250506020612c8385828601612c3b565b9150509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612cc782612868565b810181811067ffffffffffffffff82111715612ce657612ce5612c91565b5b80604052505050565b5f612cf8612762565b9050612d048282612cbe565b919050565b5f67ffffffffffffffff821115612d2357612d22612c91565b5b612d2c82612868565b9050602081019050919050565b828183375f83830152505050565b5f612d59612d5484612d09565b612cef565b905082815260208101848484011115612d7557612d74612c8d565b5b612d80848285612d39565b509392505050565b5f82601f830112612d9c57612d9b612ad8565b5b8135612dac848260208601612d47565b91505092915050565b5f805f8060808587031215612dcd57612dcc61276b565b5b5f612dda8782880161299c565b9450506020612deb8782880161299c565b9350506040612dfc878288016128ef565b925050606085013567ffffffffffffffff811115612e1d57612e1c61276f565b5b612e2987828801612d88565b91505092959194509250565b5f819050919050565b5f612e58612e53612e4e8461292e565b612e35565b61292e565b9050919050565b5f612e6982612e3e565b9050919050565b5f612e7a82612e5f565b9050919050565b612e8a81612e70565b82525050565b5f602082019050612ea35f830184612e81565b92915050565b5f8060408385031215612ebf57612ebe61276b565b5b5f612ecc8582860161299c565b9250506020612edd8582860161299c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612f2b57607f821691505b602082108103612f3e57612f3d612ee7565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f612f9e602c83612830565b9150612fa982612f44565b604082019050919050565b5f6020820190508181035f830152612fcb81612f92565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f61302c602183612830565b915061303782612fd2565b604082019050919050565b5f6020820190508181035f83015261305981613020565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f6130ba603883612830565b91506130c582613060565b604082019050919050565b5f6020820190508181035f8301526130e7816130ae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613122602083612830565b915061312d826130ee565b602082019050919050565b5f6020820190508181035f83015261314f81613116565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f6131b0603183612830565b91506131bb82613156565b604082019050919050565b5f6020820190508181035f8301526131dd816131a4565b9050919050565b5f81905092915050565b7f3c7376672076696577426f783d2230203020333830203235302220786d6c6e735f8201527f3d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c7360208201527f74796c653e2e6b7b646f6d696e616e742d626173656c696e653a6d6964646c6560408201527f3b746578742d616e63686f723a6d6964646c653b666f6e742d73697a653a343060608201527f70783b666f6e742d66616d696c793a73657269667d2e6e7b66696c6c3a23653760808201527f346436313b666f6e742d66616d696c793a6d6f6e6f73706163653b666f6e742d60a08201527f73697a653a333070787d2e617b66696c6c3a236537346436313b666f6e742d6660c08201527f616d696c793a6d6f6e6f73706163653b666f6e742d73697a653a313170787d3c60e08201527f2f7374796c653e3c7265637420783d22302220793d2230222077696474683d226101008201527f33383022206865696768743d22323530222066696c6c3d2223663166316431226101208201527f207374726f6b653d2223303032313530223e3c2f726563743e3c7265637420786101408201527f3d2231302220793d223130222077696474683d2233363022206865696768743d6101608201527f2232333022207374726f6b653d2223303032313530222066696c6c3d226e6f6e6101808201527f65222072783d223135223e3c2f726563743e3c7265637420783d2231352220796101a08201527f3d223135222077696474683d2233353022206865696768743d223232302220736101c08201527f74726f6b653d2223303032313530222066696c6c3d226e6f6e65222072783d226101e08201527f3135223e3c2f726563743e3c7265637420783d2231352220793d2231352220776102008201527f696474683d2233353022206865696768743d223530222066696c6c3d222334336102208201527f36386132222072783d22313522207374726f6b653d2223303032313530223e3c6102408201527f2f726563743e3c7265637420783d2231352e352220793d2235302220776964746102608201527f683d2233343922206865696768743d223135222066696c6c3d222334333638616102808201527f3222203e3c2f726563743e3c6c696e652078313d223135222079313d223635226102a08201527f2078323d22333635222079323d22363522207374726f6b653d222330303231356102c08201527f30223e3c2f6c696e653e3c7465787420783d223139322220793d2234372220636102e08201527f6c6173733d226b222066696c6c3d2223303832323632223e4b59433c2f7465786103008201527f743e3c7465787420783d223139312220793d2234362220636c6173733d226b226103208201527f2066696c6c3d2223303832323632223e4b59433c2f746578743e3c74657874206103408201527f783d223139302220793d2234352220636c6173733d226b222066696c6c3d22236103608201527f66626637656422207374726f6b653d2223303032313530223e4b59433c2f74656103808201527f78743e3c7465787420636c6173733d226e206b2220783d223530252220793d226103a08201527f313139223e0000000000000000000000000000000000000000000000000000006103c082015250565b5f6136ae6103c5836131e4565b91506136b9826131ee565b6103c582019050919050565b5f819050815f5260205f209050919050565b5f81546136e381612f14565b6136ed81866131e4565b9450600182165f8114613707576001811461371c5761374e565b60ff198316865281151582028601935061374e565b613725856136c5565b5f5b8381101561374657815481890152600182019150602081019050613727565b838801955050505b50505092915050565b7f3c2f746578743e3c7465787420636c6173733d226e206b2220783d22353025225f8201527f20793d22313536223e0000000000000000000000000000000000000000000000602082015250565b5f6137b16029836131e4565b91506137bc82613757565b602982019050919050565b7f3c2f746578743e3c7465787420636c6173733d2261206b2220783d22353025225f8201527f20793d22323130223e0000000000000000000000000000000000000000000000602082015250565b5f6138216029836131e4565b915061382c826137c7565b602982019050919050565b5f61384182612826565b61384b81856131e4565b935061385b818560208601612840565b80840191505092915050565b7f3c2f746578743e3c2f7376673e000000000000000000000000000000000000005f82015250565b5f61389b600d836131e4565b91506138a682613867565b600d82019050919050565b5f6138bb826136a1565b91506138c782866136d7565b91506138d2826137a5565b91506138de82856136d7565b91506138e982613815565b91506138f58284613837565b91506139008261388f565b9150819050949350505050565b5f8151905061391b81612c25565b92915050565b5f602082840312156139365761393561276b565b5b5f6139438482850161390d565b91505092915050565b7f4b5943206d696e7420756e617661696c61626c650000000000000000000000005f82015250565b5f613980601483612830565b915061398b8261394c565b602082019050919050565b5f6020820190508181035f8301526139ad81613974565b9050919050565b7f496e76616c6964204b594320696e666f000000000000000000000000000000005f82015250565b5f6139e8601083612830565b91506139f3826139b4565b602082019050919050565b5f6020820190508181035f830152613a15816139dc565b9050919050565b7f4b594320616c72656164792072656769737465726564000000000000000000005f82015250565b5f613a50601683612830565b9150613a5b82613a1c565b602082019050919050565b5f6020820190508181035f830152613a7d81613a44565b9050919050565b5f82905092915050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613ad87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a9d565b613ae28683613a9d565b95508019841693508086168417925050509392505050565b5f613b14613b0f613b0a846128d0565b612e35565b6128d0565b9050919050565b5f819050919050565b613b2d83613afa565b613b41613b3982613b1b565b848454613aa9565b825550505050565b5f90565b613b55613b49565b613b60818484613b24565b505050565b5b81811015613b8357613b785f82613b4d565b600181019050613b66565b5050565b601f821115613bc857613b99816136c5565b613ba284613a8e565b81016020851015613bb1578190505b613bc5613bbd85613a8e565b830182613b65565b50505b505050565b5f82821c905092915050565b5f613be85f1984600802613bcd565b1980831691505092915050565b5f613c008383613bd9565b9150826002028217905092915050565b613c1a8383613a84565b67ffffffffffffffff811115613c3357613c32612c91565b5b613c3d8254612f14565b613c48828285613b87565b5f601f831160018114613c75575f8415613c63578287013590505b613c6d8582613bf5565b865550613cd4565b601f198416613c83866136c5565b5f5b82811015613caa57848901358255600182019150602085019450602081019050613c85565b86831015613cc75784890135613cc3601f891682613bd9565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613d14826128d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4657613d45613cdd565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f613dab602d83612830565b9150613db682613d51565b604082019050919050565b5f6020820190508181035f830152613dd881613d9f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f613e39602983612830565b9150613e4482613ddf565b604082019050919050565b5f6020820190508181035f830152613e6681613e2d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f613ec7602a83612830565b9150613ed282613e6d565b604082019050919050565b5f6020820190508181035f830152613ef481613ebb565b9050919050565b5f613f0683856131e4565b9350613f13838584612d39565b82840190509392505050565b5f613f2b828688613efb565b9150613f38828486613efb565b915081905095945050505050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f613f7a601983612830565b9150613f8582613f46565b602082019050919050565b5f6020820190508181035f830152613fa781613f6e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f614008602f83612830565b915061401382613fae565b604082019050919050565b5f6020820190508181035f83015261403581613ffc565b9050919050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000005f82015250565b5f614070601a836131e4565b915061407b8261403c565b601a82019050919050565b5f61409082614064565b915061409c8284613837565b915081905092915050565b7f5b000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6140db6001836131e4565b91506140e6826140a7565b600182019050919050565b7f7b2274726169745f74797065223a20224669727374204e616d65222c202276615f8201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b5f61414b6027836131e4565b9150614156826140f1565b602782019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6141956003836131e4565b91506141a082614161565b600382019050919050565b7f7b2274726169745f74797065223a20224c617374204e616d65222c202276616c5f8201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b5f6142056026836131e4565b9150614210826141ab565b602682019050919050565b7f7b2274726169745f74797065223a202241646472657373222c202276616c75655f8201527f223a202200000000000000000000000000000000000000000000000000000000602082015250565b5f6142756024836131e4565b91506142808261421b565b602482019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6142bf6002836131e4565b91506142ca8261428b565b600282019050919050565b7f5d000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6143096001836131e4565b9150614314826142d5565b600182019050919050565b5f614329826140cf565b91506143348261413f565b915061434082866136d7565b915061434b82614189565b9150614356826141f9565b915061436282856136d7565b915061436d82614189565b915061437882614269565b91506143848284613837565b915061438f826142b3565b915061439a826142fd565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f6143db601b836131e4565b91506143e6826143a7565b601b82019050919050565b7f7b226e616d65223a20224b5943200000000000000000000000000000000000005f82015250565b5f614425600e836131e4565b9150614430826143f1565b600e82019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f61446f6002836131e4565b915061447a8261443b565b600282019050919050565b7f226465736372697074696f6e223a2022000000000000000000000000000000005f82015250565b5f6144b96010836131e4565b91506144c482614485565b601082019050919050565b7f22696d616765223a2022000000000000000000000000000000000000000000005f82015250565b5f614503600a836131e4565b915061450e826144cf565b600a82019050919050565b5f81905092915050565b5f61452d82612a66565b6145378185614519565b9350614547818560208601612840565b80840191505092915050565b7f2261747472696275746573223a200000000000000000000000000000000000005f82015250565b5f614587600e836131e4565b915061459282614553565b600e82019050919050565b7f2c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6145d16001836131e4565b91506145dc8261459d565b600182019050919050565b7f2265787465726e616c5f75726c223a20220000000000000000000000000000005f82015250565b5f61461b6011836131e4565b9150614626826145e7565b601182019050919050565b7f22000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6146656001836131e4565b915061467082614631565b600182019050919050565b7f7d000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6146af6001836131e4565b91506146ba8261467b565b600182019050919050565b5f6146cf826143cf565b91506146da82614419565b91506146e68288613837565b91506146f182614463565b91506146fc826144ad565b915061470882876136d7565b915061471382614463565b915061471e826144f7565b915061472a8286614523565b915061473582614463565b91506147408261457b565b915061474c8285614523565b9150614757826145c5565b91506147628261460f565b915061476e82846136d7565b915061477982614659565b9150614784826146a3565b91508190509695505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6147ed602683612830565b91506147f882614793565b604082019050919050565b5f6020820190508181035f83015261481a816147e1565b9050919050565b5f61482b826128d0565b9150614836836128d0565b925082820390508181111561484e5761484d613cdd565b5b92915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f6148ae602c83612830565b91506148b982614854565b604082019050919050565b5f6020820190508181035f8301526148db816148a2565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e207468617420695f8201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b5f61493c602983612830565b9150614947826148e2565b604082019050919050565b5f6020820190508181035f83015261496981614930565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6149ca602483612830565b91506149d582614970565b604082019050919050565b5f6020820190508181035f8301526149f7816149be565b9050919050565b5f614a08826128d0565b9150614a13836128d0565b9250828201905080821115614a2b57614a2a613cdd565b5b92915050565b5f614a3b826128d0565b9150614a46836128d0565b9250828202614a54816128d0565b91508282048414831517614a6b57614a6a613cdd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614aa9826128d0565b91505f8203614abb57614aba613cdd565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f614afa602083612830565b9150614b0582614ac6565b602082019050919050565b5f6020820190508181035f830152614b2781614aee565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f614b88603283612830565b9150614b9382614b2e565b604082019050919050565b5f6020820190508181035f830152614bb581614b7c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614bf3826128d0565b9150614bfe836128d0565b925082614c0e57614c0d614bbc565b5b828204905092915050565b5f608082019050614c2c5f83018761295e565b614c39602083018661295e565b614c4660408301856129ee565b8181036060830152614c588184612a80565b905095945050505050565b5f81519050614c718161279e565b92915050565b5f60208284031215614c8c57614c8b61276b565b5b5f614c9984828501614c63565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614cd6602083612830565b9150614ce182614ca2565b602082019050919050565b5f6020820190508181035f830152614d0381614cca565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f614d3e601c83612830565b9150614d4982614d0a565b602082019050919050565b5f6020820190508181035f830152614d6b81614d32565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220447d2ae503037700815174ee63812641b5c62cb2a62e93a8cd8bc1218affb3b964736f6c634300081700330000000000000000000000007102653225d537e2fe703723ad83edfeb606396e

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101d8575f3560e01c806368ab7ab81161010257806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd1461057a578063d81f84b7146105aa578063e985e9c5146105da578063f2fde38b1461060a576101d8565b806395d89b4114610506578063a22cb46514610524578063b88d4fde14610540578063bc7ddd951461055c576101d8565b80637284e416116100dc5780637284e4161461047c5780637e0261c81461049a5780638da5cb5b146104ca5780638fc73484146104e8576101d8565b806368ab7ab81461041057806370a0823114610442578063715018a614610472576101d8565b80633361f0711161017a57806342966c681161014957806342966c681461036457806343ddfd57146103805780634f558e79146103b05780636352211e146103e0576101d8565b80633361f071146102cc57806334fb032e146102fc5780633ffbd47f1461032c57806342842e0e14610348576101d8565b8063095ea7b3116101b6578063095ea7b31461025a57806318160ddd1461027657806320c5429b1461029457806323b872dd146102b0576101d8565b806301ffc9a7146101dc57806306fdde031461020c578063081812fc1461022a575b5f80fd5b6101f660048036038101906101f191906127c8565b610626565b604051610203919061280d565b60405180910390f35b610214610707565b60405161022191906128b0565b60405180910390f35b610244600480360381019061023f9190612903565b610796565b604051610251919061296d565b60405180910390f35b610274600480360381019061026f91906129b0565b610817565b005b61027e61092d565b60405161028b91906129fd565b60405180910390f35b6102ae60048036038101906102a99190612903565b610933565b005b6102ca60048036038101906102c59190612a16565b6109bb565b005b6102e660048036038101906102e19190612903565b610a1b565b6040516102f39190612ab8565b60405180910390f35b61031660048036038101906103119190612b39565b610ac5565b604051610323919061296d565b60405180910390f35b61034660048036038101906103419190612b39565b610b0f565b005b610362600480360381019061035d9190612a16565b610dec565b005b61037e60048036038101906103799190612903565b610e0b565b005b61039a60048036038101906103959190612bb7565b610e67565b6040516103a791906129fd565b60405180910390f35b6103ca60048036038101906103c59190612903565b610e7c565b6040516103d7919061280d565b60405180910390f35b6103fa60048036038101906103f59190612903565b610e8d565b604051610407919061296d565b60405180910390f35b61042a60048036038101906104259190612903565b610f39565b60405161043993929190612be2565b60405180910390f35b61045c60048036038101906104579190612bb7565b61108a565b60405161046991906129fd565b60405180910390f35b61047a61113e565b005b6104846111c5565b60405161049191906128b0565b60405180910390f35b6104b460048036038101906104af9190612b39565b611251565b6040516104c191906129fd565b60405180910390f35b6104d261128b565b6040516104df919061296d565b60405180910390f35b6104f06112b3565b6040516104fd91906128b0565b60405180910390f35b61050e61133f565b60405161051b91906128b0565b60405180910390f35b61053e60048036038101906105399190612c4f565b6113cf565b005b61055a60048036038101906105559190612db5565b61154a565b005b6105646115ac565b6040516105719190612e90565b60405180910390f35b610594600480360381019061058f9190612903565b6115d1565b6040516105a191906128b0565b60405180910390f35b6105c460048036038101906105bf9190612903565b61172a565b6040516105d1919061296d565b60405180910390f35b6105f460048036038101906105ef9190612ea9565b611766565b604051610601919061280d565b60405180910390f35b610624600480360381019061061f9190612bb7565b6117f4565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061070057506106ff826118ea565b5b9050919050565b60605f805461071590612f14565b80601f016020809104026020016040519081016040528092919081815260200182805461074190612f14565b801561078c5780601f106107635761010080835404028352916020019161078c565b820191905f5260205f20905b81548152906001019060200180831161076f57829003601f168201915b5050505050905090565b5f6107a082611953565b6107df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d690612fb4565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61082182610e8d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088890613042565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108b06119bb565b73ffffffffffffffffffffffffffffffffffffffff1614806108df57506108de816108d96119bb565b611766565b5b61091e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610915906130d0565b60405180910390fd5b61092883836119c2565b505050565b60075481565b61093b6119bb565b73ffffffffffffffffffffffffffffffffffffffff1661095961128b565b73ffffffffffffffffffffffffffffffffffffffff16146109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613138565b60405180910390fd5b6109b881611a78565b50565b6109cc6109c66119bb565b82611b7f565b610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a02906131c6565b60405180910390fd5b610a16838383611c5b565b505050565b60605f610a7260095f8581526020019081526020015f206002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166014611eab565b905060095f8481526020019081526020015f205f0160095f8581526020019081526020015f2060010182604051602001610aae939291906138b1565b604051602081830303815290604052915050919050565b5f60095f610ad587878787611251565b81526020019081526020015f206002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050949350505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce85f36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9d9190613921565b610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd390613996565b60405180910390fd5b5f8484905014158015610bf257505f8282905014155b610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c28906139fe565b60405180910390fd5b5f610c3e85858585611251565b90505f60095f8381526020019081526020015f205f018054610c5f90612f14565b9050148015610caa57505f600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054145b610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090613a66565b60405180910390fd5b848460095f8481526020019081526020015f205f019182610d0b929190613c10565b50828260095f8481526020019081526020015f206001019182610d2f929190613c10565b503360095f8381526020019081526020015f206002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610dce33826120e0565b60075f815480929190610de090613d0a565b91905055505050505050565b610e0683838360405180602001604052805f81525061154a565b505050565b610e1c610e166119bb565b82611b7f565b610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290613dc1565b60405180910390fd5b610e6481611a78565b50565b600a602052805f5260405f205f915090505481565b5f610e8682611953565b9050919050565b5f8060025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790613e4f565b60405180910390fd5b80915050919050565b6009602052805f5260405f205f91509050805f018054610f5890612f14565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8490612f14565b8015610fcf5780601f10610fa657610100808354040283529160200191610fcf565b820191905f5260205f20905b815481529060010190602001808311610fb257829003601f168201915b505050505090806001018054610fe490612f14565b80601f016020809104026020016040519081016040528092919081815260200182805461101090612f14565b801561105b5780601f106110325761010080835404028352916020019161105b565b820191905f5260205f20905b81548152906001019060200180831161103e57829003601f168201915b505050505090806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090613edd565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6111466119bb565b73ffffffffffffffffffffffffffffffffffffffff1661116461128b565b73ffffffffffffffffffffffffffffffffffffffff16146111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b190613138565b60405180910390fd5b6111c35f6120fd565b565b600d80546111d290612f14565b80601f01602080910402602001604051908101604052809291908181526020018280546111fe90612f14565b80156112495780601f1061122057610100808354040283529160200191611249565b820191905f5260205f20905b81548152906001019060200180831161122c57829003601f168201915b505050505081565b5f848484846040516020016112699493929190613f1f565b604051602081830303815290604052805190602001205f1c9050949350505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c80546112c090612f14565b80601f01602080910402602001604051908101604052809291908181526020018280546112ec90612f14565b80156113375780601f1061130e57610100808354040283529160200191611337565b820191905f5260205f20905b81548152906001019060200180831161131a57829003601f168201915b505050505081565b60606001805461134e90612f14565b80601f016020809104026020016040519081016040528092919081815260200182805461137a90612f14565b80156113c55780601f1061139c576101008083540402835291602001916113c5565b820191905f5260205f20905b8154815290600101906020018083116113a857829003601f168201915b5050505050905090565b6113d76119bb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613f90565b60405180910390fd5b8060055f6114506119bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114f96119bb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161153e919061280d565b60405180910390a35050565b61155b6115556119bb565b83611b7f565b61159a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611591906131c6565b60405180910390fd5b6115a6848484846121c0565b50505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606115dc82611953565b61161b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116129061401e565b60405180910390fd5b5f61162d61162884610a1b565b61221c565b60405160200161163d9190614086565b60405160208183030381529060405290505f6116a360095f8681526020019081526020015f206002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166014611eab565b90505f60095f8681526020019081526020015f205f0160095f8781526020019081526020015f20600101836040516020016116e09392919061431f565b60405160208183030381529060405290505f82600d8584600c60405160200161170d9594939291906146c5565b604051602081830303815290604052905080945050505050919050565b5f60095f8381526020019081526020015f206002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6117fc6119bb565b73ffffffffffffffffffffffffffffffffffffffff1661181a61128b565b73ffffffffffffffffffffffffffffffffffffffff1614611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790613138565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590614803565b60405180910390fd5b6118e7816120fd565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a3283610e8d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f611a8282610e8d565b9050611a8f815f846123ac565b611a995f836119c2565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ae69190614821565b9250508190555060025f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055815f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f611b8982611953565b611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf906148c4565b60405180910390fd5b5f611bd283610e8d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c4157508373ffffffffffffffffffffffffffffffffffffffff16611c2984610796565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c525750611c518185611766565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c7b82610e8d565b73ffffffffffffffffffffffffffffffffffffffff1614611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc890614952565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d36906149e0565b60405180910390fd5b611d4a8383836123ac565b611d545f826119c2565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611da19190614821565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611df591906149fe565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60605f6002836002611ebd9190614a31565b611ec791906149fe565b67ffffffffffffffff811115611ee057611edf612c91565b5b6040519080825280601f01601f191660200182016040528015611f125781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611f4957611f48614a72565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611fac57611fab614a72565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611fea9190614a31565b611ff491906149fe565b90505b6001811115612093577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061203657612035614a72565b5b1a60f81b82828151811061204d5761204c614a72565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c94508061208c90614a9f565b9050611ff7565b505f84146120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd90614b10565b60405180910390fd5b8091505092915050565b6120f9828260405180602001604052805f8152506123b1565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121cb848484611c5b565b6121d78484848461240b565b612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90614b9e565b60405180910390fd5b50505050565b60605f825190505f81036122415760405180602001604052805f8152509150506123a7565b5f600360028361225191906149fe565b61225b9190614be9565b60046122679190614a31565b90505f60208261227791906149fe565b67ffffffffffffffff8111156122905761228f612c91565b5b6040519080825280601f01601f1916602001820160405280156122c25781602001600182028036833780820191505090505b5090505f604051806060016040528060408152602001614d7360409139905060018101602083015f5b868110156123645760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506122eb565b50600386066001811461237e576002811461238e57612399565b613d3d60f01b6002830352612399565b603d60f81b60018303525b508484525050819450505050505b919050565b505050565b6123bb838361258d565b6123c75f84848461240b565b612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd90614b9e565b60405180910390fd5b505050565b5f61242b8473ffffffffffffffffffffffffffffffffffffffff16612751565b15612580578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124546119bb565b8786866040518563ffffffff1660e01b81526004016124769493929190614c19565b6020604051808303815f875af19250505080156124b157506040513d601f19601f820116820180604052508101906124ae9190614c77565b60015b612530573d805f81146124df576040519150601f19603f3d011682016040523d82523d5f602084013e6124e4565b606091505b505f815103612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90614b9e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612585565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f290614cec565b60405180910390fd5b61260481611953565b15612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90614d54565b60405180910390fd5b61264f5f83836123ac565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461269c91906149fe565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f80823b90505f8111915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127a781612773565b81146127b1575f80fd5b50565b5f813590506127c28161279e565b92915050565b5f602082840312156127dd576127dc61276b565b5b5f6127ea848285016127b4565b91505092915050565b5f8115159050919050565b612807816127f3565b82525050565b5f6020820190506128205f8301846127fe565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561285d578082015181840152602081019050612842565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61288282612826565b61288c8185612830565b935061289c818560208601612840565b6128a581612868565b840191505092915050565b5f6020820190508181035f8301526128c88184612878565b905092915050565b5f819050919050565b6128e2816128d0565b81146128ec575f80fd5b50565b5f813590506128fd816128d9565b92915050565b5f602082840312156129185761291761276b565b5b5f612925848285016128ef565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6129578261292e565b9050919050565b6129678161294d565b82525050565b5f6020820190506129805f83018461295e565b92915050565b61298f8161294d565b8114612999575f80fd5b50565b5f813590506129aa81612986565b92915050565b5f80604083850312156129c6576129c561276b565b5b5f6129d38582860161299c565b92505060206129e4858286016128ef565b9150509250929050565b6129f7816128d0565b82525050565b5f602082019050612a105f8301846129ee565b92915050565b5f805f60608486031215612a2d57612a2c61276b565b5b5f612a3a8682870161299c565b9350506020612a4b8682870161299c565b9250506040612a5c868287016128ef565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f612a8a82612a66565b612a948185612a70565b9350612aa4818560208601612840565b612aad81612868565b840191505092915050565b5f6020820190508181035f830152612ad08184612a80565b905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612af957612af8612ad8565b5b8235905067ffffffffffffffff811115612b1657612b15612adc565b5b602083019150836001820283011115612b3257612b31612ae0565b5b9250929050565b5f805f8060408587031215612b5157612b5061276b565b5b5f85013567ffffffffffffffff811115612b6e57612b6d61276f565b5b612b7a87828801612ae4565b9450945050602085013567ffffffffffffffff811115612b9d57612b9c61276f565b5b612ba987828801612ae4565b925092505092959194509250565b5f60208284031215612bcc57612bcb61276b565b5b5f612bd98482850161299c565b91505092915050565b5f6060820190508181035f830152612bfa8186612878565b90508181036020830152612c0e8185612878565b9050612c1d604083018461295e565b949350505050565b612c2e816127f3565b8114612c38575f80fd5b50565b5f81359050612c4981612c25565b92915050565b5f8060408385031215612c6557612c6461276b565b5b5f612c728582860161299c565b9250506020612c8385828601612c3b565b9150509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612cc782612868565b810181811067ffffffffffffffff82111715612ce657612ce5612c91565b5b80604052505050565b5f612cf8612762565b9050612d048282612cbe565b919050565b5f67ffffffffffffffff821115612d2357612d22612c91565b5b612d2c82612868565b9050602081019050919050565b828183375f83830152505050565b5f612d59612d5484612d09565b612cef565b905082815260208101848484011115612d7557612d74612c8d565b5b612d80848285612d39565b509392505050565b5f82601f830112612d9c57612d9b612ad8565b5b8135612dac848260208601612d47565b91505092915050565b5f805f8060808587031215612dcd57612dcc61276b565b5b5f612dda8782880161299c565b9450506020612deb8782880161299c565b9350506040612dfc878288016128ef565b925050606085013567ffffffffffffffff811115612e1d57612e1c61276f565b5b612e2987828801612d88565b91505092959194509250565b5f819050919050565b5f612e58612e53612e4e8461292e565b612e35565b61292e565b9050919050565b5f612e6982612e3e565b9050919050565b5f612e7a82612e5f565b9050919050565b612e8a81612e70565b82525050565b5f602082019050612ea35f830184612e81565b92915050565b5f8060408385031215612ebf57612ebe61276b565b5b5f612ecc8582860161299c565b9250506020612edd8582860161299c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612f2b57607f821691505b602082108103612f3e57612f3d612ee7565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f612f9e602c83612830565b9150612fa982612f44565b604082019050919050565b5f6020820190508181035f830152612fcb81612f92565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f61302c602183612830565b915061303782612fd2565b604082019050919050565b5f6020820190508181035f83015261305981613020565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f6130ba603883612830565b91506130c582613060565b604082019050919050565b5f6020820190508181035f8301526130e7816130ae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613122602083612830565b915061312d826130ee565b602082019050919050565b5f6020820190508181035f83015261314f81613116565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f6131b0603183612830565b91506131bb82613156565b604082019050919050565b5f6020820190508181035f8301526131dd816131a4565b9050919050565b5f81905092915050565b7f3c7376672076696577426f783d2230203020333830203235302220786d6c6e735f8201527f3d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c7360208201527f74796c653e2e6b7b646f6d696e616e742d626173656c696e653a6d6964646c6560408201527f3b746578742d616e63686f723a6d6964646c653b666f6e742d73697a653a343060608201527f70783b666f6e742d66616d696c793a73657269667d2e6e7b66696c6c3a23653760808201527f346436313b666f6e742d66616d696c793a6d6f6e6f73706163653b666f6e742d60a08201527f73697a653a333070787d2e617b66696c6c3a236537346436313b666f6e742d6660c08201527f616d696c793a6d6f6e6f73706163653b666f6e742d73697a653a313170787d3c60e08201527f2f7374796c653e3c7265637420783d22302220793d2230222077696474683d226101008201527f33383022206865696768743d22323530222066696c6c3d2223663166316431226101208201527f207374726f6b653d2223303032313530223e3c2f726563743e3c7265637420786101408201527f3d2231302220793d223130222077696474683d2233363022206865696768743d6101608201527f2232333022207374726f6b653d2223303032313530222066696c6c3d226e6f6e6101808201527f65222072783d223135223e3c2f726563743e3c7265637420783d2231352220796101a08201527f3d223135222077696474683d2233353022206865696768743d223232302220736101c08201527f74726f6b653d2223303032313530222066696c6c3d226e6f6e65222072783d226101e08201527f3135223e3c2f726563743e3c7265637420783d2231352220793d2231352220776102008201527f696474683d2233353022206865696768743d223530222066696c6c3d222334336102208201527f36386132222072783d22313522207374726f6b653d2223303032313530223e3c6102408201527f2f726563743e3c7265637420783d2231352e352220793d2235302220776964746102608201527f683d2233343922206865696768743d223135222066696c6c3d222334333638616102808201527f3222203e3c2f726563743e3c6c696e652078313d223135222079313d223635226102a08201527f2078323d22333635222079323d22363522207374726f6b653d222330303231356102c08201527f30223e3c2f6c696e653e3c7465787420783d223139322220793d2234372220636102e08201527f6c6173733d226b222066696c6c3d2223303832323632223e4b59433c2f7465786103008201527f743e3c7465787420783d223139312220793d2234362220636c6173733d226b226103208201527f2066696c6c3d2223303832323632223e4b59433c2f746578743e3c74657874206103408201527f783d223139302220793d2234352220636c6173733d226b222066696c6c3d22236103608201527f66626637656422207374726f6b653d2223303032313530223e4b59433c2f74656103808201527f78743e3c7465787420636c6173733d226e206b2220783d223530252220793d226103a08201527f313139223e0000000000000000000000000000000000000000000000000000006103c082015250565b5f6136ae6103c5836131e4565b91506136b9826131ee565b6103c582019050919050565b5f819050815f5260205f209050919050565b5f81546136e381612f14565b6136ed81866131e4565b9450600182165f8114613707576001811461371c5761374e565b60ff198316865281151582028601935061374e565b613725856136c5565b5f5b8381101561374657815481890152600182019150602081019050613727565b838801955050505b50505092915050565b7f3c2f746578743e3c7465787420636c6173733d226e206b2220783d22353025225f8201527f20793d22313536223e0000000000000000000000000000000000000000000000602082015250565b5f6137b16029836131e4565b91506137bc82613757565b602982019050919050565b7f3c2f746578743e3c7465787420636c6173733d2261206b2220783d22353025225f8201527f20793d22323130223e0000000000000000000000000000000000000000000000602082015250565b5f6138216029836131e4565b915061382c826137c7565b602982019050919050565b5f61384182612826565b61384b81856131e4565b935061385b818560208601612840565b80840191505092915050565b7f3c2f746578743e3c2f7376673e000000000000000000000000000000000000005f82015250565b5f61389b600d836131e4565b91506138a682613867565b600d82019050919050565b5f6138bb826136a1565b91506138c782866136d7565b91506138d2826137a5565b91506138de82856136d7565b91506138e982613815565b91506138f58284613837565b91506139008261388f565b9150819050949350505050565b5f8151905061391b81612c25565b92915050565b5f602082840312156139365761393561276b565b5b5f6139438482850161390d565b91505092915050565b7f4b5943206d696e7420756e617661696c61626c650000000000000000000000005f82015250565b5f613980601483612830565b915061398b8261394c565b602082019050919050565b5f6020820190508181035f8301526139ad81613974565b9050919050565b7f496e76616c6964204b594320696e666f000000000000000000000000000000005f82015250565b5f6139e8601083612830565b91506139f3826139b4565b602082019050919050565b5f6020820190508181035f830152613a15816139dc565b9050919050565b7f4b594320616c72656164792072656769737465726564000000000000000000005f82015250565b5f613a50601683612830565b9150613a5b82613a1c565b602082019050919050565b5f6020820190508181035f830152613a7d81613a44565b9050919050565b5f82905092915050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613ad87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a9d565b613ae28683613a9d565b95508019841693508086168417925050509392505050565b5f613b14613b0f613b0a846128d0565b612e35565b6128d0565b9050919050565b5f819050919050565b613b2d83613afa565b613b41613b3982613b1b565b848454613aa9565b825550505050565b5f90565b613b55613b49565b613b60818484613b24565b505050565b5b81811015613b8357613b785f82613b4d565b600181019050613b66565b5050565b601f821115613bc857613b99816136c5565b613ba284613a8e565b81016020851015613bb1578190505b613bc5613bbd85613a8e565b830182613b65565b50505b505050565b5f82821c905092915050565b5f613be85f1984600802613bcd565b1980831691505092915050565b5f613c008383613bd9565b9150826002028217905092915050565b613c1a8383613a84565b67ffffffffffffffff811115613c3357613c32612c91565b5b613c3d8254612f14565b613c48828285613b87565b5f601f831160018114613c75575f8415613c63578287013590505b613c6d8582613bf5565b865550613cd4565b601f198416613c83866136c5565b5f5b82811015613caa57848901358255600182019150602085019450602081019050613c85565b86831015613cc75784890135613cc3601f891682613bd9565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613d14826128d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d4657613d45613cdd565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f613dab602d83612830565b9150613db682613d51565b604082019050919050565b5f6020820190508181035f830152613dd881613d9f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f613e39602983612830565b9150613e4482613ddf565b604082019050919050565b5f6020820190508181035f830152613e6681613e2d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f613ec7602a83612830565b9150613ed282613e6d565b604082019050919050565b5f6020820190508181035f830152613ef481613ebb565b9050919050565b5f613f0683856131e4565b9350613f13838584612d39565b82840190509392505050565b5f613f2b828688613efb565b9150613f38828486613efb565b915081905095945050505050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f613f7a601983612830565b9150613f8582613f46565b602082019050919050565b5f6020820190508181035f830152613fa781613f6e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f614008602f83612830565b915061401382613fae565b604082019050919050565b5f6020820190508181035f83015261403581613ffc565b9050919050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000005f82015250565b5f614070601a836131e4565b915061407b8261403c565b601a82019050919050565b5f61409082614064565b915061409c8284613837565b915081905092915050565b7f5b000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6140db6001836131e4565b91506140e6826140a7565b600182019050919050565b7f7b2274726169745f74797065223a20224669727374204e616d65222c202276615f8201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b5f61414b6027836131e4565b9150614156826140f1565b602782019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6141956003836131e4565b91506141a082614161565b600382019050919050565b7f7b2274726169745f74797065223a20224c617374204e616d65222c202276616c5f8201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b5f6142056026836131e4565b9150614210826141ab565b602682019050919050565b7f7b2274726169745f74797065223a202241646472657373222c202276616c75655f8201527f223a202200000000000000000000000000000000000000000000000000000000602082015250565b5f6142756024836131e4565b91506142808261421b565b602482019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6142bf6002836131e4565b91506142ca8261428b565b600282019050919050565b7f5d000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6143096001836131e4565b9150614314826142d5565b600182019050919050565b5f614329826140cf565b91506143348261413f565b915061434082866136d7565b915061434b82614189565b9150614356826141f9565b915061436282856136d7565b915061436d82614189565b915061437882614269565b91506143848284613837565b915061438f826142b3565b915061439a826142fd565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f6143db601b836131e4565b91506143e6826143a7565b601b82019050919050565b7f7b226e616d65223a20224b5943200000000000000000000000000000000000005f82015250565b5f614425600e836131e4565b9150614430826143f1565b600e82019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f61446f6002836131e4565b915061447a8261443b565b600282019050919050565b7f226465736372697074696f6e223a2022000000000000000000000000000000005f82015250565b5f6144b96010836131e4565b91506144c482614485565b601082019050919050565b7f22696d616765223a2022000000000000000000000000000000000000000000005f82015250565b5f614503600a836131e4565b915061450e826144cf565b600a82019050919050565b5f81905092915050565b5f61452d82612a66565b6145378185614519565b9350614547818560208601612840565b80840191505092915050565b7f2261747472696275746573223a200000000000000000000000000000000000005f82015250565b5f614587600e836131e4565b915061459282614553565b600e82019050919050565b7f2c000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6145d16001836131e4565b91506145dc8261459d565b600182019050919050565b7f2265787465726e616c5f75726c223a20220000000000000000000000000000005f82015250565b5f61461b6011836131e4565b9150614626826145e7565b601182019050919050565b7f22000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6146656001836131e4565b915061467082614631565b600182019050919050565b7f7d000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6146af6001836131e4565b91506146ba8261467b565b600182019050919050565b5f6146cf826143cf565b91506146da82614419565b91506146e68288613837565b91506146f182614463565b91506146fc826144ad565b915061470882876136d7565b915061471382614463565b915061471e826144f7565b915061472a8286614523565b915061473582614463565b91506147408261457b565b915061474c8285614523565b9150614757826145c5565b91506147628261460f565b915061476e82846136d7565b915061477982614659565b9150614784826146a3565b91508190509695505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6147ed602683612830565b91506147f882614793565b604082019050919050565b5f6020820190508181035f83015261481a816147e1565b9050919050565b5f61482b826128d0565b9150614836836128d0565b925082820390508181111561484e5761484d613cdd565b5b92915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f6148ae602c83612830565b91506148b982614854565b604082019050919050565b5f6020820190508181035f8301526148db816148a2565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e207468617420695f8201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b5f61493c602983612830565b9150614947826148e2565b604082019050919050565b5f6020820190508181035f83015261496981614930565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6149ca602483612830565b91506149d582614970565b604082019050919050565b5f6020820190508181035f8301526149f7816149be565b9050919050565b5f614a08826128d0565b9150614a13836128d0565b9250828201905080821115614a2b57614a2a613cdd565b5b92915050565b5f614a3b826128d0565b9150614a46836128d0565b9250828202614a54816128d0565b91508282048414831517614a6b57614a6a613cdd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614aa9826128d0565b91505f8203614abb57614aba613cdd565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f614afa602083612830565b9150614b0582614ac6565b602082019050919050565b5f6020820190508181035f830152614b2781614aee565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f614b88603283612830565b9150614b9382614b2e565b604082019050919050565b5f6020820190508181035f830152614bb581614b7c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614bf3826128d0565b9150614bfe836128d0565b925082614c0e57614c0d614bbc565b5b828204905092915050565b5f608082019050614c2c5f83018761295e565b614c39602083018661295e565b614c4660408301856129ee565b8181036060830152614c588184612a80565b905095945050505050565b5f81519050614c718161279e565b92915050565b5f60208284031215614c8c57614c8b61276b565b5b5f614c9984828501614c63565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614cd6602083612830565b9150614ce182614ca2565b602082019050919050565b5f6020820190508181035f830152614d0381614cca565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f614d3e601c83612830565b9150614d4982614d0a565b602082019050919050565b5f6020820190508181035f830152614d6b81614d32565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220447d2ae503037700815174ee63812641b5c62cb2a62e93a8cd8bc1218affb3b964736f6c63430008170033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007102653225d537e2fe703723ad83edfeb606396e

-----Decoded View---------------
Arg [0] : _etf (address): 0x7102653225D537e2FE703723ad83edFeb606396e

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007102653225d537e2fe703723ad83edfeb606396e


Deployed Bytecode Sourcemap

455:4267:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52999:300:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53917:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55428:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54966:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;507:26:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2006:77;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56292:330:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3225:1495:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1841:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;936:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56688:179:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65083:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;688:48:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;836:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53620:235:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;642:42:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;53358:205:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38577:92;;;:::i;:::-;;2144:55:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1555:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37945:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2087:53:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54079:102:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55712:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56933:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;538:15:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2205:1016;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1732:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56068:162:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38818:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52999:300;53101:4;53151:25;53136:40;;;:11;:40;;;;:104;;;;53207:33;53192:48;;;:11;:48;;;;53136:104;:156;;;;53256:36;53280:11;53256:23;:36::i;:::-;53136:156;53117:175;;52999:300;;;:::o;53917:98::-;53971:13;54003:5;53996:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53917:98;:::o;55428:217::-;55504:7;55531:16;55539:7;55531;:16::i;:::-;55523:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55614:15;:24;55630:7;55614:24;;;;;;;;;;;;;;;;;;;;;55607:31;;55428:217;;;:::o;54966:401::-;55046:13;55062:23;55077:7;55062:14;:23::i;:::-;55046:39;;55109:5;55103:11;;:2;:11;;;55095:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55200:5;55184:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;55209:37;55226:5;55233:12;:10;:12::i;:::-;55209:16;:37::i;:::-;55184:62;55163:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;55339:21;55348:2;55352:7;55339:8;:21::i;:::-;55036:331;54966:401;;:::o;507:26:1:-;;;;:::o;2006:77::-;38168:12:0;:10;:12::i;:::-;38157:23;;:7;:5;:7::i;:::-;:23;;;38149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:14:1::1;2070:7;2064:5;:14::i;:::-;2006:77:::0;:::o;56292:330:0:-;56481:41;56500:12;:10;:12::i;:::-;56514:7;56481:18;:41::i;:::-;56473:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56587:28;56597:4;56603:2;56607:7;56587:9;:28::i;:::-;56292:330;;;:::o;3225:1495:1:-;3279:12;3299:18;3320:64;3356:7;:16;3364:7;3356:16;;;;;;;;;;;:21;;;;;;;;;;;;3340:39;;3381:2;3320:19;:64::i;:::-;3299:85;;4512:7;:16;4520:7;4512:16;;;;;;;;;;;:26;;4596:7;:16;4604:7;4596:16;;;;;;;;;;;:25;;4679:4;3398:1317;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3391:1324;;;3225:1495;;;:::o;1841:160::-;1934:7;1956;:35;1964:26;1970:9;;1981:8;;1964:5;:26::i;:::-;1956:35;;;;;;;;;;;:40;;;;;;;;;;;;1949:47;;1841:160;;;;;;:::o;936:615::-;1030:3;;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1022:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1114:1;1093:9;;1087:23;;:28;;:59;;;;;1145:1;1125:8;;1119:22;;:27;;1087:59;1079:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;1174:10;1187:26;1193:9;;1204:8;;1187:5;:26::i;:::-;1174:39;;1274:1;1241:7;:11;1249:2;1241:11;;;;;;;;;;;:21;;1235:35;;;;;:::i;:::-;;;:40;:74;;;;;1308:1;1279:13;:25;1293:10;1279:25;;;;;;;;;;;;;;;;:30;1235:74;1220:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;1378:9;;1354:7;:11;1362:2;1354:11;;;;;;;;;;;:21;;:33;;;;;;;:::i;:::-;;1416:8;;1393:7;:11;1401:2;1393:11;;;;;;;;;;;:20;;:31;;;;;;;:::i;:::-;;1449:10;1430:7;:11;1438:2;1430:11;;;;;;;;;;;:16;;;:29;;;;;;;;;;;;;;;;;;1493:2;1465:13;:25;1479:10;1465:25;;;;;;;;;;;;;;;:30;;;;1502:25;1512:10;1524:2;1502:9;:25::i;:::-;1533:11;;:13;;;;;;;;;:::i;:::-;;;;;;1016:535;936:615;;;;:::o;56688:179:0:-;56821:39;56838:4;56844:2;56848:7;56821:39;;;;;;;;;;;;:16;:39::i;:::-;56688:179;;;:::o;65083:238::-;65199:41;65218:12;:10;:12::i;:::-;65232:7;65199:18;:41::i;:::-;65191:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;65300:14;65306:7;65300:5;:14::i;:::-;65083:238;:::o;688:48:1:-;;;;;;;;;;;;;;;;;:::o;836:96::-;892:4;911:16;919:7;911;:16::i;:::-;904:23;;836:96;;;:::o;53620:235:0:-;53692:7;53711:13;53727:7;:16;53735:7;53727:16;;;;;;;;;;;;;;;;;;;;;53711:32;;53778:1;53761:19;;:5;:19;;;53753:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53843:5;53836:12;;;53620:235;;;:::o;642:42:1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53358:205:0:-;53430:7;53474:1;53457:19;;:5;:19;;;53449:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53540:9;:16;53550:5;53540:16;;;;;;;;;;;;;;;;53533:23;;53358:205;;;:::o;38577:92::-;38168:12;:10;:12::i;:::-;38157:23;;:7;:5;:7::i;:::-;:23;;;38149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38641:21:::1;38659:1;38641:9;:21::i;:::-;38577:92::o:0;2144:55:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1555:173::-;1644:7;1701:9;;1712:8;;1684:37;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1674:48;;;;;;1666:57;;1659:64;;1555:173;;;;;;:::o;37945:85:0:-;37991:7;38017:6;;;;;;;;;;;38010:13;;37945:85;:::o;2087:53:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54079:102:0:-;54135:13;54167:7;54160:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54079:102;:::o;55712:290::-;55826:12;:10;:12::i;:::-;55814:24;;:8;:24;;;55806:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;55924:8;55879:18;:32;55898:12;:10;:12::i;:::-;55879:32;;;;;;;;;;;;;;;:42;55912:8;55879:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;55976:8;55947:48;;55962:12;:10;:12::i;:::-;55947:48;;;55986:8;55947:48;;;;;;:::i;:::-;;;;;;;;55712:290;;:::o;56933:320::-;57102:41;57121:12;:10;:12::i;:::-;57135:7;57102:18;:41::i;:::-;57094:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;57207:39;57221:4;57227:2;57231:7;57240:5;57207:13;:39::i;:::-;56933:320;;;;:::o;538:15:1:-;;;;;;;;;;;;;:::o;2205:1016::-;2278:13;2307:16;2315:7;2307;:16::i;:::-;2299:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2382:23;2468:30;2482:15;2489:7;2482:6;:15::i;:::-;2468:13;:30::i;:::-;2408:96;;;;;;;;:::i;:::-;;;;;;;;;;;;;2382:122;;2512:18;2533:64;2569:7;:16;2577:7;2569:16;;;;;;;;;;;:21;;;;;;;;;;;;2553:39;;2594:2;2533:19;:64::i;:::-;2512:85;;2604:18;2703:7;:16;2711:7;2703:16;;;;;;;;;;;:26;;2786:7;:16;2794:7;2786:16;;;;;;;;;;;:25;;2866:4;2625:268;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2604:289;;2901:17;3000:4;3038:11;3077:10;3119:5;3157:11;2921:269;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2901:289;;3211:4;3197:19;;;;;;2205:1016;;;:::o;1732:105::-;1789:7;1811;:16;1819:7;1811:16;;;;;;;;;;;:21;;;;;;;;;;;;1804:28;;1732:105;;;:::o;56068:162:0:-;56165:4;56188:18;:25;56207:5;56188:25;;;;;;;;;;;;;;;:35;56214:8;56188:35;;;;;;;;;;;;;;;;;;;;;;;;;56181:42;;56068:162;;;;:::o;38818:189::-;38168:12;:10;:12::i;:::-;38157:23;;:7;:5;:7::i;:::-;:23;;;38149:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38926:1:::1;38906:22;;:8;:22;;::::0;38898:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38981:19;38991:8;38981:9;:19::i;:::-;38818:189:::0;:::o;36901:155::-;36986:4;37024:25;37009:40;;;:11;:40;;;;37002:47;;36901:155;;;:::o;58725:125::-;58790:4;58841:1;58813:30;;:7;:16;58821:7;58813:16;;;;;;;;;;;;;;;;;;;;;:30;;;;58806:37;;58725:125;;;:::o;25142:96::-;25195:7;25221:10;25214:17;;25142:96;:::o;62576:171::-;62677:2;62650:15;:24;62666:7;62650:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;62732:7;62728:2;62694:46;;62703:23;62718:7;62703:14;:23::i;:::-;62694:46;;;;;;;;;;;;62576:171;;:::o;61233:348::-;61292:13;61308:23;61323:7;61308:14;:23::i;:::-;61292:39;;61342:48;61363:5;61378:1;61382:7;61342:20;:48::i;:::-;61428:29;61445:1;61449:7;61428:8;:29::i;:::-;61488:1;61468:9;:16;61478:5;61468:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;61506:7;:16;61514:7;61506:16;;;;;;;;;;;;61499:23;;;;;;;;;;;61566:7;61562:1;61538:36;;61547:5;61538:36;;;;;;;;;;;;61282:299;61233:348;:::o;59008:344::-;59101:4;59125:16;59133:7;59125;:16::i;:::-;59117:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59200:13;59216:23;59231:7;59216:14;:23::i;:::-;59200:39;;59268:5;59257:16;;:7;:16;;;:51;;;;59301:7;59277:31;;:20;59289:7;59277:11;:20::i;:::-;:31;;;59257:51;:87;;;;59312:32;59329:5;59336:7;59312:16;:32::i;:::-;59257:87;59249:96;;;59008:344;;;;:::o;61905:560::-;62059:4;62032:31;;:23;62047:7;62032:14;:23::i;:::-;:31;;;62024:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;62141:1;62127:16;;:2;:16;;;62119:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62195:39;62216:4;62222:2;62226:7;62195:20;:39::i;:::-;62296:29;62313:1;62317:7;62296:8;:29::i;:::-;62355:1;62336:9;:15;62346:4;62336:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;62383:1;62366:9;:13;62376:2;62366:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;62413:2;62394:7;:16;62402:7;62394:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;62450:7;62446:2;62431:27;;62440:4;62431:27;;;;;;;;;;;;61905:560;;;:::o;22266:441::-;22341:13;22366:19;22411:1;22402:6;22398:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;22388:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22366:47;;22423:15;:6;22430:1;22423:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;22448;:6;22455:1;22448:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;22478:9;22503:1;22494:6;22490:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;22478:26;;22473:132;22510:1;22506;:5;22473:132;;;22544:12;22565:3;22557:5;:11;22544:25;;;;;;;:::i;:::-;;;;;22532:6;22539:1;22532:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;22593:1;22583:11;;;;;22513:3;;;;:::i;:::-;;;22473:132;;;;22631:1;22622:5;:10;22614:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;22693:6;22679:21;;;22266:441;;;;:::o;59682:108::-;59757:26;59767:2;59771:7;59757:26;;;;;;;;;;;;:9;:26::i;:::-;59682:108;;:::o;39013:169::-;39068:16;39087:6;;;;;;;;;;;39068:25;;39112:8;39103:6;;:17;;;;;;;;;;;;;;;;;;39166:8;39135:40;;39156:8;39135:40;;;;;;;;;;;;39058:124;39013:169;:::o;58115:307::-;58266:28;58276:4;58282:2;58286:7;58266:9;:28::i;:::-;58312:48;58335:4;58341:2;58345:7;58354:5;58312:22;:48::i;:::-;58304:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;58115:307;;;;:::o;23051:1557::-;23109:13;23134:11;23148:4;:11;23134:25;;23180:1;23173:3;:8;23169:23;;23183:9;;;;;;;;;;;;;;;;;23169:23;23241:18;23279:1;23274;23268:3;:7;;;;:::i;:::-;23267:13;;;;:::i;:::-;23262:1;:19;;;;:::i;:::-;23241:40;;23336:19;23381:2;23368:10;:15;;;;:::i;:::-;23358:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23336:48;;23395:18;23416:5;;;;;;;;;;;;;;;;;23395:26;;23482:1;23475:5;23471:13;23526:2;23518:6;23514:15;23574:1;23543:757;23596:3;23593:1;23590:10;23543:757;;;23648:1;23645;23641:9;23636:14;;23705:8;23700:1;23694:4;23690:12;23684:19;23680:34;23783:4;23775:5;23771:2;23767:14;23763:25;23753:8;23749:40;23743:47;23821:3;23818:1;23814:11;23807:18;;23911:4;23902;23894:5;23890:2;23886:14;23882:25;23872:8;23868:40;23862:47;23858:58;23853:3;23849:68;23842:75;;23948:3;23945:1;23941:11;23934:18;;24037:4;24028;24020:5;24017:1;24013:13;24009:24;23999:8;23995:39;23989:46;23985:57;23980:3;23976:67;23969:74;;24074:3;24071:1;24067:11;24060:18;;24155:4;24146;24139:5;24135:16;24125:8;24121:31;24115:38;24111:49;24106:3;24102:59;24095:66;;24194:3;24189;24185:13;24178:20;;24234:3;24223:9;24216:22;24284:1;24273:9;24269:17;24256:30;;23618:682;;23543:757;;;23547:42;24330:1;24325:3;24321:11;24350:1;24345:82;;;;24445:1;24440:80;;;;24314:206;;24345:82;24405:6;24400:3;24396:16;24392:1;24381:9;24377:17;24370:43;24345:82;;24440:80;24500:4;24495:3;24491:14;24487:1;24476:9;24472:17;24465:41;24314:206;;24549:10;24541:6;24534:26;23441:1129;;24594:6;24580:21;;;;;;23051:1557;;;;:::o;64638:122::-;;;;:::o;60011:311::-;60136:18;60142:2;60146:7;60136:5;:18::i;:::-;60185:54;60216:1;60220:2;60224:7;60233:5;60185:22;:54::i;:::-;60164:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;60011:311;;;:::o;63300:782::-;63450:4;63470:15;:2;:13;;;:15::i;:::-;63466:610;;;63521:2;63505:36;;;63542:12;:10;:12::i;:::-;63556:4;63562:7;63571:5;63505:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63501:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63765:1;63748:6;:13;:18;63744:266;;63790:60;;;;;;;;;;:::i;:::-;;;;;;;;63744:266;63962:6;63956:13;63947:6;63943:2;63939:15;63932:38;63501:523;63637:45;;;63627:55;;;:6;:55;;;;63620:62;;;;;63466:610;64061:4;64054:11;;63300:782;;;;;;;:::o;60644:372::-;60737:1;60723:16;;:2;:16;;;60715:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;60795:16;60803:7;60795;:16::i;:::-;60794:17;60786:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;60855:45;60884:1;60888:2;60892:7;60855:20;:45::i;:::-;60928:1;60911:9;:13;60921:2;60911:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;60958:2;60939:7;:16;60947:7;60939:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;61001:7;60997:2;60976:33;;60993:1;60976:33;;;;;;;;;;;;60644:372;;:::o;13376:377::-;13436:4;13639:12;13704:7;13692:20;13684:28;;13745:1;13738:4;:8;13731:15;;;13376:377;;;:::o;7:75:2:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:98::-;5918:6;5952:5;5946:12;5936:22;;5867:98;;;:::o;5971:168::-;6054:11;6088:6;6083:3;6076:19;6128:4;6123:3;6119:14;6104:29;;5971:168;;;;:::o;6145:373::-;6231:3;6259:38;6291:5;6259:38;:::i;:::-;6313:70;6376:6;6371:3;6313:70;:::i;:::-;6306:77;;6392:65;6450:6;6445:3;6438:4;6431:5;6427:16;6392:65;:::i;:::-;6482:29;6504:6;6482:29;:::i;:::-;6477:3;6473:39;6466:46;;6235:283;6145:373;;;;:::o;6524:309::-;6635:4;6673:2;6662:9;6658:18;6650:26;;6722:9;6716:4;6712:20;6708:1;6697:9;6693:17;6686:47;6750:76;6821:4;6812:6;6750:76;:::i;:::-;6742:84;;6524:309;;;;:::o;6839:117::-;6948:1;6945;6938:12;6962:117;7071:1;7068;7061:12;7085:117;7194:1;7191;7184:12;7222:553;7280:8;7290:6;7340:3;7333:4;7325:6;7321:17;7317:27;7307:122;;7348:79;;:::i;:::-;7307:122;7461:6;7448:20;7438:30;;7491:18;7483:6;7480:30;7477:117;;;7513:79;;:::i;:::-;7477:117;7627:4;7619:6;7615:17;7603:29;;7681:3;7673:4;7665:6;7661:17;7651:8;7647:32;7644:41;7641:128;;;7688:79;;:::i;:::-;7641:128;7222:553;;;;;:::o;7781:874::-;7873:6;7881;7889;7897;7946:2;7934:9;7925:7;7921:23;7917:32;7914:119;;;7952:79;;:::i;:::-;7914:119;8100:1;8089:9;8085:17;8072:31;8130:18;8122:6;8119:30;8116:117;;;8152:79;;:::i;:::-;8116:117;8265:65;8322:7;8313:6;8302:9;8298:22;8265:65;:::i;:::-;8247:83;;;;8043:297;8407:2;8396:9;8392:18;8379:32;8438:18;8430:6;8427:30;8424:117;;;8460:79;;:::i;:::-;8424:117;8573:65;8630:7;8621:6;8610:9;8606:22;8573:65;:::i;:::-;8555:83;;;;8350:298;7781:874;;;;;;;:::o;8661:329::-;8720:6;8769:2;8757:9;8748:7;8744:23;8740:32;8737:119;;;8775:79;;:::i;:::-;8737:119;8895:1;8920:53;8965:7;8956:6;8945:9;8941:22;8920:53;:::i;:::-;8910:63;;8866:117;8661:329;;;;:::o;8996:624::-;9185:4;9223:2;9212:9;9208:18;9200:26;;9272:9;9266:4;9262:20;9258:1;9247:9;9243:17;9236:47;9300:78;9373:4;9364:6;9300:78;:::i;:::-;9292:86;;9425:9;9419:4;9415:20;9410:2;9399:9;9395:18;9388:48;9453:78;9526:4;9517:6;9453:78;:::i;:::-;9445:86;;9541:72;9609:2;9598:9;9594:18;9585:6;9541:72;:::i;:::-;8996:624;;;;;;:::o;9626:116::-;9696:21;9711:5;9696:21;:::i;:::-;9689:5;9686:32;9676:60;;9732:1;9729;9722:12;9676:60;9626:116;:::o;9748:133::-;9791:5;9829:6;9816:20;9807:29;;9845:30;9869:5;9845:30;:::i;:::-;9748:133;;;;:::o;9887:468::-;9952:6;9960;10009:2;9997:9;9988:7;9984:23;9980:32;9977:119;;;10015:79;;:::i;:::-;9977:119;10135:1;10160:53;10205:7;10196:6;10185:9;10181:22;10160:53;:::i;:::-;10150:63;;10106:117;10262:2;10288:50;10330:7;10321:6;10310:9;10306:22;10288:50;:::i;:::-;10278:60;;10233:115;9887:468;;;;;:::o;10361:117::-;10470:1;10467;10460:12;10484:180;10532:77;10529:1;10522:88;10629:4;10626:1;10619:15;10653:4;10650:1;10643:15;10670:281;10753:27;10775:4;10753:27;:::i;:::-;10745:6;10741:40;10883:6;10871:10;10868:22;10847:18;10835:10;10832:34;10829:62;10826:88;;;10894:18;;:::i;:::-;10826:88;10934:10;10930:2;10923:22;10713:238;10670:281;;:::o;10957:129::-;10991:6;11018:20;;:::i;:::-;11008:30;;11047:33;11075:4;11067:6;11047:33;:::i;:::-;10957:129;;;:::o;11092:307::-;11153:4;11243:18;11235:6;11232:30;11229:56;;;11265:18;;:::i;:::-;11229:56;11303:29;11325:6;11303:29;:::i;:::-;11295:37;;11387:4;11381;11377:15;11369:23;;11092:307;;;:::o;11405:146::-;11502:6;11497:3;11492;11479:30;11543:1;11534:6;11529:3;11525:16;11518:27;11405:146;;;:::o;11557:423::-;11634:5;11659:65;11675:48;11716:6;11675:48;:::i;:::-;11659:65;:::i;:::-;11650:74;;11747:6;11740:5;11733:21;11785:4;11778:5;11774:16;11823:3;11814:6;11809:3;11805:16;11802:25;11799:112;;;11830:79;;:::i;:::-;11799:112;11920:54;11967:6;11962:3;11957;11920:54;:::i;:::-;11640:340;11557:423;;;;;:::o;11999:338::-;12054:5;12103:3;12096:4;12088:6;12084:17;12080:27;12070:122;;12111:79;;:::i;:::-;12070:122;12228:6;12215:20;12253:78;12327:3;12319:6;12312:4;12304:6;12300:17;12253:78;:::i;:::-;12244:87;;12060:277;11999:338;;;;:::o;12343:943::-;12438:6;12446;12454;12462;12511:3;12499:9;12490:7;12486:23;12482:33;12479:120;;;12518:79;;:::i;:::-;12479:120;12638:1;12663:53;12708:7;12699:6;12688:9;12684:22;12663:53;:::i;:::-;12653:63;;12609:117;12765:2;12791:53;12836:7;12827:6;12816:9;12812:22;12791:53;:::i;:::-;12781:63;;12736:118;12893:2;12919:53;12964:7;12955:6;12944:9;12940:22;12919:53;:::i;:::-;12909:63;;12864:118;13049:2;13038:9;13034:18;13021:32;13080:18;13072:6;13069:30;13066:117;;;13102:79;;:::i;:::-;13066:117;13207:62;13261:7;13252:6;13241:9;13237:22;13207:62;:::i;:::-;13197:72;;12992:287;12343:943;;;;;;;:::o;13292:60::-;13320:3;13341:5;13334:12;;13292:60;;;:::o;13358:142::-;13408:9;13441:53;13459:34;13468:24;13486:5;13468:24;:::i;:::-;13459:34;:::i;:::-;13441:53;:::i;:::-;13428:66;;13358:142;;;:::o;13506:126::-;13556:9;13589:37;13620:5;13589:37;:::i;:::-;13576:50;;13506:126;;;:::o;13638:139::-;13701:9;13734:37;13765:5;13734:37;:::i;:::-;13721:50;;13638:139;;;:::o;13783:157::-;13883:50;13927:5;13883:50;:::i;:::-;13878:3;13871:63;13783:157;;:::o;13946:248::-;14052:4;14090:2;14079:9;14075:18;14067:26;;14103:84;14184:1;14173:9;14169:17;14160:6;14103:84;:::i;:::-;13946:248;;;;:::o;14200:474::-;14268:6;14276;14325:2;14313:9;14304:7;14300:23;14296:32;14293:119;;;14331:79;;:::i;:::-;14293:119;14451:1;14476:53;14521:7;14512:6;14501:9;14497:22;14476:53;:::i;:::-;14466:63;;14422:117;14578:2;14604:53;14649:7;14640:6;14629:9;14625:22;14604:53;:::i;:::-;14594:63;;14549:118;14200:474;;;;;:::o;14680:180::-;14728:77;14725:1;14718:88;14825:4;14822:1;14815:15;14849:4;14846:1;14839:15;14866:320;14910:6;14947:1;14941:4;14937:12;14927:22;;14994:1;14988:4;14984:12;15015:18;15005:81;;15071:4;15063:6;15059:17;15049:27;;15005:81;15133:2;15125:6;15122:14;15102:18;15099:38;15096:84;;15152:18;;:::i;:::-;15096:84;14917:269;14866:320;;;:::o;15192:231::-;15332:34;15328:1;15320:6;15316:14;15309:58;15401:14;15396:2;15388:6;15384:15;15377:39;15192:231;:::o;15429:366::-;15571:3;15592:67;15656:2;15651:3;15592:67;:::i;:::-;15585:74;;15668:93;15757:3;15668:93;:::i;:::-;15786:2;15781:3;15777:12;15770:19;;15429:366;;;:::o;15801:419::-;15967:4;16005:2;15994:9;15990:18;15982:26;;16054:9;16048:4;16044:20;16040:1;16029:9;16025:17;16018:47;16082:131;16208:4;16082:131;:::i;:::-;16074:139;;15801:419;;;:::o;16226:220::-;16366:34;16362:1;16354:6;16350:14;16343:58;16435:3;16430:2;16422:6;16418:15;16411:28;16226:220;:::o;16452:366::-;16594:3;16615:67;16679:2;16674:3;16615:67;:::i;:::-;16608:74;;16691:93;16780:3;16691:93;:::i;:::-;16809:2;16804:3;16800:12;16793:19;;16452:366;;;:::o;16824:419::-;16990:4;17028:2;17017:9;17013:18;17005:26;;17077:9;17071:4;17067:20;17063:1;17052:9;17048:17;17041:47;17105:131;17231:4;17105:131;:::i;:::-;17097:139;;16824:419;;;:::o;17249:243::-;17389:34;17385:1;17377:6;17373:14;17366:58;17458:26;17453:2;17445:6;17441:15;17434:51;17249:243;:::o;17498:366::-;17640:3;17661:67;17725:2;17720:3;17661:67;:::i;:::-;17654:74;;17737:93;17826:3;17737:93;:::i;:::-;17855:2;17850:3;17846:12;17839:19;;17498:366;;;:::o;17870:419::-;18036:4;18074:2;18063:9;18059:18;18051:26;;18123:9;18117:4;18113:20;18109:1;18098:9;18094:17;18087:47;18151:131;18277:4;18151:131;:::i;:::-;18143:139;;17870:419;;;:::o;18295:182::-;18435:34;18431:1;18423:6;18419:14;18412:58;18295:182;:::o;18483:366::-;18625:3;18646:67;18710:2;18705:3;18646:67;:::i;:::-;18639:74;;18722:93;18811:3;18722:93;:::i;:::-;18840:2;18835:3;18831:12;18824:19;;18483:366;;;:::o;18855:419::-;19021:4;19059:2;19048:9;19044:18;19036:26;;19108:9;19102:4;19098:20;19094:1;19083:9;19079:17;19072:47;19136:131;19262:4;19136:131;:::i;:::-;19128:139;;18855:419;;;:::o;19280:236::-;19420:34;19416:1;19408:6;19404:14;19397:58;19489:19;19484:2;19476:6;19472:15;19465:44;19280:236;:::o;19522:366::-;19664:3;19685:67;19749:2;19744:3;19685:67;:::i;:::-;19678:74;;19761:93;19850:3;19761:93;:::i;:::-;19879:2;19874:3;19870:12;19863:19;;19522:366;;;:::o;19894:419::-;20060:4;20098:2;20087:9;20083:18;20075:26;;20147:9;20141:4;20137:20;20133:1;20122:9;20118:17;20111:47;20175:131;20301:4;20175:131;:::i;:::-;20167:139;;19894:419;;;:::o;20319:148::-;20421:11;20458:3;20443:18;;20319:148;;;;:::o;20473:3095::-;20613:66;20609:1;20601:6;20597:14;20590:90;20714:66;20709:2;20701:6;20697:15;20690:91;20815:34;20810:2;20802:6;20798:15;20791:59;20888:34;20883:2;20875:6;20871:15;20864:59;20962:34;20956:3;20948:6;20944:16;20937:60;21036:34;21030:3;21022:6;21018:16;21011:60;21110:34;21104:3;21096:6;21092:16;21085:60;21180:34;21174:3;21166:6;21162:16;21155:60;21250:66;21244:3;21236:6;21232:16;21225:92;21352:66;21346:3;21338:6;21334:16;21327:92;21454:66;21448:3;21440:6;21436:16;21429:92;21556:66;21550:3;21542:6;21538:16;21531:92;21658:66;21652:3;21644:6;21640:16;21633:92;21760:66;21754:3;21746:6;21742:16;21735:92;21862:66;21856:3;21848:6;21844:16;21837:92;21964:66;21958:3;21950:6;21946:16;21939:92;22066:66;22060:3;22052:6;22048:16;22041:92;22168:66;22162:3;22154:6;22150:16;22143:92;22270:66;22264:3;22256:6;22252:16;22245:92;22372:66;22366:3;22358:6;22354:16;22347:92;22474:66;22468:3;22460:6;22456:16;22449:92;22576:66;22570:3;22562:6;22558:16;22551:92;22678:66;22672:3;22664:6;22660:16;22653:92;22780:66;22774:3;22766:6;22762:16;22755:92;22882:66;22876:3;22868:6;22864:16;22857:92;22984:66;22978:3;22970:6;22966:16;22959:92;23086:66;23080:3;23072:6;23068:16;23061:92;23188:66;23182:3;23174:6;23170:16;23163:92;23290:66;23284:3;23276:6;23272:16;23265:92;23392:66;23386:3;23378:6;23374:16;23367:92;23494:66;23488:3;23480:6;23476:16;23469:92;20473:3095;:::o;23574:404::-;23734:3;23755:86;23837:3;23832;23755:86;:::i;:::-;23748:93;;23850;23939:3;23850:93;:::i;:::-;23968:3;23963;23959:13;23952:20;;23574:404;;;:::o;23984:141::-;24033:4;24056:3;24048:11;;24079:3;24076:1;24069:14;24113:4;24110:1;24100:18;24092:26;;23984:141;;;:::o;24155:874::-;24258:3;24295:5;24289:12;24324:36;24350:9;24324:36;:::i;:::-;24376:89;24458:6;24453:3;24376:89;:::i;:::-;24369:96;;24496:1;24485:9;24481:17;24512:1;24507:166;;;;24687:1;24682:341;;;;24474:549;;24507:166;24591:4;24587:9;24576;24572:25;24567:3;24560:38;24653:6;24646:14;24639:22;24631:6;24627:35;24622:3;24618:45;24611:52;;24507:166;;24682:341;24749:38;24781:5;24749:38;:::i;:::-;24809:1;24823:154;24837:6;24834:1;24831:13;24823:154;;;24911:7;24905:14;24901:1;24896:3;24892:11;24885:35;24961:1;24952:7;24948:15;24937:26;;24859:4;24856:1;24852:12;24847:17;;24823:154;;;25006:6;25001:3;24997:16;24990:23;;24689:334;;24474:549;;24262:767;;24155:874;;;;:::o;25035:315::-;25175:66;25171:1;25163:6;25159:14;25152:90;25276:66;25271:2;25263:6;25259:15;25252:91;25035:315;:::o;25356:402::-;25516:3;25537:85;25619:2;25614:3;25537:85;:::i;:::-;25530:92;;25631:93;25720:3;25631:93;:::i;:::-;25749:2;25744:3;25740:12;25733:19;;25356:402;;;:::o;25764:315::-;25904:66;25900:1;25892:6;25888:14;25881:90;26005:66;26000:2;25992:6;25988:15;25981:91;25764:315;:::o;26085:402::-;26245:3;26266:85;26348:2;26343:3;26266:85;:::i;:::-;26259:92;;26360:93;26449:3;26360:93;:::i;:::-;26478:2;26473:3;26469:12;26462:19;;26085:402;;;:::o;26493:390::-;26599:3;26627:39;26660:5;26627:39;:::i;:::-;26682:89;26764:6;26759:3;26682:89;:::i;:::-;26675:96;;26780:65;26838:6;26833:3;26826:4;26819:5;26815:16;26780:65;:::i;:::-;26870:6;26865:3;26861:16;26854:23;;26603:280;26493:390;;;;:::o;26889:163::-;27029:15;27025:1;27017:6;27013:14;27006:39;26889:163;:::o;27058:402::-;27218:3;27239:85;27321:2;27316:3;27239:85;:::i;:::-;27232:92;;27333:93;27422:3;27333:93;:::i;:::-;27451:2;27446:3;27442:12;27435:19;;27058:402;;;:::o;27466:1647::-;28092:3;28114:148;28258:3;28114:148;:::i;:::-;28107:155;;28279:92;28367:3;28358:6;28279:92;:::i;:::-;28272:99;;28388:148;28532:3;28388:148;:::i;:::-;28381:155;;28553:92;28641:3;28632:6;28553:92;:::i;:::-;28546:99;;28662:148;28806:3;28662:148;:::i;:::-;28655:155;;28827:95;28918:3;28909:6;28827:95;:::i;:::-;28820:102;;28939:148;29083:3;28939:148;:::i;:::-;28932:155;;29104:3;29097:10;;27466:1647;;;;;;:::o;29119:137::-;29173:5;29204:6;29198:13;29189:22;;29220:30;29244:5;29220:30;:::i;:::-;29119:137;;;;:::o;29262:345::-;29329:6;29378:2;29366:9;29357:7;29353:23;29349:32;29346:119;;;29384:79;;:::i;:::-;29346:119;29504:1;29529:61;29582:7;29573:6;29562:9;29558:22;29529:61;:::i;:::-;29519:71;;29475:125;29262:345;;;;:::o;29613:170::-;29753:22;29749:1;29741:6;29737:14;29730:46;29613:170;:::o;29789:366::-;29931:3;29952:67;30016:2;30011:3;29952:67;:::i;:::-;29945:74;;30028:93;30117:3;30028:93;:::i;:::-;30146:2;30141:3;30137:12;30130:19;;29789:366;;;:::o;30161:419::-;30327:4;30365:2;30354:9;30350:18;30342:26;;30414:9;30408:4;30404:20;30400:1;30389:9;30385:17;30378:47;30442:131;30568:4;30442:131;:::i;:::-;30434:139;;30161:419;;;:::o;30586:166::-;30726:18;30722:1;30714:6;30710:14;30703:42;30586:166;:::o;30758:366::-;30900:3;30921:67;30985:2;30980:3;30921:67;:::i;:::-;30914:74;;30997:93;31086:3;30997:93;:::i;:::-;31115:2;31110:3;31106:12;31099:19;;30758:366;;;:::o;31130:419::-;31296:4;31334:2;31323:9;31319:18;31311:26;;31383:9;31377:4;31373:20;31369:1;31358:9;31354:17;31347:47;31411:131;31537:4;31411:131;:::i;:::-;31403:139;;31130:419;;;:::o;31555:172::-;31695:24;31691:1;31683:6;31679:14;31672:48;31555:172;:::o;31733:366::-;31875:3;31896:67;31960:2;31955:3;31896:67;:::i;:::-;31889:74;;31972:93;32061:3;31972:93;:::i;:::-;32090:2;32085:3;32081:12;32074:19;;31733:366;;;:::o;32105:419::-;32271:4;32309:2;32298:9;32294:18;32286:26;;32358:9;32352:4;32348:20;32344:1;32333:9;32329:17;32322:47;32386:131;32512:4;32386:131;:::i;:::-;32378:139;;32105:419;;;:::o;32530:97::-;32589:6;32617:3;32607:13;;32530:97;;;;:::o;32633:93::-;32670:6;32717:2;32712;32705:5;32701:14;32697:23;32687:33;;32633:93;;;:::o;32732:107::-;32776:8;32826:5;32820:4;32816:16;32795:37;;32732:107;;;;:::o;32845:393::-;32914:6;32964:1;32952:10;32948:18;32987:97;33017:66;33006:9;32987:97;:::i;:::-;33105:39;33135:8;33124:9;33105:39;:::i;:::-;33093:51;;33177:4;33173:9;33166:5;33162:21;33153:30;;33226:4;33216:8;33212:19;33205:5;33202:30;33192:40;;32921:317;;32845:393;;;;;:::o;33244:142::-;33294:9;33327:53;33345:34;33354:24;33372:5;33354:24;:::i;:::-;33345:34;:::i;:::-;33327:53;:::i;:::-;33314:66;;33244:142;;;:::o;33392:75::-;33435:3;33456:5;33449:12;;33392:75;;;:::o;33473:269::-;33583:39;33614:7;33583:39;:::i;:::-;33644:91;33693:41;33717:16;33693:41;:::i;:::-;33685:6;33678:4;33672:11;33644:91;:::i;:::-;33638:4;33631:105;33549:193;33473:269;;;:::o;33748:73::-;33793:3;33748:73;:::o;33827:189::-;33904:32;;:::i;:::-;33945:65;34003:6;33995;33989:4;33945:65;:::i;:::-;33880:136;33827:189;;:::o;34022:186::-;34082:120;34099:3;34092:5;34089:14;34082:120;;;34153:39;34190:1;34183:5;34153:39;:::i;:::-;34126:1;34119:5;34115:13;34106:22;;34082:120;;;34022:186;;:::o;34214:543::-;34315:2;34310:3;34307:11;34304:446;;;34349:38;34381:5;34349:38;:::i;:::-;34433:29;34451:10;34433:29;:::i;:::-;34423:8;34419:44;34616:2;34604:10;34601:18;34598:49;;;34637:8;34622:23;;34598:49;34660:80;34716:22;34734:3;34716:22;:::i;:::-;34706:8;34702:37;34689:11;34660:80;:::i;:::-;34319:431;;34304:446;34214:543;;;:::o;34763:117::-;34817:8;34867:5;34861:4;34857:16;34836:37;;34763:117;;;;:::o;34886:169::-;34930:6;34963:51;35011:1;35007:6;34999:5;34996:1;34992:13;34963:51;:::i;:::-;34959:56;35044:4;35038;35034:15;35024:25;;34937:118;34886:169;;;;:::o;35060:295::-;35136:4;35282:29;35307:3;35301:4;35282:29;:::i;:::-;35274:37;;35344:3;35341:1;35337:11;35331:4;35328:21;35320:29;;35060:295;;;;:::o;35360:1403::-;35484:44;35524:3;35519;35484:44;:::i;:::-;35593:18;35585:6;35582:30;35579:56;;;35615:18;;:::i;:::-;35579:56;35659:38;35691:4;35685:11;35659:38;:::i;:::-;35744:67;35804:6;35796;35790:4;35744:67;:::i;:::-;35838:1;35867:2;35859:6;35856:14;35884:1;35879:632;;;;36555:1;36572:6;36569:84;;;36628:9;36623:3;36619:19;36606:33;36597:42;;36569:84;36679:67;36739:6;36732:5;36679:67;:::i;:::-;36673:4;36666:81;36528:229;35849:908;;35879:632;35931:4;35927:9;35919:6;35915:22;35965:37;35997:4;35965:37;:::i;:::-;36024:1;36038:215;36052:7;36049:1;36046:14;36038:215;;;36138:9;36133:3;36129:19;36116:33;36108:6;36101:49;36189:1;36181:6;36177:14;36167:24;;36236:2;36225:9;36221:18;36208:31;;36075:4;36072:1;36068:12;36063:17;;36038:215;;;36281:6;36272:7;36269:19;36266:186;;;36346:9;36341:3;36337:19;36324:33;36389:48;36431:4;36423:6;36419:17;36408:9;36389:48;:::i;:::-;36381:6;36374:64;36289:163;36266:186;36498:1;36494;36486:6;36482:14;36478:22;36472:4;36465:36;35886:625;;;35849:908;;35459:1304;;;35360:1403;;;:::o;36769:180::-;36817:77;36814:1;36807:88;36914:4;36911:1;36904:15;36938:4;36935:1;36928:15;36955:233;36994:3;37017:24;37035:5;37017:24;:::i;:::-;37008:33;;37063:66;37056:5;37053:77;37050:103;;37133:18;;:::i;:::-;37050:103;37180:1;37173:5;37169:13;37162:20;;36955:233;;;:::o;37194:232::-;37334:34;37330:1;37322:6;37318:14;37311:58;37403:15;37398:2;37390:6;37386:15;37379:40;37194:232;:::o;37432:366::-;37574:3;37595:67;37659:2;37654:3;37595:67;:::i;:::-;37588:74;;37671:93;37760:3;37671:93;:::i;:::-;37789:2;37784:3;37780:12;37773:19;;37432:366;;;:::o;37804:419::-;37970:4;38008:2;37997:9;37993:18;37985:26;;38057:9;38051:4;38047:20;38043:1;38032:9;38028:17;38021:47;38085:131;38211:4;38085:131;:::i;:::-;38077:139;;37804:419;;;:::o;38229:228::-;38369:34;38365:1;38357:6;38353:14;38346:58;38438:11;38433:2;38425:6;38421:15;38414:36;38229:228;:::o;38463:366::-;38605:3;38626:67;38690:2;38685:3;38626:67;:::i;:::-;38619:74;;38702:93;38791:3;38702:93;:::i;:::-;38820:2;38815:3;38811:12;38804:19;;38463:366;;;:::o;38835:419::-;39001:4;39039:2;39028:9;39024:18;39016:26;;39088:9;39082:4;39078:20;39074:1;39063:9;39059:17;39052:47;39116:131;39242:4;39116:131;:::i;:::-;39108:139;;38835:419;;;:::o;39260:229::-;39400:34;39396:1;39388:6;39384:14;39377:58;39469:12;39464:2;39456:6;39452:15;39445:37;39260:229;:::o;39495:366::-;39637:3;39658:67;39722:2;39717:3;39658:67;:::i;:::-;39651:74;;39734:93;39823:3;39734:93;:::i;:::-;39852:2;39847:3;39843:12;39836:19;;39495:366;;;:::o;39867:419::-;40033:4;40071:2;40060:9;40056:18;40048:26;;40120:9;40114:4;40110:20;40106:1;40095:9;40091:17;40084:47;40148:131;40274:4;40148:131;:::i;:::-;40140:139;;39867:419;;;:::o;40316:330::-;40432:3;40453:89;40535:6;40530:3;40453:89;:::i;:::-;40446:96;;40552:56;40601:6;40596:3;40589:5;40552:56;:::i;:::-;40633:6;40628:3;40624:16;40617:23;;40316:330;;;;;:::o;40652:475::-;40852:3;40874:105;40975:3;40966:6;40958;40874:105;:::i;:::-;40867:112;;40996:105;41097:3;41088:6;41080;40996:105;:::i;:::-;40989:112;;41118:3;41111:10;;40652:475;;;;;;;:::o;41133:175::-;41273:27;41269:1;41261:6;41257:14;41250:51;41133:175;:::o;41314:366::-;41456:3;41477:67;41541:2;41536:3;41477:67;:::i;:::-;41470:74;;41553:93;41642:3;41553:93;:::i;:::-;41671:2;41666:3;41662:12;41655:19;;41314:366;;;:::o;41686:419::-;41852:4;41890:2;41879:9;41875:18;41867:26;;41939:9;41933:4;41929:20;41925:1;41914:9;41910:17;41903:47;41967:131;42093:4;41967:131;:::i;:::-;41959:139;;41686:419;;;:::o;42111:234::-;42251:34;42247:1;42239:6;42235:14;42228:58;42320:17;42315:2;42307:6;42303:15;42296:42;42111:234;:::o;42351:366::-;42493:3;42514:67;42578:2;42573:3;42514:67;:::i;:::-;42507:74;;42590:93;42679:3;42590:93;:::i;:::-;42708:2;42703:3;42699:12;42692:19;;42351:366;;;:::o;42723:419::-;42889:4;42927:2;42916:9;42912:18;42904:26;;42976:9;42970:4;42966:20;42962:1;42951:9;42947:17;42940:47;43004:131;43130:4;43004:131;:::i;:::-;42996:139;;42723:419;;;:::o;43148:176::-;43288:28;43284:1;43276:6;43272:14;43265:52;43148:176;:::o;43330:402::-;43490:3;43511:85;43593:2;43588:3;43511:85;:::i;:::-;43504:92;;43605:93;43694:3;43605:93;:::i;:::-;43723:2;43718:3;43714:12;43707:19;;43330:402;;;:::o;43738:541::-;43971:3;43993:148;44137:3;43993:148;:::i;:::-;43986:155;;44158:95;44249:3;44240:6;44158:95;:::i;:::-;44151:102;;44270:3;44263:10;;43738:541;;;;:::o;44285:151::-;44425:3;44421:1;44413:6;44409:14;44402:27;44285:151;:::o;44442:400::-;44602:3;44623:84;44705:1;44700:3;44623:84;:::i;:::-;44616:91;;44716:93;44805:3;44716:93;:::i;:::-;44834:1;44829:3;44825:11;44818:18;;44442:400;;;:::o;44848:315::-;44988:66;44984:1;44976:6;44972:14;44965:90;45089:66;45084:2;45076:6;45072:15;45065:91;44848:315;:::o;45169:402::-;45329:3;45350:85;45432:2;45427:3;45350:85;:::i;:::-;45343:92;;45444:93;45533:3;45444:93;:::i;:::-;45562:2;45557:3;45553:12;45546:19;;45169:402;;;:::o;45577:214::-;45717:66;45713:1;45705:6;45701:14;45694:90;45577:214;:::o;45797:400::-;45957:3;45978:84;46060:1;46055:3;45978:84;:::i;:::-;45971:91;;46071:93;46160:3;46071:93;:::i;:::-;46189:1;46184:3;46180:11;46173:18;;45797:400;;;:::o;46203:315::-;46343:66;46339:1;46331:6;46327:14;46320:90;46444:66;46439:2;46431:6;46427:15;46420:91;46203:315;:::o;46524:402::-;46684:3;46705:85;46787:2;46782:3;46705:85;:::i;:::-;46698:92;;46799:93;46888:3;46799:93;:::i;:::-;46917:2;46912:3;46908:12;46901:19;;46524:402;;;:::o;46932:315::-;47072:66;47068:1;47060:6;47056:14;47049:90;47173:66;47168:2;47160:6;47156:15;47149:91;46932:315;:::o;47253:402::-;47413:3;47434:85;47516:2;47511:3;47434:85;:::i;:::-;47427:92;;47528:93;47617:3;47528:93;:::i;:::-;47646:2;47641:3;47637:12;47630:19;;47253:402;;;:::o;47661:214::-;47801:66;47797:1;47789:6;47785:14;47778:90;47661:214;:::o;47881:400::-;48041:3;48062:84;48144:1;48139:3;48062:84;:::i;:::-;48055:91;;48155:93;48244:3;48155:93;:::i;:::-;48273:1;48268:3;48264:11;48257:18;;47881:400;;;:::o;48287:151::-;48427:3;48423:1;48415:6;48411:14;48404:27;48287:151;:::o;48444:400::-;48604:3;48625:84;48707:1;48702:3;48625:84;:::i;:::-;48618:91;;48718:93;48807:3;48718:93;:::i;:::-;48836:1;48831:3;48827:11;48820:18;;48444:400;;;:::o;48850:2711::-;49880:3;49902:148;50046:3;49902:148;:::i;:::-;49895:155;;50067:148;50211:3;50067:148;:::i;:::-;50060:155;;50232:92;50320:3;50311:6;50232:92;:::i;:::-;50225:99;;50341:148;50485:3;50341:148;:::i;:::-;50334:155;;50506:148;50650:3;50506:148;:::i;:::-;50499:155;;50671:92;50759:3;50750:6;50671:92;:::i;:::-;50664:99;;50780:148;50924:3;50780:148;:::i;:::-;50773:155;;50945:148;51089:3;50945:148;:::i;:::-;50938:155;;51110:95;51201:3;51192:6;51110:95;:::i;:::-;51103:102;;51222:148;51366:3;51222:148;:::i;:::-;51215:155;;51387:148;51531:3;51387:148;:::i;:::-;51380:155;;51552:3;51545:10;;48850:2711;;;;;;:::o;51567:177::-;51707:29;51703:1;51695:6;51691:14;51684:53;51567:177;:::o;51750:402::-;51910:3;51931:85;52013:2;52008:3;51931:85;:::i;:::-;51924:92;;52025:93;52114:3;52025:93;:::i;:::-;52143:2;52138:3;52134:12;52127:19;;51750:402;;;:::o;52158:214::-;52298:66;52294:1;52286:6;52282:14;52275:90;52158:214;:::o;52378:402::-;52538:3;52559:85;52641:2;52636:3;52559:85;:::i;:::-;52552:92;;52653:93;52742:3;52653:93;:::i;:::-;52771:2;52766:3;52762:12;52755:19;;52378:402;;;:::o;52786:214::-;52926:66;52922:1;52914:6;52910:14;52903:90;52786:214;:::o;53006:400::-;53166:3;53187:84;53269:1;53264:3;53187:84;:::i;:::-;53180:91;;53280:93;53369:3;53280:93;:::i;:::-;53398:1;53393:3;53389:11;53382:18;;53006:400;;;:::o;53412:214::-;53552:66;53548:1;53540:6;53536:14;53529:90;53412:214;:::o;53632:402::-;53792:3;53813:85;53895:2;53890:3;53813:85;:::i;:::-;53806:92;;53907:93;53996:3;53907:93;:::i;:::-;54025:2;54020:3;54016:12;54009:19;;53632:402;;;:::o;54040:214::-;54180:66;54176:1;54168:6;54164:14;54157:90;54040:214;:::o;54260:402::-;54420:3;54441:85;54523:2;54518:3;54441:85;:::i;:::-;54434:92;;54535:93;54624:3;54535:93;:::i;:::-;54653:2;54648:3;54644:12;54637:19;;54260:402;;;:::o;54668:147::-;54769:11;54806:3;54791:18;;54668:147;;;;:::o;54821:386::-;54925:3;54953:38;54985:5;54953:38;:::i;:::-;55007:88;55088:6;55083:3;55007:88;:::i;:::-;55000:95;;55104:65;55162:6;55157:3;55150:4;55143:5;55139:16;55104:65;:::i;:::-;55194:6;55189:3;55185:16;55178:23;;54929:278;54821:386;;;;:::o;55213:214::-;55353:66;55349:1;55341:6;55337:14;55330:90;55213:214;:::o;55433:402::-;55593:3;55614:85;55696:2;55691:3;55614:85;:::i;:::-;55607:92;;55708:93;55797:3;55708:93;:::i;:::-;55826:2;55821:3;55817:12;55810:19;;55433:402;;;:::o;55841:151::-;55981:3;55977:1;55969:6;55965:14;55958:27;55841:151;:::o;55998:400::-;56158:3;56179:84;56261:1;56256:3;56179:84;:::i;:::-;56172:91;;56272:93;56361:3;56272:93;:::i;:::-;56390:1;56385:3;56381:11;56374:18;;55998:400;;;:::o;56404:214::-;56544:66;56540:1;56532:6;56528:14;56521:90;56404:214;:::o;56624:402::-;56784:3;56805:85;56887:2;56882:3;56805:85;:::i;:::-;56798:92;;56899:93;56988:3;56899:93;:::i;:::-;57017:2;57012:3;57008:12;57001:19;;56624:402;;;:::o;57032:214::-;57172:66;57168:1;57160:6;57156:14;57149:90;57032:214;:::o;57252:400::-;57412:3;57433:84;57515:1;57510:3;57433:84;:::i;:::-;57426:91;;57526:93;57615:3;57526:93;:::i;:::-;57644:1;57639:3;57635:11;57628:18;;57252:400;;;:::o;57658:143::-;57794:3;57790:1;57782:6;57778:14;57771:27;57658:143;:::o;57803:384::-;57963:3;57980:84;58062:1;58057:3;57980:84;:::i;:::-;57973:91;;58069:93;58158:3;58069:93;:::i;:::-;58183:1;58178:3;58174:11;58167:18;;57803:384;;;:::o;58189:4011::-;59715:3;59733:148;59877:3;59733:148;:::i;:::-;59726:155;;59894:148;60038:3;59894:148;:::i;:::-;59887:155;;60055:95;60146:3;60137:6;60055:95;:::i;:::-;60048:102;;60163:148;60307:3;60163:148;:::i;:::-;60156:155;;60324:148;60468:3;60324:148;:::i;:::-;60317:155;;60485:92;60573:3;60564:6;60485:92;:::i;:::-;60478:99;;60590:148;60734:3;60590:148;:::i;:::-;60583:155;;60751:148;60895:3;60751:148;:::i;:::-;60744:155;;60912:93;61001:3;60992:6;60912:93;:::i;:::-;60905:100;;61018:148;61162:3;61018:148;:::i;:::-;61011:155;;61179:148;61323:3;61179:148;:::i;:::-;61172:155;;61340:93;61429:3;61420:6;61340:93;:::i;:::-;61333:100;;61446:148;61590:3;61446:148;:::i;:::-;61439:155;;61607:148;61751:3;61607:148;:::i;:::-;61600:155;;61768:92;61856:3;61847:6;61768:92;:::i;:::-;61761:99;;61873:148;62017:3;61873:148;:::i;:::-;61866:155;;62034:148;62178:3;62034:148;:::i;:::-;62027:155;;62195:3;62188:10;;58189:4011;;;;;;;;:::o;62202:213::-;62338:34;62334:1;62326:6;62322:14;62315:58;62403:8;62398:2;62390:6;62386:15;62379:33;62202:213;:::o;62417:350::-;62559:3;62576:67;62640:2;62635:3;62576:67;:::i;:::-;62569:74;;62648:93;62737:3;62648:93;:::i;:::-;62762:2;62757:3;62753:12;62746:19;;62417:350;;;:::o;62769:403::-;62935:4;62969:2;62958:9;62954:18;62946:26;;63014:9;63008:4;63004:20;63000:1;62989:9;62985:17;62978:47;63038:131;63164:4;63038:131;:::i;:::-;63030:139;;62769:403;;;:::o;63174:174::-;63214:4;63230:20;63248:1;63230:20;:::i;:::-;63225:25;;63260:20;63278:1;63260:20;:::i;:::-;63255:25;;63300:1;63297;63293:9;63285:17;;63320:1;63314:4;63311:11;63308:37;;;63325:18;;:::i;:::-;63308:37;63174:174;;;;:::o;63350:219::-;63486:34;63482:1;63474:6;63470:14;63463:58;63551:14;63546:2;63538:6;63534:15;63527:39;63350:219;:::o;63571:350::-;63713:3;63730:67;63794:2;63789:3;63730:67;:::i;:::-;63723:74;;63802:93;63891:3;63802:93;:::i;:::-;63916:2;63911:3;63907:12;63900:19;;63571:350;;;:::o;63923:403::-;64089:4;64123:2;64112:9;64108:18;64100:26;;64168:9;64162:4;64158:20;64154:1;64143:9;64139:17;64132:47;64192:131;64318:4;64192:131;:::i;:::-;64184:139;;63923:403;;;:::o;64328:216::-;64464:34;64460:1;64452:6;64448:14;64441:58;64529:11;64524:2;64516:6;64512:15;64505:36;64328:216;:::o;64546:350::-;64688:3;64705:67;64769:2;64764:3;64705:67;:::i;:::-;64698:74;;64777:93;64866:3;64777:93;:::i;:::-;64891:2;64886:3;64882:12;64875:19;;64546:350;;;:::o;64898:403::-;65064:4;65098:2;65087:9;65083:18;65075:26;;65143:9;65137:4;65133:20;65129:1;65118:9;65114:17;65107:47;65167:131;65293:4;65167:131;:::i;:::-;65159:139;;64898:403;;;:::o;65303:211::-;65439:34;65435:1;65427:6;65423:14;65416:58;65504:6;65499:2;65491:6;65487:15;65480:31;65303:211;:::o;65516:350::-;65658:3;65675:67;65739:2;65734:3;65675:67;:::i;:::-;65668:74;;65747:93;65836:3;65747:93;:::i;:::-;65861:2;65856:3;65852:12;65845:19;;65516:350;;;:::o;65868:403::-;66034:4;66068:2;66057:9;66053:18;66045:26;;66113:9;66107:4;66103:20;66099:1;66088:9;66084:17;66077:47;66137:131;66263:4;66137:131;:::i;:::-;66129:139;;65868:403;;;:::o;66273:171::-;66313:3;66328:20;66346:1;66328:20;:::i;:::-;66323:25;;66358:20;66376:1;66358:20;:::i;:::-;66353:25;;66397:1;66394;66390:9;66383:16;;66414:3;66411:1;66408:10;66405:36;;;66421:18;;:::i;:::-;66405:36;66273:171;;;;:::o;66446:362::-;66486:7;66505:20;66523:1;66505:20;:::i;:::-;66500:25;;66535:20;66553:1;66535:20;:::i;:::-;66530:25;;66586:1;66583;66579:9;66604:30;66622:11;66604:30;:::i;:::-;66593:41;;66763:1;66754:7;66750:15;66747:1;66744:22;66728:1;66721:9;66705:71;66686:119;;66785:18;;:::i;:::-;66686:119;66494:314;66446:362;;;;:::o;66810:164::-;66854:77;66851:1;66844:88;66947:4;66944:1;66937:15;66967:4;66964:1;66957:15;66976:155;67015:3;67034:24;67052:5;67034:24;:::i;:::-;67025:33;;67076:4;67069:5;67066:15;67063:41;;67084:18;;:::i;:::-;67063:41;67127:1;67120:5;67116:13;67109:20;;66976:155;;;:::o;67133:174::-;67269:34;67265:1;67257:6;67253:14;67246:58;67133:174;:::o;67309:350::-;67451:3;67468:67;67532:2;67527:3;67468:67;:::i;:::-;67461:74;;67540:93;67629:3;67540:93;:::i;:::-;67654:2;67649:3;67645:12;67638:19;;67309:350;;;:::o;67661:403::-;67827:4;67861:2;67850:9;67846:18;67838:26;;67906:9;67900:4;67896:20;67892:1;67881:9;67877:17;67870:47;67930:131;68056:4;67930:131;:::i;:::-;67922:139;;67661:403;;;:::o;68066:225::-;68202:34;68198:1;68190:6;68186:14;68179:58;68267:20;68262:2;68254:6;68250:15;68243:45;68066:225;:::o;68293:350::-;68435:3;68452:67;68516:2;68511:3;68452:67;:::i;:::-;68445:74;;68524:93;68613:3;68524:93;:::i;:::-;68638:2;68633:3;68629:12;68622:19;;68293:350;;;:::o;68645:403::-;68811:4;68845:2;68834:9;68830:18;68822:26;;68890:9;68884:4;68880:20;68876:1;68865:9;68861:17;68854:47;68914:131;69040:4;68914:131;:::i;:::-;68906:139;;68645:403;;;:::o;69050:164::-;69094:77;69091:1;69084:88;69187:4;69184:1;69177:15;69207:4;69204:1;69197:15;69216:165;69256:1;69269:20;69287:1;69269:20;:::i;:::-;69264:25;;69299:20;69317:1;69299:20;:::i;:::-;69294:25;;69334:1;69324:35;;69339:18;;:::i;:::-;69324:35;69377:1;69374;69370:9;69365:14;;69216:165;;;;:::o;69383:612::-;69578:4;69612:3;69601:9;69597:19;69589:27;;69622:71;69690:1;69679:9;69675:17;69666:6;69622:71;:::i;:::-;69699:72;69767:2;69756:9;69752:18;69743:6;69699:72;:::i;:::-;69777;69845:2;69834:9;69830:18;69821:6;69777:72;:::i;:::-;69892:9;69886:4;69882:20;69877:2;69866:9;69862:18;69855:48;69916:76;69987:4;69978:6;69916:76;:::i;:::-;69908:84;;69383:612;;;;;;;:::o;69997:129::-;70053:5;70080:6;70074:13;70065:22;;70092:32;70118:5;70092:32;:::i;:::-;69997:129;;;;:::o;70128:325::-;70197:6;70242:2;70230:9;70221:7;70217:23;70213:32;70210:119;;;70248:79;;:::i;:::-;70210:119;70360:1;70381:63;70436:7;70427:6;70416:9;70412:22;70381:63;:::i;:::-;70371:73;;70335:115;70128:325;;;;:::o;70455:174::-;70591:34;70587:1;70579:6;70575:14;70568:58;70455:174;:::o;70631:350::-;70773:3;70790:67;70854:2;70849:3;70790:67;:::i;:::-;70783:74;;70862:93;70951:3;70862:93;:::i;:::-;70976:2;70971:3;70967:12;70960:19;;70631:350;;;:::o;70983:403::-;71149:4;71183:2;71172:9;71168:18;71160:26;;71228:9;71222:4;71218:20;71214:1;71203:9;71199:17;71192:47;71252:131;71378:4;71252:131;:::i;:::-;71244:139;;70983:403;;;:::o;71388:170::-;71524:30;71520:1;71512:6;71508:14;71501:54;71388:170;:::o;71560:350::-;71702:3;71719:67;71783:2;71778:3;71719:67;:::i;:::-;71712:74;;71791:93;71880:3;71791:93;:::i;:::-;71905:2;71900:3;71896:12;71889:19;;71560:350;;;:::o;71912:403::-;72078:4;72112:2;72101:9;72097:18;72089:26;;72157:9;72151:4;72147:20;72143:1;72132:9;72128:17;72121:47;72181:131;72307:4;72181:131;:::i;:::-;72173:139;;71912:403;;;:::o

Swarm Source

ipfs://447d2ae503037700815174ee63812641b5c62cb2a62e93a8cd8bc1218affb3b9
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.