ETH Price: $2,536.75 (+0.13%)

Contract

0x3bcBf1480879BFF8435b1534C70B4a5182FB2466
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x615c1a62166152232023-02-12 20:59:59620 days ago1676235599IN
 Create: ChecksArt
0 ETH0.0815379515.8970023

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChecksArt

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : ChecksArt.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "./EightyColors.sol";
import "../interfaces/IChecks.sol";
import "./Utilities.sol";

/**

 /////////   VV CHECKS   /////////
 //                             //
 //                             //
 //                             //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //                             //
 //                             //
 //                             //
 /////   DONT TRUST, CHECK   /////

@title  ChecksArt
@author VisualizeValue
@notice Renders the Checks visuals.
*/
library ChecksArt {

    /// @dev The path for a 20x20 px check based on a 36x36 px frame.
    string public constant CHECKS_PATH = 'M21.36 9.886A3.933 3.933 0 0 0 18 8c-1.423 0-2.67.755-3.36 1.887a3.935 3.935 0 0 0-4.753 4.753A3.933 3.933 0 0 0 8 18c0 1.423.755 2.669 1.886 3.36a3.935 3.935 0 0 0 4.753 4.753 3.933 3.933 0 0 0 4.863 1.59 3.953 3.953 0 0 0 1.858-1.589 3.935 3.935 0 0 0 4.753-4.754A3.933 3.933 0 0 0 28 18a3.933 3.933 0 0 0-1.887-3.36 3.934 3.934 0 0 0-1.042-3.711 3.934 3.934 0 0 0-3.71-1.043Zm-3.958 11.713 4.562-6.844c.566-.846-.751-1.724-1.316-.878l-4.026 6.043-1.371-1.368c-.717-.722-1.836.396-1.116 1.116l2.17 2.15a.788.788 0 0 0 1.097-.22Z';

    /// @dev The semiperfect divisors of the 80 checks.
    function DIVISORS() public pure returns (uint8[8] memory) {
        return [ 80, 40, 20, 10, 5, 4, 1, 0 ];
    }

    /// @dev The different color band sizes that we use for the art.
    function COLOR_BANDS() public pure returns (uint8[7] memory) {
        return [ 80, 60, 40, 20, 10, 5, 1 ];
    }

    /// @dev The gradient increment steps.
    function GRADIENTS() public pure returns (uint8[7] memory) {
        return [ 0, 1, 2, 5, 8, 9, 10 ];
    }

    /// @dev Load a check from storage and fill its current state settings.
    /// @param tokenId The id of the check to fetch.
    /// @param checks The DB containing all checks.
    function getCheck(
        uint256 tokenId, IChecks.Checks storage checks
    ) public view returns (IChecks.Check memory check) {
        IChecks.StoredCheck memory stored = checks.all[tokenId];

        return getCheck(tokenId, stored.divisorIndex, checks);
    }

    /// @dev Load a check from storage and fill its current state settings.
    /// @param tokenId The id of the check to fetch.
    /// @param divisorIndex The divisorindex to get.
    /// @param checks The DB containing all checks.
    function getCheck(
        uint256 tokenId, uint8 divisorIndex, IChecks.Checks storage checks
    ) public view returns (IChecks.Check memory check) {
        IChecks.StoredCheck memory stored = checks.all[tokenId];
        stored.divisorIndex = divisorIndex; // Override in case we're fetching specific state.
        check.stored = stored;

        // Set up the source of randomness + seed for this Check.
        uint128 randomness = checks.epochs[stored.epoch].randomness;
        check.seed = (uint256(keccak256(abi.encodePacked(randomness, stored.seed))) % type(uint128).max);

        // Helpers
        check.isRoot = divisorIndex == 0;
        check.isRevealed = randomness > 0;
        check.hasManyChecks = divisorIndex < 6;
        check.composite = !check.isRoot && divisorIndex < 7 ? stored.composites[divisorIndex - 1] : 0;

        // Token properties
        check.colorBand = colorBandIndex(check, divisorIndex);
        check.gradient = gradientIndex(check, divisorIndex);
        check.checksCount = DIVISORS()[divisorIndex];
        check.speed = uint8(2**(check.seed % 3));
        check.direction = uint8(check.seed % 2);
    }

    /// @dev Query the gradient of a given check at a certain check count.
    /// @param check The check we want to get the gradient for.
    /// @param divisorIndex The check divisor in question.
    function gradientIndex(IChecks.Check memory check, uint8 divisorIndex) public pure returns (uint8) {
        uint256 n = Utilities.random(check.seed, 'gradient', 100);

        return divisorIndex == 0
            ? n < 20 ? uint8(1 + (n % 6)) : 0
            : divisorIndex < 6
                ? check.stored.gradients[divisorIndex - 1]
                : 0;
    }

    /// @dev Query the color band of a given check at a certain check count.
    /// @param check The check we want to get the color band for.
    /// @param divisorIndex The check divisor in question.
    function colorBandIndex(IChecks.Check memory check, uint8 divisorIndex) public pure returns (uint8) {
        uint256 n = Utilities.random(check.seed, 'band', 120);

        return divisorIndex == 0
            ?   ( n > 80 ? 0
                : n > 40 ? 1
                : n > 20 ? 2
                : n > 10 ? 3
                : n >  4 ? 4
                : n >  1 ? 5
                : 6 )
            : divisorIndex < 6
                ? check.stored.colorBands[divisorIndex - 1]
                : 6;
    }

    /// @dev Generate indexes for the color slots of check parents (up to the EightyColors.COLORS themselves).
    /// @param divisorIndex The current divisorIndex to query.
    /// @param check The current check to investigate.
    /// @param checks The DB containing all checks.
    function colorIndexes(
        uint8 divisorIndex, IChecks.Check memory check, IChecks.Checks storage checks
    )
        public view returns (uint256[] memory)
    {
        uint8[8] memory divisors = DIVISORS();
        uint256 checksCount = divisors[divisorIndex];
        uint256 seed = check.seed;
        uint8 colorBand = COLOR_BANDS()[colorBandIndex(check, divisorIndex)];
        uint8 gradient = GRADIENTS()[gradientIndex(check, divisorIndex)];

        // If we're a composited check, we choose colors only based on
        // the slots available in our parents. Otherwise,
        // we choose based on our available spectrum.
        uint256 possibleColorChoices = divisorIndex > 0
            ? divisors[divisorIndex - 1] * 2
            : 80;

        // We initialize our index and select the first color
        uint256[] memory indexes = new uint256[](checksCount);
        indexes[0] = Utilities.random(seed, possibleColorChoices);

        // If we have more than one check, continue selecting colors
        if (check.hasManyChecks) {
            if (gradient > 0) {
                // If we're a gradient check, we select based on the color band looping around
                // the 80 possible colors
                for (uint256 i = 1; i < checksCount;) {
                    indexes[i] = (indexes[0] + (i * gradient * colorBand / checksCount) % colorBand) % 80;
                    unchecked { ++i; }
                }
            } else if (divisorIndex == 0) {
                // If we select initial non gradient colors, we just take random ones
                // available in our color band
                for (uint256 i = 1; i < checksCount;) {
                    indexes[i] = (indexes[0] + Utilities.random(seed + i, colorBand)) % 80;
                    unchecked { ++i; }
                }
            } else {
                // If we have parent checks, we select our colors from their set
                for (uint256 i = 1; i < checksCount;) {
                    indexes[i] = Utilities.random(seed + i, possibleColorChoices);
                    unchecked { ++i; }
                }
            }
        }

        // We resolve our color indexes through our parent tree until we reach the root checks
        if (divisorIndex > 0) {
            uint8 previousDivisor = divisorIndex - 1;

            // We already have our current check, but need the our parent state color indices
            uint256[] memory parentIndexes = colorIndexes(previousDivisor, check, checks);

            // We also need to fetch the colors of the check that was composited into us
            IChecks.Check memory composited = getCheck(check.composite, checks);
            uint256[] memory compositedIndexes = colorIndexes(previousDivisor, composited, checks);

            // Replace random indices with parent / root color indices
            uint8 count = divisors[previousDivisor];

            // We always select the first color from our parent
            uint256 initialBranchIndex = indexes[0] % count;
            indexes[0] = indexes[0] < count
                ? parentIndexes[initialBranchIndex]
                : compositedIndexes[initialBranchIndex];

            // If we don't have a gradient, we continue resolving from our parent for the remaining checks
            if (gradient == 0) {
                for (uint256 i; i < checksCount;) {
                    uint256 branchIndex = indexes[i] % count;
                    indexes[i] = indexes[i] < count
                        ? parentIndexes[branchIndex]
                        : compositedIndexes[branchIndex];

                    unchecked { ++i; }
                }
            // If we have a gradient we base the remaining colors off our initial selection
            } else {
                for (uint256 i = 1; i < checksCount;) {
                    indexes[i] = (indexes[0] + (i * gradient * colorBand / checksCount) % colorBand) % 80;

                    unchecked { ++i; }
                }
            }
        }

        return indexes;
    }

    /// @dev Fetch all colors of a given Check.
    /// @param check The check to get colors for.
    /// @param checks The DB containing all checks.
    function colors(
        IChecks.Check memory check, IChecks.Checks storage checks
    ) public view returns (string[] memory, uint256[] memory) {
        // A fully composited check has no color.
        if (check.stored.divisorIndex == 7) {
            string[] memory zeroColors = new string[](1);
            uint256[] memory zeroIndexes = new uint256[](1);
            zeroColors[0] = '000';
            zeroIndexes[0] = 999;
            return (zeroColors, zeroIndexes);
        }

        // An unrevealed check is all gray.
        if (! check.isRevealed) {
            string[] memory preRevealColors = new string[](1);
            uint256[] memory preRevealIndexes = new uint256[](1);
            preRevealColors[0] = '424242';
            preRevealIndexes[0] = 0;
            return (preRevealColors, preRevealIndexes);
        }

        // Fetch the indices on the original color mapping.
        uint256[] memory indexes = colorIndexes(check.stored.divisorIndex, check, checks);

        // Map over to get the colors.
        string[] memory checkColors = new string[](indexes.length);
        string[80] memory allColors = EightyColors.COLORS();

        // Always set the first color.
        checkColors[0] = allColors[indexes[0]];

        // Resolve each additional check color via their index in EightyColors.COLORS.
        for (uint256 i = 1; i < indexes.length; i++) {
            checkColors[i] = allColors[indexes[i]];
        }

        return (checkColors, indexes);
    }

    /// @dev Get the number of checks we should display per row.
    /// @param checks The number of checks in the piece.
    function perRow(uint8 checks) public pure returns (uint8) {
        return checks == 80
            ? 8
            : checks >= 20
                ? 4
                : checks == 10 || checks == 4
                    ? 2
                    : 1;
    }

    /// @dev Get the X-offset for positioning checks horizontally.
    /// @param checks The number of checks in the piece.
    function rowX(uint8 checks) public pure returns (uint16) {
        return checks <= 1
            ? 286
            : checks == 5
                ? 304
                : checks == 10 || checks == 4
                    ? 268
                    : 196;
    }

    /// @dev Get the Y-offset for positioning checks vertically.
    /// @param checks The number of checks in the piece.
    function rowY(uint8 checks) public pure returns (uint16) {
        return checks > 4
            ? 160
            : checks == 4
                ? 268
                : checks > 1
                    ? 304
                    : 286;
    }

    /// @dev Get the animation SVG snipped for an individual check of a piece.
    /// @param data The data object containing rendering settings.
    /// @param offset The index position of the check in question.
    /// @param allColors All available colors.
    function fillAnimation(
        CheckRenderData memory data,
        uint256 offset,
        string[80] memory allColors
    ) public pure returns (bytes memory)
    {
        // We only pick 20 colors from our gradient to reduce execution time.
        uint8 count = 20;

        bytes memory values;

        // Reverse loop through our color gradient.
        if (data.check.direction == 0) {
            for (uint256 i = offset + 80; i > offset;) {
                values = abi.encodePacked(values, '#', allColors[i % 80], ';');
                unchecked { i-=4; }
            }
        // Forward loop through our color gradient.
        } else {
            for (uint256 i = offset; i < offset + 80;) {
                values = abi.encodePacked(values, '#', allColors[i % 80], ';');
                unchecked { i+=4; }
            }
        }

        // Add initial color as last one for smooth animations.
        values = abi.encodePacked(values, '#', allColors[offset]);

        // Render the SVG snipped for the animation
        return abi.encodePacked(
            '<animate ',
                'attributeName="fill" values="',values,'" ',
                'dur="',Utilities.uint2str(count * 2 / data.check.speed),'s" begin="animation.begin" ',
                'repeatCount="indefinite" ',
            '/>'
        );
    }

    /// @dev Generate the SVG code for all checks in a given token.
    /// @param data The data object containing rendering settings.
    function generateChecks(CheckRenderData memory data) public pure returns (bytes memory) {
        bytes memory checksBytes;
        string[80] memory allColors = EightyColors.COLORS();

        uint8 checksCount = data.count;
        for (uint8 i; i < checksCount; i++) {
            // Compute row settings.
            data.indexInRow = i % data.perRow;
            data.isNewRow = data.indexInRow == 0 && i > 0;

            // Compute offsets.
            if (data.isNewRow) data.rowY += data.spaceY;
            if (data.isNewRow && data.indent) {
                if (i == 0) {
                    data.rowX += data.spaceX / 2;
                }

                if (i % (data.perRow * 2) == 0) {
                    data.rowX -= data.spaceX / 2;
                } else {
                    data.rowX += data.spaceX / 2;
                }
            }
            string memory translateX = Utilities.uint2str(data.rowX + data.indexInRow * data.spaceX);
            string memory translateY = Utilities.uint2str(data.rowY);
            string memory color = data.check.isRevealed ? data.colors[i] : data.colors[0];

            // Render the current check.
            checksBytes = abi.encodePacked(checksBytes, abi.encodePacked(
                '<g transform="translate(', translateX, ', ', translateY, ') scale(', data.scale, ')">',
                    '<use href="#check" fill="#', color, '">',
                        (data.check.isRevealed && !data.isBlack)
                            ? fillAnimation(data, data.colorIndexes[i], allColors)
                            : bytes(''),
                    '</use>'
                '</g>'
            ));
        }

        return checksBytes;
    }

    /// @dev Collect relevant rendering data for easy access across functions.
    /// @param check Our current check loaded from storage.
    /// @param checks The DB containing all checks.
    function collectRenderData(
        IChecks.Check memory check, IChecks.Checks storage checks
    ) public view returns (CheckRenderData memory data) {
        // Carry through base settings.
        data.check = check;
        data.isBlack = check.stored.divisorIndex == 7;
        data.count = data.isBlack ? 1 : DIVISORS()[check.stored.divisorIndex];

        // Compute colors and indexes.
        (string[] memory colors_, uint256[] memory colorIndexes_) = colors(check, checks);
        data.gridColor = data.isBlack ? '#F2F2F2' : '#191919';
        data.canvasColor = data.isBlack ? '#FFF' : '#111';
        data.colorIndexes = colorIndexes_;
        data.colors = colors_;

        // Compute positioning data.
        data.scale = data.count > 20 ? '1' : data.count > 1 ? '2' : '3';
        data.spaceX = data.count == 80 ? 36 : 72;
        data.spaceY = data.count > 20 ? 36 : 72;
        data.perRow = perRow(data.count);
        data.indent = data.count == 40;
        data.rowX = rowX(data.count);
        data.rowY = rowY(data.count);
    }

    /// @dev Generate the SVG code for rows in the 8x10 Checks grid.
    function generateGridRow() public pure returns (bytes memory) {
        bytes memory row;
        for (uint256 i; i < 8; i++) {
            row = abi.encodePacked(
                row,
                '<use href="#square" x="', Utilities.uint2str(196 + i*36), '" y="160"/>'
            );
        }
        return row;
    }

    /// @dev Generate the SVG code for the entire 8x10 Checks grid.
    function generateGrid() public pure returns (bytes memory) {
        bytes memory grid;
        for (uint256 i; i < 10; i++) {
            grid = abi.encodePacked(
                grid,
                '<use href="#row" y="', Utilities.uint2str(i*36), '"/>'
            );
        }

        return abi.encodePacked('<g id="grid" x="196" y="160">', grid, '</g>');
    }

    /// @dev Generate the complete SVG code for a given Check.
    /// @param check The check to render.
    /// @param checks The DB containing all checks.
    function generateSVG(
        IChecks.Check memory check, IChecks.Checks storage checks
    ) public view returns (bytes memory) {
        CheckRenderData memory data = collectRenderData(check, checks);

        return abi.encodePacked(
            '<svg ',
                'viewBox="0 0 680 680" ',
                'fill="none" xmlns="http://www.w3.org/2000/svg" ',
                'style="width:100%;background:black;"',
            '>',
                '<defs>',
                    '<path id="check" fill-rule="evenodd" d="', CHECKS_PATH, '"></path>',
                    '<rect id="square" width="36" height="36" stroke="', data.gridColor, '"></rect>',
                    '<g id="row">', generateGridRow(), '</g>'
                '</defs>',
                '<rect width="680" height="680" fill="black"/>',
                '<rect x="188" y="152" width="304" height="376" fill="', data.canvasColor, '"/>',
                generateGrid(),
                generateChecks(data),
                '<rect width="680" height="680" fill="transparent">',
                    '<animate ',
                        'attributeName="width" ',
                        'from="680" ',
                        'to="0" ',
                        'dur="0.2s" ',
                        'begin="click" ',
                        'fill="freeze" ',
                        'id="animation"',
                    '/>',
                '</rect>',
            '</svg>'
        );
    }
}

