Sepolia Testnet

Contract

0xeA80b94a8B339c592c4F08bcCC87De7b57384BDD
Source Code Source Code

Overview

ETH Balance

10 wei

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount
Set Name Batch104142212026-03-09 10:44:244 days ago1773053064IN
0xeA80b94a...b57384BDD
0 ETH0.000683761.50001844
Set Name Batch104141812026-03-09 10:33:484 days ago1773052428IN
0xeA80b94a...b57384BDD
0 ETH0.000683711.50001118
Set Name Batch103197082026-02-23 10:22:0018 days ago1771842120IN
0xeA80b94a...b57384BDD
0 ETH0.000291011.50000001
Set Name Batch100999062026-01-22 16:17:0050 days ago1769098620IN
0xeA80b94a...b57384BDD
0 ETH0.001004752.50687865
Set Name Batch100994732026-01-22 14:50:1250 days ago1769093412IN
0xeA80b94a...b57384BDD
0 ETH0.001006242.494126
Set Name Batch100994722026-01-22 14:50:0050 days ago1769093400IN
0xeA80b94a...b57384BDD
0 ETH0.00037522.57577646
Set Name Batch99504912025-12-31 7:17:3672 days ago1767165456IN
0xeA80b94a...b57384BDD
0 ETH0.000469471.5
Set Name Batch99401932025-12-29 18:47:0074 days ago1767034020IN
0xeA80b94a...b57384BDD
0 ETH0.000292261.50005368
Set Name Batch99401912025-12-29 18:46:3674 days ago1767033996IN
0xeA80b94a...b57384BDD
0 ETH0.000292261.50005372
Set Name Batch99401902025-12-29 18:46:1274 days ago1767033972IN
0xeA80b94a...b57384BDD
0 ETH0.000636911.50005474
Set Name Batch99389092025-12-29 14:13:1274 days ago1767017592IN
0xeA80b94a...b57384BDD
0 ETH0.000248171.50005109
Set Name Batch99389082025-12-29 14:13:0074 days ago1767017580IN
0xeA80b94a...b57384BDD
0 ETH0.000248171.50005287
Set Name Batch99389072025-12-29 14:12:4874 days ago1767017568IN
0xeA80b94a...b57384BDD
0 ETH0.000549281.50005565
Set Name Batch99387822025-12-29 13:46:2474 days ago1767015984IN
0xeA80b94a...b57384BDD
0 ETH0.000379931.500051
Set Name Batch99387762025-12-29 13:45:1274 days ago1767015912IN
0xeA80b94a...b57384BDD
0 ETH0.000379931.50004217
Set Name Batch99387742025-12-29 13:44:4874 days ago1767015888IN
0xeA80b94a...b57384BDD
0 ETH0.000925531.50004571
Set Name Batch99134812025-12-25 19:02:0078 days ago1766689320IN
0xeA80b94a...b57384BDD
0 ETH0.001800771.50003645
Set Name Batch99132212025-12-25 18:03:4878 days ago1766685828IN
0xeA80b94a...b57384BDD
0 ETH0.001805131.50004732
Set Name Batch99120952025-12-25 13:49:1278 days ago1766670552IN
0xeA80b94a...b57384BDD
0 ETH0.000136531.50000001
Set Name Batch99104392025-12-25 7:39:3678 days ago1766648376IN
0xeA80b94a...b57384BDD
0 ETH0.003415261.50004983
Set Name96131292025-11-12 9:13:12121 days ago1762938792IN
0xeA80b94a...b57384BDD
0 ETH0.000244811.50000001
Set Name Batch95739842025-11-06 16:52:12127 days ago1762447932IN
0xeA80b94a...b57384BDD
0 ETH0.00151481.5
Set Name Batch95736902025-11-06 15:49:36127 days ago1762444176IN
0xeA80b94a...b57384BDD
0 ETH0.001514271.50000083
Update Pricing95728132025-11-06 12:43:48127 days ago1762433028IN
0xeA80b94a...b57384BDD
0 ETH0.000037951.50003684
Set Name95675792025-11-05 18:00:12128 days ago1762365612IN
0xeA80b94a...b57384BDD
10 wei0.00037981.50000001
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EnscribeV2

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
cancun EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2025-11-06
*/

/**
 *Submitted for verification at Etherscan.io on 2025-11-06
*/

// File: https://github.com/ensdomains/ens-contracts/blob/staging/contracts/utils/LibMem/LibMem.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

library LibMem {
    /// @dev Copy `mem[src:src+len]` to `mem[dst:dst+len]`.
    ///      Equivalent to `mcopy()`.
    ///
    /// @param src The source memory offset.
    /// @param dst The destination memory offset.
    /// @param len The number of bytes to copy.
    function copy(uint256 dst, uint256 src, uint256 len) internal pure {
        assembly ("memory-safe") {
            // Copy word-length chunks while possible
            // prettier-ignore
            for {} gt(len, 31) {} {
                mstore(dst, mload(src))
                dst := add(dst, 32)
                src := add(src, 32)
                len := sub(len, 32)
            }
            // Copy remaining bytes
            if len {
                let mask := sub(shl(shl(3, sub(32, len)), 1), 1)
                let wSrc := and(mload(src), not(mask))
                let wDst := and(mload(dst), mask)
                mstore(dst, or(wSrc, wDst))
            }
        }
    }

    /// @dev Convert bytes to a memory offset.
    ///
    /// @param v The bytes to convert.
    ///
    /// @return ret The corresponding memory offset.
    function ptr(bytes memory v) internal pure returns (uint256 ret) {
        assembly ("memory-safe") {
            ret := add(v, 32)
        }
    }
    
    /// @dev Read word at memory offset.
    ///
    /// @param src The memory offset.
    ///
    /// @return ret The read word.
    function load(uint256 src) internal pure returns (uint256 ret) {
        assembly ("memory-safe") {
            ret := mload(src)
        }
    }
}

// File: https://github.com/ensdomains/ens-contracts/blob/staging/contracts/utils/BytesUtils.sol

pragma solidity ^0.8.4;


library BytesUtils {
    /// @dev `offset` was beyond `length`.
    ///       Error selector: `0x8a3c1cfb`
    error OffsetOutOfBoundsError(uint256 offset, uint256 length);

    /// @dev Assert `end` is not beyond the length of `v`.
    function _checkBound(bytes memory v, uint256 end) internal pure {
        if (end > v.length) {
            revert OffsetOutOfBoundsError(end, v.length);
        }
    }

    /// @dev Compute `keccak256(v[off:off+len])`.
    /// @param v The source bytes.
    /// @param off The offset into the source.
    /// @param len The number of bytes to hash.
    /// @return ret The corresponding hash.
    function keccak(
        bytes memory v,
        uint256 off,
        uint256 len
    ) internal pure returns (bytes32 ret) {
        _checkBound(v, off + len);
        assembly ("memory-safe") {
            ret := keccak256(add(add(v, 32), off), len)
        }
    }

    /// @dev Lexicographically compare two byte strings.
    /// @param vA The first bytes to compare.
    /// @param vB The second bytes to compare.
    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.
    function compare(
        bytes memory vA,
        bytes memory vB
    ) internal pure returns (int256) {
        return compare(vA, 0, vA.length, vB, 0, vB.length);
    }

    /// @dev Lexicographically compare two byte ranges: `A = vA[offA:offA+lenA]` and `B = vB[offB:offB+lenB]`.
    /// @param vA The first bytes.
    /// @param offA The offset of the first bytes.
    /// @param lenA The length of the first bytes.
    /// @param vB The second bytes.
    /// @param offB The offset of the second bytes.
    /// @param lenB The length of the second bytes.
    /// @return Positive number if `A > B`, negative number if `A < B`, or zero if `A == B`.
    function compare(
        bytes memory vA,
        uint256 offA,
        uint256 lenA,
        bytes memory vB,
        uint256 offB,
        uint256 lenB
    ) internal pure returns (int256) {
        _checkBound(vA, offA + lenA);
        _checkBound(vB, offB + lenB);
        unchecked {
            uint256 ptrA = LibMem.ptr(vA) + offA;
            uint256 ptrB = LibMem.ptr(vB) + offB;
            uint256 shortest = lenA < lenB ? lenA : lenB;
            for (uint256 i; i < shortest; i += 32) {
                uint256 a = LibMem.load(ptrA + i);
                uint256 b = LibMem.load(ptrB + i);
                if (a != b) {
                    uint256 rest = shortest - i;
                    if (rest < 32) {
                        rest = (32 - rest) << 3; // bits to drop
                        a >>= rest; // shift out the
                        b >>= rest; // irrelevant bits
                    }
                    if (a < b) {
                        return -1;
                    } else if (a > b) {
                        return 1;
                    }
                }
            }
        }
        return int256(lenA) - int256(lenB);
    }

    /// @dev Determine if `a[offA:offA+len] == b[offB:offB+len]`.
    /// @param vA The first bytes.
    /// @param offA The offset into the first bytes.
    /// @param vB The second bytes.
    /// @param offB The offset into the second bytes.
    /// @param len The number of bytes to compare.
    /// @return True if the byte ranges are equal.
    function equals(
        bytes memory vA,
        uint256 offA,
        bytes memory vB,
        uint256 offB,
        uint256 len
    ) internal pure returns (bool) {
        return keccak(vA, offA, len) == keccak(vB, offB, len);
    }

    /// @dev Determine if `a[offA:] == b[offB:]`.
    /// @param vA The first bytes.
    /// @param offA The offset into the first bytes.
    /// @param vB The second bytes.
    /// @param offB The offset into the second bytes.
    /// @return True if the byte ranges are equal.
    function equals(
        bytes memory vA,
        uint256 offA,
        bytes memory vB,
        uint256 offB
    ) internal pure returns (bool) {
        _checkBound(vA, offA);
        _checkBound(vB, offB);
        unchecked {
            return
                keccak(vA, offA, vA.length - offA) ==
                keccak(vB, offB, vB.length - offB);
        }
    }

    /// @dev Determine if `a[offA:] == b`.
    /// @param vA The first bytes.
    /// @param offA The offset into the first bytes.
    /// @param vB The second bytes.
    /// @return True if the byte ranges are equal.
    function equals(
        bytes memory vA,
        uint256 offA,
        bytes memory vB
    ) internal pure returns (bool) {
        return
            vA.length == offA + vB.length &&
            keccak(vA, offA, vB.length) == keccak256(vB);
    }

    /// @dev Determine if `a == b`.
    /// @param vA The first bytes.
    /// @param vB The second bytes.
    /// @return True if the bytes are equal.
    function equals(
        bytes memory vA,
        bytes memory vB
    ) internal pure returns (bool) {
        return vA.length == vB.length && keccak256(vA) == keccak256(vB);
    }

    /// @dev Returns `uint8(v[off])`.
    /// @param v The source bytes.
    /// @param off The offset into the source.
    /// @return The corresponding `uint8`.
    function readUint8(
        bytes memory v,
        uint256 off
    ) internal pure returns (uint8) {
        _checkBound(v, off + 1);
        unchecked {
            return uint8(v[off]);
        }
    }

    /// @dev Returns `uint16(bytes2(v[off:off+2]))`.
    /// @param v The source bytes.
    /// @param off The offset into the source.
    /// @return ret The corresponding `uint16`.
    function readUint16(
        bytes memory v,
        uint256 off
    ) internal pure returns (uint16 ret) {
        _checkBound(v, off + 2);
        assembly ("memory-safe") {
            ret := shr(240, mload(add(add(v, 32), off)))
        }
    }

    /// @dev Returns `uint32(bytes4(v[off:off+4]))`.
    /// @param v The source bytes.
    /// @param off The offset into the source.
    /// @return ret The corresponding `uint32`.
    function readUint32(
        bytes memory v,
        uint256 off
    ) internal pure returns (uint32 ret) {
        _checkBound(v, off + 4);
        assembly ("memory-safe") {
            ret := shr(224, mload(add(add(v, 32), off)))
        }
    }

    /// @dev Returns `bytes20(v[off:off+20])`.
    /// @param v The source bytes.
    /// @param off The offset into the source.
    /// @return ret The corresponding `bytes20`.
    function readBytes20(
        bytes memory v,
        uint256 off
    ) internal pure returns (bytes20 ret) {
        _checkBound(v, off + 20);
        assembly ("memory-safe") {
            ret := shl(96, mload(add(add(v, 20), off)))
        }
    }

    /// @dev Returns `bytes32(v[off:off+32])`.
    /// @param v The source bytes.
    /// @param off The offset into the source.
    /// @return ret The corresponding `bytes32`.
    function readBytes32(
        bytes memory v,
        uint256 off
    ) internal pure returns (bytes32 ret) {
        _checkBound(v, off + 32);
        assembly ("memory-safe") {
            ret := mload(add(add(v, 32), off))
        }
    }

    /// @dev Returns `bytes32(bytesN(v[off:off+len]))`.
    ///      Accepts 0-32 bytes or reverts.
    /// @param v The source bytes.
    /// @param off The offset into the source.
    /// @param len The number of bytes.
    /// @return ret The corresponding N-bytes left-aligned in a `bytes32`.
    function readBytesN(
        bytes memory v,
        uint256 off,
        uint256 len
    ) internal pure returns (bytes32 ret) {
        assert(len <= 32);
        _checkBound(v, off + len);
        assembly ("memory-safe") {
            let mask := sub(shl(shl(3, sub(32, len)), 1), 1) // <(32-N)x00><NxFF>
            ret := and(mload(add(add(v, 32), off)), not(mask))
        }
    }

    /// @dev Copy `vSrc[offSrc:offSrc+len]` to `vDst[offDst:offDst:len]`.
    /// @param vSrc The source bytes.
    /// @param offSrc The offset into the source to begin the copy.
    /// @param vDst The destination bytes.
    /// @param offDst The offset into the destination to place the copy.
    /// @param len The number of bytes to copy.
    function copyBytes(
        bytes memory vSrc,
        uint256 offSrc,
        bytes memory vDst,
        uint256 offDst,
        uint256 len
    ) internal pure {
        _checkBound(vSrc, offSrc + len);
        _checkBound(vDst, offDst + len);
        unchecked {
            LibMem.copy(
                LibMem.ptr(vDst) + offDst,
                LibMem.ptr(vSrc) + offSrc,
                len
            );
        }
    }

    /// @dev Copies a substring into a new byte string.
    /// @param vSrc The byte string to copy from.
    /// @param off The offset to start copying at.
    /// @param len The number of bytes to copy.
    /// @return vDst The copied substring.
    function substring(
        bytes memory vSrc,
        uint256 off,
        uint256 len
    ) internal pure returns (bytes memory vDst) {
        vDst = new bytes(len);
        copyBytes(vSrc, off, vDst, 0, len);
    }

    /// @dev Find the first occurrence of `needle`.
    /// @param v The bytes to search.
    /// @param off The offset to start searching.
    /// @param len The number of bytes to search.
    /// @param needle The byte to search for.
    /// @return The offset of `needle`, or `type(uint256).max` if not found.
    function find(
        bytes memory v,
        uint256 off,
        uint256 len,
        bytes1 needle
    ) internal pure returns (uint256) {
        for (uint256 end = off + len; off < end; off++) {
            if (v[off] == needle) {
                return off;
            }
        }
        return type(uint256).max;
    }

    /// @dev Returns `true` if word contains a zero byte.
    function hasZeroByte(uint256 word) internal pure returns (bool) {
        unchecked {
            return
                ((~word &
                    (word -
                        0x0101010101010101010101010101010101010101010101010101010101010101)) &
                    0x8080808080808080808080808080808080808080808080808080808080808080) !=
                0;
        }
    }

    /// @dev Efficiently check if `v[off:off+len]` contains `needle` byte.
    /// @param v The source bytes.
    /// @param off The offset into the source.
    /// @param len The number of bytes to search.
    /// @param needle The byte to search for.
    /// @return found `true` if `needle` was found.
    function includes(
        bytes memory v,
        uint256 off,
        uint256 len,
        bytes1 needle
    ) internal pure returns (bool found) {
        _checkBound(v, off + len);
        unchecked {
            uint256 wide = uint8(needle);
            wide |= wide << 8;
            wide |= wide << 16;
            wide |= wide << 32;
            wide |= wide << 64;
            wide |= wide << 128; // broadcast byte across word
            off += LibMem.ptr(v);
            len += off;
            while (off < len) {
                uint256 word = LibMem.load(off) ^ wide; // zero needle byte
                off += 32;
                if (hasZeroByte(word)) {
                    return
                        off <= len ||
                        hasZeroByte(
                            word | ((1 << ((off - len) << 3)) - 1) // recheck overflow by making it nonzero
                        );
                }
            }
        }
    }
}

// File: https://github.com/ensdomains/ens-contracts/blob/staging/contracts/utils/NameCoder.sol


pragma solidity ^0.8.13;



