ETH Price: $2,375.79 (+0.32%)

Contract

0x834A227Ec86776292601D298DE4a767677950a55
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040163829522023-01-11 10:23:59632 days ago1673432639IN
 Create: Renderer
0 ETH0.079039918.11288082

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Renderer

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

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

import "./Trigonometry.sol";
import "./Utilities.sol";
import "hardhat/console.sol";

contract Renderer {
  uint256 constant SIZE = 500;
  uint256 constant RADIUS = 200;
  uint256 constant PRECISION_DEGREE = 7;
  uint256 constant PRECISION = 10**PRECISION_DEGREE;

  struct ColorPalette {
    uint256 primaryHue;
    uint256 secondaryHue;
    utils.HSL primaryColorHsl;
    utils.HSL secondaryColorHsl;
    utils.HSL backgroundColorHsl;
    utils.HSL darkerSecondaryHsl;
    utils.HSL[] primaryColorsHsl;
    utils.HSL[] secondaryColorsHsl;
  }

  struct Kaleidoscope {
    uint256 tokenId;
    uint256 repetitions;
    uint256 numInsideArtifacts;
    uint256 numOutsideArtifacts;
    uint256 centerX_precise;
    uint256 centerY_precise;
    bool hasGradient;
    bool hasSecondaryColor;
    bool hasHalo;
  }

  struct AnimatedCircle {
    // Start position
    int256 x1;
    int256 y1;
    // End position
    int256 x2;
    int256 y2;
    uint256 radius1;
    uint256 radius2;
    uint256 alternatingClass;
    uint256 duration;
    utils.HSL color;
  }

  struct AnimatedTriangle {
    uint256 x1;
    uint256 y1;
    uint256 centerX;
    uint256 centerY;
    uint256 duration;
    utils.HSL color;
  }

  struct AnimatedRectangle {
    uint256 width;
    uint256 height;
    uint256 x;
    uint256 y;
    uint256 duration;
    utils.HSL color;
  }

  function colorPaletteForKaleidescope(Kaleidoscope memory _kaleidoscope)
    public
    pure
    returns (ColorPalette memory palette)
  {
    palette.primaryHue = utils.randomRange(_kaleidoscope.tokenId, "primaryHue", 0, 360);
    palette.secondaryHue = _kaleidoscope.hasSecondaryColor ? (palette.primaryHue + 240) % 360 : palette.primaryHue;
    palette.primaryColorHsl = utils.HSL(palette.primaryHue, 100, 30);
    palette.secondaryColorHsl = utils.HSL(palette.secondaryHue, 100, 70);
    palette.backgroundColorHsl = utils.HSL(palette.primaryHue, 100, 10);
    palette.darkerSecondaryHsl = utils.HSL((palette.primaryHue + 10) % 360, 100, 10);
    palette.primaryColorsHsl = utils.generateColors(palette.primaryHue, _kaleidoscope.numInsideArtifacts + 1);
    palette.secondaryColorsHsl = utils.generateColors(palette.secondaryHue, _kaleidoscope.numInsideArtifacts + 1);

    return palette;
  }

  function kaleidoscopeForTokenId(uint256 _tokenId) public pure returns (Kaleidoscope memory kaleidoscope) {
    kaleidoscope.tokenId = _tokenId;
    kaleidoscope.repetitions = utils.randomRange(_tokenId, "repetitions", 3, 20);
    kaleidoscope.numInsideArtifacts = utils.randomRange(_tokenId, "numInsideArtifacts", 3, 10);
    kaleidoscope.numOutsideArtifacts = utils.randomRange(_tokenId, "numOutsideArtifacts", 1, 4);
    kaleidoscope.hasGradient = utils.randomRange(_tokenId, "hasGradient", 1, 10) == 5;
    kaleidoscope.hasSecondaryColor = utils.randomRange(_tokenId, "secondaryColor", 1, 8) == 8;

    uint256 angle = (((180 - 360 / kaleidoscope.repetitions) / 2) * Trigonometry.PI) / 180;
    kaleidoscope.centerX_precise = uint256(
      (int256(RADIUS) * Trigonometry.cos(angle)) / int256(10**(18 - PRECISION_DEGREE))
    );
    kaleidoscope.centerY_precise = uint256(
      (int256(RADIUS) * Trigonometry.sin(angle)) / int256(10**(18 - PRECISION_DEGREE))
    );

    return kaleidoscope;
  }

  function circleAtIndexForKaleidescope(
    Kaleidoscope memory _kaleidoscope,
    ColorPalette memory _palette,
    uint256 _index
  ) public pure returns (AnimatedCircle memory circle) {
    uint256 yUpperBound = (_kaleidoscope.centerY_precise / PRECISION) + RADIUS / 8;

    circle.y1 = int256(
      utils.randomRange(_kaleidoscope.tokenId, string.concat("y1", utils.uint2str(_index)), 20, yUpperBound)
    );
    circle.y2 = int256(
      utils.randomRange(_kaleidoscope.tokenId, string.concat("y2", utils.uint2str(_index)), 20, yUpperBound)
    );

    circle.alternatingClass = utils.randomRange(
      _kaleidoscope.tokenId,
      string.concat("alternatingClass", utils.uint2str(_index)),
      0,
      3
    );

    if (circle.y1 > circle.y2 && circle.alternatingClass % 2 == 0) {
      int256 temp = circle.y1;
      circle.y1 = circle.y2;
      circle.y2 = temp;
    }

    int256 gradient_1000 = int256((_kaleidoscope.centerY_precise * 1000) / _kaleidoscope.centerX_precise);

    uint256 radiusUB = (_kaleidoscope.centerX_precise / PRECISION) * 2;
    circle.radius1 = uint256(
      utils.min((radiusUB * (1000 - (uint256(circle.y1) * 1000) / yUpperBound)) / 1000, radiusUB)
    );
    circle.radius2 = uint256(
      utils.min((radiusUB * (1000 - (uint256(circle.y2) * 1000) / yUpperBound)) / 1000, radiusUB)
    );

    // x1 should be within bounds of triangular path
    int256 lb1 = (circle.y1 * 1000) / gradient_1000;
    circle.x1 = int256(lb1 - int256(circle.radius1) * 2);

    // x2 should be within bounds of triangular path
    int256 lb2 = (circle.y2 * 1000) / gradient_1000;
    circle.x2 = int256(2 * int256(_kaleidoscope.centerX_precise / PRECISION) - lb2 + int256(circle.radius2) * 2);

    circle.duration = utils.randomRange(_kaleidoscope.tokenId, string.concat("duration", utils.uint2str(_index)), 3, 7);

    circle.color = _index % 2 == 0 ? _palette.primaryColorsHsl[_index + 1] : _palette.secondaryColorsHsl[_index + 1];

    return circle;
  }

  function rectangleAtIndexForKaleidescope(
    Kaleidoscope memory _kaleidoscope,
    ColorPalette memory _palette,
    uint256 _index
  ) public pure returns (AnimatedRectangle memory rectangle) {
    rectangle.width = utils.randomRange(
      _kaleidoscope.tokenId,
      string.concat("rectwidth", utils.uint2str(_index)),
      (_kaleidoscope.centerY_precise / PRECISION) / 2,
      (_kaleidoscope.centerY_precise / PRECISION)
    );
    rectangle.height = utils.randomRange(
      _kaleidoscope.tokenId,
      string.concat("rectheight", utils.uint2str(_index)),
      (_kaleidoscope.centerY_precise / PRECISION),
      _kaleidoscope.centerY_precise * 2 + RADIUS / 8
    );
    rectangle.x = 0;
    rectangle.y = _kaleidoscope.centerY_precise / PRECISION;
    rectangle.duration = utils.randomRange(
      _kaleidoscope.tokenId,
      string.concat("rectduration", utils.uint2str(_index)),
      5,
      10
    );
    rectangle.color = _index % 2 == 0 ? _palette.primaryColorsHsl[0] : _palette.secondaryColorsHsl[0];

    return rectangle;
  }

  function getCircleSVG(AnimatedCircle memory _circle) public pure returns (string memory) {
    string memory animations = string.concat(
      '<animate attributeName="r" values="',
      utils.uint2str(_circle.radius1),
      ";",
      utils.uint2str(_circle.radius2),
      ";",
      utils.uint2str(_circle.radius1),
      ";",
      utils.uint2str(_circle.radius2),
      '" calcMode="linear" dur="',
      utils.uint2str(_circle.duration * 2),
      's" repeatCount="indefinite"/>'
    );

    animations = string.concat(
      animations,
      '<animate attributeName="cy" values="',
      utils.int2str(_circle.y1),
      ";",
      utils.int2str(_circle.y2),
      ";",
      utils.int2str(_circle.y1),
      ";",
      utils.int2str(_circle.y2),
      '" calcMode="linear" dur="',
      utils.uint2str(_circle.duration * 2),
      's" repeatCount="indefinite"/>'
    );

    animations = string.concat(
      animations,
      '<animate attributeName="cx" values="',
      utils.int2str(_circle.x1),
      ";",
      utils.int2str(_circle.x2),
      ";",
      utils.int2str(_circle.x1),
      ";",
      utils.int2str(_circle.x2),
      '" calcMode="linear" dur="',
      utils.uint2str(_circle.duration * 2),
      's" repeatCount="indefinite"/>'
    );

    return
      string.concat(
        '<circle cx="',
        utils.int2str((_circle.x1 + _circle.x2) / 2),
        '" cy="',
        utils.int2str((_circle.y1 + _circle.y2) / 2),
        '" r="',
        utils.uint2str((_circle.radius1 + _circle.radius2) / 2),
        '" fill="',
        utils.getHslString(_circle.color),
        '">',
        animations,
        "</circle>"
      );
  }

  function getRectangleSVG(AnimatedRectangle memory _rectangle) public pure returns (string memory) {
    string memory animations = string.concat(
      '<animateTransform attributeName="transform" type="rotate" from="0 0 -',
      utils.uint2str(_rectangle.y),
      '" to="-360 0 -',
      utils.uint2str(_rectangle.y),
      '" begin="0s" dur="',
      utils.uint2str(_rectangle.duration),
      's" repeatCount="indefinite" />'
    );

    return
      string.concat(
        '<rect rx="3" ry="3" x="0" y="-',
        utils.uint2str(_rectangle.y),
        '" width="',
        utils.uint2str(_rectangle.width),
        '" height="',
        utils.uint2str(_rectangle.height),
        '" fill="',
        utils.getHslString(_rectangle.color),
        '">',
        animations,
        "</rect>"
      );
  }

  function linearGradient(string memory _stop1Color, string memory _stop2Color) internal pure returns (string memory) {
    return
      string.concat(
        '<linearGradient id="gradient">',
        '<stop offset="0%" stop-color="',
        _stop1Color,
        '"/>',
        '<stop offset="100%" stop-color="',
        _stop2Color,
        '"/>',
        "</linearGradient>"
      );
  }

  function getKaleidoscopeSVG(Kaleidoscope memory _kaleidoscope, ColorPalette memory _palette)
    public
    pure
    returns (string memory)
  {
    // Get outer artifacts
    string memory outerArtifacts = "";
    for (uint256 i = 0; i < _kaleidoscope.numOutsideArtifacts; i++) {
      // Rectangle
      AnimatedRectangle memory rectangle = rectangleAtIndexForKaleidescope(_kaleidoscope, _palette, i);
      outerArtifacts = string.concat(outerArtifacts, getRectangleSVG(rectangle));
    }

    string memory innerArtifacts = "";
    for (uint256 i = 0; i < _kaleidoscope.numInsideArtifacts; i++) {
      AnimatedCircle memory circle = circleAtIndexForKaleidescope(_kaleidoscope, _palette, i);
      innerArtifacts = string.concat(innerArtifacts, getCircleSVG(circle));
    }

    string memory paths = "";
    uint256 angleInterval = (360 * 10**7) / _kaleidoscope.repetitions;
    for (uint256 i = 0; i < _kaleidoscope.repetitions; i++) {
      paths = string.concat(
        paths,
        '<use href="#tile" transform="rotate(',
        utils.uint2floatstr(angleInterval * i, PRECISION_DEGREE),
        ",",
        utils.uint2floatstr(_kaleidoscope.centerX_precise, PRECISION_DEGREE),
        ",",
        utils.uint2floatstr(_kaleidoscope.centerY_precise, PRECISION_DEGREE),
        ')" />'
      );
    }

    string memory clipPath = string.concat(
      '<clipPath id="clip">',
      '<path d="M0,0L',
      utils.uint2floatstr(_kaleidoscope.centerX_precise, PRECISION_DEGREE),
      ",",
      utils.uint2floatstr(_kaleidoscope.centerY_precise, PRECISION_DEGREE),
      "L",
      utils.uint2floatstr(_kaleidoscope.centerX_precise * 2, PRECISION_DEGREE),
      ",0A",
      utils.uint2str(RADIUS),
      ",",
      utils.uint2str(RADIUS),
      ',0,0,0,0,0Z" />',
      "</clipPath>"
    );

    string memory svg = string.concat(
      '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ',
      utils.uint2str(SIZE),
      " ",
      utils.uint2str(SIZE),
      '" width="',
      utils.uint2str(SIZE),
      '" height="',
      utils.uint2str(SIZE),
      '"><defs>',
      linearGradient(utils.getHslString(_palette.primaryColorHsl), utils.getHslString(_palette.darkerSecondaryHsl)),
      clipPath,
      '<g id="tile" clip-path="url(#clip)">',
      '<rect x="0" y="-',
      utils.uint2str(RADIUS),
      '" width="',
      utils.uint2str(RADIUS * 2),
      '" height="',
      utils.uint2str(RADIUS * 2),
      '" fill="'
    );

    svg = string.concat(
      svg,
      _kaleidoscope.hasGradient ? "url(#gradient)" : utils.getHslString(_palette.primaryColorHsl),
      '"></rect>',
      outerArtifacts,
      innerArtifacts,
      "</g>"
    );

    svg = string.concat(
      svg,
      "</defs>",
      '<rect width="',
      utils.uint2str(SIZE),
      '" height="',
      utils.uint2str(SIZE),
      '" fill="',
      utils.getHslString(_palette.backgroundColorHsl),
      '"></rect>',
      '<g id="kaleidoscopeTile" transform="translate(',
      utils.uint2str(SIZE / 2 - _kaleidoscope.centerX_precise / PRECISION)
      // "0"
    );

    string memory backgroundCircleBase = string.concat(
      '<circle cx="',
      utils.uint2floatstr(_kaleidoscope.centerX_precise, PRECISION_DEGREE),
      '" cy="',
      utils.uint2floatstr(_kaleidoscope.centerY_precise, PRECISION_DEGREE),
      '" r="'
    );

    string memory haloTrait = string.concat(
      backgroundCircleBase,
      utils.uint2str(RADIUS + 8),
      '" fill="none"',
      _kaleidoscope.hasHalo ? ' stroke="#EBA947" stroke-width="4"' : "",
      "/>"
    );

    svg = string.concat(
      svg,
      ",",
      utils.uint2str(SIZE / 2 - _kaleidoscope.centerY_precise / PRECISION),
      // "0",
      ')">',
      backgroundCircleBase,
      utils.uint2str(RADIUS),
      '" fill="',
      utils.getHslString(_palette.primaryColorHsl),
      '" />',
      _kaleidoscope.hasHalo ? haloTrait : ""
    );

    svg = string.concat(svg, paths, "</g>", "</svg>");

    return svg;
  }

  function render(uint256 _tokenId) public pure returns (string memory) {
    Kaleidoscope memory kaleidoscope = kaleidoscopeForTokenId(_tokenId);
    ColorPalette memory palette = colorPaletteForKaleidescope(kaleidoscope);
    string memory svg = getKaleidoscopeSVG(kaleidoscope, palette);

    return svg;
  }

  function metadata(uint256 _tokenId) public pure returns (Kaleidoscope memory) {
    Kaleidoscope memory kaleidoscope = kaleidoscopeForTokenId(_tokenId);
    return kaleidoscope;
  }
}

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