/// @dev Bag holding all data relevant for rendering.
struct CheckRenderData {
    IChecks.Check check;
    uint256[] colorIndexes;
    string[] colors;
    string canvasColor;
    string gridColor;
    string duration;
    string scale;
    uint32 seed;
    uint16 rowX;
    uint16 rowY;
    uint8 count;
    uint8 spaceX;
    uint8 spaceY;
    uint8 perRow;
    uint8 indexInRow;
    uint8 isIndented;
    bool isNewRow;
    bool isBlack;
    bool indent;
}

File 2 of 4 : IChecks.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IChecks {

    struct StoredCheck {
        uint16[6] composites;  // The tokenIds that were composited into this one
        uint8[5] colorBands;  // The length of the used color band in percent
        uint8[5] gradients;  // Gradient settings for each generation
        uint8 divisorIndex; // Easy access to next / previous divisor
        uint32 epoch;      // Each check is revealed in an epoch
        uint16 seed;      // A unique identifyer to enable swapping
        uint24 day;      // The days since token was created
    }

    struct Check {
        StoredCheck stored;    // We carry over the check from storage
        bool isRevealed;      // Whether the check is revealed
        uint256 seed;        // The instantiated seed for pseudo-randomisation

        uint8 checksCount;    // How many checks this token has
        bool hasManyChecks;  // Whether the check has many checks
        uint16 composite;   // The parent tokenId that was composited into this one
        bool isRoot;       // Whether it has no parents (80 checks)

        uint8 colorBand;    // 100%, 50%, 25%, 12.5%, 6.25%, 5%, 1.25%
        uint8 gradient;    // Linearly through the colorBand [1, 2, 3]
        uint8 direction;  // Animation direction
        uint8 speed;     // Animation speed
    }

    struct Epoch {
        uint128 randomness;    // The source of randomness for tokens from this epoch
        uint64 revealBlock;   // The block at which this epoch was / is revealed
        bool committed;      // Whether the epoch has been instantiated
        bool revealed;      // Whether the epoch has been revealed
    }

    struct Checks {
        mapping(uint256 => StoredCheck) all; // All checks
        uint32 minted;  // The number of checks editions that have been migrated
        uint32 burned;  // The number of tokens that have been burned
        uint32 day0;    // Marks the start of this journey

        mapping(uint256 => Epoch) epochs; // All epochs
        uint256 epoch;  // The current epoch index
    }

    event Sacrifice(
        uint256 indexed burnedId,
        uint256 indexed tokenId
    );

    event Composite(
        uint256 indexed tokenId,
        uint256 indexed burnedId,
        uint8 indexed checks
    );

    event Infinity(
        uint256 indexed tokenId,
        uint256[] indexed burnedIds
    );

    event NewEpoch(
        uint256 indexed epoch,
        uint64 indexed revealBlock
    );

    error NotAllowed();
    error InvalidTokenCount();
    error BlackCheck__InvalidCheck();

}

File 3 of 4 : EightyColors.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**

 /////////////////////////////////
 //                             //
 //                             //
 //                             //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //       ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓       //
 //                             //
 //                             //
 //                             //
 /////////////////////////////////

@title  EightyColors
@author VisualizeValue
@notice The eighty colors of Checks.
*/
library EightyColors {

    /// @dev Theese are sorted in a gradient.
    function COLORS() public pure returns (string[80] memory) {
        return [
            'E84AA9',
            'F2399D',
            'DB2F96',
            'E73E85',
            'FF7F8E',
            'FA5B67',
            'E8424E',
            'D5332F',
            'C23532',
            'F2281C',
            'D41515',
            '9D262F',
            'DE3237',
            'DA3321',
            'EA3A2D',
            'EB4429',
            'EC7368',
            'FF8079',
            'FF9193',
            'EA5B33',
            'D05C35',
            'ED7C30',
            'EF9933',
            'EF8C37',
            'F18930',
            'F09837',
            'F9A45C',
            'F2A43A',
            'F2A840',
            'F2A93C',
            'FFB340',
            'F2B341',
            'FAD064',
            'F7CA57',
            'F6CB45',
            'FFAB00',
            'F4C44A',
            'FCDE5B',
            'F9DA4D',
            'F9DA4A',
            'FAE272',
            'F9DB49',
            'FAE663',
            'FBEA5B',
            'A7CA45',
            'B5F13B',
            '94E337',
            '63C23C',
            '86E48E',
            '77E39F',
            '5FCD8C',
            '83F1AE',
            '9DEFBF',
            '2E9D9A',
            '3EB8A1',
            '5FC9BF',
            '77D3DE',
            '6AD1DE',
            '5ABAD3',
            '4291A8',
            '33758D',
            '45B2D3',
            '81D1EC',
            'A7DDF9',
            '9AD9FB',
            'A4C8EE',
            '60B1F4',
            '2480BD',
            '4576D0',
            '3263D0',
            '2E4985',
            '25438C',
            '525EAA',
            '3D43B3',
            '322F92',
            '4A2387',
            '371471',
            '3B088C',
            '6C31D7',
            '9741DA'
        ];
    }

}

File 4 of 4 : Utilities.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

library Utilities {
    /// @dev Zero-index based pseudorandom number based on one input and max bound
    function random(uint256 input, uint256 _max) internal pure returns (uint256) {
        return (uint256(keccak256(abi.encodePacked(input))) % _max);
    }

    /// @dev Zero-index based salted pseudorandom number based on two inputs and max bound
    function random(uint256 input, string memory salt, uint256 _max) internal pure returns (uint256) {
        return (uint256(keccak256(abi.encodePacked(input, salt))) % _max);
    }

    /// @dev Convert an integer to a string
    function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            ++len;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    /// @dev Get the smallest non zero number
    function minGt0(uint8 one, uint8 two) internal pure returns (uint8) {
        return one > two
            ? two > 0
                ? two
                : one
            : one;
    }

    /// @dev Get the smaller number
    function min(uint8 one, uint8 two) internal pure returns (uint8) {
        return one < two ? one : two;
    }

    /// @dev Get the larger number
    function max(uint8 one, uint8 two) internal pure returns (uint8) {
        return one > two ? one : two;
    }

    /// @dev Get the average between two numbers
    function avg(uint8 one, uint8 two) internal pure returns (uint8 result) {
        unchecked {
            result = (one >> 1) + (two >> 1) + (one & two & 1);
        }
    }

    /// @dev Get the days since another date (input is seconds)
    function day(uint256 from, uint256 to) internal pure returns (uint24) {
        return uint24((to - from) / 24 hours + 1);
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {
    "contracts/libraries/EightyColors.sol": {
      "EightyColors": "0x3ee78a90f3a812b68b022f1005c326fa006bcb89"
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"CHECKS_PATH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLOR_BANDS","outputs":[{"internalType":"uint8[7]","name":"","type":"uint8[7]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"DIVISORS","outputs":[{"internalType":"uint8[8]","name":"","type":"uint8[8]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"GRADIENTS","outputs":[{"internalType":"uint8[7]","name":"","type":"uint8[7]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint16[6]","name":"composites","type":"uint16[6]"},{"internalType":"uint8[5]","name":"colorBands","type":"uint8[5]"},{"internalType":"uint8[5]","name":"gradients","type":"uint8[5]"},{"internalType":"uint8","name":"divisorIndex","type":"uint8"},{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"uint24","name":"day","type":"uint24"}],"internalType":"struct IChecks.StoredCheck","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint8","name":"checksCount","type":"uint8"},{"internalType":"bool","name":"hasManyChecks","type":"bool"},{"internalType":"uint16","name":"composite","type":"uint16"},{"internalType":"bool","name":"isRoot","type":"bool"},{"internalType":"uint8","name":"colorBand","type":"uint8"},{"internalType":"uint8","name":"gradient","type":"uint8"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"speed","type":"uint8"}],"internalType":"struct IChecks.Check","name":"check","type":"tuple"},{"internalType":"uint8","name":"divisorIndex","type":"uint8"}],"name":"colorBandIndex","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"internalType":"uint16[6]","name":"composites","type":"uint16[6]"},{"internalType":"uint8[5]","name":"colorBands","type":"uint8[5]"},{"internalType":"uint8[5]","name":"gradients","type":"uint8[5]"},{"internalType":"uint8","name":"divisorIndex","type":"uint8"},{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"uint24","name":"day","type":"uint24"}],"internalType":"struct IChecks.StoredCheck","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint8","name":"checksCount","type":"uint8"},{"internalType":"bool","name":"hasManyChecks","type":"bool"},{"internalType":"uint16","name":"composite","type":"uint16"},{"internalType":"bool","name":"isRoot","type":"bool"},{"internalType":"uint8","name":"colorBand","type":"uint8"},{"internalType":"uint8","name":"gradient","type":"uint8"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"speed","type":"uint8"}],"internalType":"struct IChecks.Check","name":"check","type":"tuple"},{"internalType":"uint256[]","name":"colorIndexes","type":"uint256[]"},{"internalType":"string[]","name":"colors","type":"string[]"},{"internalType":"string","name":"canvasColor","type":"string"},{"internalType":"string","name":"gridColor","type":"string"},{"internalType":"string","name":"duration","type":"string"},{"internalType":"string","name":"scale","type":"string"},{"internalType":"uint32","name":"seed","type":"uint32"},{"internalType":"uint16","name":"rowX","type":"uint16"},{"internalType":"uint16","name":"rowY","type":"uint16"},{"internalType":"uint8","name":"count","type":"uint8"},{"internalType":"uint8","name":"spaceX","type":"uint8"},{"internalType":"uint8","name":"spaceY","type":"uint8"},{"internalType":"uint8","name":"perRow","type":"uint8"},{"internalType":"uint8","name":"indexInRow","type":"uint8"},{"internalType":"uint8","name":"isIndented","type":"uint8"},{"internalType":"bool","name":"isNewRow","type":"bool"},{"internalType":"bool","name":"isBlack","type":"bool"},{"internalType":"bool","name":"indent","type":"bool"}],"internalType":"struct CheckRenderData","name":"data","type":"tuple"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"string[80]","name":"allColors","type":"string[80]"}],"name":"fillAnimation","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"internalType":"uint16[6]","name":"composites","type":"uint16[6]"},{"internalType":"uint8[5]","name":"colorBands","type":"uint8[5]"},{"internalType":"uint8[5]","name":"gradients","type":"uint8[5]"},{"internalType":"uint8","name":"divisorIndex","type":"uint8"},{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"uint24","name":"day","type":"uint24"}],"internalType":"struct IChecks.StoredCheck","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint8","name":"checksCount","type":"uint8"},{"internalType":"bool","name":"hasManyChecks","type":"bool"},{"internalType":"uint16","name":"composite","type":"uint16"},{"internalType":"bool","name":"isRoot","type":"bool"},{"internalType":"uint8","name":"colorBand","type":"uint8"},{"internalType":"uint8","name":"gradient","type":"uint8"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"speed","type":"uint8"}],"internalType":"struct IChecks.Check","name":"check","type":"tuple"},{"internalType":"uint256[]","name":"colorIndexes","type":"uint256[]"},{"internalType":"string[]","name":"colors","type":"string[]"},{"internalType":"string","name":"canvasColor","type":"string"},{"internalType":"string","name":"gridColor","type":"string"},{"internalType":"string","name":"duration","type":"string"},{"internalType":"string","name":"scale","type":"string"},{"internalType":"uint32","name":"seed","type":"uint32"},{"internalType":"uint16","name":"rowX","type":"uint16"},{"internalType":"uint16","name":"rowY","type":"uint16"},{"internalType":"uint8","name":"count","type":"uint8"},{"internalType":"uint8","name":"spaceX","type":"uint8"},{"internalType":"uint8","name":"spaceY","type":"uint8"},{"internalType":"uint8","name":"perRow","type":"uint8"},{"internalType":"uint8","name":"indexInRow","type":"uint8"},{"internalType":"uint8","name":"isIndented","type":"uint8"},{"internalType":"bool","name":"isNewRow","type":"bool"},{"internalType":"bool","name":"isBlack","type":"bool"},{"internalType":"bool","name":"indent","type":"bool"}],"internalType":"struct CheckRenderData","name":"data","type":"tuple"}],"name":"generateChecks","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"generateGrid","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"generateGridRow","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint16[6]","name":"composites","type":"uint16[6]"},{"internalType":"uint8[5]","name":"colorBands","type":"uint8[5]"},{"internalType":"uint8[5]","name":"gradients","type":"uint8[5]"},{"internalType":"uint8","name":"divisorIndex","type":"uint8"},{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"uint24","name":"day","type":"uint24"}],"internalType":"struct IChecks.StoredCheck","name":"stored","type":"tuple"},{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint8","name":"checksCount","type":"uint8"},{"internalType":"bool","name":"hasManyChecks","type":"bool"},{"internalType":"uint16","name":"composite","type":"uint16"},{"internalType":"bool","name":"isRoot","type":"bool"},{"internalType":"uint8","name":"colorBand","type":"uint8"},{"internalType":"uint8","name":"gradient","type":"uint8"},{"internalType":"uint8","name":"direction","type":"uint8"},{"internalType":"uint8","name":"speed","type":"uint8"}],"internalType":"struct IChecks.Check","name":"check","type":"tuple"},{"internalType":"uint8","name":"divisorIndex","type":"uint8"}],"name":"gradientIndex","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"checks","type":"uint8"}],"name":"perRow","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"checks","type":"uint8"}],"name":"rowX","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"checks","type":"uint8"}],"name":"rowY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"pure","type":"function"}]