/// @dev Library for encoding/decoding names.
///
/// An ENS name is stop-separated labels, eg. "aaa.bb.c".
///
/// A DNS-encoded name is composed of byte length-prefixed labels with a terminator byte.
/// eg. "\x03aaa\x02bb\x01c\x00".
///
/// * maximum label length is 255 bytes.
/// * length = 0 is reserved for the terminator (root).
/// * `dns.length == 2 + ens.length` and the mapping is injective.
///
library NameCoder {
    /// @dev The namehash of "eth".
    bytes32 public constant ETH_NODE =
        0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;

    /// @dev The label was empty.
    ///      Error selector: `0xbf9a2740`
    error LabelIsEmpty();

    /// @dev The label was more than 255 bytes.
    ///      Error selector: `0xdab6c73c`
    error LabelIsTooLong(string label);

    /// @dev The DNS-encoded name is malformed.
    ///      Error selector: `0xba4adc23`
    error DNSDecodingFailed(bytes dns);

    /// @dev A label of the ENS name has an invalid size.
    ///      Error selector: `0x9a4c3e3b`
    error DNSEncodingFailed(string ens);

    /// @dev The `name` did not end with `suffix`.
    ///
    /// @param name The DNS-encoded name.
    /// @param suffix The DNS-encoded suffix.
    error NoSuffixMatch(bytes name, bytes suffix);

    /// @dev Read the `size` of the label at `offset`.
    ///      If `size = 0`, it must be the end of `name` (no junk at end).
    ///      Reverts `DNSDecodingFailed`.
    ///
    /// @param name The DNS-encoded name.
    /// @param offset The offset into `name` to start reading.
    ///
    /// @return size The size of the label in bytes.
    /// @return nextOffset The offset into `name` of the next label.
    function nextLabel(
        bytes memory name,
        uint256 offset
    ) internal pure returns (uint8 size, uint256 nextOffset) {
        unchecked {
            if (offset >= name.length) {
                revert DNSDecodingFailed(name);
            }
            size = uint8(name[offset]);
            nextOffset = offset + 1 + size;
            if (size > 0 ? nextOffset >= name.length : nextOffset != name.length) {
                revert DNSDecodingFailed(name);
            }
        }
    }

    /// @dev Find the offset of the label before `offset` in `name`.
    ///      * `prevOffset(name, 0)` reverts
    ///      * `prevOffset(name, name.length + 1)` reverts
    ///      * `prevOffset(name, name.length) = name.length - 1`
    ///      * `prevOffset(name, name.length - 1) = <tld>`
    ///      Reverts `DNSDecodingFailed`.
    ///
    /// @param name The DNS-encoded name.
    /// @param offset The offset into `name` to start reading backwards.
    ///
    /// @return prevOffset The offset into `name` of the previous label.
    function prevLabel(
        bytes memory name,
        uint256 offset
    ) internal pure returns (uint256 prevOffset) {
        while (true) {
            (, uint256 nextOffset) = nextLabel(name, prevOffset);
            if (nextOffset == offset) break;
            if (nextOffset > offset) {
                revert DNSDecodingFailed(name);
            }
            prevOffset = nextOffset;
        }
    }

    /// @dev Count number of labels in `name`.
    ///      * `countLabels("\x03eth\x00") = 1`
    ///      * `countLabels("\x00") = 0`
    ///      Reverts like `nextLabel()`.
    ///
    /// @param name The DNS-encoded parent name.
    /// @param offset The offset into `name` to start hashing.
    ///
    /// @return count The number of labels.
    function countLabels(
        bytes memory name,
        uint256 offset
    ) internal pure returns (uint256 count) {
        uint8 size;
        while (true) {
            (size, offset) = nextLabel(name, offset);
            if (size == 0) break;
            ++count;
        }
    }

    /// @dev Compute the ENS labelhash of the label at `offset` and the offset for the next label.
    ///      Reverts `DNSDecodingFailed`.
    ///
    /// @param name The DNS-encoded name.
    /// @param offset The offset into `name` to start reading.
    ///
    /// @return labelHash The resulting labelhash.
    /// @return nextOffset The offset into `name` of the next label.
    function readLabel(
        bytes memory name,
        uint256 offset
    ) internal pure returns (bytes32 labelHash, uint256 nextOffset) {
        uint8 size;
        (size, nextOffset) = nextLabel(name, offset);
        if (size > 0) {
            assembly {
                labelHash := keccak256(add(add(name, offset), 33), size)
            }
        }
    }

    /// @dev Read label at offset from a DNS-encoded name and the offset for the next label.
    ///      * `readLabel("\x03abc\x00", 0) = ("abc", 4)`
    ///      * `readLabel("\x00", 0) = ("", 1)`
    ///      Reverts `DNSDecodingFailed`.
    ///
    /// @param name The DNS-encoded name.
    /// @param offset The offset into `name` to start reading.
    ///
    /// @return label The label corresponding to `offset`.
    /// @return nextOffset The offset into `name` of the next label.
    function extractLabel(
        bytes memory name,
        uint256 offset
    ) internal pure returns (string memory label, uint256 nextOffset) {
        uint8 size;
        (size, nextOffset) = nextLabel(name, offset);
        bytes memory v = new bytes(size);
        unchecked {
            LibMem.copy(LibMem.ptr(v), LibMem.ptr(name) + offset + 1, size);
        }
        label = string(v);
    }

    /// @dev Reads first label from a DNS-encoded name.
    ///      Reverts `DNSDecodingFailed`.
    ///      Reverts `LabelIsEmpty` if the label was empty.
    ///
    /// @param name The DNS-encoded name.
    ///
    /// @return The first label.
    function firstLabel(
        bytes memory name
    ) internal pure returns (string memory) {
        (string memory label, ) = extractLabel(name, 0);
        if (bytes(label).length == 0) {
            revert LabelIsEmpty();
        }
        return label;
    }

    /// @dev Compute the namehash of `name[:offset]`.
    ///      Reverts `DNSDecodingFailed`.
    ///
    /// @param name The DNS-encoded name.
    /// @param offset The offset into `name` to start hashing.
    ///
    /// @return hash The namehash of `name[:offset]`.
    function namehash(
        bytes memory name,
        uint256 offset
    ) internal pure returns (bytes32 hash) {
        (hash, offset) = readLabel(name, offset);
        if (hash != bytes32(0)) {
            hash = namehash(namehash(name, offset), hash);
        }
    }

    /// @dev Compute a child namehash from a parent namehash and child labelhash.
    ///
    /// @param parentNode The namehash of the parent.
    /// @param labelHash The labelhash of the child.
    ///
    /// @return node The namehash of the child.
    function namehash(
        bytes32 parentNode,
        bytes32 labelHash
    ) internal pure returns (bytes32 node) {
        // ~100 gas less than: keccak256(abi.encode(parentNode, labelHash))
        assembly {
            mstore(0, parentNode)
            mstore(32, labelHash)
            node := keccak256(0, 64)
        }
    }

    /// @dev Convert DNS-encoded name to ENS name.
    ///      * `decode("\x00") = ""`
    ///      * `decode("\x03eth\x00") = "eth"`
    ///      * `decode("\x03aaa\x02bb\x01c\x00") = "aa.bb.c"`
    ///      * `decode("\x03a.b\x00")` reverts
    ///      Reverts like `nextLabel()`.
    ///
    /// @param dns The DNS-encoded name to convert.
    ///
    /// @return ens The equivalent ENS name.
    function decode(
        bytes memory dns
    ) internal pure returns (string memory ens) {
        unchecked {
            uint256 n = dns.length;
            if (n == 1 && dns[0] == 0) return ""; // only valid answer is root
            if (n < 3) revert DNSDecodingFailed(dns);
            bytes memory v = new bytes(n - 2); // always 2-shorter
            LibMem.copy(LibMem.ptr(v), LibMem.ptr(dns) + 1, n - 2); // shift by -1 byte
            uint256 offset;
            while (true) {
                (uint8 size, uint256 nextOffset) = nextLabel(dns, offset);
                if (size == 0) break;
                if (BytesUtils.includes(v, offset, size, ".")) {
                    revert DNSDecodingFailed(dns); // malicious label
                }
                if (offset > 0) {
                    v[offset - 1] = ".";
                }
                offset = nextOffset;
            }
            return string(v);
        }
    }

    /// @dev Convert ENS name to DNS-encoded name.
    ///      * `encode("aaa.bb.c") = "\x03aaa\x02bb\x01c\x00"`
    ///      * `encode("eth") = "\x03eth\x00"`
    ///      * `encode("") = "\x00"`
    ///      Reverts `DNSEncodingFailed`.
    ///
    /// @param ens The ENS name to convert.
    ///
    /// @return dns The corresponding DNS-encoded name, eg. `\x03aaa\x02bb\x01c\x00`.
    function encode(
        string memory ens
    ) internal pure returns (bytes memory dns) {
        unchecked {
            uint256 n = bytes(ens).length;
            if (n == 0) return hex"00"; // root
            dns = new bytes(n + 2); // always 2-longer
            LibMem.copy(LibMem.ptr(dns) + 1, LibMem.ptr(bytes(ens)), n); // shift by +1 byte
            uint256 start; // remember position to write length
            uint256 size;
            for (uint256 i; i < n; ++i) {
                if (bytes(ens)[i] == ".") {
                    size = i - start;
                    if (size == 0 || size > 255) {
                        revert DNSEncodingFailed(ens);
                    }
                    dns[start] = bytes1(uint8(size));
                    start = i + 1;
                }
            }
            size = n - start;
            if (size == 0 || size > 255) {
                revert DNSEncodingFailed(ens);
            }
            dns[start] = bytes1(uint8(size));
        }
    }

    /// @dev Find the offset into `name` that namehashes to `nodeSuffix`.
    ///
    /// @param name The DNS-encoded name to search.
    /// @param nodeSuffix The namehash to match.
    ///
    /// @return matched True if `name` ends with `nodeSuffix`.
    /// @return node The namehash of `name[offset:]`.
    /// @return prevOffset The offset into `name` of the label before `nodeSuffix`, or `matchOffset` if no match or no prior label.
    /// @return matchOffset The offset into `name` that namehashes to the `nodeSuffix`, or 0 if no match.
    function matchSuffix(
        bytes memory name,
        uint256 offset,
        bytes32 nodeSuffix
    )
        internal
        pure
        returns (
            bool matched,
            bytes32 node,
            uint256 prevOffset,
            uint256 matchOffset
        )
    {
        (bytes32 labelHash, uint256 next) = readLabel(name, offset);
        if (labelHash != bytes32(0)) {
            (matched, node, prevOffset, matchOffset) = matchSuffix(
                name,
                next,
                nodeSuffix
            );
            if (node == nodeSuffix) {
                matched = true;
                prevOffset = offset;
                matchOffset = next;
            }
            node = namehash(node, labelHash);
        }
        if (node == nodeSuffix) {
            matched = true;
            prevOffset = matchOffset = offset;
        }
    }

    /// @dev Assert `label` is an encodable size.
    ///
    /// @param label The label to check.
    ///
    /// @return The size of the label.
    function assertLabelSize(
        string memory label
    ) internal pure returns (uint8) {
        uint256 n = bytes(label).length;
        if (n == 0) revert LabelIsEmpty();
        if (n > 255) revert LabelIsTooLong(label);
        return uint8(n);
    }

    /// @dev Prepend `label` to DNS-encoded `name`.
    ///      * `addLabel("\x03eth\x00", "test") = "\x04test\x03eth\x00"`
    ///      * `addLabel("\x00", "eth") = "\x03eth\x00"`
    ///      * `addLabel("", "abc") = "\x03abc"` invalid
    ///      * `addLabel("", "")` reverts
    ///      Assumes `name` is properly encoded.
    ///      Reverts like `assertLabelSize()`.
    ///
    /// @param name The DNS-encoded parent name.
    /// @param label The child label to prepend.
    ///
    /// @return The DNS-encoded child name.
    function addLabel(
        bytes memory name,
        string memory label
    ) internal pure returns (bytes memory) {
        return abi.encodePacked(assertLabelSize(label), label, name);
    }

    /// @dev Transform `label` to DNS-encoded `{label}.eth`.
    ///      * `ethName("eth") = "\x04test\x03eth\x00"`
    ///      Behaves like `addLabel()`.
    ///
    /// @param label The label to encode.
    ///
    /// @return The DNS-encoded name.
    function ethName(string memory label) internal pure returns (bytes memory) {
        return addLabel("\x03eth\x00", label);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// 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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

// File: @openzeppelin/contracts/utils/Create2.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Create2.sol)

pragma solidity ^0.8.20;

/**
 * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
 * `CREATE2` can be used to compute in advance the address where a smart
 * contract will be deployed, which allows for interesting new mechanisms known
 * as 'counterfactual interactions'.
 *
 * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
 * information.
 */
library Create2 {
    /**
     * @dev Not enough balance for performing a CREATE2 deploy.
     */
    error Create2InsufficientBalance(uint256 balance, uint256 needed);

    /**
     * @dev There's no code to deploy.
     */
    error Create2EmptyBytecode();

    /**
     * @dev The deployment failed.
     */
    error Create2FailedDeployment();

    /**
     * @dev Deploys a contract using `CREATE2`. The address where the contract
     * will be deployed can be known in advance via {computeAddress}.
     *
     * The bytecode for a contract can be obtained from Solidity with
     * `type(contractName).creationCode`.
     *
     * Requirements:
     *
     * - `bytecode` must not be empty.
     * - `salt` must have not been used for `bytecode` already.
     * - the factory must have a balance of at least `amount`.
     * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
     */
    function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {
        if (address(this).balance < amount) {
            revert Create2InsufficientBalance(address(this).balance, amount);
        }
        if (bytecode.length == 0) {
            revert Create2EmptyBytecode();
        }
        /// @solidity memory-safe-assembly
        assembly {
            addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
        }
        if (addr == address(0)) {
            revert Create2FailedDeployment();
        }
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
     * `bytecodeHash` or `salt` will result in a new destination address.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
        return computeAddress(salt, bytecodeHash, address(this));
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
     * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40) // Get free memory pointer

            // |                   | ↓ ptr ...  ↓ ptr + 0x0B (start) ...  ↓ ptr + 0x20 ...  ↓ ptr + 0x40 ...   |
            // |-------------------|---------------------------------------------------------------------------|
            // | bytecodeHash      |                                                        CCCCCCCCCCCCC...CC |
            // | salt              |                                      BBBBBBBBBBBBB...BB                   |
            // | deployer          | 000000...0000AAAAAAAAAAAAAAAAAAA...AA                                     |
            // | 0xFF              |            FF                                                             |
            // |-------------------|---------------------------------------------------------------------------|
            // | memory            | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |
            // | keccak(start, 85) |            ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |

            mstore(add(ptr, 0x40), bytecodeHash)
            mstore(add(ptr, 0x20), salt)
            mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes
            let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff
            mstore8(start, 0xff)
            addr := keccak256(start, 85)
        }
    }
}

// File: contracts/ENS/EnscribeV2.sol


pragma solidity ^0.8.24;




interface IENSRegistry {
    function owner(bytes32 node) external view returns (address);
    function resolver(bytes32 node) external view returns (address);
    function recordExists(bytes32 node) external view returns (bool);
    function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external;
    function setOwner(bytes32 node, address owner) external;
}

interface INameWrapper {
    function ownerOf(uint256 tokenId) external view returns (address);
    function isWrapped(bytes32 node) external view returns (bool);
    function setSubnodeRecord(bytes32 node, string calldata label, address owner, address resolver, uint64 ttl, uint32 fuses, uint64 expiry) external;
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
}

interface IReverseRegistrar {
    function setNameForAddr(address addr, address owner, address resolver, string calldata name) external;
    function node(address addr) external view returns (bytes32);
}

interface IPublicResolver {
    function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external;
    function setAddr(bytes32 node, address a) external;
    function setName(bytes32 node, string calldata newName) external;
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC1155Receiver is IERC165 {
    function onERC1155Received(address, address, uint256, uint256, bytes calldata) external returns (bytes4);
    function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) external returns (bytes4);
}

/**
 * @title Enscribe
 * @notice Deploy and name contracts with ENS in a single transaction
 * @dev Supports CREATE2 deployment, batch operations, multi-chain resolution, and both wrapped/unwrapped ENS names
 */
