ETH Price: $2,900.63 (-9.97%)
Gas: 13 Gwei

Token

TradFiLines (TFL)
 

Overview

Max Total Supply

500 TFL

Holders

83

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nakiri.eth
Balance
14 TFL
0x73d30ba3dc4ffd17c28cc2d75d12e50df98f29cf
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:
TradFiLines

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 14: TradFiLines.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./BokkyPooBahsDateTimeLibrary.sol";

interface TradFiRenderer {
    function renderFromSeed(uint256 seed, uint256 extraCount, uint256 tokenId) external view returns(string memory svg);
}
contract TradFiLines is ERC721, ERC721Enumerable, Ownable {
    using BokkyPooBahsDateTimeLibrary for uint;
    string private _baseURIextended;
    uint256 public constant MAX_SUPPLY = 500;
    uint256 public constant MAX_PUBLIC_MINT = 10;
    bool public openForMinting = false;
 
    //Base Extension
    string public constant baseExtension = ".json";

    mapping(uint => uint) numberIndexes;
    mapping (uint => uint) started;
    mapping (uint => uint) public tokenIdToCount;
    mapping (uint => uint) public tokenIdToSeed;
    address public timestampContractAddress;
    uint256 public constant salePrice = 0.01 ether;
    address public tradFiRenderer;
    TradFiRenderer public tfr;


    constructor(address tradFiRenderer) ERC721("TradFiLines", "TFL") {
        tfr = TradFiRenderer(tradFiRenderer);
    }

    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual returns (bytes4) {
        return this.onERC721Received.selector;
    }

    bool public isDST = false;
    uint public hoursToSub = 5;
    function adjustDST() external {
        uint timestamp = subHours(block.timestamp, hoursToSub);
        uint month = getMonth(timestamp);
        if(month > 3 && month < 11) {
            isDST = true;
        } else {
            uint day = getDayOfWeek(timestamp);
            uint dayOfMonth = getDay(timestamp);
            if(month == 3) {
                if(dayOfMonth > 14) {
                    isDST = true;
                } else if(dayOfMonth < 8) {
                    isDST = false;
                } else {
                    if((dayOfMonth - day - 7) < 1) {
                        isDST = false;
                    } else {
                        isDST = true;
                    }
                }
            }
            if(month == 11) {
                if(dayOfMonth > 7) {
                    isDST = false;
                } else {
                    if((dayOfMonth - day) < 1) {
                        isDST = true;
                    } else {
                        isDST = false;
                    }
                }
            }
        }
        if(isDST) {
            hoursToSub = 4;
        } else {
            hoursToSub = 5;
        }
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override(ERC721, IERC721) {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        uint timestamp = subHours(block.timestamp, hoursToSub);
        bool weekend = isWeekEnd(timestamp);
        uint hour = getHour(timestamp);
        uint minute = getMinute(timestamp);
        require(weekend == false, "Trading is closed on weekends");
        require(hour >= 9 && hour < 16, string(abi.encodePacked("Outside regular trading hours")));
        if(hour == 9) {
            require(minute > 29, "Outside regular trading hours");
        }
        tokenIdToCount[tokenId] += 1;
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function isWithinOpeningHours() public view returns(bool){
        uint timestamp = subHours(block.timestamp, hoursToSub);
        bool weekend = isWeekEnd(timestamp);
        uint hour = getHour(timestamp);
        uint minute = getMinute(timestamp);
        bool isWithinOpeningHours = true;
        if(weekend == true) {
            isWithinOpeningHours = false;
        }
        if(hour < 9 || hour > 16) {
            isWithinOpeningHours = false;
        }
        if(hour == 9 && minute < 30) {
            isWithinOpeningHours = false;
        }
        return isWithinOpeningHours;
    }
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }

    function reserve(uint256 n) public onlyOwner {
      uint supply = totalSupply();
      require(supply + n <= MAX_SUPPLY, "Would exceed max tokens");
      for (uint i = 0; i < n; i++) {
        uint seed = supply + i + uint(keccak256(abi.encodePacked(blockhash(block.number-1))));
        tokenIdToSeed[supply + i] = seed;
        _safeMint(msg.sender, supply + i);
      }
    }
    function openMint() public onlyOwner() {
        openForMinting = true;
    }
    
    function getHour(uint timestamp) public pure returns (uint hour) {
        hour = BokkyPooBahsDateTimeLibrary.getHour(timestamp);
    }
    function getMinute(uint timestamp) public pure returns (uint minute) {
        minute = BokkyPooBahsDateTimeLibrary.getMinute(timestamp);
    }
    function getDayOfWeek(uint timestamp) public pure returns (uint dayOfWeek) {
        dayOfWeek = BokkyPooBahsDateTimeLibrary.getDayOfWeek(timestamp);
    }
    function getMonth(uint timestamp) public pure returns (uint month) {
        month = BokkyPooBahsDateTimeLibrary.getMonth(timestamp);
    }
    function isWeekEnd(uint timestamp) public pure returns (bool weekEnd) {
        weekEnd = BokkyPooBahsDateTimeLibrary.isWeekEnd(timestamp);
    }
    function getDay(uint timestamp) public pure returns (uint day) {
        day = BokkyPooBahsDateTimeLibrary.getDay(timestamp);
    }
    function subHours(uint timestamp, uint _hours) public pure returns (uint newTimestamp) {
        newTimestamp = BokkyPooBahsDateTimeLibrary.subHours(timestamp, _hours);
    }
    
    function mint(uint numberOfTokens) payable public {
        uint256 supply = totalSupply();
        require(numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase");
        require(supply + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(msg.value / numberOfTokens == salePrice, "Not the correct amount of ether");
        require(openForMinting == true, "Minting has not started yet");
        for (uint i = 0; i < numberOfTokens; i++) {
            uint seed = supply + i + uint(keccak256(abi.encodePacked(blockhash(block.number-1))));
            tokenIdToSeed[supply + i] = seed;
            _safeMint(msg.sender, supply + i);
        }
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        ); 
        uint256 seed = tokenIdToSeed[_tokenId];
        return
            string(
                abi.encodePacked(
                    tfr.renderFromSeed(seed, tokenIdToCount[_tokenId], _tokenId)
                )
            );
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 14: BokkyPooBahsDateTimeLibrary.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

// ----------------------------------------------------------------------------
// BokkyPooBah's DateTime Library v1.01
//
// A gas-efficient Solidity date and time library
//
// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary
//
// Tested date range 1970/01/01 to 2345/12/31
//
// Conventions:
// Unit      | Range         | Notes
// :-------- |:-------------:|:-----
// timestamp | >= 0          | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC
// year      | 1970 ... 2345 |
// month     | 1 ... 12      |
// day       | 1 ... 31      |
// hour      | 0 ... 23      |
// minute    | 0 ... 59      |
// second    | 0 ... 59      |
// dayOfWeek | 1 ... 7       | 1 = Monday, ..., 7 = Sunday
//
//
// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.
// ----------------------------------------------------------------------------

library BokkyPooBahsDateTimeLibrary {

    uint constant SECONDS_PER_DAY = 24 * 60 * 60;
    uint constant SECONDS_PER_HOUR = 60 * 60;
    uint constant SECONDS_PER_MINUTE = 60;
    int constant OFFSET19700101 = 2440588;

    uint constant DOW_MON = 1;
    uint constant DOW_TUE = 2;
    uint constant DOW_WED = 3;
    uint constant DOW_THU = 4;
    uint constant DOW_FRI = 5;
    uint constant DOW_SAT = 6;
    uint constant DOW_SUN = 7;

    // ------------------------------------------------------------------------
    // Calculate the number of days from 1970/01/01 to year/month/day using
    // the date conversion algorithm from
    //   https://aa.usno.navy.mil/faq/JD_formula.html
    // and subtracting the offset 2440588 so that 1970/01/01 is day 0
    //
    // days = day
    //      - 32075
    //      + 1461 * (year + 4800 + (month - 14) / 12) / 4
    //      + 367 * (month - 2 - (month - 14) / 12 * 12) / 12
    //      - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4
    //      - offset
    // ------------------------------------------------------------------------
    function _daysFromDate(uint year, uint month, uint day) internal pure returns (uint _days) {
        require(year >= 1970);
        int _year = int(year);
        int _month = int(month);
        int _day = int(day);

        int __days = _day
          - 32075
          + 1461 * (_year + 4800 + (_month - 14) / 12) / 4
          + 367 * (_month - 2 - (_month - 14) / 12 * 12) / 12
          - 3 * ((_year + 4900 + (_month - 14) / 12) / 100) / 4
          - OFFSET19700101;

        _days = uint(__days);
    }

    // ------------------------------------------------------------------------
    // Calculate year/month/day from the number of days since 1970/01/01 using
    // the date conversion algorithm from
    //   http://aa.usno.navy.mil/faq/docs/JD_Formula.php
    // and adding the offset 2440588 so that 1970/01/01 is day 0
    //
    // int L = days + 68569 + offset
    // int N = 4 * L / 146097
    // L = L - (146097 * N + 3) / 4
    // year = 4000 * (L + 1) / 1461001
    // L = L - 1461 * year / 4 + 31
    // month = 80 * L / 2447
    // dd = L - 2447 * month / 80
    // L = month / 11
    // month = month + 2 - 12 * L
    // year = 100 * (N - 49) + year + L
    // ------------------------------------------------------------------------
    function _daysToDate(uint _days) internal pure returns (uint year, uint month, uint day) {
        int __days = int(_days);

        int L = __days + 68569 + OFFSET19700101;
        int N = 4 * L / 146097;
        L = L - (146097 * N + 3) / 4;
        int _year = 4000 * (L + 1) / 1461001;
        L = L - 1461 * _year / 4 + 31;
        int _month = 80 * L / 2447;
        int _day = L - 2447 * _month / 80;
        L = _month / 11;
        _month = _month + 2 - 12 * L;
        _year = 100 * (N - 49) + _year + L;

        year = uint(_year);
        month = uint(_month);
        day = uint(_day);
    }

    function timestampFromDate(uint year, uint month, uint day) internal pure returns (uint timestamp) {
        timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY;
    }
    function timestampFromDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) internal pure returns (uint timestamp) {
        timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR + minute * SECONDS_PER_MINUTE + second;
    }
    function timestampToDate(uint timestamp) internal pure returns (uint year, uint month, uint day) {
        (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }
    function timestampToDateTime(uint timestamp) internal pure returns (uint year, uint month, uint day, uint hour, uint minute, uint second) {
        (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        uint secs = timestamp % SECONDS_PER_DAY;
        hour = secs / SECONDS_PER_HOUR;
        secs = secs % SECONDS_PER_HOUR;
        minute = secs / SECONDS_PER_MINUTE;
        second = secs % SECONDS_PER_MINUTE;
    }

    function isValidDate(uint year, uint month, uint day) internal pure returns (bool valid) {
        if (year >= 1970 && month > 0 && month <= 12) {
            uint daysInMonth = _getDaysInMonth(year, month);
            if (day > 0 && day <= daysInMonth) {
                valid = true;
            }
        }
    }
    function isValidDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) internal pure returns (bool valid) {
        if (isValidDate(year, month, day)) {
            if (hour < 24 && minute < 60 && second < 60) {
                valid = true;
            }
        }
    }
    function isLeapYear(uint timestamp) internal pure returns (bool leapYear) {
        (uint year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
        leapYear = _isLeapYear(year);
    }
    function _isLeapYear(uint year) internal pure returns (bool leapYear) {
        leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    }
    function isWeekDay(uint timestamp) internal pure returns (bool weekDay) {
        weekDay = getDayOfWeek(timestamp) <= DOW_FRI;
    }
    function isWeekEnd(uint timestamp) internal pure returns (bool weekEnd) {
        weekEnd = getDayOfWeek(timestamp) >= DOW_SAT;
    }
    function getDaysInMonth(uint timestamp) internal pure returns (uint daysInMonth) {
        (uint year, uint month,) = _daysToDate(timestamp / SECONDS_PER_DAY);
        daysInMonth = _getDaysInMonth(year, month);
    }
    function _getDaysInMonth(uint year, uint month) internal pure returns (uint daysInMonth) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
            daysInMonth = 31;
        } else if (month != 2) {
            daysInMonth = 30;
        } else {
            daysInMonth = _isLeapYear(year) ? 29 : 28;
        }
    }
    // 1 = Monday, 7 = Sunday
    function getDayOfWeek(uint timestamp) internal pure returns (uint dayOfWeek) {
        uint _days = timestamp / SECONDS_PER_DAY;
        dayOfWeek = (_days + 3) % 7 + 1;
    }

    function getYear(uint timestamp) internal pure returns (uint year) {
        (year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }
    function getMonth(uint timestamp) internal pure returns (uint month) {
        (,month,) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }
    function getDay(uint timestamp) internal pure returns (uint day) {
        (,,day) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }
    function getHour(uint timestamp) internal pure returns (uint hour) {
        uint secs = timestamp % SECONDS_PER_DAY;
        hour = secs / SECONDS_PER_HOUR;
    }
    function getMinute(uint timestamp) internal pure returns (uint minute) {
        uint secs = timestamp % SECONDS_PER_HOUR;
        minute = secs / SECONDS_PER_MINUTE;
    }
    function getSecond(uint timestamp) internal pure returns (uint second) {
        second = timestamp % SECONDS_PER_MINUTE;
    }

    function addYears(uint timestamp, uint _years) internal pure returns (uint newTimestamp) {
        (uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        year += _years;
        uint daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY;
        require(newTimestamp >= timestamp);
    }
    function addMonths(uint timestamp, uint _months) internal pure returns (uint newTimestamp) {
        (uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        month += _months;
        year += (month - 1) / 12;
        month = (month - 1) % 12 + 1;
        uint daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY;
        require(newTimestamp >= timestamp);
    }
    function addDays(uint timestamp, uint _days) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp + _days * SECONDS_PER_DAY;
        require(newTimestamp >= timestamp);
    }
    function addHours(uint timestamp, uint _hours) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp + _hours * SECONDS_PER_HOUR;
        require(newTimestamp >= timestamp);
    }
    function addMinutes(uint timestamp, uint _minutes) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE;
        require(newTimestamp >= timestamp);
    }
    function addSeconds(uint timestamp, uint _seconds) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp + _seconds;
        require(newTimestamp >= timestamp);
    }

    function subYears(uint timestamp, uint _years) internal pure returns (uint newTimestamp) {
        (uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        year -= _years;
        uint daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY;
        require(newTimestamp <= timestamp);
    }
    function subMonths(uint timestamp, uint _months) internal pure returns (uint newTimestamp) {
        (uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        uint yearMonth = year * 12 + (month - 1) - _months;
        year = yearMonth / 12;
        month = yearMonth % 12 + 1;
        uint daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY;
        require(newTimestamp <= timestamp);
    }
    function subDays(uint timestamp, uint _days) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp - _days * SECONDS_PER_DAY;
        require(newTimestamp <= timestamp);
    }
    function subHours(uint timestamp, uint _hours) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp - _hours * SECONDS_PER_HOUR;
        require(newTimestamp <= timestamp);
    }
    function subMinutes(uint timestamp, uint _minutes) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp - _minutes * SECONDS_PER_MINUTE;
        require(newTimestamp <= timestamp);
    }
    function subSeconds(uint timestamp, uint _seconds) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp - _seconds;
        require(newTimestamp <= timestamp);
    }

    function diffYears(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _years) {
        require(fromTimestamp <= toTimestamp);
        (uint fromYear,,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY);
        (uint toYear,,) = _daysToDate(toTimestamp / SECONDS_PER_DAY);
        _years = toYear - fromYear;
    }
    function diffMonths(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _months) {
        require(fromTimestamp <= toTimestamp);
        (uint fromYear, uint fromMonth,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY);
        (uint toYear, uint toMonth,) = _daysToDate(toTimestamp / SECONDS_PER_DAY);
        _months = toYear * 12 + toMonth - fromYear * 12 - fromMonth;
    }
    function diffDays(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _days) {
        require(fromTimestamp <= toTimestamp);
        _days = (toTimestamp - fromTimestamp) / SECONDS_PER_DAY;
    }
    function diffHours(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _hours) {
        require(fromTimestamp <= toTimestamp);
        _hours = (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR;
    }
    function diffMinutes(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _minutes) {
        require(fromTimestamp <= toTimestamp);
        _minutes = (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE;
    }
    function diffSeconds(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _seconds) {
        require(fromTimestamp <= toTimestamp);
        _seconds = toTimestamp - fromTimestamp;
    }
}

File 3 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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;
    }
}

File 4 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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;
    }
}