/**
 * @notice Solidity library offering basic trigonometry functions where inputs and outputs are
 * integers. Inputs are specified in radians scaled by 1e18, and similarly outputs are scaled by 1e18.
 *
 * This implementation is based off the Solidity trigonometry library written by Lefteris Karapetsas
 * which can be found here: https://github.com/Sikorkaio/sikorka/blob/e75c91925c914beaedf4841c0336a806f2b5f66d/contracts/trigonometry.sol
 *
 * Compared to Lefteris' implementation, this version makes the following changes:
 *   - Uses a 32 bits instead of 16 bits for improved accuracy
 *   - Updated for Solidity 0.8.x
 *   - Various gas optimizations
 *   - Change inputs/outputs to standard trig format (scaled by 1e18) instead of requiring the
 *     integer format used by the algorithm
 *
 * Lefertis' implementation is based off Dave Dribin's trigint C library
 *     http://www.dribin.org/dave/trigint/
 *
 * Which in turn is based from a now deleted article which can be found in the Wayback Machine:
 *     http://web.archive.org/web/20120301144605/http://www.dattalo.com/technical/software/pic/picsine.html
 */
library Trigonometry {
  // Table index into the trigonometric table
  uint256 constant INDEX_WIDTH = 8;
  // Interpolation between successive entries in the table
  uint256 constant INTERP_WIDTH = 16;
  uint256 constant INDEX_OFFSET = 28 - INDEX_WIDTH;
  uint256 constant INTERP_OFFSET = INDEX_OFFSET - INTERP_WIDTH;
  uint32 constant ANGLES_IN_CYCLE = 1073741824;
  uint32 constant QUADRANT_HIGH_MASK = 536870912;
  uint32 constant QUADRANT_LOW_MASK = 268435456;
  uint256 constant SINE_TABLE_SIZE = 256;

  // Pi as an 18 decimal value, which is plenty of accuracy: "For JPL's highest accuracy calculations, which are for
  // interplanetary navigation, we use 3.141592653589793: https://www.jpl.nasa.gov/edu/news/2016/3/16/how-many-decimals-of-pi-do-we-really-need/
  uint256 constant PI = 3141592653589793238;
  uint256 constant TWO_PI = 2 * PI;
  uint256 constant PI_OVER_TWO = PI / 2;

  // The constant sine lookup table was generated by generate_trigonometry.py. We must use a constant
  // bytes array because constant arrays are not supported in Solidity. Each entry in the lookup
  // table is 4 bytes. Since we're using 32-bit parameters for the lookup table, we get a table size
  // of 2^(32/4) + 1 = 257, where the first and last entries are equivalent (hence the table size of
  // 256 defined above)
  uint8 constant entry_bytes = 4; // each entry in the lookup table is 4 bytes
  uint256 constant entry_mask = ((1 << (8 * entry_bytes)) - 1); // mask used to cast bytes32 -> lookup table entry
  bytes constant sin_table =
    hex"00_00_00_00_00_c9_0f_88_01_92_1d_20_02_5b_26_d7_03_24_2a_bf_03_ed_26_e6_04_b6_19_5d_05_7f_00_35_06_47_d9_7c_07_10_a3_45_07_d9_5b_9e_08_a2_00_9a_09_6a_90_49_0a_33_08_bc_0a_fb_68_05_0b_c3_ac_35_0c_8b_d3_5e_0d_53_db_92_0e_1b_c2_e4_0e_e3_87_66_0f_ab_27_2b_10_72_a0_48_11_39_f0_cf_12_01_16_d5_12_c8_10_6e_13_8e_db_b1_14_55_76_b1_15_1b_df_85_15_e2_14_44_16_a8_13_05_17_6d_d9_de_18_33_66_e8_18_f8_b8_3c_19_bd_cb_f3_1a_82_a0_25_1b_47_32_ef_1c_0b_82_6a_1c_cf_8c_b3_1d_93_4f_e5_1e_56_ca_1e_1f_19_f9_7b_1f_dc_dc_1b_20_9f_70_1c_21_61_b3_9f_22_23_a4_c5_22_e5_41_af_23_a6_88_7e_24_67_77_57_25_28_0c_5d_25_e8_45_b6_26_a8_21_85_27_67_9d_f4_28_26_b9_28_28_e5_71_4a_29_a3_c4_85_2a_61_b1_01_2b_1f_34_eb_2b_dc_4e_6f_2c_98_fb_ba_2d_55_3a_fb_2e_11_0a_62_2e_cc_68_1e_2f_87_52_62_30_41_c7_60_30_fb_c5_4d_31_b5_4a_5d_32_6e_54_c7_33_26_e2_c2_33_de_f2_87_34_96_82_4f_35_4d_90_56_36_04_1a_d9_36_ba_20_13_37_6f_9e_46_38_24_93_b0_38_d8_fe_93_39_8c_dd_32_3a_40_2d_d1_3a_f2_ee_b7_3b_a5_1e_29_3c_56_ba_70_3d_07_c1_d5_3d_b8_32_a5_3e_68_0b_2c_3f_17_49_b7_3f_c5_ec_97_40_73_f2_1d_41_21_58_9a_41_ce_1e_64_42_7a_41_d0_43_25_c1_35_43_d0_9a_ec_44_7a_cd_50_45_24_56_bc_45_cd_35_8f_46_75_68_27_47_1c_ec_e6_47_c3_c2_2e_48_69_e6_64_49_0f_57_ee_49_b4_15_33_4a_58_1c_9d_4a_fb_6c_97_4b_9e_03_8f_4c_3f_df_f3_4c_e1_00_34_4d_81_62_c3_4e_21_06_17_4e_bf_e8_a4_4f_5e_08_e2_4f_fb_65_4c_50_97_fc_5e_51_33_cc_94_51_ce_d4_6e_52_69_12_6e_53_02_85_17_53_9b_2a_ef_54_33_02_7d_54_ca_0a_4a_55_60_40_e2_55_f5_a4_d2_56_8a_34_a9_57_1d_ee_f9_57_b0_d2_55_58_42_dd_54_58_d4_0e_8c_59_64_64_97_59_f3_de_12_5a_82_79_99_5b_10_35_ce_5b_9d_11_53_5c_29_0a_cc_5c_b4_20_df_5d_3e_52_36_5d_c7_9d_7b_5e_50_01_5d_5e_d7_7c_89_5f_5e_0d_b2_5f_e3_b3_8d_60_68_6c_ce_60_ec_38_2f_61_6f_14_6b_61_f1_00_3e_62_71_fa_68_62_f2_01_ac_63_71_14_cc_63_ef_32_8f_64_6c_59_bf_64_e8_89_25_65_63_bf_91_65_dd_fb_d2_66_57_3c_bb_66_cf_81_1f_67_46_c7_d7_67_bd_0f_bc_68_32_57_aa_68_a6_9e_80_69_19_e3_1f_69_8c_24_6b_69_fd_61_4a_6a_6d_98_a3_6a_dc_c9_64_6b_4a_f2_78_6b_b8_12_d0_6c_24_29_5f_6c_8f_35_1b_6c_f9_34_fb_6d_62_27_f9_6d_ca_0d_14_6e_30_e3_49_6e_96_a9_9c_6e_fb_5f_11_6f_5f_02_b1_6f_c1_93_84_70_23_10_99_70_83_78_fe_70_e2_cb_c5_71_41_08_04_71_9e_2c_d1_71_fa_39_48_72_55_2c_84_72_af_05_a6_73_07_c3_cf_73_5f_66_25_73_b5_eb_d0_74_0b_53_fa_74_5f_9d_d0_74_b2_c8_83_75_04_d3_44_75_55_bd_4b_75_a5_85_ce_75_f4_2c_0a_76_41_af_3c_76_8e_0e_a5_76_d9_49_88_77_23_5f_2c_77_6c_4e_da_77_b4_17_df_77_fa_b9_88_78_40_33_28_78_84_84_13_78_c7_ab_a1_79_09_a9_2c_79_4a_7c_11_79_8a_23_b0_79_c8_9f_6d_7a_05_ee_ac_7a_42_10_d8_7a_7d_05_5a_7a_b6_cb_a3_7a_ef_63_23_7b_26_cb_4e_7b_5d_03_9d_7b_92_0b_88_7b_c5_e2_8f_7b_f8_88_2f_7c_29_fb_ed_7c_5a_3d_4f_7c_89_4b_dd_7c_b7_27_23_7c_e3_ce_b1_7d_0f_42_17_7d_39_80_eb_7d_62_8a_c5_7d_8a_5f_3f_7d_b0_fd_f7_7d_d6_66_8e_7d_fa_98_a7_7e_1d_93_e9_7e_3f_57_fe_7e_5f_e4_92_7e_7f_39_56_7e_9d_55_fb_7e_ba_3a_38_7e_d5_e5_c5_7e_f0_58_5f_7f_09_91_c3_7f_21_91_b3_7f_38_57_f5_7f_4d_e4_50_7f_62_36_8e_7f_75_4e_7f_7f_87_2b_f2_7f_97_ce_bc_7f_a7_36_b3_7f_b5_63_b2_7f_c2_55_95_7f_ce_0c_3d_7f_d8_87_8d_7f_e1_c7_6a_7f_e9_cb_bf_7f_f0_94_77_7f_f6_21_81_7f_fa_72_d0_7f_fd_88_59_7f_ff_62_15_7f_ff_ff_ff";

  /**
   * @notice Return the sine of a value, specified in radians scaled by 1e18
   * @dev This algorithm for converting sine only uses integer values, and it works by dividing the
   * circle into 30 bit angles, i.e. there are 1,073,741,824 (2^30) angle units, instead of the
   * standard 360 degrees (2pi radians). From there, we get an output in range -2,147,483,647 to
   * 2,147,483,647, (which is the max value of an int32) which is then converted back to the standard
   * range of -1 to 1, again scaled by 1e18
   * @param _angle Angle to convert
   * @return Result scaled by 1e18
   */
  function sin(uint256 _angle) internal pure returns (int256) {
    unchecked {
      // Convert angle from from arbitrary radian value (range of 0 to 2pi) to the algorithm's range
      // of 0 to 1,073,741,824
      _angle = (ANGLES_IN_CYCLE * (_angle % TWO_PI)) / TWO_PI;

      // Apply a mask on an integer to extract a certain number of bits, where angle is the integer
      // whose bits we want to get, the width is the width of the bits (in bits) we want to extract,
      // and the offset is the offset of the bits (in bits) we want to extract. The result is an
      // integer containing _width bits of _value starting at the offset bit
      uint256 interp = (_angle >> INTERP_OFFSET) & ((1 << INTERP_WIDTH) - 1);
      uint256 index = (_angle >> INDEX_OFFSET) & ((1 << INDEX_WIDTH) - 1);

      // The lookup table only contains data for one quadrant (since sin is symmetric around both
      // axes), so here we figure out which quadrant we're in, then we lookup the values in the
      // table then modify values accordingly
      bool is_odd_quadrant = (_angle & QUADRANT_LOW_MASK) == 0;
      bool is_negative_quadrant = (_angle & QUADRANT_HIGH_MASK) != 0;

      if (!is_odd_quadrant) {
        index = SINE_TABLE_SIZE - 1 - index;
      }

      bytes memory table = sin_table;
      // We are looking for two consecutive indices in our lookup table
      // Since EVM is left aligned, to read n bytes of data from idx i, we must read from `i * data_len` + `n`
      // therefore, to read two entries of size entry_bytes `index * entry_bytes` + `entry_bytes * 2`
      uint256 offset1_2 = (index + 2) * entry_bytes;

      // This following snippet will function for any entry_bytes <= 15
      uint256 x1_2;
      assembly {
        // mload will grab one word worth of bytes (32), as that is the minimum size in EVM
        x1_2 := mload(add(table, offset1_2))
      }

      // We now read the last two numbers of size entry_bytes from x1_2
      // in example: entry_bytes = 4; x1_2 = 0x00...12345678abcdefgh
      // therefore: entry_mask = 0xFFFFFFFF

      // 0x00...12345678abcdefgh >> 8*4 = 0x00...12345678
      // 0x00...12345678 & 0xFFFFFFFF = 0x12345678
      uint256 x1 = (x1_2 >> (8 * entry_bytes)) & entry_mask;
      // 0x00...12345678abcdefgh & 0xFFFFFFFF = 0xabcdefgh
      uint256 x2 = x1_2 & entry_mask;

      // Approximate angle by interpolating in the table, accounting for the quadrant
      uint256 approximation = ((x2 - x1) * interp) >> INTERP_WIDTH;
      int256 sine = is_odd_quadrant ? int256(x1) + int256(approximation) : int256(x2) - int256(approximation);
      if (is_negative_quadrant) {
        sine *= -1;
      }

      // Bring result from the range of -2,147,483,647 through 2,147,483,647 to -1e18 through 1e18.
      // This can never overflow because sine is bounded by the above values
      return (sine * 1e18) / 2_147_483_647;
    }
  }

  /**
   * @notice Return the cosine of a value, specified in radians scaled by 1e18
   * @dev This is identical to the sin() method, and just computes the value by delegating to the
   * sin() method using the identity cos(x) = sin(x + pi/2)
   * @dev Overflow when `angle + PI_OVER_TWO > type(uint256).max` is ok, results are still accurate
   * @param _angle Angle to convert
   * @return Result scaled by 1e18
   */
  function cos(uint256 _angle) internal pure returns (int256) {
    unchecked {
      return sin(_angle + PI_OVER_TWO);
    }
  }
}

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