contract EnscribeV2 is Ownable, IERC1155Receiver {
    // ============ IMMUTABLES ============
    
    IENSRegistry public immutable ensRegistry;
    
    // ============ STATE VARIABLES ============
    
    IReverseRegistrar public reverseRegistrar;
    INameWrapper public nameWrapper;
    uint256 public pricing;
    string public defaultParent;

    // ============ EVENTS ============
    
    event ContractDeployed(address indexed contractAddress, bytes32 indexed node);
    event SubnameCreated(bytes32 indexed parentNode, bytes32 indexed node, string label);
    event SetAddrSuccess(address indexed contractAddress, string subname, uint256[] coinTypes);
    event SetPrimaryNameSuccess(address indexed deployedAddress, string subname);
    event ContractOwnershipTransferred(address indexed deployedAddress, address indexed owner);
    event SubnameOwnershipTransferred(bytes32 indexed node, address indexed newOwner);
    event EtherReceived(address indexed sender, uint256 amount);
    event PricingUpdated(uint256 newPrice);
    event DefaultParentUpdated(string newParent);

    // ============ ERRORS ============
    
    error InsufficientPayment(uint256 required, uint256 provided);
    error Unauthorized(address caller, bytes32 node);
    error ArrayLengthMismatch(uint256 addressesLength, uint256 labelsLength);
    error EmptyBytecode();
    error DeploymentFailed();
    error SubnameCreationFailed(string label);
    error ForwardResolutionFailed(bytes32 node, uint256 coinType);
    error PrimaryNameSetFailed(address addr);
    error OwnershipTransferFailed(address contractAddress);
    error WithdrawFailed();

    /**
     * @dev Constructor initializes ENS-related contracts and default settings.
     */
    constructor(
        address _ensRegistry,
        address _reverseRegistrar,
        address _nameWrapper,
        string memory _defaultParent,
        uint256 _pricing
    ) Ownable(msg.sender) {
        ensRegistry = IENSRegistry(_ensRegistry);
        reverseRegistrar = IReverseRegistrar(_reverseRegistrar);
        nameWrapper = INameWrapper(_nameWrapper);
        defaultParent = _defaultParent;
        pricing = _pricing;
    }

    // ============ ADMIN FUNCTIONS ============

    function setNameWrapper(address _addr) external onlyOwner {
        nameWrapper = INameWrapper(_addr);
    }

    function setReverseRegistrar(address _addr) external onlyOwner {
        reverseRegistrar = IReverseRegistrar(_addr);
    }

    function updatePricing(uint256 newPrice) external onlyOwner {
        pricing = newPrice;
        emit PricingUpdated(newPrice);
    }

    function updateDefaultParent(string calldata newParent) external onlyOwner {
        defaultParent = newParent;
        emit DefaultParentUpdated(newParent);
    }

    function withdraw() external onlyOwner {
        uint256 amount = address(this).balance;
        (bool success, ) = owner().call{value: amount}("");
        if (!success) revert WithdrawFailed();
    }

    // ============ UTILITY FUNCTIONS ============

    function computeAddress(bytes32 salt, bytes memory bytecode) 
        public view returns (address) {
        bytes32 saltHash = keccak256(abi.encodePacked(salt));
        return Create2.computeAddress(saltHash, keccak256(bytecode), address(this));
    }

    function computeParentNode(string calldata parentName) public pure returns (bytes32 parentNode) {
        bytes memory dnsEncoded = NameCoder.encode(parentName);
        return NameCoder.namehash(dnsEncoded, 0);
    }

    // ============ DEPLOYMENT FUNCTIONS ============

    /**
     * @notice Deploy contract with ENS name (default cointype 60)
     */
    function setNameAndDeploy(
        bytes memory bytecode,
        string calldata label,
        string calldata parentName,
        uint256 amount
    ) public payable returns (address deployedAddress) {
        uint256[] memory defaultCoinTypes = new uint256[](1);
        defaultCoinTypes[0] = 60;
        return setNameAndDeploy(bytecode, label, parentName, amount, defaultCoinTypes);
    }

    /**
     * @notice Deploy contract with ENS name (custom cointypes)
     */
    function setNameAndDeploy(
        bytes memory bytecode,
        string calldata label,
        string calldata parentName,
        uint256 amount,
        uint256[] memory coinTypes
    ) public payable returns (address deployedAddress) {
        if (msg.value < pricing) revert InsufficientPayment(pricing, msg.value);

        bytes32 parentNode = computeParentNode(parentName);
        bytes32 labelHash = keccak256(bytes(label));
        bytes32 node = NameCoder.namehash(parentNode, labelHash);
        string memory subname = string(abi.encodePacked(label, ".", parentName));
        bytes32 saltHash = keccak256(abi.encodePacked(uint256(node)));
        
        deployedAddress = Create2.deploy(amount, saltHash, bytecode);
        emit ContractDeployed(deployedAddress, node);

        if (!setName(deployedAddress, label, parentName, coinTypes)) {
            revert SubnameCreationFailed(label);
        }

        if (!_setPrimaryName(deployedAddress, subname, _getResolver(node))) {
            revert PrimaryNameSetFailed(deployedAddress);
        }
        emit SetPrimaryNameSuccess(deployedAddress, subname);

        _transferContractOwnership(deployedAddress, msg.sender);
        emit ContractOwnershipTransferred(deployedAddress, msg.sender);

        emit EtherReceived(msg.sender, msg.value);
    }

    // ============ NAMING FUNCTIONS ============

    /**
     * @notice Set ENS name to a contract (default cointype 60)
     */
    function setName(
        address contractAddress,
        string calldata label,
        string calldata parentName
    ) public payable returns (bool) {
        uint256[] memory defaultCoinTypes = new uint256[](1);
        defaultCoinTypes[0] = 60;
        return setName(contractAddress, label, parentName, defaultCoinTypes);
    }

    /**
     * @notice Set ENS name to a contract (custom cointypes)
     * @dev Main implementation - creates subname and sets forward resolution
     */
    function setName(
        address contractAddress,
        string calldata label,
        string calldata parentName,
        uint256[] memory coinTypes
    ) public payable returns (bool) {
        if (msg.value < pricing) revert InsufficientPayment(pricing, msg.value);
        
        bytes32 parentNode = computeParentNode(parentName);
        bytes32 labelHash = keccak256(bytes(label));
        bytes32 node = NameCoder.namehash(parentNode, labelHash);
        string memory subname = string(abi.encodePacked(label, ".", parentName));

        if (!_isDefaultParent(parentName) && !_isSenderOwner(parentNode)) {
            revert Unauthorized(msg.sender, parentNode);
        }
        
        if (!_createSubname(parentNode, label, labelHash, node)) {
            revert SubnameCreationFailed(label);
        }

        if (!_setAddr(node, contractAddress, coinTypes)) {
            revert ForwardResolutionFailed(node, coinTypes[0]);
        }
        emit SetAddrSuccess(contractAddress, subname, coinTypes);

        _transferSubnameOwnership(node, msg.sender);

        emit EtherReceived(msg.sender, msg.value);
        return true;
    }

    /**
     * @notice Batch naming of contracts (default cointype 60)
     */
    function setNameBatch(
        address[] calldata contractAddresses,
        string[] calldata labels,
        string calldata parentName
    ) public payable returns (bool) {
        uint256[] memory defaultCoinTypes = new uint256[](1);
        defaultCoinTypes[0] = 60;
        return setNameBatch(contractAddresses, labels, parentName, defaultCoinTypes);
    }

    /**
     * @notice Batch naming of contracts (custom cointypes)
     * @dev Simply loops and calls setName for each label
     */
    function setNameBatch(
        address[] calldata contractAddresses,
        string[] calldata labels,
        string calldata parentName,
        uint256[] memory coinTypes
    ) public payable returns (bool) {
        if (msg.value < pricing) revert InsufficientPayment(pricing, msg.value);

        if (contractAddresses.length != labels.length) {
            revert ArrayLengthMismatch(contractAddresses.length, labels.length);
        }

        for (uint256 i = 0; i < labels.length; i++) {
            setName(contractAddresses[i], labels[i], parentName, coinTypes);
        }

        return true;
    }

    // ============ SPECIALIZED DEPLOYMENT FUNCTIONS ============

    /**
     * @notice Deploy contract with reverse claimer pattern
     */
    function setNameAndDeployReverseClaimer(
        bytes memory bytecode,
        string calldata label,
        string calldata parentName,
        uint256 amount
    ) public payable returns (address deployedAddress) {
        if (msg.value < pricing) revert InsufficientPayment(pricing, msg.value);

        bytes32 parentNode = computeParentNode(parentName);
        bytes32 labelHash = keccak256(bytes(label));
        bytes32 node = NameCoder.namehash(parentNode, labelHash);
        string memory subname = string(abi.encodePacked(label, ".", parentName));
        bytes32 saltHash = keccak256(abi.encodePacked(uint256(node)));

        if (!_isDefaultParent(parentName) && !_isSenderOwner(parentNode)) {
            revert Unauthorized(msg.sender, parentNode);
        }
        
        if (!_createSubname(parentNode, label, labelHash, node)) {
            revert SubnameCreationFailed(label);
        }
        
        deployedAddress = Create2.deploy(amount, saltHash, bytecode);
        emit ContractDeployed(deployedAddress, node);

        bytes32 reverseNode = reverseRegistrar.node(deployedAddress);
        IPublicResolver(_getResolver(reverseNode)).setName(reverseNode, subname);
        emit SetPrimaryNameSuccess(deployedAddress, subname);

        uint256[] memory defaultCoinType = new uint256[](1);
        defaultCoinType[0] = 60;
        if (!_setAddr(node, deployedAddress, defaultCoinType)) {
            revert ForwardResolutionFailed(node, 60);
        }
        emit SetAddrSuccess(deployedAddress, subname, defaultCoinType);

        ensRegistry.setOwner(reverseNode, msg.sender);
        emit ContractOwnershipTransferred(deployedAddress, msg.sender);

        emit EtherReceived(msg.sender, msg.value);
    }

    /**
     * @notice Deploy contract with reverse setter pattern
     */
    function setNameAndDeployReverseSetter(
        bytes memory bytecode,
        string calldata label,
        string calldata parentName,
        uint256 amount
    ) public payable returns (address deployedAddress) {
        if (msg.value < pricing) revert InsufficientPayment(pricing, msg.value);

        bytes32 parentNode = computeParentNode(parentName);
        bytes32 labelHash = keccak256(bytes(label));
        bytes32 node = NameCoder.namehash(parentNode, labelHash);
        string memory subname = string(abi.encodePacked(label, ".", parentName));
        bytes32 saltHash = keccak256(abi.encodePacked(uint256(node)));


        if (!_isDefaultParent(parentName) && !_isSenderOwner(parentNode)) {
            revert Unauthorized(msg.sender, parentNode);
        }
        
        if (!_createSubname(parentNode, label, labelHash, node)) {
            revert SubnameCreationFailed(label);
        }
        
        deployedAddress = Create2.deploy(amount, saltHash, bytecode);
        emit ContractDeployed(deployedAddress, node);
        
        uint256[] memory defaultCoinType = new uint256[](1);
        defaultCoinType[0] = 60;
        if (!_setAddr(node, deployedAddress, defaultCoinType)) {
            revert ForwardResolutionFailed(node, 60);
        }
        emit SetAddrSuccess(deployedAddress, subname, defaultCoinType);
        
        emit EtherReceived(msg.sender, msg.value);
    }

    // ============ INTERNAL HELPER FUNCTIONS ============

    function _transferContractOwnership(address contractAddress, address newOwner) private {
        (bool success, ) = contractAddress.call(
            abi.encodeWithSignature("transferOwnership(address)", newOwner)
        );
        if (!success) revert OwnershipTransferFailed(contractAddress);
    }

    function _setPrimaryName(address addr, string memory name, address resolver) private returns (bool) {
        try reverseRegistrar.setNameForAddr(addr, address(this), resolver, name) {
            return true;
        } catch {
            return false;
        }
    }

    /**
     * @notice Create subname - checks existence before creating
     */
    function _createSubname(
        bytes32 parentNode,
        string calldata label,
        bytes32 labelHash,
        bytes32 node
    ) private returns (bool) {
        // Check if subname already exists
        if (ensRegistry.recordExists(node)) {
            return true;
        }

        address resolver = _getResolver(parentNode);
        if (_checkWrapped(parentNode)) {
            nameWrapper.setSubnodeRecord(parentNode, label, address(this), resolver, 0, 0, 0);
        } else {
            ensRegistry.setSubnodeRecord(parentNode, labelHash, address(this), resolver, 0);
        }
        
        emit SubnameCreated(parentNode, node, label);
        return true;
    }

    /**
     * @notice Set address record
     * @dev If address is 0x0 address, skips setting (useful for reserving subname)
     */
    function _setAddr(
        bytes32 node,
        address contractAddress,
        uint256[] memory coinTypes
    ) private returns (bool) {
        // If address is 0, skip forward resolution (just reserve the name)
        if (contractAddress == address(0)) {
            return true;
        }

        address resolver = _getResolver(node);
        for (uint256 i = 0; i < coinTypes.length; i++) {
            try IPublicResolver(resolver).setAddr(node, coinTypes[i], abi.encodePacked(contractAddress)) {
                // Success
            } catch {
                return false;
            }
        }
        
        return true;
    }

    function _transferSubnameOwnership(bytes32 node, address newOwner) private {
        if (_checkWrapped(node)) {
            nameWrapper.safeTransferFrom(address(this), newOwner, uint256(node), 1, "");
        } else {
            ensRegistry.setOwner(node, newOwner);
        }
        emit SubnameOwnershipTransferred(node, newOwner);
    }

    function _checkWrapped(bytes32 node) private view returns (bool) {
        try nameWrapper.isWrapped(node) returns (bool wrapped) {
            return wrapped;
        } catch {
            return false;
        }
    }

    function _isSenderOwner(bytes32 node) private view returns (bool) {
        return _checkWrapped(node)
            ? nameWrapper.ownerOf(uint256(node)) == msg.sender
            : ensRegistry.owner(node) == msg.sender;
    }

    function _isDefaultParent(string calldata parent) private view returns (bool) {
        return keccak256(bytes(parent)) == keccak256(bytes(defaultParent));
    }

    function _getResolver(bytes32 node) private view returns (address) {
        return ensRegistry.resolver(node);
    }

    // ============ ERC1155 RECEIVER ============

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external pure override returns (bytes4) {
        return IERC1155Receiver.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external pure override returns (bytes4) {
        return IERC1155Receiver.onERC1155BatchReceived.selector;
    }

    function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || 
               interfaceId == type(IERC165).interfaceId;
    }

    // ============ FALLBACK FUNCTIONS ============

    receive() external payable {
        emit EtherReceived(msg.sender, msg.value);
    }

    fallback() external payable {
        emit EtherReceived(msg.sender, msg.value);
    }
}

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_ensRegistry","type":"address"},{"internalType":"address","name":"_reverseRegistrar","type":"address"},{"internalType":"address","name":"_nameWrapper","type":"address"},{"internalType":"string","name":"_defaultParent","type":"string"},{"internalType":"uint256","name":"_pricing","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"addressesLength","type":"uint256"},{"internalType":"uint256","name":"labelsLength","type":"uint256"}],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"Create2EmptyBytecode","type":"error"},{"inputs":[],"name":"Create2FailedDeployment","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"Create2InsufficientBalance","type":"error"},{"inputs":[{"internalType":"bytes","name":"dns","type":"bytes"}],"name":"DNSDecodingFailed","type":"error"},{"inputs":[{"internalType":"string","name":"ens","type":"string"}],"name":"DNSEncodingFailed","type":"error"},{"inputs":[],"name":"DeploymentFailed","type":"error"},{"inputs":[],"name":"EmptyBytecode","type":"error"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"ForwardResolutionFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"required","type":"uint256"},{"internalType":"uint256","name":"provided","type":"uint256"}],"name":"InsufficientPayment","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"OwnershipTransferFailed","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"PrimaryNameSetFailed","type":"error"},{"inputs":[{"internalType":"string","name":"label","type":"string"}],"name":"SubnameCreationFailed","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ContractDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployedAddress","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"ContractOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newParent","type":"string"}],"name":"DefaultParentUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EtherReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PricingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"string","name":"subname","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"}],"name":"SetAddrSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployedAddress","type":"address"},{"indexed":false,"internalType":"string","name":"subname","type":"string"}],"name":"SetPrimaryNameSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"label","type":"string"}],"name":"SubnameCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"SubnameOwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes","name":"bytecode","type":"bytes"}],"name":"computeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"parentName","type":"string"}],"name":"computeParentNode","outputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultParent","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ensRegistry","outputs":[{"internalType":"contract IENSRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameWrapper","outputs":[{"internalType":"contract INameWrapper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reverseRegistrar","outputs":[{"internalType":"contract IReverseRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string","name":"parentName","type":"string"}],"name":"setName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string","name":"parentName","type":"string"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"}],"name":"setName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string","name":"parentName","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNameAndDeploy","outputs":[{"internalType":"address","name":"deployedAddress","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string","name":"parentName","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"}],"name":"setNameAndDeploy","outputs":[{"internalType":"address","name":"deployedAddress","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string","name":"parentName","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNameAndDeployReverseClaimer","outputs":[{"internalType":"address","name":"deployedAddress","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string","name":"parentName","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNameAndDeployReverseSetter","outputs":[{"internalType":"address","name":"deployedAddress","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contractAddresses","type":"address[]"},{"internalType":"string[]","name":"labels","type":"string[]"},{"internalType":"string","name":"parentName","type":"string"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"}],"name":"setNameBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contractAddresses","type":"address[]"},{"internalType":"string[]","name":"labels","type":"string[]"},{"internalType":"string","name":"parentName","type":"string"}],"name":"setNameBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setNameWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setReverseRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newParent","type":"string"}],"name":"updateDefaultParent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updatePricing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405234801562000010575f80fd5b50604051620050cf380380620050cf833981810160405281019062000036919062000473565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000aa575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a1919062000527565b60405180910390fd5b620000bb816200019460201b60201c565b508473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816004908162000181919062000770565b5080600381905550505050505062000854565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620002918262000266565b9050919050565b620002a38162000285565b8114620002ae575f80fd5b50565b5f81519050620002c18162000298565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200031782620002cf565b810181811067ffffffffffffffff82111715620003395762000338620002df565b5b80604052505050565b5f6200034d62000255565b90506200035b82826200030c565b919050565b5f67ffffffffffffffff8211156200037d576200037c620002df565b5b6200038882620002cf565b9050602081019050919050565b5f5b83811015620003b457808201518184015260208101905062000397565b5f8484015250505050565b5f620003d5620003cf8462000360565b62000342565b905082815260208101848484011115620003f457620003f3620002cb565b5b6200040184828562000395565b509392505050565b5f82601f83011262000420576200041f620002c7565b5b815162000432848260208601620003bf565b91505092915050565b5f819050919050565b6200044f816200043b565b81146200045a575f80fd5b50565b5f815190506200046d8162000444565b92915050565b5f805f805f60a086880312156200048f576200048e6200025e565b5b5f6200049e88828901620002b1565b9550506020620004b188828901620002b1565b9450506040620004c488828901620002b1565b935050606086015167ffffffffffffffff811115620004e857620004e762000262565b5b620004f68882890162000409565b925050608062000509888289016200045d565b9150509295509295909350565b620005218162000285565b82525050565b5f6020820190506200053c5f83018462000516565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200059157607f821691505b602082108103620005a757620005a66200054c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200060b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005ce565b620006178683620005ce565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000658620006526200064c846200043b565b6200062f565b6200043b565b9050919050565b5f819050919050565b620006738362000638565b6200068b62000682826200065f565b848454620005da565b825550505050565b5f90565b620006a162000693565b620006ae81848462000668565b505050565b5b81811015620006d557620006c95f8262000697565b600181019050620006b4565b5050565b601f8211156200072457620006ee81620005ad565b620006f984620005bf565b8101602085101562000709578190505b620007216200071885620005bf565b830182620006b3565b50505b505050565b5f82821c905092915050565b5f620007465f198460080262000729565b1980831691505092915050565b5f62000760838362000735565b9150826002028217905092915050565b6200077b8262000542565b67ffffffffffffffff811115620007975762000796620002df565b5b620007a3825462000579565b620007b0828285620006d9565b5f60209050601f831160018114620007e6575f8415620007d1578287015190505b620007dd858262000753565b8655506200084c565b601f198416620007f686620005ad565b5f5b828110156200081f57848901518255600182019150602085019450602081019050620007f8565b868310156200083f57848901516200083b601f89168262000735565b8355505b6001600288020188555050505b505050505050565b608051614838620008975f395f81816111c201528181611a3001528181612097015281816124b90152818161263f015281816127990152612a3001526148385ff3fe608060405260043610610184575f3560e01c80637ce91411116100d0578063a8e5fbc011610089578063ca9ffe9411610063578063ca9ffe94146105fb578063e7d4fe7514610637578063f23a6e6114610661578063f2fde38b1461069d576101d9565b8063a8e5fbc014610565578063b39a184b1461058f578063bc197c81146105bf576101d9565b80637ce91411146104655780637d73b2311461048f57806380869853146104b957806385987217146104e35780638da5cb5b1461050b5780639a591ad114610535576101d9565b806335da64d31161013d57806348cedf851161011757806348cedf85146103cf578063557499ba146103f7578063715018a61461041f57806376151d4b14610435576101d9565b806335da64d314610361578063371412f1146103915780633ccfd60b146103b9576101d9565b806301ffc9a7146102295780630afd1c15146102655780631266a58f146102a1578063192e3afb146102d15780631c7625151461030157806332581adf14610331576101d9565b366101d9573373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b346040516101cf9190612d58565b60405180910390a2005b3373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b3460405161021f9190612d58565b60405180910390a2005b348015610234575f80fd5b5061024f600480360381019061024a9190612dd7565b6106c5565b60405161025c9190612e1c565b60405180910390f35b348015610270575f80fd5b5061028b60048036038101906102869190612e96565b610796565b6040516102989190612ef9565b60405180910390f35b6102bb60048036038101906102b6919061312e565b6107f9565b6040516102c89190612e1c565b60405180910390f35b6102eb60048036038101906102e691906132be565b61091a565b6040516102f891906133bc565b60405180910390f35b61031b600480360381019061031691906133d5565b6109a5565b60405161032891906133bc565b60405180910390f35b61034b600480360381019061034691906134c4565b610c81565b6040516103589190612e1c565b60405180910390f35b61037b6004803603810190610376919061359e565b610d0c565b6040516103889190612e1c565b60405180910390f35b34801561039c575f80fd5b506103b760048036038101906103b2919061362f565b610d95565b005b3480156103c4575f80fd5b506103cd610de0565b005b3480156103da575f80fd5b506103f560048036038101906103f0919061365a565b610e96565b005b348015610402575f80fd5b5061041d6004803603810190610418919061362f565b610edf565b005b34801561042a575f80fd5b50610433610f2a565b005b61044f600480360381019061044a9190613685565b610f3d565b60405161045c9190612e1c565b60405180910390f35b348015610470575f80fd5b506104796111ba565b6040516104869190612d58565b60405180910390f35b34801561049a575f80fd5b506104a36111c0565b6040516104b0919061379f565b60405180910390f35b3480156104c4575f80fd5b506104cd6111e4565b6040516104da91906137d8565b60405180910390f35b3480156104ee575f80fd5b5061050960048036038101906105049190612e96565b611209565b005b348015610516575f80fd5b5061051f611260565b60405161052c91906133bc565b60405180910390f35b61054f600480360381019061054a91906132be565b611287565b60405161055c91906133bc565b60405180910390f35b348015610570575f80fd5b506105796115ca565b6040516105869190613811565b60405180910390f35b6105a960048036038101906105a491906132be565b6115ef565b6040516105b691906133bc565b60405180910390f35b3480156105ca575f80fd5b506105e560048036038101906105e091906138d4565b611b6f565b6040516105f291906139ba565b60405180910390f35b348015610606575f80fd5b50610621600480360381019061061c91906139fd565b611b86565b60405161062e91906133bc565b60405180910390f35b348015610642575f80fd5b5061064b611bcc565b6040516106589190613ad1565b60405180910390f35b34801561066c575f80fd5b5061068760048036038101906106829190613af1565b611c58565b60405161069491906139ba565b60405180910390f35b3480156106a8575f80fd5b506106c360048036038101906106be919061362f565b611c6d565b005b5f7f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f806107e484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611cf1565b90506107f0815f611f4f565b91505092915050565b5f60035434101561084557600354346040517fb99e2ab700000000000000000000000000000000000000000000000000000000815260040161083c929190613b87565b60405180910390fd5b8585905088889050146108975787879050868690506040517ffa5dbe0800000000000000000000000000000000000000000000000000000000815260040161088e929190613b87565b60405180910390fd5b5f5b8686905081101561090a576108fc8989838181106108ba576108b9613bae565b5b90506020020160208101906108cf919061362f565b8888848181106108e2576108e1613bae565b5b90506020028101906108f49190613be7565b888888610f3d565b508080600101915050610899565b5060019050979650505050505050565b5f80600167ffffffffffffffff81111561093757610936612fcc565b5b6040519080825280602002602001820160405280156109655781602001602082028036833780820191505090505b509050603c815f8151811061097d5761097c613bae565b5b602002602001018181525050610998888888888888876109a5565b9150509695505050505050565b5f6003543410156109f157600354346040517fb99e2ab70000000000000000000000000000000000000000000000000000000081526004016109e8929190613b87565b60405180910390fd5b5f6109fc8686610796565b90505f8888604051610a0f929190613c77565b604051809103902090505f610a248383611f87565b90505f8a8a8a8a604051602001610a3e9493929190613d07565b60405160208183030381529060405290505f825f1c604051602001610a639190613d59565b604051602081830303815290604052805190602001209050610a8688828f611f9b565b9550828673ffffffffffffffffffffffffffffffffffffffff167fb085ff794f342ed78acc7791d067e28a931e614b52476c0305795e1ff0a154bc60405160405180910390a3610ada868d8d8d8d8c610f3d565b610b1d578b8b6040517f235726fa000000000000000000000000000000000000000000000000000000008152600401610b14929190613d9f565b60405180910390fd5b610b308683610b2b86612094565b612134565b610b7157856040517f37fc7a75000000000000000000000000000000000000000000000000000000008152600401610b6891906133bc565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff167fa7087df87b8f2f603995742f0cbc82961d8bee20d65d9fe7ec01fc435aab5cd683604051610bb79190613ad1565b60405180910390a2610bc986336121d5565b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f2260a4d0c00902d7996e8f7d669d22564414d41be4d278a40387ddf58179d39260405160405180910390a33373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b34604051610c699190612d58565b60405180910390a25050505050979650505050505050565b5f80600167ffffffffffffffff811115610c9e57610c9d612fcc565b5b604051908082528060200260200182016040528015610ccc5781602001602082028036833780820191505090505b509050603c815f81518110610ce457610ce3613bae565b5b602002602001018181525050610cff888888888888876107f9565b9150509695505050505050565b5f80600167ffffffffffffffff811115610d2957610d28612fcc565b5b604051908082528060200260200182016040528015610d575781602001602082028036833780820191505090505b509050603c815f81518110610d6f57610d6e613bae565b5b602002602001018181525050610d89878787878786610f3d565b91505095945050505050565b610d9d612311565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610de8612311565b5f4790505f610df5611260565b73ffffffffffffffffffffffffffffffffffffffff1682604051610e1890613de4565b5f6040518083038185875af1925050503d805f8114610e52576040519150601f19603f3d011682016040523d82523d5f602084013e610e57565b606091505b5050905080610e92576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b610e9e612311565b806003819055507fb008cd76c510abcc3816b2078377051cc946bfc2c06c3fd13b3804c019207b8981604051610ed49190612d58565b60405180910390a150565b610ee7612311565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f32612311565b610f3b5f612398565b565b5f600354341015610f8957600354346040517fb99e2ab7000000000000000000000000000000000000000000000000000000008152600401610f80929190613b87565b60405180910390fd5b5f610f948585610796565b90505f8787604051610fa7929190613c77565b604051809103902090505f610fbc8383611f87565b90505f89898989604051602001610fd69493929190613d07565b6040516020818303038152906040529050610ff18888612459565b158015611004575061100284612492565b155b156110485733846040517f245329c600000000000000000000000000000000000000000000000000000000815260040161103f929190613df8565b60405180910390fd5b611055848b8b868661263c565b6110985789896040517f235726fa00000000000000000000000000000000000000000000000000000000815260040161108f929190613d9f565b60405180910390fd5b6110a3828c88612870565b6111005781865f815181106110bb576110ba613bae565b5b60200260200101516040517f373a19720000000000000000000000000000000000000000000000000000000081526004016110f7929190613e1f565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff167ff00d9d26b934e4f373e4b1fb6b5a1a0044720ad0207b536166f46eaa0d7c552e8288604051611148929190613efd565b60405180910390a261115a823361298b565b3373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b346040516111a09190612d58565b60405180910390a260019450505050509695505050505050565b60035481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611211612311565b81816004918261122292919061412d565b507f3ca1eb1d921674e612cf580c8baf96c805ce9175d2c79e2339e0e82279e6f3238282604051611254929190613d9f565b60405180910390a15050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6003543410156112d357600354346040517fb99e2ab70000000000000000000000000000000000000000000000000000000081526004016112ca929190613b87565b60405180910390fd5b5f6112de8585610796565b90505f87876040516112f1929190613c77565b604051809103902090505f6113068383611f87565b90505f898989896040516020016113209493929190613d07565b60405160208183030381529060405290505f825f1c6040516020016113459190613d59565b6040516020818303038152906040528051906020012090506113678989612459565b15801561137a575061137885612492565b155b156113be5733856040517f245329c60000000000000000000000000000000000000000000000000000000081526004016113b5929190613df8565b60405180910390fd5b6113cb858c8c878761263c565b61140e578a8a6040517f235726fa000000000000000000000000000000000000000000000000000000008152600401611405929190613d9f565b60405180910390fd5b61141987828e611f9b565b9550828673ffffffffffffffffffffffffffffffffffffffff167fb085ff794f342ed78acc7791d067e28a931e614b52476c0305795e1ff0a154bc60405160405180910390a35f600167ffffffffffffffff81111561147b5761147a612fcc565b5b6040519080825280602002602001820160405280156114a95781602001602082028036833780820191505090505b509050603c815f815181106114c1576114c0613bae565b5b6020026020010181815250506114d8848883612870565b61151c5783603c6040517f373a1972000000000000000000000000000000000000000000000000000000008152600401611513929190614233565b60405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff167ff00d9d26b934e4f373e4b1fb6b5a1a0044720ad0207b536166f46eaa0d7c552e8483604051611564929190613efd565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b346040516115b29190612d58565b60405180910390a25050505050509695505050505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60035434101561163b57600354346040517fb99e2ab7000000000000000000000000000000000000000000000000000000008152600401611632929190613b87565b60405180910390fd5b5f6116468585610796565b90505f8787604051611659929190613c77565b604051809103902090505f61166e8383611f87565b90505f898989896040516020016116889493929190613d07565b60405160208183030381529060405290505f825f1c6040516020016116ad9190613d59565b6040516020818303038152906040528051906020012090506116cf8989612459565b1580156116e257506116e085612492565b155b156117265733856040517f245329c600000000000000000000000000000000000000000000000000000000815260040161171d929190613df8565b60405180910390fd5b611733858c8c878761263c565b611776578a8a6040517f235726fa00000000000000000000000000000000000000000000000000000000815260040161176d929190613d9f565b60405180910390fd5b61178187828e611f9b565b9550828673ffffffffffffffffffffffffffffffffffffffff167fb085ff794f342ed78acc7791d067e28a931e614b52476c0305795e1ff0a154bc60405160405180910390a35f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bffbe61c886040518263ffffffff1660e01b815260040161182291906133bc565b602060405180830381865afa15801561183d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611861919061426e565b905061186c81612094565b73ffffffffffffffffffffffffffffffffffffffff16637737221382856040518363ffffffff1660e01b81526004016118a6929190614299565b5f604051808303815f87803b1580156118bd575f80fd5b505af11580156118cf573d5f803e3d5ffd5b505050508673ffffffffffffffffffffffffffffffffffffffff167fa7087df87b8f2f603995742f0cbc82961d8bee20d65d9fe7ec01fc435aab5cd6846040516119199190613ad1565b60405180910390a25f600167ffffffffffffffff81111561193d5761193c612fcc565b5b60405190808252806020026020018201604052801561196b5781602001602082028036833780820191505090505b509050603c815f8151811061198357611982613bae565b5b60200260200101818152505061199a858983612870565b6119de5784603c6040517f373a19720000000000000000000000000000000000000000000000000000000081526004016119d5929190614233565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff167ff00d9d26b934e4f373e4b1fb6b5a1a0044720ad0207b536166f46eaa0d7c552e8583604051611a26929190613efd565b60405180910390a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635b0fc9c383336040518363ffffffff1660e01b8152600401611a899291906142c7565b5f604051808303815f87803b158015611aa0575f80fd5b505af1158015611ab2573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f2260a4d0c00902d7996e8f7d669d22564414d41be4d278a40387ddf58179d39260405160405180910390a33373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b34604051611b569190612d58565b60405180910390a2505050505050509695505050505050565b5f63bc197c8160e01b905098975050505050505050565b5f8083604051602001611b99919061430e565b604051602081830303815290604052805190602001209050611bc381848051906020012030612aff565b91505092915050565b60048054611bd990613f69565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0590613f69565b8015611c505780601f10611c2757610100808354040283529160200191611c50565b820191905f5260205f20905b815481529060010190602001808311611c3357829003601f168201915b505050505081565b5f63f23a6e6160e01b90509695505050505050565b611c75612311565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ce5575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611cdc91906133bc565b60405180910390fd5b611cee81612398565b50565b60605f825190505f8103611d1d576040518060400160405280600181526020015f815250915050611f4a565b6002810167ffffffffffffffff811115611d3a57611d39612fcc565b5b6040519080825280601f01601f191660200182016040528015611d6c5781602001600182028036833780820191505090505b509150611d8d6001611d7d84612b29565b01611d8785612b29565b83612b35565b5f805f5b83811015611eab577f2e00000000000000000000000000000000000000000000000000000000000000868281518110611dcd57611dcc613bae565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603611ea05782810391505f821480611e12575060ff82115b15611e5457856040517f9a4c3e3b000000000000000000000000000000000000000000000000000000008152600401611e4b9190613ad1565b60405180910390fd5b8160f81b858481518110611e6b57611e6a613bae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001810192505b806001019050611d91565b5081830390505f811480611ebf575060ff81115b15611f0157846040517f9a4c3e3b000000000000000000000000000000000000000000000000000000008152600401611ef89190613ad1565b60405180910390fd5b8060f81b848381518110611f1857611f17613bae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505050505b919050565b5f611f5a8383612b83565b80935081925050505f801b8114611f8157611f7e611f788484611f4f565b82611f87565b90505b92915050565b5f825f528160205260405f20905092915050565b5f83471015611fe35747846040517fe4bbecac000000000000000000000000000000000000000000000000000000008152600401611fda929190613b87565b60405180910390fd5b5f82510361201d576040517f4ca249dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282516020840186f590505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361208d576040517f741752c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630178b8bf836040518263ffffffff1660e01b81526004016120ee9190612ef9565b602060405180830381865afa158015612109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212d919061433c565b9050919050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637a806d6b853085876040518563ffffffff1660e01b81526004016121959493929190614367565b5f604051808303815f87803b1580156121ac575f80fd5b505af19250505080156121bd575060015b6121c9575f90506121ce565b600190505b9392505050565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516024016121fe91906133bc565b6040516020818303038152906040527ff2fde38b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161228891906143eb565b5f604051808303815f865af19150503d805f81146122c1576040519150601f19603f3d011682016040523d82523d5f602084013e6122c6565b606091505b505090508061230c57826040517f31a865bb00000000000000000000000000000000000000000000000000000000815260040161230391906133bc565b60405180910390fd5b505050565b612319612bb6565b73ffffffffffffffffffffffffffffffffffffffff16612337611260565b73ffffffffffffffffffffffffffffffffffffffff16146123965761235a612bb6565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161238d91906133bc565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60046040516124699190614493565b60405180910390208383604051612481929190613c77565b604051809103902014905092915050565b5f61249c82612bbd565b61256b573373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166302571be3846040518263ffffffff1660e01b81526004016125109190612ef9565b602060405180830381865afa15801561252b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254f919061433c565b73ffffffffffffffffffffffffffffffffffffffff1614612635565b3373ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e845f1c6040518263ffffffff1660e01b81526004016125de9190612d58565b602060405180830381865afa1580156125f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261d919061433c565b73ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f79fe538836040518263ffffffff1660e01b81526004016126969190612ef9565b602060405180830381865afa1580156126b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d591906144d3565b156126e35760019050612867565b5f6126ed87612094565b90506126f887612bbd565b156127975760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324c1af4488888830865f805f6040518963ffffffff1660e01b8152600401612765989796959493929190614589565b5f604051808303815f87803b15801561277c575f80fd5b505af115801561278e573d5f803e3d5ffd5b50505050612826565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ef2c7f0888630855f6040518663ffffffff1660e01b81526004016127f89594939291906145ff565b5f604051808303815f87803b15801561280f575f80fd5b505af1158015612821573d5f803e3d5ffd5b505050505b82877f5261c837e18a35d96abb5bf749c1c5b8e6ccd8080b49a151c2130de7bc035e5d8888604051612859929190613d9f565b60405180910390a360019150505b95945050505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128ad5760019050612984565b5f6128b785612094565b90505f5b835181101561297d578173ffffffffffffffffffffffffffffffffffffffff16638b95dd71878684815181106128f4576128f3613bae565b5b60200260200101518860405160200161290d9190614695565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161293a939291906146f7565b5f604051808303815f87803b158015612951575f80fd5b505af1925050508015612962575060015b612970575f92505050612984565b80806001019150506128bb565b5060019150505b9392505050565b61299482612bbd565b15612a2e5760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a3083855f1c60016040518563ffffffff1660e01b81526004016129fc949392919061478c565b5f604051808303815f87803b158015612a13575f80fd5b505af1158015612a25573d5f803e3d5ffd5b50505050612ab7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635b0fc9c383836040518363ffffffff1660e01b8152600401612a899291906142c7565b5f604051808303815f87803b158015612aa0575f80fd5b505af1158015612ab2573d5f803e3d5ffd5b505050505b8073ffffffffffffffffffffffffffffffffffffffff16827f8636c5a4c970b04e4ea6eb3ba988ed38cab8d1fadb8ce8657f126945daacb59e60405160405180910390a35050565b5f604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b5f602082019050919050565b5b601f811115612b5a5781518352602083019250602082019150602081039050612b36565b8015612b7e576001808260200360031b1b0380198351168185511680821786525050505b505050565b5f805f612b908585612c68565b80935081925050505f8160ff161115612bae57806021858701012092505b509250929050565b5f33905090565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fd0cd0d9836040518263ffffffff1660e01b8152600401612c189190612ef9565b602060405180830381865afa925050508015612c5257506040513d601f19601f82011682018060405250810190612c4f91906144d3565b60015b612c5e575f9050612c63565b809150505b919050565b5f8083518310612caf57836040517fba4adc23000000000000000000000000000000000000000000000000000000008152600401612ca691906147e2565b60405180910390fd5b838381518110612cc257612cc1613bae565b5b602001015160f81c60f81b60f81c91508160ff16600184010190505f8260ff1611612cf1578351811415612cf7565b83518110155b15612d3957836040517fba4adc23000000000000000000000000000000000000000000000000000000008152600401612d3091906147e2565b60405180910390fd5b9250929050565b5f819050919050565b612d5281612d40565b82525050565b5f602082019050612d6b5f830184612d49565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612db681612d82565b8114612dc0575f80fd5b50565b5f81359050612dd181612dad565b92915050565b5f60208284031215612dec57612deb612d7a565b5b5f612df984828501612dc3565b91505092915050565b5f8115159050919050565b612e1681612e02565b82525050565b5f602082019050612e2f5f830184612e0d565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612e5657612e55612e35565b5b8235905067ffffffffffffffff811115612e7357612e72612e39565b5b602083019150836001820283011115612e8f57612e8e612e3d565b5b9250929050565b5f8060208385031215612eac57612eab612d7a565b5b5f83013567ffffffffffffffff811115612ec957612ec8612d7e565b5b612ed585828601612e41565b92509250509250929050565b5f819050919050565b612ef381612ee1565b82525050565b5f602082019050612f0c5f830184612eea565b92915050565b5f8083601f840112612f2757612f26612e35565b5b8235905067ffffffffffffffff811115612f4457612f43612e39565b5b602083019150836020820283011115612f6057612f5f612e3d565b5b9250929050565b5f8083601f840112612f7c57612f7b612e35565b5b8235905067ffffffffffffffff811115612f9957612f98612e39565b5b602083019150836020820283011115612fb557612fb4612e3d565b5b9250929050565b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61300282612fbc565b810181811067ffffffffffffffff8211171561302157613020612fcc565b5b80604052505050565b5f613033612d71565b905061303f8282612ff9565b919050565b5f67ffffffffffffffff82111561305e5761305d612fcc565b5b602082029050602081019050919050565b61307881612d40565b8114613082575f80fd5b50565b5f813590506130938161306f565b92915050565b5f6130ab6130a684613044565b61302a565b905080838252602082019050602084028301858111156130ce576130cd612e3d565b5b835b818110156130f757806130e38882613085565b8452602084019350506020810190506130d0565b5050509392505050565b5f82601f83011261311557613114612e35565b5b8135613125848260208601613099565b91505092915050565b5f805f805f805f6080888a03121561314957613148612d7a565b5b5f88013567ffffffffffffffff81111561316657613165612d7e565b5b6131728a828b01612f12565b9750975050602088013567ffffffffffffffff81111561319557613194612d7e565b5b6131a18a828b01612f67565b9550955050604088013567ffffffffffffffff8111156131c4576131c3612d7e565b5b6131d08a828b01612e41565b9350935050606088013567ffffffffffffffff8111156131f3576131f2612d7e565b5b6131ff8a828b01613101565b91505092959891949750929550565b5f80fd5b5f67ffffffffffffffff82111561322c5761322b612fcc565b5b61323582612fbc565b9050602081019050919050565b828183375f83830152505050565b5f61326261325d84613212565b61302a565b90508281526020810184848401111561327e5761327d61320e565b5b613289848285613242565b509392505050565b5f82601f8301126132a5576132a4612e35565b5b81356132b5848260208601613250565b91505092915050565b5f805f805f80608087890312156132d8576132d7612d7a565b5b5f87013567ffffffffffffffff8111156132f5576132f4612d7e565b5b61330189828a01613291565b965050602087013567ffffffffffffffff81111561332257613321612d7e565b5b61332e89828a01612e41565b9550955050604087013567ffffffffffffffff81111561335157613350612d7e565b5b61335d89828a01612e41565b9350935050606061337089828a01613085565b9150509295509295509295565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6133a68261337d565b9050919050565b6133b68161339c565b82525050565b5f6020820190506133cf5f8301846133ad565b92915050565b5f805f805f805f60a0888a0312156133f0576133ef612d7a565b5b5f88013567ffffffffffffffff81111561340d5761340c612d7e565b5b6134198a828b01613291565b975050602088013567ffffffffffffffff81111561343a57613439612d7e565b5b6134468a828b01612e41565b9650965050604088013567ffffffffffffffff81111561346957613468612d7e565b5b6134758a828b01612e41565b945094505060606134888a828b01613085565b925050608088013567ffffffffffffffff8111156134a9576134a8612d7e565b5b6134b58a828b01613101565b91505092959891949750929550565b5f805f805f80606087890312156134de576134dd612d7a565b5b5f87013567ffffffffffffffff8111156134fb576134fa612d7e565b5b61350789828a01612f12565b9650965050602087013567ffffffffffffffff81111561352a57613529612d7e565b5b61353689828a01612f67565b9450945050604087013567ffffffffffffffff81111561355957613558612d7e565b5b61356589828a01612e41565b92509250509295509295509295565b61357d8161339c565b8114613587575f80fd5b50565b5f8135905061359881613574565b92915050565b5f805f805f606086880312156135b7576135b6612d7a565b5b5f6135c48882890161358a565b955050602086013567ffffffffffffffff8111156135e5576135e4612d7e565b5b6135f188828901612e41565b9450945050604086013567ffffffffffffffff81111561361457613613612d7e565b5b61362088828901612e41565b92509250509295509295909350565b5f6020828403121561364457613643612d7a565b5b5f6136518482850161358a565b91505092915050565b5f6020828403121561366f5761366e612d7a565b5b5f61367c84828501613085565b91505092915050565b5f805f805f806080878903121561369f5761369e612d7a565b5b5f6136ac89828a0161358a565b965050602087013567ffffffffffffffff8111156136cd576136cc612d7e565b5b6136d989828a01612e41565b9550955050604087013567ffffffffffffffff8111156136fc576136fb612d7e565b5b61370889828a01612e41565b9350935050606087013567ffffffffffffffff81111561372b5761372a612d7e565b5b61373789828a01613101565b9150509295509295509295565b5f819050919050565b5f61376761376261375d8461337d565b613744565b61337d565b9050919050565b5f6137788261374d565b9050919050565b5f6137898261376e565b9050919050565b6137998161377f565b82525050565b5f6020820190506137b25f830184613790565b92915050565b5f6137c28261376e565b9050919050565b6137d2816137b8565b82525050565b5f6020820190506137eb5f8301846137c9565b92915050565b5f6137fb8261376e565b9050919050565b61380b816137f1565b82525050565b5f6020820190506138245f830184613802565b92915050565b5f8083601f84011261383f5761383e612e35565b5b8235905067ffffffffffffffff81111561385c5761385b612e39565b5b60208301915083602082028301111561387857613877612e3d565b5b9250929050565b5f8083601f84011261389457613893612e35565b5b8235905067ffffffffffffffff8111156138b1576138b0612e39565b5b6020830191508360018202830111156138cd576138cc612e3d565b5b9250929050565b5f805f805f805f8060a0898b0312156138f0576138ef612d7a565b5b5f6138fd8b828c0161358a565b985050602061390e8b828c0161358a565b975050604089013567ffffffffffffffff81111561392f5761392e612d7e565b5b61393b8b828c0161382a565b9650965050606089013567ffffffffffffffff81111561395e5761395d612d7e565b5b61396a8b828c0161382a565b9450945050608089013567ffffffffffffffff81111561398d5761398c612d7e565b5b6139998b828c0161387f565b92509250509295985092959890939650565b6139b481612d82565b82525050565b5f6020820190506139cd5f8301846139ab565b92915050565b6139dc81612ee1565b81146139e6575f80fd5b50565b5f813590506139f7816139d3565b92915050565b5f8060408385031215613a1357613a12612d7a565b5b5f613a20858286016139e9565b925050602083013567ffffffffffffffff811115613a4157613a40612d7e565b5b613a4d85828601613291565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613a8e578082015181840152602081019050613a73565b5f8484015250505050565b5f613aa382613a57565b613aad8185613a61565b9350613abd818560208601613a71565b613ac681612fbc565b840191505092915050565b5f6020820190508181035f830152613ae98184613a99565b905092915050565b5f805f805f8060a08789031215613b0b57613b0a612d7a565b5b5f613b1889828a0161358a565b9650506020613b2989828a0161358a565b9550506040613b3a89828a01613085565b9450506060613b4b89828a01613085565b935050608087013567ffffffffffffffff811115613b6c57613b6b612d7e565b5b613b7889828a0161387f565b92509250509295509295509295565b5f604082019050613b9a5f830185612d49565b613ba76020830184612d49565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112613c0357613c02613bdb565b5b80840192508235915067ffffffffffffffff821115613c2557613c24613bdf565b5b602083019250600182023603831315613c4157613c40613be3565b5b509250929050565b5f81905092915050565b5f613c5e8385613c49565b9350613c6b838584613242565b82840190509392505050565b5f613c83828486613c53565b91508190509392505050565b5f81905092915050565b5f613ca48385613c8f565b9350613cb1838584613242565b82840190509392505050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f613cf1600183613c8f565b9150613cfc82613cbd565b600182019050919050565b5f613d13828688613c99565b9150613d1e82613ce5565b9150613d2b828486613c99565b915081905095945050505050565b5f819050919050565b613d53613d4e82612d40565b613d39565b82525050565b5f613d648284613d42565b60208201915081905092915050565b5f613d7e8385613a61565b9350613d8b838584613242565b613d9483612fbc565b840190509392505050565b5f6020820190508181035f830152613db8818486613d73565b90509392505050565b50565b5f613dcf5f83613c49565b9150613dda82613dc1565b5f82019050919050565b5f613dee82613dc4565b9150819050919050565b5f604082019050613e0b5f8301856133ad565b613e186020830184612eea565b9392505050565b5f604082019050613e325f830185612eea565b613e3f6020830184612d49565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613e7881612d40565b82525050565b5f613e898383613e6f565b60208301905092915050565b5f602082019050919050565b5f613eab82613e46565b613eb58185613e50565b9350613ec083613e60565b805f5b83811015613ef0578151613ed78882613e7e565b9750613ee283613e95565b925050600181019050613ec3565b5085935050505092915050565b5f6040820190508181035f830152613f158185613a99565b90508181036020830152613f298184613ea1565b90509392505050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613f8057607f821691505b602082108103613f9357613f92613f3c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613ff57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613fba565b613fff8683613fba565b95508019841693508086168417925050509392505050565b5f61403161402c61402784612d40565b613744565b612d40565b9050919050565b5f819050919050565b61404a83614017565b61405e61405682614038565b848454613fc6565b825550505050565b5f90565b614072614066565b61407d818484614041565b505050565b5b818110156140a0576140955f8261406a565b600181019050614083565b5050565b601f8211156140e5576140b681613f99565b6140bf84613fab565b810160208510156140ce578190505b6140e26140da85613fab565b830182614082565b50505b505050565b5f82821c905092915050565b5f6141055f19846008026140ea565b1980831691505092915050565b5f61411d83836140f6565b9150826002028217905092915050565b6141378383613f32565b67ffffffffffffffff8111156141505761414f612fcc565b5b61415a8254613f69565b6141658282856140a4565b5f601f831160018114614192575f8415614180578287013590505b61418a8582614112565b8655506141f1565b601f1984166141a086613f99565b5f5b828110156141c7578489013582556001820191506020850194506020810190506141a2565b868310156141e457848901356141e0601f8916826140f6565b8355505b6001600288020188555050505b50505050505050565b5f819050919050565b5f61421d614218614213846141fa565b613744565b612d40565b9050919050565b61422d81614203565b82525050565b5f6040820190506142465f830185612eea565b6142536020830184614224565b9392505050565b5f81519050614268816139d3565b92915050565b5f6020828403121561428357614282612d7a565b5b5f6142908482850161425a565b91505092915050565b5f6040820190506142ac5f830185612eea565b81810360208301526142be8184613a99565b90509392505050565b5f6040820190506142da5f830185612eea565b6142e760208301846133ad565b9392505050565b5f819050919050565b61430861430382612ee1565b6142ee565b82525050565b5f61431982846142f7565b60208201915081905092915050565b5f8151905061433681613574565b92915050565b5f6020828403121561435157614350612d7a565b5b5f61435e84828501614328565b91505092915050565b5f60808201905061437a5f8301876133ad565b61438760208301866133ad565b61439460408301856133ad565b81810360608301526143a68184613a99565b905095945050505050565b5f81519050919050565b5f6143c5826143b1565b6143cf8185613c49565b93506143df818560208601613a71565b80840191505092915050565b5f6143f682846143bb565b915081905092915050565b5f819050815f5260205f209050919050565b5f815461441f81613f69565b6144298186613c49565b9450600182165f811461444357600181146144585761448a565b60ff198316865281151582028601935061448a565b61446185614401565b5f5b8381101561448257815481890152600182019150602081019050614463565b838801955050505b50505092915050565b5f61449e8284614413565b915081905092915050565b6144b281612e02565b81146144bc575f80fd5b50565b5f815190506144cd816144a9565b92915050565b5f602082840312156144e8576144e7612d7a565b5b5f6144f5848285016144bf565b91505092915050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f61453461452f61452a846144fe565b613744565b614507565b9050919050565b6145448161451a565b82525050565b5f63ffffffff82169050919050565b5f61457361456e614569846144fe565b613744565b61454a565b9050919050565b61458381614559565b82525050565b5f60e08201905061459c5f83018b612eea565b81810360208301526145af81898b613d73565b90506145be60408301886133ad565b6145cb60608301876133ad565b6145d8608083018661453b565b6145e560a083018561457a565b6145f260c083018461453b565b9998505050505050505050565b5f60a0820190506146125f830188612eea565b61461f6020830187612eea565b61462c60408301866133ad565b61463960608301856133ad565b614646608083018461453b565b9695505050505050565b5f8160601b9050919050565b5f61466682614650565b9050919050565b5f6146778261465c565b9050919050565b61468f61468a8261339c565b61466d565b82525050565b5f6146a0828461467e565b60148201915081905092915050565b5f82825260208201905092915050565b5f6146c9826143b1565b6146d381856146af565b93506146e3818560208601613a71565b6146ec81612fbc565b840191505092915050565b5f60608201905061470a5f830186612eea565b6147176020830185612d49565b818103604083015261472981846146bf565b9050949350505050565b5f819050919050565b5f61475661475161474c84614733565b613744565b612d40565b9050919050565b6147668161473c565b82525050565b5f6147775f836146af565b915061478282613dc1565b5f82019050919050565b5f60a08201905061479f5f8301876133ad565b6147ac60208301866133ad565b6147b96040830185612d49565b6147c6606083018461475d565b81810360808301526147d78161476c565b905095945050505050565b5f6020820190508181035f8301526147fa81846146bf565b90509291505056fea26469706673582212209e30165d1e51815c19ee7df8200294f18043caa9d9640333e0952c2b7c317a5d64736f6c6343000818003300000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e000000000000000000000000a0a1abcdae1a2a4a2ef8e9113ff0e02dd81dc0c60000000000000000000000000635513f179d50a207757e05759cbd106d7dfce800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b656e73746573742e657468000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405260043610610184575f3560e01c80637ce91411116100d0578063a8e5fbc011610089578063ca9ffe9411610063578063ca9ffe94146105fb578063e7d4fe7514610637578063f23a6e6114610661578063f2fde38b1461069d576101d9565b8063a8e5fbc014610565578063b39a184b1461058f578063bc197c81146105bf576101d9565b80637ce91411146104655780637d73b2311461048f57806380869853146104b957806385987217146104e35780638da5cb5b1461050b5780639a591ad114610535576101d9565b806335da64d31161013d57806348cedf851161011757806348cedf85146103cf578063557499ba146103f7578063715018a61461041f57806376151d4b14610435576101d9565b806335da64d314610361578063371412f1146103915780633ccfd60b146103b9576101d9565b806301ffc9a7146102295780630afd1c15146102655780631266a58f146102a1578063192e3afb146102d15780631c7625151461030157806332581adf14610331576101d9565b366101d9573373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b346040516101cf9190612d58565b60405180910390a2005b3373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b3460405161021f9190612d58565b60405180910390a2005b348015610234575f80fd5b5061024f600480360381019061024a9190612dd7565b6106c5565b60405161025c9190612e1c565b60405180910390f35b348015610270575f80fd5b5061028b60048036038101906102869190612e96565b610796565b6040516102989190612ef9565b60405180910390f35b6102bb60048036038101906102b6919061312e565b6107f9565b6040516102c89190612e1c565b60405180910390f35b6102eb60048036038101906102e691906132be565b61091a565b6040516102f891906133bc565b60405180910390f35b61031b600480360381019061031691906133d5565b6109a5565b60405161032891906133bc565b60405180910390f35b61034b600480360381019061034691906134c4565b610c81565b6040516103589190612e1c565b60405180910390f35b61037b6004803603810190610376919061359e565b610d0c565b6040516103889190612e1c565b60405180910390f35b34801561039c575f80fd5b506103b760048036038101906103b2919061362f565b610d95565b005b3480156103c4575f80fd5b506103cd610de0565b005b3480156103da575f80fd5b506103f560048036038101906103f0919061365a565b610e96565b005b348015610402575f80fd5b5061041d6004803603810190610418919061362f565b610edf565b005b34801561042a575f80fd5b50610433610f2a565b005b61044f600480360381019061044a9190613685565b610f3d565b60405161045c9190612e1c565b60405180910390f35b348015610470575f80fd5b506104796111ba565b6040516104869190612d58565b60405180910390f35b34801561049a575f80fd5b506104a36111c0565b6040516104b0919061379f565b60405180910390f35b3480156104c4575f80fd5b506104cd6111e4565b6040516104da91906137d8565b60405180910390f35b3480156104ee575f80fd5b5061050960048036038101906105049190612e96565b611209565b005b348015610516575f80fd5b5061051f611260565b60405161052c91906133bc565b60405180910390f35b61054f600480360381019061054a91906132be565b611287565b60405161055c91906133bc565b60405180910390f35b348015610570575f80fd5b506105796115ca565b6040516105869190613811565b60405180910390f35b6105a960048036038101906105a491906132be565b6115ef565b6040516105b691906133bc565b60405180910390f35b3480156105ca575f80fd5b506105e560048036038101906105e091906138d4565b611b6f565b6040516105f291906139ba565b60405180910390f35b348015610606575f80fd5b50610621600480360381019061061c91906139fd565b611b86565b60405161062e91906133bc565b60405180910390f35b348015610642575f80fd5b5061064b611bcc565b6040516106589190613ad1565b60405180910390f35b34801561066c575f80fd5b5061068760048036038101906106829190613af1565b611c58565b60405161069491906139ba565b60405180910390f35b3480156106a8575f80fd5b506106c360048036038101906106be919061362f565b611c6d565b005b5f7f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f806107e484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611cf1565b90506107f0815f611f4f565b91505092915050565b5f60035434101561084557600354346040517fb99e2ab700000000000000000000000000000000000000000000000000000000815260040161083c929190613b87565b60405180910390fd5b8585905088889050146108975787879050868690506040517ffa5dbe0800000000000000000000000000000000000000000000000000000000815260040161088e929190613b87565b60405180910390fd5b5f5b8686905081101561090a576108fc8989838181106108ba576108b9613bae565b5b90506020020160208101906108cf919061362f565b8888848181106108e2576108e1613bae565b5b90506020028101906108f49190613be7565b888888610f3d565b508080600101915050610899565b5060019050979650505050505050565b5f80600167ffffffffffffffff81111561093757610936612fcc565b5b6040519080825280602002602001820160405280156109655781602001602082028036833780820191505090505b509050603c815f8151811061097d5761097c613bae565b5b602002602001018181525050610998888888888888876109a5565b9150509695505050505050565b5f6003543410156109f157600354346040517fb99e2ab70000000000000000000000000000000000000000000000000000000081526004016109e8929190613b87565b60405180910390fd5b5f6109fc8686610796565b90505f8888604051610a0f929190613c77565b604051809103902090505f610a248383611f87565b90505f8a8a8a8a604051602001610a3e9493929190613d07565b60405160208183030381529060405290505f825f1c604051602001610a639190613d59565b604051602081830303815290604052805190602001209050610a8688828f611f9b565b9550828673ffffffffffffffffffffffffffffffffffffffff167fb085ff794f342ed78acc7791d067e28a931e614b52476c0305795e1ff0a154bc60405160405180910390a3610ada868d8d8d8d8c610f3d565b610b1d578b8b6040517f235726fa000000000000000000000000000000000000000000000000000000008152600401610b14929190613d9f565b60405180910390fd5b610b308683610b2b86612094565b612134565b610b7157856040517f37fc7a75000000000000000000000000000000000000000000000000000000008152600401610b6891906133bc565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff167fa7087df87b8f2f603995742f0cbc82961d8bee20d65d9fe7ec01fc435aab5cd683604051610bb79190613ad1565b60405180910390a2610bc986336121d5565b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f2260a4d0c00902d7996e8f7d669d22564414d41be4d278a40387ddf58179d39260405160405180910390a33373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b34604051610c699190612d58565b60405180910390a25050505050979650505050505050565b5f80600167ffffffffffffffff811115610c9e57610c9d612fcc565b5b604051908082528060200260200182016040528015610ccc5781602001602082028036833780820191505090505b509050603c815f81518110610ce457610ce3613bae565b5b602002602001018181525050610cff888888888888876107f9565b9150509695505050505050565b5f80600167ffffffffffffffff811115610d2957610d28612fcc565b5b604051908082528060200260200182016040528015610d575781602001602082028036833780820191505090505b509050603c815f81518110610d6f57610d6e613bae565b5b602002602001018181525050610d89878787878786610f3d565b91505095945050505050565b610d9d612311565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610de8612311565b5f4790505f610df5611260565b73ffffffffffffffffffffffffffffffffffffffff1682604051610e1890613de4565b5f6040518083038185875af1925050503d805f8114610e52576040519150601f19603f3d011682016040523d82523d5f602084013e610e57565b606091505b5050905080610e92576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b610e9e612311565b806003819055507fb008cd76c510abcc3816b2078377051cc946bfc2c06c3fd13b3804c019207b8981604051610ed49190612d58565b60405180910390a150565b610ee7612311565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f32612311565b610f3b5f612398565b565b5f600354341015610f8957600354346040517fb99e2ab7000000000000000000000000000000000000000000000000000000008152600401610f80929190613b87565b60405180910390fd5b5f610f948585610796565b90505f8787604051610fa7929190613c77565b604051809103902090505f610fbc8383611f87565b90505f89898989604051602001610fd69493929190613d07565b6040516020818303038152906040529050610ff18888612459565b158015611004575061100284612492565b155b156110485733846040517f245329c600000000000000000000000000000000000000000000000000000000815260040161103f929190613df8565b60405180910390fd5b611055848b8b868661263c565b6110985789896040517f235726fa00000000000000000000000000000000000000000000000000000000815260040161108f929190613d9f565b60405180910390fd5b6110a3828c88612870565b6111005781865f815181106110bb576110ba613bae565b5b60200260200101516040517f373a19720000000000000000000000000000000000000000000000000000000081526004016110f7929190613e1f565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff167ff00d9d26b934e4f373e4b1fb6b5a1a0044720ad0207b536166f46eaa0d7c552e8288604051611148929190613efd565b60405180910390a261115a823361298b565b3373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b346040516111a09190612d58565b60405180910390a260019450505050509695505050505050565b60035481565b7f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e81565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611211612311565b81816004918261122292919061412d565b507f3ca1eb1d921674e612cf580c8baf96c805ce9175d2c79e2339e0e82279e6f3238282604051611254929190613d9f565b60405180910390a15050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6003543410156112d357600354346040517fb99e2ab70000000000000000000000000000000000000000000000000000000081526004016112ca929190613b87565b60405180910390fd5b5f6112de8585610796565b90505f87876040516112f1929190613c77565b604051809103902090505f6113068383611f87565b90505f898989896040516020016113209493929190613d07565b60405160208183030381529060405290505f825f1c6040516020016113459190613d59565b6040516020818303038152906040528051906020012090506113678989612459565b15801561137a575061137885612492565b155b156113be5733856040517f245329c60000000000000000000000000000000000000000000000000000000081526004016113b5929190613df8565b60405180910390fd5b6113cb858c8c878761263c565b61140e578a8a6040517f235726fa000000000000000000000000000000000000000000000000000000008152600401611405929190613d9f565b60405180910390fd5b61141987828e611f9b565b9550828673ffffffffffffffffffffffffffffffffffffffff167fb085ff794f342ed78acc7791d067e28a931e614b52476c0305795e1ff0a154bc60405160405180910390a35f600167ffffffffffffffff81111561147b5761147a612fcc565b5b6040519080825280602002602001820160405280156114a95781602001602082028036833780820191505090505b509050603c815f815181106114c1576114c0613bae565b5b6020026020010181815250506114d8848883612870565b61151c5783603c6040517f373a1972000000000000000000000000000000000000000000000000000000008152600401611513929190614233565b60405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff167ff00d9d26b934e4f373e4b1fb6b5a1a0044720ad0207b536166f46eaa0d7c552e8483604051611564929190613efd565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b346040516115b29190612d58565b60405180910390a25050505050509695505050505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60035434101561163b57600354346040517fb99e2ab7000000000000000000000000000000000000000000000000000000008152600401611632929190613b87565b60405180910390fd5b5f6116468585610796565b90505f8787604051611659929190613c77565b604051809103902090505f61166e8383611f87565b90505f898989896040516020016116889493929190613d07565b60405160208183030381529060405290505f825f1c6040516020016116ad9190613d59565b6040516020818303038152906040528051906020012090506116cf8989612459565b1580156116e257506116e085612492565b155b156117265733856040517f245329c600000000000000000000000000000000000000000000000000000000815260040161171d929190613df8565b60405180910390fd5b611733858c8c878761263c565b611776578a8a6040517f235726fa00000000000000000000000000000000000000000000000000000000815260040161176d929190613d9f565b60405180910390fd5b61178187828e611f9b565b9550828673ffffffffffffffffffffffffffffffffffffffff167fb085ff794f342ed78acc7791d067e28a931e614b52476c0305795e1ff0a154bc60405160405180910390a35f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bffbe61c886040518263ffffffff1660e01b815260040161182291906133bc565b602060405180830381865afa15801561183d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611861919061426e565b905061186c81612094565b73ffffffffffffffffffffffffffffffffffffffff16637737221382856040518363ffffffff1660e01b81526004016118a6929190614299565b5f604051808303815f87803b1580156118bd575f80fd5b505af11580156118cf573d5f803e3d5ffd5b505050508673ffffffffffffffffffffffffffffffffffffffff167fa7087df87b8f2f603995742f0cbc82961d8bee20d65d9fe7ec01fc435aab5cd6846040516119199190613ad1565b60405180910390a25f600167ffffffffffffffff81111561193d5761193c612fcc565b5b60405190808252806020026020018201604052801561196b5781602001602082028036833780820191505090505b509050603c815f8151811061198357611982613bae565b5b60200260200101818152505061199a858983612870565b6119de5784603c6040517f373a19720000000000000000000000000000000000000000000000000000000081526004016119d5929190614233565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff167ff00d9d26b934e4f373e4b1fb6b5a1a0044720ad0207b536166f46eaa0d7c552e8583604051611a26929190613efd565b60405180910390a27f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e73ffffffffffffffffffffffffffffffffffffffff16635b0fc9c383336040518363ffffffff1660e01b8152600401611a899291906142c7565b5f604051808303815f87803b158015611aa0575f80fd5b505af1158015611ab2573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f2260a4d0c00902d7996e8f7d669d22564414d41be4d278a40387ddf58179d39260405160405180910390a33373ffffffffffffffffffffffffffffffffffffffff167f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b34604051611b569190612d58565b60405180910390a2505050505050509695505050505050565b5f63bc197c8160e01b905098975050505050505050565b5f8083604051602001611b99919061430e565b604051602081830303815290604052805190602001209050611bc381848051906020012030612aff565b91505092915050565b60048054611bd990613f69565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0590613f69565b8015611c505780601f10611c2757610100808354040283529160200191611c50565b820191905f5260205f20905b815481529060010190602001808311611c3357829003601f168201915b505050505081565b5f63f23a6e6160e01b90509695505050505050565b611c75612311565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ce5575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611cdc91906133bc565b60405180910390fd5b611cee81612398565b50565b60605f825190505f8103611d1d576040518060400160405280600181526020015f815250915050611f4a565b6002810167ffffffffffffffff811115611d3a57611d39612fcc565b5b6040519080825280601f01601f191660200182016040528015611d6c5781602001600182028036833780820191505090505b509150611d8d6001611d7d84612b29565b01611d8785612b29565b83612b35565b5f805f5b83811015611eab577f2e00000000000000000000000000000000000000000000000000000000000000868281518110611dcd57611dcc613bae565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603611ea05782810391505f821480611e12575060ff82115b15611e5457856040517f9a4c3e3b000000000000000000000000000000000000000000000000000000008152600401611e4b9190613ad1565b60405180910390fd5b8160f81b858481518110611e6b57611e6a613bae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001810192505b806001019050611d91565b5081830390505f811480611ebf575060ff81115b15611f0157846040517f9a4c3e3b000000000000000000000000000000000000000000000000000000008152600401611ef89190613ad1565b60405180910390fd5b8060f81b848381518110611f1857611f17613bae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505050505b919050565b5f611f5a8383612b83565b80935081925050505f801b8114611f8157611f7e611f788484611f4f565b82611f87565b90505b92915050565b5f825f528160205260405f20905092915050565b5f83471015611fe35747846040517fe4bbecac000000000000000000000000000000000000000000000000000000008152600401611fda929190613b87565b60405180910390fd5b5f82510361201d576040517f4ca249dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282516020840186f590505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361208d576040517f741752c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b5f7f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e73ffffffffffffffffffffffffffffffffffffffff16630178b8bf836040518263ffffffff1660e01b81526004016120ee9190612ef9565b602060405180830381865afa158015612109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212d919061433c565b9050919050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637a806d6b853085876040518563ffffffff1660e01b81526004016121959493929190614367565b5f604051808303815f87803b1580156121ac575f80fd5b505af19250505080156121bd575060015b6121c9575f90506121ce565b600190505b9392505050565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516024016121fe91906133bc565b6040516020818303038152906040527ff2fde38b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161228891906143eb565b5f604051808303815f865af19150503d805f81146122c1576040519150601f19603f3d011682016040523d82523d5f602084013e6122c6565b606091505b505090508061230c57826040517f31a865bb00000000000000000000000000000000000000000000000000000000815260040161230391906133bc565b60405180910390fd5b505050565b612319612bb6565b73ffffffffffffffffffffffffffffffffffffffff16612337611260565b73ffffffffffffffffffffffffffffffffffffffff16146123965761235a612bb6565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161238d91906133bc565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60046040516124699190614493565b60405180910390208383604051612481929190613c77565b604051809103902014905092915050565b5f61249c82612bbd565b61256b573373ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e73ffffffffffffffffffffffffffffffffffffffff166302571be3846040518263ffffffff1660e01b81526004016125109190612ef9565b602060405180830381865afa15801561252b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254f919061433c565b73ffffffffffffffffffffffffffffffffffffffff1614612635565b3373ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e845f1c6040518263ffffffff1660e01b81526004016125de9190612d58565b602060405180830381865afa1580156125f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261d919061433c565b73ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b5f7f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e73ffffffffffffffffffffffffffffffffffffffff1663f79fe538836040518263ffffffff1660e01b81526004016126969190612ef9565b602060405180830381865afa1580156126b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d591906144d3565b156126e35760019050612867565b5f6126ed87612094565b90506126f887612bbd565b156127975760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166324c1af4488888830865f805f6040518963ffffffff1660e01b8152600401612765989796959493929190614589565b5f604051808303815f87803b15801561277c575f80fd5b505af115801561278e573d5f803e3d5ffd5b50505050612826565b7f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e73ffffffffffffffffffffffffffffffffffffffff16635ef2c7f0888630855f6040518663ffffffff1660e01b81526004016127f89594939291906145ff565b5f604051808303815f87803b15801561280f575f80fd5b505af1158015612821573d5f803e3d5ffd5b505050505b82877f5261c837e18a35d96abb5bf749c1c5b8e6ccd8080b49a151c2130de7bc035e5d8888604051612859929190613d9f565b60405180910390a360019150505b95945050505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128ad5760019050612984565b5f6128b785612094565b90505f5b835181101561297d578173ffffffffffffffffffffffffffffffffffffffff16638b95dd71878684815181106128f4576128f3613bae565b5b60200260200101518860405160200161290d9190614695565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161293a939291906146f7565b5f604051808303815f87803b158015612951575f80fd5b505af1925050508015612962575060015b612970575f92505050612984565b80806001019150506128bb565b5060019150505b9392505050565b61299482612bbd565b15612a2e5760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a3083855f1c60016040518563ffffffff1660e01b81526004016129fc949392919061478c565b5f604051808303815f87803b158015612a13575f80fd5b505af1158015612a25573d5f803e3d5ffd5b50505050612ab7565b7f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e73ffffffffffffffffffffffffffffffffffffffff16635b0fc9c383836040518363ffffffff1660e01b8152600401612a899291906142c7565b5f604051808303815f87803b158015612aa0575f80fd5b505af1158015612ab2573d5f803e3d5ffd5b505050505b8073ffffffffffffffffffffffffffffffffffffffff16827f8636c5a4c970b04e4ea6eb3ba988ed38cab8d1fadb8ce8657f126945daacb59e60405160405180910390a35050565b5f604051836040820152846020820152828152600b810160ff815360558120925050509392505050565b5f602082019050919050565b5b601f811115612b5a5781518352602083019250602082019150602081039050612b36565b8015612b7e576001808260200360031b1b0380198351168185511680821786525050505b505050565b5f805f612b908585612c68565b80935081925050505f8160ff161115612bae57806021858701012092505b509250929050565b5f33905090565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fd0cd0d9836040518263ffffffff1660e01b8152600401612c189190612ef9565b602060405180830381865afa925050508015612c5257506040513d601f19601f82011682018060405250810190612c4f91906144d3565b60015b612c5e575f9050612c63565b809150505b919050565b5f8083518310612caf57836040517fba4adc23000000000000000000000000000000000000000000000000000000008152600401612ca691906147e2565b60405180910390fd5b838381518110612cc257612cc1613bae565b5b602001015160f81c60f81b60f81c91508160ff16600184010190505f8260ff1611612cf1578351811415612cf7565b83518110155b15612d3957836040517fba4adc23000000000000000000000000000000000000000000000000000000008152600401612d3091906147e2565b60405180910390fd5b9250929050565b5f819050919050565b612d5281612d40565b82525050565b5f602082019050612d6b5f830184612d49565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612db681612d82565b8114612dc0575f80fd5b50565b5f81359050612dd181612dad565b92915050565b5f60208284031215612dec57612deb612d7a565b5b5f612df984828501612dc3565b91505092915050565b5f8115159050919050565b612e1681612e02565b82525050565b5f602082019050612e2f5f830184612e0d565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112612e5657612e55612e35565b5b8235905067ffffffffffffffff811115612e7357612e72612e39565b5b602083019150836001820283011115612e8f57612e8e612e3d565b5b9250929050565b5f8060208385031215612eac57612eab612d7a565b5b5f83013567ffffffffffffffff811115612ec957612ec8612d7e565b5b612ed585828601612e41565b92509250509250929050565b5f819050919050565b612ef381612ee1565b82525050565b5f602082019050612f0c5f830184612eea565b92915050565b5f8083601f840112612f2757612f26612e35565b5b8235905067ffffffffffffffff811115612f4457612f43612e39565b5b602083019150836020820283011115612f6057612f5f612e3d565b5b9250929050565b5f8083601f840112612f7c57612f7b612e35565b5b8235905067ffffffffffffffff811115612f9957612f98612e39565b5b602083019150836020820283011115612fb557612fb4612e3d565b5b9250929050565b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61300282612fbc565b810181811067ffffffffffffffff8211171561302157613020612fcc565b5b80604052505050565b5f613033612d71565b905061303f8282612ff9565b919050565b5f67ffffffffffffffff82111561305e5761305d612fcc565b5b602082029050602081019050919050565b61307881612d40565b8114613082575f80fd5b50565b5f813590506130938161306f565b92915050565b5f6130ab6130a684613044565b61302a565b905080838252602082019050602084028301858111156130ce576130cd612e3d565b5b835b818110156130f757806130e38882613085565b8452602084019350506020810190506130d0565b5050509392505050565b5f82601f83011261311557613114612e35565b5b8135613125848260208601613099565b91505092915050565b5f805f805f805f6080888a03121561314957613148612d7a565b5b5f88013567ffffffffffffffff81111561316657613165612d7e565b5b6131728a828b01612f12565b9750975050602088013567ffffffffffffffff81111561319557613194612d7e565b5b6131a18a828b01612f67565b9550955050604088013567ffffffffffffffff8111156131c4576131c3612d7e565b5b6131d08a828b01612e41565b9350935050606088013567ffffffffffffffff8111156131f3576131f2612d7e565b5b6131ff8a828b01613101565b91505092959891949750929550565b5f80fd5b5f67ffffffffffffffff82111561322c5761322b612fcc565b5b61323582612fbc565b9050602081019050919050565b828183375f83830152505050565b5f61326261325d84613212565b61302a565b90508281526020810184848401111561327e5761327d61320e565b5b613289848285613242565b509392505050565b5f82601f8301126132a5576132a4612e35565b5b81356132b5848260208601613250565b91505092915050565b5f805f805f80608087890312156132d8576132d7612d7a565b5b5f87013567ffffffffffffffff8111156132f5576132f4612d7e565b5b61330189828a01613291565b965050602087013567ffffffffffffffff81111561332257613321612d7e565b5b61332e89828a01612e41565b9550955050604087013567ffffffffffffffff81111561335157613350612d7e565b5b61335d89828a01612e41565b9350935050606061337089828a01613085565b9150509295509295509295565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6133a68261337d565b9050919050565b6133b68161339c565b82525050565b5f6020820190506133cf5f8301846133ad565b92915050565b5f805f805f805f60a0888a0312156133f0576133ef612d7a565b5b5f88013567ffffffffffffffff81111561340d5761340c612d7e565b5b6134198a828b01613291565b975050602088013567ffffffffffffffff81111561343a57613439612d7e565b5b6134468a828b01612e41565b9650965050604088013567ffffffffffffffff81111561346957613468612d7e565b5b6134758a828b01612e41565b945094505060606134888a828b01613085565b925050608088013567ffffffffffffffff8111156134a9576134a8612d7e565b5b6134b58a828b01613101565b91505092959891949750929550565b5f805f805f80606087890312156134de576134dd612d7a565b5b5f87013567ffffffffffffffff8111156134fb576134fa612d7e565b5b61350789828a01612f12565b9650965050602087013567ffffffffffffffff81111561352a57613529612d7e565b5b61353689828a01612f67565b9450945050604087013567ffffffffffffffff81111561355957613558612d7e565b5b61356589828a01612e41565b92509250509295509295509295565b61357d8161339c565b8114613587575f80fd5b50565b5f8135905061359881613574565b92915050565b5f805f805f606086880312156135b7576135b6612d7a565b5b5f6135c48882890161358a565b955050602086013567ffffffffffffffff8111156135e5576135e4612d7e565b5b6135f188828901612e41565b9450945050604086013567ffffffffffffffff81111561361457613613612d7e565b5b61362088828901612e41565b92509250509295509295909350565b5f6020828403121561364457613643612d7a565b5b5f6136518482850161358a565b91505092915050565b5f6020828403121561366f5761366e612d7a565b5b5f61367c84828501613085565b91505092915050565b5f805f805f806080878903121561369f5761369e612d7a565b5b5f6136ac89828a0161358a565b965050602087013567ffffffffffffffff8111156136cd576136cc612d7e565b5b6136d989828a01612e41565b9550955050604087013567ffffffffffffffff8111156136fc576136fb612d7e565b5b61370889828a01612e41565b9350935050606087013567ffffffffffffffff81111561372b5761372a612d7e565b5b61373789828a01613101565b9150509295509295509295565b5f819050919050565b5f61376761376261375d8461337d565b613744565b61337d565b9050919050565b5f6137788261374d565b9050919050565b5f6137898261376e565b9050919050565b6137998161377f565b82525050565b5f6020820190506137b25f830184613790565b92915050565b5f6137c28261376e565b9050919050565b6137d2816137b8565b82525050565b5f6020820190506137eb5f8301846137c9565b92915050565b5f6137fb8261376e565b9050919050565b61380b816137f1565b82525050565b5f6020820190506138245f830184613802565b92915050565b5f8083601f84011261383f5761383e612e35565b5b8235905067ffffffffffffffff81111561385c5761385b612e39565b5b60208301915083602082028301111561387857613877612e3d565b5b9250929050565b5f8083601f84011261389457613893612e35565b5b8235905067ffffffffffffffff8111156138b1576138b0612e39565b5b6020830191508360018202830111156138cd576138cc612e3d565b5b9250929050565b5f805f805f805f8060a0898b0312156138f0576138ef612d7a565b5b5f6138fd8b828c0161358a565b985050602061390e8b828c0161358a565b975050604089013567ffffffffffffffff81111561392f5761392e612d7e565b5b61393b8b828c0161382a565b9650965050606089013567ffffffffffffffff81111561395e5761395d612d7e565b5b61396a8b828c0161382a565b9450945050608089013567ffffffffffffffff81111561398d5761398c612d7e565b5b6139998b828c0161387f565b92509250509295985092959890939650565b6139b481612d82565b82525050565b5f6020820190506139cd5f8301846139ab565b92915050565b6139dc81612ee1565b81146139e6575f80fd5b50565b5f813590506139f7816139d3565b92915050565b5f8060408385031215613a1357613a12612d7a565b5b5f613a20858286016139e9565b925050602083013567ffffffffffffffff811115613a4157613a40612d7e565b5b613a4d85828601613291565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613a8e578082015181840152602081019050613a73565b5f8484015250505050565b5f613aa382613a57565b613aad8185613a61565b9350613abd818560208601613a71565b613ac681612fbc565b840191505092915050565b5f6020820190508181035f830152613ae98184613a99565b905092915050565b5f805f805f8060a08789031215613b0b57613b0a612d7a565b5b5f613b1889828a0161358a565b9650506020613b2989828a0161358a565b9550506040613b3a89828a01613085565b9450506060613b4b89828a01613085565b935050608087013567ffffffffffffffff811115613b6c57613b6b612d7e565b5b613b7889828a0161387f565b92509250509295509295509295565b5f604082019050613b9a5f830185612d49565b613ba76020830184612d49565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112613c0357613c02613bdb565b5b80840192508235915067ffffffffffffffff821115613c2557613c24613bdf565b5b602083019250600182023603831315613c4157613c40613be3565b5b509250929050565b5f81905092915050565b5f613c5e8385613c49565b9350613c6b838584613242565b82840190509392505050565b5f613c83828486613c53565b91508190509392505050565b5f81905092915050565b5f613ca48385613c8f565b9350613cb1838584613242565b82840190509392505050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f613cf1600183613c8f565b9150613cfc82613cbd565b600182019050919050565b5f613d13828688613c99565b9150613d1e82613ce5565b9150613d2b828486613c99565b915081905095945050505050565b5f819050919050565b613d53613d4e82612d40565b613d39565b82525050565b5f613d648284613d42565b60208201915081905092915050565b5f613d7e8385613a61565b9350613d8b838584613242565b613d9483612fbc565b840190509392505050565b5f6020820190508181035f830152613db8818486613d73565b90509392505050565b50565b5f613dcf5f83613c49565b9150613dda82613dc1565b5f82019050919050565b5f613dee82613dc4565b9150819050919050565b5f604082019050613e0b5f8301856133ad565b613e186020830184612eea565b9392505050565b5f604082019050613e325f830185612eea565b613e3f6020830184612d49565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613e7881612d40565b82525050565b5f613e898383613e6f565b60208301905092915050565b5f602082019050919050565b5f613eab82613e46565b613eb58185613e50565b9350613ec083613e60565b805f5b83811015613ef0578151613ed78882613e7e565b9750613ee283613e95565b925050600181019050613ec3565b5085935050505092915050565b5f6040820190508181035f830152613f158185613a99565b90508181036020830152613f298184613ea1565b90509392505050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613f8057607f821691505b602082108103613f9357613f92613f3c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613ff57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613fba565b613fff8683613fba565b95508019841693508086168417925050509392505050565b5f61403161402c61402784612d40565b613744565b612d40565b9050919050565b5f819050919050565b61404a83614017565b61405e61405682614038565b848454613fc6565b825550505050565b5f90565b614072614066565b61407d818484614041565b505050565b5b818110156140a0576140955f8261406a565b600181019050614083565b5050565b601f8211156140e5576140b681613f99565b6140bf84613fab565b810160208510156140ce578190505b6140e26140da85613fab565b830182614082565b50505b505050565b5f82821c905092915050565b5f6141055f19846008026140ea565b1980831691505092915050565b5f61411d83836140f6565b9150826002028217905092915050565b6141378383613f32565b67ffffffffffffffff8111156141505761414f612fcc565b5b61415a8254613f69565b6141658282856140a4565b5f601f831160018114614192575f8415614180578287013590505b61418a8582614112565b8655506141f1565b601f1984166141a086613f99565b5f5b828110156141c7578489013582556001820191506020850194506020810190506141a2565b868310156141e457848901356141e0601f8916826140f6565b8355505b6001600288020188555050505b50505050505050565b5f819050919050565b5f61421d614218614213846141fa565b613744565b612d40565b9050919050565b61422d81614203565b82525050565b5f6040820190506142465f830185612eea565b6142536020830184614224565b9392505050565b5f81519050614268816139d3565b92915050565b5f6020828403121561428357614282612d7a565b5b5f6142908482850161425a565b91505092915050565b5f6040820190506142ac5f830185612eea565b81810360208301526142be8184613a99565b90509392505050565b5f6040820190506142da5f830185612eea565b6142e760208301846133ad565b9392505050565b5f819050919050565b61430861430382612ee1565b6142ee565b82525050565b5f61431982846142f7565b60208201915081905092915050565b5f8151905061433681613574565b92915050565b5f6020828403121561435157614350612d7a565b5b5f61435e84828501614328565b91505092915050565b5f60808201905061437a5f8301876133ad565b61438760208301866133ad565b61439460408301856133ad565b81810360608301526143a68184613a99565b905095945050505050565b5f81519050919050565b5f6143c5826143b1565b6143cf8185613c49565b93506143df818560208601613a71565b80840191505092915050565b5f6143f682846143bb565b915081905092915050565b5f819050815f5260205f209050919050565b5f815461441f81613f69565b6144298186613c49565b9450600182165f811461444357600181146144585761448a565b60ff198316865281151582028601935061448a565b61446185614401565b5f5b8381101561448257815481890152600182019150602081019050614463565b838801955050505b50505092915050565b5f61449e8284614413565b915081905092915050565b6144b281612e02565b81146144bc575f80fd5b50565b5f815190506144cd816144a9565b92915050565b5f602082840312156144e8576144e7612d7a565b5b5f6144f5848285016144bf565b91505092915050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f61453461452f61452a846144fe565b613744565b614507565b9050919050565b6145448161451a565b82525050565b5f63ffffffff82169050919050565b5f61457361456e614569846144fe565b613744565b61454a565b9050919050565b61458381614559565b82525050565b5f60e08201905061459c5f83018b612eea565b81810360208301526145af81898b613d73565b90506145be60408301886133ad565b6145cb60608301876133ad565b6145d8608083018661453b565b6145e560a083018561457a565b6145f260c083018461453b565b9998505050505050505050565b5f60a0820190506146125f830188612eea565b61461f6020830187612eea565b61462c60408301866133ad565b61463960608301856133ad565b614646608083018461453b565b9695505050505050565b5f8160601b9050919050565b5f61466682614650565b9050919050565b5f6146778261465c565b9050919050565b61468f61468a8261339c565b61466d565b82525050565b5f6146a0828461467e565b60148201915081905092915050565b5f82825260208201905092915050565b5f6146c9826143b1565b6146d381856146af565b93506146e3818560208601613a71565b6146ec81612fbc565b840191505092915050565b5f60608201905061470a5f830186612eea565b6147176020830185612d49565b818103604083015261472981846146bf565b9050949350505050565b5f819050919050565b5f61475661475161474c84614733565b613744565b612d40565b9050919050565b6147668161473c565b82525050565b5f6147775f836146af565b915061478282613dc1565b5f82019050919050565b5f60a08201905061479f5f8301876133ad565b6147ac60208301866133ad565b6147b96040830185612d49565b6147c6606083018461475d565b81810360808301526147d78161476c565b905095945050505050565b5f6020820190508181035f8301526147fa81846146bf565b90509291505056fea26469706673582212209e30165d1e51815c19ee7df8200294f18043caa9d9640333e0952c2b7c317a5d64736f6c63430008180033

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

00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e000000000000000000000000a0a1abcdae1a2a4a2ef8e9113ff0e02dd81dc0c60000000000000000000000000635513f179d50a207757e05759cbd106d7dfce800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b656e73746573742e657468000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _ensRegistry (address): 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
Arg [1] : _reverseRegistrar (address): 0xA0a1AbcDAe1a2a4A2EF8e9113Ff0e02DD81DC0C6
Arg [2] : _nameWrapper (address): 0x0635513f179D50A207757E05759CbD106d7dFcE8
Arg [3] : _defaultParent (string): enstest.eth
Arg [4] : _pricing (uint256): 10

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e
Arg [1] : 000000000000000000000000a0a1abcdae1a2a4a2ef8e9113ff0e02dd81dc0c6
Arg [2] : 0000000000000000000000000635513f179d50a207757e05759cbd106d7dfce8
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [6] : 656e73746573742e657468000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37651:16605:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54127:10;54113:36;;;54139:9;54113:36;;;;;;:::i;:::-;;;;;;;;37651:16605;;54223:10;54209:36;;;54235:9;54209:36;;;;;;:::i;:::-;;;;;;;;37651:16605;53786:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41044:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45706:628;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41415:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41909:1354;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45189:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43407:342;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39941:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40511:205;;;;;;;;;;;;;:::i;:::-;;40192:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40059:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30314:103;;;;;;;;;;;;;:::i;:::-;;43916:1183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37954:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37758:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37868;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40337:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29639:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48357:1448;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37916:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46490:1781;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53506:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40778:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37983:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53258:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30572:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53786:221;53865:4;53904:34;53889:49;;;:11;:49;;;;:110;;;;53974:25;53959:40;;;:11;:40;;;;53889:110;53882:117;;53786:221;;;:::o;41044:220::-;41120:18;41151:23;41177:28;41194:10;;41177:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:28::i;:::-;41151:54;;41223:33;41242:10;41254:1;41223:18;:33::i;:::-;41216:40;;;41044:220;;;;:::o;45706:628::-;45915:4;45948:7;;45936:9;:19;45932:71;;;45984:7;;45993:9;45964:39;;;;;;;;;;;;:::i;:::-;;;;;;;;45932:71;46048:6;;:13;;46020:17;;:24;;:41;46016:141;;46105:17;;:24;;46131:6;;:13;;46085:60;;;;;;;;;;;;:::i;:::-;;;;;;;;46016:141;46174:9;46169:134;46193:6;;:13;;46189:1;:17;46169:134;;;46228:63;46236:17;;46254:1;46236:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46258:6;;46265:1;46258:9;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;46269:10;;46281:9;46228:7;:63::i;:::-;;46208:3;;;;;;;46169:134;;;;46322:4;46315:11;;45706:628;;;;;;;;;:::o;41415:403::-;41598:23;41634:33;41684:1;41670:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41634:52;;41719:2;41697:16;41714:1;41697:19;;;;;;;;:::i;:::-;;;;;;;:24;;;;;41739:71;41756:8;41766:5;;41773:10;;41785:6;41793:16;41739;:71::i;:::-;41732:78;;;41415:403;;;;;;;;:::o;41909:1354::-;42129:23;42181:7;;42169:9;:19;42165:71;;;42217:7;;42226:9;42197:39;;;;;;;;;;;;:::i;:::-;;;;;;;;42165:71;42249:18;42270:29;42288:10;;42270:17;:29::i;:::-;42249:50;;42310:17;42346:5;;42330:23;;;;;;;:::i;:::-;;;;;;;;42310:43;;42364:12;42379:41;42398:10;42410:9;42379:18;:41::i;:::-;42364:56;;42431:21;42479:5;;42491:10;;42462:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42431:72;;42514:16;42568:4;42560:13;;42543:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;42533:42;;;;;;42514:61;;42614:42;42629:6;42637:8;42647;42614:14;:42::i;:::-;42596:60;;42706:4;42689:15;42672:39;;;;;;;;;;;;42729:54;42737:15;42754:5;;42761:10;;42773:9;42729:7;:54::i;:::-;42724:123;;42829:5;;42807:28;;;;;;;;;;;;:::i;:::-;;;;;;;;42724:123;42864:61;42880:15;42897:7;42906:18;42919:4;42906:12;:18::i;:::-;42864:15;:61::i;:::-;42859:139;;42970:15;42949:37;;;;;;;;;;;:::i;:::-;;;;;;;;42859:139;43035:15;43013:47;;;43052:7;43013:47;;;;;;:::i;:::-;;;;;;;;43073:55;43100:15;43117:10;43073:26;:55::i;:::-;43190:10;43144:57;;43173:15;43144:57;;;;;;;;;;;;43233:10;43219:36;;;43245:9;43219:36;;;;;;:::i;:::-;;;;;;;;42154:1109;;;;;41909:1354;;;;;;;;;:::o;45189:371::-;45361:4;45378:33;45428:1;45414:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45378:52;;45463:2;45441:16;45458:1;45441:19;;;;;;;;:::i;:::-;;;;;;;:24;;;;;45483:69;45496:17;;45515:6;;45523:10;;45535:16;45483:12;:69::i;:::-;45476:76;;;45189:371;;;;;;;;:::o;43407:342::-;43558:4;43575:33;43625:1;43611:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43575:52;;43660:2;43638:16;43655:1;43638:19;;;;;;;;:::i;:::-;;;;;;;:24;;;;;43680:61;43688:15;43705:5;;43712:10;;43724:16;43680:7;:61::i;:::-;43673:68;;;43407:342;;;;;;;:::o;39941:110::-;29525:13;:11;:13::i;:::-;40037:5:::1;40010:11;;:33;;;;;;;;;;;;;;;;;;39941:110:::0;:::o;40511:205::-;29525:13;:11;:13::i;:::-;40561:14:::1;40578:21;40561:38;;40611:12;40629:7;:5;:7::i;:::-;:12;;40649:6;40629:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40610:50;;;40676:7;40671:37;;40692:16;;;;;;;;;;;;;;40671:37;40550:166;;40511:205::o:0;40192:137::-;29525:13;:11;:13::i;:::-;40273:8:::1;40263:7;:18;;;;40297:24;40312:8;40297:24;;;;;;:::i;:::-;;;;;;;;40192:137:::0;:::o;40059:125::-;29525:13;:11;:13::i;:::-;40170:5:::1;40133:16;;:43;;;;;;;;;;;;;;;;;;40059:125:::0;:::o;30314:103::-;29525:13;:11;:13::i;:::-;30379:30:::1;30406:1;30379:18;:30::i;:::-;30314:103::o:0;43916:1183::-;44104:4;44137:7;;44125:9;:19;44121:71;;;44173:7;;44182:9;44153:39;;;;;;;;;;;;:::i;:::-;;;;;;;;44121:71;44213:18;44234:29;44252:10;;44234:17;:29::i;:::-;44213:50;;44274:17;44310:5;;44294:23;;;;;;;:::i;:::-;;;;;;;;44274:43;;44328:12;44343:41;44362:10;44374:9;44343:18;:41::i;:::-;44328:56;;44395:21;44443:5;;44455:10;;44426:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44395:72;;44485:28;44502:10;;44485:16;:28::i;:::-;44484:29;:60;;;;;44518:26;44533:10;44518:14;:26::i;:::-;44517:27;44484:60;44480:136;;;44581:10;44593;44568:36;;;;;;;;;;;;:::i;:::-;;;;;;;;44480:136;44641:50;44656:10;44668:5;;44675:9;44686:4;44641:14;:50::i;:::-;44636:119;;44737:5;;44715:28;;;;;;;;;;;;:::i;:::-;;;;;;;;44636:119;44772:42;44781:4;44787:15;44804:9;44772:8;:42::i;:::-;44767:126;;44862:4;44868:9;44878:1;44868:12;;;;;;;;:::i;:::-;;;;;;;;44838:43;;;;;;;;;;;;:::i;:::-;;;;;;;;44767:126;44923:15;44908:51;;;44940:7;44949:9;44908:51;;;;;;;:::i;:::-;;;;;;;;44972:43;44998:4;45004:10;44972:25;:43::i;:::-;45047:10;45033:36;;;45059:9;45033:36;;;;;;:::i;:::-;;;;;;;;45087:4;45080:11;;;;;;43916:1183;;;;;;;;:::o;37954:22::-;;;;:::o;37758:41::-;;;:::o;37868:::-;;;;;;;;;;;;;:::o;40337:166::-;29525:13;:11;:13::i;:::-;40439:9:::1;;40423:13;:25;;;;;;;:::i;:::-;;40464:31;40485:9;;40464:31;;;;;;;:::i;:::-;;;;;;;;40337:166:::0;;:::o;29639:87::-;29685:7;29712:6;;;;;;;;;;;29705:13;;29639:87;:::o;48357:1448::-;48553:23;48605:7;;48593:9;:19;48589:71;;;48641:7;;48650:9;48621:39;;;;;;;;;;;;:::i;:::-;;;;;;;;48589:71;48673:18;48694:29;48712:10;;48694:17;:29::i;:::-;48673:50;;48734:17;48770:5;;48754:23;;;;;;;:::i;:::-;;;;;;;;48734:43;;48788:12;48803:41;48822:10;48834:9;48803:18;:41::i;:::-;48788:56;;48855:21;48903:5;;48915:10;;48886:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48855:72;;48938:16;48992:4;48984:13;;48967:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;48957:42;;;;;;48938:61;;49019:28;49036:10;;49019:16;:28::i;:::-;49018:29;:60;;;;;49052:26;49067:10;49052:14;:26::i;:::-;49051:27;49018:60;49014:136;;;49115:10;49127;49102:36;;;;;;;;;;;;:::i;:::-;;;;;;;;49014:136;49175:50;49190:10;49202:5;;49209:9;49220:4;49175:14;:50::i;:::-;49170:119;;49271:5;;49249:28;;;;;;;;;;;;:::i;:::-;;;;;;;;49170:119;49327:42;49342:6;49350:8;49360;49327:14;:42::i;:::-;49309:60;;49419:4;49402:15;49385:39;;;;;;;;;;;;49445:32;49494:1;49480:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49445:51;;49528:2;49507:15;49523:1;49507:18;;;;;;;;:::i;:::-;;;;;;;:23;;;;;49546:48;49555:4;49561:15;49578;49546:8;:48::i;:::-;49541:122;;49642:4;49648:2;49618:33;;;;;;;;;;;;:::i;:::-;;;;;;;;49541:122;49693:15;49678:57;;;49710:7;49719:15;49678:57;;;;;;;:::i;:::-;;;;;;;;49775:10;49761:36;;;49787:9;49761:36;;;;;;:::i;:::-;;;;;;;;48578:1227;;;;;;48357:1448;;;;;;;;:::o;37916:31::-;;;;;;;;;;;;;:::o;46490:1781::-;46687:23;46739:7;;46727:9;:19;46723:71;;;46775:7;;46784:9;46755:39;;;;;;;;;;;;:::i;:::-;;;;;;;;46723:71;46807:18;46828:29;46846:10;;46828:17;:29::i;:::-;46807:50;;46868:17;46904:5;;46888:23;;;;;;;:::i;:::-;;;;;;;;46868:43;;46922:12;46937:41;46956:10;46968:9;46937:18;:41::i;:::-;46922:56;;46989:21;47037:5;;47049:10;;47020:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46989:72;;47072:16;47126:4;47118:13;;47101:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;47091:42;;;;;;47072:61;;47151:28;47168:10;;47151:16;:28::i;:::-;47150:29;:60;;;;;47184:26;47199:10;47184:14;:26::i;:::-;47183:27;47150:60;47146:136;;;47247:10;47259;47234:36;;;;;;;;;;;;:::i;:::-;;;;;;;;47146:136;47307:50;47322:10;47334:5;;47341:9;47352:4;47307:14;:50::i;:::-;47302:119;;47403:5;;47381:28;;;;;;;;;;;;:::i;:::-;;;;;;;;47302:119;47459:42;47474:6;47482:8;47492;47459:14;:42::i;:::-;47441:60;;47551:4;47534:15;47517:39;;;;;;;;;;;;47569:19;47591:16;;;;;;;;;;;:21;;;47613:15;47591:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47569:60;;47656:25;47669:11;47656:12;:25::i;:::-;47640:50;;;47691:11;47704:7;47640:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47750:15;47728:47;;;47767:7;47728:47;;;;;;:::i;:::-;;;;;;;;47788:32;47837:1;47823:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47788:51;;47871:2;47850:15;47866:1;47850:18;;;;;;;;:::i;:::-;;;;;;;:23;;;;;47889:48;47898:4;47904:15;47921;47889:8;:48::i;:::-;47884:122;;47985:4;47991:2;47961:33;;;;;;;;;;;;:::i;:::-;;;;;;;;47884:122;48036:15;48021:57;;;48053:7;48062:15;48021:57;;;;;;;:::i;:::-;;;;;;;;48091:11;:20;;;48112:11;48125:10;48091:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48198:10;48152:57;;48181:15;48152:57;;;;;;;;;;;;48241:10;48227:36;;;48253:9;48227:36;;;;;;:::i;:::-;;;;;;;;46712:1559;;;;;;;46490:1781;;;;;;;;:::o;53506:272::-;53696:6;53722:48;;;53715:55;;53506:272;;;;;;;;;;:::o;40778:258::-;40870:7;40890:16;40936:4;40919:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;40909:33;;;;;;40890:52;;40960:68;40983:8;41003;40993:19;;;;;;41022:4;40960:22;:68::i;:::-;40953:75;;;40778:258;;;;:::o;37983:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53258:240::-;53421:6;53447:43;;;53440:50;;53258:240;;;;;;;;:::o;30572:220::-;29525:13;:11;:13::i;:::-;30677:1:::1;30657:22;;:8;:22;;::::0;30653:93:::1;;30731:1;30703:31;;;;;;;;;;;:::i;:::-;;;;;;;;30653:93;30756:28;30775:8;30756:18;:28::i;:::-;30572:220:::0;:::o;22978:1035::-;23052:16;23106:9;23124:3;23118:17;23106:29;;23159:1;23154;:6;23150:26;;23162:14;;;;;;;;;;;;;;;;;;;;;;23150:26;23219:1;23215;:5;23205:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23199:22;;23255:59;23285:1;23267:15;23278:3;23267:10;:15::i;:::-;:19;23288:22;23305:3;23288:10;:22::i;:::-;23312:1;23255:11;:59::i;:::-;23349:13;23414:12;23446:9;23441:369;23461:1;23457;:5;23441:369;;;23492:20;23498:3;23503:1;23492:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;23488:307;;23548:5;23544:1;:9;23537:16;;23588:1;23580:4;:9;:23;;;;23600:3;23593:4;:10;23580:23;23576:109;;;23657:3;23639:22;;;;;;;;;;;:::i;:::-;;;;;;;;23576:109;23733:4;23720:19;;23707:3;23711:5;23707:10;;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;;;23774:1;23770;:5;23762:13;;23488:307;23464:3;;;;;23441:369;;;;23835:5;23831:1;:9;23824:16;;23867:1;23859:4;:9;:23;;;;23879:3;23872:4;:10;23859:23;23855:93;;;23928:3;23910:22;;;;;;;;;;;:::i;:::-;;;;;;;;23855:93;23988:4;23975:19;;23962:3;23966:5;23962:10;;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;;;23081:925;;;22978:1035;;;;:::o;20300:280::-;20401:12;20443:23;20453:4;20459:6;20443:9;:23::i;:::-;20426:40;;;;;;;;20497:1;20489:10;;20481:4;:18;20477:96;;20523:38;20532:22;20541:4;20547:6;20532:8;:22::i;:::-;20556:4;20523:8;:38::i;:::-;20516:45;;20477:96;20300:280;;;;:::o;20847:343::-;20952:12;21088:10;21085:1;21078:21;21124:9;21120:2;21113:21;21169:2;21166:1;21156:16;21148:24;;20847:343;;;;:::o;32630:587::-;32717:12;32770:6;32746:21;:30;32742:127;;;32827:21;32850:6;32800:57;;;;;;;;;;;;:::i;:::-;;;;;;;;32742:127;32902:1;32883:8;:15;:20;32879:82;;32927:22;;;;;;;;;;;;;;32879:82;33101:4;33090:8;33084:15;33077:4;33067:8;33063:19;33055:6;33047:59;33039:67;;33147:1;33131:18;;:4;:18;;;33127:83;;33173:25;;;;;;;;;;;;;;33127:83;32630:587;;;;;:::o;53078:119::-;53136:7;53163:11;:20;;;53184:4;53163:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53156:33;;53078:119;;;:::o;50189:275::-;50283:4;50304:16;;;;;;;;;;;:31;;;50336:4;50350;50357:8;50367:4;50304:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50300:157;;50440:5;50433:12;;;;50300:157;50395:4;50388:11;;50189:275;;;;;;:::o;49875:306::-;49974:12;49992:15;:20;;50081:8;50027:63;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49992:109;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49973:128;;;50117:7;50112:61;;50157:15;50133:40;;;;;;;;;;;:::i;:::-;;;;;;;;50112:61;49962:219;49875:306;;:::o;29804:166::-;29875:12;:10;:12::i;:::-;29864:23;;:7;:5;:7::i;:::-;:23;;;29860:103;;29938:12;:10;:12::i;:::-;29911:40;;;;;;;;;;;:::i;:::-;;;;;;;;29860:103;29804:166::o;30952:191::-;31026:16;31045:6;;;;;;;;;;;31026:25;;31071:8;31062:6;;:17;;;;;;;;;;;;;;;;;;31126:8;31095:40;;31116:8;31095:40;;;;;;;;;;;;31015:128;30952:191;:::o;52907:163::-;52979:4;53047:13;53031:31;;;;;;:::i;:::-;;;;;;;;53019:6;;53003:24;;;;;;;:::i;:::-;;;;;;;;:59;52996:66;;52907:163;;;;:::o;52671:228::-;52731:4;52755:19;52769:4;52755:13;:19::i;:::-;:136;;52881:10;52854:37;;:11;:17;;;52872:4;52854:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;;52755:136;;;52828:10;52790:48;;:11;;;;;;;;;;;:19;;;52818:4;52810:13;;52790:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;52755:136;52748:143;;52671:228;;;:::o;50556:706::-;50716:4;50781:11;:24;;;50806:4;50781:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50777:74;;;50835:4;50828:11;;;;50777:74;50863:16;50882:24;50895:10;50882:12;:24::i;:::-;50863:43;;50921:25;50935:10;50921:13;:25::i;:::-;50917:251;;;50963:11;;;;;;;;;;;:28;;;50992:10;51004:5;;51019:4;51026:8;51036:1;51039;51042;50963:81;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50917:251;;;51077:11;:28;;;51106:10;51118:9;51137:4;51144:8;51154:1;51077:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50917:251;51220:4;51208:10;51193:39;51226:5;;51193:39;;;;;;;:::i;:::-;;;;;;;;51250:4;51243:11;;;50556:706;;;;;;;;:::o;51408:666::-;51544:4;51669:1;51642:29;;:15;:29;;;51638:73;;51695:4;51688:11;;;;51638:73;51723:16;51742:18;51755:4;51742:12;:18::i;:::-;51723:37;;51776:9;51771:264;51795:9;:16;51791:1;:20;51771:264;;;51853:8;51837:33;;;51871:4;51877:9;51887:1;51877:12;;;;;;;;:::i;:::-;;;;;;;;51908:15;51891:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;51837:88;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51833:191;;52003:5;51996:12;;;;;;51833:191;51813:3;;;;;;;51771:264;;;;52062:4;52055:11;;;51408:666;;;;;;:::o;52082:348::-;52172:19;52186:4;52172:13;:19::i;:::-;52168:196;;;52208:11;;;;;;;;;;;:28;;;52245:4;52252:8;52270:4;52262:13;;52277:1;52208:75;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52168:196;;;52316:11;:20;;;52337:4;52343:8;52316:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52168:196;52413:8;52379:43;;52407:4;52379:43;;;;;;;;;;52082:348;;:::o;33843:1794::-;33944:12;34054:4;34048:11;35285:12;35278:4;35273:3;35269:14;35262:36;35335:4;35328;35323:3;35319:14;35312:28;35366:8;35361:3;35354:21;35460:4;35455:3;35451:14;35572:4;35565:5;35557:20;35616:2;35609:5;35599:20;35591:28;;34022:1608;;33843:1794;;;;;:::o;1384:151::-;1436:11;1514:2;1511:1;1507:10;1500:17;;1384:151;;;:::o;511:705::-;716:190;731:2;726:3;723:11;716:190;;;775:3;769:10;764:3;757:23;814:2;809:3;805:12;798:19;;851:2;846:3;842:12;835:19;;888:2;883:3;879:12;872:19;;716:190;;;960:3;957:241;;;1029:1;1025;1018:3;1014:2;1010:12;1007:1;1003:20;999:28;995:36;1081:4;1077:9;1071:3;1065:10;1061:26;1133:4;1127:3;1121:10;1117:21;1177:4;1171;1168:14;1163:3;1156:27;964:234;;;957:241;511:705;;;:::o;18187:374::-;18289:17;18308:18;18339:10;18381:23;18391:4;18397:6;18381:9;:23::i;:::-;18360:44;;;;;;;;18426:1;18419:4;:8;;;18415:139;;;18523:4;18518:2;18509:6;18503:4;18499:17;18495:26;18485:43;18472:56;;18415:139;18328:233;18187:374;;;;;:::o;27755:98::-;27808:7;27835:10;27828:17;;27755:98;:::o;52438:225::-;52497:4;52518:11;;;;;;;;;;;:21;;;52540:4;52518:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52514:142;;52639:5;52632:12;;;;52514:142;52591:7;52584:14;;;52438:225;;;;:::o;15631:515::-;15733:10;15745:18;15815:4;:11;15805:6;:21;15801:92;;15872:4;15854:23;;;;;;;;;;;:::i;:::-;;;;;;;;15801:92;15920:4;15925:6;15920:12;;;;;;;;:::i;:::-;;;;;;;;;;15914:19;;15907:26;;15974:4;15961:17;;15970:1;15961:6;:10;:17;15948:30;;16004:1;15997:4;:8;;;:64;;16050:4;:11;16036:10;:25;;15997:64;;;16022:4;:11;16008:10;:25;;15997:64;15993:135;;;16107:4;16089:23;;;;;;;;;;;:::i;:::-;;;;;;;;15993:135;15631:515;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:117::-;2062:1;2059;2052:12;2076:117;2185:1;2182;2175:12;2199:117;2308:1;2305;2298:12;2336:553;2394:8;2404:6;2454:3;2447:4;2439:6;2435:17;2431:27;2421:122;;2462:79;;:::i;:::-;2421:122;2575:6;2562:20;2552:30;;2605:18;2597:6;2594:30;2591:117;;;2627:79;;:::i;:::-;2591:117;2741:4;2733:6;2729:17;2717:29;;2795:3;2787:4;2779:6;2775:17;2765:8;2761:32;2758:41;2755:128;;;2802:79;;:::i;:::-;2755:128;2336:553;;;;;:::o;2895:529::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3177:1;3166:9;3162:17;3149:31;3207:18;3199:6;3196:30;3193:117;;;3229:79;;:::i;:::-;3193:117;3342:65;3399:7;3390:6;3379:9;3375:22;3342:65;:::i;:::-;3324:83;;;;3120:297;2895:529;;;;;:::o;3430:77::-;3467:7;3496:5;3485:16;;3430:77;;;:::o;3513:118::-;3600:24;3618:5;3600:24;:::i;:::-;3595:3;3588:37;3513:118;;:::o;3637:222::-;3730:4;3768:2;3757:9;3753:18;3745:26;;3781:71;3849:1;3838:9;3834:17;3825:6;3781:71;:::i;:::-;3637:222;;;;:::o;3882:568::-;3955:8;3965:6;4015:3;4008:4;4000:6;3996:17;3992:27;3982:122;;4023:79;;:::i;:::-;3982:122;4136:6;4123:20;4113:30;;4166:18;4158:6;4155:30;4152:117;;;4188:79;;:::i;:::-;4152:117;4302:4;4294:6;4290:17;4278:29;;4356:3;4348:4;4340:6;4336:17;4326:8;4322:32;4319:41;4316:128;;;4363:79;;:::i;:::-;4316:128;3882:568;;;;;:::o;4472:580::-;4557:8;4567:6;4617:3;4610:4;4602:6;4598:17;4594:27;4584:122;;4625:79;;:::i;:::-;4584:122;4738:6;4725:20;4715:30;;4768:18;4760:6;4757:30;4754:117;;;4790:79;;:::i;:::-;4754:117;4904:4;4896:6;4892:17;4880:29;;4958:3;4950:4;4942:6;4938:17;4928:8;4924:32;4921:41;4918:128;;;4965:79;;:::i;:::-;4918:128;4472:580;;;;;:::o;5058:102::-;5099:6;5150:2;5146:7;5141:2;5134:5;5130:14;5126:28;5116:38;;5058:102;;;:::o;5166:180::-;5214:77;5211:1;5204:88;5311:4;5308:1;5301:15;5335:4;5332:1;5325:15;5352:281;5435:27;5457:4;5435:27;:::i;:::-;5427:6;5423:40;5565:6;5553:10;5550:22;5529:18;5517:10;5514:34;5511:62;5508:88;;;5576:18;;:::i;:::-;5508:88;5616:10;5612:2;5605:22;5395:238;5352:281;;:::o;5639:129::-;5673:6;5700:20;;:::i;:::-;5690:30;;5729:33;5757:4;5749:6;5729:33;:::i;:::-;5639:129;;;:::o;5774:311::-;5851:4;5941:18;5933:6;5930:30;5927:56;;;5963:18;;:::i;:::-;5927:56;6013:4;6005:6;6001:17;5993:25;;6073:4;6067;6063:15;6055:23;;5774:311;;;:::o;6091:122::-;6164:24;6182:5;6164:24;:::i;:::-;6157:5;6154:35;6144:63;;6203:1;6200;6193:12;6144:63;6091:122;:::o;6219:139::-;6265:5;6303:6;6290:20;6281:29;;6319:33;6346:5;6319:33;:::i;:::-;6219:139;;;;:::o;6381:710::-;6477:5;6502:81;6518:64;6575:6;6518:64;:::i;:::-;6502:81;:::i;:::-;6493:90;;6603:5;6632:6;6625:5;6618:21;6666:4;6659:5;6655:16;6648:23;;6719:4;6711:6;6707:17;6699:6;6695:30;6748:3;6740:6;6737:15;6734:122;;;6767:79;;:::i;:::-;6734:122;6882:6;6865:220;6899:6;6894:3;6891:15;6865:220;;;6974:3;7003:37;7036:3;7024:10;7003:37;:::i;:::-;6998:3;6991:50;7070:4;7065:3;7061:14;7054:21;;6941:144;6925:4;6920:3;6916:14;6909:21;;6865:220;;;6869:21;6483:608;;6381:710;;;;;:::o;7114:370::-;7185:5;7234:3;7227:4;7219:6;7215:17;7211:27;7201:122;;7242:79;;:::i;:::-;7201:122;7359:6;7346:20;7384:94;7474:3;7466:6;7459:4;7451:6;7447:17;7384:94;:::i;:::-;7375:103;;7191:293;7114:370;;;;:::o;7490:1659::-;7679:6;7687;7695;7703;7711;7719;7727;7776:3;7764:9;7755:7;7751:23;7747:33;7744:120;;;7783:79;;:::i;:::-;7744:120;7931:1;7920:9;7916:17;7903:31;7961:18;7953:6;7950:30;7947:117;;;7983:79;;:::i;:::-;7947:117;8096:80;8168:7;8159:6;8148:9;8144:22;8096:80;:::i;:::-;8078:98;;;;7874:312;8253:2;8242:9;8238:18;8225:32;8284:18;8276:6;8273:30;8270:117;;;8306:79;;:::i;:::-;8270:117;8419:92;8503:7;8494:6;8483:9;8479:22;8419:92;:::i;:::-;8401:110;;;;8196:325;8588:2;8577:9;8573:18;8560:32;8619:18;8611:6;8608:30;8605:117;;;8641:79;;:::i;:::-;8605:117;8754:65;8811:7;8802:6;8791:9;8787:22;8754:65;:::i;:::-;8736:83;;;;8531:298;8896:2;8885:9;8881:18;8868:32;8927:18;8919:6;8916:30;8913:117;;;8949:79;;:::i;:::-;8913:117;9054:78;9124:7;9115:6;9104:9;9100:22;9054:78;:::i;:::-;9044:88;;8839:303;7490:1659;;;;;;;;;;:::o;9155:117::-;9264:1;9261;9254:12;9278:307;9339:4;9429:18;9421:6;9418:30;9415:56;;;9451:18;;:::i;:::-;9415:56;9489:29;9511:6;9489:29;:::i;:::-;9481:37;;9573:4;9567;9563:15;9555:23;;9278:307;;;:::o;9591:146::-;9688:6;9683:3;9678;9665:30;9729:1;9720:6;9715:3;9711:16;9704:27;9591:146;;;:::o;9743:423::-;9820:5;9845:65;9861:48;9902:6;9861:48;:::i;:::-;9845:65;:::i;:::-;9836:74;;9933:6;9926:5;9919:21;9971:4;9964:5;9960:16;10009:3;10000:6;9995:3;9991:16;9988:25;9985:112;;;10016:79;;:::i;:::-;9985:112;10106:54;10153:6;10148:3;10143;10106:54;:::i;:::-;9826:340;9743:423;;;;;:::o;10185:338::-;10240:5;10289:3;10282:4;10274:6;10270:17;10266:27;10256:122;;10297:79;;:::i;:::-;10256:122;10414:6;10401:20;10439:78;10513:3;10505:6;10498:4;10490:6;10486:17;10439:78;:::i;:::-;10430:87;;10246:277;10185:338;;;;:::o;10529:1343::-;10648:6;10656;10664;10672;10680;10688;10737:3;10725:9;10716:7;10712:23;10708:33;10705:120;;;10744:79;;:::i;:::-;10705:120;10892:1;10881:9;10877:17;10864:31;10922:18;10914:6;10911:30;10908:117;;;10944:79;;:::i;:::-;10908:117;11049:62;11103:7;11094:6;11083:9;11079:22;11049:62;:::i;:::-;11039:72;;10835:286;11188:2;11177:9;11173:18;11160:32;11219:18;11211:6;11208:30;11205:117;;;11241:79;;:::i;:::-;11205:117;11354:65;11411:7;11402:6;11391:9;11387:22;11354:65;:::i;:::-;11336:83;;;;11131:298;11496:2;11485:9;11481:18;11468:32;11527:18;11519:6;11516:30;11513:117;;;11549:79;;:::i;:::-;11513:117;11662:65;11719:7;11710:6;11699:9;11695:22;11662:65;:::i;:::-;11644:83;;;;11439:298;11776:2;11802:53;11847:7;11838:6;11827:9;11823:22;11802:53;:::i;:::-;11792:63;;11747:118;10529:1343;;;;;;;;:::o;11878:126::-;11915:7;11955:42;11948:5;11944:54;11933:65;;11878:126;;;:::o;12010:96::-;12047:7;12076:24;12094:5;12076:24;:::i;:::-;12065:35;;12010:96;;;:::o;12112:118::-;12199:24;12217:5;12199:24;:::i;:::-;12194:3;12187:37;12112:118;;:::o;12236:222::-;12329:4;12367:2;12356:9;12352:18;12344:26;;12380:71;12448:1;12437:9;12433:17;12424:6;12380:71;:::i;:::-;12236:222;;;;:::o;12464:1699::-;12617:6;12625;12633;12641;12649;12657;12665;12714:3;12702:9;12693:7;12689:23;12685:33;12682:120;;;12721:79;;:::i;:::-;12682:120;12869:1;12858:9;12854:17;12841:31;12899:18;12891:6;12888:30;12885:117;;;12921:79;;:::i;:::-;12885:117;13026:62;13080:7;13071:6;13060:9;13056:22;13026:62;:::i;:::-;13016:72;;12812:286;13165:2;13154:9;13150:18;13137:32;13196:18;13188:6;13185:30;13182:117;;;13218:79;;:::i;:::-;13182:117;13331:65;13388:7;13379:6;13368:9;13364:22;13331:65;:::i;:::-;13313:83;;;;13108:298;13473:2;13462:9;13458:18;13445:32;13504:18;13496:6;13493:30;13490:117;;;13526:79;;:::i;:::-;13490:117;13639:65;13696:7;13687:6;13676:9;13672:22;13639:65;:::i;:::-;13621:83;;;;13416:298;13753:2;13779:53;13824:7;13815:6;13804:9;13800:22;13779:53;:::i;:::-;13769:63;;13724:118;13909:3;13898:9;13894:19;13881:33;13941:18;13933:6;13930:30;13927:117;;;13963:79;;:::i;:::-;13927:117;14068:78;14138:7;14129:6;14118:9;14114:22;14068:78;:::i;:::-;14058:88;;13852:304;12464:1699;;;;;;;;;;:::o;14169:1303::-;14324:6;14332;14340;14348;14356;14364;14413:2;14401:9;14392:7;14388:23;14384:32;14381:119;;;14419:79;;:::i;:::-;14381:119;14567:1;14556:9;14552:17;14539:31;14597:18;14589:6;14586:30;14583:117;;;14619:79;;:::i;:::-;14583:117;14732:80;14804:7;14795:6;14784:9;14780:22;14732:80;:::i;:::-;14714:98;;;;14510:312;14889:2;14878:9;14874:18;14861:32;14920:18;14912:6;14909:30;14906:117;;;14942:79;;:::i;:::-;14906:117;15055:92;15139:7;15130:6;15119:9;15115:22;15055:92;:::i;:::-;15037:110;;;;14832:325;15224:2;15213:9;15209:18;15196:32;15255:18;15247:6;15244:30;15241:117;;;15277:79;;:::i;:::-;15241:117;15390:65;15447:7;15438:6;15427:9;15423:22;15390:65;:::i;:::-;15372:83;;;;15167:298;14169:1303;;;;;;;;:::o;15478:122::-;15551:24;15569:5;15551:24;:::i;:::-;15544:5;15541:35;15531:63;;15590:1;15587;15580:12;15531:63;15478:122;:::o;15606:139::-;15652:5;15690:6;15677:20;15668:29;;15706:33;15733:5;15706:33;:::i;:::-;15606:139;;;;:::o;15751:1019::-;15852:6;15860;15868;15876;15884;15933:2;15921:9;15912:7;15908:23;15904:32;15901:119;;;15939:79;;:::i;:::-;15901:119;16059:1;16084:53;16129:7;16120:6;16109:9;16105:22;16084:53;:::i;:::-;16074:63;;16030:117;16214:2;16203:9;16199:18;16186:32;16245:18;16237:6;16234:30;16231:117;;;16267:79;;:::i;:::-;16231:117;16380:65;16437:7;16428:6;16417:9;16413:22;16380:65;:::i;:::-;16362:83;;;;16157:298;16522:2;16511:9;16507:18;16494:32;16553:18;16545:6;16542:30;16539:117;;;16575:79;;:::i;:::-;16539:117;16688:65;16745:7;16736:6;16725:9;16721:22;16688:65;:::i;:::-;16670:83;;;;16465:298;15751:1019;;;;;;;;:::o;16776:329::-;16835:6;16884:2;16872:9;16863:7;16859:23;16855:32;16852:119;;;16890:79;;:::i;:::-;16852:119;17010:1;17035:53;17080:7;17071:6;17060:9;17056:22;17035:53;:::i;:::-;17025:63;;16981:117;16776:329;;;;:::o;17111:::-;17170:6;17219:2;17207:9;17198:7;17194:23;17190:32;17187:119;;;17225:79;;:::i;:::-;17187:119;17345:1;17370:53;17415:7;17406:6;17395:9;17391:22;17370:53;:::i;:::-;17360:63;;17316:117;17111:329;;;;:::o;17446:1375::-;17581:6;17589;17597;17605;17613;17621;17670:3;17658:9;17649:7;17645:23;17641:33;17638:120;;;17677:79;;:::i;:::-;17638:120;17797:1;17822:53;17867:7;17858:6;17847:9;17843:22;17822:53;:::i;:::-;17812:63;;17768:117;17952:2;17941:9;17937:18;17924:32;17983:18;17975:6;17972:30;17969:117;;;18005:79;;:::i;:::-;17969:117;18118:65;18175:7;18166:6;18155:9;18151:22;18118:65;:::i;:::-;18100:83;;;;17895:298;18260:2;18249:9;18245:18;18232:32;18291:18;18283:6;18280:30;18277:117;;;18313:79;;:::i;:::-;18277:117;18426:65;18483:7;18474:6;18463:9;18459:22;18426:65;:::i;:::-;18408:83;;;;18203:298;18568:2;18557:9;18553:18;18540:32;18599:18;18591:6;18588:30;18585:117;;;18621:79;;:::i;:::-;18585:117;18726:78;18796:7;18787:6;18776:9;18772:22;18726:78;:::i;:::-;18716:88;;18511:303;17446:1375;;;;;;;;:::o;18827:60::-;18855:3;18876:5;18869:12;;18827:60;;;:::o;18893:142::-;18943:9;18976:53;18994:34;19003:24;19021:5;19003:24;:::i;:::-;18994:34;:::i;:::-;18976:53;:::i;:::-;18963:66;;18893:142;;;:::o;19041:126::-;19091:9;19124:37;19155:5;19124:37;:::i;:::-;19111:50;;19041:126;;;:::o;19173:147::-;19244:9;19277:37;19308:5;19277:37;:::i;:::-;19264:50;;19173:147;;;:::o;19326:173::-;19434:58;19486:5;19434:58;:::i;:::-;19429:3;19422:71;19326:173;;:::o;19505:264::-;19619:4;19657:2;19646:9;19642:18;19634:26;;19670:92;19759:1;19748:9;19744:17;19735:6;19670:92;:::i;:::-;19505:264;;;;:::o;19775:152::-;19851:9;19884:37;19915:5;19884:37;:::i;:::-;19871:50;;19775:152;;;:::o;19933:183::-;20046:63;20103:5;20046:63;:::i;:::-;20041:3;20034:76;19933:183;;:::o;20122:274::-;20241:4;20279:2;20268:9;20264:18;20256:26;;20292:97;20386:1;20375:9;20371:17;20362:6;20292:97;:::i;:::-;20122:274;;;;:::o;20402:147::-;20473:9;20506:37;20537:5;20506:37;:::i;:::-;20493:50;;20402:147;;;:::o;20555:173::-;20663:58;20715:5;20663:58;:::i;:::-;20658:3;20651:71;20555:173;;:::o;20734:264::-;20848:4;20886:2;20875:9;20871:18;20863:26;;20899:92;20988:1;20977:9;20973:17;20964:6;20899:92;:::i;:::-;20734:264;;;;:::o;21021:568::-;21094:8;21104:6;21154:3;21147:4;21139:6;21135:17;21131:27;21121:122;;21162:79;;:::i;:::-;21121:122;21275:6;21262:20;21252:30;;21305:18;21297:6;21294:30;21291:117;;;21327:79;;:::i;:::-;21291:117;21441:4;21433:6;21429:17;21417:29;;21495:3;21487:4;21479:6;21475:17;21465:8;21461:32;21458:41;21455:128;;;21502:79;;:::i;:::-;21455:128;21021:568;;;;;:::o;21608:552::-;21665:8;21675:6;21725:3;21718:4;21710:6;21706:17;21702:27;21692:122;;21733:79;;:::i;:::-;21692:122;21846:6;21833:20;21823:30;;21876:18;21868:6;21865:30;21862:117;;;21898:79;;:::i;:::-;21862:117;22012:4;22004:6;22000:17;21988:29;;22066:3;22058:4;22050:6;22046:17;22036:8;22032:32;22029:41;22026:128;;;22073:79;;:::i;:::-;22026:128;21608:552;;;;;:::o;22166:1569::-;22326:6;22334;22342;22350;22358;22366;22374;22382;22431:3;22419:9;22410:7;22406:23;22402:33;22399:120;;;22438:79;;:::i;:::-;22399:120;22558:1;22583:53;22628:7;22619:6;22608:9;22604:22;22583:53;:::i;:::-;22573:63;;22529:117;22685:2;22711:53;22756:7;22747:6;22736:9;22732:22;22711:53;:::i;:::-;22701:63;;22656:118;22841:2;22830:9;22826:18;22813:32;22872:18;22864:6;22861:30;22858:117;;;22894:79;;:::i;:::-;22858:117;23007:80;23079:7;23070:6;23059:9;23055:22;23007:80;:::i;:::-;22989:98;;;;22784:313;23164:2;23153:9;23149:18;23136:32;23195:18;23187:6;23184:30;23181:117;;;23217:79;;:::i;:::-;23181:117;23330:80;23402:7;23393:6;23382:9;23378:22;23330:80;:::i;:::-;23312:98;;;;23107:313;23487:3;23476:9;23472:19;23459:33;23519:18;23511:6;23508:30;23505:117;;;23541:79;;:::i;:::-;23505:117;23654:64;23710:7;23701:6;23690:9;23686:22;23654:64;:::i;:::-;23636:82;;;;23430:298;22166:1569;;;;;;;;;;;:::o;23741:115::-;23826:23;23843:5;23826:23;:::i;:::-;23821:3;23814:36;23741:115;;:::o;23862:218::-;23953:4;23991:2;23980:9;23976:18;23968:26;;24004:69;24070:1;24059:9;24055:17;24046:6;24004:69;:::i;:::-;23862:218;;;;:::o;24086:122::-;24159:24;24177:5;24159:24;:::i;:::-;24152:5;24149:35;24139:63;;24198:1;24195;24188:12;24139:63;24086:122;:::o;24214:139::-;24260:5;24298:6;24285:20;24276:29;;24314:33;24341:5;24314:33;:::i;:::-;24214:139;;;;:::o;24359:652::-;24436:6;24444;24493:2;24481:9;24472:7;24468:23;24464:32;24461:119;;;24499:79;;:::i;:::-;24461:119;24619:1;24644:53;24689:7;24680:6;24669:9;24665:22;24644:53;:::i;:::-;24634:63;;24590:117;24774:2;24763:9;24759:18;24746:32;24805:18;24797:6;24794:30;24791:117;;;24827:79;;:::i;:::-;24791:117;24932:62;24986:7;24977:6;24966:9;24962:22;24932:62;:::i;:::-;24922:72;;24717:287;24359:652;;;;;:::o;25017:99::-;25069:6;25103:5;25097:12;25087:22;;25017:99;;;:::o;25122:169::-;25206:11;25240:6;25235:3;25228:19;25280:4;25275:3;25271:14;25256:29;;25122:169;;;;:::o;25297:246::-;25378:1;25388:113;25402:6;25399:1;25396:13;25388:113;;;25487:1;25482:3;25478:11;25472:18;25468:1;25463:3;25459:11;25452:39;25424:2;25421:1;25417:10;25412:15;;25388:113;;;25535:1;25526:6;25521:3;25517:16;25510:27;25359:184;25297:246;;;:::o;25549:377::-;25637:3;25665:39;25698:5;25665:39;:::i;:::-;25720:71;25784:6;25779:3;25720:71;:::i;:::-;25713:78;;25800:65;25858:6;25853:3;25846:4;25839:5;25835:16;25800:65;:::i;:::-;25890:29;25912:6;25890:29;:::i;:::-;25885:3;25881:39;25874:46;;25641:285;25549:377;;;;:::o;25932:313::-;26045:4;26083:2;26072:9;26068:18;26060:26;;26132:9;26126:4;26122:20;26118:1;26107:9;26103:17;26096:47;26160:78;26233:4;26224:6;26160:78;:::i;:::-;26152:86;;25932:313;;;;:::o;26251:1109::-;26357:6;26365;26373;26381;26389;26397;26446:3;26434:9;26425:7;26421:23;26417:33;26414:120;;;26453:79;;:::i;:::-;26414:120;26573:1;26598:53;26643:7;26634:6;26623:9;26619:22;26598:53;:::i;:::-;26588:63;;26544:117;26700:2;26726:53;26771:7;26762:6;26751:9;26747:22;26726:53;:::i;:::-;26716:63;;26671:118;26828:2;26854:53;26899:7;26890:6;26879:9;26875:22;26854:53;:::i;:::-;26844:63;;26799:118;26956:2;26982:53;27027:7;27018:6;27007:9;27003:22;26982:53;:::i;:::-;26972:63;;26927:118;27112:3;27101:9;27097:19;27084:33;27144:18;27136:6;27133:30;27130:117;;;27166:79;;:::i;:::-;27130:117;27279:64;27335:7;27326:6;27315:9;27311:22;27279:64;:::i;:::-;27261:82;;;;27055:298;26251:1109;;;;;;;;:::o;27366:332::-;27487:4;27525:2;27514:9;27510:18;27502:26;;27538:71;27606:1;27595:9;27591:17;27582:6;27538:71;:::i;:::-;27619:72;27687:2;27676:9;27672:18;27663:6;27619:72;:::i;:::-;27366:332;;;;;:::o;27704:180::-;27752:77;27749:1;27742:88;27849:4;27846:1;27839:15;27873:4;27870:1;27863:15;27890:117;27999:1;27996;27989:12;28013:117;28122:1;28119;28112:12;28136:117;28245:1;28242;28235:12;28259:725;28337:4;28343:6;28399:11;28386:25;28499:1;28493:4;28489:12;28478:8;28462:14;28458:29;28454:48;28434:18;28430:73;28420:168;;28507:79;;:::i;:::-;28420:168;28619:18;28609:8;28605:33;28597:41;;28671:4;28658:18;28648:28;;28699:18;28691:6;28688:30;28685:117;;;28721:79;;:::i;:::-;28685:117;28829:2;28823:4;28819:13;28811:21;;28886:4;28878:6;28874:17;28858:14;28854:38;28848:4;28844:49;28841:136;;;28896:79;;:::i;:::-;28841:136;28350:634;28259:725;;;;;:::o;28990:147::-;29091:11;29128:3;29113:18;;28990:147;;;;:::o;29165:327::-;29279:3;29300:88;29381:6;29376:3;29300:88;:::i;:::-;29293:95;;29398:56;29447:6;29442:3;29435:5;29398:56;:::i;:::-;29479:6;29474:3;29470:16;29463:23;;29165:327;;;;;:::o;29498:291::-;29638:3;29660:103;29759:3;29750:6;29742;29660:103;:::i;:::-;29653:110;;29780:3;29773:10;;29498:291;;;;;:::o;29795:148::-;29897:11;29934:3;29919:18;;29795:148;;;;:::o;29973:330::-;30089:3;30110:89;30192:6;30187:3;30110:89;:::i;:::-;30103:96;;30209:56;30258:6;30253:3;30246:5;30209:56;:::i;:::-;30290:6;30285:3;30281:16;30274:23;;29973:330;;;;;:::o;30309:151::-;30449:3;30445:1;30437:6;30433:14;30426:27;30309:151;:::o;30466:400::-;30626:3;30647:84;30729:1;30724:3;30647:84;:::i;:::-;30640:91;;30740:93;30829:3;30740:93;:::i;:::-;30858:1;30853:3;30849:11;30842:18;;30466:400;;;:::o;30872:741::-;31173:3;31195:105;31296:3;31287:6;31279;31195:105;:::i;:::-;31188:112;;31317:148;31461:3;31317:148;:::i;:::-;31310:155;;31482:105;31583:3;31574:6;31566;31482:105;:::i;:::-;31475:112;;31604:3;31597:10;;30872:741;;;;;;;:::o;31619:79::-;31658:7;31687:5;31676:16;;31619:79;;;:::o;31704:157::-;31809:45;31829:24;31847:5;31829:24;:::i;:::-;31809:45;:::i;:::-;31804:3;31797:58;31704:157;;:::o;31867:256::-;31979:3;31994:75;32065:3;32056:6;31994:75;:::i;:::-;32094:2;32089:3;32085:12;32078:19;;32114:3;32107:10;;31867:256;;;;:::o;32153:317::-;32251:3;32272:71;32336:6;32331:3;32272:71;:::i;:::-;32265:78;;32353:56;32402:6;32397:3;32390:5;32353:56;:::i;:::-;32434:29;32456:6;32434:29;:::i;:::-;32429:3;32425:39;32418:46;;32153:317;;;;;:::o;32476:333::-;32599:4;32637:2;32626:9;32622:18;32614:26;;32686:9;32680:4;32676:20;32672:1;32661:9;32657:17;32650:47;32714:88;32797:4;32788:6;32780;32714:88;:::i;:::-;32706:96;;32476:333;;;;;:::o;32815:114::-;;:::o;32935:398::-;33094:3;33115:83;33196:1;33191:3;33115:83;:::i;:::-;33108:90;;33207:93;33296:3;33207:93;:::i;:::-;33325:1;33320:3;33316:11;33309:18;;32935:398;;;:::o;33339:379::-;33523:3;33545:147;33688:3;33545:147;:::i;:::-;33538:154;;33709:3;33702:10;;33339:379;;;:::o;33724:332::-;33845:4;33883:2;33872:9;33868:18;33860:26;;33896:71;33964:1;33953:9;33949:17;33940:6;33896:71;:::i;:::-;33977:72;34045:2;34034:9;34030:18;34021:6;33977:72;:::i;:::-;33724:332;;;;;:::o;34062:::-;34183:4;34221:2;34210:9;34206:18;34198:26;;34234:71;34302:1;34291:9;34287:17;34278:6;34234:71;:::i;:::-;34315:72;34383:2;34372:9;34368:18;34359:6;34315:72;:::i;:::-;34062:332;;;;;:::o;34400:114::-;34467:6;34501:5;34495:12;34485:22;;34400:114;;;:::o;34520:184::-;34619:11;34653:6;34648:3;34641:19;34693:4;34688:3;34684:14;34669:29;;34520:184;;;;:::o;34710:132::-;34777:4;34800:3;34792:11;;34830:4;34825:3;34821:14;34813:22;;34710:132;;;:::o;34848:108::-;34925:24;34943:5;34925:24;:::i;:::-;34920:3;34913:37;34848:108;;:::o;34962:179::-;35031:10;35052:46;35094:3;35086:6;35052:46;:::i;:::-;35130:4;35125:3;35121:14;35107:28;;34962:179;;;;:::o;35147:113::-;35217:4;35249;35244:3;35240:14;35232:22;;35147:113;;;:::o;35296:732::-;35415:3;35444:54;35492:5;35444:54;:::i;:::-;35514:86;35593:6;35588:3;35514:86;:::i;:::-;35507:93;;35624:56;35674:5;35624:56;:::i;:::-;35703:7;35734:1;35719:284;35744:6;35741:1;35738:13;35719:284;;;35820:6;35814:13;35847:63;35906:3;35891:13;35847:63;:::i;:::-;35840:70;;35933:60;35986:6;35933:60;:::i;:::-;35923:70;;35779:224;35766:1;35763;35759:9;35754:14;;35719:284;;;35723:14;36019:3;36012:10;;35420:608;;;35296:732;;;;:::o;36034:574::-;36225:4;36263:2;36252:9;36248:18;36240:26;;36312:9;36306:4;36302:20;36298:1;36287:9;36283:17;36276:47;36340:78;36413:4;36404:6;36340:78;:::i;:::-;36332:86;;36465:9;36459:4;36455:20;36450:2;36439:9;36435:18;36428:48;36493:108;36596:4;36587:6;36493:108;:::i;:::-;36485:116;;36034:574;;;;;:::o;36614:97::-;36673:6;36701:3;36691:13;;36614:97;;;;:::o;36717:180::-;36765:77;36762:1;36755:88;36862:4;36859:1;36852:15;36886:4;36883:1;36876:15;36903:320;36947:6;36984:1;36978:4;36974:12;36964:22;;37031:1;37025:4;37021:12;37052:18;37042:81;;37108:4;37100:6;37096:17;37086:27;;37042:81;37170:2;37162:6;37159:14;37139:18;37136:38;37133:84;;37189:18;;:::i;:::-;37133:84;36954:269;36903:320;;;:::o;37229:141::-;37278:4;37301:3;37293:11;;37324:3;37321:1;37314:14;37358:4;37355:1;37345:18;37337:26;;37229:141;;;:::o;37376:93::-;37413:6;37460:2;37455;37448:5;37444:14;37440:23;37430:33;;37376:93;;;:::o;37475:107::-;37519:8;37569:5;37563:4;37559:16;37538:37;;37475:107;;;;:::o;37588:393::-;37657:6;37707:1;37695:10;37691:18;37730:97;37760:66;37749:9;37730:97;:::i;:::-;37848:39;37878:8;37867:9;37848:39;:::i;:::-;37836:51;;37920:4;37916:9;37909:5;37905:21;37896:30;;37969:4;37959:8;37955:19;37948:5;37945:30;37935:40;;37664:317;;37588:393;;;;;:::o;37987:142::-;38037:9;38070:53;38088:34;38097:24;38115:5;38097:24;:::i;:::-;38088:34;:::i;:::-;38070:53;:::i;:::-;38057:66;;37987:142;;;:::o;38135:75::-;38178:3;38199:5;38192:12;;38135:75;;;:::o;38216:269::-;38326:39;38357:7;38326:39;:::i;:::-;38387:91;38436:41;38460:16;38436:41;:::i;:::-;38428:6;38421:4;38415:11;38387:91;:::i;:::-;38381:4;38374:105;38292:193;38216:269;;;:::o;38491:73::-;38536:3;38491:73;:::o;38570:189::-;38647:32;;:::i;:::-;38688:65;38746:6;38738;38732:4;38688:65;:::i;:::-;38623:136;38570:189;;:::o;38765:186::-;38825:120;38842:3;38835:5;38832:14;38825:120;;;38896:39;38933:1;38926:5;38896:39;:::i;:::-;38869:1;38862:5;38858:13;38849:22;;38825:120;;;38765:186;;:::o;38957:543::-;39058:2;39053:3;39050:11;39047:446;;;39092:38;39124:5;39092:38;:::i;:::-;39176:29;39194:10;39176:29;:::i;:::-;39166:8;39162:44;39359:2;39347:10;39344:18;39341:49;;;39380:8;39365:23;;39341:49;39403:80;39459:22;39477:3;39459:22;:::i;:::-;39449:8;39445:37;39432:11;39403:80;:::i;:::-;39062:431;;39047:446;38957:543;;;:::o;39506:117::-;39560:8;39610:5;39604:4;39600:16;39579:37;;39506:117;;;;:::o;39629:169::-;39673:6;39706:51;39754:1;39750:6;39742:5;39739:1;39735:13;39706:51;:::i;:::-;39702:56;39787:4;39781;39777:15;39767:25;;39680:118;39629:169;;;;:::o;39803:295::-;39879:4;40025:29;40050:3;40044:4;40025:29;:::i;:::-;40017:37;;40087:3;40084:1;40080:11;40074:4;40071:21;40063:29;;39803:295;;;;:::o;40103:1403::-;40227:44;40267:3;40262;40227:44;:::i;:::-;40336:18;40328:6;40325:30;40322:56;;;40358:18;;:::i;:::-;40322:56;40402:38;40434:4;40428:11;40402:38;:::i;:::-;40487:67;40547:6;40539;40533:4;40487:67;:::i;:::-;40581:1;40610:2;40602:6;40599:14;40627:1;40622:632;;;;41298:1;41315:6;41312:84;;;41371:9;41366:3;41362:19;41349:33;41340:42;;41312:84;41422:67;41482:6;41475:5;41422:67;:::i;:::-;41416:4;41409:81;41271:229;40592:908;;40622:632;40674:4;40670:9;40662:6;40658:22;40708:37;40740:4;40708:37;:::i;:::-;40767:1;40781:215;40795:7;40792:1;40789:14;40781:215;;;40881:9;40876:3;40872:19;40859:33;40851:6;40844:49;40932:1;40924:6;40920:14;40910:24;;40979:2;40968:9;40964:18;40951:31;;40818:4;40815:1;40811:12;40806:17;;40781:215;;;41024:6;41015:7;41012:19;41009:186;;;41089:9;41084:3;41080:19;41067:33;41132:48;41174:4;41166:6;41162:17;41151:9;41132:48;:::i;:::-;41124:6;41117:64;41032:163;41009:186;41241:1;41237;41229:6;41225:14;41221:22;41215:4;41208:36;40629:625;;;40592:908;;40202:1304;;;40103:1403;;;:::o;41512:86::-;41558:7;41587:5;41576:16;;41512:86;;;:::o;41604:160::-;41663:9;41696:62;41714:43;41723:33;41750:5;41723:33;:::i;:::-;41714:43;:::i;:::-;41696:62;:::i;:::-;41683:75;;41604:160;;;:::o;41770:149::-;41866:46;41906:5;41866:46;:::i;:::-;41861:3;41854:59;41770:149;;:::o;41925:350::-;42055:4;42093:2;42082:9;42078:18;42070:26;;42106:71;42174:1;42163:9;42159:17;42150:6;42106:71;:::i;:::-;42187:81;42264:2;42253:9;42249:18;42240:6;42187:81;:::i;:::-;41925:350;;;;;:::o;42281:143::-;42338:5;42369:6;42363:13;42354:22;;42385:33;42412:5;42385:33;:::i;:::-;42281:143;;;;:::o;42430:351::-;42500:6;42549:2;42537:9;42528:7;42524:23;42520:32;42517:119;;;42555:79;;:::i;:::-;42517:119;42675:1;42700:64;42756:7;42747:6;42736:9;42732:22;42700:64;:::i;:::-;42690:74;;42646:128;42430:351;;;;:::o;42787:423::-;42928:4;42966:2;42955:9;42951:18;42943:26;;42979:71;43047:1;43036:9;43032:17;43023:6;42979:71;:::i;:::-;43097:9;43091:4;43087:20;43082:2;43071:9;43067:18;43060:48;43125:78;43198:4;43189:6;43125:78;:::i;:::-;43117:86;;42787:423;;;;;:::o;43216:332::-;43337:4;43375:2;43364:9;43360:18;43352:26;;43388:71;43456:1;43445:9;43441:17;43432:6;43388:71;:::i;:::-;43469:72;43537:2;43526:9;43522:18;43513:6;43469:72;:::i;:::-;43216:332;;;;;:::o;43554:79::-;43593:7;43622:5;43611:16;;43554:79;;;:::o;43639:157::-;43744:45;43764:24;43782:5;43764:24;:::i;:::-;43744:45;:::i;:::-;43739:3;43732:58;43639:157;;:::o;43802:256::-;43914:3;43929:75;44000:3;43991:6;43929:75;:::i;:::-;44029:2;44024:3;44020:12;44013:19;;44049:3;44042:10;;43802:256;;;;:::o;44064:143::-;44121:5;44152:6;44146:13;44137:22;;44168:33;44195:5;44168:33;:::i;:::-;44064:143;;;;:::o;44213:351::-;44283:6;44332:2;44320:9;44311:7;44307:23;44303:32;44300:119;;;44338:79;;:::i;:::-;44300:119;44458:1;44483:64;44539:7;44530:6;44519:9;44515:22;44483:64;:::i;:::-;44473:74;;44429:128;44213:351;;;;:::o;44570:644::-;44767:4;44805:3;44794:9;44790:19;44782:27;;44819:71;44887:1;44876:9;44872:17;44863:6;44819:71;:::i;:::-;44900:72;44968:2;44957:9;44953:18;44944:6;44900:72;:::i;:::-;44982;45050:2;45039:9;45035:18;45026:6;44982:72;:::i;:::-;45101:9;45095:4;45091:20;45086:2;45075:9;45071:18;45064:48;45129:78;45202:4;45193:6;45129:78;:::i;:::-;45121:86;;44570:644;;;;;;;:::o;45220:98::-;45271:6;45305:5;45299:12;45289:22;;45220:98;;;:::o;45324:386::-;45428:3;45456:38;45488:5;45456:38;:::i;:::-;45510:88;45591:6;45586:3;45510:88;:::i;:::-;45503:95;;45607:65;45665:6;45660:3;45653:4;45646:5;45642:16;45607:65;:::i;:::-;45697:6;45692:3;45688:16;45681:23;;45432:278;45324:386;;;;:::o;45716:271::-;45846:3;45868:93;45957:3;45948:6;45868:93;:::i;:::-;45861:100;;45978:3;45971:10;;45716:271;;;;:::o;45993:144::-;46045:4;46068:3;46060:11;;46091:3;46088:1;46081:14;46125:4;46122:1;46112:18;46104:26;;45993:144;;;:::o;46165:878::-;46270:3;46307:5;46301:12;46336:36;46362:9;46336:36;:::i;:::-;46388:88;46469:6;46464:3;46388:88;:::i;:::-;46381:95;;46507:1;46496:9;46492:17;46523:1;46518:166;;;;46698:1;46693:344;;;;46485:552;;46518:166;46602:4;46598:9;46587;46583:25;46578:3;46571:38;46664:6;46657:14;46650:22;46642:6;46638:35;46633:3;46629:45;46622:52;;46518:166;;46693:344;46760:41;46795:5;46760:41;:::i;:::-;46823:1;46837:154;46851:6;46848:1;46845:13;46837:154;;;46925:7;46919:14;46915:1;46910:3;46906:11;46899:35;46975:1;46966:7;46962:15;46951:26;;46873:4;46870:1;46866:12;46861:17;;46837:154;;;47020:6;47015:3;47011:16;47004:23;;46700:337;;46485:552;;46274:769;;46165:878;;;;:::o;47049:273::-;47180:3;47202:94;47292:3;47283:6;47202:94;:::i;:::-;47195:101;;47313:3;47306:10;;47049:273;;;;:::o;47328:116::-;47398:21;47413:5;47398:21;:::i;:::-;47391:5;47388:32;47378:60;;47434:1;47431;47424:12;47378:60;47328:116;:::o;47450:137::-;47504:5;47535:6;47529:13;47520:22;;47551:30;47575:5;47551:30;:::i;:::-;47450:137;;;;:::o;47593:345::-;47660:6;47709:2;47697:9;47688:7;47684:23;47680:32;47677:119;;;47715:79;;:::i;:::-;47677:119;47835:1;47860:61;47913:7;47904:6;47893:9;47889:22;47860:61;:::i;:::-;47850:71;;47806:125;47593:345;;;;:::o;47944:85::-;47989:7;48018:5;48007:16;;47944:85;;;:::o;48035:101::-;48071:7;48111:18;48104:5;48100:30;48089:41;;48035:101;;;:::o;48142:156::-;48199:9;48232:60;48249:42;48258:32;48284:5;48258:32;:::i;:::-;48249:42;:::i;:::-;48232:60;:::i;:::-;48219:73;;48142:156;;;:::o;48304:145::-;48398:44;48436:5;48398:44;:::i;:::-;48393:3;48386:57;48304:145;;:::o;48455:93::-;48491:7;48531:10;48524:5;48520:22;48509:33;;48455:93;;;:::o;48554:156::-;48611:9;48644:60;48661:42;48670:32;48696:5;48670:32;:::i;:::-;48661:42;:::i;:::-;48644:60;:::i;:::-;48631:73;;48554:156;;;:::o;48716:145::-;48810:44;48848:5;48810:44;:::i;:::-;48805:3;48798:57;48716:145;;:::o;48867:1039::-;49179:4;49217:3;49206:9;49202:19;49194:27;;49231:71;49299:1;49288:9;49284:17;49275:6;49231:71;:::i;:::-;49349:9;49343:4;49339:20;49334:2;49323:9;49319:18;49312:48;49377:88;49460:4;49451:6;49443;49377:88;:::i;:::-;49369:96;;49475:72;49543:2;49532:9;49528:18;49519:6;49475:72;:::i;:::-;49557;49625:2;49614:9;49610:18;49601:6;49557:72;:::i;:::-;49639:80;49714:3;49703:9;49699:19;49690:6;49639:80;:::i;:::-;49729;49804:3;49793:9;49789:19;49780:6;49729:80;:::i;:::-;49819;49894:3;49883:9;49879:19;49870:6;49819:80;:::i;:::-;48867:1039;;;;;;;;;;;:::o;49912:678::-;50124:4;50162:3;50151:9;50147:19;50139:27;;50176:71;50244:1;50233:9;50229:17;50220:6;50176:71;:::i;:::-;50257:72;50325:2;50314:9;50310:18;50301:6;50257:72;:::i;:::-;50339;50407:2;50396:9;50392:18;50383:6;50339:72;:::i;:::-;50421;50489:2;50478:9;50474:18;50465:6;50421:72;:::i;:::-;50503:80;50578:3;50567:9;50563:19;50554:6;50503:80;:::i;:::-;49912:678;;;;;;;;:::o;50596:94::-;50629:8;50677:5;50673:2;50669:14;50648:35;;50596:94;;;:::o;50696:::-;50735:7;50764:20;50778:5;50764:20;:::i;:::-;50753:31;;50696:94;;;:::o;50796:100::-;50835:7;50864:26;50884:5;50864:26;:::i;:::-;50853:37;;50796:100;;;:::o;50902:157::-;51007:45;51027:24;51045:5;51027:24;:::i;:::-;51007:45;:::i;:::-;51002:3;50995:58;50902:157;;:::o;51065:256::-;51177:3;51192:75;51263:3;51254:6;51192:75;:::i;:::-;51292:2;51287:3;51283:12;51276:19;;51312:3;51305:10;;51065:256;;;;:::o;51327:168::-;51410:11;51444:6;51439:3;51432:19;51484:4;51479:3;51475:14;51460:29;;51327:168;;;;:::o;51501:373::-;51587:3;51615:38;51647:5;51615:38;:::i;:::-;51669:70;51732:6;51727:3;51669:70;:::i;:::-;51662:77;;51748:65;51806:6;51801:3;51794:4;51787:5;51783:16;51748:65;:::i;:::-;51838:29;51860:6;51838:29;:::i;:::-;51833:3;51829:39;51822:46;;51591:283;51501:373;;;;:::o;51880:529::-;52047:4;52085:2;52074:9;52070:18;52062:26;;52098:71;52166:1;52155:9;52151:17;52142:6;52098:71;:::i;:::-;52179:72;52247:2;52236:9;52232:18;52223:6;52179:72;:::i;:::-;52298:9;52292:4;52288:20;52283:2;52272:9;52268:18;52261:48;52326:76;52397:4;52388:6;52326:76;:::i;:::-;52318:84;;51880:529;;;;;;:::o;52415:85::-;52460:7;52489:5;52478:16;;52415:85;;;:::o;52506:158::-;52564:9;52597:61;52615:42;52624:32;52650:5;52624:32;:::i;:::-;52615:42;:::i;:::-;52597:61;:::i;:::-;52584:74;;52506:158;;;:::o;52670:147::-;52765:45;52804:5;52765:45;:::i;:::-;52760:3;52753:58;52670:147;;:::o;52823:362::-;52964:3;52985:65;53048:1;53043:3;52985:65;:::i;:::-;52978:72;;53059:93;53148:3;53059:93;:::i;:::-;53177:1;53172:3;53168:11;53161:18;;52823:362;;;:::o;53191:875::-;53476:4;53514:3;53503:9;53499:19;53491:27;;53528:71;53596:1;53585:9;53581:17;53572:6;53528:71;:::i;:::-;53609:72;53677:2;53666:9;53662:18;53653:6;53609:72;:::i;:::-;53691;53759:2;53748:9;53744:18;53735:6;53691:72;:::i;:::-;53773:80;53849:2;53838:9;53834:18;53825:6;53773:80;:::i;:::-;53901:9;53895:4;53891:20;53885:3;53874:9;53870:19;53863:49;53929:130;54054:4;53929:130;:::i;:::-;53921:138;;53191:875;;;;;;;:::o;54072:309::-;54183:4;54221:2;54210:9;54206:18;54198:26;;54270:9;54264:4;54260:20;54256:1;54245:9;54241:17;54234:47;54298:76;54369:4;54360:6;54298:76;:::i;:::-;54290:84;;54072:309;;;;:::o

Swarm Source

ipfs://9e30165d1e51815c19ee7df8200294f18043caa9d9640333e0952c2b7c317a5d

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
0xeA80b94a8B339c592c4F08bcCC87De7b57384BDD
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.