File 5 of 14: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 {}
}

File 6 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}

File 8 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

File 9 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 10 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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);
}

File 11 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(address(0));
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 13 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"tradFiRenderer","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":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustDST","outputs":[],"stateMutability":"nonpayable","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"timestamp","type":"uint256"}],"name":"getDay","outputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getDayOfWeek","outputs":[{"internalType":"uint256","name":"dayOfWeek","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getHour","outputs":[{"internalType":"uint256","name":"hour","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getMinute","outputs":[{"internalType":"uint256","name":"minute","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getMonth","outputs":[{"internalType":"uint256","name":"month","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hoursToSub","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"isDST","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"isWeekEnd","outputs":[{"internalType":"bool","name":"weekEnd","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"isWithinOpeningHours","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openForMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"reserve","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":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"_hours","type":"uint256"}],"name":"subHours","outputs":[{"internalType":"uint256","name":"newTimestamp","type":"uint256"}],"stateMutability":"pure","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":[],"name":"tfr","outputs":[{"internalType":"contract TradFiRenderer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timestampContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"tradFiRenderer","outputs":[{"internalType":"address","name":"","type":"address"}],"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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506000601360146101000a81548160ff02191690831515021790555060056014553480156200004c57600080fd5b50604051620054d4380380620054d48339818101604052810190620000729190620002a4565b6040518060400160405280600b81526020017f5472616446694c696e65730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f54464c00000000000000000000000000000000000000000000000000000000008152508160009081620000ef919062000550565b50806001908162000101919062000550565b50505062000124620001186200016c60201b60201c565b6200017460201b60201c565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000637565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200026c826200023f565b9050919050565b6200027e816200025f565b81146200028a57600080fd5b50565b6000815190506200029e8162000273565b92915050565b600060208284031215620002bd57620002bc6200023a565b5b6000620002cd848285016200028d565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035857607f821691505b6020821081036200036e576200036d62000310565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000399565b620003e4868362000399565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004316200042b6200042584620003fc565b62000406565b620003fc565b9050919050565b6000819050919050565b6200044d8362000410565b620004656200045c8262000438565b848454620003a6565b825550505050565b600090565b6200047c6200046d565b6200048981848462000442565b505050565b5b81811015620004b157620004a560008262000472565b6001810190506200048f565b5050565b601f8211156200050057620004ca8162000374565b620004d58462000389565b81016020851015620004e5578190505b620004fd620004f48562000389565b8301826200048e565b50505b505050565b600082821c905092915050565b6000620005256000198460080262000505565b1980831691505092915050565b600062000540838362000512565b9150826002028217905092915050565b6200055b82620002d6565b67ffffffffffffffff811115620005775762000576620002e1565b5b6200058382546200033f565b62000590828285620004b5565b600060209050601f831160018114620005c85760008415620005b3578287015190505b620005bf858262000532565b8655506200062f565b601f198416620005d88662000374565b60005b828110156200060257848901518255600182019150602085019450602081019050620005db565b868310156200062257848901516200061e601f89168262000512565b8355505b6001600288020188555050505b505050505050565b614e8d80620006476000396000f3fe60806040526004361061027c5760003560e01c80636c62ecca1161014f578063a324ad24116100c1578063dce9e6f71161007a578063dce9e6f7146109da578063e985e9c514610a05578063f2fde38b14610a42578063f51f96dd14610a6b578063f9134e6814610a96578063fa93f88314610ad35761027c565b8063a324ad24146108ca578063acc9b7b214610907578063b88d4fde14610932578063bce6d6721461095b578063c668286214610972578063c87b56dd1461099d5761027c565b80638da5cb5b116101135780638da5cb5b146107d957806390ec5dd11461080457806395d89b411461082f578063960d33da1461085a578063a0712d6814610885578063a22cb465146108a15761027c565b80636c62ecca1461070857806370a082311461071f578063715018a61461075c57806375e9169114610773578063819b25ba146107b05761027c565b80633b4d0bd2116101f35780634de3beeb116101ac5780634de3beeb146105d25780634f6ccce7146105fd57806355f804b31461063a5780636352211e1461066357806365c72840146106a057806365f13097146106dd5761027c565b80633b4d0bd2146104c25780633ccfd60b146104ed5780633e239e1a1461050457806341e1c3781461054157806342842e0e1461056c5780634371c465146105955761027c565b8063150b7a0211610245578063150b7a021461038c57806318160ddd146103c957806322f8a2b8146103f457806323b872dd146104315780632f745c591461045a57806332cb6b0c146104975761027c565b80625015531461028157806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b314610363575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a3919061317e565b610b10565b6040516102b591906131cd565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613240565b610b24565b6040516102f29190613288565b60405180910390f35b34801561030757600080fd5b50610310610b36565b60405161031d9190613333565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613355565b610bc8565b60405161035a91906133c3565b60405180910390f35b34801561036f57600080fd5b5061038a6004803603810190610385919061340a565b610c4d565b005b34801561039857600080fd5b506103b360048036038101906103ae919061357f565b610d64565b6040516103c09190613611565b60405180910390f35b3480156103d557600080fd5b506103de610d78565b6040516103eb91906131cd565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613355565b610d85565b60405161042891906131cd565b60405180910390f35b34801561043d57600080fd5b506104586004803603810190610453919061362c565b610d97565b005b34801561046657600080fd5b50610481600480360381019061047c919061340a565b610df7565b60405161048e91906131cd565b60405180910390f35b3480156104a357600080fd5b506104ac610e9c565b6040516104b991906131cd565b60405180910390f35b3480156104ce57600080fd5b506104d7610ea2565b6040516104e49190613288565b60405180910390f35b3480156104f957600080fd5b50610502610eb5565b005b34801561051057600080fd5b5061052b60048036038101906105269190613355565b610f0c565b60405161053891906131cd565b60405180910390f35b34801561054d57600080fd5b50610556610f1e565b60405161056391906136de565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e919061362c565b610f44565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613355565b610f64565b6040516105c99190613288565b60405180910390f35b3480156105de57600080fd5b506105e7610f76565b6040516105f491906133c3565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613355565b610f9c565b60405161063191906131cd565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c919061379a565b61100d565b005b34801561066f57600080fd5b5061068a60048036038101906106859190613355565b611028565b60405161069791906133c3565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190613355565b6110d9565b6040516106d491906131cd565b60405180910390f35b3480156106e957600080fd5b506106f26110eb565b6040516106ff91906131cd565b60405180910390f35b34801561071457600080fd5b5061071d6110f0565b005b34801561072b57600080fd5b50610746600480360381019061074191906137e3565b6112ca565b60405161075391906131cd565b60405180910390f35b34801561076857600080fd5b50610771611381565b005b34801561077f57600080fd5b5061079a60048036038101906107959190613355565b611395565b6040516107a791906131cd565b60405180910390f35b3480156107bc57600080fd5b506107d760048036038101906107d29190613355565b6113ad565b005b3480156107e557600080fd5b506107ee6114be565b6040516107fb91906133c3565b60405180910390f35b34801561081057600080fd5b506108196114e8565b60405161082691906131cd565b60405180910390f35b34801561083b57600080fd5b506108446114ee565b6040516108519190613333565b60405180910390f35b34801561086657600080fd5b5061086f611580565b60405161087c9190613288565b60405180910390f35b61089f600480360381019061089a9190613355565b611593565b005b3480156108ad57600080fd5b506108c860048036038101906108c3919061383c565b61178a565b005b3480156108d657600080fd5b506108f160048036038101906108ec9190613355565b61190a565b6040516108fe91906131cd565b60405180910390f35b34801561091357600080fd5b5061091c61191c565b60405161092991906133c3565b60405180910390f35b34801561093e57600080fd5b506109596004803603810190610954919061357f565b611942565b005b34801561096757600080fd5b506109706119a4565b005b34801561097e57600080fd5b506109876119c9565b6040516109949190613333565b60405180910390f35b3480156109a957600080fd5b506109c460048036038101906109bf9190613355565b611a02565b6040516109d19190613333565b60405180910390f35b3480156109e657600080fd5b506109ef611b43565b6040516109fc9190613288565b60405180910390f35b348015610a1157600080fd5b50610a2c6004803603810190610a27919061387c565b611bd0565b604051610a399190613288565b60405180910390f35b348015610a4e57600080fd5b50610a696004803603810190610a6491906137e3565b611c64565b005b348015610a7757600080fd5b50610a80611ce7565b604051610a8d91906131cd565b60405180910390f35b348015610aa257600080fd5b50610abd6004803603810190610ab89190613355565b611cf2565b604051610aca91906131cd565b60405180910390f35b348015610adf57600080fd5b50610afa6004803603810190610af59190613355565b611d0a565b604051610b0791906131cd565b60405180910390f35b6000610b1c8383611d1c565b905092915050565b6000610b2f82611d4c565b9050919050565b606060008054610b45906138eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b71906138eb565b8015610bbe5780601f10610b9357610100808354040283529160200191610bbe565b820191906000526020600020905b815481529060010190602001808311610ba157829003601f168201915b5050505050905090565b6000610bd382611dc6565b610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c099061398e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5882611028565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf90613a20565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce7611e32565b73ffffffffffffffffffffffffffffffffffffffff161480610d165750610d1581610d10611e32565b611bd0565b5b610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c90613ab2565b60405180910390fd5b610d5f8383611e3a565b505050565b600063150b7a0260e01b9050949350505050565b6000600880549050905090565b6000610d9082611ef3565b9050919050565b610da8610da2611e32565b82611f34565b610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90613b44565b60405180910390fd5b610df2838383612012565b505050565b6000610e02836112ca565b8210610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90613bd6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6101f481565b601360149054906101000a900460ff1681565b610ebd61226d565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f08573d6000803e3d6000fd5b5050565b6000610f17826122eb565b9050919050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f5f83838360405180602001604052806000815250611942565b505050565b6000610f6f82612315565b9050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610fa6610d78565b8210610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90613c68565b60405180910390fd5b60088281548110610ffb57610ffa613c88565b5b90600052602060002001549050919050565b61101561226d565b80600b90816110249190613e59565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790613f9d565b60405180910390fd5b80915050919050565b60006110e48261232b565b9050919050565b600a81565b60006110fe42601454610b10565b9050600061110b8261190a565b905060038111801561111d5750600b81105b15611142576001601360146101000a81548160ff02191690831515021790555061129b565b600061114d83610d85565b9050600061115a846110d9565b90506003830361121557600e81111561118d576001601360146101000a81548160ff021916908315150217905550611214565b60088110156111b6576000601360146101000a81548160ff021916908315150217905550611213565b6001600783836111c69190613fec565b6111d09190613fec565b10156111f6576000601360146101000a81548160ff021916908315150217905550611212565b6001601360146101000a81548160ff0219169083151502179055505b5b5b5b600b8303611298576007811115611246576000601360146101000a81548160ff021916908315150217905550611297565b600182826112549190613fec565b101561127a576001601360146101000a81548160ff021916908315150217905550611296565b6000601360146101000a81548160ff0219169083151502179055505b5b5b50505b601360149054906101000a900460ff16156112bd5760046014819055506112c6565b60056014819055505b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190614092565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61138961226d565b6113936000612352565b565b60106020528060005260406000206000915090505481565b6113b561226d565b60006113bf610d78565b90506101f482826113d091906140b2565b1115611411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140890614132565b60405180910390fd5b60005b828110156114b957600060014361142b9190613fec565b4060405160200161143c919061417d565b6040516020818303038152906040528051906020012060001c828461146191906140b2565b61146b91906140b2565b90508060106000848661147e91906140b2565b8152602001908152602001600020819055506114a53383856114a091906140b2565b612418565b5080806114b190614198565b915050611414565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b6060600180546114fd906138eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611529906138eb565b80156115765780601f1061154b57610100808354040283529160200191611576565b820191906000526020600020905b81548152906001019060200180831161155957829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1681565b600061159d610d78565b9050600a8211156115e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115da9061422c565b60405180910390fd5b6101f482826115f291906140b2565b1115611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90614298565b60405180910390fd5b662386f26fc10000823461164791906142e7565b14611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90614364565b60405180910390fd5b60011515600c60009054906101000a900460ff161515146116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d4906143d0565b60405180910390fd5b60005b828110156117855760006001436116f79190613fec565b40604051602001611708919061417d565b6040516020818303038152906040528051906020012060001c828461172d91906140b2565b61173791906140b2565b90508060106000848661174a91906140b2565b81526020019081526020016000208190555061177133838561176c91906140b2565b612418565b50808061177d90614198565b9150506116e0565b505050565b611792611e32565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f69061443c565b60405180910390fd5b806005600061180c611e32565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118b9611e32565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118fe9190613288565b60405180910390a35050565b600061191582612436565b9050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61195361194d611e32565b83611f34565b611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990613b44565b60405180910390fd5b61199e8484848461245c565b50505050565b6119ac61226d565b6001600c60006101000a81548160ff021916908315150217905550565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b6060611a0d82611dc6565b611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43906144ce565b60405180910390fd5b600060106000848152602001908152602001600020549050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166369272f0482600f600087815260200190815260200160002054866040518463ffffffff1660e01b8152600401611ad6939291906144ee565b600060405180830381865afa158015611af3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611b1c9190614595565b604051602001611b2c919061461a565b604051602081830303815290604052915050919050565b600080611b5242601454610b10565b90506000611b5f82610f64565b90506000611b6c83610f0c565b90506000611b7984611d0a565b90506000600190506001151584151503611b9257600090505b6009831080611ba15750601083115b15611bab57600090505b600983148015611bbb5750601e82105b15611bc557600090505b809550505050505090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c6c61226d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd2906146a3565b60405180910390fd5b611ce481612352565b50565b662386f26fc1000081565b600f6020528060005260406000206000915090505481565b6000611d15826124b8565b9050919050565b6000610e1082611d2c91906146c3565b83611d379190613fec565b905082811115611d4657600080fd5b92915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dbf5750611dbe826124e0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ead83611028565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806201518083611f0591906142e7565b905060016007600383611f1891906140b2565b611f229190614705565b611f2c91906140b2565b915050919050565b6000611f3f82611dc6565b611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f75906147a8565b60405180910390fd5b6000611f8983611028565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ff857508373ffffffffffffffffffffffffffffffffffffffff16611fe084610bc8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061200957506120088185611bd0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661203282611028565b73ffffffffffffffffffffffffffffffffffffffff1614612088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207f9061483a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ee906148cc565b60405180910390fd5b6121028383836125c2565b61210d600082611e3a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461215d9190613fec565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b491906140b2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612275611e32565b73ffffffffffffffffffffffffffffffffffffffff166122936114be565b73ffffffffffffffffffffffffffffffffffffffff16146122e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e090614938565b60405180910390fd5b565b60008062015180836122fd9190614705565b9050610e108161230d91906142e7565b915050919050565b6000600661232283611ef3565b10159050919050565b6000612344620151808361233f91906142e7565b61273c565b909150905080915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124328282604051806020016040528060008152506128db565b5050565b600061244f620151808361244a91906142e7565b61273c565b9091505080915050919050565b612467848484612012565b61247384848484612936565b6124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a9906149ca565b60405180910390fd5b50505050565b600080610e10836124c99190614705565b9050603c816124d891906142e7565b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125bb57506125ba82612abd565b5b9050919050565b60006125d042601454610b10565b905060006125dd82610f64565b905060006125ea83610f0c565b905060006125f784611d0a565b90506000151583151514612640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263790614a36565b60405180910390fd5b600982101580156126515750601082105b60405160200161266090614aa2565b604051602081830303815290604052906126b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a79190613333565b60405180910390fd5b50600982036126fd57601d81116126fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f390614ada565b60405180910390fd5b5b6001600f6000878152602001908152602001600020600082825461272191906140b2565b92505081905550612733878787612b27565b50505050505050565b600080600080849050600062253d8c62010bd98361275a9190614b04565b6127649190614b04565b9050600062023ab18260046127799190614b48565b6127839190614bc0565b9050600460038262023ab16127989190614b48565b6127a29190614b04565b6127ac9190614bc0565b826127b79190614c2a565b9150600062164b096001846127cc9190614b04565b610fa06127d99190614b48565b6127e39190614bc0565b9050601f6004826105b56127f79190614b48565b6128019190614bc0565b8461280c9190614c2a565b6128169190614b04565b9250600061098f84605061282a9190614b48565b6128349190614bc0565b9050600060508261098f6128489190614b48565b6128529190614bc0565b8561285d9190614c2a565b9050600b8261286c9190614bc0565b945084600c61287b9190614b48565b6002836128889190614b04565b6128929190614c2a565b915084836031866128a39190614c2a565b60646128af9190614b48565b6128b99190614b04565b6128c39190614b04565b92508298508197508096505050505050509193909250565b6128e58383612c39565b6128f26000848484612936565b612931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612928906149ca565b60405180910390fd5b505050565b60006129578473ffffffffffffffffffffffffffffffffffffffff16612e06565b15612ab0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612980611e32565b8786866040518563ffffffff1660e01b81526004016129a29493929190614cc2565b6020604051808303816000875af19250505080156129de57506040513d601f19601f820116820180604052508101906129db9190614d23565b60015b612a60573d8060008114612a0e576040519150601f19603f3d011682016040523d82523d6000602084013e612a13565b606091505b506000815103612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f906149ca565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ab5565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b32838383612e29565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b7457612b6f81612e2e565b612bb3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bb257612bb18382612e77565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612bf557612bf081612fe4565b612c34565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3357612c3282826130b5565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9f90614d9c565b60405180910390fd5b612cb181611dc6565b15612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce890614e08565b60405180910390fd5b612cfd600083836125c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4d91906140b2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e84846112ca565b612e8e9190613fec565b9050600060076000848152602001908152602001600020549050818114612f73576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ff89190613fec565b905060006009600084815260200190815260200160002054905060006008838154811061302857613027613c88565b5b90600052602060002001549050806008838154811061304a57613049613c88565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061309957613098614e28565b5b6001900381819060005260206000200160009055905550505050565b60006130c0836112ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61315b81613148565b811461316657600080fd5b50565b60008135905061317881613152565b92915050565b600080604083850312156131955761319461313e565b5b60006131a385828601613169565b92505060206131b485828601613169565b9150509250929050565b6131c781613148565b82525050565b60006020820190506131e260008301846131be565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61321d816131e8565b811461322857600080fd5b50565b60008135905061323a81613214565b92915050565b6000602082840312156132565761325561313e565b5b60006132648482850161322b565b91505092915050565b60008115159050919050565b6132828161326d565b82525050565b600060208201905061329d6000830184613279565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132dd5780820151818401526020810190506132c2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613305826132a3565b61330f81856132ae565b935061331f8185602086016132bf565b613328816132e9565b840191505092915050565b6000602082019050818103600083015261334d81846132fa565b905092915050565b60006020828403121561336b5761336a61313e565b5b600061337984828501613169565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133ad82613382565b9050919050565b6133bd816133a2565b82525050565b60006020820190506133d860008301846133b4565b92915050565b6133e7816133a2565b81146133f257600080fd5b50565b600081359050613404816133de565b92915050565b600080604083850312156134215761342061313e565b5b600061342f858286016133f5565b925050602061344085828601613169565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61348c826132e9565b810181811067ffffffffffffffff821117156134ab576134aa613454565b5b80604052505050565b60006134be613134565b90506134ca8282613483565b919050565b600067ffffffffffffffff8211156134ea576134e9613454565b5b6134f3826132e9565b9050602081019050919050565b82818337600083830152505050565b600061352261351d846134cf565b6134b4565b90508281526020810184848401111561353e5761353d61344f565b5b613549848285613500565b509392505050565b600082601f8301126135665761356561344a565b5b813561357684826020860161350f565b91505092915050565b600080600080608085870312156135995761359861313e565b5b60006135a7878288016133f5565b94505060206135b8878288016133f5565b93505060406135c987828801613169565b925050606085013567ffffffffffffffff8111156135ea576135e9613143565b5b6135f687828801613551565b91505092959194509250565b61360b816131e8565b82525050565b60006020820190506136266000830184613602565b92915050565b6000806000606084860312156136455761364461313e565b5b6000613653868287016133f5565b9350506020613664868287016133f5565b925050604061367586828701613169565b9150509250925092565b6000819050919050565b60006136a461369f61369a84613382565b61367f565b613382565b9050919050565b60006136b682613689565b9050919050565b60006136c8826136ab565b9050919050565b6136d8816136bd565b82525050565b60006020820190506136f360008301846136cf565b92915050565b600067ffffffffffffffff82111561371457613713613454565b5b61371d826132e9565b9050602081019050919050565b600061373d613738846136f9565b6134b4565b9050828152602081018484840111156137595761375861344f565b5b613764848285613500565b509392505050565b600082601f8301126137815761378061344a565b5b813561379184826020860161372a565b91505092915050565b6000602082840312156137b0576137af61313e565b5b600082013567ffffffffffffffff8111156137ce576137cd613143565b5b6137da8482850161376c565b91505092915050565b6000602082840312156137f9576137f861313e565b5b6000613807848285016133f5565b91505092915050565b6138198161326d565b811461382457600080fd5b50565b60008135905061383681613810565b92915050565b600080604083850312156138535761385261313e565b5b6000613861858286016133f5565b925050602061387285828601613827565b9150509250929050565b600080604083850312156138935761389261313e565b5b60006138a1858286016133f5565b92505060206138b2858286016133f5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061390357607f821691505b602082108103613916576139156138bc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613978602c836132ae565b91506139838261391c565b604082019050919050565b600060208201905081810360008301526139a78161396b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0a6021836132ae565b9150613a15826139ae565b604082019050919050565b60006020820190508181036000830152613a39816139fd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a9c6038836132ae565b9150613aa782613a40565b604082019050919050565b60006020820190508181036000830152613acb81613a8f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b2e6031836132ae565b9150613b3982613ad2565b604082019050919050565b60006020820190508181036000830152613b5d81613b21565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613bc0602b836132ae565b9150613bcb82613b64565b604082019050919050565b60006020820190508181036000830152613bef81613bb3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613c52602c836132ae565b9150613c5d82613bf6565b604082019050919050565b60006020820190508181036000830152613c8181613c45565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613d197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cdc565b613d238683613cdc565b95508019841693508086168417925050509392505050565b6000613d56613d51613d4c84613148565b61367f565b613148565b9050919050565b6000819050919050565b613d7083613d3b565b613d84613d7c82613d5d565b848454613ce9565b825550505050565b600090565b613d99613d8c565b613da4818484613d67565b505050565b5b81811015613dc857613dbd600082613d91565b600181019050613daa565b5050565b601f821115613e0d57613dde81613cb7565b613de784613ccc565b81016020851015613df6578190505b613e0a613e0285613ccc565b830182613da9565b50505b505050565b600082821c905092915050565b6000613e3060001984600802613e12565b1980831691505092915050565b6000613e498383613e1f565b9150826002028217905092915050565b613e62826132a3565b67ffffffffffffffff811115613e7b57613e7a613454565b5b613e8582546138eb565b613e90828285613dcc565b600060209050601f831160018114613ec35760008415613eb1578287015190505b613ebb8582613e3d565b865550613f23565b601f198416613ed186613cb7565b60005b82811015613ef957848901518255600182019150602085019450602081019050613ed4565b86831015613f165784890151613f12601f891682613e1f565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f876029836132ae565b9150613f9282613f2b565b604082019050919050565b60006020820190508181036000830152613fb681613f7a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ff782613148565b915061400283613148565b925082820390508181111561401a57614019613fbd565b5b92915050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061407c602a836132ae565b915061408782614020565b604082019050919050565b600060208201905081810360008301526140ab8161406f565b9050919050565b60006140bd82613148565b91506140c883613148565b92508282019050808211156140e0576140df613fbd565b5b92915050565b7f576f756c6420657863656564206d617820746f6b656e73000000000000000000600082015250565b600061411c6017836132ae565b9150614127826140e6565b602082019050919050565b6000602082019050818103600083015261414b8161410f565b9050919050565b6000819050919050565b6000819050919050565b61417761417282614152565b61415c565b82525050565b60006141898284614166565b60208201915081905092915050565b60006141a382613148565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141d5576141d4613fbd565b5b600182019050919050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b6000614216601b836132ae565b9150614221826141e0565b602082019050919050565b6000602082019050818103600083015261424581614209565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b60006142826020836132ae565b915061428d8261424c565b602082019050919050565b600060208201905081810360008301526142b181614275565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142f282613148565b91506142fd83613148565b92508261430d5761430c6142b8565b5b828204905092915050565b7f4e6f742074686520636f727265637420616d6f756e74206f6620657468657200600082015250565b600061434e601f836132ae565b915061435982614318565b602082019050919050565b6000602082019050818103600083015261437d81614341565b9050919050565b7f4d696e74696e6720686173206e6f742073746172746564207965740000000000600082015250565b60006143ba601b836132ae565b91506143c582614384565b602082019050919050565b600060208201905081810360008301526143e9816143ad565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006144266019836132ae565b9150614431826143f0565b602082019050919050565b6000602082019050818103600083015261445581614419565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144b8602f836132ae565b91506144c38261445c565b604082019050919050565b600060208201905081810360008301526144e7816144ab565b9050919050565b600060608201905061450360008301866131be565b61451060208301856131be565b61451d60408301846131be565b949350505050565b6000614538614533846136f9565b6134b4565b9050828152602081018484840111156145545761455361344f565b5b61455f8482856132bf565b509392505050565b600082601f83011261457c5761457b61344a565b5b815161458c848260208601614525565b91505092915050565b6000602082840312156145ab576145aa61313e565b5b600082015167ffffffffffffffff8111156145c9576145c8613143565b5b6145d584828501614567565b91505092915050565b600081905092915050565b60006145f4826132a3565b6145fe81856145de565b935061460e8185602086016132bf565b80840191505092915050565b600061462682846145e9565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061468d6026836132ae565b915061469882614631565b604082019050919050565b600060208201905081810360008301526146bc81614680565b9050919050565b60006146ce82613148565b91506146d983613148565b92508282026146e781613148565b915082820484148315176146fe576146fd613fbd565b5b5092915050565b600061471082613148565b915061471b83613148565b92508261472b5761472a6142b8565b5b828206905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614792602c836132ae565b915061479d82614736565b604082019050919050565b600060208201905081810360008301526147c181614785565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006148246029836132ae565b915061482f826147c8565b604082019050919050565b6000602082019050818103600083015261485381614817565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148b66024836132ae565b91506148c18261485a565b604082019050919050565b600060208201905081810360008301526148e5816148a9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149226020836132ae565b915061492d826148ec565b602082019050919050565b6000602082019050818103600083015261495181614915565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149b46032836132ae565b91506149bf82614958565b604082019050919050565b600060208201905081810360008301526149e3816149a7565b9050919050565b7f54726164696e6720697320636c6f736564206f6e207765656b656e6473000000600082015250565b6000614a20601d836132ae565b9150614a2b826149ea565b602082019050919050565b60006020820190508181036000830152614a4f81614a13565b9050919050565b7f4f75747369646520726567756c61722074726164696e6720686f757273000000600082015250565b6000614a8c601d836145de565b9150614a9782614a56565b601d82019050919050565b6000614aad82614a7f565b9150819050919050565b6000614ac4601d836132ae565b9150614acf82614a56565b602082019050919050565b60006020820190508181036000830152614af381614ab7565b9050919050565b6000819050919050565b6000614b0f82614afa565b9150614b1a83614afa565b925082820190508281121560008312168382126000841215161715614b4257614b41613fbd565b5b92915050565b6000614b5382614afa565b9150614b5e83614afa565b9250828202614b6c81614afa565b91507f80000000000000000000000000000000000000000000000000000000000000008414600084121615614ba457614ba3613fbd565b5b8282058414831517614bb957614bb8613fbd565b5b5092915050565b6000614bcb82614afa565b9150614bd683614afa565b925082614be657614be56142b8565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615614c1f57614c1e613fbd565b5b828205905092915050565b6000614c3582614afa565b9150614c4083614afa565b9250828203905081811260008412168282136000851215161715614c6757614c66613fbd565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000614c9482614c6d565b614c9e8185614c78565b9350614cae8185602086016132bf565b614cb7816132e9565b840191505092915050565b6000608082019050614cd760008301876133b4565b614ce460208301866133b4565b614cf160408301856131be565b8181036060830152614d038184614c89565b905095945050505050565b600081519050614d1d81613214565b92915050565b600060208284031215614d3957614d3861313e565b5b6000614d4784828501614d0e565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d866020836132ae565b9150614d9182614d50565b602082019050919050565b60006020820190508181036000830152614db581614d79565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614df2601c836132ae565b9150614dfd82614dbc565b602082019050919050565b60006020820190508181036000830152614e2181614de5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207e57d8d43dbf6a8cc5dfb6627667f35e9500730d26239eb99032ae42514eef1f64736f6c63430008110033000000000000000000000000e0204f92c4f80ae37ec8b9b52093aebd99875d51

Deployed Bytecode

0x60806040526004361061027c5760003560e01c80636c62ecca1161014f578063a324ad24116100c1578063dce9e6f71161007a578063dce9e6f7146109da578063e985e9c514610a05578063f2fde38b14610a42578063f51f96dd14610a6b578063f9134e6814610a96578063fa93f88314610ad35761027c565b8063a324ad24146108ca578063acc9b7b214610907578063b88d4fde14610932578063bce6d6721461095b578063c668286214610972578063c87b56dd1461099d5761027c565b80638da5cb5b116101135780638da5cb5b146107d957806390ec5dd11461080457806395d89b411461082f578063960d33da1461085a578063a0712d6814610885578063a22cb465146108a15761027c565b80636c62ecca1461070857806370a082311461071f578063715018a61461075c57806375e9169114610773578063819b25ba146107b05761027c565b80633b4d0bd2116101f35780634de3beeb116101ac5780634de3beeb146105d25780634f6ccce7146105fd57806355f804b31461063a5780636352211e1461066357806365c72840146106a057806365f13097146106dd5761027c565b80633b4d0bd2146104c25780633ccfd60b146104ed5780633e239e1a1461050457806341e1c3781461054157806342842e0e1461056c5780634371c465146105955761027c565b8063150b7a0211610245578063150b7a021461038c57806318160ddd146103c957806322f8a2b8146103f457806323b872dd146104315780632f745c591461045a57806332cb6b0c146104975761027c565b80625015531461028157806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b314610363575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a3919061317e565b610b10565b6040516102b591906131cd565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613240565b610b24565b6040516102f29190613288565b60405180910390f35b34801561030757600080fd5b50610310610b36565b60405161031d9190613333565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613355565b610bc8565b60405161035a91906133c3565b60405180910390f35b34801561036f57600080fd5b5061038a6004803603810190610385919061340a565b610c4d565b005b34801561039857600080fd5b506103b360048036038101906103ae919061357f565b610d64565b6040516103c09190613611565b60405180910390f35b3480156103d557600080fd5b506103de610d78565b6040516103eb91906131cd565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613355565b610d85565b60405161042891906131cd565b60405180910390f35b34801561043d57600080fd5b506104586004803603810190610453919061362c565b610d97565b005b34801561046657600080fd5b50610481600480360381019061047c919061340a565b610df7565b60405161048e91906131cd565b60405180910390f35b3480156104a357600080fd5b506104ac610e9c565b6040516104b991906131cd565b60405180910390f35b3480156104ce57600080fd5b506104d7610ea2565b6040516104e49190613288565b60405180910390f35b3480156104f957600080fd5b50610502610eb5565b005b34801561051057600080fd5b5061052b60048036038101906105269190613355565b610f0c565b60405161053891906131cd565b60405180910390f35b34801561054d57600080fd5b50610556610f1e565b60405161056391906136de565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e919061362c565b610f44565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613355565b610f64565b6040516105c99190613288565b60405180910390f35b3480156105de57600080fd5b506105e7610f76565b6040516105f491906133c3565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613355565b610f9c565b60405161063191906131cd565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c919061379a565b61100d565b005b34801561066f57600080fd5b5061068a60048036038101906106859190613355565b611028565b60405161069791906133c3565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190613355565b6110d9565b6040516106d491906131cd565b60405180910390f35b3480156106e957600080fd5b506106f26110eb565b6040516106ff91906131cd565b60405180910390f35b34801561071457600080fd5b5061071d6110f0565b005b34801561072b57600080fd5b50610746600480360381019061074191906137e3565b6112ca565b60405161075391906131cd565b60405180910390f35b34801561076857600080fd5b50610771611381565b005b34801561077f57600080fd5b5061079a60048036038101906107959190613355565b611395565b6040516107a791906131cd565b60405180910390f35b3480156107bc57600080fd5b506107d760048036038101906107d29190613355565b6113ad565b005b3480156107e557600080fd5b506107ee6114be565b6040516107fb91906133c3565b60405180910390f35b34801561081057600080fd5b506108196114e8565b60405161082691906131cd565b60405180910390f35b34801561083b57600080fd5b506108446114ee565b6040516108519190613333565b60405180910390f35b34801561086657600080fd5b5061086f611580565b60405161087c9190613288565b60405180910390f35b61089f600480360381019061089a9190613355565b611593565b005b3480156108ad57600080fd5b506108c860048036038101906108c3919061383c565b61178a565b005b3480156108d657600080fd5b506108f160048036038101906108ec9190613355565b61190a565b6040516108fe91906131cd565b60405180910390f35b34801561091357600080fd5b5061091c61191c565b60405161092991906133c3565b60405180910390f35b34801561093e57600080fd5b506109596004803603810190610954919061357f565b611942565b005b34801561096757600080fd5b506109706119a4565b005b34801561097e57600080fd5b506109876119c9565b6040516109949190613333565b60405180910390f35b3480156109a957600080fd5b506109c460048036038101906109bf9190613355565b611a02565b6040516109d19190613333565b60405180910390f35b3480156109e657600080fd5b506109ef611b43565b6040516109fc9190613288565b60405180910390f35b348015610a1157600080fd5b50610a2c6004803603810190610a27919061387c565b611bd0565b604051610a399190613288565b60405180910390f35b348015610a4e57600080fd5b50610a696004803603810190610a6491906137e3565b611c64565b005b348015610a7757600080fd5b50610a80611ce7565b604051610a8d91906131cd565b60405180910390f35b348015610aa257600080fd5b50610abd6004803603810190610ab89190613355565b611cf2565b604051610aca91906131cd565b60405180910390f35b348015610adf57600080fd5b50610afa6004803603810190610af59190613355565b611d0a565b604051610b0791906131cd565b60405180910390f35b6000610b1c8383611d1c565b905092915050565b6000610b2f82611d4c565b9050919050565b606060008054610b45906138eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b71906138eb565b8015610bbe5780601f10610b9357610100808354040283529160200191610bbe565b820191906000526020600020905b815481529060010190602001808311610ba157829003601f168201915b5050505050905090565b6000610bd382611dc6565b610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c099061398e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5882611028565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf90613a20565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce7611e32565b73ffffffffffffffffffffffffffffffffffffffff161480610d165750610d1581610d10611e32565b611bd0565b5b610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c90613ab2565b60405180910390fd5b610d5f8383611e3a565b505050565b600063150b7a0260e01b9050949350505050565b6000600880549050905090565b6000610d9082611ef3565b9050919050565b610da8610da2611e32565b82611f34565b610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90613b44565b60405180910390fd5b610df2838383612012565b505050565b6000610e02836112ca565b8210610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90613bd6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6101f481565b601360149054906101000a900460ff1681565b610ebd61226d565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f08573d6000803e3d6000fd5b5050565b6000610f17826122eb565b9050919050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f5f83838360405180602001604052806000815250611942565b505050565b6000610f6f82612315565b9050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610fa6610d78565b8210610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90613c68565b60405180910390fd5b60088281548110610ffb57610ffa613c88565b5b90600052602060002001549050919050565b61101561226d565b80600b90816110249190613e59565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790613f9d565b60405180910390fd5b80915050919050565b60006110e48261232b565b9050919050565b600a81565b60006110fe42601454610b10565b9050600061110b8261190a565b905060038111801561111d5750600b81105b15611142576001601360146101000a81548160ff02191690831515021790555061129b565b600061114d83610d85565b9050600061115a846110d9565b90506003830361121557600e81111561118d576001601360146101000a81548160ff021916908315150217905550611214565b60088110156111b6576000601360146101000a81548160ff021916908315150217905550611213565b6001600783836111c69190613fec565b6111d09190613fec565b10156111f6576000601360146101000a81548160ff021916908315150217905550611212565b6001601360146101000a81548160ff0219169083151502179055505b5b5b5b600b8303611298576007811115611246576000601360146101000a81548160ff021916908315150217905550611297565b600182826112549190613fec565b101561127a576001601360146101000a81548160ff021916908315150217905550611296565b6000601360146101000a81548160ff0219169083151502179055505b5b5b50505b601360149054906101000a900460ff16156112bd5760046014819055506112c6565b60056014819055505b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190614092565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61138961226d565b6113936000612352565b565b60106020528060005260406000206000915090505481565b6113b561226d565b60006113bf610d78565b90506101f482826113d091906140b2565b1115611411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140890614132565b60405180910390fd5b60005b828110156114b957600060014361142b9190613fec565b4060405160200161143c919061417d565b6040516020818303038152906040528051906020012060001c828461146191906140b2565b61146b91906140b2565b90508060106000848661147e91906140b2565b8152602001908152602001600020819055506114a53383856114a091906140b2565b612418565b5080806114b190614198565b915050611414565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b6060600180546114fd906138eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611529906138eb565b80156115765780601f1061154b57610100808354040283529160200191611576565b820191906000526020600020905b81548152906001019060200180831161155957829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1681565b600061159d610d78565b9050600a8211156115e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115da9061422c565b60405180910390fd5b6101f482826115f291906140b2565b1115611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90614298565b60405180910390fd5b662386f26fc10000823461164791906142e7565b14611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90614364565b60405180910390fd5b60011515600c60009054906101000a900460ff161515146116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d4906143d0565b60405180910390fd5b60005b828110156117855760006001436116f79190613fec565b40604051602001611708919061417d565b6040516020818303038152906040528051906020012060001c828461172d91906140b2565b61173791906140b2565b90508060106000848661174a91906140b2565b81526020019081526020016000208190555061177133838561176c91906140b2565b612418565b50808061177d90614198565b9150506116e0565b505050565b611792611e32565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f69061443c565b60405180910390fd5b806005600061180c611e32565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118b9611e32565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118fe9190613288565b60405180910390a35050565b600061191582612436565b9050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61195361194d611e32565b83611f34565b611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990613b44565b60405180910390fd5b61199e8484848461245c565b50505050565b6119ac61226d565b6001600c60006101000a81548160ff021916908315150217905550565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b6060611a0d82611dc6565b611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43906144ce565b60405180910390fd5b600060106000848152602001908152602001600020549050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166369272f0482600f600087815260200190815260200160002054866040518463ffffffff1660e01b8152600401611ad6939291906144ee565b600060405180830381865afa158015611af3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611b1c9190614595565b604051602001611b2c919061461a565b604051602081830303815290604052915050919050565b600080611b5242601454610b10565b90506000611b5f82610f64565b90506000611b6c83610f0c565b90506000611b7984611d0a565b90506000600190506001151584151503611b9257600090505b6009831080611ba15750601083115b15611bab57600090505b600983148015611bbb5750601e82105b15611bc557600090505b809550505050505090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c6c61226d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd2906146a3565b60405180910390fd5b611ce481612352565b50565b662386f26fc1000081565b600f6020528060005260406000206000915090505481565b6000611d15826124b8565b9050919050565b6000610e1082611d2c91906146c3565b83611d379190613fec565b905082811115611d4657600080fd5b92915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dbf5750611dbe826124e0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ead83611028565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806201518083611f0591906142e7565b905060016007600383611f1891906140b2565b611f229190614705565b611f2c91906140b2565b915050919050565b6000611f3f82611dc6565b611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f75906147a8565b60405180910390fd5b6000611f8983611028565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ff857508373ffffffffffffffffffffffffffffffffffffffff16611fe084610bc8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061200957506120088185611bd0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661203282611028565b73ffffffffffffffffffffffffffffffffffffffff1614612088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207f9061483a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ee906148cc565b60405180910390fd5b6121028383836125c2565b61210d600082611e3a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461215d9190613fec565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b491906140b2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612275611e32565b73ffffffffffffffffffffffffffffffffffffffff166122936114be565b73ffffffffffffffffffffffffffffffffffffffff16146122e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e090614938565b60405180910390fd5b565b60008062015180836122fd9190614705565b9050610e108161230d91906142e7565b915050919050565b6000600661232283611ef3565b10159050919050565b6000612344620151808361233f91906142e7565b61273c565b909150905080915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124328282604051806020016040528060008152506128db565b5050565b600061244f620151808361244a91906142e7565b61273c565b9091505080915050919050565b612467848484612012565b61247384848484612936565b6124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a9906149ca565b60405180910390fd5b50505050565b600080610e10836124c99190614705565b9050603c816124d891906142e7565b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125bb57506125ba82612abd565b5b9050919050565b60006125d042601454610b10565b905060006125dd82610f64565b905060006125ea83610f0c565b905060006125f784611d0a565b90506000151583151514612640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263790614a36565b60405180910390fd5b600982101580156126515750601082105b60405160200161266090614aa2565b604051602081830303815290604052906126b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a79190613333565b60405180910390fd5b50600982036126fd57601d81116126fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f390614ada565b60405180910390fd5b5b6001600f6000878152602001908152602001600020600082825461272191906140b2565b92505081905550612733878787612b27565b50505050505050565b600080600080849050600062253d8c62010bd98361275a9190614b04565b6127649190614b04565b9050600062023ab18260046127799190614b48565b6127839190614bc0565b9050600460038262023ab16127989190614b48565b6127a29190614b04565b6127ac9190614bc0565b826127b79190614c2a565b9150600062164b096001846127cc9190614b04565b610fa06127d99190614b48565b6127e39190614bc0565b9050601f6004826105b56127f79190614b48565b6128019190614bc0565b8461280c9190614c2a565b6128169190614b04565b9250600061098f84605061282a9190614b48565b6128349190614bc0565b9050600060508261098f6128489190614b48565b6128529190614bc0565b8561285d9190614c2a565b9050600b8261286c9190614bc0565b945084600c61287b9190614b48565b6002836128889190614b04565b6128929190614c2a565b915084836031866128a39190614c2a565b60646128af9190614b48565b6128b99190614b04565b6128c39190614b04565b92508298508197508096505050505050509193909250565b6128e58383612c39565b6128f26000848484612936565b612931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612928906149ca565b60405180910390fd5b505050565b60006129578473ffffffffffffffffffffffffffffffffffffffff16612e06565b15612ab0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612980611e32565b8786866040518563ffffffff1660e01b81526004016129a29493929190614cc2565b6020604051808303816000875af19250505080156129de57506040513d601f19601f820116820180604052508101906129db9190614d23565b60015b612a60573d8060008114612a0e576040519150601f19603f3d011682016040523d82523d6000602084013e612a13565b606091505b506000815103612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f906149ca565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ab5565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b32838383612e29565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b7457612b6f81612e2e565b612bb3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bb257612bb18382612e77565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612bf557612bf081612fe4565b612c34565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3357612c3282826130b5565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9f90614d9c565b60405180910390fd5b612cb181611dc6565b15612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce890614e08565b60405180910390fd5b612cfd600083836125c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4d91906140b2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e84846112ca565b612e8e9190613fec565b9050600060076000848152602001908152602001600020549050818114612f73576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ff89190613fec565b905060006009600084815260200190815260200160002054905060006008838154811061302857613027613c88565b5b90600052602060002001549050806008838154811061304a57613049613c88565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061309957613098614e28565b5b6001900381819060005260206000200160009055905550505050565b60006130c0836112ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61315b81613148565b811461316657600080fd5b50565b60008135905061317881613152565b92915050565b600080604083850312156131955761319461313e565b5b60006131a385828601613169565b92505060206131b485828601613169565b9150509250929050565b6131c781613148565b82525050565b60006020820190506131e260008301846131be565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61321d816131e8565b811461322857600080fd5b50565b60008135905061323a81613214565b92915050565b6000602082840312156132565761325561313e565b5b60006132648482850161322b565b91505092915050565b60008115159050919050565b6132828161326d565b82525050565b600060208201905061329d6000830184613279565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132dd5780820151818401526020810190506132c2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613305826132a3565b61330f81856132ae565b935061331f8185602086016132bf565b613328816132e9565b840191505092915050565b6000602082019050818103600083015261334d81846132fa565b905092915050565b60006020828403121561336b5761336a61313e565b5b600061337984828501613169565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133ad82613382565b9050919050565b6133bd816133a2565b82525050565b60006020820190506133d860008301846133b4565b92915050565b6133e7816133a2565b81146133f257600080fd5b50565b600081359050613404816133de565b92915050565b600080604083850312156134215761342061313e565b5b600061342f858286016133f5565b925050602061344085828601613169565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61348c826132e9565b810181811067ffffffffffffffff821117156134ab576134aa613454565b5b80604052505050565b60006134be613134565b90506134ca8282613483565b919050565b600067ffffffffffffffff8211156134ea576134e9613454565b5b6134f3826132e9565b9050602081019050919050565b82818337600083830152505050565b600061352261351d846134cf565b6134b4565b90508281526020810184848401111561353e5761353d61344f565b5b613549848285613500565b509392505050565b600082601f8301126135665761356561344a565b5b813561357684826020860161350f565b91505092915050565b600080600080608085870312156135995761359861313e565b5b60006135a7878288016133f5565b94505060206135b8878288016133f5565b93505060406135c987828801613169565b925050606085013567ffffffffffffffff8111156135ea576135e9613143565b5b6135f687828801613551565b91505092959194509250565b61360b816131e8565b82525050565b60006020820190506136266000830184613602565b92915050565b6000806000606084860312156136455761364461313e565b5b6000613653868287016133f5565b9350506020613664868287016133f5565b925050604061367586828701613169565b9150509250925092565b6000819050919050565b60006136a461369f61369a84613382565b61367f565b613382565b9050919050565b60006136b682613689565b9050919050565b60006136c8826136ab565b9050919050565b6136d8816136bd565b82525050565b60006020820190506136f360008301846136cf565b92915050565b600067ffffffffffffffff82111561371457613713613454565b5b61371d826132e9565b9050602081019050919050565b600061373d613738846136f9565b6134b4565b9050828152602081018484840111156137595761375861344f565b5b613764848285613500565b509392505050565b600082601f8301126137815761378061344a565b5b813561379184826020860161372a565b91505092915050565b6000602082840312156137b0576137af61313e565b5b600082013567ffffffffffffffff8111156137ce576137cd613143565b5b6137da8482850161376c565b91505092915050565b6000602082840312156137f9576137f861313e565b5b6000613807848285016133f5565b91505092915050565b6138198161326d565b811461382457600080fd5b50565b60008135905061383681613810565b92915050565b600080604083850312156138535761385261313e565b5b6000613861858286016133f5565b925050602061387285828601613827565b9150509250929050565b600080604083850312156138935761389261313e565b5b60006138a1858286016133f5565b92505060206138b2858286016133f5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061390357607f821691505b602082108103613916576139156138bc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613978602c836132ae565b91506139838261391c565b604082019050919050565b600060208201905081810360008301526139a78161396b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0a6021836132ae565b9150613a15826139ae565b604082019050919050565b60006020820190508181036000830152613a39816139fd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a9c6038836132ae565b9150613aa782613a40565b604082019050919050565b60006020820190508181036000830152613acb81613a8f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b2e6031836132ae565b9150613b3982613ad2565b604082019050919050565b60006020820190508181036000830152613b5d81613b21565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613bc0602b836132ae565b9150613bcb82613b64565b604082019050919050565b60006020820190508181036000830152613bef81613bb3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613c52602c836132ae565b9150613c5d82613bf6565b604082019050919050565b60006020820190508181036000830152613c8181613c45565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613d197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cdc565b613d238683613cdc565b95508019841693508086168417925050509392505050565b6000613d56613d51613d4c84613148565b61367f565b613148565b9050919050565b6000819050919050565b613d7083613d3b565b613d84613d7c82613d5d565b848454613ce9565b825550505050565b600090565b613d99613d8c565b613da4818484613d67565b505050565b5b81811015613dc857613dbd600082613d91565b600181019050613daa565b5050565b601f821115613e0d57613dde81613cb7565b613de784613ccc565b81016020851015613df6578190505b613e0a613e0285613ccc565b830182613da9565b50505b505050565b600082821c905092915050565b6000613e3060001984600802613e12565b1980831691505092915050565b6000613e498383613e1f565b9150826002028217905092915050565b613e62826132a3565b67ffffffffffffffff811115613e7b57613e7a613454565b5b613e8582546138eb565b613e90828285613dcc565b600060209050601f831160018114613ec35760008415613eb1578287015190505b613ebb8582613e3d565b865550613f23565b601f198416613ed186613cb7565b60005b82811015613ef957848901518255600182019150602085019450602081019050613ed4565b86831015613f165784890151613f12601f891682613e1f565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f876029836132ae565b9150613f9282613f2b565b604082019050919050565b60006020820190508181036000830152613fb681613f7a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ff782613148565b915061400283613148565b925082820390508181111561401a57614019613fbd565b5b92915050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061407c602a836132ae565b915061408782614020565b604082019050919050565b600060208201905081810360008301526140ab8161406f565b9050919050565b60006140bd82613148565b91506140c883613148565b92508282019050808211156140e0576140df613fbd565b5b92915050565b7f576f756c6420657863656564206d617820746f6b656e73000000000000000000600082015250565b600061411c6017836132ae565b9150614127826140e6565b602082019050919050565b6000602082019050818103600083015261414b8161410f565b9050919050565b6000819050919050565b6000819050919050565b61417761417282614152565b61415c565b82525050565b60006141898284614166565b60208201915081905092915050565b60006141a382613148565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141d5576141d4613fbd565b5b600182019050919050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b6000614216601b836132ae565b9150614221826141e0565b602082019050919050565b6000602082019050818103600083015261424581614209565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b60006142826020836132ae565b915061428d8261424c565b602082019050919050565b600060208201905081810360008301526142b181614275565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142f282613148565b91506142fd83613148565b92508261430d5761430c6142b8565b5b828204905092915050565b7f4e6f742074686520636f727265637420616d6f756e74206f6620657468657200600082015250565b600061434e601f836132ae565b915061435982614318565b602082019050919050565b6000602082019050818103600083015261437d81614341565b9050919050565b7f4d696e74696e6720686173206e6f742073746172746564207965740000000000600082015250565b60006143ba601b836132ae565b91506143c582614384565b602082019050919050565b600060208201905081810360008301526143e9816143ad565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006144266019836132ae565b9150614431826143f0565b602082019050919050565b6000602082019050818103600083015261445581614419565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144b8602f836132ae565b91506144c38261445c565b604082019050919050565b600060208201905081810360008301526144e7816144ab565b9050919050565b600060608201905061450360008301866131be565b61451060208301856131be565b61451d60408301846131be565b949350505050565b6000614538614533846136f9565b6134b4565b9050828152602081018484840111156145545761455361344f565b5b61455f8482856132bf565b509392505050565b600082601f83011261457c5761457b61344a565b5b815161458c848260208601614525565b91505092915050565b6000602082840312156145ab576145aa61313e565b5b600082015167ffffffffffffffff8111156145c9576145c8613143565b5b6145d584828501614567565b91505092915050565b600081905092915050565b60006145f4826132a3565b6145fe81856145de565b935061460e8185602086016132bf565b80840191505092915050565b600061462682846145e9565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061468d6026836132ae565b915061469882614631565b604082019050919050565b600060208201905081810360008301526146bc81614680565b9050919050565b60006146ce82613148565b91506146d983613148565b92508282026146e781613148565b915082820484148315176146fe576146fd613fbd565b5b5092915050565b600061471082613148565b915061471b83613148565b92508261472b5761472a6142b8565b5b828206905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614792602c836132ae565b915061479d82614736565b604082019050919050565b600060208201905081810360008301526147c181614785565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006148246029836132ae565b915061482f826147c8565b604082019050919050565b6000602082019050818103600083015261485381614817565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148b66024836132ae565b91506148c18261485a565b604082019050919050565b600060208201905081810360008301526148e5816148a9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149226020836132ae565b915061492d826148ec565b602082019050919050565b6000602082019050818103600083015261495181614915565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149b46032836132ae565b91506149bf82614958565b604082019050919050565b600060208201905081810360008301526149e3816149a7565b9050919050565b7f54726164696e6720697320636c6f736564206f6e207765656b656e6473000000600082015250565b6000614a20601d836132ae565b9150614a2b826149ea565b602082019050919050565b60006020820190508181036000830152614a4f81614a13565b9050919050565b7f4f75747369646520726567756c61722074726164696e6720686f757273000000600082015250565b6000614a8c601d836145de565b9150614a9782614a56565b601d82019050919050565b6000614aad82614a7f565b9150819050919050565b6000614ac4601d836132ae565b9150614acf82614a56565b602082019050919050565b60006020820190508181036000830152614af381614ab7565b9050919050565b6000819050919050565b6000614b0f82614afa565b9150614b1a83614afa565b925082820190508281121560008312168382126000841215161715614b4257614b41613fbd565b5b92915050565b6000614b5382614afa565b9150614b5e83614afa565b9250828202614b6c81614afa565b91507f80000000000000000000000000000000000000000000000000000000000000008414600084121615614ba457614ba3613fbd565b5b8282058414831517614bb957614bb8613fbd565b5b5092915050565b6000614bcb82614afa565b9150614bd683614afa565b925082614be657614be56142b8565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615614c1f57614c1e613fbd565b5b828205905092915050565b6000614c3582614afa565b9150614c4083614afa565b9250828203905081811260008412168282136000851215161715614c6757614c66613fbd565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000614c9482614c6d565b614c9e8185614c78565b9350614cae8185602086016132bf565b614cb7816132e9565b840191505092915050565b6000608082019050614cd760008301876133b4565b614ce460208301866133b4565b614cf160408301856131be565b8181036060830152614d038184614c89565b905095945050505050565b600081519050614d1d81613214565b92915050565b600060208284031215614d3957614d3861313e565b5b6000614d4784828501614d0e565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d866020836132ae565b9150614d9182614d50565b602082019050919050565b60006020820190508181036000830152614db581614d79565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614df2601c836132ae565b9150614dfd82614dbc565b602082019050919050565b60006020820190508181036000830152614e2181614de5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207e57d8d43dbf6a8cc5dfb6627667f35e9500730d26239eb99032ae42514eef1f64736f6c63430008110033

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

000000000000000000000000e0204f92c4f80ae37ec8b9b52093aebd99875d51

-----Decoded View---------------
Arg [0] : tradFiRenderer (address): 0xe0204F92c4F80aE37ec8b9B52093AEBd99875D51

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e0204f92c4f80ae37ec8b9b52093aebd99875d51


Deployed Bytecode Sourcemap

345:7377:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6179:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4367:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1195:198:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1658:113:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5577:157:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1326:256:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;497:40:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1401:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7579:140;;;;;;;;;;;;;:::i;:::-;;5283:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1031:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5285:185:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5887:147:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;896:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1848:233:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4554:111:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2120:239:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6040:133:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;544:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1466:1226;;;;;;;;;;;;;:::i;:::-;;1850:208:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:11;;;;;;;;;;;;;:::i;:::-;;846:43:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4798:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1236:87:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1433:26:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:104:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;595:34:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6367:702;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4278:295:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5740:141:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;995:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2698:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5192:79;;;;;;;;;;;;;:::i;:::-;;661:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7077:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3748:613;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:164:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2142:201:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;942:46:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;795:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5426:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6179:176;6247:17;6292:55;6329:9;6340:6;6292:36;:55::i;:::-;6277:70;;6179:176;;;;:::o;4367:179::-;4478:4;4502:36;4526:11;4502:23;:36::i;:::-;4495:43;;4367:179;;;:::o;2426:100:4:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3578:341;3508:411;;:::o;1195:198:13:-;1329:6;1355:30;;;1348:37;;1195:198;;;;;;:::o;1658:113:5:-;1719:7;1746:10;:17;;;;1739:24;;1658:113;:::o;5577:157:13:-;5636:14;5675:51;5716:9;5675:40;:51::i;:::-;5663:63;;5577:157;;;:::o;4875:339:4:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;1326:256:5:-;1423:7;1459:23;1476:5;1459:16;:23::i;:::-;1451:5;:31;1443:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1548:12;:19;1561:5;1548:19;;;;;;;;;;;;;;;:26;1568:5;1548:26;;;;;;;;;;;;1541:33;;1326:256;;;;:::o;497:40:13:-;534:3;497:40;:::o;1401:25::-;;;;;;;;;;;;;:::o;7579:140::-;1122:13:11;:11;:13::i;:::-;7627:12:13::1;7642:21;7627:36;;7682:10;7674:28;;:37;7703:7;7674:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7616:103;7579:140::o:0;5283:137::-;5337:9;5366:46;5402:9;5366:35;:46::i;:::-;5359:53;;5283:137;;;:::o;1031:25::-;;;;;;;;;;;;;:::o;5285:185:4:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;5887:147:13:-;5943:12;5978:48;6016:9;5978:37;:48::i;:::-;5968:58;;5887:147;;;:::o;896:39::-;;;;;;;;;;;;;:::o;1848:233:5:-;1923:7;1959:30;:28;:30::i;:::-;1951:5;:38;1943:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2056:10;2067:5;2056:17;;;;;;;;:::i;:::-;;;;;;;;;;2049:24;;1848:233;;;:::o;4554:111:13:-;1122:13:11;:11;:13::i;:::-;4649:8:13::1;4630:16;:27;;;;;;:::i;:::-;;4554:111:::0;:::o;2120:239:4:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;6040:133:13:-;6093:8;6120:45;6155:9;6120:34;:45::i;:::-;6114:51;;6040:133;;;:::o;544:44::-;586:2;544:44;:::o;1466:1226::-;1507:14;1524:37;1533:15;1550:10;;1524:8;:37::i;:::-;1507:54;;1572:10;1585:19;1594:9;1585:8;:19::i;:::-;1572:32;;1626:1;1618:5;:9;:23;;;;;1639:2;1631:5;:10;1618:23;1615:962;;;1666:4;1658:5;;:12;;;;;;;;;;;;;;;;;;1615:962;;;1703:8;1714:23;1727:9;1714:12;:23::i;:::-;1703:34;;1752:15;1770:17;1777:9;1770:6;:17::i;:::-;1752:35;;1814:1;1805:5;:10;1802:417;;1852:2;1839:10;:15;1836:368;;;1887:4;1879:5;;:12;;;;;;;;;;;;;;;;;;1836:368;;;1933:1;1920:10;:14;1917:287;;;1967:5;1959;;:13;;;;;;;;;;;;;;;;;;1917:287;;;2049:1;2044;2038:3;2025:10;:16;;;;:::i;:::-;:20;;;;:::i;:::-;2024:26;2021:164;;;2087:5;2079;;:13;;;;;;;;;;;;;;;;;;2021:164;;;2157:4;2149:5;;:12;;;;;;;;;;;;;;;;;;2021:164;1917:287;1836:368;1802:417;2245:2;2236:5;:11;2233:333;;2284:1;2271:10;:14;2268:283;;;2318:5;2310;;:13;;;;;;;;;;;;;;;;;;2268:283;;;2396:1;2389:3;2376:10;:16;;;;:::i;:::-;2375:22;2372:160;;;2434:4;2426:5;;:12;;;;;;;;;;;;;;;;;;2372:160;;;2503:5;2495;;:13;;;;;;;;;;;;;;;;;;2372:160;2268:283;2233:333;1688:889;;1615:962;2590:5;;;;;;;;;;;2587:98;;;2625:1;2612:10;:14;;;;2587:98;;;2672:1;2659:10;:14;;;;2587:98;1496:1196;;1466:1226::o;1850:208:4:-;1922:7;1967:1;1950:19;;:5;:19;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1884:103:11:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;846:43:13:-;;;;;;;;;;;;;;;;;:::o;4798:388::-;1122:13:11;:11;:13::i;:::-;4852:11:13::1;4866:13;:11;:13::i;:::-;4852:27;;534:3;4905:1;4896:6;:10;;;;:::i;:::-;:24;;4888:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4962:6;4957:222;4978:1;4974;:5;4957:222;;;4997:9;5077:1;5064:12;:14;;;;:::i;:::-;5054:25;5037:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;5027:54;;;;;;5022:60;;5018:1;5009:6;:10;;;;:::i;:::-;:73;;;;:::i;:::-;4997:85;;5121:4;5093:13;:25;5116:1;5107:6;:10;;;;:::i;:::-;5093:25;;;;;;;;;;;:32;;;;5136:33;5146:10;5167:1;5158:6;:10;;;;:::i;:::-;5136:9;:33::i;:::-;4986:193;4981:3;;;;;:::i;:::-;;;;4957:222;;;;4843:343;4798:388:::0;:::o;1236:87:11:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;1433:26:13:-;;;;:::o;2595:104:4:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;595:34:13:-;;;;;;;;;;;;;:::o;6367:702::-;6428:14;6445:13;:11;:13::i;:::-;6428:30;;586:2;6477:14;:33;;6469:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;534:3;6570:14;6561:6;:23;;;;:::i;:::-;:37;;6553:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;978:10;6666:14;6654:9;:26;;;;:::i;:::-;:39;6646:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;6766:4;6748:22;;:14;;;;;;;;;;;:22;;;6740:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;6818:6;6813:249;6834:14;6830:1;:18;6813:249;;;6870:9;6950:1;6937:12;:14;;;;:::i;:::-;6927:25;6910:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;6900:54;;;;;;6895:60;;6891:1;6882:6;:10;;;;:::i;:::-;:73;;;;:::i;:::-;6870:85;;6998:4;6970:13;:25;6993:1;6984:6;:10;;;;:::i;:::-;6970:25;;;;;;;;;;;:32;;;;7017:33;7027:10;7048:1;7039:6;:10;;;;:::i;:::-;7017:9;:33::i;:::-;6855:207;6850:3;;;;;:::i;:::-;;;;6813:249;;;;6417:652;6367:702;:::o;4278:295:4:-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;5740:141:13:-;5795:10;5826:47;5863:9;5826:36;:47::i;:::-;5818:55;;5740:141;;;:::o;995:29::-;;;;;;;;;;;;;:::o;2698:345::-;2890:41;2909:12;:10;:12::i;:::-;2923:7;2890:18;:41::i;:::-;2882:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;2996:39;3010:4;3016:2;3020:7;3029:5;2996:13;:39::i;:::-;2698:345;;;;:::o;5192:79::-;1122:13:11;:11;:13::i;:::-;5259:4:13::1;5242:14;;:21;;;;;;;;;;;;;;;;;;5192:79::o:0;661:46::-;;;;;;;;;;;;;;;;;;;:::o;7077:494::-;7179:13;7232:17;7240:8;7232:7;:17::i;:::-;7210:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;7336:12;7351:13;:23;7365:8;7351:23;;;;;;;;;;;;7336:38;;7469:3;;;;;;;;;;;:18;;;7488:4;7494:14;:24;7509:8;7494:24;;;;;;;;;;;;7520:8;7469:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7430:118;;;;;;;;:::i;:::-;;;;;;;;;;;;;7385:178;;;7077:494;;;:::o;3748:613::-;3800:4;3816:14;3833:37;3842:15;3859:10;;3833:8;:37::i;:::-;3816:54;;3881:12;3896:20;3906:9;3896;:20::i;:::-;3881:35;;3927:9;3939:18;3947:9;3939:7;:18::i;:::-;3927:30;;3968:11;3982:20;3992:9;3982;:20::i;:::-;3968:34;;4013:25;4041:4;4013:32;;4070:4;4059:15;;:7;:15;;;4056:75;;4114:5;4091:28;;4056:75;4151:1;4144:4;:8;:21;;;;4163:2;4156:4;:9;4144:21;4141:81;;;4205:5;4182:28;;4141:81;4243:1;4235:4;:9;:24;;;;;4257:2;4248:6;:11;4235:24;4232:84;;;4299:5;4276:28;;4232:84;4333:20;4326:27;;;;;;;3748:613;:::o;4644:164:4:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;2142:201:11:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;942:46:13:-;978:10;942:46;:::o;795:44::-;;;;;;;;;;;;;;;;;:::o;5426:145::-;5482:11;5515:48;5553:9;5515:37;:48::i;:::-;5506:57;;5426:145;;;:::o;11144:202:1:-;11214:17;1077:7;11270:6;:25;;;;:::i;:::-;11258:9;:37;;;;:::i;:::-;11243:52;;11329:9;11313:12;:25;;11305:34;;;;;;11144:202;;;;:::o;1018:224:5:-;1120:4;1159:35;1144:50;;;:11;:50;;;;:90;;;;1198:36;1222:11;1198:23;:36::i;:::-;1144:90;1137:97;;1018:224;;;:::o;7379:127:4:-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;656:98:2:-;709:7;736:10;729:17;;656:98;:::o;11361:174:4:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;6901:175:1:-;6962:14;6988:10;1026:12;7001:9;:27;;;;:::i;:::-;6988:40;;7068:1;7064;7059;7051:5;:9;;;;:::i;:::-;7050:15;;;;:::i;:::-;:19;;;;:::i;:::-;7038:31;;6978:98;6901:175;;;:::o;7673:348:4:-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;1401:132:11:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;7502:163:1:-;7558:9;7579;1026:12;7591:9;:27;;;;:::i;:::-;7579:39;;1077:7;7635:4;:23;;;;:::i;:::-;7628:30;;7569:96;7502:163;;;:::o;6123:133::-;6181:12;1356:1;6215:23;6228:9;6215:12;:23::i;:::-;:34;;6205:44;;6123:133;;;:::o;7365:132::-;7420:8;7450:40;1026:12;7462:9;:27;;;;:::i;:::-;7450:11;:40::i;:::-;7440:50;;;;;;;;;7365:132;;;:::o;2503:191:11:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;8363:110:4:-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;7222:138:1:-;7279:10;7313:40;1026:12;7325:9;:27;;;;:::i;:::-;7313:11;:40::i;:::-;7301:52;;;;;;;;7222:138;;;:::o;6751:315:4:-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;7670:172:1:-;7728:11;7751:9;1077:7;7763:9;:28;;;;:::i;:::-;7751:40;;1125:2;7810:4;:25;;;;:::i;:::-;7801:34;;7741:101;7670:172;;;:::o;1481:305:4:-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;3049:691:13:-;3177:14;3194:37;3203:15;3220:10;;3194:8;:37::i;:::-;3177:54;;3242:12;3257:20;3267:9;3257;:20::i;:::-;3242:35;;3288:9;3300:18;3308:9;3300:7;:18::i;:::-;3288:30;;3329:11;3343:20;3353:9;3343;:20::i;:::-;3329:34;;3393:5;3382:16;;:7;:16;;;3374:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3459:1;3451:4;:9;;:22;;;;;3471:2;3464:4;:9;3451:22;3482:49;;;;;;;:::i;:::-;;;;;;;;;;;;;3443:90;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3555:1;3547:4;:9;3544:94;;3590:2;3581:6;:11;3573:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3544:94;3675:1;3648:14;:23;3663:7;3648:23;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;3687:45;3714:4;3720:2;3724:7;3687:26;:45::i;:::-;3166:574;;;;3049:691;;;:::o;3312:605:1:-;3368:9;3379:10;3391:8;3411:10;3428:5;3411:23;;3445:5;1163:7;3462:5;3453:6;:14;;;;:::i;:::-;:31;;;;:::i;:::-;3445:39;;3494:5;3510:6;3506:1;3502;:5;;;;:::i;:::-;:14;;;;:::i;:::-;3494:22;;3553:1;3548;3544;3535:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;3534:20;;;;:::i;:::-;3530:1;:24;;;;:::i;:::-;3526:28;;3564:9;3593:7;3588:1;3584;:5;;;;:::i;:::-;3576:4;:14;;;;:::i;:::-;:24;;;;:::i;:::-;3564:36;;3637:2;3633:1;3625:5;3618:4;:12;;;;:::i;:::-;:16;;;;:::i;:::-;3614:1;:20;;;;:::i;:::-;:25;;;;:::i;:::-;3610:29;;3649:10;3671:4;3667:1;3662:2;:6;;;;:::i;:::-;:13;;;;:::i;:::-;3649:26;;3685:8;3716:2;3707:6;3700:4;:13;;;;:::i;:::-;:18;;;;:::i;:::-;3696:1;:22;;;;:::i;:::-;3685:33;;3741:2;3732:6;:11;;;;:::i;:::-;3728:15;;3780:1;3775:2;:6;;;;:::i;:::-;3771:1;3762:6;:10;;;;:::i;:::-;:19;;;;:::i;:::-;3753:28;;3824:1;3816:5;3810:2;3806:1;:6;;;;:::i;:::-;3799:3;:14;;;;:::i;:::-;:22;;;;:::i;:::-;:26;;;;:::i;:::-;3791:34;;3848:5;3836:18;;3877:6;3864:20;;3905:4;3894:16;;3401:516;;;;;;3312:605;;;;;:::o;8700:321:4:-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;12100:803::-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;854:157:3:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;2694:589:5:-;2838:45;2865:4;2871:2;2875:7;2838:26;:45::i;:::-;2916:1;2900:18;;:4;:18;;;2896:187;;2935:40;2967:7;2935:31;:40::i;:::-;2896:187;;;3005:2;2997:10;;:4;:10;;;2993:90;;3024:47;3057:4;3063:7;3024:32;:47::i;:::-;2993:90;2896:187;3111:1;3097:16;;:2;:16;;;3093:183;;3130:45;3167:7;3130:36;:45::i;:::-;3093:183;;;3203:4;3197:10;;:2;:10;;;3193:83;;3224:40;3252:2;3256:7;3224:27;:40::i;:::-;3193:83;3093:183;2694:589;;;:::o;9357:382:4:-;9451:1;9437:16;;:2;:16;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;1210:326:0:-;1270:4;1527:1;1505:7;:19;;;:23;1498:30;;1210:326;;;:::o;13475:126:4:-;;;;:::o;4006:164:5:-;4110:10;:17;;;;4083:15;:24;4099:7;4083:24;;;;;;;;;;;:44;;;;4138:10;4154:7;4138:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4006:164;:::o;4797:988::-;5063:22;5113:1;5088:22;5105:4;5088:16;:22::i;:::-;:26;;;;:::i;:::-;5063:51;;5125:18;5146:17;:26;5164:7;5146:26;;;;;;;;;;;;5125:47;;5293:14;5279:10;:28;5275:328;;5324:19;5346:12;:18;5359:4;5346:18;;;;;;;;;;;;;;;:34;5365:14;5346:34;;;;;;;;;;;;5324:56;;5430:11;5397:12;:18;5410:4;5397:18;;;;;;;;;;;;;;;:30;5416:10;5397:30;;;;;;;;;;;:44;;;;5547:10;5514:17;:30;5532:11;5514:30;;;;;;;;;;;:43;;;;5309:294;5275:328;5699:17;:26;5717:7;5699:26;;;;;;;;;;;5692:33;;;5743:12;:18;5756:4;5743:18;;;;;;;;;;;;;;;:34;5762:14;5743:34;;;;;;;;;;;5736:41;;;4878:907;;4797:988;;:::o;6080:1079::-;6333:22;6378:1;6358:10;:17;;;;:21;;;;:::i;:::-;6333:46;;6390:18;6411:15;:24;6427:7;6411:24;;;;;;;;;;;;6390:45;;6762:19;6784:10;6795:14;6784:26;;;;;;;;:::i;:::-;;;;;;;;;;6762:48;;6848:11;6823:10;6834;6823:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6959:10;6928:15;:28;6944:11;6928:28;;;;;;;;;;;:41;;;;7100:15;:24;7116:7;7100:24;;;;;;;;;;;7093:31;;;7135:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6151:1008;;;6080:1079;:::o;3584:221::-;3669:14;3686:20;3703:2;3686:16;:20::i;:::-;3669:37;;3744:7;3717:12;:16;3730:2;3717:16;;;;;;;;;;;;;;;:24;3734:6;3717:24;;;;;;;;;;;:34;;;;3791:6;3762:17;:26;3780:7;3762:26;;;;;;;;;;;:35;;;;3658:147;3584:221;;:::o;7:75:14:-;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:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:118::-;1257:24;1275:5;1257:24;:::i;:::-;1252:3;1245:37;1170:118;;:::o;1294:222::-;1387:4;1425:2;1414:9;1410:18;1402:26;;1438:71;1506:1;1495:9;1491:17;1482:6;1438:71;:::i;:::-;1294:222;;;;:::o;1522:149::-;1558:7;1598:66;1591:5;1587:78;1576:89;;1522:149;;;:::o;1677:120::-;1749:23;1766:5;1749:23;:::i;:::-;1742:5;1739:34;1729:62;;1787:1;1784;1777:12;1729:62;1677:120;:::o;1803:137::-;1848:5;1886:6;1873:20;1864:29;;1902:32;1928:5;1902:32;:::i;:::-;1803:137;;;;:::o;1946:327::-;2004:6;2053:2;2041:9;2032:7;2028:23;2024:32;2021:119;;;2059:79;;:::i;:::-;2021:119;2179:1;2204:52;2248:7;2239:6;2228:9;2224:22;2204:52;:::i;:::-;2194:62;;2150:116;1946:327;;;;:::o;2279:90::-;2313:7;2356:5;2349:13;2342:21;2331:32;;2279:90;;;:::o;2375:109::-;2456:21;2471:5;2456:21;:::i;:::-;2451:3;2444:34;2375:109;;:::o;2490:210::-;2577:4;2615:2;2604:9;2600:18;2592:26;;2628:65;2690:1;2679:9;2675:17;2666:6;2628:65;:::i;:::-;2490:210;;;;:::o;2706:99::-;2758:6;2792:5;2786:12;2776:22;;2706:99;;;:::o;2811:169::-;2895:11;2929:6;2924:3;2917:19;2969:4;2964:3;2960:14;2945:29;;2811:169;;;;:::o;2986:246::-;3067:1;3077:113;3091:6;3088:1;3085:13;3077:113;;;3176:1;3171:3;3167:11;3161:18;3157:1;3152:3;3148:11;3141:39;3113:2;3110:1;3106:10;3101:15;;3077:113;;;3224:1;3215:6;3210:3;3206:16;3199:27;3048:184;2986:246;;;:::o;3238:102::-;3279:6;3330:2;3326:7;3321:2;3314:5;3310:14;3306:28;3296:38;;3238:102;;;:::o;3346:377::-;3434:3;3462:39;3495:5;3462:39;:::i;:::-;3517:71;3581:6;3576:3;3517:71;:::i;:::-;3510:78;;3597:65;3655:6;3650:3;3643:4;3636:5;3632:16;3597:65;:::i;:::-;3687:29;3709:6;3687:29;:::i;:::-;3682:3;3678:39;3671:46;;3438:285;3346:377;;;;:::o;3729:313::-;3842:4;3880:2;3869:9;3865:18;3857:26;;3929:9;3923:4;3919:20;3915:1;3904:9;3900:17;3893:47;3957:78;4030:4;4021:6;3957:78;:::i;:::-;3949:86;;3729:313;;;;:::o;4048:329::-;4107:6;4156:2;4144:9;4135:7;4131:23;4127:32;4124:119;;;4162:79;;:::i;:::-;4124:119;4282:1;4307:53;4352:7;4343:6;4332:9;4328:22;4307:53;:::i;:::-;4297:63;;4253:117;4048:329;;;;:::o;4383:126::-;4420:7;4460:42;4453:5;4449:54;4438:65;;4383:126;;;:::o;4515:96::-;4552:7;4581:24;4599:5;4581:24;:::i;:::-;4570:35;;4515:96;;;:::o;4617:118::-;4704:24;4722:5;4704:24;:::i;:::-;4699:3;4692:37;4617:118;;:::o;4741:222::-;4834:4;4872:2;4861:9;4857:18;4849:26;;4885:71;4953:1;4942:9;4938:17;4929:6;4885:71;:::i;:::-;4741:222;;;;:::o;4969:122::-;5042:24;5060:5;5042:24;:::i;:::-;5035:5;5032:35;5022:63;;5081:1;5078;5071:12;5022:63;4969:122;:::o;5097:139::-;5143:5;5181:6;5168:20;5159:29;;5197:33;5224:5;5197:33;:::i;:::-;5097:139;;;;:::o;5242:474::-;5310:6;5318;5367:2;5355:9;5346:7;5342:23;5338:32;5335:119;;;5373:79;;:::i;:::-;5335:119;5493:1;5518:53;5563:7;5554:6;5543:9;5539:22;5518:53;:::i;:::-;5508:63;;5464:117;5620:2;5646:53;5691:7;5682:6;5671:9;5667:22;5646:53;:::i;:::-;5636:63;;5591:118;5242:474;;;;;:::o;5722:117::-;5831:1;5828;5821:12;5845:117;5954:1;5951;5944:12;5968:180;6016:77;6013:1;6006:88;6113:4;6110:1;6103:15;6137:4;6134:1;6127:15;6154:281;6237:27;6259:4;6237:27;:::i;:::-;6229:6;6225:40;6367:6;6355:10;6352:22;6331:18;6319:10;6316:34;6313:62;6310:88;;;6378:18;;:::i;:::-;6310:88;6418:10;6414:2;6407:22;6197:238;6154:281;;:::o;6441:129::-;6475:6;6502:20;;:::i;:::-;6492:30;;6531:33;6559:4;6551:6;6531:33;:::i;:::-;6441:129;;;:::o;6576:307::-;6637:4;6727:18;6719:6;6716:30;6713:56;;;6749:18;;:::i;:::-;6713:56;6787:29;6809:6;6787:29;:::i;:::-;6779:37;;6871:4;6865;6861:15;6853:23;;6576:307;;;:::o;6889:146::-;6986:6;6981:3;6976;6963:30;7027:1;7018:6;7013:3;7009:16;7002:27;6889:146;;;:::o;7041:423::-;7118:5;7143:65;7159:48;7200:6;7159:48;:::i;:::-;7143:65;:::i;:::-;7134:74;;7231:6;7224:5;7217:21;7269:4;7262:5;7258:16;7307:3;7298:6;7293:3;7289:16;7286:25;7283:112;;;7314:79;;:::i;:::-;7283:112;7404:54;7451:6;7446:3;7441;7404:54;:::i;:::-;7124:340;7041:423;;;;;:::o;7483:338::-;7538:5;7587:3;7580:4;7572:6;7568:17;7564:27;7554:122;;7595:79;;:::i;:::-;7554:122;7712:6;7699:20;7737:78;7811:3;7803:6;7796:4;7788:6;7784:17;7737:78;:::i;:::-;7728:87;;7544:277;7483:338;;;;:::o;7827:943::-;7922:6;7930;7938;7946;7995:3;7983:9;7974:7;7970:23;7966:33;7963:120;;;8002:79;;:::i;:::-;7963:120;8122:1;8147:53;8192:7;8183:6;8172:9;8168:22;8147:53;:::i;:::-;8137:63;;8093:117;8249:2;8275:53;8320:7;8311:6;8300:9;8296:22;8275:53;:::i;:::-;8265:63;;8220:118;8377:2;8403:53;8448:7;8439:6;8428:9;8424:22;8403:53;:::i;:::-;8393:63;;8348:118;8533:2;8522:9;8518:18;8505:32;8564:18;8556:6;8553:30;8550:117;;;8586:79;;:::i;:::-;8550:117;8691:62;8745:7;8736:6;8725:9;8721:22;8691:62;:::i;:::-;8681:72;;8476:287;7827:943;;;;;;;:::o;8776:115::-;8861:23;8878:5;8861:23;:::i;:::-;8856:3;8849:36;8776:115;;:::o;8897:218::-;8988:4;9026:2;9015:9;9011:18;9003:26;;9039:69;9105:1;9094:9;9090:17;9081:6;9039:69;:::i;:::-;8897:218;;;;:::o;9121:619::-;9198:6;9206;9214;9263:2;9251:9;9242:7;9238:23;9234:32;9231:119;;;9269:79;;:::i;:::-;9231:119;9389:1;9414:53;9459:7;9450:6;9439:9;9435:22;9414:53;:::i;:::-;9404:63;;9360:117;9516:2;9542:53;9587:7;9578:6;9567:9;9563:22;9542:53;:::i;:::-;9532:63;;9487:118;9644:2;9670:53;9715:7;9706:6;9695:9;9691:22;9670:53;:::i;:::-;9660:63;;9615:118;9121:619;;;;;:::o;9746:60::-;9774:3;9795:5;9788:12;;9746:60;;;:::o;9812:142::-;9862:9;9895:53;9913:34;9922:24;9940:5;9922:24;:::i;:::-;9913:34;:::i;:::-;9895:53;:::i;:::-;9882:66;;9812:142;;;:::o;9960:126::-;10010:9;10043:37;10074:5;10043:37;:::i;:::-;10030:50;;9960:126;;;:::o;10092:149::-;10165:9;10198:37;10229:5;10198:37;:::i;:::-;10185:50;;10092:149;;;:::o;10247:177::-;10357:60;10411:5;10357:60;:::i;:::-;10352:3;10345:73;10247:177;;:::o;10430:268::-;10546:4;10584:2;10573:9;10569:18;10561:26;;10597:94;10688:1;10677:9;10673:17;10664:6;10597:94;:::i;:::-;10430:268;;;;:::o;10704:308::-;10766:4;10856:18;10848:6;10845:30;10842:56;;;10878:18;;:::i;:::-;10842:56;10916:29;10938:6;10916:29;:::i;:::-;10908:37;;11000:4;10994;10990:15;10982:23;;10704:308;;;:::o;11018:425::-;11096:5;11121:66;11137:49;11179:6;11137:49;:::i;:::-;11121:66;:::i;:::-;11112:75;;11210:6;11203:5;11196:21;11248:4;11241:5;11237:16;11286:3;11277:6;11272:3;11268:16;11265:25;11262:112;;;11293:79;;:::i;:::-;11262:112;11383:54;11430:6;11425:3;11420;11383:54;:::i;:::-;11102:341;11018:425;;;;;:::o;11463:340::-;11519:5;11568:3;11561:4;11553:6;11549:17;11545:27;11535:122;;11576:79;;:::i;:::-;11535:122;11693:6;11680:20;11718:79;11793:3;11785:6;11778:4;11770:6;11766:17;11718:79;:::i;:::-;11709:88;;11525:278;11463:340;;;;:::o;11809:509::-;11878:6;11927:2;11915:9;11906:7;11902:23;11898:32;11895:119;;;11933:79;;:::i;:::-;11895:119;12081:1;12070:9;12066:17;12053:31;12111:18;12103:6;12100:30;12097:117;;;12133:79;;:::i;:::-;12097:117;12238:63;12293:7;12284:6;12273:9;12269:22;12238:63;:::i;:::-;12228:73;;12024:287;11809:509;;;;:::o;12324:329::-;12383:6;12432:2;12420:9;12411:7;12407:23;12403:32;12400:119;;;12438:79;;:::i;:::-;12400:119;12558:1;12583:53;12628:7;12619:6;12608:9;12604:22;12583:53;:::i;:::-;12573:63;;12529:117;12324:329;;;;:::o;12659:116::-;12729:21;12744:5;12729:21;:::i;:::-;12722:5;12719:32;12709:60;;12765:1;12762;12755:12;12709:60;12659:116;:::o;12781:133::-;12824:5;12862:6;12849:20;12840:29;;12878:30;12902:5;12878:30;:::i;:::-;12781:133;;;;:::o;12920:468::-;12985:6;12993;13042:2;13030:9;13021:7;13017:23;13013:32;13010:119;;;13048:79;;:::i;:::-;13010:119;13168:1;13193:53;13238:7;13229:6;13218:9;13214:22;13193:53;:::i;:::-;13183:63;;13139:117;13295:2;13321:50;13363:7;13354:6;13343:9;13339:22;13321:50;:::i;:::-;13311:60;;13266:115;12920:468;;;;;:::o;13394:474::-;13462:6;13470;13519:2;13507:9;13498:7;13494:23;13490:32;13487:119;;;13525:79;;:::i;:::-;13487:119;13645:1;13670:53;13715:7;13706:6;13695:9;13691:22;13670:53;:::i;:::-;13660:63;;13616:117;13772:2;13798:53;13843:7;13834:6;13823:9;13819:22;13798:53;:::i;:::-;13788:63;;13743:118;13394:474;;;;;:::o;13874:180::-;13922:77;13919:1;13912:88;14019:4;14016:1;14009:15;14043:4;14040:1;14033:15;14060:320;14104:6;14141:1;14135:4;14131:12;14121:22;;14188:1;14182:4;14178:12;14209:18;14199:81;;14265:4;14257:6;14253:17;14243:27;;14199:81;14327:2;14319:6;14316:14;14296:18;14293:38;14290:84;;14346:18;;:::i;:::-;14290:84;14111:269;14060:320;;;:::o;14386:231::-;14526:34;14522:1;14514:6;14510:14;14503:58;14595:14;14590:2;14582:6;14578:15;14571:39;14386:231;:::o;14623:366::-;14765:3;14786:67;14850:2;14845:3;14786:67;:::i;:::-;14779:74;;14862:93;14951:3;14862:93;:::i;:::-;14980:2;14975:3;14971:12;14964:19;;14623:366;;;:::o;14995:419::-;15161:4;15199:2;15188:9;15184:18;15176:26;;15248:9;15242:4;15238:20;15234:1;15223:9;15219:17;15212:47;15276:131;15402:4;15276:131;:::i;:::-;15268:139;;14995:419;;;:::o;15420:220::-;15560:34;15556:1;15548:6;15544:14;15537:58;15629:3;15624:2;15616:6;15612:15;15605:28;15420:220;:::o;15646:366::-;15788:3;15809:67;15873:2;15868:3;15809:67;:::i;:::-;15802:74;;15885:93;15974:3;15885:93;:::i;:::-;16003:2;15998:3;15994:12;15987:19;;15646:366;;;:::o;16018:419::-;16184:4;16222:2;16211:9;16207:18;16199:26;;16271:9;16265:4;16261:20;16257:1;16246:9;16242:17;16235:47;16299:131;16425:4;16299:131;:::i;:::-;16291:139;;16018:419;;;:::o;16443:243::-;16583:34;16579:1;16571:6;16567:14;16560:58;16652:26;16647:2;16639:6;16635:15;16628:51;16443:243;:::o;16692:366::-;16834:3;16855:67;16919:2;16914:3;16855:67;:::i;:::-;16848:74;;16931:93;17020:3;16931:93;:::i;:::-;17049:2;17044:3;17040:12;17033:19;;16692:366;;;:::o;17064:419::-;17230:4;17268:2;17257:9;17253:18;17245:26;;17317:9;17311:4;17307:20;17303:1;17292:9;17288:17;17281:47;17345:131;17471:4;17345:131;:::i;:::-;17337:139;;17064:419;;;:::o;17489:236::-;17629:34;17625:1;17617:6;17613:14;17606:58;17698:19;17693:2;17685:6;17681:15;17674:44;17489:236;:::o;17731:366::-;17873:3;17894:67;17958:2;17953:3;17894:67;:::i;:::-;17887:74;;17970:93;18059:3;17970:93;:::i;:::-;18088:2;18083:3;18079:12;18072:19;;17731:366;;;:::o;18103:419::-;18269:4;18307:2;18296:9;18292:18;18284:26;;18356:9;18350:4;18346:20;18342:1;18331:9;18327:17;18320:47;18384:131;18510:4;18384:131;:::i;:::-;18376:139;;18103:419;;;:::o;18528:230::-;18668:34;18664:1;18656:6;18652:14;18645:58;18737:13;18732:2;18724:6;18720:15;18713:38;18528:230;:::o;18764:366::-;18906:3;18927:67;18991:2;18986:3;18927:67;:::i;:::-;18920:74;;19003:93;19092:3;19003:93;:::i;:::-;19121:2;19116:3;19112:12;19105:19;;18764:366;;;:::o;19136:419::-;19302:4;19340:2;19329:9;19325:18;19317:26;;19389:9;19383:4;19379:20;19375:1;19364:9;19360:17;19353:47;19417:131;19543:4;19417:131;:::i;:::-;19409:139;;19136:419;;;:::o;19561:231::-;19701:34;19697:1;19689:6;19685:14;19678:58;19770:14;19765:2;19757:6;19753:15;19746:39;19561:231;:::o;19798:366::-;19940:3;19961:67;20025:2;20020:3;19961:67;:::i;:::-;19954:74;;20037:93;20126:3;20037:93;:::i;:::-;20155:2;20150:3;20146:12;20139:19;;19798:366;;;:::o;20170:419::-;20336:4;20374:2;20363:9;20359:18;20351:26;;20423:9;20417:4;20413:20;20409:1;20398:9;20394:17;20387:47;20451:131;20577:4;20451:131;:::i;:::-;20443:139;;20170:419;;;:::o;20595:180::-;20643:77;20640:1;20633:88;20740:4;20737:1;20730:15;20764:4;20761:1;20754:15;20781:141;20830:4;20853:3;20845:11;;20876:3;20873:1;20866:14;20910:4;20907:1;20897:18;20889:26;;20781:141;;;:::o;20928:93::-;20965:6;21012:2;21007;21000:5;20996:14;20992:23;20982:33;;20928:93;;;:::o;21027:107::-;21071:8;21121:5;21115:4;21111:16;21090:37;;21027:107;;;;:::o;21140:393::-;21209:6;21259:1;21247:10;21243:18;21282:97;21312:66;21301:9;21282:97;:::i;:::-;21400:39;21430:8;21419:9;21400:39;:::i;:::-;21388:51;;21472:4;21468:9;21461:5;21457:21;21448:30;;21521:4;21511:8;21507:19;21500:5;21497:30;21487:40;;21216:317;;21140:393;;;;;:::o;21539:142::-;21589:9;21622:53;21640:34;21649:24;21667:5;21649:24;:::i;:::-;21640:34;:::i;:::-;21622:53;:::i;:::-;21609:66;;21539:142;;;:::o;21687:75::-;21730:3;21751:5;21744:12;;21687:75;;;:::o;21768:269::-;21878:39;21909:7;21878:39;:::i;:::-;21939:91;21988:41;22012:16;21988:41;:::i;:::-;21980:6;21973:4;21967:11;21939:91;:::i;:::-;21933:4;21926:105;21844:193;21768:269;;;:::o;22043:73::-;22088:3;22043:73;:::o;22122:189::-;22199:32;;:::i;:::-;22240:65;22298:6;22290;22284:4;22240:65;:::i;:::-;22175:136;22122:189;;:::o;22317:186::-;22377:120;22394:3;22387:5;22384:14;22377:120;;;22448:39;22485:1;22478:5;22448:39;:::i;:::-;22421:1;22414:5;22410:13;22401:22;;22377:120;;;22317:186;;:::o;22509:543::-;22610:2;22605:3;22602:11;22599:446;;;22644:38;22676:5;22644:38;:::i;:::-;22728:29;22746:10;22728:29;:::i;:::-;22718:8;22714:44;22911:2;22899:10;22896:18;22893:49;;;22932:8;22917:23;;22893:49;22955:80;23011:22;23029:3;23011:22;:::i;:::-;23001:8;22997:37;22984:11;22955:80;:::i;:::-;22614:431;;22599:446;22509:543;;;:::o;23058:117::-;23112:8;23162:5;23156:4;23152:16;23131:37;;23058:117;;;;:::o;23181:169::-;23225:6;23258:51;23306:1;23302:6;23294:5;23291:1;23287:13;23258:51;:::i;:::-;23254:56;23339:4;23333;23329:15;23319:25;;23232:118;23181:169;;;;:::o;23355:295::-;23431:4;23577:29;23602:3;23596:4;23577:29;:::i;:::-;23569:37;;23639:3;23636:1;23632:11;23626:4;23623:21;23615:29;;23355:295;;;;:::o;23655:1395::-;23772:37;23805:3;23772:37;:::i;:::-;23874:18;23866:6;23863:30;23860:56;;;23896:18;;:::i;:::-;23860:56;23940:38;23972:4;23966:11;23940:38;:::i;:::-;24025:67;24085:6;24077;24071:4;24025:67;:::i;:::-;24119:1;24143:4;24130:17;;24175:2;24167:6;24164:14;24192:1;24187:618;;;;24849:1;24866:6;24863:77;;;24915:9;24910:3;24906:19;24900:26;24891:35;;24863:77;24966:67;25026:6;25019:5;24966:67;:::i;:::-;24960:4;24953:81;24822:222;24157:887;;24187:618;24239:4;24235:9;24227:6;24223:22;24273:37;24305:4;24273:37;:::i;:::-;24332:1;24346:208;24360:7;24357:1;24354:14;24346:208;;;24439:9;24434:3;24430:19;24424:26;24416:6;24409:42;24490:1;24482:6;24478:14;24468:24;;24537:2;24526:9;24522:18;24509:31;;24383:4;24380:1;24376:12;24371:17;;24346:208;;;24582:6;24573:7;24570:19;24567:179;;;24640:9;24635:3;24631:19;24625:26;24683:48;24725:4;24717:6;24713:17;24702:9;24683:48;:::i;:::-;24675:6;24668:64;24590:156;24567:179;24792:1;24788;24780:6;24776:14;24772:22;24766:4;24759:36;24194:611;;;24157:887;;23747:1303;;;23655:1395;;:::o;25056:228::-;25196:34;25192:1;25184:6;25180:14;25173:58;25265:11;25260:2;25252:6;25248:15;25241:36;25056:228;:::o;25290:366::-;25432:3;25453:67;25517:2;25512:3;25453:67;:::i;:::-;25446:74;;25529:93;25618:3;25529:93;:::i;:::-;25647:2;25642:3;25638:12;25631:19;;25290:366;;;:::o;25662:419::-;25828:4;25866:2;25855:9;25851:18;25843:26;;25915:9;25909:4;25905:20;25901:1;25890:9;25886:17;25879:47;25943:131;26069:4;25943:131;:::i;:::-;25935:139;;25662:419;;;:::o;26087:180::-;26135:77;26132:1;26125:88;26232:4;26229:1;26222:15;26256:4;26253:1;26246:15;26273:194;26313:4;26333:20;26351:1;26333:20;:::i;:::-;26328:25;;26367:20;26385:1;26367:20;:::i;:::-;26362:25;;26411:1;26408;26404:9;26396:17;;26435:1;26429:4;26426:11;26423:37;;;26440:18;;:::i;:::-;26423:37;26273:194;;;;:::o;26473:229::-;26613:34;26609:1;26601:6;26597:14;26590:58;26682:12;26677:2;26669:6;26665:15;26658:37;26473:229;:::o;26708:366::-;26850:3;26871:67;26935:2;26930:3;26871:67;:::i;:::-;26864:74;;26947:93;27036:3;26947:93;:::i;:::-;27065:2;27060:3;27056:12;27049:19;;26708:366;;;:::o;27080:419::-;27246:4;27284:2;27273:9;27269:18;27261:26;;27333:9;27327:4;27323:20;27319:1;27308:9;27304:17;27297:47;27361:131;27487:4;27361:131;:::i;:::-;27353:139;;27080:419;;;:::o;27505:191::-;27545:3;27564:20;27582:1;27564:20;:::i;:::-;27559:25;;27598:20;27616:1;27598:20;:::i;:::-;27593:25;;27641:1;27638;27634:9;27627:16;;27662:3;27659:1;27656:10;27653:36;;;27669:18;;:::i;:::-;27653:36;27505:191;;;;:::o;27702:173::-;27842:25;27838:1;27830:6;27826:14;27819:49;27702:173;:::o;27881:366::-;28023:3;28044:67;28108:2;28103:3;28044:67;:::i;:::-;28037:74;;28120:93;28209:3;28120:93;:::i;:::-;28238:2;28233:3;28229:12;28222:19;;27881:366;;;:::o;28253:419::-;28419:4;28457:2;28446:9;28442:18;28434:26;;28506:9;28500:4;28496:20;28492:1;28481:9;28477:17;28470:47;28534:131;28660:4;28534:131;:::i;:::-;28526:139;;28253:419;;;:::o;28678:77::-;28715:7;28744:5;28733:16;;28678:77;;;:::o;28761:79::-;28800:7;28829:5;28818:16;;28761:79;;;:::o;28846:157::-;28951:45;28971:24;28989:5;28971:24;:::i;:::-;28951:45;:::i;:::-;28946:3;28939:58;28846:157;;:::o;29009:256::-;29121:3;29136:75;29207:3;29198:6;29136:75;:::i;:::-;29236:2;29231:3;29227:12;29220:19;;29256:3;29249:10;;29009:256;;;;:::o;29271:233::-;29310:3;29333:24;29351:5;29333:24;:::i;:::-;29324:33;;29379:66;29372:5;29369:77;29366:103;;29449:18;;:::i;:::-;29366:103;29496:1;29489:5;29485:13;29478:20;;29271:233;;;:::o;29510:177::-;29650:29;29646:1;29638:6;29634:14;29627:53;29510:177;:::o;29693:366::-;29835:3;29856:67;29920:2;29915:3;29856:67;:::i;:::-;29849:74;;29932:93;30021:3;29932:93;:::i;:::-;30050:2;30045:3;30041:12;30034:19;;29693:366;;;:::o;30065:419::-;30231:4;30269:2;30258:9;30254:18;30246:26;;30318:9;30312:4;30308:20;30304:1;30293:9;30289:17;30282:47;30346:131;30472:4;30346:131;:::i;:::-;30338:139;;30065:419;;;:::o;30490:182::-;30630:34;30626:1;30618:6;30614:14;30607:58;30490:182;:::o;30678:366::-;30820:3;30841:67;30905:2;30900:3;30841:67;:::i;:::-;30834:74;;30917:93;31006:3;30917:93;:::i;:::-;31035:2;31030:3;31026:12;31019:19;;30678:366;;;:::o;31050:419::-;31216:4;31254:2;31243:9;31239:18;31231:26;;31303:9;31297:4;31293:20;31289:1;31278:9;31274:17;31267:47;31331:131;31457:4;31331:131;:::i;:::-;31323:139;;31050:419;;;:::o;31475:180::-;31523:77;31520:1;31513:88;31620:4;31617:1;31610:15;31644:4;31641:1;31634:15;31661:185;31701:1;31718:20;31736:1;31718:20;:::i;:::-;31713:25;;31752:20;31770:1;31752:20;:::i;:::-;31747:25;;31791:1;31781:35;;31796:18;;:::i;:::-;31781:35;31838:1;31835;31831:9;31826:14;;31661:185;;;;:::o;31852:181::-;31992:33;31988:1;31980:6;31976:14;31969:57;31852:181;:::o;32039:366::-;32181:3;32202:67;32266:2;32261:3;32202:67;:::i;:::-;32195:74;;32278:93;32367:3;32278:93;:::i;:::-;32396:2;32391:3;32387:12;32380:19;;32039:366;;;:::o;32411:419::-;32577:4;32615:2;32604:9;32600:18;32592:26;;32664:9;32658:4;32654:20;32650:1;32639:9;32635:17;32628:47;32692:131;32818:4;32692:131;:::i;:::-;32684:139;;32411:419;;;:::o;32836:177::-;32976:29;32972:1;32964:6;32960:14;32953:53;32836:177;:::o;33019:366::-;33161:3;33182:67;33246:2;33241:3;33182:67;:::i;:::-;33175:74;;33258:93;33347:3;33258:93;:::i;:::-;33376:2;33371:3;33367:12;33360:19;;33019:366;;;:::o;33391:419::-;33557:4;33595:2;33584:9;33580:18;33572:26;;33644:9;33638:4;33634:20;33630:1;33619:9;33615:17;33608:47;33672:131;33798:4;33672:131;:::i;:::-;33664:139;;33391:419;;;:::o;33816:175::-;33956:27;33952:1;33944:6;33940:14;33933:51;33816:175;:::o;33997:366::-;34139:3;34160:67;34224:2;34219:3;34160:67;:::i;:::-;34153:74;;34236:93;34325:3;34236:93;:::i;:::-;34354:2;34349:3;34345:12;34338:19;;33997:366;;;:::o;34369:419::-;34535:4;34573:2;34562:9;34558:18;34550:26;;34622:9;34616:4;34612:20;34608:1;34597:9;34593:17;34586:47;34650:131;34776:4;34650:131;:::i;:::-;34642:139;;34369:419;;;:::o;34794:234::-;34934:34;34930:1;34922:6;34918:14;34911:58;35003:17;34998:2;34990:6;34986:15;34979:42;34794:234;:::o;35034:366::-;35176:3;35197:67;35261:2;35256:3;35197:67;:::i;:::-;35190:74;;35273:93;35362:3;35273:93;:::i;:::-;35391:2;35386:3;35382:12;35375:19;;35034:366;;;:::o;35406:419::-;35572:4;35610:2;35599:9;35595:18;35587:26;;35659:9;35653:4;35649:20;35645:1;35634:9;35630:17;35623:47;35687:131;35813:4;35687:131;:::i;:::-;35679:139;;35406:419;;;:::o;35831:442::-;35980:4;36018:2;36007:9;36003:18;35995:26;;36031:71;36099:1;36088:9;36084:17;36075:6;36031:71;:::i;:::-;36112:72;36180:2;36169:9;36165:18;36156:6;36112:72;:::i;:::-;36194;36262:2;36251:9;36247:18;36238:6;36194:72;:::i;:::-;35831:442;;;;;;:::o;36279:434::-;36368:5;36393:66;36409:49;36451:6;36409:49;:::i;:::-;36393:66;:::i;:::-;36384:75;;36482:6;36475:5;36468:21;36520:4;36513:5;36509:16;36558:3;36549:6;36544:3;36540:16;36537:25;36534:112;;;36565:79;;:::i;:::-;36534:112;36655:52;36700:6;36695:3;36690;36655:52;:::i;:::-;36374:339;36279:434;;;;;:::o;36733:355::-;36800:5;36849:3;36842:4;36834:6;36830:17;36826:27;36816:122;;36857:79;;:::i;:::-;36816:122;36967:6;36961:13;36992:90;37078:3;37070:6;37063:4;37055:6;37051:17;36992:90;:::i;:::-;36983:99;;36806:282;36733:355;;;;:::o;37094:524::-;37174:6;37223:2;37211:9;37202:7;37198:23;37194:32;37191:119;;;37229:79;;:::i;:::-;37191:119;37370:1;37359:9;37355:17;37349:24;37400:18;37392:6;37389:30;37386:117;;;37422:79;;:::i;:::-;37386:117;37527:74;37593:7;37584:6;37573:9;37569:22;37527:74;:::i;:::-;37517:84;;37320:291;37094:524;;;;:::o;37624:148::-;37726:11;37763:3;37748:18;;37624:148;;;;:::o;37778:390::-;37884:3;37912:39;37945:5;37912:39;:::i;:::-;37967:89;38049:6;38044:3;37967:89;:::i;:::-;37960:96;;38065:65;38123:6;38118:3;38111:4;38104:5;38100:16;38065:65;:::i;:::-;38155:6;38150:3;38146:16;38139:23;;37888:280;37778:390;;;;:::o;38174:275::-;38306:3;38328:95;38419:3;38410:6;38328:95;:::i;:::-;38321:102;;38440:3;38433:10;;38174:275;;;;:::o;38455:225::-;38595:34;38591:1;38583:6;38579:14;38572:58;38664:8;38659:2;38651:6;38647:15;38640:33;38455:225;:::o;38686:366::-;38828:3;38849:67;38913:2;38908:3;38849:67;:::i;:::-;38842:74;;38925:93;39014:3;38925:93;:::i;:::-;39043:2;39038:3;39034:12;39027:19;;38686:366;;;:::o;39058:419::-;39224:4;39262:2;39251:9;39247:18;39239:26;;39311:9;39305:4;39301:20;39297:1;39286:9;39282:17;39275:47;39339:131;39465:4;39339:131;:::i;:::-;39331:139;;39058:419;;;:::o;39483:410::-;39523:7;39546:20;39564:1;39546:20;:::i;:::-;39541:25;;39580:20;39598:1;39580:20;:::i;:::-;39575:25;;39635:1;39632;39628:9;39657:30;39675:11;39657:30;:::i;:::-;39646:41;;39836:1;39827:7;39823:15;39820:1;39817:22;39797:1;39790:9;39770:83;39747:139;;39866:18;;:::i;:::-;39747:139;39531:362;39483:410;;;;:::o;39899:176::-;39931:1;39948:20;39966:1;39948:20;:::i;:::-;39943:25;;39982:20;40000:1;39982:20;:::i;:::-;39977:25;;40021:1;40011:35;;40026:18;;:::i;:::-;40011:35;40067:1;40064;40060:9;40055:14;;39899:176;;;;:::o;40081:231::-;40221:34;40217:1;40209:6;40205:14;40198:58;40290:14;40285:2;40277:6;40273:15;40266:39;40081:231;:::o;40318:366::-;40460:3;40481:67;40545:2;40540:3;40481:67;:::i;:::-;40474:74;;40557:93;40646:3;40557:93;:::i;:::-;40675:2;40670:3;40666:12;40659:19;;40318:366;;;:::o;40690:419::-;40856:4;40894:2;40883:9;40879:18;40871:26;;40943:9;40937:4;40933:20;40929:1;40918:9;40914:17;40907:47;40971:131;41097:4;40971:131;:::i;:::-;40963:139;;40690:419;;;:::o;41115:228::-;41255:34;41251:1;41243:6;41239:14;41232:58;41324:11;41319:2;41311:6;41307:15;41300:36;41115:228;:::o;41349:366::-;41491:3;41512:67;41576:2;41571:3;41512:67;:::i;:::-;41505:74;;41588:93;41677:3;41588:93;:::i;:::-;41706:2;41701:3;41697:12;41690:19;;41349:366;;;:::o;41721:419::-;41887:4;41925:2;41914:9;41910:18;41902:26;;41974:9;41968:4;41964:20;41960:1;41949:9;41945:17;41938:47;42002:131;42128:4;42002:131;:::i;:::-;41994:139;;41721:419;;;:::o;42146:223::-;42286:34;42282:1;42274:6;42270:14;42263:58;42355:6;42350:2;42342:6;42338:15;42331:31;42146:223;:::o;42375:366::-;42517:3;42538:67;42602:2;42597:3;42538:67;:::i;:::-;42531:74;;42614:93;42703:3;42614:93;:::i;:::-;42732:2;42727:3;42723:12;42716:19;;42375:366;;;:::o;42747:419::-;42913:4;42951:2;42940:9;42936:18;42928:26;;43000:9;42994:4;42990:20;42986:1;42975:9;42971:17;42964:47;43028:131;43154:4;43028:131;:::i;:::-;43020:139;;42747:419;;;:::o;43172:182::-;43312:34;43308:1;43300:6;43296:14;43289:58;43172:182;:::o;43360:366::-;43502:3;43523:67;43587:2;43582:3;43523:67;:::i;:::-;43516:74;;43599:93;43688:3;43599:93;:::i;:::-;43717:2;43712:3;43708:12;43701:19;;43360:366;;;:::o;43732:419::-;43898:4;43936:2;43925:9;43921:18;43913:26;;43985:9;43979:4;43975:20;43971:1;43960:9;43956:17;43949:47;44013:131;44139:4;44013:131;:::i;:::-;44005:139;;43732:419;;;:::o;44157:237::-;44297:34;44293:1;44285:6;44281:14;44274:58;44366:20;44361:2;44353:6;44349:15;44342:45;44157:237;:::o;44400:366::-;44542:3;44563:67;44627:2;44622:3;44563:67;:::i;:::-;44556:74;;44639:93;44728:3;44639:93;:::i;:::-;44757:2;44752:3;44748:12;44741:19;;44400:366;;;:::o;44772:419::-;44938:4;44976:2;44965:9;44961:18;44953:26;;45025:9;45019:4;45015:20;45011:1;45000:9;44996:17;44989:47;45053:131;45179:4;45053:131;:::i;:::-;45045:139;;44772:419;;;:::o;45197:179::-;45337:31;45333:1;45325:6;45321:14;45314:55;45197:179;:::o;45382:366::-;45524:3;45545:67;45609:2;45604:3;45545:67;:::i;:::-;45538:74;;45621:93;45710:3;45621:93;:::i;:::-;45739:2;45734:3;45730:12;45723:19;;45382:366;;;:::o;45754:419::-;45920:4;45958:2;45947:9;45943:18;45935:26;;46007:9;46001:4;45997:20;45993:1;45982:9;45978:17;45971:47;46035:131;46161:4;46035:131;:::i;:::-;46027:139;;45754:419;;;:::o;46179:179::-;46319:31;46315:1;46307:6;46303:14;46296:55;46179:179;:::o;46364:402::-;46524:3;46545:85;46627:2;46622:3;46545:85;:::i;:::-;46538:92;;46639:93;46728:3;46639:93;:::i;:::-;46757:2;46752:3;46748:12;46741:19;;46364:402;;;:::o;46772:381::-;46957:3;46979:148;47123:3;46979:148;:::i;:::-;46972:155;;47144:3;47137:10;;46772:381;;;:::o;47159:366::-;47301:3;47322:67;47386:2;47381:3;47322:67;:::i;:::-;47315:74;;47398:93;47487:3;47398:93;:::i;:::-;47516:2;47511:3;47507:12;47500:19;;47159:366;;;:::o;47531:419::-;47697:4;47735:2;47724:9;47720:18;47712:26;;47784:9;47778:4;47774:20;47770:1;47759:9;47755:17;47748:47;47812:131;47938:4;47812:131;:::i;:::-;47804:139;;47531:419;;;:::o;47956:76::-;47992:7;48021:5;48010:16;;47956:76;;;:::o;48038:375::-;48077:3;48096:19;48113:1;48096:19;:::i;:::-;48091:24;;48129:19;48146:1;48129:19;:::i;:::-;48124:24;;48171:1;48168;48164:9;48157:16;;48369:1;48364:3;48360:11;48353:19;48349:1;48346;48342:9;48338:35;48321:1;48316:3;48312:11;48307:1;48304;48300:9;48293:17;48289:35;48273:110;48270:136;;;48386:18;;:::i;:::-;48270:136;48038:375;;;;:::o;48419:556::-;48458:7;48481:19;48498:1;48481:19;:::i;:::-;48476:24;;48514:19;48531:1;48514:19;:::i;:::-;48509:24;;48568:1;48565;48561:9;48590:29;48607:11;48590:29;:::i;:::-;48579:40;;48677:66;48674:1;48671:73;48667:1;48664;48660:9;48656:89;48653:115;;;48748:18;;:::i;:::-;48653:115;48918:1;48909:7;48904:16;48901:1;48898:23;48878:1;48871:9;48851:84;48828:140;;48948:18;;:::i;:::-;48828:140;48466:509;48419:556;;;;:::o;48981:385::-;49020:1;49037:19;49054:1;49037:19;:::i;:::-;49032:24;;49070:19;49087:1;49070:19;:::i;:::-;49065:24;;49108:1;49098:35;;49113:18;;:::i;:::-;49098:35;49299:1;49296;49292:9;49289:1;49286:16;49205:66;49202:1;49199:73;49182:130;49179:156;;;49315:18;;:::i;:::-;49179:156;49358:1;49355;49350:10;49345:15;;48981:385;;;;:::o;49372:372::-;49411:4;49431:19;49448:1;49431:19;:::i;:::-;49426:24;;49464:19;49481:1;49464:19;:::i;:::-;49459:24;;49507:1;49504;49500:9;49492:17;;49701:1;49695:4;49691:12;49687:1;49684;49680:9;49676:28;49659:1;49653:4;49649:12;49644:1;49641;49637:9;49630:17;49626:36;49610:104;49607:130;;;49717:18;;:::i;:::-;49607:130;49372:372;;;;:::o;49750:98::-;49801:6;49835:5;49829:12;49819:22;;49750:98;;;:::o;49854:168::-;49937:11;49971:6;49966:3;49959:19;50011:4;50006:3;50002:14;49987:29;;49854:168;;;;:::o;50028:373::-;50114:3;50142:38;50174:5;50142:38;:::i;:::-;50196:70;50259:6;50254:3;50196:70;:::i;:::-;50189:77;;50275:65;50333:6;50328:3;50321:4;50314:5;50310:16;50275:65;:::i;:::-;50365:29;50387:6;50365:29;:::i;:::-;50360:3;50356:39;50349:46;;50118:283;50028:373;;;;:::o;50407:640::-;50602:4;50640:3;50629:9;50625:19;50617:27;;50654:71;50722:1;50711:9;50707:17;50698:6;50654:71;:::i;:::-;50735:72;50803:2;50792:9;50788:18;50779:6;50735:72;:::i;:::-;50817;50885:2;50874:9;50870:18;50861:6;50817:72;:::i;:::-;50936:9;50930:4;50926:20;50921:2;50910:9;50906:18;50899:48;50964:76;51035:4;51026:6;50964:76;:::i;:::-;50956:84;;50407:640;;;;;;;:::o;51053:141::-;51109:5;51140:6;51134:13;51125:22;;51156:32;51182:5;51156:32;:::i;:::-;51053:141;;;;:::o;51200:349::-;51269:6;51318:2;51306:9;51297:7;51293:23;51289:32;51286:119;;;51324:79;;:::i;:::-;51286:119;51444:1;51469:63;51524:7;51515:6;51504:9;51500:22;51469:63;:::i;:::-;51459:73;;51415:127;51200:349;;;;:::o;51555:182::-;51695:34;51691:1;51683:6;51679:14;51672:58;51555:182;:::o;51743:366::-;51885:3;51906:67;51970:2;51965:3;51906:67;:::i;:::-;51899:74;;51982:93;52071:3;51982:93;:::i;:::-;52100:2;52095:3;52091:12;52084:19;;51743:366;;;:::o;52115:419::-;52281:4;52319:2;52308:9;52304:18;52296:26;;52368:9;52362:4;52358:20;52354:1;52343:9;52339:17;52332:47;52396:131;52522:4;52396:131;:::i;:::-;52388:139;;52115:419;;;:::o;52540:178::-;52680:30;52676:1;52668:6;52664:14;52657:54;52540:178;:::o;52724:366::-;52866:3;52887:67;52951:2;52946:3;52887:67;:::i;:::-;52880:74;;52963:93;53052:3;52963:93;:::i;:::-;53081:2;53076:3;53072:12;53065:19;;52724:366;;;:::o;53096:419::-;53262:4;53300:2;53289:9;53285:18;53277:26;;53349:9;53343:4;53339:20;53335:1;53324:9;53320:17;53313:47;53377:131;53503:4;53377:131;:::i;:::-;53369:139;;53096:419;;;:::o;53521:180::-;53569:77;53566:1;53559:88;53666:4;53663:1;53656:15;53690:4;53687:1;53680:15

Swarm Source

ipfs://7e57d8d43dbf6a8cc5dfb6627667f35e9500730d26239eb99032ae42514eef1f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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