// Core utils used extensively to format CSS and numbers.
library utils {
  struct HSL {
    uint256 h;
    uint256 s;
    uint256 l;
  }

  function random(string memory input) internal pure returns (uint256) {
    return uint256(keccak256(abi.encodePacked(input)));
  }

  function randomRange(
    uint256 tokenId,
    string memory keyPrefix,
    uint256 lower,
    uint256 upper
  ) internal pure returns (uint256) {
    uint256 rand = random(string(abi.encodePacked(keyPrefix, uint2str(tokenId))));
    return (rand % (upper - lower + 1)) + lower;
  }

  function min(int256 a, int256 b) internal pure returns (int256) {
    return a < b ? a : b;
  }

  function min(uint256 a, uint256 b) internal pure returns (uint256) {
    return a < b ? a : b;
  }

  function max(int256 a, int256 b) internal pure returns (int256) {
    return a > b ? a : b;
  }

  function generateColors(uint256 _hue, uint256 _numColors) public pure returns (HSL[] memory) {
    HSL[] memory colors = new HSL[](_numColors);

    for (uint256 i = 0; i < _numColors; i++) {
      colors[i] = HSL(_hue, 100 - ((i * 50) / _numColors), 70 - ((i * 30) / _numColors));
    }

    return colors;
  }

  function getHueName(uint256 _hue) public pure returns (string memory) {
    _hue = _hue % 360;

    string[12] memory colors = [
      "Red",
      "Orange",
      "Yellow",
      "Chartreuse",
      "Green",
      "Spring green",
      "Turquoise",
      "Teal",
      "Blue",
      "Violet",
      "Magenta",
      "Rose"
    ];

    uint256 colorIndex = (_hue / 30) % colors.length;
    return colors[colorIndex];
  }

  function getHslString(HSL memory _hsl) public pure returns (string memory) {
    return string(abi.encodePacked("hsl(", uint2str(_hsl.h), ",", uint2str(_hsl.s), "%,", uint2str(_hsl.l), "%)"));
  }

  function uint2floatstr(uint256 _i_scaled, uint256 _decimals) internal pure returns (string memory) {
    return string.concat(uint2str(_i_scaled / (10**_decimals)), ".", uint2str(_i_scaled % (10**_decimals)));
  }

  function int2str(int256 _i) internal pure returns (string memory _uintAsString) {
    if (_i < 0) {
      return string.concat("-", uint2str(uint256(-_i)));
    } else {
      return uint2str(uint256(_i));
    }
  }

  // converts an unsigned 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);
  }
}