615c1a62000054600b82828239805160001a607314610047577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061012b5760003560e01c80639628b417116100b7578063ba44e5071161007b578063ba44e50714610389578063bd42d47e146103b9578063deac370e146103d7578063e8f83cf814610407578063fd1a1246146104255761012b565b80639628b41714610298578063980cd343146102c8578063993e246f146102f85780639dfc01cf14610328578063ae2a8861146103585761012b565b80638b783628116100fe5780638b783628146101a85780638cfea61c146101d857806390d5017114610208578063911508ff1461023857806392e5dbb0146102685761012b565b80632fba26d314610130578063400650cb1461014e57806348fb0f871461016c57806353bfca201461018a575b600080fd5b610138610455565b6040516101459190612717565b60405180910390f35b6101566104b1565b60405161016391906127c2565b60405180910390f35b61017461051f565b60405161018191906127c2565b60405180910390f35b6101926105a0565b60405161019f9190612868565b60405180910390f35b6101c260048036038101906101bd91906128c4565b610607565b6040516101cf919061290e565b60405180910390f35b6101f260048036038101906101ed9190612e2e565b61065d565b6040516101ff91906127c2565b60405180910390f35b610222600480360381019061021d9190612e70565b6106d9565b60405161022f91906131aa565b60405180910390f35b610252600480360381019061024d91906128c4565b610af7565b60405161025f91906131d5565b60405180910390f35b610282600480360381019061027d9190613783565b610b4a565b60405161028f91906127c2565b60405180910390f35b6102b260048036038101906102ad9190612e2e565b610cdb565b6040516102bf9190613c7d565b60405180910390f35b6102e260048036038101906102dd9190613c9f565b61103a565b6040516102ef91906131d5565b60405180910390f35b610312600480360381019061030d9190613c9f565b611109565b60405161031f91906131d5565b60405180910390f35b610342600480360381019061033d9190613ce1565b611211565b60405161034f91906127c2565b60405180910390f35b610372600480360381019061036d9190612e2e565b61159c565b604051610380929190613e1f565b60405180910390f35b6103a3600480360381019061039e9190613e56565b6119bd565b6040516103b091906131aa565b60405180910390f35b6103c1611bca565b6040516103ce9190613ee0565b60405180910390f35b6103f160048036038101906103ec91906128c4565b611be9565b6040516103fe919061290e565b60405180910390f35b61040f611c30565b60405161041c9190612717565b60405180910390f35b61043f600480360381019061043a9190613f02565b611c8c565b60405161044c9190613f57565b60405180910390f35b61045d61243e565b6040518060e00160405280605060ff168152602001603c60ff168152602001602860ff168152602001601460ff168152602001600a60ff168152602001600560ff168152602001600160ff16815250905090565b60608060005b600881101561051757816104e26024836104d19190613fa8565b60c46104dd9190613fea565b612237565b6040516020016104f392919061412e565b6040516020818303038152906040529150808061050f90614168565b9150506104b7565b508091505090565b60608060005b600a811015610579578161054460248361053f9190613fa8565b612237565b604051602001610555929190614248565b6040516020818303038152906040529150808061057190614168565b915050610525565b508060405160200161058b919061431a565b60405160208183030381529060405291505090565b6105a8612460565b604051806101000160405280605060ff168152602001602860ff168152602001601460ff168152602001600a60ff168152602001600560ff168152602001600460ff168152602001600160ff168152602001600060ff16815250905090565b600060018260ff1611156106525760058260ff161461064957600a8260ff161480610635575060048260ff16145b6106405760c4610644565b61010c5b61064d565b6101305b610656565b61011e5b9050919050565b6060600061066b8484610cdb565b905060405180610240016040528061021281526020016159d3610212913981608001516106966104b1565b83606001516106a361051f565b6106ac86611211565b6040516020016106c196959493929190614c09565b60405160208183030381529060405291505092915050565b6106e1612483565b60008260000160008681526020019081526020016000206040518060e001604052908160008201600680602002604051908101604052809291908260068015610767576020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161072e5790505b50505050508152602001600182016005806020026040519081016040528092919082600580156107d2576020028201916000905b82829054906101000a900460ff1660ff168152602001906001019060208260000104928301926001038202915080841161079b5790505b505050505081526020016002820160058060200260405190810160405280929190826005801561083d576020028201916000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116108065790505b505050505081526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016003820160079054906101000a900462ffffff1662ffffff1662ffffff1681525050905083816060019060ff16908160ff16815250508082600001819052506000836002016000836080015163ffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff1690506fffffffffffffffffffffffffffffffff8016818360a00151604051602001610956929190614e12565b6040516020818303038152906040528051906020012060001c6109799190614e6d565b83604001818152505060008560ff16148360c00190151590811515815250506000816fffffffffffffffffffffffffffffffff161183602001901515908115158152505060068560ff16108360800190151590811515815250508260c001511580156109e8575060078560ff16105b6109f3576000610a1f565b8160000151600186610a059190614e9e565b60ff1660068110610a1957610a18614ed3565b5b60200201515b8360a0019061ffff16908161ffff1681525050610a3c8386611109565b8360e0019060ff16908160ff1681525050610a57838661103a565b83610100019060ff16908160ff1681525050610a716105a0565b8560ff1660088110610a8657610a85614ed3565b5b6020020151836060019060ff16908160ff168152505060038360400151610aad9190614e6d565b6002610ab99190615035565b83610140019060ff16908160ff168152505060028360400151610adc9190614e6d565b83610120019060ff16908160ff168152505050509392505050565b600060508260ff1614610b405760148260ff161015610b3857600a8260ff161480610b25575060048260ff16145b610b30576001610b33565b60025b610b3b565b60045b610b43565b60085b9050919050565b6060600060149050606060008660000151610120015160ff1603610bda576000605086610b779190613fea565b90505b85811115610bd4578185605083610b919190614e6d565b60508110610ba257610ba1614ed3565b5b6020020151604051602001610bb8929190615118565b6040516020818303038152906040529150600481039050610b7a565b50610c48565b60008590505b605086610bed9190613fea565b811015610c46578185605083610c039190614e6d565b60508110610c1457610c13614ed3565b5b6020020151604051602001610c2a929190615118565b6040516020818303038152906040529150600481019050610be0565b505b80848660508110610c5c57610c5b614ed3565b5b6020020151604051602001610c72929190615152565b604051602081830303815290604052905080610cb087600001516101400151600285610c9e9190615181565b610ca891906151be565b60ff16612237565b604051602001610cc192919061536b565b604051602081830303815290604052925050509392505050565b610ce36124fc565b828160000181905250600783600001516060015160ff161481610220019015159081151581525050806102200151610d4457610d1d6105a0565b83600001516060015160ff1660088110610d3a57610d39614ed3565b5b6020020151610d47565b60015b81610140019060ff16908160ff1681525050600080610d66858561159c565b91509150826102200151610daf576040518060400160405280600781526020017f2331393139313900000000000000000000000000000000000000000000000000815250610de6565b6040518060400160405280600781526020017f23463246324632000000000000000000000000000000000000000000000000008152505b8360800181905250826102200151610e33576040518060400160405280600481526020017f2331313100000000000000000000000000000000000000000000000000000000815250610e6a565b6040518060400160405280600481526020017f23464646000000000000000000000000000000000000000000000000000000008152505b8360600181905250808360200181905250818360400181905250601483610140015160ff1611610f1b57600183610140015160ff1611610edf576040518060400160405280600181526020017f3300000000000000000000000000000000000000000000000000000000000000815250610f16565b6040518060400160405280600181526020017f32000000000000000000000000000000000000000000000000000000000000008152505b610f52565b6040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152505b8360c00181905250605083610140015160ff1614610f71576048610f74565b60245b83610160019060ff16908160ff1681525050601483610140015160ff1611610f9d576048610fa0565b60245b83610180019060ff16908160ff1681525050610fc0836101400151610af7565b836101a0019060ff16908160ff1681525050602883610140015160ff161483610240019015159081151581525050610ffc836101400151610607565b83610100019061ffff16908161ffff168152505061101e836101400151611be9565b83610120019061ffff16908161ffff1681525050505092915050565b60008061108284604001516040518060400160405280600881526020017f6772616469656e7400000000000000000000000000000000000000000000000081525060646123bd565b905060008360ff16146110d65760068360ff16106110a15760006110d1565b8360000151604001516001846110b79190614e9e565b60ff16600581106110cb576110ca614ed3565b5b60200201515b611100565b601481106110e55760006110ff565b6006816110f29190614e6d565b60016110fe9190613fea565b5b5b91505092915050565b60008061115184604001516040518060400160405280600481526020017f62616e640000000000000000000000000000000000000000000000000000000081525060786123bd565b905060008360ff16146111a55760068360ff16106111705760066111a0565b8360000151602001516001846111869190614e9e565b60ff166005811061119a57611199614ed3565b5b60200201515b611208565b6050811161120457602881116111fc57601481116111f457600a81116111ec57600481116111e457600181116111dc5760066111df565b60055b6111e7565b60045b6111ef565b60035b6111f7565b60025b6111ff565b60015b611207565b60005b5b91505092915050565b6060806000733ee78a90f3a812b68b022f1005c326fa006bcb89635022b5e96040518163ffffffff1660e01b8152600401600060405180830381865af415801561125f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061128891906154f5565b90506000846101400151905060005b8160ff168160ff16101561159057856101a00151816112b6919061553e565b866101c0019060ff16908160ff16815250506000866101c0015160ff161480156112e3575060008160ff16115b866102000190151590811515815250508561020001511561132b5785610180015160ff168661012001818151611319919061556f565b91509061ffff16908161ffff16815250505b856102000151801561133f57508561024001515b156114265760008160ff160361138857600286610160015161136191906151be565b60ff168661010001818151611376919061556f565b91509061ffff16908161ffff16815250505b60006002876101a0015161139c9190615181565b826113a7919061553e565b60ff16036113ec5760028661016001516113c191906151be565b60ff1686610100018181516113d691906155a5565b91509061ffff16908161ffff1681525050611425565b60028661016001516113fe91906151be565b60ff168661010001818151611413919061556f565b91509061ffff16908161ffff16815250505b5b600061145d876101600151886101c001516114419190615181565b60ff16886101000151611454919061556f565b61ffff16612237565b9050600061147388610120015161ffff16612237565b905060008860000151602001516114a957886040015160008151811061149c5761149b614ed3565b5b60200260200101516114cc565b88604001518460ff16815181106114c3576114c2614ed3565b5b60200260200101515b90508683838b60c00151848d600001516020015180156114ef57508d6102200151155b6115085760405180602001604052806000815250611535565b6115348e8f602001518b60ff168151811061152657611525614ed3565b5b60200260200101518d610b4a565b5b6040516020016115499594939291906157ef565b604051602081830303815290604052604051602001611569929190615887565b60405160208183030381529060405296505050508080611588906158ab565b915050611297565b50829350505050919050565b606080600784600001516060015160ff16036116d8576000600167ffffffffffffffff8111156115cf576115ce61292e565b5b60405190808252806020026020018201604052801561160257816020015b60608152602001906001900390816115ed5790505b5090506000600167ffffffffffffffff8111156116225761162161292e565b5b6040519080825280602002602001820160405280156116505781602001602082028036833780820191505090505b5090506040518060400160405280600381526020017f30303000000000000000000000000000000000000000000000000000000000008152508260008151811061169d5761169c614ed3565b5b60200260200101819052506103e7816000815181106116bf576116be614ed3565b5b60200260200101818152505081819350935050506119b6565b8360200151611806576000600167ffffffffffffffff8111156116fe576116fd61292e565b5b60405190808252806020026020018201604052801561173157816020015b606081526020019060019003908161171c5790505b5090506000600167ffffffffffffffff8111156117515761175061292e565b5b60405190808252806020026020018201604052801561177f5781602001602082028036833780820191505090505b5090506040518060400160405280600681526020017f3432343234320000000000000000000000000000000000000000000000000000815250826000815181106117cc576117cb614ed3565b5b60200260200101819052506000816000815181106117ed576117ec614ed3565b5b60200260200101818152505081819350935050506119b6565b600061181b8560000151606001518686611c8c565b90506000815167ffffffffffffffff81111561183a5761183961292e565b5b60405190808252806020026020018201604052801561186d57816020015b60608152602001906001900390816118585790505b5090506000733ee78a90f3a812b68b022f1005c326fa006bcb89635022b5e96040518163ffffffff1660e01b8152600401600060405180830381865af41580156118bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118e491906154f5565b905080836000815181106118fb576118fa614ed3565b5b60200260200101516050811061191457611913614ed3565b5b60200201518260008151811061192d5761192c614ed3565b5b60200260200101819052506000600190505b83518110156119ab578184828151811061195c5761195b614ed3565b5b60200260200101516050811061197557611974614ed3565b5b602002015183828151811061198d5761198c614ed3565b5b602002602001018190525080806119a390614168565b91505061193f565b508183945094505050505b9250929050565b6119c5612483565b60008260000160008581526020019081526020016000206040518060e001604052908160008201600680602002604051908101604052809291908260068015611a4b576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611a125790505b5050505050815260200160018201600580602002604051908101604052809291908260058015611ab6576020028201916000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611a7f5790505b5050505050815260200160028201600580602002604051908101604052809291908260058015611b21576020028201916000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611aea5790505b505050505081526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016003820160079054906101000a900462ffffff1662ffffff1662ffffff16815250509050611bc1848260600151856106d9565b91505092915050565b60405180610240016040528061021281526020016159d3610212913981565b600060048260ff1611611c265760048260ff1614611c1d5760018260ff1611611c145761011e611c18565b6101305b611c21565b61010c5b611c29565b60a05b9050919050565b611c3861243e565b6040518060e00160405280600060ff168152602001600160ff168152602001600260ff168152602001600560ff168152602001600860ff168152602001600960ff168152602001600a60ff16815250905090565b60606000611c986105a0565b90506000818660ff1660088110611cb257611cb1614ed3565b5b602002015160ff1690506000856040015190506000611ccf610455565b611cd9888a611109565b60ff1660078110611ced57611cec614ed3565b5b602002015190506000611cfe611c30565b611d08898b61103a565b60ff1660078110611d1c57611d1b614ed3565b5b602002015190506000808a60ff1611611d36576050611d6a565b60028660018c611d469190614e9e565b60ff1660088110611d5a57611d59614ed3565b5b6020020151611d699190615181565b5b60ff16905060008567ffffffffffffffff811115611d8b57611d8a61292e565b5b604051908082528060200260200182016040528015611db95781602001602082028036833780820191505090505b509050611dc685836123ff565b81600081518110611dda57611dd9614ed3565b5b602002602001018181525050896080015115611f895760008360ff161115611ea3576000600190505b86811015611e9d5760508560ff16888760ff168760ff1685611e259190613fa8565b611e2f9190613fa8565b611e3991906158d4565b611e439190614e6d565b83600081518110611e5757611e56614ed3565b5b6020026020010151611e699190613fea565b611e739190614e6d565b828281518110611e8657611e85614ed3565b5b602002602001018181525050806001019050611e03565b50611f88565b60008b60ff1603611f37576000600190505b86811015611f31576050611ed78288611ece9190613fea565b8760ff166123ff565b83600081518110611eeb57611eea614ed3565b5b6020026020010151611efd9190613fea565b611f079190614e6d565b828281518110611f1a57611f19614ed3565b5b602002602001018181525050806001019050611eb5565b50611f87565b6000600190505b86811015611f8557611f5b8187611f559190613fea565b846123ff565b828281518110611f6e57611f6d614ed3565b5b602002602001018181525050806001019050611f3e565b505b5b5b60008b60ff16111561222657600060018c611fa49190614e9e565b90506000611fb3828d8d611c8c565b90506000611fc98d60a0015161ffff168d6119bd565b90506000611fd884838f611c8c565b905060008b8560ff1660088110611ff257611ff1614ed3565b5b6020020151905060008160ff168760008151811061201357612012614ed3565b5b60200260200101516120259190614e6d565b90508160ff168760008151811061203f5761203e614ed3565b5b60200260200101511061206c5782818151811061205f5761205e614ed3565b5b6020026020010151612088565b84818151811061207f5761207e614ed3565b5b60200260200101515b8760008151811061209c5761209b614ed3565b5b60200260200101818152505060008960ff160361217c5760005b8c8110156121765760008360ff168983815181106120d7576120d6614ed3565b5b60200260200101516120e99190614e6d565b90508360ff1689838151811061210257612101614ed3565b5b60200260200101511061212f5784818151811061212257612121614ed3565b5b602002602001015161214b565b86818151811061214257612141614ed3565b5b60200260200101515b89838151811061215e5761215d614ed3565b5b602002602001018181525050816001019150506120b6565b5061221f565b6000600190505b8c81101561221d5760508b60ff168e8d60ff168d60ff16856121a59190613fa8565b6121af9190613fa8565b6121b991906158d4565b6121c39190614e6d565b896000815181106121d7576121d6614ed3565b5b60200260200101516121e99190613fea565b6121f39190614e6d565b88828151811061220657612205614ed3565b5b602002602001018181525050806001019050612183565b505b5050505050505b809750505050505050509392505050565b60606000820361227e576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123b8565b600082905060005b600082146122ae578061229890614168565b9050600a826122a791906158d4565b9150612286565b60008167ffffffffffffffff8111156122ca576122c961292e565b5b6040519080825280601f01601f1916602001820160405280156122fc5781602001600182028036833780820191505090505b50905060008290505b600086146123b05760018161231a9190615905565b90506000600a808861232c91906158d4565b6123369190613fa8565b876123419190615905565b603061234d9190615939565b905060008160f81b90508084848151811061236b5761236a614ed3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886123a791906158d4565b97505050612305565b819450505050505b919050565b60008184846040516020016123d392919061598f565b6040516020818303038152906040528051906020012060001c6123f69190614e6d565b90509392505050565b6000818360405160200161241391906159b7565b6040516020818303038152906040528051906020012060001c6124369190614e6d565b905092915050565b6040518060e00160405280600790602082028036833780820191505090505090565b604051806101000160405280600890602082028036833780820191505090505090565b6040518061016001604052806124976125ba565b815260200160001515815260200160008152602001600060ff168152602001600015158152602001600061ffff168152602001600015158152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b604051806102600160405280612510612483565b8152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001600063ffffffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020016000151581526020016000151581526020016000151581525090565b6040518060e001604052806125cd61261b565b81526020016125da61263d565b81526020016125e761263d565b8152602001600060ff168152602001600063ffffffff168152602001600061ffff168152602001600062ffffff1681525090565b6040518060c00160405280600690602082028036833780820191505090505090565b6040518060a00160405280600590602082028036833780820191505090505090565b600060079050919050565b600081905092915050565b6000819050919050565b600060ff82169050919050565b6126958161267f565b82525050565b60006126a7838361268c565b60208301905092915050565b6000602082019050919050565b6126c98161265f565b6126d3818461266a565b92506126de82612675565b8060005b8381101561270f5781516126f6878261269b565b9650612701836126b3565b9250506001810190506126e2565b505050505050565b600060e08201905061272c60008301846126c0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561276c578082015181840152602081019050612751565b60008484015250505050565b6000601f19601f8301169050919050565b600061279482612732565b61279e818561273d565b93506127ae81856020860161274e565b6127b781612778565b840191505092915050565b600060208201905081810360008301526127dc8184612789565b905092915050565b600060089050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61281a816127e4565b61282481846127ef565b925061282f826127fa565b8060005b83811015612860578151612847878261269b565b965061285283612804565b925050600181019050612833565b505050505050565b60006101008201905061287e6000830184612811565b92915050565b6000604051905090565b600080fd5b600080fd5b6128a18161267f565b81146128ac57600080fd5b50565b6000813590506128be81612898565b92915050565b6000602082840312156128da576128d961288e565b5b60006128e8848285016128af565b91505092915050565b600061ffff82169050919050565b612908816128f1565b82525050565b600060208201905061292360008301846128ff565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61296682612778565b810181811067ffffffffffffffff821117156129855761298461292e565b5b80604052505050565b6000612998612884565b90506129a4828261295d565b919050565b600080fd5b600080fd5b600067ffffffffffffffff8211156129ce576129cd61292e565b5b602082029050919050565b600080fd5b6129e7816128f1565b81146129f257600080fd5b50565b600081359050612a04816129de565b92915050565b6000612a1d612a18846129b3565b61298e565b90508060208402830185811115612a3757612a366129d9565b5b835b81811015612a605780612a4c88826129f5565b845260208401935050602081019050612a39565b5050509392505050565b600082601f830112612a7f57612a7e6129ae565b5b6006612a8c848285612a0a565b91505092915050565b600067ffffffffffffffff821115612ab057612aaf61292e565b5b602082029050919050565b6000612ace612ac984612a95565b61298e565b90508060208402830185811115612ae857612ae76129d9565b5b835b81811015612b115780612afd88826128af565b845260208401935050602081019050612aea565b5050509392505050565b600082601f830112612b3057612b2f6129ae565b5b6005612b3d848285612abb565b91505092915050565b600063ffffffff82169050919050565b612b5f81612b46565b8114612b6a57600080fd5b50565b600081359050612b7c81612b56565b92915050565b600062ffffff82169050919050565b612b9a81612b82565b8114612ba557600080fd5b50565b600081359050612bb781612b91565b92915050565b60006102808284031215612bd457612bd3612929565b5b612bde60e061298e565b90506000612bee84828501612a6a565b60008301525060c0612c0284828501612b1b565b602083015250610160612c1784828501612b1b565b604083015250610200612c2c848285016128af565b606083015250610220612c4184828501612b6d565b608083015250610240612c56848285016129f5565b60a083015250610260612c6b84828501612ba8565b60c08301525092915050565b60008115159050919050565b612c8c81612c77565b8114612c9757600080fd5b50565b600081359050612ca981612c83565b92915050565b6000819050919050565b612cc281612caf565b8114612ccd57600080fd5b50565b600081359050612cdf81612cb9565b92915050565b60006103c08284031215612cfc57612cfb612929565b5b612d0761016061298e565b90506000612d1784828501612bbd565b600083015250610280612d2c84828501612c9a565b6020830152506102a0612d4184828501612cd0565b6040830152506102c0612d56848285016128af565b6060830152506102e0612d6b84828501612c9a565b608083015250610300612d80848285016129f5565b60a083015250610320612d9584828501612c9a565b60c083015250610340612daa848285016128af565b60e083015250610360612dbf848285016128af565b61010083015250610380612dd5848285016128af565b610120830152506103a0612deb848285016128af565b6101408301525092915050565b6000819050919050565b612e0b81612df8565b8114612e1657600080fd5b50565b600081359050612e2881612e02565b92915050565b6000806103e08385031215612e4657612e4561288e565b5b6000612e5485828601612ce5565b9250506103c0612e6685828601612e19565b9150509250929050565b600080600060608486031215612e8957612e8861288e565b5b6000612e9786828701612cd0565b9350506020612ea8868287016128af565b9250506040612eb986828701612e19565b9150509250925092565b600060069050919050565b600081905092915050565b6000819050919050565b612eec816128f1565b82525050565b6000612efe8383612ee3565b60208301905092915050565b6000602082019050919050565b612f2081612ec3565b612f2a8184612ece565b9250612f3582612ed9565b8060005b83811015612f66578151612f4d8782612ef2565b9650612f5883612f0a565b925050600181019050612f39565b505050505050565b600060059050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b612fa481612f6e565b612fae8184612f79565b9250612fb982612f84565b8060005b83811015612fea578151612fd1878261269b565b9650612fdc83612f8e565b925050600181019050612fbd565b505050505050565b612ffb81612b46565b82525050565b61300a81612b82565b82525050565b610280820160008201516130276000850182612f17565b50602082015161303a60c0850182612f9b565b50604082015161304e610160850182612f9b565b50606082015161306261020085018261268c565b506080820151613076610220850182612ff2565b5060a082015161308a610240850182612ee3565b5060c082015161309e610260850182613001565b50505050565b6130ad81612c77565b82525050565b6130bc81612caf565b82525050565b6103c0820160008201516130d96000850182613010565b5060208201516130ed6102808501826130a4565b5060408201516131016102a08501826130b3565b5060608201516131156102c085018261268c565b5060808201516131296102e08501826130a4565b5060a082015161313d610300850182612ee3565b5060c08201516131516103208501826130a4565b5060e082015161316561034085018261268c565b5061010082015161317a61036085018261268c565b5061012082015161318f61038085018261268c565b506101408201516131a46103a085018261268c565b50505050565b60006103c0820190506131c060008301846130c2565b92915050565b6131cf8161267f565b82525050565b60006020820190506131ea60008301846131c6565b92915050565b600067ffffffffffffffff82111561320b5761320a61292e565b5b602082029050602081019050919050565b600061322f61322a846131f0565b61298e565b90508083825260208201905060208402830185811115613252576132516129d9565b5b835b8181101561327b57806132678882612cd0565b845260208401935050602081019050613254565b5050509392505050565b600082601f83011261329a576132996129ae565b5b81356132aa84826020860161321c565b91505092915050565b600067ffffffffffffffff8211156132ce576132cd61292e565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156132ff576132fe61292e565b5b61330882612778565b9050602081019050919050565b82818337600083830152505050565b6000613337613332846132e4565b61298e565b905082815260208101848484011115613353576133526132df565b5b61335e848285613315565b509392505050565b600082601f83011261337b5761337a6129ae565b5b813561338b848260208601613324565b91505092915050565b60006133a76133a2846132b3565b61298e565b905080838252602082019050602084028301858111156133ca576133c96129d9565b5b835b8181101561341157803567ffffffffffffffff8111156133ef576133ee6129ae565b5b8086016133fc8982613366565b855260208501945050506020810190506133cc565b5050509392505050565b600082601f8301126134305761342f6129ae565b5b8135613440848260208601613394565b91505092915050565b600061060082840312156134605761345f612929565b5b61346b61026061298e565b9050600061347b84828501612ce5565b6000830152506103c082013567ffffffffffffffff8111156134a05761349f6129a9565b5b6134ac84828501613285565b6020830152506103e082013567ffffffffffffffff8111156134d1576134d06129a9565b5b6134dd8482850161341b565b60408301525061040082013567ffffffffffffffff811115613502576135016129a9565b5b61350e84828501613366565b60608301525061042082013567ffffffffffffffff811115613533576135326129a9565b5b61353f84828501613366565b60808301525061044082013567ffffffffffffffff811115613564576135636129a9565b5b61357084828501613366565b60a08301525061046082013567ffffffffffffffff811115613595576135946129a9565b5b6135a184828501613366565b60c0830152506104806135b684828501612b6d565b60e0830152506104a06135cb848285016129f5565b610100830152506104c06135e1848285016129f5565b610120830152506104e06135f7848285016128af565b6101408301525061050061360d848285016128af565b61016083015250610520613623848285016128af565b61018083015250610540613639848285016128af565b6101a08301525061056061364f848285016128af565b6101c083015250610580613665848285016128af565b6101e0830152506105a061367b84828501612c9a565b610200830152506105c061369184828501612c9a565b610220830152506105e06136a784828501612c9a565b6102408301525092915050565b600067ffffffffffffffff8211156136cf576136ce61292e565b5b602082029050919050565b60006136ed6136e8846136b4565b61298e565b90508060208402830185811115613707576137066129d9565b5b835b8181101561374e57803567ffffffffffffffff81111561372c5761372b6129ae565b5b8086016137398982613366565b85526020850194505050602081019050613709565b5050509392505050565b600082601f83011261376d5761376c6129ae565b5b605061377a8482856136da565b91505092915050565b60008060006060848603121561379c5761379b61288e565b5b600084013567ffffffffffffffff8111156137ba576137b9612893565b5b6137c686828701613449565b93505060206137d786828701612cd0565b925050604084013567ffffffffffffffff8111156137f8576137f7612893565b5b61380486828701613758565b9150509250925092565b6103c0820160008201516138256000850182613010565b5060208201516138396102808501826130a4565b50604082015161384d6102a08501826130b3565b5060608201516138616102c085018261268c565b5060808201516138756102e08501826130a4565b5060a0820151613889610300850182612ee3565b5060c082015161389d6103208501826130a4565b5060e08201516138b161034085018261268c565b506101008201516138c661036085018261268c565b506101208201516138db61038085018261268c565b506101408201516138f06103a085018261268c565b50505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061392e83836130b3565b60208301905092915050565b6000602082019050919050565b6000613952826138f6565b61395c8185613901565b935061396783613912565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006139f8826139d1565b613a0281856139dc565b9350613a1281856020860161274e565b613a1b81612778565b840191505092915050565b6000613a3283836139ed565b905092915050565b6000602082019050919050565b6000613a52826139a5565b613a5c81856139b0565b935083602082028501613a6e856139c1565b8060005b85811015613aaa5784840389528151613a8b8582613a26565b9450613a9683613a3a565b925060208a01995050600181019050613a72565b50829750879550505050505092915050565b600061060083016000830151613ad5600086018261380e565b5060208301518482036103c0860152613aee8282613947565b91505060408301518482036103e0860152613b098282613a47565b9150506060830151848203610400860152613b2482826139ed565b9150506080830151848203610420860152613b3f82826139ed565b91505060a0830151848203610440860152613b5a82826139ed565b91505060c0830151848203610460860152613b7582826139ed565b91505060e0830151613b8b610480860182612ff2565b50610100830151613ba06104a0860182612ee3565b50610120830151613bb56104c0860182612ee3565b50610140830151613bca6104e086018261268c565b50610160830151613bdf61050086018261268c565b50610180830151613bf461052086018261268c565b506101a0830151613c0961054086018261268c565b506101c0830151613c1e61056086018261268c565b506101e0830151613c3361058086018261268c565b50610200830151613c486105a08601826130a4565b50610220830151613c5d6105c08601826130a4565b50610240830151613c726105e08601826130a4565b508091505092915050565b60006020820190508181036000830152613c978184613abc565b905092915050565b6000806103e08385031215613cb757613cb661288e565b5b6000613cc585828601612ce5565b9250506103c0613cd7858286016128af565b9150509250929050565b600060208284031215613cf757613cf661288e565b5b600082013567ffffffffffffffff811115613d1557613d14612893565b5b613d2184828501613449565b91505092915050565b600082825260208201905092915050565b6000613d46826139a5565b613d508185613d2a565b935083602082028501613d62856139c1565b8060005b85811015613d9e5784840389528151613d7f8582613a26565b9450613d8a83613a3a565b925060208a01995050600181019050613d66565b50829750879550505050505092915050565b600082825260208201905092915050565b6000613dcc826138f6565b613dd68185613db0565b9350613de183613912565b8060005b83811015613e12578151613df98882613922565b9750613e048361393a565b925050600181019050613de5565b5085935050505092915050565b60006040820190508181036000830152613e398185613d3b565b90508181036020830152613e4d8184613dc1565b90509392505050565b60008060408385031215613e6d57613e6c61288e565b5b6000613e7b85828601612cd0565b9250506020613e8c85828601612e19565b9150509250929050565b600082825260208201905092915050565b6000613eb2826139d1565b613ebc8185613e96565b9350613ecc81856020860161274e565b613ed581612778565b840191505092915050565b60006020820190508181036000830152613efa8184613ea7565b905092915050565b60008060006104008486031215613f1c57613f1b61288e565b5b6000613f2a868287016128af565b9350506020613f3b86828701612ce5565b9250506103e0613f4d86828701612e19565b9150509250925092565b60006020820190508181036000830152613f718184613dc1565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fb382612caf565b9150613fbe83612caf565b9250828202613fcc81612caf565b91508282048414831517613fe357613fe2613f79565b5b5092915050565b6000613ff582612caf565b915061400083612caf565b925082820190508082111561401857614017613f79565b5b92915050565b600081905092915050565b600061403482612732565b61403e818561401e565b935061404e81856020860161274e565b80840191505092915050565b600081905092915050565b7f3c75736520687265663d22237371756172652220783d22000000000000000000600082015250565b600061409b60178361405a565b91506140a682614065565b601782019050919050565b60006140bc826139d1565b6140c6818561405a565b93506140d681856020860161274e565b80840191505092915050565b7f2220793d22313630222f3e000000000000000000000000000000000000000000600082015250565b6000614118600b8361405a565b9150614123826140e2565b600b82019050919050565b600061413a8285614029565b91506141458261408e565b915061415182846140b1565b915061415c8261410b565b91508190509392505050565b600061417382612caf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141a5576141a4613f79565b5b600182019050919050565b7f3c75736520687265663d2223726f772220793d22000000000000000000000000600082015250565b60006141e660148361405a565b91506141f1826141b0565b601482019050919050565b7f222f3e0000000000000000000000000000000000000000000000000000000000600082015250565b600061423260038361405a565b915061423d826141fc565b600382019050919050565b60006142548285614029565b915061425f826141d9565b915061426b82846140b1565b915061427682614225565b91508190509392505050565b7f3c672069643d22677269642220783d223139362220793d22313630223e000000600082015250565b60006142b8601d8361405a565b91506142c382614282565b601d82019050919050565b7f3c2f673e00000000000000000000000000000000000000000000000000000000600082015250565b600061430460048361405a565b915061430f826142ce565b600482019050919050565b6000614325826142ab565b91506143318284614029565b915061433c826142f7565b915081905092915050565b7f3c73766720000000000000000000000000000000000000000000000000000000600082015250565b600061437d60058361405a565b915061438882614347565b600582019050919050565b7f76696577426f783d223020302036383020363830222000000000000000000000600082015250565b60006143c960168361405a565b91506143d482614393565b601682019050919050565b7f66696c6c3d226e6f6e652220786d6c6e733d22687474703a2f2f7777772e773360008201527f2e6f72672f323030302f73766722200000000000000000000000000000000000602082015250565b600061443b602f8361405a565b9150614446826143df565b602f82019050919050565b7f7374796c653d2277696474683a313030253b6261636b67726f756e643a626c6160008201527f636b3b2200000000000000000000000000000000000000000000000000000000602082015250565b60006144ad60248361405a565b91506144b882614451565b602482019050919050565b7f3e00000000000000000000000000000000000000000000000000000000000000600082015250565b60006144f960018361405a565b9150614504826144c3565b600182019050919050565b7f3c646566733e0000000000000000000000000000000000000000000000000000600082015250565b600061454560068361405a565b91506145508261450f565b600682019050919050565b7f3c706174682069643d22636865636b222066696c6c2d72756c653d226576656e60008201527f6f64642220643d22000000000000000000000000000000000000000000000000602082015250565b60006145b760288361405a565b91506145c28261455b565b602882019050919050565b7f223e3c2f706174683e0000000000000000000000000000000000000000000000600082015250565b600061460360098361405a565b915061460e826145cd565b600982019050919050565b7f3c726563742069643d22737175617265222077696474683d223336222068656960008201527f6768743d22333622207374726f6b653d22000000000000000000000000000000602082015250565b600061467560318361405a565b915061468082614619565b603182019050919050565b7f223e3c2f726563743e0000000000000000000000000000000000000000000000600082015250565b60006146c160098361405a565b91506146cc8261468b565b600982019050919050565b7f3c672069643d22726f77223e0000000000000000000000000000000000000000600082015250565b600061470d600c8361405a565b9150614718826146d7565b600c82019050919050565b7f3c2f673e3c2f646566733e000000000000000000000000000000000000000000600082015250565b6000614759600b8361405a565b915061476482614723565b600b82019050919050565b7f3c726563742077696474683d2236383022206865696768743d2236383022206660008201527f696c6c3d22626c61636b222f3e00000000000000000000000000000000000000602082015250565b60006147cb602d8361405a565b91506147d68261476f565b602d82019050919050565b7f3c7265637420783d223138382220793d22313532222077696474683d2233303460008201527f22206865696768743d22333736222066696c6c3d220000000000000000000000602082015250565b600061483d60358361405a565b9150614848826147e1565b603582019050919050565b7f3c726563742077696474683d2236383022206865696768743d2236383022206660008201527f696c6c3d227472616e73706172656e74223e0000000000000000000000000000602082015250565b60006148af60328361405a565b91506148ba82614853565b603282019050919050565b7f3c616e696d617465200000000000000000000000000000000000000000000000600082015250565b60006148fb60098361405a565b9150614906826148c5565b600982019050919050565b7f6174747269627574654e616d653d227769647468222000000000000000000000600082015250565b600061494760168361405a565b915061495282614911565b601682019050919050565b7f66726f6d3d223638302220000000000000000000000000000000000000000000600082015250565b6000614993600b8361405a565b915061499e8261495d565b600b82019050919050565b7f746f3d2230222000000000000000000000000000000000000000000000000000600082015250565b60006149df60078361405a565b91506149ea826149a9565b600782019050919050565b7f6475723d22302e32732220000000000000000000000000000000000000000000600082015250565b6000614a2b600b8361405a565b9150614a36826149f5565b600b82019050919050565b7f626567696e3d22636c69636b2220000000000000000000000000000000000000600082015250565b6000614a77600e8361405a565b9150614a8282614a41565b600e82019050919050565b7f66696c6c3d22667265657a652220000000000000000000000000000000000000600082015250565b6000614ac3600e8361405a565b9150614ace82614a8d565b600e82019050919050565b7f69643d22616e696d6174696f6e22000000000000000000000000000000000000600082015250565b6000614b0f600e8361405a565b9150614b1a82614ad9565b600e82019050919050565b7f2f3e000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b5b60028361405a565b9150614b6682614b25565b600282019050919050565b7f3c2f726563743e00000000000000000000000000000000000000000000000000600082015250565b6000614ba760078361405a565b9150614bb282614b71565b600782019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b6000614bf360068361405a565b9150614bfe82614bbd565b600682019050919050565b6000614c1482614370565b9150614c1f826143bc565b9150614c2a8261442e565b9150614c35826144a0565b9150614c40826144ec565b9150614c4b82614538565b9150614c56826145aa565b9150614c6282896140b1565b9150614c6d826145f6565b9150614c7882614668565b9150614c8482886140b1565b9150614c8f826146b4565b9150614c9a82614700565b9150614ca68287614029565b9150614cb18261474c565b9150614cbc826147be565b9150614cc782614830565b9150614cd382866140b1565b9150614cde82614225565b9150614cea8285614029565b9150614cf68284614029565b9150614d01826148a2565b9150614d0c826148ee565b9150614d178261493a565b9150614d2282614986565b9150614d2d826149d2565b9150614d3882614a1e565b9150614d4382614a6a565b9150614d4e82614ab6565b9150614d5982614b02565b9150614d6482614b4e565b9150614d6f82614b9a565b9150614d7a82614be6565b9150819050979650505050505050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60008160801b9050919050565b6000614dbe82614da6565b9050919050565b614dd6614dd182614d8a565b614db3565b82525050565b60008160f01b9050919050565b6000614df482614ddc565b9050919050565b614e0c614e07826128f1565b614de9565b82525050565b6000614e1e8285614dc5565b601082019150614e2e8284614dfb565b6002820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e7882612caf565b9150614e8383612caf565b925082614e9357614e92614e3e565b5b828206905092915050565b6000614ea98261267f565b9150614eb48361267f565b9250828203905060ff811115614ecd57614ecc613f79565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115614f5957808604811115614f3557614f34613f79565b5b6001851615614f445780820291505b8081029050614f5285614f02565b9450614f19565b94509492505050565b600082614f72576001905061502e565b81614f80576000905061502e565b8160018114614f965760028114614fa057614fcf565b600191505061502e565b60ff841115614fb257614fb1613f79565b5b8360020a915084821115614fc957614fc8613f79565b5b5061502e565b5060208310610133831016604e8410600b84101617156150045782820a905083811115614fff57614ffe613f79565b5b61502e565b6150118484846001614f0f565b9250905081840481111561502857615027613f79565b5b81810290505b9392505050565b600061504082612caf565b915061504b83612caf565b92506150787fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614f62565b905092915050565b7f2300000000000000000000000000000000000000000000000000000000000000600082015250565b60006150b660018361405a565b91506150c182615080565b600182019050919050565b7f3b00000000000000000000000000000000000000000000000000000000000000600082015250565b600061510260018361405a565b915061510d826150cc565b600182019050919050565b60006151248285614029565b915061512f826150a9565b915061513b82846140b1565b9150615146826150f5565b91508190509392505050565b600061515e8285614029565b9150615169826150a9565b915061517582846140b1565b91508190509392505050565b600061518c8261267f565b91506151978361267f565b92508282026151a58161267f565b91508082146151b7576151b6613f79565b5b5092915050565b60006151c98261267f565b91506151d48361267f565b9250826151e4576151e3614e3e565b5b828204905092915050565b7f6174747269627574654e616d653d2266696c6c222076616c7565733d22000000600082015250565b6000615225601d8361405a565b9150615230826151ef565b601d82019050919050565b7f2220000000000000000000000000000000000000000000000000000000000000600082015250565b600061527160028361405a565b915061527c8261523b565b600282019050919050565b7f6475723d22000000000000000000000000000000000000000000000000000000600082015250565b60006152bd60058361405a565b91506152c882615287565b600582019050919050565b7f732220626567696e3d22616e696d6174696f6e2e626567696e22200000000000600082015250565b6000615309601b8361405a565b9150615314826152d3565b601b82019050919050565b7f726570656174436f756e743d22696e646566696e697465222000000000000000600082015250565b600061535560198361405a565b91506153608261531f565b601982019050919050565b6000615376826148ee565b915061538182615218565b915061538d8285614029565b915061539882615264565b91506153a3826152b0565b91506153af82846140b1565b91506153ba826152fc565b91506153c582615348565b91506153d082614b4e565b91508190509392505050565b60006153ef6153ea846132e4565b61298e565b90508281526020810184848401111561540b5761540a6132df565b5b61541684828561274e565b509392505050565b600082601f830112615433576154326129ae565b5b81516154438482602086016153dc565b91505092915050565b600061545f61545a846136b4565b61298e565b90508060208402830185811115615479576154786129d9565b5b835b818110156154c057805167ffffffffffffffff81111561549e5761549d6129ae565b5b8086016154ab898261541e565b8552602085019450505060208101905061547b565b5050509392505050565b600082601f8301126154df576154de6129ae565b5b60506154ec84828561544c565b91505092915050565b60006020828403121561550b5761550a61288e565b5b600082015167ffffffffffffffff81111561552957615528612893565b5b615535848285016154ca565b91505092915050565b60006155498261267f565b91506155548361267f565b92508261556457615563614e3e565b5b828206905092915050565b600061557a826128f1565b9150615585836128f1565b9250828201905061ffff81111561559f5761559e613f79565b5b92915050565b60006155b0826128f1565b91506155bb836128f1565b9250828203905061ffff8111156155d5576155d4613f79565b5b92915050565b7f3c67207472616e73666f726d3d227472616e736c617465280000000000000000600082015250565b600061561160188361405a565b915061561c826155db565b601882019050919050565b7f2c20000000000000000000000000000000000000000000000000000000000000600082015250565b600061565d60028361405a565b915061566882615627565b600282019050919050565b7f29207363616c6528000000000000000000000000000000000000000000000000600082015250565b60006156a960088361405a565b91506156b482615673565b600882019050919050565b7f29223e0000000000000000000000000000000000000000000000000000000000600082015250565b60006156f560038361405a565b9150615700826156bf565b600382019050919050565b7f3c75736520687265663d2223636865636b222066696c6c3d2223000000000000600082015250565b6000615741601a8361405a565b915061574c8261570b565b601a82019050919050565b7f223e000000000000000000000000000000000000000000000000000000000000600082015250565b600061578d60028361405a565b915061579882615757565b600282019050919050565b7f3c2f7573653e3c2f673e00000000000000000000000000000000000000000000600082015250565b60006157d9600a8361405a565b91506157e4826157a3565b600a82019050919050565b60006157fa82615604565b915061580682886140b1565b915061581182615650565b915061581d82876140b1565b91506158288261569c565b915061583482866140b1565b915061583f826156e8565b915061584a82615734565b915061585682856140b1565b915061586182615780565b915061586d8284614029565b9150615878826157cc565b91508190509695505050505050565b60006158938285614029565b915061589f8284614029565b91508190509392505050565b60006158b68261267f565b915060ff82036158c9576158c8613f79565b5b600182019050919050565b60006158df82612caf565b91506158ea83612caf565b9250826158fa576158f9614e3e565b5b828204905092915050565b600061591082612caf565b915061591b83612caf565b925082820390508181111561593357615932613f79565b5b92915050565b60006159448261267f565b915061594f8361267f565b9250828201905060ff81111561596857615967613f79565b5b92915050565b6000819050919050565b61598961598482612caf565b61596e565b82525050565b600061599b8285615978565b6020820191506159ab82846140b1565b91508190509392505050565b60006159c38284615978565b6020820191508190509291505056fe4d32312e333620392e38383641332e39333320332e3933332030203020302031382038632d312e34323320302d322e36372e3735352d332e333620312e38383761332e39333520332e3933352030203020302d342e37353320342e37353341332e39333320332e3933332030203020302038203138633020312e3432332e37353520322e36363920312e38383620332e333661332e39333520332e39333520302030203020342e37353320342e37353320332e39333320332e39333320302030203020342e38363320312e353920332e39353320332e39353320302030203020312e3835382d312e35383920332e39333520332e39333520302030203020342e3735332d342e37353441332e39333320332e39333320302030203020323820313861332e39333320332e3933332030203020302d312e3838372d332e333620332e39333420332e3933342030203020302d312e3034322d332e37313120332e39333420332e3933342030203020302d332e37312d312e3034335a6d2d332e3935382031312e37313320342e3536322d362e383434632e3536362d2e3834362d2e3735312d312e3732342d312e3331362d2e3837386c2d342e30323620362e3034332d312e3337312d312e333638632d2e3731372d2e3732322d312e3833362e3339362d312e31313620312e3131366c322e313720322e3135612e3738382e37383820302030203020312e3039372d2e32325aa2646970667358221220683980159e6b9e0b8f15b940112fef63ee3e4c405595b025af47a27dd467ba0464736f6c63430008110033