File 4 of 4 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
	}

	function logUint(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint256 p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
	}

	function log(uint256 p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
	}

	function log(uint256 p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
	}

	function log(uint256 p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
	}

	function log(string memory p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint256 p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"_kaleidoscope","type":"tuple"},{"components":[{"internalType":"uint256","name":"primaryHue","type":"uint256"},{"internalType":"uint256","name":"secondaryHue","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"primaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"secondaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"backgroundColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"darkerSecondaryHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"primaryColorsHsl","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"secondaryColorsHsl","type":"tuple[]"}],"internalType":"struct Renderer.ColorPalette","name":"_palette","type":"tuple"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"circleAtIndexForKaleidescope","outputs":[{"components":[{"internalType":"int256","name":"x1","type":"int256"},{"internalType":"int256","name":"y1","type":"int256"},{"internalType":"int256","name":"x2","type":"int256"},{"internalType":"int256","name":"y2","type":"int256"},{"internalType":"uint256","name":"radius1","type":"uint256"},{"internalType":"uint256","name":"radius2","type":"uint256"},{"internalType":"uint256","name":"alternatingClass","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"color","type":"tuple"}],"internalType":"struct Renderer.AnimatedCircle","name":"circle","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"_kaleidoscope","type":"tuple"}],"name":"colorPaletteForKaleidescope","outputs":[{"components":[{"internalType":"uint256","name":"primaryHue","type":"uint256"},{"internalType":"uint256","name":"secondaryHue","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"primaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"secondaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"backgroundColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"darkerSecondaryHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"primaryColorsHsl","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"secondaryColorsHsl","type":"tuple[]"}],"internalType":"struct Renderer.ColorPalette","name":"palette","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"int256","name":"x1","type":"int256"},{"internalType":"int256","name":"y1","type":"int256"},{"internalType":"int256","name":"x2","type":"int256"},{"internalType":"int256","name":"y2","type":"int256"},{"internalType":"uint256","name":"radius1","type":"uint256"},{"internalType":"uint256","name":"radius2","type":"uint256"},{"internalType":"uint256","name":"alternatingClass","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"color","type":"tuple"}],"internalType":"struct Renderer.AnimatedCircle","name":"_circle","type":"tuple"}],"name":"getCircleSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"_kaleidoscope","type":"tuple"},{"components":[{"internalType":"uint256","name":"primaryHue","type":"uint256"},{"internalType":"uint256","name":"secondaryHue","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"primaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"secondaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"backgroundColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"darkerSecondaryHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"primaryColorsHsl","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"secondaryColorsHsl","type":"tuple[]"}],"internalType":"struct Renderer.ColorPalette","name":"_palette","type":"tuple"}],"name":"getKaleidoscopeSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"width","type":"uint256"},{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"color","type":"tuple"}],"internalType":"struct Renderer.AnimatedRectangle","name":"_rectangle","type":"tuple"}],"name":"getRectangleSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"kaleidoscopeForTokenId","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"kaleidoscope","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"metadata","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"_kaleidoscope","type":"tuple"},{"components":[{"internalType":"uint256","name":"primaryHue","type":"uint256"},{"internalType":"uint256","name":"secondaryHue","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"primaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"secondaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"backgroundColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"darkerSecondaryHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"primaryColorsHsl","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"secondaryColorsHsl","type":"tuple[]"}],"internalType":"struct Renderer.ColorPalette","name":"_palette","type":"tuple"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"rectangleAtIndexForKaleidescope","outputs":[{"components":[{"internalType":"uint256","name":"width","type":"uint256"},{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"color","type":"tuple"}],"internalType":"struct Renderer.AnimatedRectangle","name":"rectangle","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"render","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

608060405234801561001057600080fd5b50614e50806100206000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063aa9e7e7511610066578063aa9e7e7514610158578063b3c34a5014610188578063c321118c146101b8578063d6cf5f55146101e8578063e3684e391461021857610093565b80631ac48ab1146100985780637d11e69c146100c85780638a0e9ad7146100f857806391b078a414610128575b600080fd5b6100b260048036038101906100ad919061212f565b610248565b6040516100bf91906121dc565b60405180910390f35b6100e260048036038101906100dd91906124e9565b6104cc565b6040516100ef91906121dc565b60405180910390f35b610112600480360381019061010d9190612547565b610c4e565b60405161011f9190612686565b60405180910390f35b610142600480360381019061013d91906126a2565b610e3a565b60405161014f919061283a565b60405180910390f35b610172600480360381019061016d91906128fd565b6110c6565b60405161017f91906121dc565b60405180910390f35b6101a2600480360381019061019d9190612547565b6111e8565b6040516101af91906129f1565b60405180910390f35b6101d260048036038101906101cd9190612a0d565b6115bc565b6040516101df91906121dc565b60405180910390f35b61020260048036038101906101fd9190612a0d565b6115f1565b60405161020f9190612b00565b60405180910390f35b610232600480360381019061022d9190612a0d565b611868565b60405161023f9190612b00565b60405180910390f35b606060006102598360800151611886565b6102668460a00151611886565b6102738560800151611886565b6102808660a00151611886565b61029960028860e001516102949190612b4b565b611886565b6040516020016102ad959493929190612cc5565b6040516020818303038152906040529050806102cc8460200151611a0e565b6102d98560600151611a0e565b6102e68660200151611a0e565b6102f38760600151611a0e565b61030c60028960e001516103079190612b4b565b611886565b60405160200161032196959493929190612dd8565b6040516020818303038152906040529050806103408460000151611a0e565b61034d8560400151611a0e565b61035a8660000151611a0e565b6103678760400151611a0e565b61038060028960e0015161037b9190612b4b565b611886565b60405160200161039596959493929190612ef8565b60405160208183030381529060405290506103ce6002846040015185600001516103bf9190612fa6565b6103c99190613019565b611a0e565b6103f66002856060015186602001516103e79190612fa6565b6103f19190613019565b611a0e565b61041e60028660a00151876080015161040f9190613083565b61041991906130b7565b611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588761010001516040518263ffffffff1660e01b815260040161045a9190613139565b600060405180830381865af4158015610477573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104a091906131fa565b846040516020016104b5959493929190613327565b604051602081830303815290604052915050919050565b6060600060405180602001604052806000815250905060005b84606001518110156105405760006104fe868684610c4e565b90508261050a826110c6565b60405160200161051b9291906133cc565b6040516020818303038152906040529250508080610538906133f0565b9150506104e5565b50600060405180602001604052806000815250905060005b85604001518110156105b35760006105718787846111e8565b90508261057d82610248565b60405160200161058e9291906133cc565b60405160208183030381529060405292505080806105ab906133f0565b915050610558565b5060006040518060200160405280600081525090506000866020015163d693a4006105de91906130b7565b905060005b876020015181101561065b578261060682846105ff9190612b4b565b6007611a62565b6106158a608001516007611a62565b6106248b60a001516007611a62565b60405160200161063794939291906134f6565b60405160208183030381529060405292508080610653906133f0565b9150506105e3565b50600061066d88608001516007611a62565b61067c8960a001516007611a62565b61069760028b608001516106909190612b4b565b6007611a62565b6106a160c8611886565b6106ab60c8611886565b6040516020016106bf959493929190613650565b604051602081830303815290604052905060006106dd6101f4611886565b6106e86101f4611886565b6106f36101f4611886565b6106fe6101f4611886565b6108087301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588e604001516040518263ffffffff1660e01b815260040161073c9190613139565b600060405180830381865af4158015610759573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061078291906131fa565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588f60a001516040518263ffffffff1660e01b81526004016107bd9190613139565b600060405180830381865af41580156107da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061080391906131fa565b611acc565b8661081360c8611886565b610829600260c86108249190612b4b565b611886565b61083f600260c861083a9190612b4b565b611886565b604051602001610857999897969594939291906138b5565b6040516020818303038152906040529050808960c001516108f8577301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588a604001516040518263ffffffff1660e01b81526004016108ad9190613139565b600060405180830381865af41580156108ca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108f391906131fa565b61092f565b6040518060400160405280600e81526020017f75726c28236772616469656e74290000000000000000000000000000000000008152505b87876040516020016109449493929190613a0e565b6040516020818303038152906040529050806109616101f4611886565b61096c6101f4611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588c608001516040518263ffffffff1660e01b81526004016109a79190613139565b600060405180830381865af41580156109c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109ed91906131fa565b610a2b6007600a6109fe9190613b9d565b8e60800151610a0d91906130b7565b60026101f4610a1c91906130b7565b610a269190613be8565b611886565b604051602001610a3f959493929190613cda565b60405160208183030381529060405290506000610a618a608001516007611a62565b610a708b60a001516007611a62565b604051602001610a81929190613d7b565b6040516020818303038152906040529050600081610aab600860c8610aa69190613083565b611886565b8c6101000151610aca5760405180602001604052806000815250610ae4565b604051806060016040528060228152602001614df9602291395b604051602001610af693929190613e18565b604051602081830303815290604052905082610b466007600a610b199190613b9d565b8d60a00151610b2891906130b7565b60026101f4610b3791906130b7565b610b419190613be8565b611886565b83610b5160c8611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588f604001516040518263ffffffff1660e01b8152600401610b8c9190613139565b600060405180830381865af4158015610ba9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bd291906131fa565b8f6101000151610bf15760405180602001604052806000815250610bf3565b855b604051602001610c0896959493929190613eb3565b60405160208183030381529060405292508286604051602001610c2c929190613f6d565b6040516020818303038152906040529250829850505050505050505092915050565b610c56611d77565b610cd18460000151610c6784611886565b604051602001610c779190613fd5565b60405160208183030381529060405260026007600a610c969190613b9d565b8860a00151610ca591906130b7565b610caf91906130b7565b6007600a610cbd9190613b9d565b8860a00151610ccc91906130b7565b611af8565b816000018181525050610d558460000151610ceb84611886565b604051602001610cfb9190614021565b6040516020818303038152906040526007600a610d189190613b9d565b8760a00151610d2791906130b7565b600860c8610d3591906130b7565b60028960a00151610d469190612b4b565b610d509190613083565b611af8565b81602001818152505060008160400181815250506007600a610d779190613b9d565b8460a00151610d8691906130b7565b816060018181525050610dc88460000151610da084611886565b604051602001610db0919061406d565b6040516020818303038152906040526005600a611af8565b8160800181815250506000600283610de09190614093565b14610e0a578260e00151600081518110610dfd57610dfc6140c4565b5b6020026020010151610e2b565b8260c00151600081518110610e2257610e216140c4565b5b60200260200101515b8160a001819052509392505050565b610e42611db3565b610e8a82600001516040518060400160405280600a81526020017f7072696d617279487565000000000000000000000000000000000000000000008152506000610168611af8565b8160000181815250508160e00151610ea6578060000151610ec5565b61016860f08260000151610eba9190613083565b610ec49190614093565b5b81602001818152505060405180606001604052808260000151815260200160648152602001601e8152508160400181905250604051806060016040528082602001518152602001606481526020016046815250816060018190525060405180606001604052808260000151815260200160648152602001600a81525081608001819052506040518060600160405280610168600a8460000151610f689190613083565b610f729190614093565b815260200160648152602001600a8152508160a001819052507301e833cf8c115bb859a8e16a72d5ff298f834413635c1b88f9826000015160018560400151610fbb9190613083565b6040518363ffffffff1660e01b8152600401610fd8929190614102565b600060405180830381865af4158015610ff5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101e919061423b565b8160c001819052507301e833cf8c115bb859a8e16a72d5ff298f834413635c1b88f98260200151600185604001516110569190613083565b6040518363ffffffff1660e01b8152600401611073929190614102565b600060405180830381865af4158015611090573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110b9919061423b565b8160e00181905250919050565b606060006110d78360600151611886565b6110e48460600151611886565b6110f18560800151611886565b6040516020016111039392919061438e565b60405160208183030381529060405290506111218360600151611886565b61112e8460000151611886565b61113b8560200151611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588760a001516040518263ffffffff1660e01b81526004016111769190613139565b600060405180830381865af4158015611193573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111bc91906131fa565b846040516020016111d1959493929190614443565b604051602081830303815290604052915050919050565b6111f0611e10565b6000600860c861120091906130b7565b6007600a61120e9190613b9d565b8660a0015161121d91906130b7565b6112279190613083565b9050611261856000015161123a85611886565b60405160200161124a919061450e565b604051602081830303815290604052601484611af8565b8260200181815250506112a2856000015161127b85611886565b60405160200161128b919061455a565b604051602081830303815290604052601484611af8565b8260600181815250506112e485600001516112bc85611886565b6040516020016112cc91906145a6565b60405160208183030381529060405260006003611af8565b8260c0018181525050816060015182602001511380156113145750600060028360c001516113129190614093565b145b1561133c57600082602001519050826060015183602001818152505080836060018181525050505b600085608001516103e88760a001516113559190612b4b565b61135f91906130b7565b9050600060026007600a6113739190613b9d565b886080015161138291906130b7565b61138c9190612b4b565b90506113d96103e8846103e887602001516113a79190612b4b565b6113b191906130b7565b6103e86113be9190613be8565b836113c99190612b4b565b6113d391906130b7565b82611b68565b84608001818152505061142d6103e8846103e887606001516113fb9190612b4b565b61140591906130b7565b6103e86114129190613be8565b8361141d9190612b4b565b61142791906130b7565b82611b68565b8460a00181815250506000826103e8866020015161144b91906145cc565b6114559190613019565b90506002856080015161146891906145cc565b8161147391906146e3565b8560000181815250506000836103e8876060015161149191906145cc565b61149b9190613019565b905060028660a001516114ae91906145cc565b816007600a6114bd9190613b9d565b8b608001516114cc91906130b7565b60026114d891906145cc565b6114e291906146e3565b6114ec9190612fa6565b86604001818152505061152e896000015161150689611886565b604051602001611516919061474c565b60405160208183030381529060405260036007611af8565b8660e001818152505060006002886115469190614093565b1461157b578760e0015160018861155d9190613083565b8151811061156e5761156d6140c4565b5b60200260200101516115a7565b8760c0015160018861158d9190613083565b8151811061159e5761159d6140c4565b5b60200260200101515b86610100018190525050505050509392505050565b606060006115c9836115f1565b905060006115d682610e3a565b905060006115e483836104cc565b9050809350505050919050565b6115f9611e62565b81816000018181525050611646826040518060400160405280600b81526020017f72657065746974696f6e7300000000000000000000000000000000000000000081525060036014611af8565b816020018181525050611692826040518060400160405280601281526020017f6e756d496e7369646541727469666163747300000000000000000000000000008152506003600a611af8565b8160400181815250506116de826040518060400160405280601381526020017f6e756d4f7574736964654172746966616374730000000000000000000000000081525060016004611af8565b816060018181525050600561172c836040518060400160405280600b81526020017f6861734772616469656e740000000000000000000000000000000000000000008152506001600a611af8565b148160c00190151590811515815250506008611781836040518060400160405280600e81526020017f7365636f6e64617279436f6c6f7200000000000000000000000000000000000081525060016008611af8565b148160e0019015159081151581525050600060b4672b992ddfa23249d6600284602001516101686117b291906130b7565b60b46117be9190613be8565b6117c891906130b7565b6117d29190612b4b565b6117dc91906130b7565b9050600760126117ec9190613be8565b600a6117f89190613b9d565b61180182611b81565b60c861180d91906145cc565b6118179190613019565b8260800181815250506007601261182e9190613be8565b600a61183a9190613b9d565b61184382611bae565b60c861184f91906145cc565b6118599190613019565b8260a001818152505050919050565b611870611e62565b600061187b836115f1565b905080915050919050565b6060600082036118cd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a09565b600082905060005b600082146118ff5780806118e8906133f0565b915050600a826118f891906130b7565b91506118d5565b60008167ffffffffffffffff81111561191b5761191a611eff565b5b6040519080825280601f01601f19166020018201604052801561194d5781602001600182028036833780820191505090505b50905060008290505b60008614611a015760018161196b9190613be8565b90506000600a808861197d91906130b7565b6119879190612b4b565b876119929190613be8565b603061199e919061477f565b905060008160f81b9050808484815181106119bc576119bb6140c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886119f891906130b7565b97505050611956565b819450505050505b919050565b60606000821215611a5157611a2b82611a26906147b4565b611886565b604051602001611a3b9190614822565b6040516020818303038152906040529050611a5d565b611a5a82611886565b90505b919050565b6060611a8482600a611a749190613b9d565b84611a7f91906130b7565b611886565b611aa483600a611a949190613b9d565b85611a9f9190614093565b611886565b604051602001611ab592919061486e565b604051602081830303815290604052905092915050565b60608282604051602001611ae192919061495f565b604051602081830303815290604052905092915050565b600080611b2d85611b0888611886565b604051602001611b199291906133cc565b604051602081830303815290604052611d44565b90508360018585611b3e9190613be8565b611b489190613083565b82611b539190614093565b611b5d9190613083565b915050949350505050565b6000818310611b775781611b79565b825b905092915050565b6000611ba76002672b992ddfa23249d681611b9f57611b9e612fea565b5b048301611bae565b9050919050565b6000672b992ddfa23249d6600202672b992ddfa23249d66002028381611bd757611bd6612fea565b5b06634000000063ffffffff160281611bf257611bf1612fea565b5b0491506000600160106001901b0360106008601c030384901c1690506000600160086001901b036008601c0385901c169050600080631000000063ffffffff168616149050600080632000000063ffffffff1687161415905081611c5b57826001610100030392505b600060405180610440016040528061040481526020016149f5610404913990506000600460ff1660028601029050600081830151905060006001600460080260ff166001901b03600460080260ff1683901c16905060006001600460080260ff166001901b0383169050600060108a84840302901c9050600088611ce157818303611ce5565b8184015b90508715611d13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810290505b637fffffff670de0b6b3a7640000820281611d3157611d30612fea565b5b059b505050505050505050505050919050565b600081604051602001611d5791906149dd565b6040516020818303038152906040528051906020012060001c9050919050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001611dad611eb4565b81525090565b6040518061010001604052806000815260200160008152602001611dd5611eb4565b8152602001611de2611eb4565b8152602001611def611eb4565b8152602001611dfc611eb4565b815260200160608152602001606081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001611e5c611eb4565b81525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581525090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611f3782611eee565b810181811067ffffffffffffffff82111715611f5657611f55611eff565b5b80604052505050565b6000611f69611ed5565b9050611f758282611f2e565b919050565b600080fd5b6000819050919050565b611f9281611f7f565b8114611f9d57600080fd5b50565b600081359050611faf81611f89565b92915050565b6000819050919050565b611fc881611fb5565b8114611fd357600080fd5b50565b600081359050611fe581611fbf565b92915050565b60006060828403121561200157612000611ee9565b5b61200b6060611f5f565b9050600061201b84828501611fd6565b600083015250602061202f84828501611fd6565b602083015250604061204384828501611fd6565b60408301525092915050565b6000610160828403121561206657612065611ee9565b5b612071610120611f5f565b9050600061208184828501611fa0565b600083015250602061209584828501611fa0565b60208301525060406120a984828501611fa0565b60408301525060606120bd84828501611fa0565b60608301525060806120d184828501611fd6565b60808301525060a06120e584828501611fd6565b60a08301525060c06120f984828501611fd6565b60c08301525060e061210d84828501611fd6565b60e08301525061010061212284828501611feb565b6101008301525092915050565b6000610160828403121561214657612145611edf565b5b60006121548482850161204f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561219757808201518184015260208101905061217c565b60008484015250505050565b60006121ae8261215d565b6121b88185612168565b93506121c8818560208601612179565b6121d181611eee565b840191505092915050565b600060208201905081810360008301526121f681846121a3565b905092915050565b60008115159050919050565b612213816121fe565b811461221e57600080fd5b50565b6000813590506122308161220a565b92915050565b6000610120828403121561224d5761224c611ee9565b5b612258610120611f5f565b9050600061226884828501611fd6565b600083015250602061227c84828501611fd6565b602083015250604061229084828501611fd6565b60408301525060606122a484828501611fd6565b60608301525060806122b884828501611fd6565b60808301525060a06122cc84828501611fd6565b60a08301525060c06122e084828501612221565b60c08301525060e06122f484828501612221565b60e08301525061010061230984828501612221565b6101008301525092915050565b600080fd5b600067ffffffffffffffff82111561233657612335611eff565b5b602082029050602081019050919050565b600080fd5b600061235f61235a8461231b565b611f5f565b9050808382526020820190506060840283018581111561238257612381612347565b5b835b818110156123ab57806123978882611feb565b845260208401935050606081019050612384565b5050509392505050565b600082601f8301126123ca576123c9612316565b5b81356123da84826020860161234c565b91505092915050565b600061020082840312156123fa576123f9611ee9565b5b612405610100611f5f565b9050600061241584828501611fd6565b600083015250602061242984828501611fd6565b602083015250604061243d84828501611feb565b60408301525060a061245184828501611feb565b60608301525061010061246684828501611feb565b60808301525061016061247b84828501611feb565b60a0830152506101c082013567ffffffffffffffff8111156124a05761249f611f7a565b5b6124ac848285016123b5565b60c0830152506101e082013567ffffffffffffffff8111156124d1576124d0611f7a565b5b6124dd848285016123b5565b60e08301525092915050565b600080610140838503121561250157612500611edf565b5b600061250f85828601612236565b92505061012083013567ffffffffffffffff81111561253157612530611ee4565b5b61253d858286016123e3565b9150509250929050565b6000806000610160848603121561256157612560611edf565b5b600061256f86828701612236565b93505061012084013567ffffffffffffffff81111561259157612590611ee4565b5b61259d868287016123e3565b9250506101406125af86828701611fd6565b9150509250925092565b6125c281611fb5565b82525050565b6060820160008201516125de60008501826125b9565b5060208201516125f160208501826125b9565b50604082015161260460408501826125b9565b50505050565b6101008201600082015161262160008501826125b9565b50602082015161263460208501826125b9565b50604082015161264760408501826125b9565b50606082015161265a60608501826125b9565b50608082015161266d60808501826125b9565b5060a082015161268060a08501826125c8565b50505050565b60006101008201905061269c600083018461260a565b92915050565b600061012082840312156126b9576126b8611edf565b5b60006126c784828501612236565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061270883836125c8565b60608301905092915050565b6000602082019050919050565b600061272c826126d0565b61273681856126db565b9350612741836126ec565b8060005b8381101561277257815161275988826126fc565b975061276483612714565b925050600181019050612745565b5085935050505092915050565b60006102008301600083015161279860008601826125b9565b5060208301516127ab60208601826125b9565b5060408301516127be60408601826125c8565b5060608301516127d160a08601826125c8565b5060808301516127e56101008601826125c8565b5060a08301516127f96101608601826125c8565b5060c08301518482036101c08601526128128282612721565b91505060e08301518482036101e086015261282d8282612721565b9150508091505092915050565b60006020820190508181036000830152612854818461277f565b905092915050565b6000610100828403121561287357612872611ee9565b5b61287d60c0611f5f565b9050600061288d84828501611fd6565b60008301525060206128a184828501611fd6565b60208301525060406128b584828501611fd6565b60408301525060606128c984828501611fd6565b60608301525060806128dd84828501611fd6565b60808301525060a06128f184828501611feb565b60a08301525092915050565b6000610100828403121561291457612913611edf565b5b60006129228482850161285c565b91505092915050565b61293481611f7f565b82525050565b61016082016000820151612951600085018261292b565b506020820151612964602085018261292b565b506040820151612977604085018261292b565b50606082015161298a606085018261292b565b50608082015161299d60808501826125b9565b5060a08201516129b060a08501826125b9565b5060c08201516129c360c08501826125b9565b5060e08201516129d660e08501826125b9565b506101008201516129eb6101008501826125c8565b50505050565b600061016082019050612a07600083018461293a565b92915050565b600060208284031215612a2357612a22611edf565b5b6000612a3184828501611fd6565b91505092915050565b612a43816121fe565b82525050565b61012082016000820151612a6060008501826125b9565b506020820151612a7360208501826125b9565b506040820151612a8660408501826125b9565b506060820151612a9960608501826125b9565b506080820151612aac60808501826125b9565b5060a0820151612abf60a08501826125b9565b5060c0820151612ad260c0850182612a3a565b5060e0820151612ae560e0850182612a3a565b50610100820151612afa610100850182612a3a565b50505050565b600061012082019050612b166000830184612a49565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b5682611fb5565b9150612b6183611fb5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b9a57612b99612b1c565b5b828202905092915050565b600081905092915050565b7f3c616e696d617465206174747269627574654e616d653d2272222076616c756560008201527f733d220000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0c602383612ba5565b9150612c1782612bb0565b602382019050919050565b6000612c2d8261215d565b612c378185612ba5565b9350612c47818560208601612179565b80840191505092915050565b7f3b00000000000000000000000000000000000000000000000000000000000000815250565b7f222063616c634d6f64653d226c696e65617222206475723d2200000000000000815250565b7f732220726570656174436f756e743d22696e646566696e697465222f3e000000815250565b6000612cd082612bff565b9150612cdc8288612c22565b9150612ce782612c53565b600182019150612cf78287612c22565b9150612d0282612c53565b600182019150612d128286612c22565b9150612d1d82612c53565b600182019150612d2d8285612c22565b9150612d3882612c79565b601982019150612d488284612c22565b9150612d5382612c9f565b601d820191508190509695505050505050565b7f3c616e696d617465206174747269627574654e616d653d226379222076616c7560008201527f65733d2200000000000000000000000000000000000000000000000000000000602082015250565b6000612dc2602483612ba5565b9150612dcd82612d66565b602482019050919050565b6000612de48289612c22565b9150612def82612db5565b9150612dfb8288612c22565b9150612e0682612c53565b600182019150612e168287612c22565b9150612e2182612c53565b600182019150612e318286612c22565b9150612e3c82612c53565b600182019150612e4c8285612c22565b9150612e5782612c79565b601982019150612e678284612c22565b9150612e7282612c9f565b601d82019150819050979650505050505050565b7f3c616e696d617465206174747269627574654e616d653d226378222076616c7560008201527f65733d2200000000000000000000000000000000000000000000000000000000602082015250565b6000612ee2602483612ba5565b9150612eed82612e86565b602482019050919050565b6000612f048289612c22565b9150612f0f82612ed5565b9150612f1b8288612c22565b9150612f2682612c53565b600182019150612f368287612c22565b9150612f4182612c53565b600182019150612f518286612c22565b9150612f5c82612c53565b600182019150612f6c8285612c22565b9150612f7782612c79565b601982019150612f878284612c22565b9150612f9282612c9f565b601d82019150819050979650505050505050565b6000612fb182611f7f565b9150612fbc83611f7f565b925082820190508281121560008312168382126000841215161715612fe457612fe3612b1c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061302482611f7f565b915061302f83611f7f565b92508261303f5761303e612fea565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161561307857613077612b1c565b5b828205905092915050565b600061308e82611fb5565b915061309983611fb5565b92508282019050808211156130b1576130b0612b1c565b5b92915050565b60006130c282611fb5565b91506130cd83611fb5565b9250826130dd576130dc612fea565b5b828204905092915050565b6130f181611fb5565b82525050565b60608201600082015161310d60008501826130e8565b50602082015161312060208501826130e8565b50604082015161313360408501826130e8565b50505050565b600060608201905061314e60008301846130f7565b92915050565b600080fd5b600067ffffffffffffffff82111561317457613173611eff565b5b61317d82611eee565b9050602081019050919050565b600061319d61319884613159565b611f5f565b9050828152602081018484840111156131b9576131b8613154565b5b6131c4848285612179565b509392505050565b600082601f8301126131e1576131e0612316565b5b81516131f184826020860161318a565b91505092915050565b6000602082840312156132105761320f611edf565b5b600082015167ffffffffffffffff81111561322e5761322d611ee4565b5b61323a848285016131cc565b91505092915050565b7f3c636972636c652063783d220000000000000000000000000000000000000000815250565b7f222063793d220000000000000000000000000000000000000000000000000000815250565b7f2220723d22000000000000000000000000000000000000000000000000000000815250565b7f222066696c6c3d22000000000000000000000000000000000000000000000000815250565b7f223e000000000000000000000000000000000000000000000000000000000000815250565b7f3c2f636972636c653e0000000000000000000000000000000000000000000000815250565b600061333282613243565b600c820191506133428288612c22565b915061334d82613269565b60068201915061335d8287612c22565b91506133688261328f565b6005820191506133788286612c22565b9150613383826132b5565b6008820191506133938285612c22565b915061339e826132db565b6002820191506133ae8284612c22565b91506133b982613301565b6009820191508190509695505050505050565b60006133d88285612c22565b91506133e48284612c22565b91508190509392505050565b60006133fb82611fb5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361342d5761342c612b1c565b5b600182019050919050565b7f3c75736520687265663d222374696c6522207472616e73666f726d3d22726f7460008201527f6174652800000000000000000000000000000000000000000000000000000000602082015250565b6000613494602483612ba5565b915061349f82613438565b602482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b7f2922202f3e000000000000000000000000000000000000000000000000000000815250565b60006135028287612c22565b915061350d82613487565b91506135198286612c22565b9150613524826134aa565b6001820191506135348285612c22565b915061353f826134aa565b60018201915061354f8284612c22565b915061355a826134d0565b60058201915081905095945050505050565b7f3c636c6970506174682069643d22636c6970223e000000000000000000000000815250565b7f3c7061746820643d224d302c304c000000000000000000000000000000000000815250565b7f4c00000000000000000000000000000000000000000000000000000000000000815250565b7f2c30410000000000000000000000000000000000000000000000000000000000815250565b7f2c302c302c302c302c305a22202f3e0000000000000000000000000000000000815250565b7f3c2f636c6970506174683e000000000000000000000000000000000000000000815250565b600061365b8261356c565b60148201915061366a82613592565b600e8201915061367a8288612c22565b9150613685826134aa565b6001820191506136958287612c22565b91506136a0826135b8565b6001820191506136b08286612c22565b91506136bb826135de565b6003820191506136cb8285612c22565b91506136d6826134aa565b6001820191506136e68284612c22565b91506136f182613604565b600f820191506137008261362a565b600b820191508190509695505050505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222076696577426f783d22302030200000000000000000000000602082015250565b600061376f603583612ba5565b915061377a82613713565b603582019050919050565b7f2000000000000000000000000000000000000000000000000000000000000000815250565b7f222077696474683d220000000000000000000000000000000000000000000000815250565b7f22206865696768743d2200000000000000000000000000000000000000000000815250565b7f223e3c646566733e000000000000000000000000000000000000000000000000815250565b7f3c672069643d2274696c652220636c69702d706174683d2275726c2823636c6960008201527f7029223e00000000000000000000000000000000000000000000000000000000602082015250565b6000613879602483612ba5565b91506138848261381d565b602482019050919050565b7f3c7265637420783d22302220793d222d00000000000000000000000000000000815250565b60006138c082613762565b91506138cc828c612c22565b91506138d782613785565b6001820191506138e7828b612c22565b91506138f2826137ab565b600982019150613902828a612c22565b915061390d826137d1565b600a8201915061391d8289612c22565b9150613928826137f7565b6008820191506139388288612c22565b91506139448287612c22565b915061394f8261386c565b915061395a8261388f565b60108201915061396a8286612c22565b9150613975826137ab565b6009820191506139858285612c22565b9150613990826137d1565b600a820191506139a08284612c22565b91506139ab826132b5565b6008820191508190509a9950505050505050505050565b7f223e3c2f726563743e0000000000000000000000000000000000000000000000815250565b7f3c2f673e00000000000000000000000000000000000000000000000000000000815250565b6000613a1a8287612c22565b9150613a268286612c22565b9150613a31826139c2565b600982019150613a418285612c22565b9150613a4d8284612c22565b9150613a58826139e8565b60048201915081905095945050505050565b60008160011c9050919050565b6000808291508390505b6001851115613ac157808604811115613a9d57613a9c612b1c565b5b6001851615613aac5780820291505b8081029050613aba85613a6a565b9450613a81565b94509492505050565b600082613ada5760019050613b96565b81613ae85760009050613b96565b8160018114613afe5760028114613b0857613b37565b6001915050613b96565b60ff841115613b1a57613b19612b1c565b5b8360020a915084821115613b3157613b30612b1c565b5b50613b96565b5060208310610133831016604e8410600b8410161715613b6c5782820a905083811115613b6757613b66612b1c565b5b613b96565b613b798484846001613a77565b92509050818404811115613b9057613b8f612b1c565b5b81810290505b9392505050565b6000613ba882611fb5565b9150613bb383611fb5565b9250613be07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613aca565b905092915050565b6000613bf382611fb5565b9150613bfe83611fb5565b9250828203905081811115613c1657613c15612b1c565b5b92915050565b7f3c2f646566733e00000000000000000000000000000000000000000000000000815250565b7f3c726563742077696474683d2200000000000000000000000000000000000000815250565b7f3c672069643d226b616c6569646f73636f706554696c6522207472616e73666f60008201527f726d3d227472616e736c61746528000000000000000000000000000000000000602082015250565b6000613cc4602e83612ba5565b9150613ccf82613c68565b602e82019050919050565b6000613ce68288612c22565b9150613cf182613c1c565b600782019150613d0082613c42565b600d82019150613d108287612c22565b9150613d1b826137d1565b600a82019150613d2b8286612c22565b9150613d36826132b5565b600882019150613d468285612c22565b9150613d51826139c2565b600982019150613d6082613cb7565b9150613d6c8284612c22565b91508190509695505050505050565b6000613d8682613243565b600c82019150613d968285612c22565b9150613da182613269565b600682019150613db18284612c22565b9150613dbc8261328f565b6005820191508190509392505050565b7f222066696c6c3d226e6f6e652200000000000000000000000000000000000000815250565b7f2f3e000000000000000000000000000000000000000000000000000000000000815250565b6000613e248286612c22565b9150613e308285612c22565b9150613e3b82613dcc565b600d82019150613e4b8284612c22565b9150613e5682613df2565b600282019150819050949350505050565b7f29223e0000000000000000000000000000000000000000000000000000000000815250565b7f22202f3e00000000000000000000000000000000000000000000000000000000815250565b6000613ebf8289612c22565b9150613eca826134aa565b600182019150613eda8288612c22565b9150613ee582613e67565b600382019150613ef58287612c22565b9150613f018286612c22565b9150613f0c826132b5565b600882019150613f1c8285612c22565b9150613f2782613e8d565b600482019150613f378284612c22565b9150819050979650505050505050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000815250565b6000613f798285612c22565b9150613f858284612c22565b9150613f90826139e8565b600482019150613f9f82613f47565b6006820191508190509392505050565b7f7265637477696474680000000000000000000000000000000000000000000000815250565b6000613fe082613faf565b600982019150613ff08284612c22565b915081905092915050565b7f7265637468656967687400000000000000000000000000000000000000000000815250565b600061402c82613ffb565b600a8201915061403c8284612c22565b915081905092915050565b7f726563746475726174696f6e0000000000000000000000000000000000000000815250565b600061407882614047565b600c820191506140888284612c22565b915081905092915050565b600061409e82611fb5565b91506140a983611fb5565b9250826140b9576140b8612fea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6140fc81611fb5565b82525050565b600060408201905061411760008301856140f3565b61412460208301846140f3565b9392505050565b60008151905061413a81611fbf565b92915050565b60006060828403121561415657614155611ee9565b5b6141606060611f5f565b905060006141708482850161412b565b60008301525060206141848482850161412b565b60208301525060406141988482850161412b565b60408301525092915050565b60006141b76141b28461231b565b611f5f565b905080838252602082019050606084028301858111156141da576141d9612347565b5b835b8181101561420357806141ef8882614140565b8452602084019350506060810190506141dc565b5050509392505050565b600082601f83011261422257614221612316565b5b81516142328482602086016141a4565b91505092915050565b60006020828403121561425157614250611edf565b5b600082015167ffffffffffffffff81111561426f5761426e611ee4565b5b61427b8482850161420d565b91505092915050565b7f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d60008201527f227472616e73666f726d2220747970653d22726f74617465222066726f6d3d2260208201527f302030202d000000000000000000000000000000000000000000000000000000604082015250565b6000614306604583612ba5565b915061431182614284565b604582019050919050565b7f2220746f3d222d3336302030202d000000000000000000000000000000000000815250565b7f2220626567696e3d22307322206475723d220000000000000000000000000000815250565b7f732220726570656174436f756e743d22696e646566696e69746522202f3e0000815250565b6000614399826142f9565b91506143a58286612c22565b91506143b08261431c565b600e820191506143c08285612c22565b91506143cb82614342565b6012820191506143db8284612c22565b91506143e682614368565b601e82019150819050949350505050565b7f3c726563742072783d2233222072793d22332220783d22302220793d222d0000815250565b7f3c2f726563743e00000000000000000000000000000000000000000000000000815250565b600061444e826143f7565b601e8201915061445e8288612c22565b9150614469826137ab565b6009820191506144798287612c22565b9150614484826137d1565b600a820191506144948286612c22565b915061449f826132b5565b6008820191506144af8285612c22565b91506144ba826132db565b6002820191506144ca8284612c22565b91506144d58261441d565b6007820191508190509695505050505050565b7f7931000000000000000000000000000000000000000000000000000000000000815250565b6000614519826144e8565b6002820191506145298284612c22565b915081905092915050565b7f7932000000000000000000000000000000000000000000000000000000000000815250565b600061456582614534565b6002820191506145758284612c22565b915081905092915050565b7f616c7465726e6174696e67436c61737300000000000000000000000000000000815250565b60006145b182614580565b6010820191506145c18284612c22565b915081905092915050565b60006145d782611f7f565b91506145e283611f7f565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161561462157614620612b1c565b5b817f8000000000000000000000000000000000000000000000000000000000000000058312600084126000841316161561465e5761465d612b1c565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161561469b5761469a612b1c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05821260008412600084121616156146d8576146d7612b1c565b5b828202905092915050565b60006146ee82611f7f565b91506146f983611f7f565b92508282039050818112600084121682821360008512151617156147205761471f612b1c565b5b92915050565b7f6475726174696f6e000000000000000000000000000000000000000000000000815250565b600061475782614726565b6008820191506147678284612c22565b915081905092915050565b600060ff82169050919050565b600061478a82614772565b915061479583614772565b9250828201905060ff8111156147ae576147ad612b1c565b5b92915050565b60006147bf82611f7f565b91507f800000000000000000000000000000000000000000000000000000000000000082036147f1576147f0612b1c565b5b816000039050919050565b7f2d00000000000000000000000000000000000000000000000000000000000000815250565b600061482d826147fc565b60018201915061483d8284612c22565b915081905092915050565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b600061487a8285612c22565b915061488582614848565b6001820191506148958284612c22565b91508190509392505050565b7f3c6c696e6561724772616469656e742069643d226772616469656e74223e0000815250565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000815250565b7f222f3e0000000000000000000000000000000000000000000000000000000000815250565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22815250565b7f3c2f6c696e6561724772616469656e743e000000000000000000000000000000815250565b600061496a826148a1565b601e82019150614979826148c7565b601e820191506149898285612c22565b9150614994826148ed565b6003820191506149a382614913565b6020820191506149b38284612c22565b91506149be826148ed565b6003820191506149cd82614939565b6011820191508190509392505050565b60006149e98284612c22565b91508190509291505056fe0000000000c90f8801921d20025b26d703242abf03ed26e604b6195d057f00350647d97c0710a34507d95b9e08a2009a096a90490a3308bc0afb68050bc3ac350c8bd35e0d53db920e1bc2e40ee387660fab272b1072a0481139f0cf120116d512c8106e138edbb1145576b1151bdf8515e2144416a81305176dd9de183366e818f8b83c19bdcbf31a82a0251b4732ef1c0b826a1ccf8cb31d934fe51e56ca1e1f19f97b1fdcdc1b209f701c2161b39f2223a4c522e541af23a6887e2467775725280c5d25e845b626a8218527679df42826b92828e5714a29a3c4852a61b1012b1f34eb2bdc4e6f2c98fbba2d553afb2e110a622ecc681e2f8752623041c76030fbc54d31b54a5d326e54c73326e2c233def2873496824f354d905636041ad936ba2013376f9e46382493b038d8fe93398cdd323a402dd13af2eeb73ba51e293c56ba703d07c1d53db832a53e680b2c3f1749b73fc5ec974073f21d4121589a41ce1e64427a41d04325c13543d09aec447acd50452456bc45cd358f46756827471cece647c3c22e4869e664490f57ee49b415334a581c9d4afb6c974b9e038f4c3fdff34ce100344d8162c34e2106174ebfe8a44f5e08e24ffb654c5097fc5e5133cc9451ced46e5269126e53028517539b2aef5433027d54ca0a4a556040e255f5a4d2568a34a9571deef957b0d2555842dd5458d40e8c5964649759f3de125a8279995b1035ce5b9d11535c290acc5cb420df5d3e52365dc79d7b5e50015d5ed77c895f5e0db25fe3b38d60686cce60ec382f616f146b61f1003e6271fa6862f201ac637114cc63ef328f646c59bf64e889256563bf9165ddfbd266573cbb66cf811f6746c7d767bd0fbc683257aa68a69e806919e31f698c246b69fd614a6a6d98a36adcc9646b4af2786bb812d06c24295f6c8f351b6cf934fb6d6227f96dca0d146e30e3496e96a99c6efb5f116f5f02b16fc1938470231099708378fe70e2cbc571410804719e2cd171fa394872552c8472af05a67307c3cf735f662573b5ebd0740b53fa745f9dd074b2c8837504d3447555bd4b75a585ce75f42c0a7641af3c768e0ea576d9498877235f2c776c4eda77b417df77fab988784033287884841378c7aba17909a92c794a7c11798a23b079c89f6d7a05eeac7a4210d87a7d055a7ab6cba37aef63237b26cb4e7b5d039d7b920b887bc5e28f7bf8882f7c29fbed7c5a3d4f7c894bdd7cb727237ce3ceb17d0f42177d3980eb7d628ac57d8a5f3f7db0fdf77dd6668e7dfa98a77e1d93e97e3f57fe7e5fe4927e7f39567e9d55fb7eba3a387ed5e5c57ef0585f7f0991c37f2191b37f3857f57f4de4507f62368e7f754e7f7f872bf27f97cebc7fa736b37fb563b27fc255957fce0c3d7fd8878d7fe1c76a7fe9cbbf7ff094777ff621817ffa72d07ffd88597fff62157fffffff207374726f6b653d222345424139343722207374726f6b652d77696474683d223422a264697066735822122060b43bcc709c8721db4e21df0ab7e081bac711154950b01a7105fb15bd48e25864736f6c63430008100033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063aa9e7e7511610066578063aa9e7e7514610158578063b3c34a5014610188578063c321118c146101b8578063d6cf5f55146101e8578063e3684e391461021857610093565b80631ac48ab1146100985780637d11e69c146100c85780638a0e9ad7146100f857806391b078a414610128575b600080fd5b6100b260048036038101906100ad919061212f565b610248565b6040516100bf91906121dc565b60405180910390f35b6100e260048036038101906100dd91906124e9565b6104cc565b6040516100ef91906121dc565b60405180910390f35b610112600480360381019061010d9190612547565b610c4e565b60405161011f9190612686565b60405180910390f35b610142600480360381019061013d91906126a2565b610e3a565b60405161014f919061283a565b60405180910390f35b610172600480360381019061016d91906128fd565b6110c6565b60405161017f91906121dc565b60405180910390f35b6101a2600480360381019061019d9190612547565b6111e8565b6040516101af91906129f1565b60405180910390f35b6101d260048036038101906101cd9190612a0d565b6115bc565b6040516101df91906121dc565b60405180910390f35b61020260048036038101906101fd9190612a0d565b6115f1565b60405161020f9190612b00565b60405180910390f35b610232600480360381019061022d9190612a0d565b611868565b60405161023f9190612b00565b60405180910390f35b606060006102598360800151611886565b6102668460a00151611886565b6102738560800151611886565b6102808660a00151611886565b61029960028860e001516102949190612b4b565b611886565b6040516020016102ad959493929190612cc5565b6040516020818303038152906040529050806102cc8460200151611a0e565b6102d98560600151611a0e565b6102e68660200151611a0e565b6102f38760600151611a0e565b61030c60028960e001516103079190612b4b565b611886565b60405160200161032196959493929190612dd8565b6040516020818303038152906040529050806103408460000151611a0e565b61034d8560400151611a0e565b61035a8660000151611a0e565b6103678760400151611a0e565b61038060028960e0015161037b9190612b4b565b611886565b60405160200161039596959493929190612ef8565b60405160208183030381529060405290506103ce6002846040015185600001516103bf9190612fa6565b6103c99190613019565b611a0e565b6103f66002856060015186602001516103e79190612fa6565b6103f19190613019565b611a0e565b61041e60028660a00151876080015161040f9190613083565b61041991906130b7565b611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588761010001516040518263ffffffff1660e01b815260040161045a9190613139565b600060405180830381865af4158015610477573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104a091906131fa565b846040516020016104b5959493929190613327565b604051602081830303815290604052915050919050565b6060600060405180602001604052806000815250905060005b84606001518110156105405760006104fe868684610c4e565b90508261050a826110c6565b60405160200161051b9291906133cc565b6040516020818303038152906040529250508080610538906133f0565b9150506104e5565b50600060405180602001604052806000815250905060005b85604001518110156105b35760006105718787846111e8565b90508261057d82610248565b60405160200161058e9291906133cc565b60405160208183030381529060405292505080806105ab906133f0565b915050610558565b5060006040518060200160405280600081525090506000866020015163d693a4006105de91906130b7565b905060005b876020015181101561065b578261060682846105ff9190612b4b565b6007611a62565b6106158a608001516007611a62565b6106248b60a001516007611a62565b60405160200161063794939291906134f6565b60405160208183030381529060405292508080610653906133f0565b9150506105e3565b50600061066d88608001516007611a62565b61067c8960a001516007611a62565b61069760028b608001516106909190612b4b565b6007611a62565b6106a160c8611886565b6106ab60c8611886565b6040516020016106bf959493929190613650565b604051602081830303815290604052905060006106dd6101f4611886565b6106e86101f4611886565b6106f36101f4611886565b6106fe6101f4611886565b6108087301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588e604001516040518263ffffffff1660e01b815260040161073c9190613139565b600060405180830381865af4158015610759573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061078291906131fa565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588f60a001516040518263ffffffff1660e01b81526004016107bd9190613139565b600060405180830381865af41580156107da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061080391906131fa565b611acc565b8661081360c8611886565b610829600260c86108249190612b4b565b611886565b61083f600260c861083a9190612b4b565b611886565b604051602001610857999897969594939291906138b5565b6040516020818303038152906040529050808960c001516108f8577301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588a604001516040518263ffffffff1660e01b81526004016108ad9190613139565b600060405180830381865af41580156108ca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108f391906131fa565b61092f565b6040518060400160405280600e81526020017f75726c28236772616469656e74290000000000000000000000000000000000008152505b87876040516020016109449493929190613a0e565b6040516020818303038152906040529050806109616101f4611886565b61096c6101f4611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588c608001516040518263ffffffff1660e01b81526004016109a79190613139565b600060405180830381865af41580156109c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109ed91906131fa565b610a2b6007600a6109fe9190613b9d565b8e60800151610a0d91906130b7565b60026101f4610a1c91906130b7565b610a269190613be8565b611886565b604051602001610a3f959493929190613cda565b60405160208183030381529060405290506000610a618a608001516007611a62565b610a708b60a001516007611a62565b604051602001610a81929190613d7b565b6040516020818303038152906040529050600081610aab600860c8610aa69190613083565b611886565b8c6101000151610aca5760405180602001604052806000815250610ae4565b604051806060016040528060228152602001614df9602291395b604051602001610af693929190613e18565b604051602081830303815290604052905082610b466007600a610b199190613b9d565b8d60a00151610b2891906130b7565b60026101f4610b3791906130b7565b610b419190613be8565b611886565b83610b5160c8611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588f604001516040518263ffffffff1660e01b8152600401610b8c9190613139565b600060405180830381865af4158015610ba9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bd291906131fa565b8f6101000151610bf15760405180602001604052806000815250610bf3565b855b604051602001610c0896959493929190613eb3565b60405160208183030381529060405292508286604051602001610c2c929190613f6d565b6040516020818303038152906040529250829850505050505050505092915050565b610c56611d77565b610cd18460000151610c6784611886565b604051602001610c779190613fd5565b60405160208183030381529060405260026007600a610c969190613b9d565b8860a00151610ca591906130b7565b610caf91906130b7565b6007600a610cbd9190613b9d565b8860a00151610ccc91906130b7565b611af8565b816000018181525050610d558460000151610ceb84611886565b604051602001610cfb9190614021565b6040516020818303038152906040526007600a610d189190613b9d565b8760a00151610d2791906130b7565b600860c8610d3591906130b7565b60028960a00151610d469190612b4b565b610d509190613083565b611af8565b81602001818152505060008160400181815250506007600a610d779190613b9d565b8460a00151610d8691906130b7565b816060018181525050610dc88460000151610da084611886565b604051602001610db0919061406d565b6040516020818303038152906040526005600a611af8565b8160800181815250506000600283610de09190614093565b14610e0a578260e00151600081518110610dfd57610dfc6140c4565b5b6020026020010151610e2b565b8260c00151600081518110610e2257610e216140c4565b5b60200260200101515b8160a001819052509392505050565b610e42611db3565b610e8a82600001516040518060400160405280600a81526020017f7072696d617279487565000000000000000000000000000000000000000000008152506000610168611af8565b8160000181815250508160e00151610ea6578060000151610ec5565b61016860f08260000151610eba9190613083565b610ec49190614093565b5b81602001818152505060405180606001604052808260000151815260200160648152602001601e8152508160400181905250604051806060016040528082602001518152602001606481526020016046815250816060018190525060405180606001604052808260000151815260200160648152602001600a81525081608001819052506040518060600160405280610168600a8460000151610f689190613083565b610f729190614093565b815260200160648152602001600a8152508160a001819052507301e833cf8c115bb859a8e16a72d5ff298f834413635c1b88f9826000015160018560400151610fbb9190613083565b6040518363ffffffff1660e01b8152600401610fd8929190614102565b600060405180830381865af4158015610ff5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101e919061423b565b8160c001819052507301e833cf8c115bb859a8e16a72d5ff298f834413635c1b88f98260200151600185604001516110569190613083565b6040518363ffffffff1660e01b8152600401611073929190614102565b600060405180830381865af4158015611090573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110b9919061423b565b8160e00181905250919050565b606060006110d78360600151611886565b6110e48460600151611886565b6110f18560800151611886565b6040516020016111039392919061438e565b60405160208183030381529060405290506111218360600151611886565b61112e8460000151611886565b61113b8560200151611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588760a001516040518263ffffffff1660e01b81526004016111769190613139565b600060405180830381865af4158015611193573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111bc91906131fa565b846040516020016111d1959493929190614443565b604051602081830303815290604052915050919050565b6111f0611e10565b6000600860c861120091906130b7565b6007600a61120e9190613b9d565b8660a0015161121d91906130b7565b6112279190613083565b9050611261856000015161123a85611886565b60405160200161124a919061450e565b604051602081830303815290604052601484611af8565b8260200181815250506112a2856000015161127b85611886565b60405160200161128b919061455a565b604051602081830303815290604052601484611af8565b8260600181815250506112e485600001516112bc85611886565b6040516020016112cc91906145a6565b60405160208183030381529060405260006003611af8565b8260c0018181525050816060015182602001511380156113145750600060028360c001516113129190614093565b145b1561133c57600082602001519050826060015183602001818152505080836060018181525050505b600085608001516103e88760a001516113559190612b4b565b61135f91906130b7565b9050600060026007600a6113739190613b9d565b886080015161138291906130b7565b61138c9190612b4b565b90506113d96103e8846103e887602001516113a79190612b4b565b6113b191906130b7565b6103e86113be9190613be8565b836113c99190612b4b565b6113d391906130b7565b82611b68565b84608001818152505061142d6103e8846103e887606001516113fb9190612b4b565b61140591906130b7565b6103e86114129190613be8565b8361141d9190612b4b565b61142791906130b7565b82611b68565b8460a00181815250506000826103e8866020015161144b91906145cc565b6114559190613019565b90506002856080015161146891906145cc565b8161147391906146e3565b8560000181815250506000836103e8876060015161149191906145cc565b61149b9190613019565b905060028660a001516114ae91906145cc565b816007600a6114bd9190613b9d565b8b608001516114cc91906130b7565b60026114d891906145cc565b6114e291906146e3565b6114ec9190612fa6565b86604001818152505061152e896000015161150689611886565b604051602001611516919061474c565b60405160208183030381529060405260036007611af8565b8660e001818152505060006002886115469190614093565b1461157b578760e0015160018861155d9190613083565b8151811061156e5761156d6140c4565b5b60200260200101516115a7565b8760c0015160018861158d9190613083565b8151811061159e5761159d6140c4565b5b60200260200101515b86610100018190525050505050509392505050565b606060006115c9836115f1565b905060006115d682610e3a565b905060006115e483836104cc565b9050809350505050919050565b6115f9611e62565b81816000018181525050611646826040518060400160405280600b81526020017f72657065746974696f6e7300000000000000000000000000000000000000000081525060036014611af8565b816020018181525050611692826040518060400160405280601281526020017f6e756d496e7369646541727469666163747300000000000000000000000000008152506003600a611af8565b8160400181815250506116de826040518060400160405280601381526020017f6e756d4f7574736964654172746966616374730000000000000000000000000081525060016004611af8565b816060018181525050600561172c836040518060400160405280600b81526020017f6861734772616469656e740000000000000000000000000000000000000000008152506001600a611af8565b148160c00190151590811515815250506008611781836040518060400160405280600e81526020017f7365636f6e64617279436f6c6f7200000000000000000000000000000000000081525060016008611af8565b148160e0019015159081151581525050600060b4672b992ddfa23249d6600284602001516101686117b291906130b7565b60b46117be9190613be8565b6117c891906130b7565b6117d29190612b4b565b6117dc91906130b7565b9050600760126117ec9190613be8565b600a6117f89190613b9d565b61180182611b81565b60c861180d91906145cc565b6118179190613019565b8260800181815250506007601261182e9190613be8565b600a61183a9190613b9d565b61184382611bae565b60c861184f91906145cc565b6118599190613019565b8260a001818152505050919050565b611870611e62565b600061187b836115f1565b905080915050919050565b6060600082036118cd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a09565b600082905060005b600082146118ff5780806118e8906133f0565b915050600a826118f891906130b7565b91506118d5565b60008167ffffffffffffffff81111561191b5761191a611eff565b5b6040519080825280601f01601f19166020018201604052801561194d5781602001600182028036833780820191505090505b50905060008290505b60008614611a015760018161196b9190613be8565b90506000600a808861197d91906130b7565b6119879190612b4b565b876119929190613be8565b603061199e919061477f565b905060008160f81b9050808484815181106119bc576119bb6140c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886119f891906130b7565b97505050611956565b819450505050505b919050565b60606000821215611a5157611a2b82611a26906147b4565b611886565b604051602001611a3b9190614822565b6040516020818303038152906040529050611a5d565b611a5a82611886565b90505b919050565b6060611a8482600a611a749190613b9d565b84611a7f91906130b7565b611886565b611aa483600a611a949190613b9d565b85611a9f9190614093565b611886565b604051602001611ab592919061486e565b604051602081830303815290604052905092915050565b60608282604051602001611ae192919061495f565b604051602081830303815290604052905092915050565b600080611b2d85611b0888611886565b604051602001611b199291906133cc565b604051602081830303815290604052611d44565b90508360018585611b3e9190613be8565b611b489190613083565b82611b539190614093565b611b5d9190613083565b915050949350505050565b6000818310611b775781611b79565b825b905092915050565b6000611ba76002672b992ddfa23249d681611b9f57611b9e612fea565b5b048301611bae565b9050919050565b6000672b992ddfa23249d6600202672b992ddfa23249d66002028381611bd757611bd6612fea565b5b06634000000063ffffffff160281611bf257611bf1612fea565b5b0491506000600160106001901b0360106008601c030384901c1690506000600160086001901b036008601c0385901c169050600080631000000063ffffffff168616149050600080632000000063ffffffff1687161415905081611c5b57826001610100030392505b600060405180610440016040528061040481526020016149f5610404913990506000600460ff1660028601029050600081830151905060006001600460080260ff166001901b03600460080260ff1683901c16905060006001600460080260ff166001901b0383169050600060108a84840302901c9050600088611ce157818303611ce5565b8184015b90508715611d13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810290505b637fffffff670de0b6b3a7640000820281611d3157611d30612fea565b5b059b505050505050505050505050919050565b600081604051602001611d5791906149dd565b6040516020818303038152906040528051906020012060001c9050919050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001611dad611eb4565b81525090565b6040518061010001604052806000815260200160008152602001611dd5611eb4565b8152602001611de2611eb4565b8152602001611def611eb4565b8152602001611dfc611eb4565b815260200160608152602001606081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001611e5c611eb4565b81525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581525090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611f3782611eee565b810181811067ffffffffffffffff82111715611f5657611f55611eff565b5b80604052505050565b6000611f69611ed5565b9050611f758282611f2e565b919050565b600080fd5b6000819050919050565b611f9281611f7f565b8114611f9d57600080fd5b50565b600081359050611faf81611f89565b92915050565b6000819050919050565b611fc881611fb5565b8114611fd357600080fd5b50565b600081359050611fe581611fbf565b92915050565b60006060828403121561200157612000611ee9565b5b61200b6060611f5f565b9050600061201b84828501611fd6565b600083015250602061202f84828501611fd6565b602083015250604061204384828501611fd6565b60408301525092915050565b6000610160828403121561206657612065611ee9565b5b612071610120611f5f565b9050600061208184828501611fa0565b600083015250602061209584828501611fa0565b60208301525060406120a984828501611fa0565b60408301525060606120bd84828501611fa0565b60608301525060806120d184828501611fd6565b60808301525060a06120e584828501611fd6565b60a08301525060c06120f984828501611fd6565b60c08301525060e061210d84828501611fd6565b60e08301525061010061212284828501611feb565b6101008301525092915050565b6000610160828403121561214657612145611edf565b5b60006121548482850161204f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561219757808201518184015260208101905061217c565b60008484015250505050565b60006121ae8261215d565b6121b88185612168565b93506121c8818560208601612179565b6121d181611eee565b840191505092915050565b600060208201905081810360008301526121f681846121a3565b905092915050565b60008115159050919050565b612213816121fe565b811461221e57600080fd5b50565b6000813590506122308161220a565b92915050565b6000610120828403121561224d5761224c611ee9565b5b612258610120611f5f565b9050600061226884828501611fd6565b600083015250602061227c84828501611fd6565b602083015250604061229084828501611fd6565b60408301525060606122a484828501611fd6565b60608301525060806122b884828501611fd6565b60808301525060a06122cc84828501611fd6565b60a08301525060c06122e084828501612221565b60c08301525060e06122f484828501612221565b60e08301525061010061230984828501612221565b6101008301525092915050565b600080fd5b600067ffffffffffffffff82111561233657612335611eff565b5b602082029050602081019050919050565b600080fd5b600061235f61235a8461231b565b611f5f565b9050808382526020820190506060840283018581111561238257612381612347565b5b835b818110156123ab57806123978882611feb565b845260208401935050606081019050612384565b5050509392505050565b600082601f8301126123ca576123c9612316565b5b81356123da84826020860161234c565b91505092915050565b600061020082840312156123fa576123f9611ee9565b5b612405610100611f5f565b9050600061241584828501611fd6565b600083015250602061242984828501611fd6565b602083015250604061243d84828501611feb565b60408301525060a061245184828501611feb565b60608301525061010061246684828501611feb565b60808301525061016061247b84828501611feb565b60a0830152506101c082013567ffffffffffffffff8111156124a05761249f611f7a565b5b6124ac848285016123b5565b60c0830152506101e082013567ffffffffffffffff8111156124d1576124d0611f7a565b5b6124dd848285016123b5565b60e08301525092915050565b600080610140838503121561250157612500611edf565b5b600061250f85828601612236565b92505061012083013567ffffffffffffffff81111561253157612530611ee4565b5b61253d858286016123e3565b9150509250929050565b6000806000610160848603121561256157612560611edf565b5b600061256f86828701612236565b93505061012084013567ffffffffffffffff81111561259157612590611ee4565b5b61259d868287016123e3565b9250506101406125af86828701611fd6565b9150509250925092565b6125c281611fb5565b82525050565b6060820160008201516125de60008501826125b9565b5060208201516125f160208501826125b9565b50604082015161260460408501826125b9565b50505050565b6101008201600082015161262160008501826125b9565b50602082015161263460208501826125b9565b50604082015161264760408501826125b9565b50606082015161265a60608501826125b9565b50608082015161266d60808501826125b9565b5060a082015161268060a08501826125c8565b50505050565b60006101008201905061269c600083018461260a565b92915050565b600061012082840312156126b9576126b8611edf565b5b60006126c784828501612236565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061270883836125c8565b60608301905092915050565b6000602082019050919050565b600061272c826126d0565b61273681856126db565b9350612741836126ec565b8060005b8381101561277257815161275988826126fc565b975061276483612714565b925050600181019050612745565b5085935050505092915050565b60006102008301600083015161279860008601826125b9565b5060208301516127ab60208601826125b9565b5060408301516127be60408601826125c8565b5060608301516127d160a08601826125c8565b5060808301516127e56101008601826125c8565b5060a08301516127f96101608601826125c8565b5060c08301518482036101c08601526128128282612721565b91505060e08301518482036101e086015261282d8282612721565b9150508091505092915050565b60006020820190508181036000830152612854818461277f565b905092915050565b6000610100828403121561287357612872611ee9565b5b61287d60c0611f5f565b9050600061288d84828501611fd6565b60008301525060206128a184828501611fd6565b60208301525060406128b584828501611fd6565b60408301525060606128c984828501611fd6565b60608301525060806128dd84828501611fd6565b60808301525060a06128f184828501611feb565b60a08301525092915050565b6000610100828403121561291457612913611edf565b5b60006129228482850161285c565b91505092915050565b61293481611f7f565b82525050565b61016082016000820151612951600085018261292b565b506020820151612964602085018261292b565b506040820151612977604085018261292b565b50606082015161298a606085018261292b565b50608082015161299d60808501826125b9565b5060a08201516129b060a08501826125b9565b5060c08201516129c360c08501826125b9565b5060e08201516129d660e08501826125b9565b506101008201516129eb6101008501826125c8565b50505050565b600061016082019050612a07600083018461293a565b92915050565b600060208284031215612a2357612a22611edf565b5b6000612a3184828501611fd6565b91505092915050565b612a43816121fe565b82525050565b61012082016000820151612a6060008501826125b9565b506020820151612a7360208501826125b9565b506040820151612a8660408501826125b9565b506060820151612a9960608501826125b9565b506080820151612aac60808501826125b9565b5060a0820151612abf60a08501826125b9565b5060c0820151612ad260c0850182612a3a565b5060e0820151612ae560e0850182612a3a565b50610100820151612afa610100850182612a3a565b50505050565b600061012082019050612b166000830184612a49565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b5682611fb5565b9150612b6183611fb5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b9a57612b99612b1c565b5b828202905092915050565b600081905092915050565b7f3c616e696d617465206174747269627574654e616d653d2272222076616c756560008201527f733d220000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0c602383612ba5565b9150612c1782612bb0565b602382019050919050565b6000612c2d8261215d565b612c378185612ba5565b9350612c47818560208601612179565b80840191505092915050565b7f3b00000000000000000000000000000000000000000000000000000000000000815250565b7f222063616c634d6f64653d226c696e65617222206475723d2200000000000000815250565b7f732220726570656174436f756e743d22696e646566696e697465222f3e000000815250565b6000612cd082612bff565b9150612cdc8288612c22565b9150612ce782612c53565b600182019150612cf78287612c22565b9150612d0282612c53565b600182019150612d128286612c22565b9150612d1d82612c53565b600182019150612d2d8285612c22565b9150612d3882612c79565b601982019150612d488284612c22565b9150612d5382612c9f565b601d820191508190509695505050505050565b7f3c616e696d617465206174747269627574654e616d653d226379222076616c7560008201527f65733d2200000000000000000000000000000000000000000000000000000000602082015250565b6000612dc2602483612ba5565b9150612dcd82612d66565b602482019050919050565b6000612de48289612c22565b9150612def82612db5565b9150612dfb8288612c22565b9150612e0682612c53565b600182019150612e168287612c22565b9150612e2182612c53565b600182019150612e318286612c22565b9150612e3c82612c53565b600182019150612e4c8285612c22565b9150612e5782612c79565b601982019150612e678284612c22565b9150612e7282612c9f565b601d82019150819050979650505050505050565b7f3c616e696d617465206174747269627574654e616d653d226378222076616c7560008201527f65733d2200000000000000000000000000000000000000000000000000000000602082015250565b6000612ee2602483612ba5565b9150612eed82612e86565b602482019050919050565b6000612f048289612c22565b9150612f0f82612ed5565b9150612f1b8288612c22565b9150612f2682612c53565b600182019150612f368287612c22565b9150612f4182612c53565b600182019150612f518286612c22565b9150612f5c82612c53565b600182019150612f6c8285612c22565b9150612f7782612c79565b601982019150612f878284612c22565b9150612f9282612c9f565b601d82019150819050979650505050505050565b6000612fb182611f7f565b9150612fbc83611f7f565b925082820190508281121560008312168382126000841215161715612fe457612fe3612b1c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061302482611f7f565b915061302f83611f7f565b92508261303f5761303e612fea565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161561307857613077612b1c565b5b828205905092915050565b600061308e82611fb5565b915061309983611fb5565b92508282019050808211156130b1576130b0612b1c565b5b92915050565b60006130c282611fb5565b91506130cd83611fb5565b9250826130dd576130dc612fea565b5b828204905092915050565b6130f181611fb5565b82525050565b60608201600082015161310d60008501826130e8565b50602082015161312060208501826130e8565b50604082015161313360408501826130e8565b50505050565b600060608201905061314e60008301846130f7565b92915050565b600080fd5b600067ffffffffffffffff82111561317457613173611eff565b5b61317d82611eee565b9050602081019050919050565b600061319d61319884613159565b611f5f565b9050828152602081018484840111156131b9576131b8613154565b5b6131c4848285612179565b509392505050565b600082601f8301126131e1576131e0612316565b5b81516131f184826020860161318a565b91505092915050565b6000602082840312156132105761320f611edf565b5b600082015167ffffffffffffffff81111561322e5761322d611ee4565b5b61323a848285016131cc565b91505092915050565b7f3c636972636c652063783d220000000000000000000000000000000000000000815250565b7f222063793d220000000000000000000000000000000000000000000000000000815250565b7f2220723d22000000000000000000000000000000000000000000000000000000815250565b7f222066696c6c3d22000000000000000000000000000000000000000000000000815250565b7f223e000000000000000000000000000000000000000000000000000000000000815250565b7f3c2f636972636c653e0000000000000000000000000000000000000000000000815250565b600061333282613243565b600c820191506133428288612c22565b915061334d82613269565b60068201915061335d8287612c22565b91506133688261328f565b6005820191506133788286612c22565b9150613383826132b5565b6008820191506133938285612c22565b915061339e826132db565b6002820191506133ae8284612c22565b91506133b982613301565b6009820191508190509695505050505050565b60006133d88285612c22565b91506133e48284612c22565b91508190509392505050565b60006133fb82611fb5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361342d5761342c612b1c565b5b600182019050919050565b7f3c75736520687265663d222374696c6522207472616e73666f726d3d22726f7460008201527f6174652800000000000000000000000000000000000000000000000000000000602082015250565b6000613494602483612ba5565b915061349f82613438565b602482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b7f2922202f3e000000000000000000000000000000000000000000000000000000815250565b60006135028287612c22565b915061350d82613487565b91506135198286612c22565b9150613524826134aa565b6001820191506135348285612c22565b915061353f826134aa565b60018201915061354f8284612c22565b915061355a826134d0565b60058201915081905095945050505050565b7f3c636c6970506174682069643d22636c6970223e000000000000000000000000815250565b7f3c7061746820643d224d302c304c000000000000000000000000000000000000815250565b7f4c00000000000000000000000000000000000000000000000000000000000000815250565b7f2c30410000000000000000000000000000000000000000000000000000000000815250565b7f2c302c302c302c302c305a22202f3e0000000000000000000000000000000000815250565b7f3c2f636c6970506174683e000000000000000000000000000000000000000000815250565b600061365b8261356c565b60148201915061366a82613592565b600e8201915061367a8288612c22565b9150613685826134aa565b6001820191506136958287612c22565b91506136a0826135b8565b6001820191506136b08286612c22565b91506136bb826135de565b6003820191506136cb8285612c22565b91506136d6826134aa565b6001820191506136e68284612c22565b91506136f182613604565b600f820191506137008261362a565b600b820191508190509695505050505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222076696577426f783d22302030200000000000000000000000602082015250565b600061376f603583612ba5565b915061377a82613713565b603582019050919050565b7f2000000000000000000000000000000000000000000000000000000000000000815250565b7f222077696474683d220000000000000000000000000000000000000000000000815250565b7f22206865696768743d2200000000000000000000000000000000000000000000815250565b7f223e3c646566733e000000000000000000000000000000000000000000000000815250565b7f3c672069643d2274696c652220636c69702d706174683d2275726c2823636c6960008201527f7029223e00000000000000000000000000000000000000000000000000000000602082015250565b6000613879602483612ba5565b91506138848261381d565b602482019050919050565b7f3c7265637420783d22302220793d222d00000000000000000000000000000000815250565b60006138c082613762565b91506138cc828c612c22565b91506138d782613785565b6001820191506138e7828b612c22565b91506138f2826137ab565b600982019150613902828a612c22565b915061390d826137d1565b600a8201915061391d8289612c22565b9150613928826137f7565b6008820191506139388288612c22565b91506139448287612c22565b915061394f8261386c565b915061395a8261388f565b60108201915061396a8286612c22565b9150613975826137ab565b6009820191506139858285612c22565b9150613990826137d1565b600a820191506139a08284612c22565b91506139ab826132b5565b6008820191508190509a9950505050505050505050565b7f223e3c2f726563743e0000000000000000000000000000000000000000000000815250565b7f3c2f673e00000000000000000000000000000000000000000000000000000000815250565b6000613a1a8287612c22565b9150613a268286612c22565b9150613a31826139c2565b600982019150613a418285612c22565b9150613a4d8284612c22565b9150613a58826139e8565b60048201915081905095945050505050565b60008160011c9050919050565b6000808291508390505b6001851115613ac157808604811115613a9d57613a9c612b1c565b5b6001851615613aac5780820291505b8081029050613aba85613a6a565b9450613a81565b94509492505050565b600082613ada5760019050613b96565b81613ae85760009050613b96565b8160018114613afe5760028114613b0857613b37565b6001915050613b96565b60ff841115613b1a57613b19612b1c565b5b8360020a915084821115613b3157613b30612b1c565b5b50613b96565b5060208310610133831016604e8410600b8410161715613b6c5782820a905083811115613b6757613b66612b1c565b5b613b96565b613b798484846001613a77565b92509050818404811115613b9057613b8f612b1c565b5b81810290505b9392505050565b6000613ba882611fb5565b9150613bb383611fb5565b9250613be07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613aca565b905092915050565b6000613bf382611fb5565b9150613bfe83611fb5565b9250828203905081811115613c1657613c15612b1c565b5b92915050565b7f3c2f646566733e00000000000000000000000000000000000000000000000000815250565b7f3c726563742077696474683d2200000000000000000000000000000000000000815250565b7f3c672069643d226b616c6569646f73636f706554696c6522207472616e73666f60008201527f726d3d227472616e736c61746528000000000000000000000000000000000000602082015250565b6000613cc4602e83612ba5565b9150613ccf82613c68565b602e82019050919050565b6000613ce68288612c22565b9150613cf182613c1c565b600782019150613d0082613c42565b600d82019150613d108287612c22565b9150613d1b826137d1565b600a82019150613d2b8286612c22565b9150613d36826132b5565b600882019150613d468285612c22565b9150613d51826139c2565b600982019150613d6082613cb7565b9150613d6c8284612c22565b91508190509695505050505050565b6000613d8682613243565b600c82019150613d968285612c22565b9150613da182613269565b600682019150613db18284612c22565b9150613dbc8261328f565b6005820191508190509392505050565b7f222066696c6c3d226e6f6e652200000000000000000000000000000000000000815250565b7f2f3e000000000000000000000000000000000000000000000000000000000000815250565b6000613e248286612c22565b9150613e308285612c22565b9150613e3b82613dcc565b600d82019150613e4b8284612c22565b9150613e5682613df2565b600282019150819050949350505050565b7f29223e0000000000000000000000000000000000000000000000000000000000815250565b7f22202f3e00000000000000000000000000000000000000000000000000000000815250565b6000613ebf8289612c22565b9150613eca826134aa565b600182019150613eda8288612c22565b9150613ee582613e67565b600382019150613ef58287612c22565b9150613f018286612c22565b9150613f0c826132b5565b600882019150613f1c8285612c22565b9150613f2782613e8d565b600482019150613f378284612c22565b9150819050979650505050505050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000815250565b6000613f798285612c22565b9150613f858284612c22565b9150613f90826139e8565b600482019150613f9f82613f47565b6006820191508190509392505050565b7f7265637477696474680000000000000000000000000000000000000000000000815250565b6000613fe082613faf565b600982019150613ff08284612c22565b915081905092915050565b7f7265637468656967687400000000000000000000000000000000000000000000815250565b600061402c82613ffb565b600a8201915061403c8284612c22565b915081905092915050565b7f726563746475726174696f6e0000000000000000000000000000000000000000815250565b600061407882614047565b600c820191506140888284612c22565b915081905092915050565b600061409e82611fb5565b91506140a983611fb5565b9250826140b9576140b8612fea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6140fc81611fb5565b82525050565b600060408201905061411760008301856140f3565b61412460208301846140f3565b9392505050565b60008151905061413a81611fbf565b92915050565b60006060828403121561415657614155611ee9565b5b6141606060611f5f565b905060006141708482850161412b565b60008301525060206141848482850161412b565b60208301525060406141988482850161412b565b60408301525092915050565b60006141b76141b28461231b565b611f5f565b905080838252602082019050606084028301858111156141da576141d9612347565b5b835b8181101561420357806141ef8882614140565b8452602084019350506060810190506141dc565b5050509392505050565b600082601f83011261422257614221612316565b5b81516142328482602086016141a4565b91505092915050565b60006020828403121561425157614250611edf565b5b600082015167ffffffffffffffff81111561426f5761426e611ee4565b5b61427b8482850161420d565b91505092915050565b7f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d60008201527f227472616e73666f726d2220747970653d22726f74617465222066726f6d3d2260208201527f302030202d000000000000000000000000000000000000000000000000000000604082015250565b6000614306604583612ba5565b915061431182614284565b604582019050919050565b7f2220746f3d222d3336302030202d000000000000000000000000000000000000815250565b7f2220626567696e3d22307322206475723d220000000000000000000000000000815250565b7f732220726570656174436f756e743d22696e646566696e69746522202f3e0000815250565b6000614399826142f9565b91506143a58286612c22565b91506143b08261431c565b600e820191506143c08285612c22565b91506143cb82614342565b6012820191506143db8284612c22565b91506143e682614368565b601e82019150819050949350505050565b7f3c726563742072783d2233222072793d22332220783d22302220793d222d0000815250565b7f3c2f726563743e00000000000000000000000000000000000000000000000000815250565b600061444e826143f7565b601e8201915061445e8288612c22565b9150614469826137ab565b6009820191506144798287612c22565b9150614484826137d1565b600a820191506144948286612c22565b915061449f826132b5565b6008820191506144af8285612c22565b91506144ba826132db565b6002820191506144ca8284612c22565b91506144d58261441d565b6007820191508190509695505050505050565b7f7931000000000000000000000000000000000000000000000000000000000000815250565b6000614519826144e8565b6002820191506145298284612c22565b915081905092915050565b7f7932000000000000000000000000000000000000000000000000000000000000815250565b600061456582614534565b6002820191506145758284612c22565b915081905092915050565b7f616c7465726e6174696e67436c61737300000000000000000000000000000000815250565b60006145b182614580565b6010820191506145c18284612c22565b915081905092915050565b60006145d782611f7f565b91506145e283611f7f565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161561462157614620612b1c565b5b817f8000000000000000000000000000000000000000000000000000000000000000058312600084126000841316161561465e5761465d612b1c565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161561469b5761469a612b1c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05821260008412600084121616156146d8576146d7612b1c565b5b828202905092915050565b60006146ee82611f7f565b91506146f983611f7f565b92508282039050818112600084121682821360008512151617156147205761471f612b1c565b5b92915050565b7f6475726174696f6e000000000000000000000000000000000000000000000000815250565b600061475782614726565b6008820191506147678284612c22565b915081905092915050565b600060ff82169050919050565b600061478a82614772565b915061479583614772565b9250828201905060ff8111156147ae576147ad612b1c565b5b92915050565b60006147bf82611f7f565b91507f800000000000000000000000000000000000000000000000000000000000000082036147f1576147f0612b1c565b5b816000039050919050565b7f2d00000000000000000000000000000000000000000000000000000000000000815250565b600061482d826147fc565b60018201915061483d8284612c22565b915081905092915050565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b600061487a8285612c22565b915061488582614848565b6001820191506148958284612c22565b91508190509392505050565b7f3c6c696e6561724772616469656e742069643d226772616469656e74223e0000815250565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000815250565b7f222f3e0000000000000000000000000000000000000000000000000000000000815250565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22815250565b7f3c2f6c696e6561724772616469656e743e000000000000000000000000000000815250565b600061496a826148a1565b601e82019150614979826148c7565b601e820191506149898285612c22565b9150614994826148ed565b6003820191506149a382614913565b6020820191506149b38284612c22565b91506149be826148ed565b6003820191506149cd82614939565b6011820191508190509392505050565b60006149e98284612c22565b91508190509291505056fe0000000000c90f8801921d20025b26d703242abf03ed26e604b6195d057f00350647d97c0710a34507d95b9e08a2009a096a90490a3308bc0afb68050bc3ac350c8bd35e0d53db920e1bc2e40ee387660fab272b1072a0481139f0cf120116d512c8106e138edbb1145576b1151bdf8515e2144416a81305176dd9de183366e818f8b83c19bdcbf31a82a0251b4732ef1c0b826a1ccf8cb31d934fe51e56ca1e1f19f97b1fdcdc1b209f701c2161b39f2223a4c522e541af23a6887e2467775725280c5d25e845b626a8218527679df42826b92828e5714a29a3c4852a61b1012b1f34eb2bdc4e6f2c98fbba2d553afb2e110a622ecc681e2f8752623041c76030fbc54d31b54a5d326e54c73326e2c233def2873496824f354d905636041ad936ba2013376f9e46382493b038d8fe93398cdd323a402dd13af2eeb73ba51e293c56ba703d07c1d53db832a53e680b2c3f1749b73fc5ec974073f21d4121589a41ce1e64427a41d04325c13543d09aec447acd50452456bc45cd358f46756827471cece647c3c22e4869e664490f57ee49b415334a581c9d4afb6c974b9e038f4c3fdff34ce100344d8162c34e2106174ebfe8a44f5e08e24ffb654c5097fc5e5133cc9451ced46e5269126e53028517539b2aef5433027d54ca0a4a556040e255f5a4d2568a34a9571deef957b0d2555842dd5458d40e8c5964649759f3de125a8279995b1035ce5b9d11535c290acc5cb420df5d3e52365dc79d7b5e50015d5ed77c895f5e0db25fe3b38d60686cce60ec382f616f146b61f1003e6271fa6862f201ac637114cc63ef328f646c59bf64e889256563bf9165ddfbd266573cbb66cf811f6746c7d767bd0fbc683257aa68a69e806919e31f698c246b69fd614a6a6d98a36adcc9646b4af2786bb812d06c24295f6c8f351b6cf934fb6d6227f96dca0d146e30e3496e96a99c6efb5f116f5f02b16fc1938470231099708378fe70e2cbc571410804719e2cd171fa394872552c8472af05a67307c3cf735f662573b5ebd0740b53fa745f9dd074b2c8837504d3447555bd4b75a585ce75f42c0a7641af3c768e0ea576d9498877235f2c776c4eda77b417df77fab988784033287884841378c7aba17909a92c794a7c11798a23b079c89f6d7a05eeac7a4210d87a7d055a7ab6cba37aef63237b26cb4e7b5d039d7b920b887bc5e28f7bf8882f7c29fbed7c5a3d4f7c894bdd7cb727237ce3ceb17d0f42177d3980eb7d628ac57d8a5f3f7db0fdf77dd6668e7dfa98a77e1d93e97e3f57fe7e5fe4927e7f39567e9d55fb7eba3a387ed5e5c57ef0585f7f0991c37f2191b37f3857f57f4de4507f62368e7f754e7f7f872bf27f97cebc7fa736b37fb563b27fc255957fce0c3d7fd8878d7fe1c76a7fe9cbbf7ff094777ff621817ffa72d07ffd88597fff62157fffffff207374726f6b653d222345424139343722207374726f6b652d77696474683d223422a264697066735822122060b43bcc709c8721db4e21df0ab7e081bac711154950b01a7105fb15bd48e25864736f6c63430008100033

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.