Deployed Bytecode

0x733bcbf1480879bff8435b1534c70b4a5182fb2466301460806040526004361061012b5760003560e01c80639628b417116100b7578063ba44e5071161007b578063ba44e50714610389578063bd42d47e146103b9578063deac370e146103d7578063e8f83cf814610407578063fd1a1246146104255761012b565b80639628b41714610298578063980cd343146102c8578063993e246f146102f85780639dfc01cf14610328578063ae2a8861146103585761012b565b80638b783628116100fe5780638b783628146101a85780638cfea61c146101d857806390d5017114610208578063911508ff1461023857806392e5dbb0146102685761012b565b80632fba26d314610130578063400650cb1461014e57806348fb0f871461016c57806353bfca201461018a575b600080fd5b610138610455565b6040516101459190612717565b60405180910390f35b6101566104b1565b60405161016391906127c2565b60405180910390f35b61017461051f565b60405161018191906127c2565b60405180910390f35b6101926105a0565b60405161019f9190612868565b60405180910390f35b6101c260048036038101906101bd91906128c4565b610607565b6040516101cf919061290e565b60405180910390f35b6101f260048036038101906101ed9190612e2e565b61065d565b6040516101ff91906127c2565b60405180910390f35b610222600480360381019061021d9190612e70565b6106d9565b60405161022f91906131aa565b60405180910390f35b610252600480360381019061024d91906128c4565b610af7565b60405161025f91906131d5565b60405180910390f35b610282600480360381019061027d9190613783565b610b4a565b60405161028f91906127c2565b60405180910390f35b6102b260048036038101906102ad9190612e2e565b610cdb565b6040516102bf9190613c7d565b60405180910390f35b6102e260048036038101906102dd9190613c9f565b61103a565b6040516102ef91906131d5565b60405180910390f35b610312600480360381019061030d9190613c9f565b611109565b60405161031f91906131d5565b60405180910390f35b610342600480360381019061033d9190613ce1565b611211565b60405161034f91906127c2565b60405180910390f35b610372600480360381019061036d9190612e2e565b61159c565b604051610380929190613e1f565b60405180910390f35b6103a3600480360381019061039e9190613e56565b6119bd565b6040516103b091906131aa565b60405180910390f35b6103c1611bca565b6040516103ce9190613ee0565b60405180910390f35b6103f160048036038101906103ec91906128c4565b611be9565b6040516103fe919061290e565b60405180910390f35b61040f611c30565b60405161041c9190612717565b60405180910390f35b61043f600480360381019061043a9190613f02565b611c8c565b60405161044c9190613f57565b60405180910390f35b61045d61243e565b6040518060e00160405280605060ff168152602001603c60ff168152602001602860ff168152602001601460ff168152602001600a60ff168152602001600560ff168152602001600160ff16815250905090565b60608060005b600881101561051757816104e26024836104d19190613fa8565b60c46104dd9190613fea565b612237565b6040516020016104f392919061412e565b6040516020818303038152906040529150808061050f90614168565b9150506104b7565b508091505090565b60608060005b600a811015610579578161054460248361053f9190613fa8565b612237565b604051602001610555929190614248565b6040516020818303038152906040529150808061057190614168565b915050610525565b508060405160200161058b919061431a565b60405160208183030381529060405291505090565b6105a8612460565b604051806101000160405280605060ff168152602001602860ff168152602001601460ff168152602001600a60ff168152602001600560ff168152602001600460ff168152602001600160ff168152602001600060ff16815250905090565b600060018260ff1611156106525760058260ff161461064957600a8260ff161480610635575060048260ff16145b6106405760c4610644565b61010c5b61064d565b6101305b610656565b61011e5b9050919050565b6060600061066b8484610cdb565b905060405180610240016040528061021281526020016159d3610212913981608001516106966104b1565b83606001516106a361051f565b6106ac86611211565b6040516020016106c196959493929190614c09565b60405160208183030381529060405291505092915050565b6106e1612483565b60008260000160008681526020019081526020016000206040518060e001604052908160008201600680602002604051908101604052809291908260068015610767576020028201916000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161072e5790505b50505050508152602001600182016005806020026040519081016040528092919082600580156107d2576020028201916000905b82829054906101000a900460ff1660ff168152602001906001019060208260000104928301926001038202915080841161079b5790505b505050505081526020016002820160058060200260405190810160405280929190826005801561083d576020028201916000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116108065790505b505050505081526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016003820160079054906101000a900462ffffff1662ffffff1662ffffff1681525050905083816060019060ff16908160ff16815250508082600001819052506000836002016000836080015163ffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff1690506fffffffffffffffffffffffffffffffff8016818360a00151604051602001610956929190614e12565b6040516020818303038152906040528051906020012060001c6109799190614e6d565b83604001818152505060008560ff16148360c00190151590811515815250506000816fffffffffffffffffffffffffffffffff161183602001901515908115158152505060068560ff16108360800190151590811515815250508260c001511580156109e8575060078560ff16105b6109f3576000610a1f565b8160000151600186610a059190614e9e565b60ff1660068110610a1957610a18614ed3565b5b60200201515b8360a0019061ffff16908161ffff1681525050610a3c8386611109565b8360e0019060ff16908160ff1681525050610a57838661103a565b83610100019060ff16908160ff1681525050610a716105a0565b8560ff1660088110610a8657610a85614ed3565b5b6020020151836060019060ff16908160ff168152505060038360400151610aad9190614e6d565b6002610ab99190615035565b83610140019060ff16908160ff168152505060028360400151610adc9190614e6d565b83610120019060ff16908160ff168152505050509392505050565b600060508260ff1614610b405760148260ff161015610b3857600a8260ff161480610b25575060048260ff16145b610b30576001610b33565b60025b610b3b565b60045b610b43565b60085b9050919050565b6060600060149050606060008660000151610120015160ff1603610bda576000605086610b779190613fea565b90505b85811115610bd4578185605083610b919190614e6d565b60508110610ba257610ba1614ed3565b5b6020020151604051602001610bb8929190615118565b6040516020818303038152906040529150600481039050610b7a565b50610c48565b60008590505b605086610bed9190613fea565b811015610c46578185605083610c039190614e6d565b60508110610c1457610c13614ed3565b5b6020020151604051602001610c2a929190615118565b6040516020818303038152906040529150600481019050610be0565b505b80848660508110610c5c57610c5b614ed3565b5b6020020151604051602001610c72929190615152565b604051602081830303815290604052905080610cb087600001516101400151600285610c9e9190615181565b610ca891906151be565b60ff16612237565b604051602001610cc192919061536b565b604051602081830303815290604052925050509392505050565b610ce36124fc565b828160000181905250600783600001516060015160ff161481610220019015159081151581525050806102200151610d4457610d1d6105a0565b83600001516060015160ff1660088110610d3a57610d39614ed3565b5b6020020151610d47565b60015b81610140019060ff16908160ff1681525050600080610d66858561159c565b91509150826102200151610daf576040518060400160405280600781526020017f2331393139313900000000000000000000000000000000000000000000000000815250610de6565b6040518060400160405280600781526020017f23463246324632000000000000000000000000000000000000000000000000008152505b8360800181905250826102200151610e33576040518060400160405280600481526020017f2331313100000000000000000000000000000000000000000000000000000000815250610e6a565b6040518060400160405280600481526020017f23464646000000000000000000000000000000000000000000000000000000008152505b8360600181905250808360200181905250818360400181905250601483610140015160ff1611610f1b57600183610140015160ff1611610edf576040518060400160405280600181526020017f3300000000000000000000000000000000000000000000000000000000000000815250610f16565b6040518060400160405280600181526020017f32000000000000000000000000000000000000000000000000000000000000008152505b610f52565b6040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152505b8360c00181905250605083610140015160ff1614610f71576048610f74565b60245b83610160019060ff16908160ff1681525050601483610140015160ff1611610f9d576048610fa0565b60245b83610180019060ff16908160ff1681525050610fc0836101400151610af7565b836101a0019060ff16908160ff1681525050602883610140015160ff161483610240019015159081151581525050610ffc836101400151610607565b83610100019061ffff16908161ffff168152505061101e836101400151611be9565b83610120019061ffff16908161ffff1681525050505092915050565b60008061108284604001516040518060400160405280600881526020017f6772616469656e7400000000000000000000000000000000000000000000000081525060646123bd565b905060008360ff16146110d65760068360ff16106110a15760006110d1565b8360000151604001516001846110b79190614e9e565b60ff16600581106110cb576110ca614ed3565b5b60200201515b611100565b601481106110e55760006110ff565b6006816110f29190614e6d565b60016110fe9190613fea565b5b5b91505092915050565b60008061115184604001516040518060400160405280600481526020017f62616e640000000000000000000000000000000000000000000000000000000081525060786123bd565b905060008360ff16146111a55760068360ff16106111705760066111a0565b8360000151602001516001846111869190614e9e565b60ff166005811061119a57611199614ed3565b5b60200201515b611208565b6050811161120457602881116111fc57601481116111f457600a81116111ec57600481116111e457600181116111dc5760066111df565b60055b6111e7565b60045b6111ef565b60035b6111f7565b60025b6111ff565b60015b611207565b60005b5b91505092915050565b6060806000733ee78a90f3a812b68b022f1005c326fa006bcb89635022b5e96040518163ffffffff1660e01b8152600401600060405180830381865af415801561125f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061128891906154f5565b90506000846101400151905060005b8160ff168160ff16101561159057856101a00151816112b6919061553e565b866101c0019060ff16908160ff16815250506000866101c0015160ff161480156112e3575060008160ff16115b866102000190151590811515815250508561020001511561132b5785610180015160ff168661012001818151611319919061556f565b91509061ffff16908161ffff16815250505b856102000151801561133f57508561024001515b156114265760008160ff160361138857600286610160015161136191906151be565b60ff168661010001818151611376919061556f565b91509061ffff16908161ffff16815250505b60006002876101a0015161139c9190615181565b826113a7919061553e565b60ff16036113ec5760028661016001516113c191906151be565b60ff1686610100018181516113d691906155a5565b91509061ffff16908161ffff1681525050611425565b60028661016001516113fe91906151be565b60ff168661010001818151611413919061556f565b91509061ffff16908161ffff16815250505b5b600061145d876101600151886101c001516114419190615181565b60ff16886101000151611454919061556f565b61ffff16612237565b9050600061147388610120015161ffff16612237565b905060008860000151602001516114a957886040015160008151811061149c5761149b614ed3565b5b60200260200101516114cc565b88604001518460ff16815181106114c3576114c2614ed3565b5b60200260200101515b90508683838b60c00151848d600001516020015180156114ef57508d6102200151155b6115085760405180602001604052806000815250611535565b6115348e8f602001518b60ff168151811061152657611525614ed3565b5b60200260200101518d610b4a565b5b6040516020016115499594939291906157ef565b604051602081830303815290604052604051602001611569929190615887565b60405160208183030381529060405296505050508080611588906158ab565b915050611297565b50829350505050919050565b606080600784600001516060015160ff16036116d8576000600167ffffffffffffffff8111156115cf576115ce61292e565b5b60405190808252806020026020018201604052801561160257816020015b60608152602001906001900390816115ed5790505b5090506000600167ffffffffffffffff8111156116225761162161292e565b5b6040519080825280602002602001820160405280156116505781602001602082028036833780820191505090505b5090506040518060400160405280600381526020017f30303000000000000000000000000000000000000000000000000000000000008152508260008151811061169d5761169c614ed3565b5b60200260200101819052506103e7816000815181106116bf576116be614ed3565b5b60200260200101818152505081819350935050506119b6565b8360200151611806576000600167ffffffffffffffff8111156116fe576116fd61292e565b5b60405190808252806020026020018201604052801561173157816020015b606081526020019060019003908161171c5790505b5090506000600167ffffffffffffffff8111156117515761175061292e565b5b60405190808252806020026020018201604052801561177f5781602001602082028036833780820191505090505b5090506040518060400160405280600681526020017f3432343234320000000000000000000000000000000000000000000000000000815250826000815181106117cc576117cb614ed3565b5b60200260200101819052506000816000815181106117ed576117ec614ed3565b5b60200260200101818152505081819350935050506119b6565b600061181b8560000151606001518686611c8c565b90506000815167ffffffffffffffff81111561183a5761183961292e565b5b60405190808252806020026020018201604052801561186d57816020015b60608152602001906001900390816118585790505b5090506000733ee78a90f3a812b68b022f1005c326fa006bcb89635022b5e96040518163ffffffff1660e01b8152600401600060405180830381865af41580156118bb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118e491906154f5565b905080836000815181106118fb576118fa614ed3565b5b60200260200101516050811061191457611913614ed3565b5b60200201518260008151811061192d5761192c614ed3565b5b60200260200101819052506000600190505b83518110156119ab578184828151811061195c5761195b614ed3565b5b60200260200101516050811061197557611974614ed3565b5b602002015183828151811061198d5761198c614ed3565b5b602002602001018190525080806119a390614168565b91505061193f565b508183945094505050505b9250929050565b6119c5612483565b60008260000160008581526020019081526020016000206040518060e001604052908160008201600680602002604051908101604052809291908260068015611a4b576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611a125790505b5050505050815260200160018201600580602002604051908101604052809291908260058015611ab6576020028201916000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611a7f5790505b5050505050815260200160028201600580602002604051908101604052809291908260058015611b21576020028201916000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611aea5790505b505050505081526020016003820160009054906101000a900460ff1660ff1660ff1681526020016003820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016003820160059054906101000a900461ffff1661ffff1661ffff1681526020016003820160079054906101000a900462ffffff1662ffffff1662ffffff16815250509050611bc1848260600151856106d9565b91505092915050565b60405180610240016040528061021281526020016159d3610212913981565b600060048260ff1611611c265760048260ff1614611c1d5760018260ff1611611c145761011e611c18565b6101305b611c21565b61010c5b611c29565b60a05b9050919050565b611c3861243e565b6040518060e00160405280600060ff168152602001600160ff168152602001600260ff168152602001600560ff168152602001600860ff168152602001600960ff168152602001600a60ff16815250905090565b60606000611c986105a0565b90506000818660ff1660088110611cb257611cb1614ed3565b5b602002015160ff1690506000856040015190506000611ccf610455565b611cd9888a611109565b60ff1660078110611ced57611cec614ed3565b5b602002015190506000611cfe611c30565b611d08898b61103a565b60ff1660078110611d1c57611d1b614ed3565b5b602002015190506000808a60ff1611611d36576050611d6a565b60028660018c611d469190614e9e565b60ff1660088110611d5a57611d59614ed3565b5b6020020151611d699190615181565b5b60ff16905060008567ffffffffffffffff811115611d8b57611d8a61292e565b5b604051908082528060200260200182016040528015611db95781602001602082028036833780820191505090505b509050611dc685836123ff565b81600081518110611dda57611dd9614ed3565b5b602002602001018181525050896080015115611f895760008360ff161115611ea3576000600190505b86811015611e9d5760508560ff16888760ff168760ff1685611e259190613fa8565b611e2f9190613fa8565b611e3991906158d4565b611e439190614e6d565b83600081518110611e5757611e56614ed3565b5b6020026020010151611e699190613fea565b611e739190614e6d565b828281518110611e8657611e85614ed3565b5b602002602001018181525050806001019050611e03565b50611f88565b60008b60ff1603611f37576000600190505b86811015611f31576050611ed78288611ece9190613fea565b8760ff166123ff565b83600081518110611eeb57611eea614ed3565b5b6020026020010151611efd9190613fea565b611f079190614e6d565b828281518110611f1a57611f19614ed3565b5b602002602001018181525050806001019050611eb5565b50611f87565b6000600190505b86811015611f8557611f5b8187611f559190613fea565b846123ff565b828281518110611f6e57611f6d614ed3565b5b602002602001018181525050806001019050611f3e565b505b5b5b60008b60ff16111561222657600060018c611fa49190614e9e565b90506000611fb3828d8d611c8c565b90506000611fc98d60a0015161ffff168d6119bd565b90506000611fd884838f611c8c565b905060008b8560ff1660088110611ff257611ff1614ed3565b5b6020020151905060008160ff168760008151811061201357612012614ed3565b5b60200260200101516120259190614e6d565b90508160ff168760008151811061203f5761203e614ed3565b5b60200260200101511061206c5782818151811061205f5761205e614ed3565b5b6020026020010151612088565b84818151811061207f5761207e614ed3565b5b60200260200101515b8760008151811061209c5761209b614ed3565b5b60200260200101818152505060008960ff160361217c5760005b8c8110156121765760008360ff168983815181106120d7576120d6614ed3565b5b60200260200101516120e99190614e6d565b90508360ff1689838151811061210257612101614ed3565b5b60200260200101511061212f5784818151811061212257612121614ed3565b5b602002602001015161214b565b86818151811061214257612141614ed3565b5b60200260200101515b89838151811061215e5761215d614ed3565b5b602002602001018181525050816001019150506120b6565b5061221f565b6000600190505b8c81101561221d5760508b60ff168e8d60ff168d60ff16856121a59190613fa8565b6121af9190613fa8565b6121b991906158d4565b6121c39190614e6d565b896000815181106121d7576121d6614ed3565b5b60200260200101516121e99190613fea565b6121f39190614e6d565b88828151811061220657612205614ed3565b5b602002602001018181525050806001019050612183565b505b5050505050505b809750505050505050509392505050565b60606000820361227e576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123b8565b600082905060005b600082146122ae578061229890614168565b9050600a826122a791906158d4565b9150612286565b60008167ffffffffffffffff8111156122ca576122c961292e565b5b6040519080825280601f01601f1916602001820160405280156122fc5781602001600182028036833780820191505090505b50905060008290505b600086146123b05760018161231a9190615905565b90506000600a808861232c91906158d4565b6123369190613fa8565b876123419190615905565b603061234d9190615939565b905060008160f81b90508084848151811061236b5761236a614ed3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886123a791906158d4565b97505050612305565b819450505050505b919050565b60008184846040516020016123d392919061598f565b6040516020818303038152906040528051906020012060001c6123f69190614e6d565b90509392505050565b6000818360405160200161241391906159b7565b6040516020818303038152906040528051906020012060001c6124369190614e6d565b905092915050565b6040518060e00160405280600790602082028036833780820191505090505090565b604051806101000160405280600890602082028036833780820191505090505090565b6040518061016001604052806124976125ba565b815260200160001515815260200160008152602001600060ff168152602001600015158152602001600061ffff168152602001600015158152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b604051806102600160405280612510612483565b8152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001600063ffffffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020016000151581526020016000151581526020016000151581525090565b6040518060e001604052806125cd61261b565b81526020016125da61263d565b81526020016125e761263d565b8152602001600060ff168152602001600063ffffffff168152602001600061ffff168152602001600062ffffff1681525090565b6040518060c00160405280600690602082028036833780820191505090505090565b6040518060a00160405280600590602082028036833780820191505090505090565b600060079050919050565b600081905092915050565b6000819050919050565b600060ff82169050919050565b6126958161267f565b82525050565b60006126a7838361268c565b60208301905092915050565b6000602082019050919050565b6126c98161265f565b6126d3818461266a565b92506126de82612675565b8060005b8381101561270f5781516126f6878261269b565b9650612701836126b3565b9250506001810190506126e2565b505050505050565b600060e08201905061272c60008301846126c0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561276c578082015181840152602081019050612751565b60008484015250505050565b6000601f19601f8301169050919050565b600061279482612732565b61279e818561273d565b93506127ae81856020860161274e565b6127b781612778565b840191505092915050565b600060208201905081810360008301526127dc8184612789565b905092915050565b600060089050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61281a816127e4565b61282481846127ef565b925061282f826127fa565b8060005b83811015612860578151612847878261269b565b965061285283612804565b925050600181019050612833565b505050505050565b60006101008201905061287e6000830184612811565b92915050565b6000604051905090565b600080fd5b600080fd5b6128a18161267f565b81146128ac57600080fd5b50565b6000813590506128be81612898565b92915050565b6000602082840312156128da576128d961288e565b5b60006128e8848285016128af565b91505092915050565b600061ffff82169050919050565b612908816128f1565b82525050565b600060208201905061292360008301846128ff565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61296682612778565b810181811067ffffffffffffffff821117156129855761298461292e565b5b80604052505050565b6000612998612884565b90506129a4828261295d565b919050565b600080fd5b600080fd5b600067ffffffffffffffff8211156129ce576129cd61292e565b5b602082029050919050565b600080fd5b6129e7816128f1565b81146129f257600080fd5b50565b600081359050612a04816129de565b92915050565b6000612a1d612a18846129b3565b61298e565b90508060208402830185811115612a3757612a366129d9565b5b835b81811015612a605780612a4c88826129f5565b845260208401935050602081019050612a39565b5050509392505050565b600082601f830112612a7f57612a7e6129ae565b5b6006612a8c848285612a0a565b91505092915050565b600067ffffffffffffffff821115612ab057612aaf61292e565b5b602082029050919050565b6000612ace612ac984612a95565b61298e565b90508060208402830185811115612ae857612ae76129d9565b5b835b81811015612b115780612afd88826128af565b845260208401935050602081019050612aea565b5050509392505050565b600082601f830112612b3057612b2f6129ae565b5b6005612b3d848285612abb565b91505092915050565b600063ffffffff82169050919050565b612b5f81612b46565b8114612b6a57600080fd5b50565b600081359050612b7c81612b56565b92915050565b600062ffffff82169050919050565b612b9a81612b82565b8114612ba557600080fd5b50565b600081359050612bb781612b91565b92915050565b60006102808284031215612bd457612bd3612929565b5b612bde60e061298e565b90506000612bee84828501612a6a565b60008301525060c0612c0284828501612b1b565b602083015250610160612c1784828501612b1b565b604083015250610200612c2c848285016128af565b606083015250610220612c4184828501612b6d565b608083015250610240612c56848285016129f5565b60a083015250610260612c6b84828501612ba8565b60c08301525092915050565b60008115159050919050565b612c8c81612c77565b8114612c9757600080fd5b50565b600081359050612ca981612c83565b92915050565b6000819050919050565b612cc281612caf565b8114612ccd57600080fd5b50565b600081359050612cdf81612cb9565b92915050565b60006103c08284031215612cfc57612cfb612929565b5b612d0761016061298e565b90506000612d1784828501612bbd565b600083015250610280612d2c84828501612c9a565b6020830152506102a0612d4184828501612cd0565b6040830152506102c0612d56848285016128af565b6060830152506102e0612d6b84828501612c9a565b608083015250610300612d80848285016129f5565b60a083015250610320612d9584828501612c9a565b60c083015250610340612daa848285016128af565b60e083015250610360612dbf848285016128af565b61010083015250610380612dd5848285016128af565b610120830152506103a0612deb848285016128af565b6101408301525092915050565b6000819050919050565b612e0b81612df8565b8114612e1657600080fd5b50565b600081359050612e2881612e02565b92915050565b6000806103e08385031215612e4657612e4561288e565b5b6000612e5485828601612ce5565b9250506103c0612e6685828601612e19565b9150509250929050565b600080600060608486031215612e8957612e8861288e565b5b6000612e9786828701612cd0565b9350506020612ea8868287016128af565b9250506040612eb986828701612e19565b9150509250925092565b600060069050919050565b600081905092915050565b6000819050919050565b612eec816128f1565b82525050565b6000612efe8383612ee3565b60208301905092915050565b6000602082019050919050565b612f2081612ec3565b612f2a8184612ece565b9250612f3582612ed9565b8060005b83811015612f66578151612f4d8782612ef2565b9650612f5883612f0a565b925050600181019050612f39565b505050505050565b600060059050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b612fa481612f6e565b612fae8184612f79565b9250612fb982612f84565b8060005b83811015612fea578151612fd1878261269b565b9650612fdc83612f8e565b925050600181019050612fbd565b505050505050565b612ffb81612b46565b82525050565b61300a81612b82565b82525050565b610280820160008201516130276000850182612f17565b50602082015161303a60c0850182612f9b565b50604082015161304e610160850182612f9b565b50606082015161306261020085018261268c565b506080820151613076610220850182612ff2565b5060a082015161308a610240850182612ee3565b5060c082015161309e610260850182613001565b50505050565b6130ad81612c77565b82525050565b6130bc81612caf565b82525050565b6103c0820160008201516130d96000850182613010565b5060208201516130ed6102808501826130a4565b5060408201516131016102a08501826130b3565b5060608201516131156102c085018261268c565b5060808201516131296102e08501826130a4565b5060a082015161313d610300850182612ee3565b5060c08201516131516103208501826130a4565b5060e082015161316561034085018261268c565b5061010082015161317a61036085018261268c565b5061012082015161318f61038085018261268c565b506101408201516131a46103a085018261268c565b50505050565b60006103c0820190506131c060008301846130c2565b92915050565b6131cf8161267f565b82525050565b60006020820190506131ea60008301846131c6565b92915050565b600067ffffffffffffffff82111561320b5761320a61292e565b5b602082029050602081019050919050565b600061322f61322a846131f0565b61298e565b90508083825260208201905060208402830185811115613252576132516129d9565b5b835b8181101561327b57806132678882612cd0565b845260208401935050602081019050613254565b5050509392505050565b600082601f83011261329a576132996129ae565b5b81356132aa84826020860161321c565b91505092915050565b600067ffffffffffffffff8211156132ce576132cd61292e565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156132ff576132fe61292e565b5b61330882612778565b9050602081019050919050565b82818337600083830152505050565b6000613337613332846132e4565b61298e565b905082815260208101848484011115613353576133526132df565b5b61335e848285613315565b509392505050565b600082601f83011261337b5761337a6129ae565b5b813561338b848260208601613324565b91505092915050565b60006133a76133a2846132b3565b61298e565b905080838252602082019050602084028301858111156133ca576133c96129d9565b5b835b8181101561341157803567ffffffffffffffff8111156133ef576133ee6129ae565b5b8086016133fc8982613366565b855260208501945050506020810190506133cc565b5050509392505050565b600082601f8301126134305761342f6129ae565b5b8135613440848260208601613394565b91505092915050565b600061060082840312156134605761345f612929565b5b61346b61026061298e565b9050600061347b84828501612ce5565b6000830152506103c082013567ffffffffffffffff8111156134a05761349f6129a9565b5b6134ac84828501613285565b6020830152506103e082013567ffffffffffffffff8111156134d1576134d06129a9565b5b6134dd8482850161341b565b60408301525061040082013567ffffffffffffffff811115613502576135016129a9565b5b61350e84828501613366565b60608301525061042082013567ffffffffffffffff811115613533576135326129a9565b5b61353f84828501613366565b60808301525061044082013567ffffffffffffffff811115613564576135636129a9565b5b61357084828501613366565b60a08301525061046082013567ffffffffffffffff811115613595576135946129a9565b5b6135a184828501613366565b60c0830152506104806135b684828501612b6d565b60e0830152506104a06135cb848285016129f5565b610100830152506104c06135e1848285016129f5565b610120830152506104e06135f7848285016128af565b6101408301525061050061360d848285016128af565b61016083015250610520613623848285016128af565b61018083015250610540613639848285016128af565b6101a08301525061056061364f848285016128af565b6101c083015250610580613665848285016128af565b6101e0830152506105a061367b84828501612c9a565b610200830152506105c061369184828501612c9a565b610220830152506105e06136a784828501612c9a565b6102408301525092915050565b600067ffffffffffffffff8211156136cf576136ce61292e565b5b602082029050919050565b60006136ed6136e8846136b4565b61298e565b90508060208402830185811115613707576137066129d9565b5b835b8181101561374e57803567ffffffffffffffff81111561372c5761372b6129ae565b5b8086016137398982613366565b85526020850194505050602081019050613709565b5050509392505050565b600082601f83011261376d5761376c6129ae565b5b605061377a8482856136da565b91505092915050565b60008060006060848603121561379c5761379b61288e565b5b600084013567ffffffffffffffff8111156137ba576137b9612893565b5b6137c686828701613449565b93505060206137d786828701612cd0565b925050604084013567ffffffffffffffff8111156137f8576137f7612893565b5b61380486828701613758565b9150509250925092565b6103c0820160008201516138256000850182613010565b5060208201516138396102808501826130a4565b50604082015161384d6102a08501826130b3565b5060608201516138616102c085018261268c565b5060808201516138756102e08501826130a4565b5060a0820151613889610300850182612ee3565b5060c082015161389d6103208501826130a4565b5060e08201516138b161034085018261268c565b506101008201516138c661036085018261268c565b506101208201516138db61038085018261268c565b506101408201516138f06103a085018261268c565b50505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061392e83836130b3565b60208301905092915050565b6000602082019050919050565b6000613952826138f6565b61395c8185613901565b935061396783613912565b8060005b8381101561399857815161397f8882613922565b975061398a8361393a565b92505060018101905061396b565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006139f8826139d1565b613a0281856139dc565b9350613a1281856020860161274e565b613a1b81612778565b840191505092915050565b6000613a3283836139ed565b905092915050565b6000602082019050919050565b6000613a52826139a5565b613a5c81856139b0565b935083602082028501613a6e856139c1565b8060005b85811015613aaa5784840389528151613a8b8582613a26565b9450613a9683613a3a565b925060208a01995050600181019050613a72565b50829750879550505050505092915050565b600061060083016000830151613ad5600086018261380e565b5060208301518482036103c0860152613aee8282613947565b91505060408301518482036103e0860152613b098282613a47565b9150506060830151848203610400860152613b2482826139ed565b9150506080830151848203610420860152613b3f82826139ed565b91505060a0830151848203610440860152613b5a82826139ed565b91505060c0830151848203610460860152613b7582826139ed565b91505060e0830151613b8b610480860182612ff2565b50610100830151613ba06104a0860182612ee3565b50610120830151613bb56104c0860182612ee3565b50610140830151613bca6104e086018261268c565b50610160830151613bdf61050086018261268c565b50610180830151613bf461052086018261268c565b506101a0830151613c0961054086018261268c565b506101c0830151613c1e61056086018261268c565b506101e0830151613c3361058086018261268c565b50610200830151613c486105a08601826130a4565b50610220830151613c5d6105c08601826130a4565b50610240830151613c726105e08601826130a4565b508091505092915050565b60006020820190508181036000830152613c978184613abc565b905092915050565b6000806103e08385031215613cb757613cb661288e565b5b6000613cc585828601612ce5565b9250506103c0613cd7858286016128af565b9150509250929050565b600060208284031215613cf757613cf661288e565b5b600082013567ffffffffffffffff811115613d1557613d14612893565b5b613d2184828501613449565b91505092915050565b600082825260208201905092915050565b6000613d46826139a5565b613d508185613d2a565b935083602082028501613d62856139c1565b8060005b85811015613d9e5784840389528151613d7f8582613a26565b9450613d8a83613a3a565b925060208a01995050600181019050613d66565b50829750879550505050505092915050565b600082825260208201905092915050565b6000613dcc826138f6565b613dd68185613db0565b9350613de183613912565b8060005b83811015613e12578151613df98882613922565b9750613e048361393a565b925050600181019050613de5565b5085935050505092915050565b60006040820190508181036000830152613e398185613d3b565b90508181036020830152613e4d8184613dc1565b90509392505050565b60008060408385031215613e6d57613e6c61288e565b5b6000613e7b85828601612cd0565b9250506020613e8c85828601612e19565b9150509250929050565b600082825260208201905092915050565b6000613eb2826139d1565b613ebc8185613e96565b9350613ecc81856020860161274e565b613ed581612778565b840191505092915050565b60006020820190508181036000830152613efa8184613ea7565b905092915050565b60008060006104008486031215613f1c57613f1b61288e565b5b6000613f2a868287016128af565b9350506020613f3b86828701612ce5565b9250506103e0613f4d86828701612e19565b9150509250925092565b60006020820190508181036000830152613f718184613dc1565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fb382612caf565b9150613fbe83612caf565b9250828202613fcc81612caf565b91508282048414831517613fe357613fe2613f79565b5b5092915050565b6000613ff582612caf565b915061400083612caf565b925082820190508082111561401857614017613f79565b5b92915050565b600081905092915050565b600061403482612732565b61403e818561401e565b935061404e81856020860161274e565b80840191505092915050565b600081905092915050565b7f3c75736520687265663d22237371756172652220783d22000000000000000000600082015250565b600061409b60178361405a565b91506140a682614065565b601782019050919050565b60006140bc826139d1565b6140c6818561405a565b93506140d681856020860161274e565b80840191505092915050565b7f2220793d22313630222f3e000000000000000000000000000000000000000000600082015250565b6000614118600b8361405a565b9150614123826140e2565b600b82019050919050565b600061413a8285614029565b91506141458261408e565b915061415182846140b1565b915061415c8261410b565b91508190509392505050565b600061417382612caf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141a5576141a4613f79565b5b600182019050919050565b7f3c75736520687265663d2223726f772220793d22000000000000000000000000600082015250565b60006141e660148361405a565b91506141f1826141b0565b601482019050919050565b7f222f3e0000000000000000000000000000000000000000000000000000000000600082015250565b600061423260038361405a565b915061423d826141fc565b600382019050919050565b60006142548285614029565b915061425f826141d9565b915061426b82846140b1565b915061427682614225565b91508190509392505050565b7f3c672069643d22677269642220783d223139362220793d22313630223e000000600082015250565b60006142b8601d8361405a565b91506142c382614282565b601d82019050919050565b7f3c2f673e00000000000000000000000000000000000000000000000000000000600082015250565b600061430460048361405a565b915061430f826142ce565b600482019050919050565b6000614325826142ab565b91506143318284614029565b915061433c826142f7565b915081905092915050565b7f3c73766720000000000000000000000000000000000000000000000000000000600082015250565b600061437d60058361405a565b915061438882614347565b600582019050919050565b7f76696577426f783d223020302036383020363830222000000000000000000000600082015250565b60006143c960168361405a565b91506143d482614393565b601682019050919050565b7f66696c6c3d226e6f6e652220786d6c6e733d22687474703a2f2f7777772e773360008201527f2e6f72672f323030302f73766722200000000000000000000000000000000000602082015250565b600061443b602f8361405a565b9150614446826143df565b602f82019050919050565b7f7374796c653d2277696474683a313030253b6261636b67726f756e643a626c6160008201527f636b3b2200000000000000000000000000000000000000000000000000000000602082015250565b60006144ad60248361405a565b91506144b882614451565b602482019050919050565b7f3e00000000000000000000000000000000000000000000000000000000000000600082015250565b60006144f960018361405a565b9150614504826144c3565b600182019050919050565b7f3c646566733e0000000000000000000000000000000000000000000000000000600082015250565b600061454560068361405a565b91506145508261450f565b600682019050919050565b7f3c706174682069643d22636865636b222066696c6c2d72756c653d226576656e60008201527f6f64642220643d22000000000000000000000000000000000000000000000000602082015250565b60006145b760288361405a565b91506145c28261455b565b602882019050919050565b7f223e3c2f706174683e0000000000000000000000000000000000000000000000600082015250565b600061460360098361405a565b915061460e826145cd565b600982019050919050565b7f3c726563742069643d22737175617265222077696474683d223336222068656960008201527f6768743d22333622207374726f6b653d22000000000000000000000000000000602082015250565b600061467560318361405a565b915061468082614619565b603182019050919050565b7f223e3c2f726563743e0000000000000000000000000000000000000000000000600082015250565b60006146c160098361405a565b91506146cc8261468b565b600982019050919050565b7f3c672069643d22726f77223e0000000000000000000000000000000000000000600082015250565b600061470d600c8361405a565b9150614718826146d7565b600c82019050919050565b7f3c2f673e3c2f646566733e000000000000000000000000000000000000000000600082015250565b6000614759600b8361405a565b915061476482614723565b600b82019050919050565b7f3c726563742077696474683d2236383022206865696768743d2236383022206660008201527f696c6c3d22626c61636b222f3e00000000000000000000000000000000000000602082015250565b60006147cb602d8361405a565b91506147d68261476f565b602d82019050919050565b7f3c7265637420783d223138382220793d22313532222077696474683d2233303460008201527f22206865696768743d22333736222066696c6c3d220000000000000000000000602082015250565b600061483d60358361405a565b9150614848826147e1565b603582019050919050565b7f3c726563742077696474683d2236383022206865696768743d2236383022206660008201527f696c6c3d227472616e73706172656e74223e0000000000000000000000000000602082015250565b60006148af60328361405a565b91506148ba82614853565b603282019050919050565b7f3c616e696d617465200000000000000000000000000000000000000000000000600082015250565b60006148fb60098361405a565b9150614906826148c5565b600982019050919050565b7f6174747269627574654e616d653d227769647468222000000000000000000000600082015250565b600061494760168361405a565b915061495282614911565b601682019050919050565b7f66726f6d3d223638302220000000000000000000000000000000000000000000600082015250565b6000614993600b8361405a565b915061499e8261495d565b600b82019050919050565b7f746f3d2230222000000000000000000000000000000000000000000000000000600082015250565b60006149df60078361405a565b91506149ea826149a9565b600782019050919050565b7f6475723d22302e32732220000000000000000000000000000000000000000000600082015250565b6000614a2b600b8361405a565b9150614a36826149f5565b600b82019050919050565b7f626567696e3d22636c69636b2220000000000000000000000000000000000000600082015250565b6000614a77600e8361405a565b9150614a8282614a41565b600e82019050919050565b7f66696c6c3d22667265657a652220000000000000000000000000000000000000600082015250565b6000614ac3600e8361405a565b9150614ace82614a8d565b600e82019050919050565b7f69643d22616e696d6174696f6e22000000000000000000000000000000000000600082015250565b6000614b0f600e8361405a565b9150614b1a82614ad9565b600e82019050919050565b7f2f3e000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b5b60028361405a565b9150614b6682614b25565b600282019050919050565b7f3c2f726563743e00000000000000000000000000000000000000000000000000600082015250565b6000614ba760078361405a565b9150614bb282614b71565b600782019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b6000614bf360068361405a565b9150614bfe82614bbd565b600682019050919050565b6000614c1482614370565b9150614c1f826143bc565b9150614c2a8261442e565b9150614c35826144a0565b9150614c40826144ec565b9150614c4b82614538565b9150614c56826145aa565b9150614c6282896140b1565b9150614c6d826145f6565b9150614c7882614668565b9150614c8482886140b1565b9150614c8f826146b4565b9150614c9a82614700565b9150614ca68287614029565b9150614cb18261474c565b9150614cbc826147be565b9150614cc782614830565b9150614cd382866140b1565b9150614cde82614225565b9150614cea8285614029565b9150614cf68284614029565b9150614d01826148a2565b9150614d0c826148ee565b9150614d178261493a565b9150614d2282614986565b9150614d2d826149d2565b9150614d3882614a1e565b9150614d4382614a6a565b9150614d4e82614ab6565b9150614d5982614b02565b9150614d6482614b4e565b9150614d6f82614b9a565b9150614d7a82614be6565b9150819050979650505050505050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60008160801b9050919050565b6000614dbe82614da6565b9050919050565b614dd6614dd182614d8a565b614db3565b82525050565b60008160f01b9050919050565b6000614df482614ddc565b9050919050565b614e0c614e07826128f1565b614de9565b82525050565b6000614e1e8285614dc5565b601082019150614e2e8284614dfb565b6002820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e7882612caf565b9150614e8383612caf565b925082614e9357614e92614e3e565b5b828206905092915050565b6000614ea98261267f565b9150614eb48361267f565b9250828203905060ff811115614ecd57614ecc613f79565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115614f5957808604811115614f3557614f34613f79565b5b6001851615614f445780820291505b8081029050614f5285614f02565b9450614f19565b94509492505050565b600082614f72576001905061502e565b81614f80576000905061502e565b8160018114614f965760028114614fa057614fcf565b600191505061502e565b60ff841115614fb257614fb1613f79565b5b8360020a915084821115614fc957614fc8613f79565b5b5061502e565b5060208310610133831016604e8410600b84101617156150045782820a905083811115614fff57614ffe613f79565b5b61502e565b6150118484846001614f0f565b9250905081840481111561502857615027613f79565b5b81810290505b9392505050565b600061504082612caf565b915061504b83612caf565b92506150787fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614f62565b905092915050565b7f2300000000000000000000000000000000000000000000000000000000000000600082015250565b60006150b660018361405a565b91506150c182615080565b600182019050919050565b7f3b00000000000000000000000000000000000000000000000000000000000000600082015250565b600061510260018361405a565b915061510d826150cc565b600182019050919050565b60006151248285614029565b915061512f826150a9565b915061513b82846140b1565b9150615146826150f5565b91508190509392505050565b600061515e8285614029565b9150615169826150a9565b915061517582846140b1565b91508190509392505050565b600061518c8261267f565b91506151978361267f565b92508282026151a58161267f565b91508082146151b7576151b6613f79565b5b5092915050565b60006151c98261267f565b91506151d48361267f565b9250826151e4576151e3614e3e565b5b828204905092915050565b7f6174747269627574654e616d653d2266696c6c222076616c7565733d22000000600082015250565b6000615225601d8361405a565b9150615230826151ef565b601d82019050919050565b7f2220000000000000000000000000000000000000000000000000000000000000600082015250565b600061527160028361405a565b915061527c8261523b565b600282019050919050565b7f6475723d22000000000000000000000000000000000000000000000000000000600082015250565b60006152bd60058361405a565b91506152c882615287565b600582019050919050565b7f732220626567696e3d22616e696d6174696f6e2e626567696e22200000000000600082015250565b6000615309601b8361405a565b9150615314826152d3565b601b82019050919050565b7f726570656174436f756e743d22696e646566696e697465222000000000000000600082015250565b600061535560198361405a565b91506153608261531f565b601982019050919050565b6000615376826148ee565b915061538182615218565b915061538d8285614029565b915061539882615264565b91506153a3826152b0565b91506153af82846140b1565b91506153ba826152fc565b91506153c582615348565b91506153d082614b4e565b91508190509392505050565b60006153ef6153ea846132e4565b61298e565b90508281526020810184848401111561540b5761540a6132df565b5b61541684828561274e565b509392505050565b600082601f830112615433576154326129ae565b5b81516154438482602086016153dc565b91505092915050565b600061545f61545a846136b4565b61298e565b90508060208402830185811115615479576154786129d9565b5b835b818110156154c057805167ffffffffffffffff81111561549e5761549d6129ae565b5b8086016154ab898261541e565b8552602085019450505060208101905061547b565b5050509392505050565b600082601f8301126154df576154de6129ae565b5b60506154ec84828561544c565b91505092915050565b60006020828403121561550b5761550a61288e565b5b600082015167ffffffffffffffff81111561552957615528612893565b5b615535848285016154ca565b91505092915050565b60006155498261267f565b91506155548361267f565b92508261556457615563614e3e565b5b828206905092915050565b600061557a826128f1565b9150615585836128f1565b9250828201905061ffff81111561559f5761559e613f79565b5b92915050565b60006155b0826128f1565b91506155bb836128f1565b9250828203905061ffff8111156155d5576155d4613f79565b5b92915050565b7f3c67207472616e73666f726d3d227472616e736c617465280000000000000000600082015250565b600061561160188361405a565b915061561c826155db565b601882019050919050565b7f2c20000000000000000000000000000000000000000000000000000000000000600082015250565b600061565d60028361405a565b915061566882615627565b600282019050919050565b7f29207363616c6528000000000000000000000000000000000000000000000000600082015250565b60006156a960088361405a565b91506156b482615673565b600882019050919050565b7f29223e0000000000000000000000000000000000000000000000000000000000600082015250565b60006156f560038361405a565b9150615700826156bf565b600382019050919050565b7f3c75736520687265663d2223636865636b222066696c6c3d2223000000000000600082015250565b6000615741601a8361405a565b915061574c8261570b565b601a82019050919050565b7f223e000000000000000000000000000000000000000000000000000000000000600082015250565b600061578d60028361405a565b915061579882615757565b600282019050919050565b7f3c2f7573653e3c2f673e00000000000000000000000000000000000000000000600082015250565b60006157d9600a8361405a565b91506157e4826157a3565b600a82019050919050565b60006157fa82615604565b915061580682886140b1565b915061581182615650565b915061581d82876140b1565b91506158288261569c565b915061583482866140b1565b915061583f826156e8565b915061584a82615734565b915061585682856140b1565b915061586182615780565b915061586d8284614029565b9150615878826157cc565b91508190509695505050505050565b60006158938285614029565b915061589f8284614029565b91508190509392505050565b60006158b68261267f565b915060ff82036158c9576158c8613f79565b5b600182019050919050565b60006158df82612caf565b91506158ea83612caf565b9250826158fa576158f9614e3e565b5b828204905092915050565b600061591082612caf565b915061591b83612caf565b925082820390508181111561593357615932613f79565b5b92915050565b60006159448261267f565b915061594f8361267f565b9250828201905060ff81111561596857615967613f79565b5b92915050565b6000819050919050565b61598961598482612caf565b61596e565b82525050565b600061599b8285615978565b6020820191506159ab82846140b1565b91508190509392505050565b60006159c38284615978565b6020820191508190509291505056fe4d32312e333620392e38383641332e39333320332e3933332030203020302031382038632d312e34323320302d322e36372e3735352d332e333620312e38383761332e39333520332e3933352030203020302d342e37353320342e37353341332e39333320332e3933332030203020302038203138633020312e3432332e37353520322e36363920312e38383620332e333661332e39333520332e39333520302030203020342e37353320342e37353320332e39333320332e39333320302030203020342e38363320312e353920332e39353320332e39353320302030203020312e3835382d312e35383920332e39333520332e39333520302030203020342e3735332d342e37353441332e39333320332e39333320302030203020323820313861332e39333320332e3933332030203020302d312e3838372d332e333620332e39333420332e3933342030203020302d312e3034322d332e37313120332e39333420332e3933342030203020302d332e37312d312e3034335a6d2d332e3935382031312e37313320342e3536322d362e383434632e3536362d2e3834362d2e3735312d312e3732342d312e3331362d2e3837386c2d342e30323620362e3034332d312e3337312d312e333638632d2e3731372d2e3732322d312e3833362e3339362d312e31313620312e3131366c322e313720322e3135612e3738382e37383820302030203020312e3039372d2e32325aa2646970667358221220683980159e6b9e0b8f15b940112fef63ee3e4c405595b025af47a27dd467ba0464736f6c63430008110033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.